diff --git a/.eslintrc b/.eslintrc index 67850d5..6358efc 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,31 +1,27 @@ { - "extends": ["eslint-config-airbnb"], + "env": { + "browser": false, + "commonjs": true, + "es6": true, + "node": true, + "jest": true + }, + "globals": { "vscode": "readonly" }, + "parserOptions": { + "ecmaVersion": 2020, + "sourceType": "module" + }, + "extends": "airbnb-base", + "plugins": ["jest"], "rules": { - "eqeqeq": "off", - "curly": "error", - "quotes": ["error", "double"], - "no-bitwise": "off", - "no-underscore-dangle": "off", - "no-plusplus": "off", - "prefer-destructuring": "off", - "class-methods-use-this": "off", - "camelcase": "off", - "no-param-reassign": "off", - "no-nested-ternary": "off", - "no-mixed-operators": "off", - "no-continue": "off", - "indent": [2, 2], - "no-multi-assign": "off", - "spaced-comment": ["error", "always", { - "line": { - "markers": ["/"], - "exceptions": ["-", "+"] - }, - "block": { - "markers": ["!"], - "exceptions": ["*"], - "balanced": true - } - }] + "no-const-assign": "warn", + "no-this-before-super": "warn", + "no-undef": "warn", + "no-unreachable": "warn", + "no-unused-vars": "warn", + "constructor-super": "warn", + "valid-typeof": "warn", + "consistent-return": "off", + "max-len": "warn" } -} \ No newline at end of file +} diff --git a/.prettierrc b/.prettierrc index 1dc7164..b6e3e4e 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,6 +1,6 @@ { - "trailingComma": "es5", - "tabWidth": 2, "semi": true, - "singleQuote": true -} \ No newline at end of file + "singleQuote": false, + "trailingComma": "es5", + "tabWidth": 2 +} diff --git a/lib/bktree.js b/lib/bktree.js index 297a154..845957c 100644 --- a/lib/bktree.js +++ b/lib/bktree.js @@ -1,48 +1,44 @@ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; - var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); - var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); - function triple_min(a, b, c) { var temp = a < b ? a : b; return temp < c ? temp : c; -} // Damerau–Levenshtein distance implemention -// ref: https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance - +} +// Damerau–Levenshtein distance implemention +// ref: https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance function edit_distance(a, b) { // create a 2 dimensions array var m = a.length; var n = b.length; var dp = new Array(m + 1); - for (var i = 0; i <= m; i++) { dp[i] = new Array(n + 1); - } // init dp array - + } + // init dp array for (var _i = 0; _i <= m; _i++) { dp[_i][0] = _i; } - for (var j = 0; j <= n; j++) { dp[0][j] = j; - } // dynamic approach - + } + // dynamic approach for (var _i2 = 1; _i2 <= m; _i2++) { for (var _j = 1; _j <= n; _j++) { if (a[_i2 - 1] !== b[_j - 1]) { - dp[_i2][_j] = triple_min(1 + dp[_i2 - 1][_j], // deletion - 1 + dp[_i2][_j - 1], // insertion + dp[_i2][_j] = triple_min(1 + dp[_i2 - 1][_j], + // deletion + 1 + dp[_i2][_j - 1], + // insertion 1 + dp[_i2 - 1][_j - 1] // replacement ); } else { @@ -50,62 +46,57 @@ function edit_distance(a, b) { } } } - return dp[m][n]; -} // console.log(edit_distance("halleaa", "hello")); +} + +// console.log(edit_distance("halleaa", "hello")); + // ---------------------------- // BK-tree Node definition // ---------------------------- -// Maxium word length - +// Maxium word length var LEN = 100; - function BKNode(w) { this.word = w; this.next = new Array(2 * LEN); - for (var i = 0; i < 2 * LEN; i++) { this.next[i] = -1; } } - BKNode.prototype.set_word = function set_word(w) { this.word = w; }; - var BKTree = /*#__PURE__*/function () { function BKTree(word_num) { (0, _classCallCheck2["default"])(this, BKTree); this.tree = new Array(word_num); - for (var i = 0; i < this.tree.length; i++) { - this.tree[i] = new BKNode(''); + this.tree[i] = new BKNode(""); } - - this.rt = new BKNode(''); + this.rt = new BKNode(""); this.ptr = 0; } - (0, _createClass2["default"])(BKTree, [{ key: "_add", value: function _add(idx, curr) { - if (this.rt.word === '') { + if (this.rt.word === "") { this.rt.set_word(curr.word); this.tree[0] = this.rt; return; } - - var dist = edit_distance(this.rt.word, curr.word); // console.log(this.rt.word, idx, dist); + var dist = edit_distance(this.rt.word, curr.word); + // console.log(this.rt.word, idx, dist); // throw Error("stop"); - if (this.tree[idx].next[dist] === -1) { /* if no Node exists at this dist from root * make it child of root Node */ + // incrementing the pointer for curr Node this.ptr++; - this.tree[this.ptr].set_word(curr.word); // curr as child of root Node + this.tree[this.ptr].set_word(curr.word); + // curr as child of root Node this.tree[idx].next[dist] = this.ptr; } else { // recursively find the parent for curr Node @@ -116,50 +107,40 @@ var BKTree = /*#__PURE__*/function () { key: "_sim_words", value: function _sim_words(idx, word, TOL) { var ret = []; - if (idx === -1) { return ret; } - - if (this.rt.word === '') { + if (this.rt.word === "") { return ret; } + var cur_rt = this.tree[idx]; - var cur_rt = this.tree[idx]; // calculating editdistance of s from root - - var dist = edit_distance(word, cur_rt.word); // if dist is less than tolerance value + // calculating editdistance of s from root + var dist = edit_distance(word, cur_rt.word); + // if dist is less than tolerance value // add it to similar words - if (dist <= TOL) { ret.push(cur_rt.word); } - var start = dist - TOL; - if (start < 0) { start = 1; } - var end = dist + TOL; - while (start < end) { var temp = this._sim_words(cur_rt.next[start], word, TOL); - ret = ret.concat(temp); start++; } - return ret; } }, { key: "add", value: function add(words) { var _this = this; - if (!Array.isArray(words)) { - throw new Error('words is not array'); + throw new Error("words is not array"); } - words.forEach(function (element) { _this._add(0, new BKNode(element)); }); @@ -172,6 +153,5 @@ var BKTree = /*#__PURE__*/function () { }]); return BKTree; }(); - var _default = BKTree; exports["default"] = _default; \ No newline at end of file diff --git a/lib/common.js b/lib/common.js index 52c5e73..d65d572 100644 --- a/lib/common.js +++ b/lib/common.js @@ -1,83 +1,76 @@ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; - var _bl = _interopRequireDefault(require("bl")); - -var _textEncoding = require("text-encoding"); - var _xmldom = require("@xmldom/xmldom"); - var _ripemd = _interopRequireDefault(require("./ripemd128")); +// depreciated TextDecoder, use nodejs embbed library +// before use embbed TextDecoder: decodeKeyBlock time costs: 641ms +// after: 245ms +// import { TextDecoder } from "text-encoding"; var REGEXP_STRIPKEY = { - mdx: /[()., '/\\@_-]()/g, + mdx: /[()., '/\\@_\$]()/g, mdd: /([.][^.]*$)|[()., '/\\@_-]/g // strip '.' before file extension that is keeping the last period - }; -var UTF_16LE_DECODER = new _textEncoding.TextDecoder('utf-16le'); -var UTF16 = 'UTF-16'; +var UTF_16LE_DECODER = new TextDecoder("utf-16le"); +var UTF16 = "UTF-16"; function newUint8Array(buf, offset, len) { var ret = new Uint8Array(len); ret = Buffer.from(buf, offset, offset + len); return ret; } - function readUTF16(buf, offset, length) { return UTF_16LE_DECODER.decode(newUint8Array(buf, offset, length)); } - function getExtension(filename, defaultExt) { return /(?:\.([^.]+))?$/.exec(filename)[1] || defaultExt; -} // tool function for levenshtein disttance - +} +// tool function for levenshtein disttance function triple_min(a, b, c) { var temp = a < b ? a : b; return temp < c ? temp : c; -} // Damerau–Levenshtein distance implemention -// ref: https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance - +} +// Damerau–Levenshtein distance implemention +// ref: https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance function levenshtein_distance(a, b) { if (!a || a == undefined) { return 9999; } - if (!b || b == undefined) { return 9999; - } // create a 2 dimensions array - - + } + // create a 2 dimensions array var m = a.length; var n = b.length; var dp = new Array(m + 1); - for (var i = 0; i <= m; i++) { dp[i] = new Array(n + 1); - } // init dp array - + } + // init dp array for (var _i = 0; _i <= m; _i++) { dp[_i][0] = _i; } - for (var j = 0; j <= n; j++) { dp[0][j] = j; - } // dynamic approach - + } + // dynamic approach for (var _i2 = 1; _i2 <= m; _i2++) { for (var _j = 1; _j <= n; _j++) { if (a[_i2 - 1] !== b[_j - 1]) { - dp[_i2][_j] = triple_min(1 + dp[_i2 - 1][_j], // deletion - 1 + dp[_i2][_j - 1], // insertion + dp[_i2][_j] = triple_min(1 + dp[_i2 - 1][_j], + // deletion + 1 + dp[_i2][_j - 1], + // insertion 1 + dp[_i2 - 1][_j - 1] // replacement ); } else { @@ -85,94 +78,79 @@ function levenshtein_distance(a, b) { } } } - return dp[m][n]; } + /** * parse mdd/mdx header section * @param {string} header_text */ - - function parseHeader(header_text) { - var doc = new _xmldom.DOMParser().parseFromString(header_text, 'text/xml'); + var doc = new _xmldom.DOMParser().parseFromString(header_text, "text/xml"); var header_attr = {}; - var elem = doc.getElementsByTagName('Dictionary')[0]; - + var elem = doc.getElementsByTagName("Dictionary")[0]; if (!elem) { - elem = doc.getElementsByTagName('Library_Data')[0]; // eslint_disable_prefer_destructing + elem = doc.getElementsByTagName("Library_Data")[0]; // eslint_disable_prefer_destructing } for (var i = 0, item; i < elem.attributes.length; i++) { item = elem.attributes[i]; header_attr[item.nodeName] = item.nodeValue; } - return header_attr; } + /** * read in uint8BE Bytes return uint8 number * @param {Buffer} bytes Big-endian byte buffer */ - - function uint8BEtoNumber(bytes) { return bytes[0] & 0xff; } + /** * read in uint16BE Bytes return uint16 number * @param {Buffer} bytes Big-endian byte buffer */ - - function uint16BEtoNumber(bytes) { var n = 0; - for (var i = 0; i < 1; i++) { n |= bytes[i]; n <<= 8; } - n |= bytes[1]; return n; } + /** * read in uint32BE Bytes return uint32 number * @param {Buffer} bytes Big-endian byte buffer */ - - function uint32BEtoNumber(bytes) { var n = 0; - for (var i = 0; i < 3; i++) { n |= bytes[i]; n <<= 8; } - n |= bytes[3]; return n; } + /** * read in uint32BE Bytes return uint32 number * @param {Buffer} bytes Big-endian byte buffer */ - - function uint64BEtoNumber(bytes) { if (bytes[1] >= 0x20 || bytes[0] > 0) { throw new Error("uint64 larger than 2^53, JS may lost accuracy"); } - var high = 0; - for (var i = 0; i < 3; i++) { high |= bytes[i] & 0xff; high <<= 8; } - - high |= bytes[3] & 0xff; // ignore > 2^53 - + high |= bytes[3] & 0xff; + // ignore > 2^53 high = (high & 0x001fffff) * 0x100000000; high += bytes[4] * 0x1000000; high += bytes[5] * 0x10000; @@ -180,20 +158,17 @@ function uint64BEtoNumber(bytes) { high += bytes[7] & 0xff; return high; } - -var NUMFMT_UINT8 = Symbol('NUM_FMT_UINT8'); -var NUMFMT_UINT16 = Symbol('NUM_FMT_UINT16'); -var NUMFMT_UINT32 = Symbol('NUM_FMT_UINT32'); -var NUMFMT_UINT64 = Symbol('NUM_FMT_UINT64'); +var NUMFMT_UINT8 = Symbol("NUM_FMT_UINT8"); +var NUMFMT_UINT16 = Symbol("NUM_FMT_UINT16"); +var NUMFMT_UINT32 = Symbol("NUM_FMT_UINT32"); +var NUMFMT_UINT64 = Symbol("NUM_FMT_UINT64"); /** * read number from buffer * @param {BufferList} bf number buffer * @param {string} numfmt number format */ - function readNumber(bf, numfmt) { var value = new Uint8Array(bf); - if (numfmt === NUMFMT_UINT32) { // uint32 return uint32BEtoNumber(value); @@ -207,18 +182,21 @@ function readNumber(bf, numfmt) { // uint8 return uint8BEtoNumber(value); } + return 0; - return 0; // return struct.unpack(this._number_format, bf)[0]; -} // use BufferList interface to read number - + // return struct.unpack(this._number_format, bf)[0]; +} +// use BufferList interface to read number function readNumber2(bf, offset, numfmt) { if (numfmt === NUMFMT_UINT32) { // uint32 - return bf.readUInt32BE(offset); // return uint32BEtoNumber(value); + return bf.readUInt32BE(offset); + // return uint32BEtoNumber(value); } else if (numfmt === NUMFMT_UINT64) { // uint64 - return uint64BEtoNumber(bf.slice(offset, offset + 8)); // return bf.readBigInt64BE(offset) + return uint64BEtoNumber(bf.slice(offset, offset + 8)); + // return bf.readBigInt64BE(offset) } else if (numfmt === NUMFMT_UINT16) { // uint16 // return uint16BEtoNumber(value); @@ -227,41 +205,36 @@ function readNumber2(bf, offset, numfmt) { // uint8 return bf.readUInt8(offset); } - return 0; } + /** * fast_decrypt buffer * @param {Buffer} data data buffer * @param {Buffer} k key */ - - function fast_decrypt(data, k) { var b = new Uint8Array(data); var key = new Uint8Array(k); var previous = 0x36; - for (var i = 0; i < b.length; ++i) { var t = (b[i] >> 4 | b[i] << 4) & 0xff; t = t ^ previous ^ i & 0xff ^ key[i % key.length]; previous = b[i]; b[i] = t; } - return new _bl["default"](b); } + /** * mdx decrypt method * @param {Buffer} comp_block data buffer needs to decrypt */ - - function mdxDecrypt(comp_block) { var key = _ripemd["default"].ripemd128(new _bl["default"](comp_block.slice(4, 8)).append(Buffer.from([0x95, 0x36, 0x00, 0x00])).slice(0, 8)); - return new _bl["default"](comp_block.slice(0, 8)).append(fast_decrypt(comp_block.slice(8), key)); } + /** * Creates a new Uint8Array based on two different ArrayBuffers * @@ -269,60 +242,55 @@ function mdxDecrypt(comp_block) { * @param {ArrayBuffers} buffer2 The second buffer. * @return {ArrayBuffers} The new ArrayBuffer created out of the two. */ - - function appendBuffer(buffer1, buffer2) { var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength); tmp.set(new Uint8Array(buffer1), 0); tmp.set(new Uint8Array(buffer2), buffer1.byteLength); return tmp.buffer; } - -function wordCompare(word1, word2) { +function caseUnsensitiveCompare(word1, word2) { if (!word1 || !word2) { throw new Error("invalid word comparation ".concat(word1, " and ").concat(word2)); - } // if the two words are indentical, return 0 directly - - + } + // if the two words are indentical, return 0 directly if (word1 === word2) { return 0; } - var len = word1.length > word2.length ? word2.length : word1.length; - for (var i = 0; i < len; i++) { var w1 = word1[i]; var w2 = word2[i]; - if (w1 == w2) { - continue; // case1: w1: `H` w2: `h` or `h` and `H`continue + continue; + // case1: w1: `H` w2: `h` or `h` and `H`continue } else if (w1.toLowerCase() == w2.toLowerCase()) { - continue; // case3: w1: `H` w2: `k`, h < k return -1 + continue; + // case3: w1: `H` w2: `k`, h < k return -1 } else if (w1.toLowerCase() < w2.toLowerCase()) { - return -1; // case4: w1: `H` w2: `a`, h > a return 1 + return -1; + // case4: w1: `H` w2: `a`, h > a return 1 } else if (w1.toLowerCase() > w2.toLowerCase()) { return 1; } - } // case5: `Hello` and `Hellocat` - - + } + // case5: `Hello` and `Hellocat` return word1.length < word2.length ? -1 : 1; -} // if this.header.KeyCaseSensitive = YES, +} + +// if this.header.KeyCaseSensitive = YES, // Uppercase character is placed in the start position of the directionary // so if `this.header.KeyCaseSensitive = YES` use normalUpperCaseWordCompare, else use wordCompare - - -function normalUpperCaseWordCompare(word1, word2) { +function caseSensitiveCompare(word1, word2) { if (word1 === word2) { return 0; } else if (word1 > word2) { - return 1; - } else { return -1; + } else { + return 1; } -} // this compare function is for mdd file - +} +// this compare function is for mdd file function localCompare(word1, word2) { // return word1.localeCompare(word2); if (word1.localeCompare(word2) === 0) { @@ -333,18 +301,16 @@ function localCompare(word1, word2) { return -1; } } + /** * Test if a value of dictionary attribute is true or not. * ref: https://github.com/fengdh/mdict-js/blob/efc3fa368edd6e57de229375e2b73bbfe189e6ee/mdict-parser.js:235 */ - - function isTrue(v) { if (!v) return false; v = v.toLowerCase(); - return v === 'yes' || v === 'true'; + return v === "yes" || v === "true"; } - var _default = { getExtension: getExtension, readUTF16: readUTF16, @@ -357,8 +323,8 @@ var _default = { readNumber2: readNumber2, mdxDecrypt: mdxDecrypt, appendBuffer: appendBuffer, - wordCompare: wordCompare, - normalUpperCaseWordCompare: normalUpperCaseWordCompare, + caseUnsensitiveCompare: caseUnsensitiveCompare, + caseSensitiveCompare: caseSensitiveCompare, localCompare: localCompare, isTrue: isTrue, NUMFMT_UINT8: NUMFMT_UINT8, diff --git a/lib/lzo-wrapper.js b/lib/lzo-wrapper.js index 0b545a9..04d027a 100644 --- a/lib/lzo-wrapper.js +++ b/lib/lzo-wrapper.js @@ -1,19 +1,12 @@ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - var _lzo1x = _interopRequireDefault(require("./lzo1x")); - -function decompress(buf -/* , bufInitSize, bufBlockSize */ -) { +function decompress(buf /* , bufInitSize, bufBlockSize */) { var state = { inputBuffer: new Uint8Array(buf) }; - _lzo1x["default"].decompress(state); - return state.outputBuffer; } - module.exports.decompress = decompress; \ No newline at end of file diff --git a/lib/lzo1x.js b/lib/lzo1x.js index 973d881..5f18c67 100644 --- a/lib/lzo1x.js +++ b/lib/lzo1x.js @@ -29,9 +29,9 @@ * the full LZO package can be found at * http://www.oberhumer.com/opensource/lzo/ */ + var lzo1x = function lzo1x() { function _lzo1x() {} - _lzo1x.prototype = { blockSize: 4096, OK: 0, @@ -53,46 +53,39 @@ var lzo1x = function lzo1x() { skipToFirstLiteralFun: false, ctzl: function ctzl(v) { // this might be needed for _compressCore (it isn't in my current test files) - /* * https://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightBinSearch * Matt Whitlock suggested this on January 25, 2006. * Andrew Shapira shaved a couple operations off on Sept. 5, * 2007 (by setting c=1 and unconditionally subtracting at the end). */ + var c; // c will be the number of zero bits on the right, // so if v is 1101000 (base 2), then c will be 3 // NOTE: if 0 == v, then c = 31. - if (v & 0x1) { // special case for odd v (assumed to happen half of the time) c = 0; } else { c = 1; - if ((v & 0xffff) === 0) { v >>= 16; c += 16; } - if ((v & 0xff) === 0) { v >>= 8; c += 8; } - if ((v & 0xf) === 0) { v >>= 4; c += 4; } - if ((v & 0x3) === 0) { v >>= 2; c += 2; } - c -= v & 0x1; } - return c; }, extendBuffer: function extendBuffer() { @@ -110,20 +103,17 @@ var lzo1x = function lzo1x() { match_next: function match_next() { // if (op_end - op < t) return OUTPUT_OVERRUN; // if (ip_end - ip < t+3) return INPUT_OVERRUN; + while (this.op + 3 > this.cbl) { this.extendBuffer(); } - this.out[this.op++] = this.buf[this.ip++]; - if (this.t > 1) { this.out[this.op++] = this.buf[this.ip++]; - if (this.t > 2) { this.out[this.op++] = this.buf[this.ip++]; } } - this.t = this.buf[this.ip++]; }, match_done: function match_done() { @@ -132,17 +122,14 @@ var lzo1x = function lzo1x() { }, copy_match: function copy_match() { this.t += 2; - while (this.op + this.t > this.cbl) { this.extendBuffer(); } - if (this.t > 4 && this.op % 4 === this.m_pos % 4) { while (this.op % 4 > 0) { this.out[this.op++] = this.out[this.m_pos++]; this.t--; } - while (this.t > 4) { this.out32[0 | this.op / 4] = this.out32[0 | this.m_pos / 4]; this.op += 4; @@ -150,7 +137,6 @@ var lzo1x = function lzo1x() { this.t -= 4; } } - do { this.out[this.op++] = this.out[this.m_pos++]; } while (--this.t > 0); @@ -159,13 +145,11 @@ var lzo1x = function lzo1x() { while (this.op + this.t > this.cbl) { this.extendBuffer(); } - if (this.t > 4 && this.op % 4 === this.ip % 4) { while (this.op % 4 > 0) { this.out[this.op++] = this.buf[this.ip++]; this.t--; } - while (this.t > 4) { this.out32[0 | this.op / 4] = this.buf32[0 | this.ip / 4]; this.op += 4; @@ -173,7 +157,6 @@ var lzo1x = function lzo1x() { this.t -= 4; } } - do { this.out[this.op++] = this.buf[this.ip++]; } while (--this.t > 0); @@ -184,11 +167,12 @@ var lzo1x = function lzo1x() { this.m_pos = this.op - 1; this.m_pos -= this.t >> 2 & 7; this.m_pos -= this.buf[this.ip++] << 3; - this.t = (this.t >> 5) - 1; // if ( m_pos < out || m_pos >= op) return LOOKBEHIND_OVERRUN; + this.t = (this.t >> 5) - 1; + + // if ( m_pos < out || m_pos >= op) return LOOKBEHIND_OVERRUN; // if (op_end - op < t+3-1) return OUTPUT_OVERRUN; this.copy_match(); - if (this.match_done() === 0) { break; } else { @@ -197,15 +181,16 @@ var lzo1x = function lzo1x() { } } else if (this.t >= 32) { this.t &= 31; - if (this.t === 0) { while (this.buf[this.ip] === 0) { this.t += 255; - this.ip++; // if (t > -511) return OUTPUT_OVERRUN; + this.ip++; + // if (t > -511) return OUTPUT_OVERRUN; // if (ip_end - ip < 1) return INPUT_OVERRUN; } - this.t += 31 + this.buf[this.ip++]; // if (ip_end - ip < 2) return INPUT_OVERRUN; + this.t += 31 + this.buf[this.ip++]; + // if (ip_end - ip < 2) return INPUT_OVERRUN; } this.m_pos = this.op - 1; @@ -215,58 +200,54 @@ var lzo1x = function lzo1x() { this.m_pos = this.op; this.m_pos -= (this.t & 8) << 11; this.t &= 7; - if (this.t === 0) { while (this.buf[this.ip] === 0) { this.t += 255; - this.ip++; // if (t > -511) return OUTPUT_OVERRUN; + this.ip++; + // if (t > -511) return OUTPUT_OVERRUN; // if (ip_end - ip < 1) return INPUT_OVERRUN; } - this.t += 7 + this.buf[this.ip++]; // if (ip_end - ip < 2) return INPUT_OVERRUN; + this.t += 7 + this.buf[this.ip++]; + // if (ip_end - ip < 2) return INPUT_OVERRUN; } this.m_pos -= (this.buf[this.ip] >> 2) + (this.buf[this.ip + 1] << 6); this.ip += 2; - if (this.m_pos === this.op) { this.state.outputBuffer = this.state.outputBuffer.subarray(0, this.op); return this.EOF_FOUND; } - this.m_pos -= 0x4000; } else { this.m_pos = this.op - 1; this.m_pos -= this.t >> 2; - this.m_pos -= this.buf[this.ip++] << 2; // if (m_pos < out || m_pos >= op) return LOOKBEHIND_OVERRUN; - // if (op_end - op < 2) return OUTPUT_OVERRUN; + this.m_pos -= this.buf[this.ip++] << 2; + // if (m_pos < out || m_pos >= op) return LOOKBEHIND_OVERRUN; + // if (op_end - op < 2) return OUTPUT_OVERRUN; while (this.op + 2 > this.cbl) { this.extendBuffer(); } - this.out[this.op++] = this.out[this.m_pos++]; this.out[this.op++] = this.out[this.m_pos]; - if (this.match_done() === 0) { break; } else { this.match_next(); continue; } - } // if (m_pos < out || m_pos >= op) return LOOKBEHIND_OVERRUN; - // if (op_end - op < t+3-1) return OUTPUT_OVERRUN; + } + // if (m_pos < out || m_pos >= op) return LOOKBEHIND_OVERRUN; + // if (op_end - op < t+3-1) return OUTPUT_OVERRUN; this.copy_match(); - if (this.match_done() === 0) { break; } - this.match_next(); } - return this.OK; }, decompress: function decompress(state) { @@ -285,15 +266,14 @@ var lzo1x = function lzo1x() { this.ip = 0; this.op = 0; this.m_pos = 0; - this.skipToFirstLiteralFun = false; // if (ip_end - ip < 1) return INPUT_OVERRUN; + this.skipToFirstLiteralFun = false; + // if (ip_end - ip < 1) return INPUT_OVERRUN; if (this.buf[this.ip] > 17) { this.t = this.buf[this.ip++] - 17; - if (this.t < 4) { this.match_next(); var ret = this.match(); - if (ret !== this.OK) { return ret === this.EOF_FOUND ? this.OK : ret; } @@ -304,71 +284,61 @@ var lzo1x = function lzo1x() { this.skipToFirstLiteralFun = true; } } - for (;;) { if (!this.skipToFirstLiteralFun) { // if (ip_end - ip < 3) return INPUT_OVERRUN; this.t = this.buf[this.ip++]; - if (this.t >= 16) { - var _ret2 = this.match(); - - if (_ret2 !== this.OK) { - return _ret2 === this.EOF_FOUND ? this.OK : _ret2; + var _ret = this.match(); + if (_ret !== this.OK) { + return _ret === this.EOF_FOUND ? this.OK : _ret; } - continue; } - if (this.t === 0) { while (this.buf[this.ip] === 0) { this.t += 255; - this.ip++; // if (t > 511) return INPUT_OVERRUN; + this.ip++; + // if (t > 511) return INPUT_OVERRUN; // if (ip_end - ip < 1) return INPUT_OVERRUN; } this.t += 15 + this.buf[this.ip++]; - } // if (op_end - op < t+3) return OUTPUT_OVERRUN; + } + // if (op_end - op < t+3) return OUTPUT_OVERRUN; // if (ip_end - ip < t+6) return INPUT_OVERRUN; - this.t += 3; this.copy_from_buf(); } else { this.skipToFirstLiteralFun = false; } - this.t = this.buf[this.ip++]; - if (this.t < 16) { this.m_pos = this.op - (1 + 0x0800); this.m_pos -= this.t >> 2; - this.m_pos -= this.buf[this.ip++] << 2; // if ( m_pos < out || m_pos >= op) return LOOKBEHIND_OVERRUN; - // if (op_end - op < 3) return OUTPUT_OVERRUN; + this.m_pos -= this.buf[this.ip++] << 2; + // if ( m_pos < out || m_pos >= op) return LOOKBEHIND_OVERRUN; + // if (op_end - op < 3) return OUTPUT_OVERRUN; while (this.op + 3 > this.cbl) { this.extendBuffer(); } - this.out[this.op++] = this.out[this.m_pos++]; this.out[this.op++] = this.out[this.m_pos++]; this.out[this.op++] = this.out[this.m_pos]; - if (this.match_done() === 0) { continue; } else { this.match_next(); } } - - var _ret = this.match(); - - if (_ret !== this.OK) { - return _ret === this.EOF_FOUND ? this.OK : _ret; + var _ret2 = this.match(); + if (_ret2 !== this.OK) { + return _ret2 === this.EOF_FOUND ? this.OK : _ret2; } - } // eslint-disable-next-line - - + } + // eslint-disable-next-line return this.OK; }, _compressCore: function _compressCore(in_len, ti) { @@ -383,37 +353,33 @@ var lzo1x = function lzo1x() { var dv_lo = 0; var dindex = 0; this.ip += 1 + (this.ip - ii >> 5); - for (;;) { if (this.ip >= ip_end) { break; - } // dv = this.buf[this.ip] | (this.buf[this.ip + 1] << 8) + } + + // dv = this.buf[this.ip] | (this.buf[this.ip + 1] << 8) // | (this.buf[this.ip + 2] << 16) | (this.buf[this.ip + 3] << 24); // dindex = ((0x1824429d * dv) >> 18) & 16383; // The above code doesn't work in JavaScript due to a lack of 64 bit bitwise operations // Instead, use (optimised two's complement integer arithmetic) // Optimization is based on us only needing the high 16 bits of the lower 32 bit integer. - - dv_lo = this.buf[this.ip] | this.buf[this.ip + 1] << 8; dv_hi = this.buf[this.ip + 2] | this.buf[this.ip + 3] << 8; dindex = ((dv_lo * 0x429d >>> 16) + dv_hi * 0x429d + dv_lo * 0x1824 & 0xffff) >>> 2; m_pos = ip_start + this.dict[dindex]; - this.dict[dindex] = this.ip - ip_start; // eslint-disable-next-line - + this.dict[dindex] = this.ip - ip_start; + // eslint-disable-next-line if ((dv_hi << 16) + dv_lo != (this.buf[m_pos] | this.buf[m_pos + 1] << 8 | this.buf[m_pos + 2] << 16 | this.buf[m_pos + 3] << 24)) { this.ip += 1 + (this.ip - ii >> 5); continue; } - ii -= ti; ti = 0; var t = this.ip - ii; - if (t !== 0) { if (t <= 3) { this.out[this.op - 2] |= t; - do { this.out[this.op++] = this.buf[ii++]; } while (--t > 0); @@ -423,133 +389,105 @@ var lzo1x = function lzo1x() { } else { var tt = t - 18; this.out[this.op++] = 0; - while (tt > 255) { tt -= 255; this.out[this.op++] = 0; } - this.out[this.op++] = tt; } - do { this.out[this.op++] = this.buf[ii++]; } while (--t > 0); } } + m_len = 4; - m_len = 4; // var skipTo_m_len_done = false; - + // var skipTo_m_len_done = false; if (this.buf[this.ip + m_len] === this.buf[m_pos + m_len]) { do { m_len += 1; - if (this.buf[this.ip + m_len] !== this.buf[m_pos + m_len]) { break; } - m_len += 1; - if (this.buf[this.ip + m_len] !== this.buf[m_pos + m_len]) { break; } - m_len += 1; - if (this.buf[this.ip + m_len] !== this.buf[m_pos + m_len]) { break; } - m_len += 1; - if (this.buf[this.ip + m_len] !== this.buf[m_pos + m_len]) { break; } - m_len += 1; - if (this.buf[this.ip + m_len] !== this.buf[m_pos + m_len]) { break; } - m_len += 1; - if (this.buf[this.ip + m_len] !== this.buf[m_pos + m_len]) { break; } - m_len += 1; - if (this.buf[this.ip + m_len] !== this.buf[m_pos + m_len]) { break; } - m_len += 1; - if (this.buf[this.ip + m_len] !== this.buf[m_pos + m_len]) { break; } - if (this.ip + m_len >= ip_end) { // skipTo_m_len_done = true; break; } } while (this.buf[this.ip + m_len] === this.buf[m_pos + m_len]); - } // if (!skipTo_m_len_done) { + } + + // if (!skipTo_m_len_done) { // var inc = this.ctzl(this.buf[this.ip + m_len] ^ this.buf[m_pos + m_len]) >> 3; // m_len += inc; // } - m_off = this.ip - m_pos; this.ip += m_len; ii = this.ip; - if (m_len <= 8 && m_off <= 0x0800) { m_off -= 1; this.out[this.op++] = m_len - 1 << 5 | (m_off & 7) << 2; this.out[this.op++] = m_off >> 3; } else if (m_off <= 0x4000) { m_off -= 1; - if (m_len <= 33) { this.out[this.op++] = 32 | m_len - 2; } else { m_len -= 33; this.out[this.op++] = 32; - while (m_len > 255) { m_len -= 255; this.out[this.op++] = 0; } - this.out[this.op++] = m_len; } - this.out[this.op++] = m_off << 2; this.out[this.op++] = m_off >> 6; } else { m_off -= 0x4000; - if (m_len <= 9) { this.out[this.op++] = 16 | m_off >> 11 & 8 | m_len - 2; } else { m_len -= 9; this.out[this.op++] = 16 | m_off >> 11 & 8; - while (m_len > 255) { m_len -= 255; this.out[this.op++] = 0; } - this.out[this.op++] = m_len; } - this.out[this.op++] = m_off << 2; this.out[this.op++] = m_off >> 6; } } - return in_len - (ii - ip_start - ti); }, compress: function compress(state) { @@ -564,26 +502,20 @@ var lzo1x = function lzo1x() { this.dict = new Uint32Array(16384); var l = in_len; var t = 0; - while (l > 20) { var ll = l <= 49152 ? l : 49152; - if (t + ll >> 5 <= 0) { break; } - this.dict = new Uint32Array(16384); var prev_ip = this.ip; t = this._compressCore(ll, t); this.ip = prev_ip + ll; l -= ll; } - t += l; - if (t > 0) { var ii = in_len - t; - if (this.op === 0 && t <= 238) { this.out[this.op++] = 17 + t; } else if (t <= 3) { @@ -593,20 +525,16 @@ var lzo1x = function lzo1x() { } else { var tt = t - 18; this.out[this.op++] = 0; - while (tt > 255) { tt -= 255; this.out[this.op++] = 0; } - this.out[this.op++] = tt; } - do { this.out[this.op++] = this.buf[ii++]; } while (--t > 0); } - this.out[this.op++] = 17; this.out[this.op++] = 0; this.out[this.op++] = 0; @@ -624,5 +552,4 @@ var lzo1x = function lzo1x() { } }; }; - module.exports = lzo1x(); \ No newline at end of file diff --git a/lib/mdict-base.js b/lib/mdict-base.js index c4e98bd..c37e02d 100644 --- a/lib/mdict-base.js +++ b/lib/mdict-base.js @@ -1,80 +1,88 @@ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - +var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; - var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); - var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); - var _readChunk = _interopRequireDefault(require("read-chunk")); - var _assert = _interopRequireDefault(require("assert")); - var _bl = _interopRequireDefault(require("bl")); - -var _pako = _interopRequireDefault(require("pako")); - +var _fs = _interopRequireWildcard(require("fs")); +var _zlib = _interopRequireDefault(require("zlib")); var _bufferToArraybuffer = _interopRequireDefault(require("buffer-to-arraybuffer")); - -var _textEncoding = require("text-encoding"); - var _common = _interopRequireDefault(require("./common")); - var _lzoWrapper = _interopRequireDefault(require("./lzo-wrapper")); - +var _measureUtil = _interopRequireDefault(require("./measure-util")); +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } /// -var UTF_16LE_DECODER = new _textEncoding.TextDecoder('utf-16le'); -var UTF16 = 'UTF-16'; -var UTF_8_DECODER = new _textEncoding.TextDecoder('utf-8'); -var UTF8 = 'UTF-8'; -var BIG5_DECODER = new _textEncoding.TextDecoder('big5'); -var BIG5 = 'BIG5'; -var GB18030_DECODER = new _textEncoding.TextDecoder('gb18030'); -var GB18030 = 'GB18030'; +// import util from "util"; +// import pako from "pako"; + +// use nodejs embbed zlib instead of pako, only under nodejs +// use pako = 347ms, use zlib = 290ms + +var pako = {}; +pako.inflate = _zlib["default"].inflateSync; +var UTF_16LE_DECODER = new TextDecoder("utf-16le"); +var UTF16 = "UTF-16"; +var UTF_8_DECODER = new TextDecoder("utf-8"); +var UTF8 = "UTF-8"; +var BIG5_DECODER = new TextDecoder("big5"); +var BIG5 = "BIG5"; +var GB18030_DECODER = new TextDecoder("gb18030"); +var GB18030 = "GB18030"; var BASE64ENCODER = function BASE64ENCODER(arrayBuffer) { - return arrayBuffer.toString('base64'); + return arrayBuffer.toString("base64"); }; + /** * * class MdictBase, the basic mdict diction parser class */ - - var MDictBase = /*#__PURE__*/function () { /** * mdict constructor * @param {string} fname * @param {string} passcode */ - function MDictBase(fname, passcode) { + function MDictBase(fname, passcode, options) { (0, _classCallCheck2["default"])(this, MDictBase); // the mdict file name - this.fname = fname; // the dictionary file decrypt pass code - - this._passcode = passcode; // the mdict file read offset - - this._offset = 0; // the dictionary file extension + this.fname = fname; + // the dictionary file decrypt pass code + this._passcode = passcode; + // the mdict file read offset + this._offset = 0; + // the dictionary file extension + this.ext = _common["default"].getExtension(fname, "mdx"); + + // set options + this.options = options !== null && options !== void 0 ? options : { + passcode: passcode, + debug: false, + resort: true, + isStripKey: true, + isCaseSensitive: false + }; - this.ext = _common["default"].getExtension(fname, 'mdx'); // ------------------------- + // ------------------------- // dict header section //-------------------------- // read the diction header info - this._headerStartOffset = 0; this._headerEndOffset = 0; this.header = {}; + this._readHeader(); - this._readHeader(); // ------------------------- + // ------------------------- // dict key header section // -------------------------- - - this._keyHeaderStartOffset = 0; this._keyHeaderEndOffset = 0; this.keyHeader = { @@ -83,65 +91,99 @@ var MDictBase = /*#__PURE__*/function () { keyBlockInfoDecompSize: 0, keyBlockInfoCompSize: 0, keyBlocksTotalSize: 0 - }; // read key header + }; + // read key header + this._readKeyHeader(); - this._readKeyHeader(); // ------------------------- + // ------------------------- // dict key info section // -------------------------- - - this._keyBlockInfoStartOffset = 0; - this._keyBlockInfoEndOffset = 0; // key block info list - + this._keyBlockInfoEndOffset = 0; + // key block info list this.keyBlockInfoList = []; + this._readKeyBlockInfo(); - this._readKeyBlockInfo(); // ------------------------- + // ------------------------- // dict key block section // -------------------------- - - this._keyBlockStartOffset = 0; this._keyBlockEndOffset = 0; - this.keyList = []; // decodeKeyBlock method is very slow, avoid invoke dirctly - // this method will return the whole words list of the dictionaries file, this is very slow - // operation, and you should do this background, or concurrently. - // NOTE: this method is wrapped by method medict.RangeWords(); - // this._decodeKeyBlock(); + // ------------------------- // dict record header section // -------------------------- - this._recordHeaderStartOffset = 0; this._recordHeaderEndOffset = 0; + this.keyList = []; + + // depreciated part + // decodeKeyBlock method is very slow, avoid invoke dirctly + // this method will return the whole words list of the dictionaries file, this is very slow + // operation, and you should do this background, or concurrently. + // NOTE: this method is wrapped by method medict.RangeWords(); + // this._decodeKeyBlock(); + + if (this.ext === "mdx" && this.options.resort) { + if (this.options.debug) { + console.time("KEY_LIST_RESORTE"); + console.log("file: ", this.fname); + var memTrace = _measureUtil["default"].measureMemFn(); + memTrace("before resort decode"); + // NOTE: this method may takes 200ms + // NOTE: this method is wrapped by method medict.RangeWords(); + _measureUtil["default"].measureTimeFn(this, this._decodeKeyBlock)(); + // measure.measureTimeFn(this, this._resortKeyBlock)(); + _measureUtil["default"].measureTimeFn(this, this._resortKeyList)(); + memTrace("after resort decode"); + console.log("key entris (number): ", this.keyHeader.entriesNum); + console.timeEnd("KEY_LIST_RESORTE"); + } else { + this._decodeKeyBlock(); + // this._resortKeyBlock(); + this._resortKeyList(); + } + } else { + if (this.options.debug) { + console.time("KEY_LIST_RESORTE"); + console.log("file: ", this.fname); + var _memTrace = _measureUtil["default"].measureMemFn(); + _memTrace("before resort decode"); + _memTrace("after resort decode"); + console.log("key entris (number): ", this.keyHeader.entriesNum); + console.timeEnd("KEY_LIST_RESORTE"); + } + } this.recordHeader = { recordBlocksNum: 0, entriesNum: 0, recordBlockInfoCompSize: 0, recordBlockCompSize: 0 }; + this._decodeRecordHeader(); - this._decodeRecordHeader(); // ------------------------- + // ------------------------- // dict record info section // -------------------------- - - this._recordInfoStartOffset = 0; this._recordInfoEndOffset = 0; this.recordBlockInfoList = []; + this._decodeRecordInfo(); - this._decodeRecordInfo(); // ------------------------- + // ------------------------- // dict record block section // -------------------------- - - this._recordBlockStartOffset = 0; this._recordBlockEndOffset = 0; - this.keyData = []; // decodeRecordBlock method is very slow, avoid invoke dirctly + this.keyData = []; + // decodeRecordBlock method is very slow, avoid invoke dirctly // this._decodeRecordBlock(); + // --------------------------------- // DICTIONARY CONSTRUCTION FINISHED // --------------------------------- } + /** * STEP 1. read diction header * Get mdx header info (xml content to object) @@ -152,64 +194,68 @@ var MDictBase = /*#__PURE__*/function () { * assert(zlib.adler32(header_bytes) & 0xffffffff, adler32) * */ - - (0, _createClass2["default"])(MDictBase, [{ key: "_readHeader", value: function _readHeader() { // [0:4], 4 bytes header length (header_byte_size), big-endian, 4 bytes, 16 bits var header_size_buffer = this._readBuffer(0, 4); + var headerByteSize = _common["default"].readNumber(header_size_buffer, _common["default"].NUMFMT_UINT32); - var headerByteSize = _common["default"].readNumber(header_size_buffer, _common["default"].NUMFMT_UINT32); // [4:header_byte_size + 4] header_bytes - + // [4:header_byte_size + 4] header_bytes + var headerBuffer = _readChunk["default"].sync(this.fname, 4, headerByteSize); - var headerBuffer = _readChunk["default"].sync(this.fname, 4, headerByteSize); // TODO: SKIP 4 bytes alder32 checksum + // TODO: SKIP 4 bytes alder32 checksum // header_b_cksum should skip for now, because cannot get alder32 sum by js // const header_b_cksum = readChunk.sync(this.fname, header_byte_size + 4, 4); + // console.log(hash("alder32", header_b_buffer)); // console.log(header_b_cksum); // assert(header_b_cksum), "header_bytes checksum failed"); - // 4 bytes header size + header_bytes_size + 4bytes alder checksum - + // 4 bytes header size + header_bytes_size + 4bytes alder checksum this._headerEndOffset = headerByteSize + 4 + 4; - this._keyHeaderStartOffset = headerByteSize + 4 + 4; // set file read offset + this._keyHeaderStartOffset = headerByteSize + 4 + 4; - this._offset = this._headerEndOffset; // header text in utf-16 encoding ending with `\x00\x00`, so minus 2 + // set file read offset + this._offset = this._headerEndOffset; - var headerText = _common["default"].readUTF16(headerBuffer, 0, headerByteSize - 2); // parse header info + // header text in utf-16 encoding ending with `\x00\x00`, so minus 2 + var headerText = _common["default"].readUTF16(headerBuffer, 0, headerByteSize - 2); + // parse header info + this.header = _common["default"].parseHeader(headerText); - this.header = _common["default"].parseHeader(headerText); // set header default configuration + // set header default configuration + this.header.KeyCaseSensitive = this.header.KeyCaseSensitive || "No"; + this.header.StripKey = this.header.StripKey || "Yes"; - this.header.KeyCaseSensitive = this.header.KeyCaseSensitive || 'No'; - this.header.StripKey = this.header.StripKey || 'Yes'; // encrypted flag + // encrypted flag // 0x00 - no encryption // 0x01 - encrypt record block // 0x02 - encrypt key info block - - if (!this.header.Encrypted || this.header.Encrypted == '' || this.header.Encrypted == 'No') { + if (!this.header.Encrypted || this.header.Encrypted == "" || this.header.Encrypted == "No") { this._encrypt = 0; - } else if (this.header.Encrypted == 'Yes') { + } else if (this.header.Encrypted == "Yes") { this._encrypt = 1; } else { this._encrypt = parseInt(this.header.Encrypted, 10); - } // stylesheet attribute if present takes from of: + } + + // stylesheet attribute if present takes from of: // style_number # 1-255 // style_begin # or '' // style_end # or '' // TODO: splitstyle info + // header_info['_stylesheet'] = {} // if header_tag.get('StyleSheet'): // lines = header_tag['StyleSheet'].splitlines() // for i in range(0, len(lines), 3): // header_info['_stylesheet'][lines[i]] = (lines[i + 1], lines[i + 2]) + // before version 2.0, number is 4 bytes integer alias, int32 // version 2.0 and above use 8 bytes, alias int64 - - this._version = parseFloat(this.header.GeneratedByEngineVersion); - if (this._version >= 2.0) { this._numWidth = 8; this._numFmt = _common["default"].NUMFMT_UINT64; @@ -217,37 +263,34 @@ var MDictBase = /*#__PURE__*/function () { this._numWidth = 4; this._numFmt = _common["default"].NUMFMT_UINT32; } - - if (!this.header.Encoding || this.header.Encoding == '') { + if (!this.header.Encoding || this.header.Encoding == "") { this._encoding = UTF8; this._decoder = UTF_8_DECODER; - } else if (this.header.Encoding == 'GBK' || this.header.Encoding == 'GB2312') { + } else if (this.header.Encoding == "GBK" || this.header.Encoding == "GB2312") { this._encoding = GB18030; this._decoder = GB18030_DECODER; - } else if (this.header.Encoding.toLowerCase() == 'big5') { + } else if (this.header.Encoding.toLowerCase() == "big5") { this._encoding = BIG5; this._decoder = BIG5_DECODER; } else { - this._encoding = this.header.Encoding.toLowerCase() == 'utf16' || this.header.Encoding.toLowerCase() == 'utf-16' ? UTF16 : UTF8; - + this._encoding = this.header.Encoding.toLowerCase() == "utf16" || this.header.Encoding.toLowerCase() == "utf-16" ? UTF16 : UTF8; if (this._encoding == UTF16) { this._decoder = UTF_16LE_DECODER; } else { this._decoder = UTF_8_DECODER; } - } // determine the encoding and decoder, if extension is *.mdd - - - if (this.ext === 'mdd') { + } + // determine the encoding and decoder, if extension is *.mdd + if (this.ext === "mdd") { this._encoding = UTF16; this._decoder = UTF_16LE_DECODER; } } + /** * STEP 2. read key block header * read key block header */ - }, { key: "_readKeyHeader", value: function _readKeyHeader() { @@ -260,142 +303,134 @@ var MDictBase = /*#__PURE__*/function () { // note: if version <2.0, the key info buffer size is 4 * 4 // otherwise, ths key info buffer size is 5 * 8 // <2.0 the order of number is same + // set offset - this._keyHeaderStartOffset = this._headerEndOffset; // version >= 2.0, key_header bytes number is 5 * 8, otherwise, 4 * 4 + this._keyHeaderStartOffset = this._headerEndOffset; + // version >= 2.0, key_header bytes number is 5 * 8, otherwise, 4 * 4 var bytesNum = this._version >= 2.0 ? 8 * 5 : 4 * 4; + var keyHeaderBuff = this._readBuffer(this._keyHeaderStartOffset, bytesNum); - var keyHeaderBuff = this._readBuffer(this._keyHeaderStartOffset, bytesNum); // decrypt - - + // decrypt if (this._encrypt & 1) { - if (!this._passcode || this._passcode == '') { + if (!this._passcode || this._passcode == "") { // TODO: encrypted file not support yet - throw Error(' user identification is needed to read encrypted file'); - } // regcode, userid = header_info['_passcode'] - - - if (this.header.RegisterBy == 'Email') { + throw Error(" user identification is needed to read encrypted file"); + } + // regcode, userid = header_info['_passcode'] + if (this.header.RegisterBy == "Email") { // encrypted_key = _decrypt_regcode_by_email(regcode, userid); - throw Error('encrypted file not support yet'); + throw Error("encrypted file not support yet"); } else { - throw Error('encrypted file not support yet'); + throw Error("encrypted file not support yet"); } } - - var ofset = 0; // [0:8] - number of key blocks - + var ofset = 0; + // [0:8] - number of key blocks var keyBlockNumBuff = keyHeaderBuff.slice(ofset, ofset + this._numWidth); this.keyHeader.keyBlocksNum = _common["default"].readNumber(keyBlockNumBuff, this._numFmt); - ofset += this._numWidth; // console.log("num_key_blocks", num_key_blocks.toString()); - // [8:16] - number of entries + ofset += this._numWidth; + // console.log("num_key_blocks", num_key_blocks.toString()); + // [8:16] - number of entries var entriesNumBuff = keyHeaderBuff.slice(ofset, ofset + this._numWidth); this.keyHeader.entriesNum = _common["default"].readNumber(entriesNumBuff, this._numFmt); - ofset += this._numWidth; // console.log("num_entries", num_entries.toString()); - // [16:24] - number of key block info decompress size + ofset += this._numWidth; + // console.log("num_entries", num_entries.toString()); + // [16:24] - number of key block info decompress size if (this._version >= 2.0) { // only for version > 2.0 var keyBlockInfoDecompBuff = keyHeaderBuff.slice(ofset, ofset + this._numWidth); - var keyBlockInfoDecompSize = _common["default"].readNumber(keyBlockInfoDecompBuff, this._numFmt); - - ofset += this._numWidth; // console.log(key_block_info_decomp_size.toString()); - + ofset += this._numWidth; + // console.log(key_block_info_decomp_size.toString()); this.keyHeader.keyBlockInfoDecompSize = keyBlockInfoDecompSize; - } // [24:32] - number of key block info compress size - + } + // [24:32] - number of key block info compress size var keyBlockInfoSizeBuff = keyHeaderBuff.slice(ofset, ofset + this._numWidth); - var keyBlockInfoSize = _common["default"].readNumber(keyBlockInfoSizeBuff, this._numFmt); + ofset += this._numWidth; + // console.log("key_block_info_size", key_block_info_size.toString()); + this.keyHeader.keyBlockInfoCompSize = keyBlockInfoSize; - ofset += this._numWidth; // console.log("key_block_info_size", key_block_info_size.toString()); - - this.keyHeader.keyBlockInfoCompSize = keyBlockInfoSize; // [32:40] - number of key blocks total size, note, key blocks total size, not key block info - + // [32:40] - number of key blocks total size, note, key blocks total size, not key block info var keyBlocksTotalSizeBuff = keyHeaderBuff.slice(ofset, ofset + this._numWidth); - var keyBlocksTotalSize = _common["default"].readNumber(keyBlocksTotalSizeBuff, this._numFmt); + ofset += this._numWidth; + // console.log(key_blocks_total_size.toString()); + this.keyHeader.keyBlocksTotalSize = keyBlocksTotalSize; - ofset += this._numWidth; // console.log(key_blocks_total_size.toString()); - - this.keyHeader.keyBlocksTotalSize = keyBlocksTotalSize; // 4 bytes alder32 checksum, after key info block + // 4 bytes alder32 checksum, after key info block // TODO: skip for now, not support yet - - if (this._version >= 2.0) {// this.__skip_bytes(4); - } // set end offset - - - this._keyHeaderEndOffset = this._keyHeaderStartOffset + bytesNum + (this._version >= 2.0 ? 4 : 0); - /* 4 bytes adler32 checksum length, only for version >= 2.0 */ + if (this._version >= 2.0) { + // this.__skip_bytes(4); + } + // set end offset + this._keyHeaderEndOffset = this._keyHeaderStartOffset + bytesNum + (this._version >= 2.0 ? 4 : 0); /* 4 bytes adler32 checksum length, only for version >= 2.0 */ } + /** * STEP 3. read key block info, if you want quick search, read at here already enough * read key block info * key block info list */ - }, { key: "_readKeyBlockInfo", value: function _readKeyBlockInfo() { this._keyBlockInfoStartOffset = this._keyHeaderEndOffset; - var keyBlockInfoBuff = this._readBuffer(this._keyBlockInfoStartOffset, this.keyHeader.keyBlockInfoCompSize); - var keyBlockInfoList = this._decodeKeyBlockInfo(keyBlockInfoBuff); - this._keyBlockInfoEndOffset = this._keyBlockInfoStartOffset + this.keyHeader.keyBlockInfoCompSize; - (0, _assert["default"])(this.keyHeader.keyBlocksNum === keyBlockInfoList.length, 'the num_key_info_list should equals to key_block_info_list'); - this.keyBlockInfoList = keyBlockInfoList; // NOTE: must set at here, otherwise, if we haven't invoke the _decodeKeyBlockInfo method, - // var `_recordBlockStartOffset` will not be setted. + (0, _assert["default"])(this.keyHeader.keyBlocksNum === keyBlockInfoList.length, "the num_key_info_list should equals to key_block_info_list"); + this.keyBlockInfoList = keyBlockInfoList; + // NOTE: must set at here, otherwise, if we haven't invoke the _decodeKeyBlockInfo method, + // var `_recordBlockStartOffset` will not be setted. this._recordBlockStartOffset = this._keyBlockInfoEndOffset + this.keyHeader.keyBlocksTotalSize; } + /** * STEP 4. decode key block info, this function will invokde in `_readKeyBlockInfo` * and decode the first key and last key infomation, etc. * @param {Buffer} keyBlockInfoBuff key block info buffer */ - }, { key: "_decodeKeyBlockInfo", value: function _decodeKeyBlockInfo(keyBlockInfoBuff) { var keyBlockNum = this.keyHeader.keyBlocksNum; var num_entries = this.keyHeader.entriesNum; var kbInfoBuff; - if (this._version >= 2.0) { // zlib compression - (0, _assert["default"])(keyBlockInfoBuff.slice(0, 4).toString('hex') === '02000000', 'the compress type zlib should start with 0x02000000'); + (0, _assert["default"])(keyBlockInfoBuff.slice(0, 4).toString("hex") === "02000000", "the compress type zlib should start with 0x02000000"); var kbInfoCompBuff; - if (this._encrypt === 2) { kbInfoCompBuff = _common["default"].mdxDecrypt(keyBlockInfoBuff); } else if (this._encrypt === 0) { kbInfoCompBuff = keyBlockInfoBuff; - } // For version 2.0, will compress by zlib, lzo just just for 1.0 + } + // For version 2.0, will compress by zlib, lzo just just for 1.0 // key_block_info_compressed[0:8] => compress_type + kbInfoBuff = pako.inflate(kbInfoCompBuff.slice(8, kbInfoCompBuff.length)); - - kbInfoBuff = _pako["default"].inflate(kbInfoCompBuff.slice(8, kbInfoCompBuff.length)); // TODO: check the alder32 checksum + // TODO: check the alder32 checksum // adler32 = unpack('>I', key_block_info_compressed[4:8])[0] // assert(adler32 == zlib.adler32(key_block_info) & 0xffffffff) - // this.keyHeader.keyBlockInfoDecompSize only exist when version >= 2.0 - (0, _assert["default"])(this.keyHeader.keyBlockInfoDecompSize == kbInfoBuff.length, 'key_block_info length should equal'); + // this.keyHeader.keyBlockInfoDecompSize only exist when version >= 2.0 + (0, _assert["default"])(this.keyHeader.keyBlockInfoDecompSize == kbInfoBuff.length, "key_block_info decompress size ".concat(this.keyHeader.keyBlockInfoDecompSize, " should equal to keyblock info buffer length ").concat(kbInfoBuff.length)); } else { kbInfoBuff = keyBlockInfoBuff; } + var key_block_info_list = []; - var key_block_info_list = []; // init tmp variables - + // init tmp variables var countEntriesNum = 0; var byteFmt = _common["default"].NUMFMT_UINT16; var byteWidth = 2; var textTerm = 1; - if (this._version >= 2.0) { byteFmt = _common["default"].NUMFMT_UINT16; byteWidth = 2; @@ -405,66 +440,57 @@ var MDictBase = /*#__PURE__*/function () { byteWidth = 1; textTerm = 0; } - var termSize = textTerm; var kbCount = 0; var i = 0; var kbCompSizeAccu = 0; var kbDeCompSizeAccu = 0; - while (kbCount < keyBlockNum) { // number of entries in current key block var currKBEntriesCount = _common["default"].readNumber(kbInfoBuff.slice(i, i + this._numWidth), this._numFmt); - i += this._numWidth; - var firstKeySize = _common["default"].readNumber(kbInfoBuff.slice(i, i + byteWidth), byteFmt); + i += byteWidth; - i += byteWidth; // step gap - - var stepGap = 0; // term_size is for first key and last key + // step gap + var stepGap = 0; + // term_size is for first key and last key // let term_size = 0; - - if (this._encoding === UTF16 || this.ext === 'mdd') { + if (this._encoding === UTF16 || this.ext === "mdd") { stepGap = (firstKeySize + textTerm) * 2; termSize = textTerm * 2; } else { stepGap = firstKeySize + textTerm; - } // Note: key_block_first_key and last key not need to decode now - - + } + // Note: key_block_first_key and last key not need to decode now var firstKeyBuf = kbInfoBuff.slice(i, i + stepGap); - var firstKey = this._decoder.decode(firstKeyBuf.slice(0, firstKeyBuf.length - termSize)); + i += stepGap; - i += stepGap; // text tail - + // text tail var lastKeySize = _common["default"].readNumber(kbInfoBuff.slice(i, i + byteWidth), byteFmt); - i += byteWidth; - - if (this._encoding === UTF16 || this.ext === 'mdd') { - stepGap = (lastKeySize + textTerm) * 2; // TODO: this is for last key output - + if (this._encoding === UTF16 || this.ext === "mdd") { + stepGap = (lastKeySize + textTerm) * 2; + // TODO: this is for last key output termSize = textTerm * 2; } else { stepGap = lastKeySize + textTerm; - } // lastKey - + } + // lastKey var lastKeyBuf = kbInfoBuff.slice(i, i + stepGap); - var lastKey = this._decoder.decode(lastKeyBuf.slice(0, lastKeyBuf.length - termSize)); + i += stepGap; - i += stepGap; // key block compressed size - + // key block compressed size var kbCompSize = _common["default"].readNumber(kbInfoBuff.slice(i, i + this._numWidth), this._numFmt); + i += this._numWidth; - i += this._numWidth; // key block decompressed size - + // key block decompressed size var kbDecompSize = _common["default"].readNumber(kbInfoBuff.slice(i, i + this._numWidth), this._numFmt); - i += this._numWidth; + /** * PUSH key info item * definition of key info item: @@ -481,7 +507,6 @@ var MDictBase = /*#__PURE__*/function () { * keyBlockIndex: count, * } */ - key_block_info_list.push({ firstKey: firstKey, lastKey: lastKey, @@ -495,22 +520,20 @@ var MDictBase = /*#__PURE__*/function () { keyBlockIndex: kbCount }); kbCount += 1; // key block number - countEntriesNum += currKBEntriesCount; kbCompSizeAccu += kbCompSize; kbDeCompSizeAccu += kbDecompSize; } - (0, _assert["default"])(countEntriesNum === num_entries, "the number_entries ".concat(num_entries, " should equal the count_num_entries ").concat(countEntriesNum)); (0, _assert["default"])(kbCompSizeAccu === this.keyHeader.keyBlocksTotalSize); return key_block_info_list; } + /** * reduce word find the nearest key block * @param {string} phrase searching phrase * @param {function} stripfunc strip key string to compare */ - }, { key: "_reduceWordKeyBlock", value: function _reduceWordKeyBlock(phrase, _s, compareFn) { @@ -520,15 +543,14 @@ var MDictBase = /*#__PURE__*/function () { return word; }; } - var left = 0; var right = this.keyBlockInfoList.length - 1; - var mid = 0; // when compare the word, the uppercase words are less than lowercase words - // so we compare with the greater symbol is wrong, we needs to use the `common.wordCompare` function + var mid = 0; + // when compare the word, the uppercase words are less than lowercase words + // so we compare with the greater symbol is wrong, we needs to use the `common.wordCompare` function while (left <= right) { mid = left + (right - left >> 1); - if (compareFn(_s(phrase), _s(this.keyBlockInfoList[mid].firstKey)) >= 0 && compareFn(_s(phrase), _s(this.keyBlockInfoList[mid].lastKey)) <= 0) { return mid; } else if (compareFn(_s(phrase), _s(this.keyBlockInfoList[mid].lastKey)) >= 0) { @@ -536,81 +558,71 @@ var MDictBase = /*#__PURE__*/function () { } else { right = mid - 1; } - } // if (left >= this.keyBlockInfoList.length) { + } + // if (left >= this.keyBlockInfoList.length) { // return -1; // } - - return -1; } + /** * STEP 5. decode key block * decode key block return the total keys list, * Note: this method runs very slow, please do not use this unless special target */ - }, { key: "_decodeKeyBlock", - value: function _decodeKeyBlock(keep) { + value: function _decodeKeyBlock() { this._keyBlockStartOffset = this._keyBlockInfoEndOffset; - var kbCompBuff = this._readBuffer(this._keyBlockStartOffset, this.keyHeader.keyBlocksTotalSize); - var key_list = []; - var kbStartOfset = 0; // harvest keyblocks - + var kbStartOfset = 0; + // harvest keyblocks for (var idx = 0; idx < this.keyBlockInfoList.length; idx++) { var compSize = this.keyBlockInfoList[idx].keyBlockCompSize; var decompressed_size = this.keyBlockInfoList[idx].keyBlockDecompSize; var start = kbStartOfset; - (0, _assert["default"])(start === this.keyBlockInfoList[idx].keyBlockCompAccumulator, 'should be equal'); - var end = kbStartOfset + compSize; // 4 bytes : compression type - - var kbCompType = new _bl["default"](kbCompBuff.slice(start, start + 4)); // TODO 4 bytes adler32 checksum + (0, _assert["default"])(start === this.keyBlockInfoList[idx].keyBlockCompAccumulator, "should be equal"); + var end = kbStartOfset + compSize; + // 4 bytes : compression type + var kbCompType = new _bl["default"](kbCompBuff.slice(start, start + 4)); + // TODO 4 bytes adler32 checksum // # 4 bytes : adler checksum of decompressed key block // adler32 = unpack('>I', key_block_compressed[start + 4:start + 8])[0] var key_block = void 0; - - if (kbCompType.toString('hex') == '00000000') { + if (kbCompType.toString("hex") == "00000000") { key_block = kbCompBuff.slice(start + 8, end); - } else if (kbCompType.toString('hex') == '01000000') { + } else if (kbCompType.toString("hex") == "01000000") { // # decompress key block var header = new ArrayBuffer([0xf0, decompressed_size]); - var keyBlock = _lzoWrapper["default"].decompress(_common["default"].appendBuffer(header, kbCompBuff.slice(start + 8, end)), decompressed_size, 1308672); - key_block = (0, _bufferToArraybuffer["default"])(keyBlock).slice(keyBlock.byteOffset, keyBlock.byteOffset + keyBlock.byteLength); - } else if (kbCompType.toString('hex') === '02000000') { + } else if (kbCompType.toString("hex") === "02000000") { // decompress key block - key_block = _pako["default"].inflate(kbCompBuff.slice(start + 8, end)); // extract one single key block into a key list + key_block = pako.inflate(kbCompBuff.slice(start + 8, end)); + // extract one single key block into a key list // notice that adler32 returns signed value // TODO compare with privious word // assert(adler32 == zlib.adler32(key_block) & 0xffffffff) } else { - throw Error("cannot determine the compress type: ".concat(kbCompType.toString('hex'))); + throw Error("cannot determine the compress type: ".concat(kbCompType.toString("hex"))); } - - var splitedKey = this._splitKeyBlock(new _bl["default"](key_block), this._numFmt, this._numWidth, this._encoding); - + var splitedKey = this._splitKeyBlock(new _bl["default"](key_block), idx); key_list = key_list.concat(splitedKey); kbStartOfset += compSize; } - (0, _assert["default"])(key_list.length === this.keyHeader.entriesNum); this._keyBlockEndOffset = this._keyBlockStartOffset + this.keyHeader.keyBlocksTotalSize; - if (keep) { - this.keyList = key_list; - } else { - return key_list; - } + // keep keylist in memory + this.keyList = key_list; } + /** * decode key block by key block id (from key info list) * @param {*} kbid key block id */ - }, { key: "_decodeKeyBlockByKBID", value: function _decodeKeyBlockByKBID(kbid) { @@ -618,80 +630,73 @@ var MDictBase = /*#__PURE__*/function () { var compSize = this.keyBlockInfoList[kbid].keyBlockCompSize; var decompSize = this.keyBlockInfoList[kbid].keyBlockDecompSize; var startOffset = this.keyBlockInfoList[kbid].keyBlockCompAccumulator + this._keyBlockStartOffset; - var kbCompBuff = this._readBuffer(startOffset, compSize); - var start = 0; var end = compSize; - var kbCompType = new _bl["default"](kbCompBuff.slice(start, start + 4)); // TODO 4 bytes adler32 checksum + var kbCompType = new _bl["default"](kbCompBuff.slice(start, start + 4)); + // TODO 4 bytes adler32 checksum // # 4 bytes : adler checksum of decompressed key block // adler32 = unpack('>I', key_block_compressed[start + 4:start + 8])[0] var key_block; - - if (kbCompType.toString('hex') == '00000000') { + if (kbCompType.toString("hex") == "00000000") { key_block = kbCompBuff.slice(start + 8, end); - } else if (kbCompType.toString('hex') == '01000000') { + } else if (kbCompType.toString("hex") == "01000000") { // # decompress key block var header = new ArrayBuffer([0xf0, decompSize]); - var keyBlock = _lzoWrapper["default"].decompress(_common["default"].appendBuffer(header, kbCompBuff.slice(start + 8, end)), decompSize, 1308672); - key_block = (0, _bufferToArraybuffer["default"])(keyBlock).slice(keyBlock.byteOffset, keyBlock.byteOffset + keyBlock.byteLength); - } else if (kbCompType.toString('hex') === '02000000') { + } else if (kbCompType.toString("hex") === "02000000") { // decompress key block - key_block = _pako["default"].inflate(kbCompBuff.slice(start + 8, end)); // extract one single key block into a key list + key_block = pako.inflate(kbCompBuff.slice(start + 8, end)); + // extract one single key block into a key list // notice that adler32 returns signed value // TODO compare with privious word // assert(adler32 == zlib.adler32(key_block) & 0xffffffff) } else { - throw Error("cannot determine the compress type: ".concat(kbCompType.toString('hex'))); + throw Error("cannot determine the compress type: ".concat(kbCompType.toString("hex"))); } - - var splitedKey = this._splitKeyBlock(new _bl["default"](key_block), this._numFmt, this._numWidth, this._encoding); - + var splitedKey = this._splitKeyBlock(new _bl["default"](key_block), kbid); return splitedKey; } + /** * STEP 6. split keys from key block * split key from key block buffer * @param {Buffer} keyBlock key block buffer */ - }, { key: "_splitKeyBlock", - value: function _splitKeyBlock(keyBlock) { + value: function _splitKeyBlock(keyBlock, keyBlockIdx) { var delimiter; var width; - - if (this._encoding == 'UTF-16' || this.ext == 'mdd') { - delimiter = '0000'; + if (this._encoding == "UTF-16" || this.ext == "mdd") { + delimiter = "0000"; width = 2; } else { - delimiter = '00'; + delimiter = "00"; width = 1; } - var keyList = []; var keyStartIndex = 0; var keyEndIndex = 0; - while (keyStartIndex < keyBlock.length) { // # the corresponding record's offset in record block // 0.2656s - var recordStartOffset = _common["default"].readNumber(keyBlock.slice(keyStartIndex, keyStartIndex + this._numWidth), this._numFmt); // 0.2746s + var recordStartOffset = _common["default"].readNumber(keyBlock.slice(keyStartIndex, keyStartIndex + this._numWidth), this._numFmt); + + // 0.2746s // const recordStartOffset = common.readNumber2( // keyBlock, keyStartIndex, this._numFmt // ); - // # key text ends with '\x00' - + // # key text ends with '\x00' var i = keyStartIndex + this._numWidth; - while (i < keyBlock.length) { - // delimiter = '0' - if (width === 1 && keyBlock.get(i) == 0 // delimiter = '00' - || width === 2 && keyBlock.get(i) == 0 && keyBlock.get(i + 1) == 0) { + // delimiter = '0' + if (width === 1 && keyBlock.get(i) == 0 || + // delimiter = '00' + width === 2 && keyBlock.get(i) == 0 && keyBlock.get(i + 1) == 0) { //// the method below was very slow, depreate // if ( // new BufferList(keyBlock.slice(i, i + width)).toString('hex') == @@ -700,21 +705,19 @@ var MDictBase = /*#__PURE__*/function () { keyEndIndex = i; break; } - i += width; } - var keyText = this._decoder.decode(keyBlock.slice(keyStartIndex + this._numWidth, keyEndIndex)); - keyStartIndex = keyEndIndex + width; keyList.push({ recordStartOffset: recordStartOffset, - keyText: keyText + keyText: keyText, + keyBlockIdx: keyBlockIdx }); } - return keyList; } + /** * STEP 7. * decode record header, @@ -724,33 +727,22 @@ var MDictBase = /*#__PURE__*/function () { * [16:24/8:12] - record block info size * [24:32/12:16] - record block size */ - }, { key: "_decodeRecordHeader", value: function _decodeRecordHeader() { this._recordHeaderStartOffset = this._keyBlockInfoEndOffset + this.keyHeader.keyBlocksTotalSize; var rhlen = this._version >= 2.0 ? 4 * 8 : 4 * 4; this._recordHeaderEndOffset = this._recordHeaderStartOffset + rhlen; - var rhBuff = this._readBuffer(this._recordHeaderStartOffset, rhlen); - var ofset = 0; - var recordBlocksNum = _common["default"].readNumber(rhBuff.slice(ofset, ofset + this._numWidth), this._numFmt); - ofset += this._numWidth; - var entriesNum = _common["default"].readNumber(rhBuff.slice(ofset, ofset + this._numWidth), this._numFmt); - (0, _assert["default"])(entriesNum === this.keyHeader.entriesNum); ofset += this._numWidth; - var recordBlockInfoCompSize = _common["default"].readNumber(rhBuff.slice(ofset, ofset + this._numWidth), this._numFmt); - ofset += this._numWidth; - var recordBlockCompSize = _common["default"].readNumber(rhBuff.slice(ofset, ofset + this._numWidth), this._numFmt); - this.recordHeader = { recordBlocksNum: recordBlocksNum, entriesNum: entriesNum, @@ -758,6 +750,7 @@ var MDictBase = /*#__PURE__*/function () { recordBlockCompSize: recordBlockCompSize }; } + /** * STEP 8. * decode record Info, @@ -768,12 +761,10 @@ var MDictBase = /*#__PURE__*/function () { * decomAccu * }] */ - }, { key: "_decodeRecordInfo", value: function _decodeRecordInfo() { this._recordInfoStartOffset = this._recordHeaderEndOffset; - var riBuff = this._readBuffer(this._recordInfoStartOffset, this.recordHeader.recordBlockInfoCompSize); /** * record_block_info_list: @@ -785,20 +776,14 @@ var MDictBase = /*#__PURE__*/function () { * }] * Note: every record block will contrains a lot of entries */ - - var recordBlockInfoList = []; var ofset = 0; var compAccu = 0; var decompAccu = 0; - for (var i = 0; i < this.recordHeader.recordBlocksNum; i++) { var compSize = _common["default"].readNumber(riBuff.slice(ofset, ofset + this._numWidth), this._numFmt); - ofset += this._numWidth; - var decompSize = _common["default"].readNumber(riBuff.slice(ofset, ofset + this._numWidth), this._numFmt); - ofset += this._numWidth; recordBlockInfoList.push({ compSize: compSize, @@ -809,120 +794,115 @@ var MDictBase = /*#__PURE__*/function () { compAccu += compSize; decompAccu += decompSize; } - (0, _assert["default"])(ofset === this.recordHeader.recordBlockInfoCompSize); (0, _assert["default"])(compAccu === this.recordHeader.recordBlockCompSize); this.recordBlockInfoList = recordBlockInfoList; - this._recordInfoEndOffset = this._recordInfoStartOffset + this.recordHeader.recordBlockInfoCompSize; // avoid user not invoke the _decodeRecordBlock method - + this._recordInfoEndOffset = this._recordInfoStartOffset + this.recordHeader.recordBlockInfoCompSize; + // avoid user not invoke the _decodeRecordBlock method this._recordBlockStartOffset = this._recordInfoEndOffset; } + /** * STEP 9. * decode all records block, * this is a slowly method, do not use! */ - }, { key: "_decodeRecordBlock", value: function _decodeRecordBlock() { this._recordBlockStartOffset = this._recordInfoEndOffset; var keyData = []; + /** * start reading the record block */ // actual record block - var sizeCounter = 0; var item_counter = 0; var recordOffset = this._recordBlockStartOffset; - for (var idx = 0; idx < this.recordBlockInfoList.length; idx++) { - var comp_type = 'none'; + var comp_type = "none"; var compSize = this.recordBlockInfoList[idx].compSize; var decompSize = this.recordBlockInfoList[idx].decompSize; - var rbCompBuff = this._readBuffer(recordOffset, compSize); + recordOffset += compSize; - recordOffset += compSize; // 4 bytes: compression type + // 4 bytes: compression type + var rbCompType = new _bl["default"](rbCompBuff.slice(0, 4)); - var rbCompType = new _bl["default"](rbCompBuff.slice(0, 4)); // record_block stores the final record data + // record_block stores the final record data + var recordBlock = void 0; - var recordBlock = void 0; // TODO: igore adler32 offset + // TODO: igore adler32 offset // Note: here ignore the checksum part // bytes: adler32 checksum of decompressed record block // adler32 = unpack('>I', record_block_compressed[4:8])[0] - - if (rbCompType.toString('hex') === '00000000') { + if (rbCompType.toString("hex") === "00000000") { recordBlock = rbCompBuff.slice(8, rbCompBuff.length); } else { // -------------- // decrypt // -------------- - var blockBufDecrypted = null; // if encrypt type == 1, the record block was encrypted - - if (this._encrypt === 1 - /* || (this.ext == "mdd" && this._encrypt === 2 ) */ - ) { + var blockBufDecrypted = null; + // if encrypt type == 1, the record block was encrypted + if (this._encrypt === 1 /* || (this.ext == "mdd" && this._encrypt === 2 ) */) { // const passkey = new Uint8Array(8); // record_block_compressed.copy(passkey, 0, 4, 8); // passkey.set([0x95, 0x36, 0x00, 0x00], 4); // key part 2: fixed data blockBufDecrypted = _common["default"].mdxDecrypt(rbCompBuff); } else { blockBufDecrypted = rbCompBuff.slice(8, rbCompBuff.length); - } // -------------- + } + // -------------- // decompress // -------------- - - - if (rbCompType.toString('hex') === '01000000') { - comp_type = 'lzo'; // the header was need by lzo library, should append before real compressed data - - var header = new ArrayBuffer([0xf0, decompSize]); // Note: if use lzo, here will LZO_E_OUTPUT_RUNOVER, so ,use mini lzo js - + if (rbCompType.toString("hex") === "01000000") { + comp_type = "lzo"; + // the header was need by lzo library, should append before real compressed data + var header = new ArrayBuffer([0xf0, decompSize]); + // Note: if use lzo, here will LZO_E_OUTPUT_RUNOVER, so ,use mini lzo js recordBlock = _lzoWrapper["default"].decompress(_common["default"].appendBuffer(header, blockBufDecrypted), decompSize, 1308672); recordBlock = (0, _bufferToArraybuffer["default"])(recordBlock).slice(recordBlock.byteOffset, recordBlock.byteOffset + recordBlock.byteLength); - } else if (rbCompType.toString('hex') === '02000000') { - comp_type = 'zlib'; // zlib decompress - - recordBlock = _pako["default"].inflate(blockBufDecrypted); + } else if (rbCompType.toString("hex") === "02000000") { + comp_type = "zlib"; + // zlib decompress + recordBlock = pako.inflate(blockBufDecrypted); } } + recordBlock = new _bl["default"](recordBlock); - recordBlock = new _bl["default"](recordBlock); // notice that adler32 return signed value + // notice that adler32 return signed value // TODO: ignore the checksum // assert(adler32 == zlib.adler32(record_block) & 0xffffffff) (0, _assert["default"])(recordBlock.length === decompSize); + /** * 请注意,block 是会有很多个的,而每个block都可能会被压缩 * 而 key_list中的 record_start, key_text是相对每一个block而言的,end是需要每次解析的时候算出来的 * 所有的record_start/length/end都是针对解压后的block而言的 */ - // split record block according to the offset info from key block + // split record block according to the offset info from key block var offset = 0; var i = 0; - while (i < this.keyList.length) { var recordStart = this.keyList[i].recordStartOffset; - var keyText = this.keyList[i].keyText; // # reach the end of current record block + var keyText = this.keyList[i].keyText; + // # reach the end of current record block if (recordStart - offset >= recordBlock.length) { break; - } // # record end index - - + } + // # record end index var recordEnd = void 0; - if (i < this.keyList.length - 1) { recordEnd = this.keyList[i + 1].recordStartOffset; } else { recordEnd = recordBlock.length + offset; } - - i += 1; // const data = record_block.slice(record_start - offset, record_end - offset); - + i += 1; + // const data = record_block.slice(record_start - offset, record_end - offset); keyData.push({ key: keyText, idx: item_counter, @@ -941,39 +921,35 @@ var MDictBase = /*#__PURE__*/function () { }); item_counter++; } - offset += recordBlock.length; sizeCounter += compSize; } - (0, _assert["default"])(sizeCounter === this.recordHeader.recordBlockCompSize); this.keyData = keyData; this._recordBlockEndOffset = this._recordBlockStartOffset + sizeCounter; } + /** * find record which record start locate * @param {number} recordStart record start offset */ - }, { key: "_reduceRecordBlock", value: function _reduceRecordBlock(recordStart) { var left = 0; var right = this.recordBlockInfoList.length - 1; var mid = 0; - while (left <= right) { mid = left + (right - left >> 1); - if (recordStart >= this.recordBlockInfoList[mid].decompAccumulator) { left = mid + 1; } else { right = mid - 1; } } - return left - 1; } + /** * decode record block by record block id quickly search * @param {number} rbid record block id @@ -981,7 +957,6 @@ var MDictBase = /*#__PURE__*/function () { * @param {number} start this word record start offset * @param {number} nextStart next word record start offset */ - }, { key: "_decodeRecordBlockByRBID", value: function _decodeRecordBlockByRBID(rbid, keyText, start, nextStart) { @@ -992,67 +967,63 @@ var MDictBase = /*#__PURE__*/function () { var compAccumulator = this.recordBlockInfoList[rbid].compAccumulator; var decompAccumulator = this.recordBlockInfoList[rbid].decompAccumulator; var startOffset = compAccumulator + this._recordBlockStartOffset; + var rbCompBuff = this._readBuffer(startOffset, compSize); - var rbCompBuff = this._readBuffer(startOffset, compSize); // 4 bytes: compression type + // 4 bytes: compression type + var rbCompType = new _bl["default"](rbCompBuff.slice(0, 4)); + // record_block stores the final record data + var recordBlock; - var rbCompType = new _bl["default"](rbCompBuff.slice(0, 4)); // record_block stores the final record data - - var recordBlock; // TODO: igore adler32 offset + // TODO: igore adler32 offset // Note: here ignore the checksum part // bytes: adler32 checksum of decompressed record block // adler32 = unpack('>I', record_block_compressed[4:8])[0] - - if (rbCompType.toString('hex') === '00000000') { + if (rbCompType.toString("hex") === "00000000") { recordBlock = rbCompBuff.slice(8, rbCompBuff.length); } else { // -------------- // decrypt // -------------- - var blockBufDecrypted = null; // if encrypt type == 1, the record block was encrypted - - if (this._encrypt === 1 - /* || (this.ext == "mdd" && this._encrypt === 2 ) */ - ) { + var blockBufDecrypted = null; + // if encrypt type == 1, the record block was encrypted + if (this._encrypt === 1 /* || (this.ext == "mdd" && this._encrypt === 2 ) */) { // const passkey = new Uint8Array(8); // record_block_compressed.copy(passkey, 0, 4, 8); // passkey.set([0x95, 0x36, 0x00, 0x00], 4); // key part 2: fixed data blockBufDecrypted = _common["default"].mdxDecrypt(rbCompBuff); } else { blockBufDecrypted = rbCompBuff.slice(8, rbCompBuff.length); - } // -------------- + } + // -------------- // decompress // -------------- - - - if (rbCompType.toString('hex') === '01000000') { + if (rbCompType.toString("hex") === "01000000") { // the header was need by lzo library, should append before real compressed data - var header = new ArrayBuffer([0xf0, decompSize]); // Note: if use lzo, here will LZO_E_OUTPUT_RUNOVER, so ,use mini lzo js - + var header = new ArrayBuffer([0xf0, decompSize]); + // Note: if use lzo, here will LZO_E_OUTPUT_RUNOVER, so ,use mini lzo js recordBlock = _lzoWrapper["default"].decompress(_common["default"].appendBuffer(header, blockBufDecrypted), decompSize, 1308672); recordBlock = (0, _bufferToArraybuffer["default"])(recordBlock).slice(recordBlock.byteOffset, recordBlock.byteOffset + recordBlock.byteLength); - } else if (rbCompType.toString('hex') === '02000000') { + } else if (rbCompType.toString("hex") === "02000000") { // zlib decompress - recordBlock = _pako["default"].inflate(blockBufDecrypted); + recordBlock = pako.inflate(blockBufDecrypted); } } + recordBlock = new _bl["default"](recordBlock); - recordBlock = new _bl["default"](recordBlock); // notice that adler32 return signed value + // notice that adler32 return signed value // TODO: ignore the checksum // assert(adler32 == zlib.adler32(record_block) & 0xffffffff) - (0, _assert["default"])(recordBlock.length === decompSize); var recordStart = start - decompAccumulator; var recordEnd = nextStart - decompAccumulator; var data = recordBlock.slice(recordStart, recordEnd); - - if (this.ext === 'mdd') { + if (this.ext === "mdd") { return { keyText: keyText, definition: BASE64ENCODER(data) }; } - return { keyText: keyText, definition: this._decoder.decode(data) @@ -1063,9 +1034,67 @@ var MDictBase = /*#__PURE__*/function () { value: function _readBuffer(start, length) { return _readChunk["default"].sync(this.fname, start, length); } + + // store key to wordBuffer + }, { + key: "_resortKeyList", + value: function _resortKeyList() { + var _this = this; + // 排序之前记录下,每个单词的结束位置,因为排序之后顺序就乱了,buffer 里就不能再根据下一个单词判断了 + this.keyList.map(function (v, i) { + v.original_idx = i; + if (i > 0) { + _this.keyList[i - 1].nextRecordStartOffset = v.recordStartOffset; + } + }); + this.keyListRemap = {}; + if (this._isKeyCaseSensitive()) { + this.keyList.sort(_common["default"].caseUnsensitiveCompare); + } else { + this.keyList.sort(_common["default"].caseSensitiveCompare); + } + + // build index remap + this.keyList.map(function (v, i) { + _this.keyListRemap[v.original_idx] = i; + }); + } + }, { + key: "_stripKeyOrIngoreCase", + value: function _stripKeyOrIngoreCase(key) { + return function (key) { + // this strip/case sensistive part will increase time cost about 100% (20ms->38ms) + if (this._isStripKey()) { + key = key.replace(_common["default"].REGEXP_STRIPKEY[this.ext], "$1"); + } + if (!this._isKeyCaseSensitive()) { + key = key.toLowerCase(); + } + return key.trim(); + }.bind(this); + } + }, { + key: "_isKeyCaseSensitive", + value: function _isKeyCaseSensitive() { + return this.options.isCaseSensitive || _common["default"].isTrue(this.header.isCaseSensitive); + } + }, { + key: "_isStripKey", + value: function _isStripKey() { + return this.options.isStripKey || _common["default"].isTrue(this.header.StripKey); + } + + /** + * 经过一系列测试, 发现mdx格式的文件存在较大的词语排序问题,存在如下情况: + * 1. 大小写的问题 比如 a-zA-Z 和 aA-zZ 这种并存的情况 + * 2. 多语言的情况,存在英文和汉字比较大小的情况一般情况下 英文应当排在汉字前面 + * 3. 小语种的情况 + * 上述的这些情况都有可能出现,无法通过字典头中的设置实现排序,所以无法通过内部的keyInfoList进行快速索引, + * 在现代计算机的性能条件下,直接遍历全部词条也可得到较好的效果,因此目前采用的策略是全部读取词条,内部排序 + * + */ }]); return MDictBase; }(); - var _default = MDictBase; exports["default"] = _default; \ No newline at end of file diff --git a/lib/mdict.js b/lib/mdict.js index aa8a57e..a0b6a03 100644 --- a/lib/mdict.js +++ b/lib/mdict.js @@ -1,203 +1,227 @@ "use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); - Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; - +var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); - var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); - var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); - var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); - var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); - var _lemmatizer = require("lemmatizer"); - var _dictionaryEnUs = _interopRequireDefault(require("dictionary-en-us")); - var _nspell = _interopRequireDefault(require("nspell")); - var _doublearray = _interopRequireDefault(require("doublearray")); - var _mdictBase = _interopRequireDefault(require("./mdict-base")); - var _common = _interopRequireDefault(require("./common")); - +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } - function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } - var Mdict = /*#__PURE__*/function (_MdictBase) { (0, _inherits2["default"])(Mdict, _MdictBase); - var _super = _createSuper(Mdict); - - function Mdict(fname) { + function Mdict(fname, options) { + var _options$passcode, _options$debug, _options$resort, _options$isStripKey, _options$isCaseSensit; var _this; - - var searchOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; (0, _classCallCheck2["default"])(this, Mdict); - var passcode = searchOptions.passcode || undefined; - _this = _super.call(this, fname, passcode); - _this.searchOptions = {}; - searchOptions = searchOptions || {}; - _this.searchOptions.passcode = searchOptions.passcode || undefined; - _this.searchOptions.keyCaseSensitive = searchOptions.keyCaseSensitive; - _this.searchOptions.stripKey = searchOptions.stripKey; + options = options || {}; + options = { + passcode: (_options$passcode = options.passcode) !== null && _options$passcode !== void 0 ? _options$passcode : "", + debug: (_options$debug = options.debug) !== null && _options$debug !== void 0 ? _options$debug : false, + resort: (_options$resort = options.resort) !== null && _options$resort !== void 0 ? _options$resort : true, + isStripKey: (_options$isStripKey = options.isStripKey) !== null && _options$isStripKey !== void 0 ? _options$isStripKey : true, + isCaseSensitive: (_options$isCaseSensit = options.isCaseSensitive) !== null && _options$isCaseSensit !== void 0 ? _options$isCaseSensit : true + }; + var passcode = options.passcode || undefined; + _this = _super.call(this, fname, passcode, options); + _this.options = options; return _this; } - (0, _createClass2["default"])(Mdict, [{ - key: "_stripKey", - value: function _stripKey() { - var stripKey = this.searchOptions.stripKey || _common["default"].isTrue(this.header.StripKey); + key: "_binarySearchByResort", + value: function _binarySearchByResort(word) { + var _strip = this._stripKeyOrIngoreCase(); - var regexp = _common["default"].REGEXP_STRIPKEY[this.ext]; - return stripKey ? function _s(key) { - return key.replace(regexp, '$1'); - } : function _s(key) { - return key; - }; + // binary search from keyList + var start = 0; + var mid = 0; + var end = this.keyList.length; + // target word + word = _strip(word); + var keyRecord; + while (start <= end) { + mid = start + (end - start >> 1); + var keyText = _strip(this.keyList[mid].keyText); + if (keyText > word) { + end = mid - 1; + } else if (keyText < word) { + start = mid + 1; + } else { + keyRecord = this.keyList[mid]; + break; + } + } + return keyRecord; + } + }, { + key: "_prefixBinarySearchByResort", + value: function _prefixBinarySearchByResort(word) { + var _strip = this._stripKeyOrIngoreCase(); + var end = this.keyList.length; + word = _strip(word); + for (var i = 0; i < end; i++) { + var keyText = _strip(this.keyList[i].keyText); + if (keyText.startsWith(word)) { + return i; + } + } + return -1; + } + }, { + key: "_binarySearchByResort2", + value: function _binarySearchByResort2(word) { + var _strip = this._stripKeyOrIngoreCase(); + word = _strip(word); + for (var i = 0; i < this.keyList.length; i++) { + if (word == this.keyList[i].keyText) { + return this.keyList[i]; + } + } + return undefined; } + }, { + key: "_lookupByResort", + value: function _lookupByResort(word) { + var keyRecord = this._binarySearchByResort2(word); + // if not found the key block, return undefined + if (keyRecord === undefined) { + return { + keyText: word, + definition: null + }; + } + var i = keyRecord.original_idx; + var rid = this._reduceRecordBlock(keyRecord.recordStartOffset); + var nextStart = i + 1 >= this.keyList.length ? this._recordBlockStartOffset + this.recordBlockInfoList[this.recordBlockInfoList.length - 1].decompAccumulator + this.recordBlockInfoList[this.recordBlockInfoList.length - 1].decompSize : this.keyList[this.keyListRemap[i + 1]].recordStartOffset; + var data = this._decodeRecordBlockByRBID(rid, keyRecord.keyText, keyRecord.recordStartOffset, nextStart); + return data; + } + + /** + * + * @param {string} word the target word + * @returns definition + */ }, { key: "lookup", value: function lookup(word) { - var record = this._lookupKID(word); // if not found the key block, return undefined + if (this.ext == "mdx" && this.options.resort) { + return this._lookupByResort(word); + } else { + throw new Error("depreciated, use `locate` method to find out mdd resource"); + } + } + /** + * locate mdd resource binary data + * @param {string} resourceKey resource key + * @returns resource binary data + */ + }, { + key: "locate", + value: function locate(resourceKey) { + var record = this._locateResource(resourceKey); + // if not found the key block, return undefined if (record === undefined) { return { keyText: word, definition: null }; } - var i = record.idx; var list = record.list; - var rid = this._reduceRecordBlock(list[i].recordStartOffset); - - var nextStart = i + 1 >= list.length ? this._recordBlockStartOffset + this.recordBlockInfoList[this.recordBlockInfoList.length - 1].decompAccumulator + this.recordBlockInfoList[this.recordBlockInfoList.length - 1].decompSize : list[i + 1].recordStartOffset; - + var nextStart = i + 1 >= this.keyList.length ? this._recordBlockStartOffset + this.recordBlockInfoList[this.recordBlockInfoList.length - 1].decompAccumulator + this.recordBlockInfoList[this.recordBlockInfoList.length - 1].decompSize : list[i + 1].recordStartOffset; var data = this._decodeRecordBlockByRBID(rid, list[i].keyText, list[i].recordStartOffset, nextStart); - return data; } - }, { - key: "_isKeyCaseSensitive", - value: function _isKeyCaseSensitive() { - return this.searchOptions.keyCaseSensitive || _common["default"].isTrue(this.header.KeyCaseSensitive); - } }, { key: "_lookupRecordBlockWordList", value: function _lookupRecordBlockWordList(word) { var _this2 = this; - var lookupInternal = function lookupInternal(compareFn) { - var sfunc = _this2._stripKey(); - - var kbid = _this2._reduceWordKeyBlock(word, sfunc, compareFn); // not found - - + var sfunc = _this2._stripKeyOrIngoreCase(); + var kbid = _this2._reduceWordKeyBlock(word, sfunc, compareFn); + // not found if (kbid < 0) { return undefined; } - var list = _this2._decodeKeyBlockByKBID(kbid); - var i = _this2._binarySearh(list, word, sfunc, compareFn); - if (i === undefined) { return undefined; } - return list; }; - var list; - if (this._isKeyCaseSensitive()) { - list = lookupInternal(_common["default"].normalUpperCaseWordCompare); + list = lookupInternal(_common["default"].caseSensitiveCompare); } else { - list = lookupInternal(_common["default"].normalUpperCaseWordCompare); - + list = lookupInternal(_common["default"].caseSensitiveCompare); if (list === undefined) { - list = lookupInternal(_common["default"].wordCompare); + list = lookupInternal(_common["default"].caseUnSensitiveCompare); } } - return list; } }, { - key: "_lookupKID", - value: function _lookupKID(word) { - var _this3 = this; - - var lookupInternal = function lookupInternal(compareFn) { - var sfunc = _this3._stripKey(); - - var kbid = _this3._reduceWordKeyBlock(word, sfunc, compareFn); // not found - - - if (kbid < 0) { - return undefined; - } - - var list = _this3._decodeKeyBlockByKBID(kbid); - - var i = _this3._binarySearh(list, word, sfunc, compareFn); - - if (i === undefined) { - return undefined; - } - - return { - idx: i, - list: list - }; - }; - - var record; - + key: "_locateResource", + value: function _locateResource(key) { + var sfunc = this._stripKeyOrIngoreCase(); + var compareFn; if (this._isKeyCaseSensitive()) { - record = lookupInternal(_common["default"].normalUpperCaseWordCompare); + compareFn = _common["default"].caseSensitiveCompare; } else { - record = lookupInternal(_common["default"].normalUpperCaseWordCompare); - - if (record === undefined) { - record = lookupInternal(_common["default"].wordCompare); - } + compareFn = _common["default"].caseUnsensitiveCompare; } - - return record; + var kbid = this._reduceWordKeyBlock(key, sfunc, compareFn); + // not found + if (kbid < 0) { + return undefined; + } + var list = this._decodeKeyBlockByKBID(kbid); + var i = this._binarySearh(list, key, sfunc, compareFn); + if (i === undefined) { + return undefined; + } + return { + idx: i, + list: list + }; } }, { key: "_binarySearh", value: function _binarySearh(list, word, _s, compareFn) { if (!_s || _s == undefined) { - // eslint-disable-next-line - _s = this._stripKey(); + _s = this._stripKeyOrIngoreCase(); } - var left = 0; var right = list.length - 1; var mid = 0; - while (left <= right) { - mid = left + (right - left >> 1); // if case sensitive, the uppercase word is smaller than lowercase word + mid = left + (right - left >> 1); + // if case sensitive, the uppercase word is smaller than lowercase word // for example: `Holanda` is smaller than `abacaxi` // so when comparing with the words, we should use the dictionary order, // however, if we change the word to lowercase, the binary search algorithm will be confused // so, we use the enhanced compare function `common.wordCompare` - - var compareResult = compareFn(_s(word), _s(list[mid].keyText)); // console.log(`@#@# wordCompare ${_s(word)} ${_s(list[mid].keyText)} ${compareResult} l: ${left} r: ${right} mid: ${mid} ${list[mid].keyText}`) - + var compareResult = compareFn(_s(word), _s(list[mid].keyText)); + // console.log(`@#@# wordCompare ${_s(word)} ${_s(list[mid].keyText)} ${compareResult} l: ${left} r: ${right} mid: ${mid} ${list[mid].keyText}`) if (compareResult > 0) { left = mid + 1; } else if (compareResult == 0) { @@ -206,66 +230,83 @@ var Mdict = /*#__PURE__*/function (_MdictBase) { right = mid - 1; } } - return undefined; } }, { key: "_findList", value: function _findList(word) { - var _this4 = this; - + var _this3 = this; var findListInternal = function findListInternal(compareFn) { - var sfunc = _this4._stripKey(); - - var kbid = _this4._reduceWordKeyBlock(word, sfunc, compareFn); // not found - - + var sfunc = _this3._stripKeyOrIngoreCase(); + var kbid = _this3._reduceWordKeyBlock(word, sfunc, compareFn); + // not found if (kbid < 0) { return undefined; } - return { sfunc: sfunc, kbid: kbid, - list: _this4._decodeKeyBlockByKBID(kbid) + list: _this3._decodeKeyBlockByKBID(kbid) }; }; - var list; - if (this._isKeyCaseSensitive()) { - list = findListInternal(_common["default"].normalUpperCaseWordCompare); + list = findListInternal(_common["default"].caseSensitiveCompare); } else { - list = findListInternal(_common["default"].normalUpperCaseWordCompare); - + list = findListInternal(_common["default"].caseSensitiveCompare); if (list === undefined) { - list = findListInternal(_common["default"].wordCompare); + list = findListInternal(_common["default"].caseUnsensitiveCompare); } } - return list; } + }, { + key: "_locate_prefix_list", + value: function _locate_prefix_list(phrase) { + var max_len = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100; + var max_missed = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 100; + var record = this._prefixBinarySearchByResort(phrase); + if (record == -1) { + return []; + } + var fn = this._stripKeyOrIngoreCase(); + var list = []; + var count = 0; + var missed = 0; + for (var i = record; i < this.keyList.length; i++) { + if (this.keyList[i].keyText.startsWith(fn(phrase))) { + list.push(this.keyList[i]); + count++; + } else { + missed++; + } + if (count > max_len) { + break; + } + if (missed > max_missed) { + break; + } + } + return list; + } + /** * get word prefix words * @param {string} phrase the word which needs to find prefix */ - }, { key: "prefix", value: function prefix(phrase) { - var list = this._findList(phrase).list; - + var list = this._locate_prefix_list(phrase); if (!list) { return []; } - var trie = _doublearray["default"].builder().build(list.map(function (keyword) { return { k: keyword.keyText, v: keyword.recordStartOffset }; })); - return trie.commonPrefixSearch(phrase).map(function (item) { return { key: item.k, @@ -273,59 +314,22 @@ var Mdict = /*#__PURE__*/function (_MdictBase) { }; }); } + /** * get words associated * @param {string} phrase the word which needs to be associated */ - }, { key: "associate", value: function associate(phrase) { - var record = this._findList(phrase); - - if (!record) { - return []; - } - - var sfunc = record.sfunc; - var kbid = record.kbid; - var list = record.list; - var matched = list.filter(function (item) { - return sfunc(item.keyText).startsWith(sfunc(phrase)); - }); - - if (!matched.length) { - matched = this.associate0(phrase); - } // still nothing - - - if (!matched.length) { - return matched; - } // in case there are matched items in next key block - - - while (matched[matched.length - 1].keyText === list[list.length - 1].keyText && kbid < this.keyBlockInfoList.length) { - kbid++; - list = this._decodeKeyBlockByKBID(kbid); - matched.concat(list.filter(function (item) { - return sfunc(item.keyText).startsWith(sfunc(phrase)); - })); - } // to meet the typings - - + var matched = this._locate_prefix_list(phrase, 100); + // to meet the typings matched.map(function (item) { item.rofset = item.recordStartOffset; }); return matched; } - }, { - key: "associate0", - value: function associate0(phrase) { - // if matched nothing, research in the record block - var recordList = this._lookupRecordBlockWordList(phrase); - return recordList || []; - } /** * fuzzy_search * find latest `fuzzy_size` words, and filter by lavenshtein_distance @@ -349,44 +353,35 @@ var Mdict = /*#__PURE__*/function (_MdictBase) { * } * ] */ - }, { key: "fuzzy_search", value: function fuzzy_search(word, fuzzy_size, ed_gap) { - var _this5 = this; - - var fwords = []; var fuzzy_words = []; - fwords = fwords.concat(this.prefix(word).map(function (kv) { - return { - key: kv.key, - idx: kv.rofset, - ed: _common["default"].levenshtein_distance(word, kv.k) - }; - })); - fuzzy_size = fuzzy_size - fwords.length < 0 ? 0 : fuzzy_size - fwords.length; - fwords.map(function (fw) { - var _this5$_lookupKID = _this5._lookupKID(fw.key), - idx = _this5$_lookupKID.idx, - list = _this5$_lookupKID.list; - - return _this5._find_nabor(idx, Math.ceil(fuzzy_size / fwords.length), list).filter(function (item) { - return _common["default"].levenshtein_distance(item.keyText, word) <= ed_gap; - }).map(function (kitem) { - return fuzzy_words.push({ - key: kitem.keyText, - rofset: kitem.recordStartOffset, - ed: _common["default"].levenshtein_distance(word, kitem.keyText) - }); - }); - }); + var count = 0; + var fn = this._stripKeyOrIngoreCase(); + for (var i = 0; i < this.keyList.length; i++) { + var item = this.keyList[i]; + var key = fn(item.keyText); + var ed = _common["default"].levenshtein_distance(key, fn(word)); + if (ed <= ed_gap) { + count++; + if (count > fuzzy_size) { + break; + } + fuzzy_words.push(_objectSpread(_objectSpread({}, item), {}, { + key: item.keyText, + idx: item.recordStartOffset, + ed: ed + })); + } + } return fuzzy_words; } + /** * return word's lemmatizer * @param {string} phrase word phrase */ - }, { key: "lemmer", value: function lemmer(phrase) { @@ -400,10 +395,8 @@ var Mdict = /*#__PURE__*/function (_MdictBase) { if (err) { reject(err); } - resolve(dict); } - (0, _dictionaryEnUs["default"])(onDictLoad); }); } @@ -425,32 +418,34 @@ var Mdict = /*#__PURE__*/function (_MdictBase) { var iend = idx + fuzsize > imax ? imax : idx + fuzsize; return list.slice(istart, iend); } + /** * parse the definition by word and ofset * @param {string} word the target word * @param {number} rstartofset the record start offset (fuzzy_start rofset) */ - }, { key: "parse_defination", value: function parse_defination(word, rstartofset) { var rid = this._reduceRecordBlock(rstartofset); - - var _this$_lookupKID = this._lookupKID(word), - idx = _this$_lookupKID.idx, - list = _this$_lookupKID.list; - + var _this$_locateResource = this._locateResource(word), + idx = _this$_locateResource.idx, + list = _this$_locateResource.list; var nextStart = idx + 1 >= list.length ? this._recordBlockStartOffset + this.recordBlockInfoList[this.recordBlockInfoList.length - 1].decompAccumulator + this.recordBlockInfoList[this.recordBlockInfoList.length - 1].decompSize : list[idx + 1].recordStartOffset; var startoffset = list[idx].recordStartOffset; - if (rstartofset != startoffset) { // if args.rstartofset != list[idx].recordStartOffset // use args.rstartofset startoffset = rstartofset; } - var data = this._decodeRecordBlockByRBID(rid, list[idx].keyText, startoffset, nextStart); - + return data; + } + }, { + key: "parse_def_record", + value: function parse_def_record(keyRecord) { + var rid = this._reduceRecordBlock(keyRecord.recordStartOffset); + var data = this._decodeRecordBlockByRBID(rid, keyRecord.keyText, keyRecord.recordStartOffset, keyRecord.nextRecordStartOffset); return data; } }, { @@ -461,6 +456,5 @@ var Mdict = /*#__PURE__*/function (_MdictBase) { }]); return Mdict; }(_mdictBase["default"]); - var _default = Mdict; exports["default"] = _default; \ No newline at end of file diff --git a/lib/mdictmdd.js b/lib/mdictmdd.js new file mode 100644 index 0000000..d8dc8da --- /dev/null +++ b/lib/mdictmdd.js @@ -0,0 +1,59 @@ +"use strict"; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); +var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); +var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); +var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); +var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } +var _require = require("./mdict-base"), + MDictBase = _require["default"]; +var MdictMdd = /*#__PURE__*/function (_MDictBase) { + (0, _inherits2["default"])(MdictMdd, _MDictBase); + var _super = _createSuper(MdictMdd); + function MdictMdd(fname, options) { + var _options$passcode, _options$debug, _options$resort, _options$isStripKey, _options$isCaseSensit; + var _this; + (0, _classCallCheck2["default"])(this, MdictMdd); + options = options || {}; + options = { + passcode: (_options$passcode = options.passcode) !== null && _options$passcode !== void 0 ? _options$passcode : "", + debug: (_options$debug = options.debug) !== null && _options$debug !== void 0 ? _options$debug : false, + resort: (_options$resort = options.resort) !== null && _options$resort !== void 0 ? _options$resort : false, + isStripKey: (_options$isStripKey = options.isStripKey) !== null && _options$isStripKey !== void 0 ? _options$isStripKey : true, + isCaseSensitive: (_options$isCaseSensit = options.isCaseSensitive) !== null && _options$isCaseSensit !== void 0 ? _options$isCaseSensit : true + }; + var passcode = options.passcode || undefined; + _this = _super.call(this, fname, passcode, options); + _this.searchOptions = options; + return _this; + } + /** + * + * @param {string} word the target word + * @returns definition + */ + (0, _createClass2["default"])(MdictMdd, [{ + key: "lookup", + value: function lookup(word) { + var record = this._lookupKID(word); + + // if not found the key block, return undefined + if (record === undefined) { + return { + keyText: word, + definition: null + }; + } + var i = record.idx; + var list = record.list; + var rid = this._reduceRecordBlock(list[i].recordStartOffset); + var nextStart = i + 1 >= this.keyList.length ? this._recordBlockStartOffset + this.recordBlockInfoList[this.recordBlockInfoList.length - 1].decompAccumulator + this.recordBlockInfoList[this.recordBlockInfoList.length - 1].decompSize : list[i + 1].recordStartOffset; + var data = this._decodeRecordBlockByRBID(rid, list[i].keyText, list[i].recordStartOffset, nextStart); + return data; + } + }]); + return MdictMdd; +}(MDictBase); \ No newline at end of file diff --git a/lib/measure-util.js b/lib/measure-util.js new file mode 100644 index 0000000..70a4819 --- /dev/null +++ b/lib/measure-util.js @@ -0,0 +1,62 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports["default"] = void 0; +/** + * measuer the function call time cost + * @param {any} _this the target function bind object + * @param {function} fn the callee function + * @param {string} name function name (optional) + * @returns + */ +function measureTimeFn(_this, fn) { + var name = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "unknown"; + var fname = fn.toString(); + fname = fname.substring("function ".length); + fname = fname.substring(0, fname.indexOf("(")); + return function () { + var _fname, _fname2; + console.time((_fname = fname) !== null && _fname !== void 0 ? _fname : name); + var res = fn.bind(_this).apply(void 0, arguments); + console.timeEnd((_fname2 = fname) !== null && _fname2 !== void 0 ? _fname2 : name); + return res; + }; +} + +/** + * measue memory userage + * @returns print the memeory useage step by step + */ +function measureMemFn() { + // closure variables + var memoryStack = []; + var step = -1; + return function (name) { + var used = process.memoryUsage(); + var memDatas = []; + step++; + memoryStack.push(used); + for (var key in used) { + var key_used = Math.round(used[key] / 1024 / 1024 * 100) / 100; + var last_key_used = 0; + if (step > 0) { + last_key_used = Math.round(memoryStack[step - 1][key] / 1024 / 1024 * 100) / 100; + } + memDatas.push({ + step: step, + category: name, + key: key, + "used(MB)": key_used, + "diff(MB)": Math.round((key_used - last_key_used) * 100) / 100 + }); + } + console.table(memDatas); + }; +} +var _default = { + measureTimeFn: measureTimeFn, + measureMemFn: measureMemFn +}; +exports["default"] = _default; \ No newline at end of file diff --git a/lib/ripemd128.js b/lib/ripemd128.js index 432bb9c..1e5d52a 100644 --- a/lib/ripemd128.js +++ b/lib/ripemd128.js @@ -12,59 +12,82 @@ * * RIPEMD-128 (c) 1996 Hans Dobbertin, Antoon Bosselaers, and Bart Preneel */ + // implementation + // convert array of number to Uint32Array function asUint32Array(arr) { return new Uint32Array(arr); -} // concat 2 typed array - +} +// concat 2 typed array function concat(a, b) { - if (!a && !b) throw new Error('Please specify valid arguments for parameters a and b.'); + if (!a && !b) throw new Error("invalid Buffer a and b"); if (!b || b.length === 0) return a; if (!a || a.length === 0) return b; var c = new a.constructor(a.length + b.length); c.set(a); c.set(b, a.length); return c; -} // swap high and low bits of a 32-bit int. - +} +// swap high and low bits of a 32-bit int. function rotl(x, n) { return x >>> 32 - n | x << n; -} // eslint-disable-next-line - - -var DIGEST = 128; // eslint-disable-next-line - +} +// eslint-disable-next-line +var DIGEST = 128; +// eslint-disable-next-line var BLOCK = 64; -var S = [[11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8], // round 1 -[7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12], // round 2 -[11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5], // round 3 -[11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12], // round 4 -[8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6], // parallel round 1 -[9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11], // parallel round 2 -[9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5], // parallel round 3 +var S = [[11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8], +// round 1 +[7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12], +// round 2 +[11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5], +// round 3 +[11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12], +// round 4 +[8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6], +// parallel round 1 +[9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11], +// parallel round 2 +[9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5], +// parallel round 3 [15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8] // parallel round 4 ].map(asUint32Array); -var X = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // round 1 -[7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8], // round 2 -[3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12], // round 3 -[1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2], // round 4 -[5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12], // parallel round 1 -[6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2], // parallel round 2 -[15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13], // parallel round 3 +var X = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], +// round 1 +[7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8], +// round 2 +[3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12], +// round 3 +[1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2], +// round 4 +[5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12], +// parallel round 1 +[6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2], +// parallel round 2 +[15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13], +// parallel round 3 [8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14] // parallel round 4 ].map(asUint32Array); -var K = asUint32Array([0x00000000, // FF -0x5a827999, // GG -0x6ed9eba1, // HH -0x8f1bbcdc, // II -0x50a28be6, // III -0x5c4dd124, // HHH -0x6d703ef3, // GGG +var K = asUint32Array([0x00000000, +// FF +0x5a827999, +// GG +0x6ed9eba1, +// HH +0x8f1bbcdc, +// II +0x50a28be6, +// III +0x5c4dd124, +// HHH +0x6d703ef3, +// GGG 0x00000000 // FFF ]); + var F = [function F1(x, y, z) { return x ^ y ^ z; }, function F2(x, y, z) { @@ -74,8 +97,7 @@ var F = [function F1(x, y, z) { }, function F4(x, y, z) { return x & z | y & ~z; }]; - -exports.ripemd128 = function ripemd128(data) { +exports.ripemd128 = function ripemd128(dataBuffer) { var aa; var bb; var cc; @@ -92,21 +114,22 @@ exports.ripemd128 = function ripemd128(data) { var tmp; var x; var hash = new Uint32Array([0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476]); - var bytes = data.length; + var bytes = dataBuffer.length; + var dataUint8Array = new Uint8Array(dataBuffer); var padding = new Uint8Array((bytes % 64 < 56 ? 56 : 120) - bytes % 64); padding[0] = [0x80]; - data = new Uint32Array(concat(data, padding).buffer); // ending with check bits (= little endian 64-bit int, 8 * data.length) - - bytes <<= 3; // eslint-disable-next-line - - x = concat(data, [bytes, bytes >> 31 >> 1]); // update hash + var data = new Uint32Array(concat(dataUint8Array, padding).buffer); + // ending with check bits (= little endian 64-bit int, 8 * data.length) + bytes <<= 3; + // eslint-disable-next-line + x = concat(data, [bytes, bytes >> 31 >> 1]); + // update hash for (i = 0, t = 0, l = x.length; i < l; i += 16, t = 0) { aa = aaa = hash[0]; bb = bbb = hash[1]; cc = ccc = hash[2]; dd = ddd = hash[3]; - for (; t < 64; ++t) { r = ~~(t / 16); aa = rotl(aa + F[r](bb, cc, dd) + x[i + X[r][t % 16]] + K[r], S[r][t % 16]); @@ -116,7 +139,6 @@ exports.ripemd128 = function ripemd128(data) { bb = aa; aa = tmp; } - for (; t < 128; ++t) { r = ~~(t / 16); rr = ~~((63 - t % 64) / 16); @@ -127,13 +149,11 @@ exports.ripemd128 = function ripemd128(data) { bbb = aaa; aaa = tmp; } - ddd = hash[1] + cc + ddd; hash[1] = hash[2] + dd + aaa; hash[2] = hash[3] + aa + bbb; hash[3] = hash[0] + bb + ccc; hash[0] = ddd; } - return new Uint8Array(hash.buffer); }; \ No newline at end of file diff --git a/package.json b/package.json index 776c612..0b022c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "js-mdict", - "version": "4.0.20", + "version": "5.0.0", "description": "mdict (*.mdx, *.mdd) file reader", "main": "lib/mdict.js", "types": "typings/mdict.d.ts", @@ -32,6 +32,7 @@ "homepage": "https://github.com/terasum/js-mdict#readme", "dependencies": { "@babel/runtime": "^7.14.6", + "@xmldom/xmldom": "^0.7.5", "bl": "^2.2.1", "blob-to-buffer": "^1.2.6", "buffer": "^5.0.7", @@ -49,7 +50,7 @@ "read-chunk": "^2.1.0", "string-to-arraybuffer": "^1.0.0", "text-encoding": "^0.6.4", - "@xmldom/xmldom": "^0.7.5" + "util": "^0.12.5" }, "engines": { "node": ">=3.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..0f454ad --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6306 @@ +lockfileVersion: 5.4 + +specifiers: + '@babel/cli': ^7.14.5 + '@babel/core': ^7.14.6 + '@babel/node': ^7.14.7 + '@babel/plugin-transform-arrow-functions': ^7.14.5 + '@babel/plugin-transform-runtime': ^7.14.5 + '@babel/polyfill': ^7.12.1 + '@babel/preset-env': ^7.14.7 + '@babel/preset-stage-0': ^7.8.3 + '@babel/register': ^7.14.5 + '@babel/runtime': ^7.14.6 + '@everymundo/linenumber': ^1.0.0 + '@xmldom/xmldom': ^0.7.5 + benchmark: ^2.1.4 + bl: ^2.2.1 + blob-to-buffer: ^1.2.6 + buffer: ^5.0.7 + buffer-dataview: 0.0.2 + buffer-to-arraybuffer: 0.0.6 + chai: ^4.2.0 + detect-node: ^2.0.3 + dictionary-en-us: ^2.0.0 + doublearray: 0.0.2 + eslint: ^4.19.1 + eslint-config-airbnb: ^16.1.0 + eslint-config-alloy: ^1.4.2 + eslint-plugin-import: ^2.12.0 + eslint-plugin-jsx-a11y: ^6.0.3 + eslint-plugin-react: ^7.9.1 + fs-web: ^1.0.1 + jest: ^27.0.5 + js-bktree: ^1.0.0 + lemmatizer: 0.0.1 + levenshtein-edit-distance: ^2.0.3 + lodash: ^4.17.19 + microtime: ^3.0.0 + mocha: ^5.2.0 + nspell: ^2.1.1 + nyc: ^13.3.0 + pako: ^1.0.6 + prettier: 2.3.1 + read-chunk: ^2.1.0 + string-to-arraybuffer: ^1.0.0 + text-encoding: ^0.6.4 + typescript: ^3.3.3 + util: ^0.12.5 + +dependencies: + '@babel/runtime': 7.21.0 + '@xmldom/xmldom': 0.7.9 + bl: 2.2.1 + blob-to-buffer: 1.2.9 + buffer: 5.7.1 + buffer-dataview: 0.0.2 + buffer-to-arraybuffer: 0.0.6 + detect-node: 2.1.0 + dictionary-en-us: 2.2.1 + doublearray: 0.0.2 + fs-web: 1.0.1 + js-bktree: 1.0.0 + lemmatizer: 0.0.1 + lodash: 4.17.21 + nspell: 2.1.5 + pako: 1.0.11 + read-chunk: 2.1.0 + string-to-arraybuffer: 1.0.2 + text-encoding: 0.6.4 + util: 0.12.5 + +devDependencies: + '@babel/cli': 7.21.0_@babel+core@7.21.3 + '@babel/core': 7.21.3 + '@babel/node': 7.20.7_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.21.3 + '@babel/plugin-transform-runtime': 7.21.0_@babel+core@7.21.3 + '@babel/polyfill': 7.12.1 + '@babel/preset-env': 7.20.2_@babel+core@7.21.3 + '@babel/preset-stage-0': 7.8.3 + '@babel/register': 7.21.0_@babel+core@7.21.3 + '@everymundo/linenumber': 1.0.2 + benchmark: 2.1.4 + chai: 4.3.7 + eslint: 4.19.1 + eslint-config-airbnb: 16.1.0_o6g5b7wqbakin3wfyodcsz5zqu + eslint-config-alloy: 1.4.2 + eslint-plugin-import: 2.27.5_eslint@4.19.1 + eslint-plugin-jsx-a11y: 6.7.1_eslint@4.19.1 + eslint-plugin-react: 7.32.2_eslint@4.19.1 + jest: 27.5.1 + levenshtein-edit-distance: 2.0.5 + microtime: 3.1.1 + mocha: 5.2.0 + nyc: 13.3.0 + prettier: 2.3.1 + typescript: 3.9.10 + +packages: + + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@babel/cli/7.21.0_@babel+core@7.21.3: + resolution: {integrity: sha512-xi7CxyS8XjSyiwUGCfwf+brtJxjW1/ZTcBUkP10xawIEXLX5HzLn+3aXkgxozcP2UhRhtKTmQurw9Uaes7jZrA==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@jridgewell/trace-mapping': 0.3.17 + commander: 4.1.1 + convert-source-map: 1.9.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.5.3 + dev: true + + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/compat-data/7.21.0: + resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.21.3: + resolution: {integrity: sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.21.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.21.3: + resolution: {integrity: sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure/7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: + resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-explode-assignable-expression': 7.18.6 + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.3: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.3 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.5 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + + /@babel/helper-create-class-features-plugin/7.21.0_@babel+core@7.21.3: + resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-regexp-features-plugin/7.21.0_@babel+core@7.21.3: + resolution: {integrity: sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.3.2 + dev: true + + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.3: + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-explode-assignable-expression/7.18.6: + resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-function-name/7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-member-expression-to-functions/7.21.0: + resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-module-transforms/7.21.2: + resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-optimise-call-expression/7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-plugin-utils/7.20.2: + resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-wrap-function': 7.20.5 + '@babel/types': 7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers/7.20.7: + resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-simple-access/7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers/7.20.0: + resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option/7.21.0: + resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-wrap-function/7.20.5: + resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.21.0 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers/7.21.0: + resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/node/7.20.7_@babel+core@7.21.3: + resolution: {integrity: sha512-AQt3gVcP+fpFuoFn4FmIW/+5JovvEoA9og4Y1LrRw0pv3jkl4tujZMMy3X/3ugjLrEy3k1aNywo3JIl3g+jVXQ==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/register': 7.21.0_@babel+core@7.21.3 + commander: 4.1.1 + core-js: 3.29.1 + node-environment-flags: 1.0.6 + regenerator-runtime: 0.13.11 + v8flags: 3.2.0 + dev: true + + /@babel/parser/7.21.3: + resolution: {integrity: sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.20.7_@babel+core@7.21.3: + resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.3 + dev: true + + /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.21.3: + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.21.0_@babel+core@7.21.3: + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.3 + dev: true + + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.3 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.20.7_@babel+core@7.21.3: + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.3 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.3 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.3 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.21.3: + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.3 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.3 + dev: true + + /@babel/plugin-proposal-optional-chaining/7.21.0_@babel+core@7.21.3: + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.3 + dev: true + + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.21.0_@babel+core@7.21.3: + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.21.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.21.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.3: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.3: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.3: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.21.3: + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.3: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.3: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.3: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.3: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.3: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.21.3: + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-arrow-functions/7.20.7_@babel+core@7.21.3: + resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-async-to-generator/7.20.7_@babel+core@7.21.3: + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.21.3: + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-classes/7.21.0_@babel+core@7.21.3: + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-computed-properties/7.20.7_@babel+core@7.21.3: + resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/template': 7.20.7 + dev: true + + /@babel/plugin-transform-destructuring/7.21.3_@babel+core@7.21.3: + resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.21.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-for-of/7.21.0_@babel+core@7.21.3: + resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.21.3: + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.21.2_@babel+core@7.21.3: + resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-simple-access': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.21.3: + resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-identifier': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex/7.20.5_@babel+core@7.21.3: + resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.21.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-parameters/7.21.3_@babel+core@7.21.3: + resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-regenerator/7.20.5_@babel+core@7.21.3: + resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + regenerator-transform: 0.15.1 + dev: true + + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-runtime/7.21.0_@babel+core@7.21.3: + resolution: {integrity: sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.3 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.3 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-spread/7.20.7_@babel+core@7.21.3: + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + dev: true + + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.3: + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.21.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/polyfill/7.12.1: + resolution: {integrity: sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==} + deprecated: 🚨 This package has been deprecated in favor of separate inclusion of a polyfill and regenerator-runtime (when needed). See the @babel/polyfill docs (https://babeljs.io/docs/en/babel-polyfill) for more information. + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.13.11 + dev: true + + /@babel/preset-env/7.20.2_@babel+core@7.21.3: + resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.21.0 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7_@babel+core@7.21.3 + '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.21.3 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-class-static-block': 7.21.0_@babel+core@7.21.3 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7_@babel+core@7.21.3 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-chaining': 7.21.0_@babel+core@7.21.3 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-private-property-in-object': 7.21.0_@babel+core@7.21.3 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.3 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.3 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.21.3 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.3 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.20.7_@babel+core@7.21.3 + '@babel/plugin-transform-async-to-generator': 7.20.7_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoping': 7.21.0_@babel+core@7.21.3 + '@babel/plugin-transform-classes': 7.21.0_@babel+core@7.21.3 + '@babel/plugin-transform-computed-properties': 7.20.7_@babel+core@7.21.3 + '@babel/plugin-transform-destructuring': 7.21.3_@babel+core@7.21.3 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-for-of': 7.21.0_@babel+core@7.21.3 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.21.3 + '@babel/plugin-transform-modules-commonjs': 7.21.2_@babel+core@7.21.3 + '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.21.3 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5_@babel+core@7.21.3 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.3 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-regenerator': 7.20.5_@babel+core@7.21.3 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-spread': 7.20.7_@babel+core@7.21.3 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.21.3 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.21.3 + '@babel/preset-modules': 0.1.5_@babel+core@7.21.3 + '@babel/types': 7.21.3 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.3 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.3 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.3 + core-js-compat: 3.29.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules/0.1.5_@babel+core@7.21.3: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.3 + '@babel/types': 7.21.3 + esutils: 2.0.3 + dev: true + + /@babel/preset-stage-0/7.8.3: + resolution: {integrity: sha512-+l6FlG1j73t4wh78W41StbcCz0/9a1/y+vxfnjtHl060kSmcgMfGzK9MEkLvrCOXfhp9RCX+d88sm6rOqxEIEQ==} + dev: true + + /@babel/register/7.21.0_@babel+core@7.21.3: + resolution: {integrity: sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.5 + source-map-support: 0.5.21 + dev: true + + /@babel/regjsgen/0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: true + + /@babel/runtime/7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + + /@babel/template/7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 + dev: true + + /@babel/traverse/7.21.3: + resolution: {integrity: sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.3 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.21.3: + resolution: {integrity: sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@everymundo/linenumber/1.0.2: + resolution: {integrity: sha512-C/5+pjAEOL4yKSMCUD3vHlTOjBDk1nn8HDuIs4DCTqiG41LP2M1Dypkt3KA4kfeHAgLc5s63+UVqnrrmo1F6Kg==} + dev: true + + /@istanbuljs/load-nyc-config/1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console/27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 18.15.3 + chalk: 4.1.2 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + dev: true + + /@jest/core/27.5.1: + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.15.3 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 27.5.1 + jest-config: 27.5.1 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.5 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@jest/environment/27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.15.3 + jest-mock: 27.5.1 + dev: true + + /@jest/fake-timers/27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 18.15.3 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /@jest/globals/27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 + dev: true + + /@jest/reporters/27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.15.3 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-haste-map: 27.5.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 8.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/source-map/27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + dev: true + + /@jest/test-result/27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/types': 27.5.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + + /@jest/test-sequencer/27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-runtime: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/transform/27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.21.3 + '@jest/types': 27.5.1 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types/27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.15.3 + '@types/yargs': 16.0.5 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@nicolo-ribaudo/chokidar-2/2.1.8-no-fsevents.3: + resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} + requiresBuild: true + dev: true + optional: true + + /@sinonjs/commons/1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers/8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@tootallnate/once/1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@types/babel__core/7.20.0: + resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} + dependencies: + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.18.3 + dev: true + + /@types/babel__generator/7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@types/babel__template/7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 + dev: true + + /@types/babel__traverse/7.18.3: + resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@types/graceful-fs/4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + dependencies: + '@types/node': 18.15.3 + dev: true + + /@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: true + + /@types/istanbul-reports/3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/json5/0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/node/18.15.3: + resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} + dev: true + + /@types/prettier/2.7.2: + resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} + dev: true + + /@types/stack-utils/2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/yargs-parser/21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: true + + /@types/yargs/16.0.5: + resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@xmldom/xmldom/0.7.9: + resolution: {integrity: sha512-yceMpm/xd4W2a85iqZyO09gTnHvXF6pyiWjD2jcOJs7hRoZtNNOO1eJlhHj1ixA+xip2hOyGn+LgcvLCMo5zXA==} + engines: {node: '>=10.0.0'} + dev: false + + /abab/2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true + + /acorn-globals/6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: true + + /acorn-jsx/3.0.1: + resolution: {integrity: sha512-AU7pnZkguthwBjKgCg6998ByQNIMjbuDQZ8bb78QAFZwPfmKia8AIzgY/gWgqCjnht8JLdXmB4YxA0KaV60ncQ==} + dependencies: + acorn: 3.3.0 + dev: true + + /acorn-walk/7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/3.3.0: + resolution: {integrity: sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn/5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn/7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /ajv-keywords/2.1.1_ajv@5.5.2: + resolution: {integrity: sha512-ZFztHzVRdGLAzJmpUT9LNFLe1YiVOEylcaNpEutM26PVTCtOD919IMfD01CgbRouB42Dd9atjx1HseC15DgOZA==} + peerDependencies: + ajv: ^5.0.0 + dependencies: + ajv: 5.5.2 + dev: true + + /ajv/5.5.2: + resolution: {integrity: sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==} + dependencies: + co: 4.6.0 + fast-deep-equal: 1.1.0 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.3.1 + dev: true + + /ansi-escapes/3.2.0: + resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} + engines: {node: '>=4'} + dev: true + + /ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex/2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex/3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /anymatch/3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /append-transform/1.0.0: + resolution: {integrity: sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==} + engines: {node: '>=4'} + dependencies: + default-require-extensions: 2.0.0 + dev: true + + /archy/1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: true + + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /aria-query/5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + dependencies: + deep-equal: 2.2.0 + dev: true + + /array-buffer-byte-length/1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + + /array-includes/3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.0 + is-string: 1.0.7 + dev: true + + /array.prototype.flat/1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap/1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.reduce/1.0.5: + resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: true + + /array.prototype.tosorted/1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.0 + dev: true + + /arrify/1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /assertion-error/1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /ast-types-flow/0.0.7: + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + dev: true + + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /atob-lite/2.0.0: + resolution: {integrity: sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw==} + dev: false + + /available-typed-arrays/1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + /axe-core/4.6.3: + resolution: {integrity: sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==} + engines: {node: '>=4'} + dev: true + + /axobject-query/3.1.1: + resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + dependencies: + deep-equal: 2.2.0 + dev: true + + /babel-code-frame/6.26.0: + resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} + dependencies: + chalk: 1.1.3 + esutils: 2.0.3 + js-tokens: 3.0.2 + dev: true + + /babel-jest/27.5.1_@babel+core@7.21.3: + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.21.3 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.20.0 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1_@babel+core@7.21.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.20.2 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist/27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.21.3 + '@types/babel__core': 7.20.0 + '@types/babel__traverse': 7.18.3 + dev: true + + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.3: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.3: + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.3 + core-js-compat: 3.29.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.3: + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.3: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.3 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.3 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.3 + dev: true + + /babel-preset-jest/27.5.1_@babel+core@7.21.3: + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.3 + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /benchmark/2.1.4: + resolution: {integrity: sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==} + dependencies: + lodash: 4.17.21 + platform: 1.3.6 + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + optional: true + + /bl/2.2.1: + resolution: {integrity: sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==} + dependencies: + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + dev: false + + /blob-to-buffer/1.2.9: + resolution: {integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==} + dev: false + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browser-process-hrtime/1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browser-stdout/1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + dev: true + + /browserslist/4.21.5: + resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001467 + electron-to-chromium: 1.4.332 + node-releases: 2.0.10 + update-browserslist-db: 1.0.10_browserslist@4.21.5 + dev: true + + /bser/2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-dataview/0.0.2: + resolution: {integrity: sha512-YiNEgOoMDO8KrJqptlJYZBrZ9qXajxiaWF0YPU7LC0ywmJ8RVt7R28Y8AlJy97upM5GCQyeBKDeFTXq/Xec5Ow==} + dev: false + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer-to-arraybuffer/0.0.6: + resolution: {integrity: sha512-i/ndmmCF5QC1D75QCO1EPwYRPIVRVs2yLwkl2bc8R5P1ORHGZZAbTwmYM/vpXt7KzCe+Y57E8YPGTJywgWBNRw==} + dev: false + + /buffer/5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /caching-transform/3.0.2: + resolution: {integrity: sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==} + engines: {node: '>=6'} + dependencies: + hasha: 3.0.0 + make-dir: 2.1.0 + package-hash: 3.0.0 + write-file-atomic: 2.4.3 + dev: true + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.0 + + /caller-path/0.1.0: + resolution: {integrity: sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g==} + engines: {node: '>=0.10.0'} + dependencies: + callsites: 0.2.0 + dev: true + + /callsites/0.2.0: + resolution: {integrity: sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A==} + engines: {node: '>=0.10.0'} + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite/1.0.30001467: + resolution: {integrity: sha512-cEdN/5e+RPikvl9AHm4uuLXxeCNq8rFsQ+lPHTfe/OtypP3WwnVVbjn+6uBV7PaFL6xUFzTh+sSCOz1rKhcO+Q==} + dev: true + + /chai/4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk/1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /char-regex/1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /chardet/0.4.2: + resolution: {integrity: sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==} + dev: true + + /check-error/1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + requiresBuild: true + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + optional: true + + /ci-info/3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /circular-json/0.3.3: + resolution: {integrity: sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==} + deprecated: CircularJSON is in maintenance only, flatted is its successor. + dev: true + + /cjs-module-lexer/1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + dev: true + + /cli-cursor/2.1.0: + resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} + engines: {node: '>=4'} + dependencies: + restore-cursor: 2.0.0 + dev: true + + /cli-width/2.2.1: + resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} + dev: true + + /cliui/4.1.0: + resolution: {integrity: sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==} + dependencies: + string-width: 2.1.1 + strip-ansi: 4.0.0 + wrap-ansi: 2.1.0 + dev: true + + /cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-deep/4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /co/4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /code-point-at/1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + dev: true + + /collect-v8-coverage/1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /combined-stream/1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander/2.15.1: + resolution: {integrity: sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==} + dev: true + + /commander/4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /commondir/1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /concat-stream/1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: true + + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /core-js-compat/3.29.1: + resolution: {integrity: sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==} + dependencies: + browserslist: 4.21.5 + dev: true + + /core-js/2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + requiresBuild: true + dev: true + + /core-js/3.29.1: + resolution: {integrity: sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==} + requiresBuild: true + dev: true + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /cross-spawn/4.0.2: + resolution: {integrity: sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==} + dependencies: + lru-cache: 4.1.5 + which: 1.3.1 + dev: true + + /cross-spawn/5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn/6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.1 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /cssom/0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom/0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true + + /cssstyle/2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /damerau-levenshtein/1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /data-urls/2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: true + + /debug/3.1.0_supports-color@5.4.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + supports-color: 5.4.0 + dev: true + + /debug/3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decamelize/1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decimal.js/10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + + /dedent/0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /deep-eql/4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-equal/2.2.0: + resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} + dependencies: + call-bind: 1.0.2 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.0 + is-arguments: 1.1.1 + is-array-buffer: 3.0.2 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.9 + dev: true + + /deep-is/0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge/4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /default-require-extensions/2.0.0: + resolution: {integrity: sha512-B0n2zDIXpzLzKeoEozorDSa1cHc1t0NjmxP0zuAxbizNU2MBqYJJKYXrrFdKuQliojXynrxgd7l4ahfg/+aA5g==} + engines: {node: '>=4'} + dependencies: + strip-bom: 3.0.0 + dev: true + + /define-properties/1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /detect-newline/3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /detect-node/2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: false + + /dictionary-en-us/2.2.1: + resolution: {integrity: sha512-Z8mycV0ywTfjbUTi0JZfQHqBZhu4CYFtpf7KluSGpt3xHpFlal2S/hiK50tlPynOtR5K3pG5wCradnz1yxwOHA==} + dev: false + + /diff-sequences/27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /diff/3.5.0: + resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + engines: {node: '>=0.3.1'} + dev: true + + /doctrine/2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /domexception/2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + dependencies: + webidl-conversions: 5.0.0 + dev: true + + /doublearray/0.0.2: + resolution: {integrity: sha512-aw55FtZzT6AmiamEj2kvmR6BuFqvYgKZUkfQ7teqVRNqD5UE0rw8IeW/3gieHNKQ5sPuDKlljWEn4bzv5+1bHw==} + dev: false + + /electron-to-chromium/1.4.332: + resolution: {integrity: sha512-c1Vbv5tuUlBFp0mb3mCIjw+REEsgthRgNE8BlbEDKmvzb8rxjcVki6OkQP83vLN34s0XCxpSkq7AZNep1a6xhw==} + dev: true + + /emittery/0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} + dev: true + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex/9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /en-inflectors/1.0.12: + resolution: {integrity: sha512-G9wwJMx9DQQzwom8J8e8ErVpI6h/Z5BpYusJCE2Q/2NfgBNYCesyNaCOOskZAhOrw2nmR4D8nYAv4Xv/INIbzw==} + dependencies: + en-stemmer: 1.0.3 + dev: false + + /en-lexicon/1.0.11: + resolution: {integrity: sha512-eanOw9551H6jMRpRK023+Nlss5qnuAi99drXcSUzQySsMrB43teDNbin/AbpOfnemQiTtuZChXYm2kEIR1Mhmg==} + dependencies: + en-inflectors: 1.0.12 + dev: false + + /en-stemmer/1.0.3: + resolution: {integrity: sha512-sBeYsHLqZWACn/mTRLAMdYb/A53s55r4/nCB2UjKK96EBuRQ4t4GKl4V1pW/0hvzdncfYlZRT+JSIRxCtoYqbA==} + dev: false + + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract/1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.0 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.10 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 + dev: true + + /es-array-method-boxes-properly/1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + dev: true + + /es-get-iterator/1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: true + + /es-set-tostringtag/2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-shim-unscopables/1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es6-error/4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escodegen/2.0.0: + resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-airbnb-base/12.1.0_5ykrrhbneafccovfqv46vr6yli: + resolution: {integrity: sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==} + engines: {node: '>= 4'} + peerDependencies: + eslint: ^4.9.0 + eslint-plugin-import: ^2.7.0 + dependencies: + eslint: 4.19.1 + eslint-plugin-import: 2.27.5_eslint@4.19.1 + eslint-restricted-globals: 0.1.1 + dev: true + + /eslint-config-airbnb/16.1.0_o6g5b7wqbakin3wfyodcsz5zqu: + resolution: {integrity: sha512-zLyOhVWhzB/jwbz7IPSbkUuj7X2ox4PHXTcZkEmDqTvd0baJmJyuxlFPDlZOE/Y5bC+HQRaEkT3FoHo9wIdRiw==} + engines: {node: '>= 4'} + peerDependencies: + eslint: ^4.9.0 + eslint-plugin-import: ^2.7.0 + eslint-plugin-jsx-a11y: ^6.0.2 + eslint-plugin-react: ^7.4.0 + dependencies: + eslint: 4.19.1 + eslint-config-airbnb-base: 12.1.0_5ykrrhbneafccovfqv46vr6yli + eslint-plugin-import: 2.27.5_eslint@4.19.1 + eslint-plugin-jsx-a11y: 6.7.1_eslint@4.19.1 + eslint-plugin-react: 7.32.2_eslint@4.19.1 + dev: true + + /eslint-config-alloy/1.4.2: + resolution: {integrity: sha512-DtzV8CC4VawC9E6T2J3RQ7tO6c6zTSxPAm8IdpnQcGDhF8/7GXCf46vclSs6tzkodFLbKwnqcCRG1QZV6BsViw==} + dev: true + + /eslint-import-resolver-node/0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + dependencies: + debug: 3.2.7 + is-core-module: 2.11.0 + resolve: 1.22.1 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils/2.7.4_4jdcx2olcorpb5e2and5paudo4: + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + debug: 3.2.7 + eslint: 4.19.1 + eslint-import-resolver-node: 0.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import/2.27.5_eslint@4.19.1: + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 4.19.1 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4_4jdcx2olcorpb5e2and5paudo4 + has: 1.0.3 + is-core-module: 2.11.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.1 + semver: 6.3.0 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jsx-a11y/6.7.1_eslint@4.19.1: + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.21.0 + aria-query: 5.1.3 + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + ast-types-flow: 0.0.7 + axe-core: 4.6.3 + axobject-query: 3.1.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 4.19.1 + has: 1.0.3 + jsx-ast-utils: 3.3.3 + language-tags: 1.0.5 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + semver: 6.3.0 + dev: true + + /eslint-plugin-react/7.32.2_eslint@4.19.1: + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + eslint: 4.19.1 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.3 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.0 + string.prototype.matchall: 4.0.8 + dev: true + + /eslint-restricted-globals/0.1.1: + resolution: {integrity: sha512-d1cerYC0nOJbObxUe1kR8MZ25RLt7IHzR9d+IOupoMqFU03tYjo7Stjqj04uHx1xx7HKSE9/NjdeBiP4/jUP8Q==} + dev: true + + /eslint-scope/3.7.3: + resolution: {integrity: sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==} + engines: {node: '>=4.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-visitor-keys/1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint/4.19.1: + resolution: {integrity: sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==} + engines: {node: '>=4'} + hasBin: true + dependencies: + ajv: 5.5.2 + babel-code-frame: 6.26.0 + chalk: 2.4.2 + concat-stream: 1.6.2 + cross-spawn: 5.1.0 + debug: 3.2.7 + doctrine: 2.1.0 + eslint-scope: 3.7.3 + eslint-visitor-keys: 1.3.0 + espree: 3.5.4 + esquery: 1.5.0 + esutils: 2.0.3 + file-entry-cache: 2.0.0 + functional-red-black-tree: 1.0.1 + glob: 7.2.3 + globals: 11.12.0 + ignore: 3.3.10 + imurmurhash: 0.1.4 + inquirer: 3.3.0 + is-resolvable: 1.1.0 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.3.0 + lodash: 4.17.21 + minimatch: 3.1.2 + mkdirp: 0.5.6 + natural-compare: 1.4.0 + optionator: 0.8.3 + path-is-inside: 1.0.2 + pluralize: 7.0.0 + progress: 2.0.3 + regexpp: 1.1.0 + require-uncached: 1.0.3 + semver: 5.7.1 + strip-ansi: 4.0.0 + strip-json-comments: 2.0.1 + table: 4.0.2 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree/3.5.4: + resolution: {integrity: sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==} + engines: {node: '>=0.10.0'} + dependencies: + acorn: 5.7.4 + acorn-jsx: 3.0.1 + dev: true + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery/1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse/4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse/4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /execa/1.0.0: + resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} + engines: {node: '>=6'} + dependencies: + cross-spawn: 6.0.5 + get-stream: 4.1.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exit/0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expect/27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + dev: true + + /external-editor/2.2.0: + resolution: {integrity: sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==} + engines: {node: '>=0.12'} + dependencies: + chardet: 0.4.2 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /fast-deep-equal/1.1.0: + resolution: {integrity: sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==} + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein/2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fb-watchman/2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /figures/2.0.0: + resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} + engines: {node: '>=4'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-entry-cache/2.0.0: + resolution: {integrity: sha512-uXP/zGzxxFvFfcZGgBIwotm+Tdc55ddPAzF7iHshP4YGaXMww7rSF9peD9D1sui5ebONg5UobsZv+FfgEpGv/w==} + engines: {node: '>=0.10.0'} + dependencies: + flat-cache: 1.3.4 + object-assign: 4.1.1 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-cache-dir/2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + dev: true + + /find-up/3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: true + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache/1.3.4: + resolution: {integrity: sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==} + engines: {node: '>=0.10.0'} + dependencies: + circular-json: 0.3.3 + graceful-fs: 4.2.11 + rimraf: 2.6.3 + write: 0.2.1 + dev: true + + /for-each/0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /foreground-child/1.5.6: + resolution: {integrity: sha512-3TOY+4TKV0Ml83PXJQY+JFQaHNV38lzQDIzzXYg1kWdBLenGgoZhAs0CKgzI31vi2pWEpQMq/Yi4bpKwCPkw7g==} + dependencies: + cross-spawn: 4.0.2 + signal-exit: 3.0.7 + dev: true + + /form-data/3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /fs-readdir-recursive/1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + dev: true + + /fs-web/1.0.1: + resolution: {integrity: sha512-PUVyPo4SUkGGF3IxFAlzFMCsBi9g9tiRaruN7Bqqy/JHGxCPcX9FiW3w9EnQSG5j/vy3aG+vXJWxaxY2SI4wig==} + dependencies: + path: github.com/component/path/7b4f23c38833a5232cd5e3d50ccb8cd13dbcd2f4 + dev: false + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + functions-have-names: 1.2.3 + dev: true + + /functional-red-black-tree/1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + dev: true + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file/1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + dev: true + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-func-name/2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /get-intrinsic/1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + + /get-package-type/0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stream/4.1.0: + resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} + engines: {node: '>=6'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + optional: true + + /glob/7.1.2: + resolution: {integrity: sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globalthis/1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + + /gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.0 + + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /growl/1.10.5: + resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} + engines: {node: '>=4.x'} + dev: true + + /has-ansi/2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /has-proto/1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /hasha/3.0.0: + resolution: {integrity: sha512-w0Kz8lJFBoyaurBiNrIvxPqr/gJ6fOfSkpAPOepN3oECqGJag37xPbOv57izi/KP8auHgNYxn5fXtAb+1LsJ6w==} + engines: {node: '>=4'} + dependencies: + is-stream: 1.1.0 + dev: true + + /he/1.1.1: + resolution: {integrity: sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==} + hasBin: true + dev: true + + /homedir-polyfill/1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: true + + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /html-encoding-sniffer/2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /http-proxy-agent/4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore/3.3.10: + resolution: {integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==} + dev: true + + /import-local/3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /inquirer/3.3.0: + resolution: {integrity: sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==} + dependencies: + ansi-escapes: 3.2.0 + chalk: 2.4.2 + cli-cursor: 2.1.0 + cli-width: 2.2.1 + external-editor: 2.2.0 + figures: 2.0.0 + lodash: 4.17.21 + mute-stream: 0.0.7 + run-async: 2.4.1 + rx-lite: 4.0.8 + rx-lite-aggregates: 4.0.8 + string-width: 2.1.1 + strip-ansi: 4.0.0 + through: 2.3.8 + dev: true + + /internal-slot/1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /invert-kv/2.0.0: + resolution: {integrity: sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==} + engines: {node: '>=4'} + dev: true + + /is-arguments/1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-array-buffer/3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-typed-array: 1.1.10 + dev: true + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-base64/0.1.0: + resolution: {integrity: sha512-WRRyllsGXJM7ZN7gPTCCQ/6wNPTRDwiWdPK66l5sJzcU/oOzcIcRRf0Rux8bkpox/1yjt0F6VJRsQOIG2qz5sg==} + dev: false + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + optional: true + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-buffer/2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point/1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: true + + /is-fullwidth-code-point/2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-fn/2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-generator-function/1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-map/2.0.2: + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + dev: true + + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-object/2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-potential-custom-element-name/1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-resolvable/1.1.0: + resolution: {integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==} + dev: true + + /is-set/2.0.2: + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + dev: true + + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-stream/1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array/1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + + /is-typedarray/1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-weakmap/2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-weakset/2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + dev: true + + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isarray/2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject/3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /istanbul-lib-coverage/2.0.5: + resolution: {integrity: sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==} + engines: {node: '>=6'} + dev: true + + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-hook/2.0.7: + resolution: {integrity: sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==} + engines: {node: '>=6'} + dependencies: + append-transform: 1.0.0 + dev: true + + /istanbul-lib-instrument/3.3.0: + resolution: {integrity: sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==} + engines: {node: '>=6'} + dependencies: + '@babel/generator': 7.21.3 + '@babel/parser': 7.21.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + istanbul-lib-coverage: 2.0.5 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-instrument/5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.21.3 + '@babel/parser': 7.21.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report/2.0.8: + resolution: {integrity: sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==} + engines: {node: '>=6'} + dependencies: + istanbul-lib-coverage: 2.0.5 + make-dir: 2.1.0 + supports-color: 6.1.0 + dev: true + + /istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps/3.0.6: + resolution: {integrity: sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==} + engines: {node: '>=6'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 2.0.5 + make-dir: 2.1.0 + rimraf: 2.6.3 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports/2.2.7: + resolution: {integrity: sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==} + engines: {node: '>=6'} + dependencies: + html-escaper: 2.0.2 + dev: true + + /istanbul-reports/3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jest-changed-files/27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + execa: 5.1.1 + throat: 6.0.2 + dev: true + + /jest-circus/27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.15.3 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli/27.5.1: + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-config/27.5.1: + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.3 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1_@babel+core@7.21.3 + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-diff/27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-docblock/27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each/27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + jest-get-type: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-environment-jsdom/27.5.1: + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.15.3 + jest-mock: 27.5.1 + jest-util: 27.5.1 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-environment-node/27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.15.3 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /jest-get-type/27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-haste-map/27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 18.15.3 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 27.5.1 + jest-serializer: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-jasmine2/27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.15.3 + chalk: 4.1.2 + co: 4.6.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-leak-detector/27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-matcher-utils/27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-message-util/27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.18.6 + '@jest/types': 27.5.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock/27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 18.15.3 + dev: true + + /jest-pnp-resolver/1.2.3_jest-resolve@27.5.1: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 27.5.1 + dev: true + + /jest-regex-util/27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-resolve-dependencies/27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-regex-util: 27.5.1 + jest-snapshot: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve/27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-pnp-resolver: 1.2.3_jest-resolve@27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + resolve: 1.22.1 + resolve.exports: 1.1.1 + slash: 3.0.0 + dev: true + + /jest-runner/27.5.1: + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.15.3 + chalk: 4.1.2 + emittery: 0.8.1 + graceful-fs: 4.2.11 + jest-docblock: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-haste-map: 27.5.1 + jest-leak-detector: 27.5.1 + jest-message-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runtime: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + source-map-support: 0.5.21 + throat: 6.0.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-runtime/27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/globals': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + execa: 5.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-serializer/27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': 18.15.3 + graceful-fs: 4.2.11 + dev: true + + /jest-snapshot/27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.21.3 + '@babel/generator': 7.21.3 + '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.21.3 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__traverse': 7.18.3 + '@types/prettier': 2.7.2 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.3 + chalk: 4.1.2 + expect: 27.5.1 + graceful-fs: 4.2.11 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + jest-haste-map: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + natural-compare: 1.4.0 + pretty-format: 27.5.1 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util/27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 18.15.3 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate/27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 27.5.1 + leven: 3.1.0 + pretty-format: 27.5.1 + dev: true + + /jest-watcher/27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 18.15.3 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 27.5.1 + string-length: 4.0.2 + dev: true + + /jest-worker/27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 18.15.3 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest/27.5.1: + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1 + import-local: 3.1.0 + jest-cli: 27.5.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /js-bktree/1.0.0: + resolution: {integrity: sha512-5BjNX4B7AFiTNn1e4iyslZ5gOen1ZRaeOHqtymXt4Ovj0zaIzcN3Hg+IpT7wQsJQ8DWVxR7pyMsUs6O8BK5/6g==} + dev: false + + /js-tokens/3.0.2: + resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /jsdom/16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.8.2 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.0.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.2 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.2 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsesc/0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-parse-better-errors/1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse/0.3.1: + resolution: {integrity: sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==} + dev: true + + /json-stable-stringify-without-jsonify/1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5/1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsx-ast-utils/3.3.3: + resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.6 + object.assign: 4.1.4 + dev: true + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /language-subtag-registry/0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + dev: true + + /language-tags/1.0.5: + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + dependencies: + language-subtag-registry: 0.3.22 + dev: true + + /lcid/2.0.0: + resolution: {integrity: sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==} + engines: {node: '>=6'} + dependencies: + invert-kv: 2.0.0 + dev: true + + /lemmatizer/0.0.1: + resolution: {integrity: sha512-OhVYdbBYeCHE0Jea6L8jzbyKzZyZVjq/Aexd7Tv/kQa4TSiXR9HQ7+SgsD/VRzNNEB2sfO5HCx4Czg1fWgibDw==} + dependencies: + en-inflectors: 1.0.12 + en-lexicon: 1.0.11 + en-stemmer: 1.0.3 + dev: false + + /leven/3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levenshtein-edit-distance/2.0.5: + resolution: {integrity: sha512-Yuraz7QnMX/JENJU1HA6UtdsbhRzoSFnGpVGVryjQgHtl2s/YmVgmNYkVs5yzVZ9aAvQR9wPBUH3lG755ylxGA==} + hasBin: true + dev: true + + /levn/0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: true + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /load-json-file/4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /locate-path/3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /lodash.debounce/4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.flattendeep/4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + + /loupe/2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache/4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: true + + /lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir/1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /make-dir/2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + dependencies: + pify: 4.0.1 + semver: 5.7.1 + dev: true + + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-age-cleaner/0.1.3: + resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} + engines: {node: '>=6'} + dependencies: + p-defer: 1.0.0 + dev: true + + /mem/4.3.0: + resolution: {integrity: sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==} + engines: {node: '>=6'} + dependencies: + map-age-cleaner: 0.1.3 + mimic-fn: 2.1.0 + p-is-promise: 2.1.0 + dev: true + + /merge-source-map/1.1.0: + resolution: {integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==} + dependencies: + source-map: 0.6.1 + dev: true + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /microtime/3.1.1: + resolution: {integrity: sha512-to1r7o24cDsud9IhN6/8wGmMx5R2kT0w2Xwm5okbYI3d1dk6Xv0m+Z+jg2vS9pt+ocgQHTCtgs/YuyJhySzxNg==} + engines: {node: '>= 14.13.0'} + requiresBuild: true + dependencies: + node-addon-api: 5.1.0 + node-gyp-build: 4.6.0 + dev: true + + /mime-db/1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types/2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /mimic-fn/1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + dev: true + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /minimatch/3.0.4: + resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist/0.0.8: + resolution: {integrity: sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==} + dev: true + + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mkdirp/0.5.1: + resolution: {integrity: sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==} + deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) + hasBin: true + dependencies: + minimist: 0.0.8 + dev: true + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mocha/5.2.0: + resolution: {integrity: sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==} + engines: {node: '>= 4.0.0'} + hasBin: true + dependencies: + browser-stdout: 1.3.1 + commander: 2.15.1 + debug: 3.1.0_supports-color@5.4.0 + diff: 3.5.0 + escape-string-regexp: 1.0.5 + glob: 7.1.2 + growl: 1.10.5 + he: 1.1.1 + minimatch: 3.0.4 + mkdirp: 0.5.1 + supports-color: 5.4.0 + dev: true + + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /mute-stream/0.0.7: + resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} + dev: true + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /nice-try/1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /node-addon-api/5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + dev: true + + /node-environment-flags/1.0.6: + resolution: {integrity: sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==} + dependencies: + object.getownpropertydescriptors: 2.1.5 + semver: 5.7.1 + dev: true + + /node-gyp-build/4.6.0: + resolution: {integrity: sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==} + hasBin: true + dev: true + + /node-int64/0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases/2.0.10: + resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + dev: true + + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.1 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path/2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /nspell/2.1.5: + resolution: {integrity: sha512-PSStyugKMiD9mHmqI/CR5xXrSIGejUXPlo88FBRq5Og1kO5QwQ5Ilu8D8O5I/SHpoS+mibpw6uKA8rd3vXd2Sg==} + dependencies: + is-buffer: 2.0.5 + dev: false + + /number-is-nan/1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: true + + /nwsapi/2.2.2: + resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} + dev: true + + /nyc/13.3.0: + resolution: {integrity: sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==} + engines: {node: '>=6'} + hasBin: true + dependencies: + archy: 1.0.0 + arrify: 1.0.1 + caching-transform: 3.0.2 + convert-source-map: 1.9.0 + find-cache-dir: 2.1.0 + find-up: 3.0.0 + foreground-child: 1.5.6 + glob: 7.2.3 + istanbul-lib-coverage: 2.0.5 + istanbul-lib-hook: 2.0.7 + istanbul-lib-instrument: 3.3.0 + istanbul-lib-report: 2.0.8 + istanbul-lib-source-maps: 3.0.6 + istanbul-reports: 2.2.7 + make-dir: 1.3.0 + merge-source-map: 1.1.0 + resolve-from: 4.0.0 + rimraf: 2.6.3 + signal-exit: 3.0.7 + spawn-wrap: 1.4.3 + test-exclude: 5.2.3 + uuid: 3.4.0 + yargs: 12.0.5 + yargs-parser: 11.1.1 + transitivePeerDependencies: + - supports-color + dev: true + bundledDependencies: + - archy + - arrify + - caching-transform + - convert-source-map + - find-cache-dir + - find-up + - foreground-child + - glob + - istanbul-lib-coverage + - istanbul-lib-hook + - istanbul-lib-report + - istanbul-lib-source-maps + - istanbul-reports + - make-dir + - merge-source-map + - resolve-from + - rimraf + - signal-exit + - spawn-wrap + - test-exclude + - uuid + - yargs + - yargs-parser + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-inspect/1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: true + + /object-is/1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + dev: true + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign/4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries/1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /object.fromentries/2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /object.getownpropertydescriptors/2.1.5: + resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==} + engines: {node: '>= 0.8'} + dependencies: + array.prototype.reduce: 1.0.5 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /object.hasown/1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + dependencies: + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /object.values/1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime/2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + dependencies: + mimic-fn: 1.2.0 + dev: true + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /optionator/0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.3 + dev: true + + /os-homedir/1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + dev: true + + /os-locale/3.1.0: + resolution: {integrity: sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==} + engines: {node: '>=6'} + dependencies: + execa: 1.0.0 + lcid: 2.0.0 + mem: 4.3.0 + dev: true + + /os-tmpdir/1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /p-defer/1.0.0: + resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} + engines: {node: '>=4'} + dev: true + + /p-finally/1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /p-is-promise/2.1.0: + resolution: {integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==} + engines: {node: '>=6'} + dev: true + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-locate/3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /package-hash/3.0.0: + resolution: {integrity: sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + hasha: 3.0.0 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + dev: true + + /pako/1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + + /parse-json/4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.18.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-passwd/1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: true + + /parse5/6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + + /path-exists/3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-is-inside/1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + dev: true + + /path-key/2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type/3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /pathval/1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify/3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + /pify/4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pirates/4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir/3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + dev: true + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /platform/1.3.6: + resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} + dev: true + + /pluralize/7.0.0: + resolution: {integrity: sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==} + engines: {node: '>=4'} + dev: true + + /prelude-ls/1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier/2.3.1: + resolution: {integrity: sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-format/27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /progress/2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /prop-types/15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + + /pseudomap/1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: true + + /psl/1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + + /pump/3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /punycode/2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /querystringify/2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + + /react-is/16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react-is/17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /read-chunk/2.1.0: + resolution: {integrity: sha512-QQqB2O9KX/BnztP1xkTRsBxABcWHCXTqQYmEm/DdNId1nw+leKkZvV/g5oCKUrXolGtU3zouoIxMLToAYyDgDw==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + safe-buffer: 5.2.1 + dev: false + + /read-pkg-up/4.0.0: + resolution: {integrity: sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg/3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /readable-stream/2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + optional: true + + /regenerate-unicode-properties/10.1.0: + resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate/1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime/0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + /regenerator-transform/0.15.1: + resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} + dependencies: + '@babel/runtime': 7.21.0 + dev: true + + /regexp.prototype.flags/1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + + /regexpp/1.1.0: + resolution: {integrity: sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==} + engines: {node: '>=4.0.0'} + dev: true + + /regexpu-core/5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.0 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /regjsparser/0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /release-zalgo/1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + dependencies: + es6-error: 4.1.1 + dev: true + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename/1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + dev: true + + /require-main-filename/2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: true + + /require-uncached/1.0.3: + resolution: {integrity: sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w==} + engines: {node: '>=0.10.0'} + dependencies: + caller-path: 0.1.0 + resolve-from: 1.0.1 + dev: true + + /requires-port/1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from/1.0.1: + resolution: {integrity: sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve.exports/1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /resolve/2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor/2.0.0: + resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} + engines: {node: '>=4'} + dependencies: + onetime: 2.0.1 + signal-exit: 3.0.7 + dev: true + + /rimraf/2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /run-async/2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true + + /rx-lite-aggregates/4.0.8: + resolution: {integrity: sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg==} + dependencies: + rx-lite: 4.0.8 + dev: true + + /rx-lite/4.0.8: + resolution: {integrity: sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA==} + dev: true + + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safe-regex-test/1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-regex: 1.1.4 + dev: true + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /saxes/5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-blocking/2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /shallow-clone/3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command/1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + object-inspect: 1.12.3 + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /sisteransi/1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash/2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi/1.0.0: + resolution: {integrity: sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + dev: true + + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map/0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /spawn-wrap/1.4.3: + resolution: {integrity: sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==} + dependencies: + foreground-child: 1.5.6 + mkdirp: 0.5.6 + os-homedir: 1.0.2 + rimraf: 2.6.3 + signal-exit: 3.0.7 + which: 1.3.1 + dev: true + + /spdx-correct/3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions/2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids/3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + + /sprintf-js/1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /stack-utils/2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stop-iteration-iterator/1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.5 + dev: true + + /string-length/4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-to-arraybuffer/1.0.2: + resolution: {integrity: sha512-DaGZidzi93dwjQen5I2osxR9ERS/R7B1PFyufNMnzhj+fmlDQAc1DSDIJVJhgI8Oq221efIMbABUBdPHDRt43Q==} + dependencies: + atob-lite: 2.0.0 + is-base64: 0.1.0 + dev: false + + /string-width/1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: true + + /string-width/2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string.prototype.matchall/4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.0 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.4.3 + side-channel: 1.0.4 + dev: true + + /string.prototype.trim/1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trimend/1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trimstart/1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /strip-ansi/3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi/4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom/4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-eof/1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-json-comments/2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color/2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + + /supports-color/5.4.0: + resolution: {integrity: sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/6.1.0: + resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} + engines: {node: '>=6'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-hyperlinks/2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /symbol-tree/3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /table/4.0.2: + resolution: {integrity: sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==} + dependencies: + ajv: 5.5.2 + ajv-keywords: 2.1.1_ajv@5.5.2 + chalk: 2.4.2 + lodash: 4.17.21 + slice-ansi: 1.0.0 + string-width: 2.1.1 + dev: true + + /terminal-link/2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: true + + /test-exclude/5.2.3: + resolution: {integrity: sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==} + engines: {node: '>=6'} + dependencies: + glob: 7.2.3 + minimatch: 3.1.2 + read-pkg-up: 4.0.0 + require-main-filename: 2.0.0 + dev: true + + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-encoding/0.6.4: + resolution: {integrity: sha512-hJnc6Qg3dWoOMkqP53F0dzRIgtmsAge09kxUIqGrEUS4qr5rWLckGYaQAVr+opBrIMRErGgy6f5aPnyPpyGRfg==} + deprecated: no longer maintained + dev: false + + /text-table/0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /throat/6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + dev: true + + /through/2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /tmp/0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tough-cookie/4.1.2: + resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + + /tr46/2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.3.0 + dev: true + + /tsconfig-paths/3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /type-check/0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: true + + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /typed-array-length/1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.10 + dev: true + + /typedarray-to-buffer/3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typedarray/0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript/3.9.10: + resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /unbox-primitive/1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /unicode-canonical-property-names-ecmascript/2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript/2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript/2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript/2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /universalify/0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /update-browserslist-db/1.0.10_browserslist@4.21.5: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.5 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /url-parse/1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /util/0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.10 + which-typed-array: 1.1.9 + dev: false + + /uuid/3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /v8-to-istanbul/8.1.1: + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + source-map: 0.7.4 + dev: true + + /v8flags/3.2.0: + resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} + engines: {node: '>= 0.10'} + dependencies: + homedir-polyfill: 1.0.3 + dev: true + + /validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /w3c-hr-time/1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer/2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: true + + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /webidl-conversions/5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: true + + /webidl-conversions/6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: true + + /whatwg-encoding/1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-mimetype/2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true + + /whatwg-url/8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: true + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-collection/1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + + /which-module/2.0.0: + resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + dev: true + + /which-typed-array/1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + is-typed-array: 1.1.10 + + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /word-wrap/1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /wrap-ansi/2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + dev: true + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /write-file-atomic/2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /write-file-atomic/3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /write/0.2.1: + resolution: {integrity: sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA==} + engines: {node: '>=0.10.0'} + dependencies: + mkdirp: 0.5.6 + dev: true + + /ws/7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xml-name-validator/3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true + + /xmlchars/2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /y18n/4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist/2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: true + + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser/11.1.1: + resolution: {integrity: sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs/12.0.5: + resolution: {integrity: sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==} + dependencies: + cliui: 4.1.0 + decamelize: 1.2.0 + find-up: 3.0.0 + get-caller-file: 1.0.3 + os-locale: 3.1.0 + require-directory: 2.1.1 + require-main-filename: 1.0.1 + set-blocking: 2.0.0 + string-width: 2.1.1 + which-module: 2.0.0 + y18n: 4.0.3 + yargs-parser: 11.1.1 + dev: true + + /yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + github.com/component/path/7b4f23c38833a5232cd5e3d50ccb8cd13dbcd2f4: + resolution: {tarball: https://codeload.github.com/component/path/tar.gz/7b4f23c38833a5232cd5e3d50ccb8cd13dbcd2f4} + name: path + version: 1.0.0 + dev: false diff --git a/src/bktree.js b/src/bktree.js index 5318dff..2dfd60d 100644 --- a/src/bktree.js +++ b/src/bktree.js @@ -64,13 +64,13 @@ class BKTree { constructor(word_num) { this.tree = new Array(word_num); for (let i = 0; i < this.tree.length; i++) { - this.tree[i] = new BKNode(''); + this.tree[i] = new BKNode(""); } - this.rt = new BKNode(''); + this.rt = new BKNode(""); this.ptr = 0; } _add(idx, curr) { - if (this.rt.word === '') { + if (this.rt.word === "") { this.rt.set_word(curr.word); this.tree[0] = this.rt; return; @@ -100,7 +100,7 @@ class BKTree { return ret; } - if (this.rt.word === '') { + if (this.rt.word === "") { return ret; } const cur_rt = this.tree[idx]; @@ -127,7 +127,7 @@ class BKTree { } add(words) { if (!Array.isArray(words)) { - throw new Error('words is not array'); + throw new Error("words is not array"); } words.forEach((element) => { this._add(0, new BKNode(element)); diff --git a/src/common.js b/src/common.js index 244ecc7..7af1f4e 100644 --- a/src/common.js +++ b/src/common.js @@ -1,15 +1,19 @@ -import BufferList from 'bl'; -import { TextDecoder } from 'text-encoding'; -import { DOMParser } from '@xmldom/xmldom'; -import ripemd128 from './ripemd128'; +import BufferList from "bl"; +import { DOMParser } from "@xmldom/xmldom"; +import ripemd128 from "./ripemd128"; + +// depreciated TextDecoder, use nodejs embbed library +// before use embbed TextDecoder: decodeKeyBlock time costs: 641ms +// after: 245ms +// import { TextDecoder } from "text-encoding"; const REGEXP_STRIPKEY = { - mdx: /[()., '/\\@_-]()/g, - mdd: /([.][^.]*$)|[()., '/\\@_-]/g, // strip '.' before file extension that is keeping the last period + mdx: /[()., '/\\@_\$]()/g, + mdd: /([.][^.]*$)|[()., '/@]/g, // strip '.' before file extension that is keeping the last period }; -const UTF_16LE_DECODER = new TextDecoder('utf-16le'); -const UTF16 = 'UTF-16'; +const UTF_16LE_DECODER = new TextDecoder("utf-16le"); +const UTF16 = "UTF-16"; function newUint8Array(buf, offset, len) { let ret = new Uint8Array(len); @@ -78,11 +82,11 @@ function levenshtein_distance(a, b) { * @param {string} header_text */ function parseHeader(header_text) { - const doc = new DOMParser().parseFromString(header_text, 'text/xml'); + const doc = new DOMParser().parseFromString(header_text, "text/xml"); const header_attr = {}; - let elem = doc.getElementsByTagName('Dictionary')[0]; + let elem = doc.getElementsByTagName("Dictionary")[0]; if (!elem) { - elem = doc.getElementsByTagName('Library_Data')[0]; // eslint_disable_prefer_destructing + elem = doc.getElementsByTagName("Library_Data")[0]; // eslint_disable_prefer_destructing } for (let i = 0, item; i < elem.attributes.length; i++) { item = elem.attributes[i]; @@ -151,10 +155,10 @@ function uint64BEtoNumber(bytes) { return high; } -const NUMFMT_UINT8 = Symbol('NUM_FMT_UINT8'); -const NUMFMT_UINT16 = Symbol('NUM_FMT_UINT16'); -const NUMFMT_UINT32 = Symbol('NUM_FMT_UINT32'); -const NUMFMT_UINT64 = Symbol('NUM_FMT_UINT64'); +const NUMFMT_UINT8 = Symbol("NUM_FMT_UINT8"); +const NUMFMT_UINT16 = Symbol("NUM_FMT_UINT16"); +const NUMFMT_UINT32 = Symbol("NUM_FMT_UINT32"); +const NUMFMT_UINT64 = Symbol("NUM_FMT_UINT64"); /** * read number from buffer * @param {BufferList} bf number buffer @@ -184,7 +188,7 @@ function readNumber(bf, numfmt) { function readNumber2(bf, offset, numfmt) { if (numfmt === NUMFMT_UINT32) { // uint32 - return bf.readUInt32BE(offset) + return bf.readUInt32BE(offset); // return uint32BEtoNumber(value); } else if (numfmt === NUMFMT_UINT64) { // uint64 @@ -193,10 +197,10 @@ function readNumber2(bf, offset, numfmt) { } else if (numfmt === NUMFMT_UINT16) { // uint16 // return uint16BEtoNumber(value); - return bf.readUint16BE(offset) + return bf.readUint16BE(offset); } else if (numfmt === NUMFMT_UINT8) { // uint8 - return bf.readUInt8(offset) + return bf.readUInt8(offset); } return 0; } @@ -248,7 +252,7 @@ function appendBuffer(buffer1, buffer2) { return tmp.buffer; } -function wordCompare(word1, word2) { +function caseUnsensitiveCompare(word1, word2) { if (!word1 || !word2) { throw new Error(`invalid word comparation ${word1} and ${word2}`); } @@ -280,13 +284,13 @@ function wordCompare(word1, word2) { // if this.header.KeyCaseSensitive = YES, // Uppercase character is placed in the start position of the directionary // so if `this.header.KeyCaseSensitive = YES` use normalUpperCaseWordCompare, else use wordCompare -function normalUpperCaseWordCompare(word1, word2) { +function caseSensitiveCompare(word1, word2) { if (word1 === word2) { return 0; } else if (word1 > word2) { - return 1; - } else { return -1; + } else { + return 1; } } @@ -309,7 +313,7 @@ function localCompare(word1, word2) { function isTrue(v) { if (!v) return false; v = v.toLowerCase(); - return v === 'yes' || v === 'true'; + return v === "yes" || v === "true"; } export default { @@ -324,8 +328,8 @@ export default { readNumber2, mdxDecrypt, appendBuffer, - wordCompare, - normalUpperCaseWordCompare, + caseUnsensitiveCompare, + caseSensitiveCompare, localCompare, isTrue, NUMFMT_UINT8, diff --git a/src/lzo-wrapper.js b/src/lzo-wrapper.js index 02ec061..3eede39 100644 --- a/src/lzo-wrapper.js +++ b/src/lzo-wrapper.js @@ -1,4 +1,4 @@ -import lzo1x from './lzo1x'; +import lzo1x from "./lzo1x"; function decompress(buf /* , bufInitSize, bufBlockSize */) { const state = { inputBuffer: new Uint8Array(buf) }; diff --git a/src/mdict-base.js b/src/mdict-base.js index f6de922..3b037fb 100644 --- a/src/mdict-base.js +++ b/src/mdict-base.js @@ -1,29 +1,45 @@ /// -import readChunk from 'read-chunk'; -import assert from 'assert'; -import BufferList from 'bl'; -import pako from 'pako'; -import bufferToArrayBuffer from 'buffer-to-arraybuffer'; -import { TextDecoder } from 'text-encoding'; +import readChunk from "read-chunk"; +import assert from "assert"; +import BufferList from "bl"; +import fs, { write } from "fs"; -import common from './common'; -import lzo1x from './lzo-wrapper'; +// import util from "util"; +// import pako from "pako"; -const UTF_16LE_DECODER = new TextDecoder('utf-16le'); -const UTF16 = 'UTF-16'; +// use nodejs embbed zlib instead of pako, only under nodejs +// use pako = 347ms, use zlib = 290ms +import zlib from "zlib"; +const pako = {}; +pako.inflate = zlib.inflateSync; -const UTF_8_DECODER = new TextDecoder('utf-8'); -const UTF8 = 'UTF-8'; +import bufferToArrayBuffer from "buffer-to-arraybuffer"; -const BIG5_DECODER = new TextDecoder('big5'); -const BIG5 = 'BIG5'; +// depreciated TextDecoder, use nodejs embbed library +// before use embbed TextDecoder: decodeKeyBlock time costs: 641ms +// after: 245ms +// import { TextDecoder } from "text-encoding"; -const GB18030_DECODER = new TextDecoder('gb18030'); -const GB18030 = 'GB18030'; +import common from "./common"; +import lzo1x from "./lzo-wrapper"; + +import measure from "./measure-util"; + +const UTF_16LE_DECODER = new TextDecoder("utf-16le"); +const UTF16 = "UTF-16"; + +const UTF_8_DECODER = new TextDecoder("utf-8"); +const UTF8 = "UTF-8"; + +const BIG5_DECODER = new TextDecoder("big5"); +const BIG5 = "BIG5"; + +const GB18030_DECODER = new TextDecoder("gb18030"); +const GB18030 = "GB18030"; const BASE64ENCODER = function (arrayBuffer) { - return arrayBuffer.toString('base64'); + return arrayBuffer.toString("base64"); }; /** @@ -36,7 +52,7 @@ class MDictBase { * @param {string} fname * @param {string} passcode */ - constructor(fname, passcode) { + constructor(fname, passcode, options) { // the mdict file name this.fname = fname; // the dictionary file decrypt pass code @@ -44,7 +60,16 @@ class MDictBase { // the mdict file read offset this._offset = 0; // the dictionary file extension - this.ext = common.getExtension(fname, 'mdx'); + this.ext = common.getExtension(fname, "mdx"); + + // set options + this.options = options ?? { + passcode: passcode, + debug: false, + resort: true, + isStripKey: true, + isCaseSensitive: false, + }; // ------------------------- // dict header section @@ -84,18 +109,59 @@ class MDictBase { // -------------------------- this._keyBlockStartOffset = 0; this._keyBlockEndOffset = 0; - this.keyList = []; - // decodeKeyBlock method is very slow, avoid invoke dirctly - // this method will return the whole words list of the dictionaries file, this is very slow - // operation, and you should do this background, or concurrently. - // NOTE: this method is wrapped by method medict.RangeWords(); - // this._decodeKeyBlock(); // ------------------------- // dict record header section // -------------------------- this._recordHeaderStartOffset = 0; this._recordHeaderEndOffset = 0; + + this.keyList = []; + + // depreciated part + // decodeKeyBlock method is very slow, avoid invoke dirctly + // this method will return the whole words list of the dictionaries file, this is very slow + // operation, and you should do this background, or concurrently. + // NOTE: this method is wrapped by method medict.RangeWords(); + // this._decodeKeyBlock(); + + if (this.ext === "mdx" && this.options.resort) { + if (this.options.debug) { + console.time("KEY_LIST_RESORTE"); + console.log("file: ", this.fname); + const memTrace = measure.measureMemFn(); + memTrace("before resort decode"); + // NOTE: this method may takes 200ms + // NOTE: this method is wrapped by method medict.RangeWords(); + measure.measureTimeFn(this, this._decodeKeyBlock)(); + // measure.measureTimeFn(this, this._resortKeyBlock)(); + measure.measureTimeFn(this, this._resortKeyList)(); + memTrace("after resort decode"); + console.log("key entris (number): ", this.keyHeader.entriesNum); + console.timeEnd("KEY_LIST_RESORTE"); + } else { + this._decodeKeyBlock(); + // this._resortKeyBlock(); + this._resortKeyList(); + } + } else { + if (this.options.debug) { + console.time("KEY_LIST_RESORTE"); + console.log("file: ", this.fname); + const memTrace = measure.measureMemFn(); + memTrace("before resort decode"); + memTrace("after resort decode"); + console.log("key entris (number): ", this.keyHeader.entriesNum); + console.timeEnd("KEY_LIST_RESORTE"); + } + } + + if (this.ext == "mdd" && this.options.resort) { + this._decodeKeyBlock(); + // this._resortKeyBlock(); + this._resortKeyList(); + } + this.recordHeader = { recordBlocksNum: 0, entriesNum: 0, @@ -170,9 +236,9 @@ class MDictBase { this.header = common.parseHeader(headerText); // set header default configuration - this.header.KeyCaseSensitive = this.header.KeyCaseSensitive || 'No'; + this.header.KeyCaseSensitive = this.header.KeyCaseSensitive || "No"; - this.header.StripKey = this.header.StripKey || 'Yes'; + this.header.StripKey = this.header.StripKey || "Yes"; // encrypted flag // 0x00 - no encryption @@ -180,11 +246,11 @@ class MDictBase { // 0x02 - encrypt key info block if ( !this.header.Encrypted || - this.header.Encrypted == '' || - this.header.Encrypted == 'No' + this.header.Encrypted == "" || + this.header.Encrypted == "No" ) { this._encrypt = 0; - } else if (this.header.Encrypted == 'Yes') { + } else if (this.header.Encrypted == "Yes") { this._encrypt = 1; } else { this._encrypt = parseInt(this.header.Encrypted, 10); @@ -212,22 +278,22 @@ class MDictBase { this._numWidth = 4; this._numFmt = common.NUMFMT_UINT32; } - if (!this.header.Encoding || this.header.Encoding == '') { + if (!this.header.Encoding || this.header.Encoding == "") { this._encoding = UTF8; this._decoder = UTF_8_DECODER; } else if ( - this.header.Encoding == 'GBK' || - this.header.Encoding == 'GB2312' + this.header.Encoding == "GBK" || + this.header.Encoding == "GB2312" ) { this._encoding = GB18030; this._decoder = GB18030_DECODER; - } else if (this.header.Encoding.toLowerCase() == 'big5') { + } else if (this.header.Encoding.toLowerCase() == "big5") { this._encoding = BIG5; this._decoder = BIG5_DECODER; } else { this._encoding = - this.header.Encoding.toLowerCase() == 'utf16' || - this.header.Encoding.toLowerCase() == 'utf-16' + this.header.Encoding.toLowerCase() == "utf16" || + this.header.Encoding.toLowerCase() == "utf-16" ? UTF16 : UTF8; if (this._encoding == UTF16) { @@ -237,7 +303,7 @@ class MDictBase { } } // determine the encoding and decoder, if extension is *.mdd - if (this.ext === 'mdd') { + if (this.ext === "mdd") { this._encoding = UTF16; this._decoder = UTF_16LE_DECODER; } @@ -270,16 +336,16 @@ class MDictBase { // decrypt if (this._encrypt & 1) { - if (!this._passcode || this._passcode == '') { + if (!this._passcode || this._passcode == "") { // TODO: encrypted file not support yet - throw Error(' user identification is needed to read encrypted file'); + throw Error(" user identification is needed to read encrypted file"); } // regcode, userid = header_info['_passcode'] - if (this.header.RegisterBy == 'Email') { + if (this.header.RegisterBy == "Email") { // encrypted_key = _decrypt_regcode_by_email(regcode, userid); - throw Error('encrypted file not support yet'); + throw Error("encrypted file not support yet"); } else { - throw Error('encrypted file not support yet'); + throw Error("encrypted file not support yet"); } } @@ -350,7 +416,9 @@ class MDictBase { this._keyHeaderEndOffset = this._keyHeaderStartOffset + bytesNum + - (this._version >= 2.0 ? 4 : 0); /* 4 bytes adler32 checksum length, only for version >= 2.0 */ + (this._version >= 2.0 + ? 4 + : 0); /* 4 bytes adler32 checksum length, only for version >= 2.0 */ } /** @@ -369,9 +437,11 @@ class MDictBase { this._keyBlockInfoStartOffset + this.keyHeader.keyBlockInfoCompSize; assert( this.keyHeader.keyBlocksNum === keyBlockInfoList.length, - 'the num_key_info_list should equals to key_block_info_list' + "the num_key_info_list should equals to key_block_info_list" ); + this.keyBlockInfoList = keyBlockInfoList; + // NOTE: must set at here, otherwise, if we haven't invoke the _decodeKeyBlockInfo method, // var `_recordBlockStartOffset` will not be setted. this._recordBlockStartOffset = @@ -390,8 +460,8 @@ class MDictBase { if (this._version >= 2.0) { // zlib compression assert( - keyBlockInfoBuff.slice(0, 4).toString('hex') === '02000000', - 'the compress type zlib should start with 0x02000000' + keyBlockInfoBuff.slice(0, 4).toString("hex") === "02000000", + "the compress type zlib should start with 0x02000000" ); let kbInfoCompBuff; if (this._encrypt === 2) { @@ -402,6 +472,7 @@ class MDictBase { // For version 2.0, will compress by zlib, lzo just just for 1.0 // key_block_info_compressed[0:8] => compress_type kbInfoBuff = pako.inflate(kbInfoCompBuff.slice(8, kbInfoCompBuff.length)); + // TODO: check the alder32 checksum // adler32 = unpack('>I', key_block_info_compressed[4:8])[0] // assert(adler32 == zlib.adler32(key_block_info) & 0xffffffff) @@ -409,7 +480,7 @@ class MDictBase { // this.keyHeader.keyBlockInfoDecompSize only exist when version >= 2.0 assert( this.keyHeader.keyBlockInfoDecompSize == kbInfoBuff.length, - 'key_block_info length should equal' + `key_block_info decompress size ${this.keyHeader.keyBlockInfoDecompSize} should equal to keyblock info buffer length ${kbInfoBuff.length}` ); } else { kbInfoBuff = keyBlockInfoBuff; @@ -456,7 +527,7 @@ class MDictBase { let stepGap = 0; // term_size is for first key and last key // let term_size = 0; - if (this._encoding === UTF16 || this.ext === 'mdd') { + if (this._encoding === UTF16 || this.ext === "mdd") { stepGap = (firstKeySize + textTerm) * 2; termSize = textTerm * 2; } else { @@ -475,7 +546,7 @@ class MDictBase { byteFmt ); i += byteWidth; - if (this._encoding === UTF16 || this.ext === 'mdd') { + if (this._encoding === UTF16 || this.ext === "mdd") { stepGap = (lastKeySize + textTerm) * 2; // TODO: this is for last key output termSize = textTerm * 2; @@ -568,8 +639,7 @@ class MDictBase { while (left <= right) { mid = left + ((right - left) >> 1); if ( - compareFn(_s(phrase), _s(this.keyBlockInfoList[mid].firstKey)) >= - 0 && + compareFn(_s(phrase), _s(this.keyBlockInfoList[mid].firstKey)) >= 0 && compareFn(_s(phrase), _s(this.keyBlockInfoList[mid].lastKey)) <= 0 ) { return mid; @@ -592,7 +662,7 @@ class MDictBase { * decode key block return the total keys list, * Note: this method runs very slow, please do not use this unless special target */ - _decodeKeyBlock(keep) { + _decodeKeyBlock() { this._keyBlockStartOffset = this._keyBlockInfoEndOffset; const kbCompBuff = this._readBuffer( this._keyBlockStartOffset, @@ -608,7 +678,7 @@ class MDictBase { const start = kbStartOfset; assert( start === this.keyBlockInfoList[idx].keyBlockCompAccumulator, - 'should be equal' + "should be equal" ); const end = kbStartOfset + compSize; @@ -619,9 +689,9 @@ class MDictBase { // adler32 = unpack('>I', key_block_compressed[start + 4:start + 8])[0] let key_block; - if (kbCompType.toString('hex') == '00000000') { + if (kbCompType.toString("hex") == "00000000") { key_block = kbCompBuff.slice(start + 8, end); - } else if (kbCompType.toString('hex') == '01000000') { + } else if (kbCompType.toString("hex") == "01000000") { // # decompress key block const header = new ArrayBuffer([0xf0, decompressed_size]); const keyBlock = lzo1x.decompress( @@ -633,7 +703,7 @@ class MDictBase { keyBlock.byteOffset, keyBlock.byteOffset + keyBlock.byteLength ); - } else if (kbCompType.toString('hex') === '02000000') { + } else if (kbCompType.toString("hex") === "02000000") { // decompress key block key_block = pako.inflate(kbCompBuff.slice(start + 8, end)); // extract one single key block into a key list @@ -642,26 +712,19 @@ class MDictBase { // assert(adler32 == zlib.adler32(key_block) & 0xffffffff) } else { throw Error( - `cannot determine the compress type: ${kbCompType.toString('hex')}` + `cannot determine the compress type: ${kbCompType.toString("hex")}` ); } - const splitedKey = this._splitKeyBlock( - new BufferList(key_block), - this._numFmt, - this._numWidth, - this._encoding - ); + const splitedKey = this._splitKeyBlock(new BufferList(key_block), idx); key_list = key_list.concat(splitedKey); kbStartOfset += compSize; } assert(key_list.length === this.keyHeader.entriesNum); this._keyBlockEndOffset = this._keyBlockStartOffset + this.keyHeader.keyBlocksTotalSize; - if (keep) { - this.keyList = key_list; - } else { - return key_list; - } + + // keep keylist in memory + this.keyList = key_list; } /** @@ -684,9 +747,9 @@ class MDictBase { // adler32 = unpack('>I', key_block_compressed[start + 4:start + 8])[0] let key_block; - if (kbCompType.toString('hex') == '00000000') { + if (kbCompType.toString("hex") == "00000000") { key_block = kbCompBuff.slice(start + 8, end); - } else if (kbCompType.toString('hex') == '01000000') { + } else if (kbCompType.toString("hex") == "01000000") { // # decompress key block const header = new ArrayBuffer([0xf0, decompSize]); const keyBlock = lzo1x.decompress( @@ -698,7 +761,7 @@ class MDictBase { keyBlock.byteOffset, keyBlock.byteOffset + keyBlock.byteLength ); - } else if (kbCompType.toString('hex') === '02000000') { + } else if (kbCompType.toString("hex") === "02000000") { // decompress key block key_block = pako.inflate(kbCompBuff.slice(start + 8, end)); // extract one single key block into a key list @@ -707,15 +770,10 @@ class MDictBase { // assert(adler32 == zlib.adler32(key_block) & 0xffffffff) } else { throw Error( - `cannot determine the compress type: ${kbCompType.toString('hex')}` + `cannot determine the compress type: ${kbCompType.toString("hex")}` ); } - const splitedKey = this._splitKeyBlock( - new BufferList(key_block), - this._numFmt, - this._numWidth, - this._encoding - ); + const splitedKey = this._splitKeyBlock(new BufferList(key_block), kbid); return splitedKey; } @@ -724,14 +782,14 @@ class MDictBase { * split key from key block buffer * @param {Buffer} keyBlock key block buffer */ - _splitKeyBlock(keyBlock) { + _splitKeyBlock(keyBlock, keyBlockIdx) { let delimiter; let width; - if (this._encoding == 'UTF-16' || this.ext == 'mdd') { - delimiter = '0000'; + if (this._encoding == "UTF-16" || this.ext == "mdd") { + delimiter = "0000"; width = 2; } else { - delimiter = '00'; + delimiter = "00"; width = 1; } const keyList = []; @@ -754,15 +812,17 @@ class MDictBase { // # key text ends with '\x00' let i = keyStartIndex + this._numWidth; while (i < keyBlock.length) { - // delimiter = '0' - if ((width === 1 && keyBlock.get(i) == 0) - // delimiter = '00' - || (width === 2 && keyBlock.get(i) == 0 && keyBlock.get(i+1) == 0)){ + // delimiter = '0' + if ( + (width === 1 && keyBlock.get(i) == 0) || + // delimiter = '00' + (width === 2 && keyBlock.get(i) == 0 && keyBlock.get(i + 1) == 0) + ) { //// the method below was very slow, depreate - // if ( - // new BufferList(keyBlock.slice(i, i + width)).toString('hex') == - // delimiter - // ) { + // if ( + // new BufferList(keyBlock.slice(i, i + width)).toString('hex') == + // delimiter + // ) { keyEndIndex = i; break; } @@ -772,7 +832,7 @@ class MDictBase { keyBlock.slice(keyStartIndex + this._numWidth, keyEndIndex) ); keyStartIndex = keyEndIndex + width; - keyList.push({ recordStartOffset, keyText }); + keyList.push({ recordStartOffset, keyText, keyBlockIdx }); } return keyList; } @@ -899,7 +959,7 @@ class MDictBase { let recordOffset = this._recordBlockStartOffset; for (let idx = 0; idx < this.recordBlockInfoList.length; idx++) { - let comp_type = 'none'; + let comp_type = "none"; const compSize = this.recordBlockInfoList[idx].compSize; const decompSize = this.recordBlockInfoList[idx].decompSize; const rbCompBuff = this._readBuffer(recordOffset, compSize); @@ -915,7 +975,7 @@ class MDictBase { // Note: here ignore the checksum part // bytes: adler32 checksum of decompressed record block // adler32 = unpack('>I', record_block_compressed[4:8])[0] - if (rbCompType.toString('hex') === '00000000') { + if (rbCompType.toString("hex") === "00000000") { recordBlock = rbCompBuff.slice(8, rbCompBuff.length); } else { // -------------- @@ -937,8 +997,8 @@ class MDictBase { // -------------- // decompress // -------------- - if (rbCompType.toString('hex') === '01000000') { - comp_type = 'lzo'; + if (rbCompType.toString("hex") === "01000000") { + comp_type = "lzo"; // the header was need by lzo library, should append before real compressed data const header = new ArrayBuffer([0xf0, decompSize]); // Note: if use lzo, here will LZO_E_OUTPUT_RUNOVER, so ,use mini lzo js @@ -951,8 +1011,8 @@ class MDictBase { recordBlock.byteOffset, recordBlock.byteOffset + recordBlock.byteLength ); - } else if (rbCompType.toString('hex') === '02000000') { - comp_type = 'zlib'; + } else if (rbCompType.toString("hex") === "02000000") { + comp_type = "zlib"; // zlib decompress recordBlock = pako.inflate(blockBufDecrypted); } @@ -1066,7 +1126,7 @@ class MDictBase { // Note: here ignore the checksum part // bytes: adler32 checksum of decompressed record block // adler32 = unpack('>I', record_block_compressed[4:8])[0] - if (rbCompType.toString('hex') === '00000000') { + if (rbCompType.toString("hex") === "00000000") { recordBlock = rbCompBuff.slice(8, rbCompBuff.length); } else { // -------------- @@ -1087,7 +1147,7 @@ class MDictBase { // -------------- // decompress // -------------- - if (rbCompType.toString('hex') === '01000000') { + if (rbCompType.toString("hex") === "01000000") { // the header was need by lzo library, should append before real compressed data const header = new ArrayBuffer([0xf0, decompSize]); // Note: if use lzo, here will LZO_E_OUTPUT_RUNOVER, so ,use mini lzo js @@ -1100,7 +1160,7 @@ class MDictBase { recordBlock.byteOffset, recordBlock.byteOffset + recordBlock.byteLength ); - } else if (rbCompType.toString('hex') === '02000000') { + } else if (rbCompType.toString("hex") === "02000000") { // zlib decompress recordBlock = pako.inflate(blockBufDecrypted); } @@ -1115,7 +1175,7 @@ class MDictBase { const recordStart = start - decompAccumulator; const recordEnd = nextStart - decompAccumulator; const data = recordBlock.slice(recordStart, recordEnd); - if (this.ext === 'mdd') { + if (this.ext === "mdd") { return { keyText, definition: BASE64ENCODER(data) }; } return { keyText, definition: this._decoder.decode(data) }; @@ -1124,6 +1184,66 @@ class MDictBase { _readBuffer(start, length) { return readChunk.sync(this.fname, start, length); } + + // store key to wordBuffer + _resortKeyList() { + // 排序之前记录下,每个单词的结束位置,因为排序之后顺序就乱了,buffer 里就不能再根据下一个单词判断了 + this.keyList.map((v, i) => { + v.original_idx = i; + if (i > 0) { + this.keyList[i - 1].nextRecordStartOffset = v.recordStartOffset; + } + }); + + this.keyListRemap = {}; + + if (this._isKeyCaseSensitive()) { + this.keyList.sort(common.caseUnsensitiveCompare); + } else { + this.keyList.sort(common.caseSensitiveCompare); + } + + // build index remap + this.keyList.map((v, i) => { + this.keyListRemap[v.original_idx] = i; + }); + } + + _stripKeyOrIngoreCase() { + return function (key) { + // this strip/case sensistive part will increase time cost about 100% (20ms->38ms) + if (this._isStripKey()) { + key = key.replace(common.REGEXP_STRIPKEY[this.ext], "$1"); + } + if (!this._isKeyCaseSensitive()) { + key = key.toLowerCase(); + } + if (this.ext == "mdd") { + key = key.replace(/\\/g, "/"); + } + return key.trim(); + }.bind(this); + } + + _isKeyCaseSensitive() { + return ( + this.options.isCaseSensitive || common.isTrue(this.header.isCaseSensitive) + ); + } + + _isStripKey() { + return this.options.isStripKey || common.isTrue(this.header.StripKey); + } + + /** + * 经过一系列测试, 发现mdx格式的文件存在较大的词语排序问题,存在如下情况: + * 1. 大小写的问题 比如 a-zA-Z 和 aA-zZ 这种并存的情况 + * 2. 多语言的情况,存在英文和汉字比较大小的情况一般情况下 英文应当排在汉字前面 + * 3. 小语种的情况 + * 上述的这些情况都有可能出现,无法通过字典头中的设置实现排序,所以无法通过内部的keyInfoList进行快速索引, + * 在现代计算机的性能条件下,直接遍历全部词条也可得到较好的效果,因此目前采用的策略是全部读取词条,内部排序 + * + */ } export default MDictBase; diff --git a/src/mdict.js b/src/mdict.js index 957b452..67e8213 100644 --- a/src/mdict.js +++ b/src/mdict.js @@ -1,81 +1,163 @@ /// -import { lemmatizer } from 'lemmatizer'; -import dictionary from 'dictionary-en-us'; -import nspell from 'nspell'; -import dart from 'doublearray'; +import { lemmatizer } from "lemmatizer"; +import dictionary from "dictionary-en-us"; +import nspell from "nspell"; +import dart from "doublearray"; -import MdictBase from './mdict-base'; -import common from './common'; +import MdictBase from "./mdict-base"; +import common from "./common"; class Mdict extends MdictBase { - constructor(fname, searchOptions = {}) { - const passcode = searchOptions.passcode || undefined; - super(fname, passcode); - this.searchOptions = {}; - searchOptions = searchOptions || {}; - this.searchOptions.passcode = searchOptions.passcode || undefined; - this.searchOptions.keyCaseSensitive = searchOptions.keyCaseSensitive; - this.searchOptions.stripKey = searchOptions.stripKey; + constructor(fname, options) { + options = options || {}; + options = { + passcode: options.passcode ?? "", + debug: options.debug ?? false, + resort: options.resort ?? true, + isStripKey: options.isStripKey ?? true, + isCaseSensitive: options.isCaseSensitive ?? true, + }; + + const passcode = options.passcode || undefined; + super(fname, passcode, options); + this.options = options; } - _stripKey() { - const stripKey = - this.searchOptions.stripKey || common.isTrue(this.header.StripKey); - const regexp = common.REGEXP_STRIPKEY[this.ext]; + _binarySearchByResort(word) { + const _strip = this._stripKeyOrIngoreCase(); - return stripKey - ? function _s(key) { - return key.replace(regexp, '$1'); - } - : function _s(key) { - return key; - }; + // binary search from keyList + let start = 0; + let mid = 0; + let end = this.keyList.length; + // target word + word = _strip(word); + + let keyRecord; + while (start <= end) { + mid = start + ((end - start) >> 1); + let keyText = _strip(this.keyList[mid].keyText); + + if (keyText > word) { + end = mid - 1; + } else if (keyText < word) { + start = mid + 1; + } else { + keyRecord = this.keyList[mid]; + break; + } + } + + return keyRecord; } - lookup(word) { - const record = this._lookupKID(word); + _prefixBinarySearchByResort(word) { + const _strip = this._stripKeyOrIngoreCase(); + let end = this.keyList.length; + word = _strip(word); + for (let i = 0; i < end; i++) { + let keyText = _strip(this.keyList[i].keyText); + if (keyText.startsWith(word)) { + return i; + } + } + return -1; + } + _binarySearchByResort2(word) { + const _strip = this._stripKeyOrIngoreCase(); + word = _strip(word); + for (let i = 0; i < this.keyList.length; i++) { + let keyText = _strip(this.keyList[i].keyText); + if (word == keyText) { + return this.keyList[i]; + } + } + return undefined; + } + + _lookupByResort(word) { + const keyRecord = this._binarySearchByResort2(word); // if not found the key block, return undefined - if (record === undefined) { + if (keyRecord === undefined) { return { keyText: word, definition: null, }; } - const i = record.idx; - const list = record.list; - - const rid = this._reduceRecordBlock(list[i].recordStartOffset); + const i = keyRecord.original_idx; + const rid = this._reduceRecordBlock(keyRecord.recordStartOffset); const nextStart = - i + 1 >= list.length + i + 1 >= this.keyList.length ? this._recordBlockStartOffset + this.recordBlockInfoList[this.recordBlockInfoList.length - 1] .decompAccumulator + this.recordBlockInfoList[this.recordBlockInfoList.length - 1] .decompSize - : list[i + 1].recordStartOffset; + : this.keyList[this.keyListRemap[i + 1]].recordStartOffset; const data = this._decodeRecordBlockByRBID( rid, - list[i].keyText, - list[i].recordStartOffset, + keyRecord.keyText, + keyRecord.recordStartOffset, nextStart ); return data; } - _isKeyCaseSensitive() { - return ( - this.searchOptions.keyCaseSensitive || - common.isTrue(this.header.KeyCaseSensitive) - ); - } + /** + * + * @param {string} word the target word + * @returns definition + */ + lookup(word) { + if (this.ext == "mdx" && this.options.resort) { + return this._lookupByResort(word); + } else { + throw new Error( + "depreciated, use `locate` method to find out mdd resource" + ); + } + } + /** + * locate mdd resource binary data + * @param {string} resourceKey resource key + * @returns resource binary data + */ + locate(resourceKey) { + const keyRecord = this._binarySearchByResort2(resourceKey); + // if not found the key block, return undefined + if (keyRecord === undefined) { + return { + keyText: word, + definition: null, + }; + } + + const i = keyRecord.original_idx; + const rid = this._reduceRecordBlock(keyRecord.recordStartOffset); + const nextStart = + i + 1 >= this.keyList.length + ? this._recordBlockStartOffset + + this.recordBlockInfoList[this.recordBlockInfoList.length - 1] + .decompAccumulator + + this.recordBlockInfoList[this.recordBlockInfoList.length - 1] + .decompSize + : this.keyList[this.keyListRemap[i + 1]].recordStartOffset; + const data = this._decodeRecordBlockByRBID( + rid, + keyRecord.keyText, + keyRecord.recordStartOffset, + nextStart + ); + return data; + } _lookupRecordBlockWordList(word) { - const lookupInternal = (compareFn) => { - const sfunc = this._stripKey(); + const lookupInternal = (compareFn) => { + const sfunc = this._stripKeyOrIngoreCase(); const kbid = this._reduceWordKeyBlock(word, sfunc, compareFn); // not found if (kbid < 0) { @@ -91,50 +173,45 @@ class Mdict extends MdictBase { let list; if (this._isKeyCaseSensitive()) { - list = lookupInternal(common.normalUpperCaseWordCompare); + list = lookupInternal(common.caseSensitiveCompare); } else { - list = lookupInternal(common.normalUpperCaseWordCompare); + list = lookupInternal(common.caseSensitiveCompare); if (list === undefined) { - list = lookupInternal(common.wordCompare); + list = lookupInternal(common.caseUnSensitiveCompare); } } return list; } + _locateResource(key) { + const sfunc = this._stripKeyOrIngoreCase(); - - _lookupKID(word) { - const lookupInternal = (compareFn) => { - const sfunc = this._stripKey(); - const kbid = this._reduceWordKeyBlock(word, sfunc, compareFn); - // not found - if (kbid < 0) { - return undefined; - } - const list = this._decodeKeyBlockByKBID(kbid); - const i = this._binarySearh(list, word, sfunc, compareFn); - if (i === undefined) { - return undefined; - } - return { idx: i, list }; - }; - - let record; + let compareFn; if (this._isKeyCaseSensitive()) { - record = lookupInternal(common.normalUpperCaseWordCompare); + compareFn = common.caseSensitiveCompare; } else { - record = lookupInternal(common.normalUpperCaseWordCompare); - if (record === undefined) { - record = lookupInternal(common.wordCompare); - } + compareFn = common.caseUnsensitiveCompare; } - return record; + + const kbid = this._reduceWordKeyBlock(key, sfunc, compareFn); + // not found + if (kbid < 0) { + return undefined; + } + + const list = this._decodeKeyBlockByKBID(kbid); + + const i = this._binarySearh(list, key, sfunc, compareFn); + if (i === undefined) { + return undefined; + } + + return { idx: i, list }; } _binarySearh(list, word, _s, compareFn) { if (!_s || _s == undefined) { - // eslint-disable-next-line - _s = this._stripKey(); + _s = this._stripKeyOrIngoreCase(); } let left = 0; let right = list.length - 1; @@ -161,7 +238,7 @@ class Mdict extends MdictBase { _findList(word) { const findListInternal = (compareFn) => { - const sfunc = this._stripKey(); + const sfunc = this._stripKeyOrIngoreCase(); const kbid = this._reduceWordKeyBlock(word, sfunc, compareFn); // not found if (kbid < 0) { @@ -172,22 +249,50 @@ class Mdict extends MdictBase { let list; if (this._isKeyCaseSensitive()) { - list = findListInternal(common.normalUpperCaseWordCompare); + list = findListInternal(common.caseSensitiveCompare); } else { - list = findListInternal(common.normalUpperCaseWordCompare); + list = findListInternal(common.caseSensitiveCompare); if (list === undefined) { - list = findListInternal(common.wordCompare); + list = findListInternal(common.caseUnsensitiveCompare); } } return list; } + _locate_prefix_list(phrase, max_len = 100, max_missed = 100) { + const record = this._prefixBinarySearchByResort(phrase); + if (record == -1) { + return []; + } + const fn = this._stripKeyOrIngoreCase(); + + let list = []; + let count = 0; + let missed = 0; + for (let i = record; i < this.keyList.length; i++) { + if (this.keyList[i].keyText.startsWith(fn(phrase))) { + list.push(this.keyList[i]); + count++; + } else { + missed++; + } + if (count > max_len) { + break; + } + if (missed > max_missed) { + break; + } + } + + return list; + } + /** * get word prefix words * @param {string} phrase the word which needs to find prefix */ prefix(phrase) { - const list = this._findList(phrase).list; + const list = this._locate_prefix_list(phrase); if (!list) { return []; } @@ -207,35 +312,7 @@ class Mdict extends MdictBase { * @param {string} phrase the word which needs to be associated */ associate(phrase) { - const record = this._findList(phrase); - if (!record) { - return []; - } - const sfunc = record.sfunc; - let kbid = record.kbid; - let list = record.list; - let matched = list.filter((item) => - sfunc(item.keyText).startsWith(sfunc(phrase)) - ); - if (!matched.length) { - matched = this.associate0(phrase); - } - // still nothing - if (!matched.length) { - return matched; - } - - // in case there are matched items in next key block - while ( - matched[matched.length - 1].keyText === list[list.length - 1].keyText && - kbid < this.keyBlockInfoList.length - ) { - kbid++; - list = this._decodeKeyBlockByKBID(kbid); - matched.concat( - list.filter((item) => sfunc(item.keyText).startsWith(sfunc(phrase))) - ); - } + const matched = this._locate_prefix_list(phrase, 100); // to meet the typings matched.map((item) => { item.rofset = item.recordStartOffset; @@ -243,13 +320,6 @@ class Mdict extends MdictBase { return matched; } - associate0(phrase) { - // if matched nothing, research in the record block - const recordList = this._lookupRecordBlockWordList(phrase); - return recordList || []; - } - - /** * fuzzy_search * find latest `fuzzy_size` words, and filter by lavenshtein_distance @@ -275,31 +345,27 @@ class Mdict extends MdictBase { */ fuzzy_search(word, fuzzy_size, ed_gap) { - let fwords = []; const fuzzy_words = []; - fwords = fwords.concat( - this.prefix(word).map((kv) => ({ - key: kv.key, - idx: kv.rofset, - ed: common.levenshtein_distance(word, kv.k), - })) - ); - fuzzy_size = - fuzzy_size - fwords.length < 0 ? 0 : fuzzy_size - fwords.length; - fwords.map((fw) => { - const { idx, list } = this._lookupKID(fw.key); - return this._find_nabor(idx, Math.ceil(fuzzy_size / fwords.length), list) - .filter( - (item) => common.levenshtein_distance(item.keyText, word) <= ed_gap - ) - .map((kitem) => - fuzzy_words.push({ - key: kitem.keyText, - rofset: kitem.recordStartOffset, - ed: common.levenshtein_distance(word, kitem.keyText), - }) - ); - }); + let count = 0; + const fn = this._stripKeyOrIngoreCase(); + for (let i = 0; i < this.keyList.length; i++) { + let item = this.keyList[i]; + let key = fn(item.keyText); + let ed = common.levenshtein_distance(key, fn(word)); + if (ed <= ed_gap) { + count++; + if (count > fuzzy_size) { + break; + } + fuzzy_words.push({ + ...item, + key: item.keyText, + idx: item.recordStartOffset, + ed: ed, + }); + } + } + return fuzzy_words; } @@ -349,7 +415,7 @@ class Mdict extends MdictBase { */ parse_defination(word, rstartofset) { const rid = this._reduceRecordBlock(rstartofset); - const { idx, list } = this._lookupKID(word); + const { idx, list } = this._locateResource(word); const nextStart = idx + 1 >= list.length ? this._recordBlockStartOffset + @@ -358,7 +424,7 @@ class Mdict extends MdictBase { this.recordBlockInfoList[this.recordBlockInfoList.length - 1] .decompSize : list[idx + 1].recordStartOffset; - let startoffset = list[idx].recordStartOffset + let startoffset = list[idx].recordStartOffset; if (rstartofset != startoffset) { // if args.rstartofset != list[idx].recordStartOffset // use args.rstartofset @@ -373,10 +439,20 @@ class Mdict extends MdictBase { return data; } - rangeKeyWords() { - return this._decodeKeyBlock(); + parse_def_record(keyRecord) { + const rid = this._reduceRecordBlock(keyRecord.recordStartOffset); + const data = this._decodeRecordBlockByRBID( + rid, + keyRecord.keyText, + keyRecord.recordStartOffset, + keyRecord.nextRecordStartOffset + ); + return data; } + rangeKeyWords() { + return this._decodeKeyBlock(); + } } export default Mdict; diff --git a/src/measure-util.js b/src/measure-util.js new file mode 100644 index 0000000..1834db8 --- /dev/null +++ b/src/measure-util.js @@ -0,0 +1,59 @@ +/** + * measuer the function call time cost + * @param {any} _this the target function bind object + * @param {function} fn the callee function + * @param {string} name function name (optional) + * @returns + */ +function measureTimeFn(_this, fn, name = "unknown") { + let fname = fn.toString(); + fname = fname.substring("function ".length); + fname = fname.substring(0, fname.indexOf("(")); + + return function () { + console.time(fname ?? name); + let res = fn.bind(_this)(...arguments); + console.timeEnd(fname ?? name); + return res; + }; +} + +/** + * measue memory userage + * @returns print the memeory useage step by step + */ +function measureMemFn() { + // closure variables + const memoryStack = []; + let step = -1; + + return function (name) { + const used = process.memoryUsage(); + const memDatas = []; + step++; + + memoryStack.push(used); + for (let key in used) { + let key_used = Math.round((used[key] / 1024 / 1024) * 100) / 100; + let last_key_used = 0; + if (step > 0) { + last_key_used = + Math.round((memoryStack[step - 1][key] / 1024 / 1024) * 100) / 100; + } + memDatas.push({ + step: step, + category: name, + key: key, + "used(MB)": key_used, + "diff(MB)": Math.round((key_used - last_key_used) * 100) / 100, + }); + } + + console.table(memDatas); + }; +} + +export default { + measureTimeFn, + measureMemFn, +}; diff --git a/src/ripemd128.js b/src/ripemd128.js index 3eca396..71a5d43 100644 --- a/src/ripemd128.js +++ b/src/ripemd128.js @@ -20,10 +20,10 @@ function asUint32Array(arr) { // concat 2 typed array function concat(a, b) { - if (!a && !b) - throw new Error('Please specify valid arguments for parameters a and b.'); + if (!a && !b) throw new Error("invalid Buffer a and b"); if (!b || b.length === 0) return a; if (!a || a.length === 0) return b; + const c = new a.constructor(a.length + b.length); c.set(a); c.set(b, a.length); @@ -83,7 +83,7 @@ const F = [ }, ]; -exports.ripemd128 = function ripemd128(data) { +exports.ripemd128 = function ripemd128(dataBuffer) { let aa; let bb; let cc; @@ -100,17 +100,16 @@ exports.ripemd128 = function ripemd128(data) { let tmp; let x; const hash = new Uint32Array([ - 0x67452301, - 0xefcdab89, - 0x98badcfe, - 0x10325476, + 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, ]); - let bytes = data.length; + + let bytes = dataBuffer.length; + const dataUint8Array = new Uint8Array(dataBuffer); const padding = new Uint8Array((bytes % 64 < 56 ? 56 : 120) - (bytes % 64)); padding[0] = [0x80]; - data = new Uint32Array(concat(data, padding).buffer); + let data = new Uint32Array(concat(dataUint8Array, padding).buffer); // ending with check bits (= little endian 64-bit int, 8 * data.length) bytes <<= 3; diff --git a/test/debug.spec.js b/test/debug.spec.js index 0027484..6bfa87c 100644 --- a/test/debug.spec.js +++ b/test/debug.spec.js @@ -1,24 +1,29 @@ -import { expect, assert } from 'chai'; - -import Mdict from '../src/mdict'; +import { assert, expect } from "chai"; +import Mdict from "../src/mdict"; function recorder(dictName, dictPath, func) { const startTime = new Date().getTime(); - const mdict = new Mdict(dictPath); - console.log(mdict.lookup('hello')); + const mdict = new Mdict(dictPath, { + passcode: "", + debug: false, + resort: true, + isStripKey: true, + isCaseSensitive: false, + }); + console.log(mdict.lookup("hello")); /* { keyText: "hello", definition: "你好", } */ - console.log(mdict.prefix('hello')); + console.log(mdict.prefix("hello")); /* [ { v: 64744840, k: 'he' }, { v: 65513175, k: 'hell' }, { v: 65552694, k: 'hello' } ] */ - const word = 'hitch'; + const word = "hitch"; const fws = mdict.fuzzy_search(word, 20, 5); console.log(fws); /* @@ -38,7 +43,7 @@ function recorder(dictName, dictPath, func) { { key: 'hit for', rofset: 66713795, ed: 4 } ] */ - console.log(mdict.parse_defination(fws[0].key, fws[0].rofset)); + console.log(mdict.parse_def_record(fws[0])); const endTime = new Date().getTime(); const elapsedTime = endTime - startTime; @@ -49,7 +54,13 @@ function recorder(dictName, dictPath, func) { function debugSearch(dictName, dictPath, word, callback) { const startTime = new Date().getTime(); - const mdict = new Mdict(dictPath); + const mdict = new Mdict(dictPath, { + passcode: "", + debug: true, + resort: true, + isStripKey: true, + isCaseSensitive: false, + }); const wordIndex = mdict.lookup(word); const endTime = new Date().getTime(); console.log( @@ -60,7 +71,12 @@ function debugSearch(dictName, dictPath, word, callback) { function debugSearchCaseSensitive(dictName, dictPath, word, callback) { const startTime = new Date().getTime(); - const mdict = new Mdict(dictPath, { keyCaseSensitive: true, stripKey: true }); + const mdict = new Mdict(dictPath, { + debug: true, + resort: true, + isStripKey: true, + isCaseSensitive: true, + }); const wordIndex = mdict.lookup(word); const endTime = new Date().getTime(); console.log( @@ -72,7 +88,7 @@ function debugSearchCaseSensitive(dictName, dictPath, word, callback) { function debugLoadResource(dictName, dictPath, word, callback) { const startTime = new Date().getTime(); const mdict = new Mdict(dictPath); - const wordIndex = mdict.lookup(word, { resourceKey: true }); + const wordIndex = mdict.locate(word); const endTime = new Date().getTime(); console.log( `${dictName}: time costs ${endTime - startTime} ms, wordIndex ${wordIndex}` @@ -80,10 +96,13 @@ function debugLoadResource(dictName, dictPath, word, callback) { callback(wordIndex); } -function debugStripKey(dictName, dictPath, word, callback) { +function debugStripKeyIgnoreCase(dictName, dictPath, word, callback) { const startTime = new Date().getTime(); - const mdict = new Mdict(dictPath, { keyCaseSensitive: true, stripKey: true }); - const stripfn = mdict._stripKey(); + const mdict = new Mdict(dictPath, { + keyCaseSensitive: false, + stripKey: true, + }); + const stripfn = mdict._stripKeyOrIngoreCase(); const strippedKey = stripfn(word); const endTime = new Date().getTime(); console.log( @@ -101,7 +120,7 @@ function debugNonStripKey(dictName, dictPath, word, callback) { stripKey: false, resourceKey: true, }); - const stripfn = mdict._stripKey(); + const stripfn = mdict._stripKeyOrIngoreCase(); const strippedKey = stripfn(word); const endTime = new Date().getTime(); console.log( @@ -112,137 +131,138 @@ function debugNonStripKey(dictName, dictPath, word, callback) { callback(strippedKey); } -describe('MultDictionary', () => { - describe('oale8.mdx', () => { - it('#version', () => { +describe("MultDictionary", () => { + describe("oale8.mdx", () => { + it("#version", () => { // debug case 1: - recorder('01-oale8', 'mdx/testdict/oale8.mdx', (mdict) => { + recorder("01-oale8", "mdx/testdict/oale8.mdx", (mdict) => { expect(mdict._version).to.be.equal(2); }); }); }); - describe('袖珍葡汉汉葡词典(简体版).mdx', () => { - it('#Holanda', () => { + describe("袖珍葡汉汉葡词典(简体版).mdx", () => { + it("#Holanda", () => { // debug case 2 // https://github.com/terasum/js-mdict/pull/27 - debugSearch( - '02-葡汉汉葡', - 'mdx/testdict/dict-01-袖珍葡汉汉葡词典(简体版).mdx', - 'Holanda', + debugSearchCaseSensitive( + "02-葡汉汉葡", + "mdx/testdict/dict-01-袖珍葡汉汉葡词典(简体版).mdx", + "Holanda", (def) => { - assert.isTrue( - def.definition === - '
\r\n

Holanda\r\n
荷兰(欧洲)\r\n\u0000' - ); + console.log(def.definition); + const expected = + "
\r\n

Holanda\r\n
荷兰(欧洲)\r\n\u0000"; + console.log(expected); + assert.isTrue(def.definition === expected); + } + ); + }); + it("#holanda", () => { + // debug case 3 + // https://github.com/terasum/js-mdict/pull/27 + debugSearchCaseSensitive( + "03-葡汉汉葡", + "mdx/testdict/dict-01-袖珍葡汉汉葡词典(简体版).mdx", + "holanda", + (def) => { + console.log(def.definition); + const expected = + "
\r\n

holanda\r\n
s.f. \r\n
洁白亚麻细布;荷兰麻布\r\n\u0000"; + console.log(expected); + assert.isTrue(def.definition === expected); } ); }); }); - it('#holanda', () => { - // debug case 3 - // https://github.com/terasum/js-mdict/pull/27 - debugSearch( - '03-葡汉汉葡', - 'mdx/testdict/dict-01-袖珍葡汉汉葡词典(简体版).mdx', - 'holanda', - (def) => { - assert.isTrue( - def.definition === - '
\r\n

holanda\r\n
s.f. \r\n
洁白亚麻细布;荷兰麻布\r\n\u0000' - ); - } - ); - }); - - it('#stripKey', () => { + it("#stripKey", () => { // debug case 4 - debugStripKey( - '04-葡汉汉葡', - 'mdx/testdict/dict-01-袖珍葡汉汉葡词典(简体版).mdx', - 'Holanda', + // this dictionary is case sensitivy + debugStripKeyIgnoreCase( + "04-葡汉汉葡", + "mdx/testdict/dict-01-袖珍葡汉汉葡词典(简体版).mdx", + "Holanda", (strippedKey) => { - assert.isTrue(strippedKey === 'Holanda'); + assert.isTrue(strippedKey === "Holanda"); } ); }); - it('#stripKey', () => { + it("#stripKey", () => { // debug case 5 - debugStripKey( - '05-葡汉汉葡', - 'mdx/testdict/dict-01-袖珍葡汉汉葡词典(简体版).mdx', - 'holanda', + // this dictionary is case sensitivy + debugStripKeyIgnoreCase( + "05-葡汉汉葡", + "mdx/testdict/dict-01-袖珍葡汉汉葡词典(简体版).mdx", + "holanda", (strippedKey) => { - assert.isTrue(strippedKey === 'holanda'); + assert.isTrue(strippedKey === "holanda"); } ); }); - it('#stripKey', () => { + it("#stripKey", () => { // debug case 8 - debugSearch( - '08-葡汉汉葡', - 'mdx/testdict/dict-01-袖珍葡汉汉葡词典(简体版).mdx', - 'Holanda', - (def) => { - console.log(def); - assert.isTrue(def.keyText === 'Holanda'); + debugStripKeyIgnoreCase( + "08-葡汉汉葡", + "mdx/testdict/dict-01-袖珍葡汉汉葡词典(简体版).mdx", + "Hol anda", + (strippedKey) => { + assert.isTrue(strippedKey === "Holanda"); } ); }); }); -describe('袖珍葡汉汉葡词典(简体版).mdx', () => { - it('#大小写敏感', () => { +describe("袖珍葡汉汉葡词典(简体版).mdx", () => { + it("#大小写敏感", () => { // debug case 6 - debugStripKey( - '06-大小写敏感', - 'mdx/testdict/dict-03-ptDict_KeyCaseSensitive.mdx', - 'Holanda', + debugStripKeyIgnoreCase( + "06-大小写敏感", + "mdx/testdict/dict-03-ptDict_KeyCaseSensitive.mdx", + "Holanda", (strippedKey) => { - assert.isTrue(strippedKey === 'Holanda'); + assert.isTrue(strippedKey === "Holanda"); } ); }); - it('#大小写敏感', () => { + it("#大小写敏感", () => { // debug case 7 debugSearchCaseSensitive( - '07-大小写敏感', - 'mdx/testdict/dict-03-ptDict_KeyCaseSensitive.mdx', - 'Holanda', + "07-大小写敏感", + "mdx/testdict/dict-03-ptDict_KeyCaseSensitive.mdx", + "Holanda", (def) => { console.log(def); - assert.isTrue(def.keyText === 'Holanda'); + assert.isTrue(def.keyText === "Holanda"); } ); }); }); -describe('oale8.mdd', () => { - it('#loadResource(1)', () => { +describe("oale8.mdd", () => { + it("#loadResource(1)", () => { debugNonStripKey( - '09-oale8', - 'mdx/testdict/oale8.mdx', - '/uk/headache__gb_1.mp3', + "09-oale8", + "mdx/testdict/oale8.mdx", + "/uk/headache__gb_1.mp3", (def) => { console.log(def); } ); }); - it('#loadResource(2)', () => { + it("#loadResource(2)", () => { debugLoadResource( - '10-oale8', - 'mdx/testdict/oale8.mdd', - '\\us_pron.png', + "10-oale8", + "mdx/testdict/oale8.mdd", + "\\us_pron.png", (def) => { console.log(def.keyText); console.log(def.definition); } ); }); - }); diff --git a/test/normal.spec.js b/test/normal.spec.js index 2a85af1..02ef8d4 100644 --- a/test/normal.spec.js +++ b/test/normal.spec.js @@ -1,22 +1,28 @@ -import { assert } from 'chai'; +import { assert } from "chai"; -import Mdict from '../src/mdict'; +import Mdict from "../src/mdict"; -const mdict = new Mdict('mdx/testdict/oale8.mdx'); +const mdict = new Mdict("mdx/testdict/oale8.mdx", { + passcode: "", + debug: false, + resort: true, + isStripKey: true, + isCaseSensitive: false, +}); -describe('Mdict', () => { - describe('#lookup', () => { +describe("Mdict", () => { + describe("#lookup", () => { it("should be 'micro'", () => { - const def = mdict.lookup('micro'); - assert.isTrue((typeof def.definition) === 'string'); + const def = mdict.lookup("micro"); + assert.isTrue(typeof def.definition === "string"); const expect_str = ` - micro /ˈmaɪkrəʊ; NAmEˈmaɪkroʊ/ noun (pl. micros) = microcomputer micro micros micro /ˈmaɪkrəʊ; NAmEˈmaɪkroʊ/\r\n\u0000 - `; +micro /ˈmaɪkrəʊ; NAmEˈmaɪkroʊ/ noun (pl. micros) = microcomputer micro micros micro /ˈmaɪkrəʊ; NAmEˈmaɪkroʊ/\r\n\u0000`; + assert.isTrue(def.definition.trim().length == expect_str.trim().length); assert.isTrue(def.definition.trim() === expect_str.trim()); }); it("should be 'introduction'", () => { - const def = mdict.lookup('introduction'); - assert.isTrue((typeof def.definition) === 'string'); + const def = mdict.lookup("introduction"); + assert.isTrue(typeof def.definition === "string"); // eslint-disable-next-line const expect_str = ` @@ -25,32 +31,32 @@ describe('Mdict', () => { assert.isTrue(def.definition.trim() === expect_str.trim()); }); it("should be 'dictionary'", () => { - const def = mdict.lookup('dictionary'); - assert.isTrue((typeof def.definition) === 'string'); + const def = mdict.lookup("dictionary"); + assert.isTrue(typeof def.definition === "string"); const expect_str = ` dic·tion·ary /ˈdɪkʃənri; NAmEˈdɪkʃəneri/ noun (pl. dic·tion·aries) 1. a book that gives a list of the words of a language in alphabetical order and explains what they mean, or gives a word for them in a foreign language 词典;字典;辞书a Spanish-English dictionary 西班牙语 – 英语词典2. a book that explains the words that are used in a particular subject 专业术语大全;专业词典a dictionary of mathematics 数学词典3. a list of words in electronic form, for example stored in a computer's spellchecker 电子词典dictionary dictionaries dic·tion·ary /ˈdɪkʃənri; NAmEˈdɪkʃəneri/\r\n\u0000 `; assert.isTrue(def.definition.trim() === expect_str.trim()); }); it("should be 'ask'", () => { - const def = mdict.lookup('ask'); - assert.isTrue((typeof def.definition) === 'string'); + const def = mdict.lookup("ask"); + assert.isTrue(typeof def.definition === "string"); const expect_str = ` ask /ɑːsk; NAmEæsk/ verb, nounask asks asked asking verb question 问题1. [I, T] to say or write sth in the form of a question, in order to get information 问;询问How old are you — if you don't mind me/my asking? 要是你不介意我提问,你多大年纪了? ask~ about sb/sthHe asked about her family. 他询问了她的家庭情况。 ask~ sthCan I ask a question? 我能提个问题吗?Did you ask the price? 你问了价钱没有? + speech‘Where are you going?’ she asked. “你去哪里?”她问道。 ask~ sb + speech‘Are you sure?’ he asked her. “你有把握吗?”他问她。 ask~ sb sthShe asked the students their names. 她问了学生们的姓名。I often get asked that! 我常常被问到那件事! ask~ sb (about sth) The interviewer asked me about my future plans. 采访者问了我的未来计划。 ask~ where, what, etc. … He asked where I lived. 他问我住在哪里。 ask~ sb where, what, etc. … I had to ask the teacher what to do next. 我不得不问老师下一步做什么。I was asked if/whether I could drive. 有人问我会不会开车。 HELP You cannot say ‘ask to sb’. 不能说 ask to sb:I asked to my friend what had happened. request 请求2. [T] to tell sb that you would like them to do sth or that you would like sth to happen 要求;请求 ask~ sb to do sthAll the students were asked to complete a questionnaire. 全体学生都被要求填一份调查表。Eric asked me to marry him. 埃里克求我嫁给他。 ask~ whether, what, etc. … I asked whether they could change my ticket. 我问他们是否可以给我换票。 ask~ sb whether, what, etc. … She asked me if I would give her English lessons. 她问我愿不愿意给她上英语课。 ask~ that … (formal) She asked that she be kept informed of developments. 她要求继续向她报告事态发展情况。(BrE also ) She asked that she should be kept informed. 她要求继续向她报告有关情况。3. [I, T] to say that you would like sb to give you sth 请求,恳求(给予);征求 ask~ for sthto ask for a job/a drink/an explanation 求职;要一杯饮料;要求解释I am writing to ask for some information about courses. 我写信是想了解关于课程的情况。 ask~ sthWhy don't you ask his advice? 你为什么不征询他的意见? ask~ sb for sthWhy don't you ask him for his advice? 你为什么不征求他的意见? ask~ sth of sbCan I ask a favour of you? 能请你帮个忙吗? ask~ sb sthCan I ask you a favour? 我能请你帮个忙吗?permission 准许4. [T] to request permission to do sth 请求允许;要求准许 ask~ to do sthDid you ask to use the car? 你是提出想用这辆车吗?I asked to see the manager. 我要求见经理。 ask~ if, whether, etc. … I'll ask if it's all right to park here. 我会问是否可以在这里停车。 ask~ sb if, whether, etc. … She asked her boss whether she could have the day off. 她问老板可不可以让她请一天假。invite 邀请5. [T] to invite sb 请;邀请 ask~ sb (+ adv./prep.) They've asked me to dinner. 他们已邀请我吃饭。I didn't ask them in (= to come into the house). 我没有请他们进屋。We must ask the neighbours round (= to our house). 我们得请邻居到家里来。 ask~ sb to do sthShe's asked him to come to the party. 她已邀请他来参加聚会。money 6. [T] ask~ sth (for sth) to request a particular amount of money for sth that you are selling 要价;索价He's asking £2 000 for the car. 这辆轿车他要价 2 000 英镑。expect/demand 期望;要求7. [T] to expect or demand sth 期望;要求 ask~ sthI know I'm asking a great deal. 我知道我的要求很高。 ask~ sth of sbYou're asking too much of him. 你对他要求过分了。 ask~ sth to do sthI know it's asking a lot to expect them to win again. 我知道期望他们再次获胜未免要求太高了。 synonyms at demand IDM ˈask for it (informal) to deserve sth bad that happens to you or that sb does to you 罪有应得;自讨苦吃;自找麻烦be ˈasking for trouble | be ˈasking for it (informal) to behave in a way that is very likely to result in trouble 要自找麻烦;要自讨苦吃ˌdon't ˈask (informal) if you say don't ask to sb, you mean that you do not want to reply to their question, because it would be awkward, embarrassing, etc. 不问为好;还是别问的好ˌdon't ask ˈme (informal) if you say don't ask me, you mean that you do not know the answer to a question and are annoyed you have been asked (不知答案或拂意作答时说)别问我for the ˈasking if you can have sth for the asking, it is very easy for you to get it if you ask for it 只需要求,一经索取(便可获得)The job is yours for the asking. 只要开口,这份工作就是你的了。I ˈask you (informal) if you say I ask you, you are expressing disapproval, shock or anger about sth/sb (表示不赞成、震惊或气愤)请问,真是,这还了得if you ask ˈme (informal) in my personal opinion 我认为;依我说Their marriage was a mistake, if you ask me. 依我看,他们的婚姻是个错误。 PHR V ˈask after sb (BrE) to say that you would like to know how sb is, what they are doing, etc. 问候;问好He always asks after you in his letters. 他在信中常问你好。ˌask aˈround to speak to a number of different people in order to try and get some information 四处打听;多方询问I don't know of any vacancies in the company but I'll ask around. 我不知道公司有没有空缺,不过我会打听打听。ˌask sb ˈback (especially BrE) to invite sb to come back to your house when you are both out together 邀请(一起外出的人)回到家里来I hoped he wouldn't ask me back. 我本不希望他会邀请我回到他家去。ˈask for sb/sth to say that you want to speak to sb or be directed to a place 说要找(某人);问到(某处)的路When you arrive, ask for Jane. 你到达后找简。ˌask sb ˈout to invite sb to go out with you, especially as a way of starting a romantic relationship. 邀请外出(尤指男女交往约会之始)He's too shy to ask her out. 他太腼腆,不好意思约她外出。 noun IDM a big ˈask (informal) a difficult thing to achieve or deal with 难以做到的事情;棘手的事Beating the world champions is certainly a big ask for the team. 这个队要打败世界冠军当然难度很大。SYNONYMS 同义词辨析askenquiredemandThese words all mean to say or write sth in the form of a question, in order to get information. 以上各词均含口头或书面询问之义。askto say or write sth in the form of a question, in order to get information 指口头或书面提问、询问:‘Where are you going?’ she asked. “你去哪?”她问道。She asked the students their names. 她问了学生的姓名。Can I ask a question? 我能提个问题吗?enquire/inquire (rather formal) to ask sb for information 指询问、查询:I called the station to enquire about train times. 我打电话到车站询问了火车时刻。demandto ask a question very firmly 指严正地问、质问:‘And where have you been?’ he demanded angrily. “那你去了哪里?”他怒气冲冲地质问道。PATTERNSto ask/enquire about/after sb/sthto ask/enquire/demand sth of sbto ask/enquire/demand what/who/how, etc. to ask/enquire politely to ask/enquire/demand angrily ask /ɑːsk; NAmEæsk/\r\n\u0000 `; assert.isTrue(def.definition.trim() === expect_str.trim()); }); it("should be 'vote'", () => { - const def = mdict.lookup('vote'); + const def = mdict.lookup("vote"); - assert.isTrue((typeof def.definition) === 'string'); + assert.isTrue(typeof def.definition === "string"); const expect_str = ` vote /vəʊt; NAmEvoʊt/ noun, verbvote votes voted voting noun 1. [C] vote~ (for/against sb/sth) a formal choice that you make in an election or at a meeting in order to choose sb or decide sth 选票;票There were 21 votes for and 17 against the motion, with 2 abstentions. 这项动议有 21 票赞成,17 票反对,2 票弃权。The motion was passed by 6 votes to 3. 这项动议以 6 票对 3 票获得通过。The chairperson has the casting/deciding vote. 主席可投决定票。The Green candidate won over 3 000 of the 14 000 votes cast. 绿党候选人在 14 000 张投票总数中获得了 3 000 多张选票。2. [C] vote~ (on sth) an occasion when a group of people vote on sth 投票;选举;表决to have/take a vote on an issue 就一问题进行表决The issue was put to the vote. 这一问题被付诸表决。The vote was unanimous. 表决一致通过。 synonyms at election 3. the vote [sing.] the total number of votes in an election 投票总数;选票总数She obtained 40% of the vote. 她获得 40% 的选票。The party increased their share of the vote. 这个政党得票份额有所增长。4. the vote [sing.] the vote given by a particular group of people, or for a particular party, etc. (某一群体的)投票总数;(某一政党等的)得票总数the student vote 学生的投票总数the Labour vote 工党得票总数5. the vote [sing.] the right to vote, especially in political elections (尤指政治选举中的)投票权,选举权,表决权In Britain and the US, people get the vote at 18. 在英国和美国,国民 18 岁开始有选举权。 see also block vote verb 1. [I, T] to show formally by marking a paper or raising your hand which person you want to win an election, or which plan or idea you support 投票(赞成╱反对);表决(支持╱不支持);选举 vote~ (for/against sb/sth) Did you vote for or against her? 你投了她的赞成票还是反对票?How did you vote at the last election? 在上次选举中你是怎么投的票? vote~ in favour of sthOver 60% of members voted in favour of (= for) the motion. * 60% 以上的成员对这一动议投了赞成票。 vote~ (on sth) We'll listen to the arguments on both sides and then vote on it. 我们将先听取双方的论点,然后再表决。Only about half of the electorate bothered to vote. 只有约半数的选民参加了投票。 vote~ sthWe voted Democrat in the last election. 我们在上次选举中投了民主党的票。 vote~ to do sthParliament voted to set up an independent inquiry into the matter. 议会表决对这个问题进行独立调查。 collocations at politics 2. [T, usually passive] vote~ sb/sth + noun to choose sb/sth for a position or an award by voting 选出,推举(某人担任某职);表决(授奖给某人)He was voted most promising new director. 他当选为最有前途的新导演。3. [T, usually passive] vote~ sth + noun to say that sth is good or bad 表明,认为,公认(某事好或坏)The event was voted a great success. 大家认为这项活动很成功。4. [T] vote~ sb/yourself sth to agree to give sb/yourself sth by voting 投票同意The directors have just voted themselves a huge pay increase. 董事们刚刚投票同意给他们自己大幅度提高工资。5. [T] vote~ (that) … to suggest sth or support a suggestion that sb has made 提议;建议;支持(建议)I vote (that) we go out to eat. 我提议我们到外面去吃饭。IDM ˌvote with your ˈfeet to show what you think about sth by going or not going somewhere 用脚投票(用去或不去某处表示想法)Shoppers voted with their feet and avoided the store. 购物者对那家商店避而远之。 PHR V ˌvote sb/sth↔ˈdown to reject or defeat sb/sth by voting for sb/sth else 投票否决;投票击败ˌvote sb ˈin | ˌvote sb ˈinto/ˈonto sth to choose sb for a position by voting 投票选出 … 任职He was voted in as treasurer. 他当选为司库。She was voted onto the board of governors. 她获选入董事会。ˌvote sb ˈout | ˌvote sb ˈout of/ˈoff sth to dismiss sb from a position by voting 投票免去 … 的职务He was voted out of office. 经投票他被免去了职务。ˌvote sth↔ˈthrough to bring a plan, etc. into effect by voting for it 投票通过(计划等)A proposal to merge the two companies was voted through yesterday. 两家公司合并的建议已于昨日投票通过。COLLOCATIONS 词语搭配Voting in elections 在选举中投票Running for election 参加选举 conduct/hold an election/a referendum 举行选举/全民公决 (especially NAmE) run for office/election/governor/mayor/president/the White House 竞选公职;参加竞选;竞选州长/市长/总统/美国总统 (especially BrE) stand for election/office/Parliament/the Labour Party/a second term 参加竞选;竞选公职/议会议员;当工党候选人;竞选连任 hold/call/contest a general/national election 举行/要求/角逐大选/全国选举 launch/run a presidential election campaign 开始总统竞选活动 support/back a candidate 支持候选人 sway/convince/persuade voters/the electorate 说服选民/全体选民 appeal to/attract/woo/target (NAmE) swing voters/(BrE) floating voters 吸引游离选民;寻求游离选民的支持;瞄准游离选民 fix/rig/steal an election/the vote 操纵选举;暗中舞弊获取选票Voting 投票 go to/be turned away from (especially BrE) a polling station/(NAmE) a polling place 去/被拒绝进入投票站投票 cast a/your vote/ballot (for sb) 投(某人)一票 vote for the Conservative candidate/the Democratic party 投票给保守党候选人/民主党 mark/spoil your ballot paper 在选票上做标记;投废票 count (BrE) the postal votes/(especially NAmE) the absentee ballots 清点邮寄选票数 go to/be defeated at the ballot box 去投票箱投票;竞选失败 get/win/receive/lose votes 赢得/失去选票 get/win (60% of) the popular/black/Hispanic/Latino/Muslim vote 赢得大众/黑人/西班牙裔美国人/居住在美国的拉丁美洲人/穆斯林(60%)的选票 win the election/(in the US) the primaries/a seat in Parliament/a majority/power 赢得大选/(美国的)初选/议会中的一个席位/多数票/权力 lose an election/the vote/your majority/your seat 在选举中失败;失去多数人的支持/席位 win/come to power in a landslide (victory) (= with many more votes than any other party) 以压倒多数的选票获胜/掌权 elect/re-elect sb (as) mayor/president/an MP/senator/congressman/congresswoman 选举/再度选举某人为市长/总统/议员/参议员/国会议员/国会女议员Taking power 掌权 be sworn into office/in as president 宣誓就职/就任总统 take/administer (in the US) the oath of office (美国)宣誓就职;听取就职宣誓 swear/take (in the UK) an/the oath of allegiance (英国)宣誓效忠 give/deliver (in the US) the president's inaugural address 发表(美国)总统就职演说 take/enter/hold/leave office 就职;任职;离职 appoint sb (as) ambassador/governor/judge/minister 任命某人为大使/州长/法官/部长 form a government/a cabinet 组建政府/内阁 serve two terms as prime minister/in office 任两届总理;两届任职➱ more collocations at economy, politics vote /vəʊt; NAmEvoʊt/\r\n\u0000 `; assert.isTrue(def.definition.trim() === expect_str.trim()); }); it("should be 'good'", () => { - const def = mdict.lookup('good'); + const def = mdict.lookup("good"); assert.isTrue(def.definition !== null); assert.isTrue(def.definition.length > 0); const expect_str = ` @@ -59,7 +65,7 @@ describe('Mdict', () => { assert.isTrue(def.definition.trim() === expect_str.trim()); }); it("should be 'bad'", () => { - const def = mdict.lookup('bad'); + const def = mdict.lookup("bad"); assert.isTrue(def.definition !== null); assert.isTrue(def.definition.length > 0); const expect_str = ` diff --git a/test/simpleSpec2.js b/test/simpleSpec2.js new file mode 100644 index 0000000..8eeaff1 --- /dev/null +++ b/test/simpleSpec2.js @@ -0,0 +1,59 @@ +const Mdict = require("../lib/mdict").default; + +function recorder(dictName, dictPath, func) { + const startTime = new Date().getTime(); + const mdict = new Mdict(dictPath, { + passcode: "", + debug: true, + resort: true, + isStripKey: true, + isCaseSensitive: false, + }); + + console.log(mdict._lookupByResort("let yourself in for sth")); + + // console.log(mdict.lookup("hello")); + // /* + // { keyText: "hello", + // definition: "你好", + // } + // */ + // console.log(mdict.prefix("hello")); + // /* + // [ { v: 64744840, k: 'he' }, + // { v: 65513175, k: 'hell' }, + // { v: 65552694, k: 'hello' } ] + // */ + + // const word = "hitch"; + // const fws = mdict.fuzzy_search(word, 20, 5); + // console.log(fws); + // /* + // [ { key: 'history', rofset: 66627131, ed: 4 }, + // { key: 'hit', rofset: 66648124, ed: 2 }, + // { key: 'hit back', rofset: 66697464, ed: 4 }, + // { key: 'hit back', rofset: 66697464, ed: 4 }, + // { key: 'hit big', rofset: 66698789, ed: 4 }, + // { key: 'hitch', rofset: 66698812, ed: 0 }, + // { key: 'hitched', rofset: 66706586, ed: 2 }, + // { key: 'hitcher', rofset: 66706602, ed: 2 }, + // { key: 'hitches', rofset: 66706623, ed: 2 }, + // { key: 'hitchhike', rofset: 66706639, ed: 4 }, + // { key: 'hitchhiker', rofset: 66710697, ed: 5 }, + // { key: 'hitching', rofset: 66712273, ed: 3 }, + // { key: 'hi-tech', rofset: 66712289, ed: 2 }, + // { key: 'hit for', rofset: 66713795, ed: 4 } ] + + // */ + // console.log(mdict.parse_defination(fws[0].key, fws[0].rofset)); + + const endTime = new Date().getTime(); + const elapsedTime = endTime - startTime; + func(mdict, elapsedTime); + // eslint-disable-next-line + console.log(`loading ${dictName} dict used: ${elapsedTime / 1000.0} s`); +} + +recorder("01-oale8", "mdx/testdict/oale8.mdx", (mdict) => { + console.log("01-oale8 version", mdict._version); +}); diff --git a/test/v1.2.mdd.spec.js b/test/v1.2.mdd.spec.js index 63860dc..dbee388 100644 --- a/test/v1.2.mdd.spec.js +++ b/test/v1.2.mdd.spec.js @@ -1,18 +1,18 @@ -import { assert } from 'chai'; -import Mdict from '../src/mdict'; +import { assert } from "chai"; +import Mdict from "../src/mdict"; -describe('Mdict', () => { - describe('Collins', () => { +describe("Mdict", () => { + describe("Collins", () => { const mdict = new Mdict( "mdx/testdict/v1.2/Collins COBUILD Advanced Learner's English-Chinese Dictionary/Collins COBUILD Advanced Learner's English-Chinese Dictionary.mdd" ); - it('#lookup', () => { - const def = mdict.lookup('\\collins.css'); + it("#lookup", () => { + const def = mdict.locate("\\collins.css"); assert.isNotEmpty(def.definition); assert.equal( def.keyText, - '\\collins.css', - 'definition result should be equal with `ask`' + "\\collins.css", + "definition result should be equal with `ask`" ); }); }); diff --git a/test/v1.2.mdx.1.spec.js b/test/v1.2.mdx.1.spec.js index b768a52..3f60368 100644 --- a/test/v1.2.mdx.1.spec.js +++ b/test/v1.2.mdx.1.spec.js @@ -1,21 +1,21 @@ -import { assert } from 'chai'; -import Mdict from '../src/mdict'; +import { assert } from "chai"; +import Mdict from "../src/mdict"; -describe('Mdict', () => { - describe('Oxford', () => { +describe("Mdict", () => { + describe("Oxford", () => { const mdict = new Mdict( - "mdx/testdict/v1.2/Oxford Advanced Learner's Dictionary 7th/Oxford Advanced Learner's Dictionary 7th.mdx" + "mdx/testdict/v1.2/Oxford Advanced Learner's Dictionary 7th/Oxford Advanced Learner's Dictionary 7th.mdx", + { + resort: true, + } ); - it('#associate&#parse_defination', () => { - const matched = mdict.associate('on'); + it("#associate&#parse_defination", () => { + const matched = mdict.associate("on"); assert.isTrue(matched.length > 0); assert.isTrue(matched != undefined); assert.isTrue(matched[0] != undefined); - let defination = mdict.parse_defination( - matched[0].keyText, - matched[0].recordStartOffset - ); + let defination = mdict.parse_def_record(matched[0]); assert.isTrue( defination.definition.startsWith( @@ -23,41 +23,41 @@ describe('Mdict', () => { ) ); }); - it('#lookup', () => { - const def = mdict.lookup('ask'); + it("#lookup", () => { + const def = mdict.lookup("ask"); assert.isNotEmpty(def.definition); assert.equal( def.keyText, - 'ask', - 'definition result should be equal with `ask`' + "ask", + "definition result should be equal with `ask`" ); }); - it('#prefix', () => { - const prefix = mdict.prefix('likewise'); + it("#prefix", () => { + const prefix = mdict.prefix("likewise"); assert.isArray(prefix); assert.equal( prefix.length, - 2, - 'definition result.length should be equal with 2' + 1, + "definition result.length should be equal with 1" ); }); - it('#suggest', async () => { - const result = await mdict.suggest('informations'); + it("#suggest", async () => { + const result = await mdict.suggest("informations"); assert.isArray(result); assert.equal( result.length, 2, - 'prefix result.length should be equal with 2' + "prefix result.length should be equal with 2" ); }); - it('#fuzzy_search', () => { - const result = mdict.fuzzy_search('incited', 5, 5); + it("#fuzzy_search", () => { + const result = mdict.fuzzy_search("incited", 5, 4); assert.isArray(result); assert.equal( result.length, - 6, - 'fuzzy_search result.length should be equal with 6' + 5, + "fuzzy_search result.length should be equal with 6" ); }); }); diff --git a/test/v1.2.mdx.2.spec.js b/test/v1.2.mdx.2.spec.js index 12fc484..48d45f9 100644 --- a/test/v1.2.mdx.2.spec.js +++ b/test/v1.2.mdx.2.spec.js @@ -1,21 +1,21 @@ -import { assert } from 'chai'; -import Mdict from '../src/mdict'; +import { assert } from "chai"; +import Mdict from "../src/mdict"; -describe('Mdict', () => { - describe('American Heritage', () => { +describe("Mdict", () => { + describe("American Heritage", () => { const mdict = new Mdict( - 'mdx/testdict/v1.2/The American Heritage Dictionary of English Language/The American Heritage Dictionary of English Language.mdx' + "mdx/testdict/v1.2/The American Heritage Dictionary of English Language/The American Heritage Dictionary of English Language.mdx", + { + resort: true, + } ); - it('#associate&#parse_defination', () => { - const matched = mdict.associate('bri'); + it("#associate&#parse_defination", () => { + const matched = mdict.associate("bri"); assert.isTrue(matched.length > 0); assert.isTrue(matched != undefined); assert.isTrue(matched[0] != undefined); - let defination = mdict.parse_defination( - matched[0].keyText, - matched[0].recordStartOffset - ); + let defination = mdict.parse_def_record(matched[0]); assert.isTrue( defination.definition.startsWith( @@ -23,41 +23,41 @@ describe('Mdict', () => { ) ); }); - it('#lookup', () => { - const def = mdict.lookup('ask'); + it("#lookup", () => { + const def = mdict.lookup("ask"); assert.isNotEmpty(def.definition); assert.equal( def.keyText, - 'ask', - 'definition result should be equal with `ask`' + "ask", + "definition result should be equal with `ask`" ); }); - it('#prefix', () => { - const prefix = mdict.prefix('likewise'); + it("#prefix", () => { + const prefix = mdict.prefix("likewise"); assert.isArray(prefix); assert.equal( prefix.length, - 3, - 'definition result.length should be equal with 3' + 1, + "definition result.length should be equal with 3" ); }); - it('#suggest', async () => { - const result = await mdict.suggest('informations'); + it("#suggest", async () => { + const result = await mdict.suggest("informations"); assert.isArray(result); assert.equal( result.length, 2, - 'prefix result.length should be equal with 2' + "prefix result.length should be equal with 2" ); }); - it('#fuzzy_search', () => { - const result = mdict.fuzzy_search('incited', 5, 5); + it("#fuzzy_search", () => { + const result = mdict.fuzzy_search("incited", 5, 3); assert.isArray(result); assert.equal( result.length, - 4, - 'fuzzy_search result.length should be equal with 4' + 5, + "fuzzy_search result.length should be equal with 4" ); }); }); diff --git a/test/v1.2.mdx.spec.js b/test/v1.2.mdx.spec.js index 5ea700d..11d404c 100644 --- a/test/v1.2.mdx.spec.js +++ b/test/v1.2.mdx.spec.js @@ -1,21 +1,19 @@ -import { assert } from 'chai'; -import Mdict from '../src/mdict'; +import { assert } from "chai"; +import Mdict from "../src/mdict"; -describe('Mdict', () => { - describe('Collins', () => { +describe("Mdict", () => { + describe("Collins", () => { const mdict = new Mdict( - "mdx/testdict/v1.2/Collins COBUILD Advanced Learner's English-Chinese Dictionary/Collins COBUILD Advanced Learner's English-Chinese Dictionary.mdx" + "mdx/testdict/v1.2/Collins COBUILD Advanced Learner's English-Chinese Dictionary/Collins COBUILD Advanced Learner's English-Chinese Dictionary.mdx", + { resort: true } ); - it('#associate&#parse_defination', () => { - const matched = mdict.associate('on'); + it("#associate&#parse_defination", () => { + const matched = mdict.associate("on"); assert.isTrue(matched.length > 0); assert.isTrue(matched != undefined); assert.isTrue(matched[0] != undefined); - let defination = mdict.parse_defination( - matched[0].keyText, - matched[0].recordStartOffset - ); + let defination = mdict.parse_def_record(matched[0]); assert.isTrue( defination.definition.startsWith( @@ -23,41 +21,41 @@ describe('Mdict', () => { ) ); }); - it('#lookup', () => { - const def = mdict.lookup('ask'); + it("#lookup", () => { + const def = mdict.lookup("ask"); assert.isNotEmpty(def.definition); assert.equal( def.keyText, - 'ask', - 'definition result should be equal with `ask`' + "ask", + "definition result should be equal with `ask`" ); }); - it('#prefix', () => { - const prefix = mdict.prefix('likewise'); + it("#prefix", () => { + const prefix = mdict.prefix("likewise"); assert.isArray(prefix); assert.equal( prefix.length, - 2, - 'definition result.length should be equal with 2' + 1, + "definition result.length should be equal with 2" ); }); - it('#suggest', async () => { - const result = await mdict.suggest('informations'); + it("#suggest", async () => { + const result = await mdict.suggest("informations"); assert.isArray(result); assert.equal( result.length, 2, - 'prefix result.length should be equal with 2' + "prefix result.length should be equal with 2" ); }); - it('#fuzzy_search', () => { - const result = mdict.fuzzy_search('incited', 5, 5); + it("#fuzzy_search", () => { + const result = mdict.fuzzy_search("incited", 5, 5); assert.isArray(result); assert.equal( result.length, - 7, - 'fuzzy_search result.length should be equal with 7' + 5, + "fuzzy_search result.length should be equal with 7" ); }); }); diff --git a/test/v2.0.mdd.spec.js b/test/v2.0.mdd.spec.js index a45826c..54799f8 100644 --- a/test/v2.0.mdd.spec.js +++ b/test/v2.0.mdd.spec.js @@ -1,47 +1,47 @@ -import { assert } from 'chai'; -import Mdict from '../src/mdict'; +import { assert } from "chai"; +import Mdict from "../src/mdict"; -describe('Mdict', () => { - describe('oale8.mdd', () => { - const mdict = new Mdict('mdx/testdict/oale8.mdd'); +describe("Mdict", () => { + describe("oale8.mdd", () => { + const mdict = new Mdict("mdx/testdict/oale8.mdd", { resort: true }); - it('#lookup>\\uk_pron.png', () => { - const def = mdict.lookup('\\uk_pron.png'); + it("#lookup>\\uk_pron.png", () => { + const def = mdict.locate("\\uk_pron.png"); assert.isNotEmpty(def.definition); assert.equal( def.keyText, - '\\uk_pron.png', - 'lookup result should be equal with `\\uk_pron.png`' + "\\uk_pron.png", + "lookup result should be equal with `\\uk_pron.png`" ); }); - it('#lookup>\\us_pron.png', () => { - const def = mdict.lookup('\\us_pron.png'); + it("#lookup>\\us_pron.png", () => { + const def = mdict.locate("\\us_pron.png"); assert.isNotEmpty(def.definition); assert.equal( def.keyText, - '\\us_pron.png', - 'lookup result should be equal with `\\us_pron.png`' + "\\us_pron.png", + "lookup result should be equal with `\\us_pron.png`" ); }); - it('#lookup>\\thumb\\ragdoll.jpg', () => { - const def = mdict.lookup('\\thumb\\ragdoll.jpg'); + it("#lookup>\\thumb\\ragdoll.jpg", () => { + const def = mdict.locate("\\thumb\\ragdoll.jpg"); assert.isNotEmpty(def.definition); assert.equal( def.keyText, - '\\thumb\\ragdoll.jpg', - 'lookup result should be equal with `\\thumb\\ragdoll.jpg`' + "\\thumb\\ragdoll.jpg", + "lookup result should be equal with `\\thumb\\ragdoll.jpg`" ); }); - it('#lookup>\\us\\zebra__us_2.mp3', () => { - const def = mdict.lookup('\\us\\zebra__us_2.mp3'); + it("#lookup>\\us\\zebra__us_2.mp3", () => { + const def = mdict.locate("\\us\\zebra__us_2.mp3"); assert.isNotEmpty(def.definition); assert.equal( def.keyText, - '\\us\\zebra__us_2.mp3', - 'lookup result should be equal with `\\us\\zebra__us_2.mp3`' + "\\us\\zebra__us_2.mp3", + "lookup result should be equal with `\\us\\zebra__us_2.mp3`" ); }); }); diff --git a/test/v2.0.mdx.spec.js b/test/v2.0.mdx.spec.js index 79f89e1..dd8ffa2 100644 --- a/test/v2.0.mdx.spec.js +++ b/test/v2.0.mdx.spec.js @@ -1,19 +1,16 @@ -import { assert } from 'chai'; -import Mdict from '../src/mdict'; +import { assert } from "chai"; +import Mdict from "../src/mdict"; -describe('Mdict', () => { - describe('oale8.mdx', () => { - const mdict = new Mdict('mdx/testdict/oale8.mdx'); - it('#associate&#parse_defination', () => { - const matched = mdict.associate('on'); +describe("Mdict", () => { + describe("oale8.mdx", () => { + const mdict = new Mdict("mdx/testdict/oale8.mdx", { resort: true }); + it("#associate&#parse_defination", () => { + const matched = mdict.associate("on"); assert.isTrue(matched.length > 0); assert.isTrue(matched != undefined); assert.isTrue(matched[0] != undefined); - let defination = mdict.parse_defination( - matched[0].keyText, - matched[0].recordStartOffset - ); + let defination = mdict.parse_def_record(matched[0]); assert.isTrue( defination.definition.startsWith( @@ -21,41 +18,41 @@ describe('Mdict', () => { ) ); }); - it('#lookup', () => { - const def = mdict.lookup('ask'); + it("#lookup", () => { + const def = mdict.lookup("ask"); assert.isNotEmpty(def.definition); assert.equal( def.keyText, - 'ask', - 'definition result should be equal with `ask`' + "ask", + "definition result should be equal with `ask`" ); }); - it('#prefix', () => { - const prefix = mdict.prefix('likewise'); + it("#prefix", () => { + const prefix = mdict.prefix("likewise"); assert.isArray(prefix); assert.equal( prefix.length, - 2, - 'definition result.length should be equal with 2' + 1, + "definition result.length should be equal with 2" ); }); - it('#suggest', async () => { - const result = await mdict.suggest('informations'); + it("#suggest", async () => { + const result = await mdict.suggest("informations"); assert.isArray(result); assert.equal( result.length, 2, - 'prefix result.length should be equal with 2' + "prefix result.length should be equal with 2" ); }); - it('#fuzzy_search', () => { - const result = mdict.fuzzy_search('incited', 5, 5); + it("#fuzzy_search", () => { + const result = mdict.fuzzy_search("incited", 5, 5); assert.isArray(result); assert.equal( result.length, - 6, - 'fuzzy_search result.length should be equal with 6' + 5, + "fuzzy_search result.length should be equal with 6" ); }); });