pax_global_header00006660000000000000000000000064140475344250014522gustar00rootroot0000000000000052 comment=34f7aacf27d17666a95c16c6a30ed987872b8ecc tiny-glob-0.2.9/000077500000000000000000000000001404753442500134365ustar00rootroot00000000000000tiny-glob-0.2.9/.editorconfig000066400000000000000000000002231404753442500161100ustar00rootroot00000000000000root = true [*] charset = utf-8 end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true indent_style = space indent_size = 2 tiny-glob-0.2.9/.github/000077500000000000000000000000001404753442500147765ustar00rootroot00000000000000tiny-glob-0.2.9/.github/workflows/000077500000000000000000000000001404753442500170335ustar00rootroot00000000000000tiny-glob-0.2.9/.github/workflows/ci.yml000066400000000000000000000013231404753442500201500ustar00rootroot00000000000000name: CI on: push: branches: - '**' tags-ignore: - '**' pull_request: branches: - 'master' jobs: test: name: Node.js v${{ matrix.nodejs }} runs-on: ubuntu-latest strategy: matrix: nodejs: [8, 10, 12, 14] steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.nodejs }} - name: (env) cache uses: actions/cache@v2 with: path: ~/.npm key: ${{ runner.os }}-${{ matrix.nodejs }}-${{ hashFiles('**/package-lock.json') }} restore-keys: ${{ runner.os }}-${{ matrix.nodejs }}- - name: Install run: npm ci - name: Run Tests run: npm test tiny-glob-0.2.9/.gitignore000066400000000000000000000000441404753442500154240ustar00rootroot00000000000000node_modules .DS_Store *.lock *.log tiny-glob-0.2.9/bench/000077500000000000000000000000001404753442500145155ustar00rootroot00000000000000tiny-glob-0.2.9/bench/assert.js000066400000000000000000000006661404753442500163640ustar00rootroot00000000000000const assert = require('assert'); const { promisify } = require('util'); const { order } = require('../test/helpers'); const glob = promisify(require('glob')); const fast = require('fast-glob'); const tiny = require('../'); let prev; module.exports = async function (str, opts) { let fn, tmp; for (fn of [glob, fast, tiny]) { tmp = await fn(str, opts).then(order); prev && assert.deepEqual(tmp, prev); prev = tmp; } } tiny-glob-0.2.9/bench/index.js000066400000000000000000000017661404753442500161740ustar00rootroot00000000000000const Table = require('cli-table2'); const { Suite } = require('benchmark'); const assert = require('./assert'); const { sync } = require('glob'); const fg = require('fast-glob'); const curr = require('../'); const cwd = __dirname; const pattern = 'test/*.js'; const head = ['Name', 'Mean time', 'Ops/sec', 'Diff']; async function onStart() { await assert(pattern, { cwd }); } new Suite({ onStart, onComplete }) .add('glob', () => sync(pattern, { cwd })) .add('fast-glob', () => fg(pattern, { cwd })) .add('tiny-glob', () => curr(pattern, { cwd })) .on('cycle', e => console.log(String(e.target))) .run({ async:true }); function onComplete() { console.log('Fastest is ' + this.filter('fastest').map('name')); let prev, diff; const tbl = new Table({ head }); this.forEach(el => { diff = prev ? (((el.hz - prev) * 100 / prev).toFixed(2) + '% faster') : 'N/A'; tbl.push([el.name, el.stats.mean, el.hz.toLocaleString(), diff]) prev = el.hz; }); console.log(tbl.toString()); } tiny-glob-0.2.9/bench/package.json000066400000000000000000000002061404753442500170010ustar00rootroot00000000000000{ "devDependencies": { "benchmark": "^2.1.4", "cli-table2": "^0.2.0", "fast-glob": "^2.2.0", "glob": "^7.1.2" } } tiny-glob-0.2.9/bench/test/000077500000000000000000000000001404753442500154745ustar00rootroot00000000000000tiny-glob-0.2.9/bench/test/a.js000066400000000000000000000000001404753442500162400ustar00rootroot00000000000000tiny-glob-0.2.9/bench/test/a.md000066400000000000000000000000001404753442500162240ustar00rootroot00000000000000tiny-glob-0.2.9/bench/test/b.js000066400000000000000000000000001404753442500162410ustar00rootroot00000000000000tiny-glob-0.2.9/bench/test/b.md000066400000000000000000000000001404753442500162250ustar00rootroot00000000000000tiny-glob-0.2.9/bench/test/c.js000066400000000000000000000000001404753442500162420ustar00rootroot00000000000000tiny-glob-0.2.9/bench/test/dirA/000077500000000000000000000000001404753442500163535ustar00rootroot00000000000000tiny-glob-0.2.9/bench/test/dirA/aa.js000066400000000000000000000000001404753442500172600ustar00rootroot00000000000000tiny-glob-0.2.9/bench/test/dirA/aa.md000066400000000000000000000000001404753442500172440ustar00rootroot00000000000000tiny-glob-0.2.9/bench/test/dirA/bb.js000066400000000000000000000000001404753442500172620ustar00rootroot00000000000000tiny-glob-0.2.9/bench/test/dirA/bb.md000066400000000000000000000000001404753442500172460ustar00rootroot00000000000000tiny-glob-0.2.9/bench/test/dirA/cc.js000066400000000000000000000000001404753442500172640ustar00rootroot00000000000000tiny-glob-0.2.9/index.d.ts000066400000000000000000000003501404753442500153350ustar00rootroot00000000000000type Options = { cwd?: string; dot?: boolean; absolute?: boolean; filesOnly?: boolean; flush?: boolean; }; type FilePath = string; declare function glob(str: string, opts?: Options): Promise; export = glob; tiny-glob-0.2.9/index.js000066400000000000000000000050231404753442500151030ustar00rootroot00000000000000const fs = require('fs'); const globrex = require('globrex'); const { promisify } = require('util'); const globalyzer = require('globalyzer'); const { join, resolve, relative } = require('path'); const isHidden = /(^|[\\\/])\.[^\\\/\.]/g; const readdir = promisify(fs.readdir); const stat = promisify(fs.stat); let CACHE = {}; async function walk(output, prefix, lexer, opts, dirname='', level=0) { const rgx = lexer.segments[level]; const dir = resolve(opts.cwd, prefix, dirname); const files = await readdir(dir); const { dot, filesOnly } = opts; let i=0, len=files.length, file; let fullpath, relpath, stats, isMatch; for (; i < len; i++) { fullpath = join(dir, file=files[i]); relpath = dirname ? join(dirname, file) : file; if (!dot && isHidden.test(relpath)) continue; isMatch = lexer.regex.test(relpath); if ((stats=CACHE[relpath]) === void 0) { CACHE[relpath] = stats = fs.lstatSync(fullpath); } if (!stats.isDirectory()) { isMatch && output.push(relative(opts.cwd, fullpath)); continue; } if (rgx && !rgx.test(file)) continue; !filesOnly && isMatch && output.push(join(prefix, relpath)); await walk(output, prefix, lexer, opts, relpath, rgx && rgx.toString() !== lexer.globstar && level + 1); } } /** * Find files using bash-like globbing. * All paths are normalized compared to node-glob. * @param {String} str Glob string * @param {String} [options.cwd='.'] Current working directory * @param {Boolean} [options.dot=false] Include dotfile matches * @param {Boolean} [options.absolute=false] Return absolute paths * @param {Boolean} [options.filesOnly=false] Do not include folders if true * @param {Boolean} [options.flush=false] Reset cache object * @returns {Array} array containing matching files */ module.exports = async function (str, opts={}) { if (!str) return []; let glob = globalyzer(str); opts.cwd = opts.cwd || '.'; if (!glob.isGlob) { try { let resolved = resolve(opts.cwd, str); let dirent = await stat(resolved); if (opts.filesOnly && !dirent.isFile()) return []; return opts.absolute ? [resolved] : [str]; } catch (err) { if (err.code != 'ENOENT') throw err; return []; } } if (opts.flush) CACHE = {}; let matches = []; const { path } = globrex(glob.glob, { filepath:true, globstar:true, extended:true }); path.globstar = path.globstar.toString(); await walk(matches, glob.base, path, opts, '.', 0); return opts.absolute ? matches.map(x => resolve(opts.cwd, x)) : matches; }; tiny-glob-0.2.9/license000066400000000000000000000020471404753442500150060ustar00rootroot00000000000000MIT License Copyright (c) 2018 Terkel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. tiny-glob-0.2.9/package-lock.json000066400000000000000000001031431404753442500166540ustar00rootroot00000000000000{ "name": "tiny-glob", "version": "0.2.9", "lockfileVersion": 1, "requires": true, "dependencies": { "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, "array-filter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", "dev": true }, "available-typed-arrays": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", "dev": true, "requires": { "array-filter": "^1.0.0" } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "buffer-shims": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", "dev": true }, "call-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.0" } }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "deep-equal": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.4.tgz", "integrity": "sha512-BUfaXrVoCfgkOQY/b09QdO9L3XNoF2XH0A3aY9IQwQL/ZjLOe8FQgCNVl1wiolhsFo8kFdO9zdPViCPbmaJA5w==", "dev": true, "requires": { "es-abstract": "^1.18.0-next.1", "es-get-iterator": "^1.1.0", "is-arguments": "^1.0.4", "is-date-object": "^1.0.2", "is-regex": "^1.1.1", "isarray": "^2.0.5", "object-is": "^1.1.3", "object-keys": "^1.1.1", "object.assign": "^4.1.1", "regexp.prototype.flags": "^1.3.0", "side-channel": "^1.0.3", "which-boxed-primitive": "^1.0.1", "which-collection": "^1.0.1", "which-typed-array": "^1.1.2" }, "dependencies": { "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true } } }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { "object-keys": "^1.0.12" } }, "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", "dev": true }, "dotignore": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", "dev": true, "requires": { "minimatch": "^3.0.4" } }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, "es-abstract": { "version": "1.18.0-next.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", "is-negative-zero": "^2.0.0", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } }, "es-get-iterator": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.1.tgz", "integrity": "sha512-qorBw8Y7B15DVLaJWy6WdEV/ZkieBcu6QCq/xzWzGOKJqgG1j754vXRfZ3NY7HSShneqU43mPB4OkQBTkvHhFw==", "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.1", "has-symbols": "^1.0.1", "is-arguments": "^1.0.4", "is-map": "^2.0.1", "is-set": "^2.0.1", "is-string": "^1.0.5", "isarray": "^2.0.5" }, "dependencies": { "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true } } }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { "escape-string-regexp": "^1.0.5", "object-assign": "^4.1.0" } }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "requires": { "is-callable": "^1.1.3" } }, "foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "get-intrinsic": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1" } }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "globalyzer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" }, "globrex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { "ansi-regex": "^2.0.0" } }, "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "is-arguments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", "dev": true }, "is-bigint": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz", "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==", "dev": true }, "is-boolean-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", "dev": true }, "is-callable": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, "is-core-module": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz", "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==", "dev": true, "requires": { "has": "^1.0.3" } }, "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, "is-finite": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", "dev": true }, "is-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", "dev": true }, "is-negative-zero": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", "dev": true }, "is-number-object": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", "dev": true }, "is-regex": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", "dev": true, "requires": { "has-symbols": "^1.0.1" } }, "is-set": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", "dev": true }, "is-string": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", "dev": true }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { "has-symbols": "^1.0.1" } }, "is-typed-array": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz", "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==", "dev": true, "requires": { "available-typed-arrays": "^1.0.0", "es-abstract": "^1.17.4", "foreach": "^2.0.5", "has-symbols": "^1.0.1" }, "dependencies": { "es-abstract": { "version": "1.17.7", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } } } }, "is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", "dev": true }, "is-weakset": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "object-inspect": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", "dev": true }, "object-is": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.1" } }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", "has-symbols": "^1.0.1", "object-keys": "^1.1.1" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" } }, "parse-ms": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "plur": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", "dev": true }, "pretty-ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", "dev": true, "requires": { "is-finite": "^1.0.1", "parse-ms": "^1.0.0", "plur": "^1.0.0" } }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, "re-emitter": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz", "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=", "dev": true }, "readable-stream": { "version": "2.2.9", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", "dev": true, "requires": { "buffer-shims": "~1.0.0", "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "~1.0.0", "process-nextick-args": "~1.0.6", "string_decoder": "~1.0.0", "util-deprecate": "~1.0.1" } }, "regexp.prototype.flags": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" }, "dependencies": { "es-abstract": { "version": "1.17.7", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } } } }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, "resumer": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", "dev": true, "requires": { "through": "~2.3.4" } }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "side-channel": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.3.tgz", "integrity": "sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g==", "dev": true, "requires": { "es-abstract": "^1.18.0-next.0", "object-inspect": "^1.8.0" } }, "split": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz", "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=", "dev": true, "requires": { "through": "2" } }, "string.prototype.trim": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.2.tgz", "integrity": "sha512-b5yrbl3BXIjHau9Prk7U0RRYcUYdN4wGSVaqoBQS50CCE3KBuYU0TYRNPFCP7aVoNMX87HKThdMRVIP3giclKg==", "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.0" } }, "string.prototype.trimend": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz", "integrity": "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==", "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.1" } }, "string.prototype.trimstart": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz", "integrity": "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==", "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.1" } }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" } }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, "tap-out": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-2.1.0.tgz", "integrity": "sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw==", "dev": true, "requires": { "re-emitter": "1.1.3", "readable-stream": "2.2.9", "split": "1.0.0", "trim": "0.0.1" } }, "tap-spec": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-5.0.0.tgz", "integrity": "sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw==", "dev": true, "requires": { "chalk": "^1.0.0", "duplexer": "^0.1.1", "figures": "^1.4.0", "lodash": "^4.17.10", "pretty-ms": "^2.1.0", "repeat-string": "^1.5.2", "tap-out": "^2.1.0", "through2": "^2.0.0" } }, "tape": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/tape/-/tape-5.0.1.tgz", "integrity": "sha512-wVsOl2shKPcjdJdc8a+PwacvrOdJZJ57cLUXlxW4TQ2R6aihXwG0m0bKm4mA4wjtQNTaLMCrYNEb4f9fjHKUYQ==", "dev": true, "requires": { "deep-equal": "^2.0.3", "defined": "^1.0.0", "dotignore": "^0.1.2", "for-each": "^0.3.3", "function-bind": "^1.1.1", "glob": "^7.1.6", "has": "^1.0.3", "inherits": "^2.0.4", "is-regex": "^1.0.5", "minimist": "^1.2.5", "object-inspect": "^1.7.0", "object-is": "^1.1.2", "object.assign": "^4.1.0", "resolve": "^1.17.0", "resumer": "^0.0.0", "string.prototype.trim": "^1.2.1", "through": "^2.3.8" } }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" }, "dependencies": { "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" } } } }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", "dev": true }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "which-boxed-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz", "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==", "dev": true, "requires": { "is-bigint": "^1.0.0", "is-boolean-object": "^1.0.0", "is-number-object": "^1.0.3", "is-string": "^1.0.4", "is-symbol": "^1.0.2" } }, "which-collection": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", "dev": true, "requires": { "is-map": "^2.0.1", "is-set": "^2.0.1", "is-weakmap": "^2.0.1", "is-weakset": "^2.0.1" } }, "which-typed-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz", "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==", "dev": true, "requires": { "available-typed-arrays": "^1.0.2", "es-abstract": "^1.17.5", "foreach": "^2.0.5", "function-bind": "^1.1.1", "has-symbols": "^1.0.1", "is-typed-array": "^1.1.3" }, "dependencies": { "es-abstract": { "version": "1.17.7", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", "is-regex": "^1.1.1", "object-inspect": "^1.8.0", "object-keys": "^1.1.1", "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true } } } tiny-glob-0.2.9/package.json000066400000000000000000000012741404753442500157300ustar00rootroot00000000000000{ "name": "tiny-glob", "version": "0.2.9", "description": "Tiny and extremely fast globbing", "repository": "terkelg/tiny-glob", "types": "index.d.ts", "license": "MIT", "author": { "name": "Terkel Gjervig", "email": "terkel@terkel.com", "url": "https://terkel.com" }, "files": [ "*.js", "*.d.ts" ], "scripts": { "bench": "node bench", "test": "tape test/*.js | tap-spec" }, "dependencies": { "globalyzer": "0.1.0", "globrex": "^0.1.2" }, "devDependencies": { "tap-spec": "^5.0.0", "tape": "^5.0.1" }, "keywords": [ "glob", "globbing", "patterns", "wildcard", "pattern-matching", "expansion" ] } tiny-glob-0.2.9/readme.md000066400000000000000000000113601404753442500152160ustar00rootroot00000000000000

Tiny Glob

tiny glob

version CI downloads install size

Tiny and extremely fast library to match files and folders using glob patterns.


"Globs" is the common name for a specific type of pattern used to match files and folders. It's the patterns you type when you do stuff like `ls *.js` in your shell or put `src/*` in a `.gitignore` file. When used to match filenames, it's sometimes called a "wildcard". ## Install ``` npm install tiny-glob ``` ## Core Features - 🔥 **extremely fast:** ~350% faster than [node-glob](https://github.com/isaacs/node-glob) and ~230% faster than [fast-glob](https://github.com/mrmlnc/fast-glob) - 💪 **powerful:** supports advanced globbing patterns (`ExtGlob`) - 📦 **tiny**: only ~45 LOC with 2 small dependencies - 👫 **friendly**: simple and easy to use api - 🎭 **cross-platform**: supports both unix and windows ## Usage ```js const glob = require('tiny-glob'); (async function(){ let files = await glob('src/*/*.{js,md}'); // => [ ... ] array of matching files })(); ``` ## API ### glob(str, options) Type: `function`
Returns: `Array` Return array of matching files and folders This function is `async` and returns a promise. #### str Type: `String` The glob pattern to match against. > **OBS**: Please only use forward-slashes in glob expressions. Even on [windows](#windows) #### options.cwd Type: `String`
Default: `'.'` Change default working directory. #### options.dot Type: `Boolean`
Default: `false` Allow patterns to match filenames or directories that begin with a period (`.`). #### options.absolute Type: `Boolean`
Default: `false` Return matches as absolute paths. #### options.filesOnly Type: `Boolean`
Default: `false` Skip directories and return matched files only. #### options.flush Type: `Boolean`
Default: `false` Flush the internal cache object. ## Windows Though Windows may use `/`, `\`, or `\\` as path separators, you can **only** use forward-slashes (`/`) when specifying glob expressions. Any back-slashes (`\`) will be interpreted as escape characters instead of path separators. This is common across many glob-based modules; see [`node-glob`](https://github.com/isaacs/node-glob#windows) for corroboration. ## Benchmarks ``` glob x 13,405 ops/sec ±1.80% (85 runs sampled) fast-glob x 25,745 ops/sec ±2.76% (59 runs sampled) tiny-glob x 102,658 ops/sec ±0.79% (91 runs sampled) Fastest is tiny-glob ┌───────────┬─────────────────────────┬─────────────┬────────────────┐ │ Name │ Mean time │ Ops/sec │ Diff │ ├───────────┼─────────────────────────┼─────────────┼────────────────┤ │ glob │ 0.00007459990597268128 │ 13,404.843 │ N/A │ ├───────────┼─────────────────────────┼─────────────┼────────────────┤ │ fast-glob │ 0.000038842529587611705 │ 25,744.976 │ 92.06% faster │ ├───────────┼─────────────────────────┼─────────────┼────────────────┤ │ tiny-glob │ 0.00000974110141018254 │ 102,657.796 │ 298.75% faster │ └───────────┴─────────────────────────┴─────────────┴────────────────┘ ``` ## Advanced Globbing Learn more about advanced globbing - [Greg's Wiki](https://mywiki.wooledge.org/glob) - [Bash Extended Globbing](https://www.linuxjournal.com/content/bash-extended-globbing) ## License MIT © [Terkel Gjervig](https://terkel.com) tiny-glob-0.2.9/sync.d.ts000066400000000000000000000003371404753442500152070ustar00rootroot00000000000000type Options = { cwd?: string; dot?: boolean; absolute?: boolean; filesOnly?: boolean; flush?: boolean; }; type FilePath = string; declare function glob(str: string, opts?: Options): FilePath[]; export = glob; tiny-glob-0.2.9/sync.js000066400000000000000000000046171404753442500147600ustar00rootroot00000000000000const fs = require('fs'); const globrex = require('globrex'); const globalyzer = require('globalyzer'); const { join, resolve, relative } = require('path'); const isHidden = /(^|[\\\/])\.[^\\\/\.]/g; let CACHE = {}; function walk(output, prefix, lexer, opts, dirname='', level=0) { const rgx = lexer.segments[level]; const dir = resolve(opts.cwd, prefix, dirname); const files = fs.readdirSync(dir); const { dot, filesOnly } = opts; let i=0, len=files.length, file; let fullpath, relpath, stats, isMatch; for (; i < len; i++) { fullpath = join(dir, file=files[i]); relpath = dirname ? join(dirname, file) : file; if (!dot && isHidden.test(relpath)) continue; isMatch = lexer.regex.test(relpath); if ((stats=CACHE[relpath]) === void 0) { CACHE[relpath] = stats = fs.lstatSync(fullpath); } if (!stats.isDirectory()) { isMatch && output.push(relative(opts.cwd, fullpath)); continue; } if (rgx && !rgx.test(file)) continue; !filesOnly && isMatch && output.push(join(prefix, relpath)); walk(output, prefix, lexer, opts, relpath, rgx && rgx.toString() !== lexer.globstar && level + 1); } } /** * Find files using bash-like globbing. * All paths are normalized compared to node-glob. * @param {String} str Glob string * @param {String} [options.cwd='.'] Current working directory * @param {Boolean} [options.dot=false] Include dotfile matches * @param {Boolean} [options.absolute=false] Return absolute paths * @param {Boolean} [options.filesOnly=false] Do not include folders if true * @param {Boolean} [options.flush=false] Reset cache object * @returns {Array} array containing matching files */ module.exports = function (str, opts={}) { if (!str) return []; let glob = globalyzer(str); opts.cwd = opts.cwd || '.'; if (!glob.isGlob) { try { let resolved = resolve(opts.cwd, str); let dirent = fs.statSync(resolved); if (opts.filesOnly && !dirent.isFile()) return []; return opts.absolute ? [resolved] : [str]; } catch (err) { if (err.code != 'ENOENT') throw err; return []; } } if (opts.flush) CACHE = {}; let matches = []; const { path } = globrex(glob.glob, { filepath:true, globstar:true, extended:true }); path.globstar = path.globstar.toString(); walk(matches, glob.base, path, opts, '.', 0); return opts.absolute ? matches.map(x => resolve(opts.cwd, x)) : matches; }; tiny-glob-0.2.9/test/000077500000000000000000000000001404753442500144155ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/000077500000000000000000000000001404753442500162665ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/.a-hidden.txt000066400000000000000000000000001404753442500205440ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/a.js000066400000000000000000000000001404753442500170320ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/a.mp3000066400000000000000000000000001404753442500171150ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/a.txt000066400000000000000000000000001404753442500172350ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/b.js000066400000000000000000000000001404753442500170330ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/b.txt000066400000000000000000000000001404753442500172360ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/deep/000077500000000000000000000000001404753442500172035ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/deep/a/000077500000000000000000000000001404753442500174235ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/deep/a/e000066400000000000000000000000001404753442500175600ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/deep/b/000077500000000000000000000000001404753442500174245ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/deep/b/c/000077500000000000000000000000001404753442500176465ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/deep/b/c/d000066400000000000000000000000001404753442500200020ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/ond/000077500000000000000000000000001404753442500170465ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/ond/.b-hidden.txt000066400000000000000000000000001404753442500213250ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/ond/a.txt000066400000000000000000000000001404753442500200150ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/one/000077500000000000000000000000001404753442500170475ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/one/a.js000066400000000000000000000000001404753442500176130ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/one/a.md000066400000000000000000000000001404753442500175770ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/one/a.txt000066400000000000000000000000001404753442500200160ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/one/b.txt000066400000000000000000000000001404753442500200170ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/one/child/000077500000000000000000000000001404753442500201325ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/one/child/a.js000066400000000000000000000000001404753442500206760ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/one/child/a.md000066400000000000000000000000001404753442500206620ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/one/child/a.txt000066400000000000000000000000001404753442500211010ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/two/000077500000000000000000000000001404753442500170775ustar00rootroot00000000000000tiny-glob-0.2.9/test/fixtures/two/a.txt000066400000000000000000000000001404753442500200460ustar00rootroot00000000000000tiny-glob-0.2.9/test/glob.js000066400000000000000000000122141404753442500156760ustar00rootroot00000000000000const test = require('tape'); const { join, resolve } = require('path'); const { order, unixify } = require('./helpers'); const glob = require('../'); const cwd = join(__dirname, 'fixtures'); function isMatch(t, str, opts, arr) { arr = arr.map(unixify); return glob(str, opts).then(order).then(val => { t.same(val, arr); }); } test('glob: standard', async t => { t.plan(2); t.is(typeof glob, 'function', 'consturctor is a typeof function'); t.true(Array.isArray(await glob('')), 'returns array'); }); test('glob: glob', async t => { t.plan(14); t.same(await glob(''), []); t.same(await glob('.'), ['.']); t.same(await glob('./'), ['./']); await isMatch(t, 'test/fixtures', {}, ['test/fixtures']); // Ideal: test/fixtures/../fixture etc await isMatch(t, 'test/fixtures/../*', {}, [ 'test/fixtures', 'test/glob.js', 'test/helpers' ]); await isMatch(t, 'test/fixtures/*', {}, [ 'test/fixtures/a.js', 'test/fixtures/a.mp3', 'test/fixtures/a.txt', 'test/fixtures/b.js', 'test/fixtures/b.txt', 'test/fixtures/deep', 'test/fixtures/ond', 'test/fixtures/one', 'test/fixtures/two' ]); await isMatch(t, 'test/*.{js,txt}', {}, [ 'test/glob.js' ]); await isMatch(t, './test/*.{js,txt}', {}, [ 'test/glob.js' ]); // Ideal: ../[parent]/test/fixtures/a.mp3 await isMatch(t, '../tiny-glob/**/*.{mp3}', {}, ['test/fixtures/a.mp3']); await isMatch(t, 'test/fixtures/**/*.{mp3}', {}, ['test/fixtures/a.mp3']); await isMatch(t, 'tes[tp]/fixtures/**/*.{mp3}', {}, ['test/fixtures/a.mp3']); await isMatch(t, 'test/fixtures/**/a.js', {}, [ 'test/fixtures/a.js', 'test/fixtures/one/a.js', 'test/fixtures/one/child/a.js' ]); await isMatch(t, 'test/fixtures/**/b.{js,txt}', {}, [ 'test/fixtures/b.js', 'test/fixtures/b.txt', 'test/fixtures/one/b.txt' ]); await isMatch(t, '**/*.{txt,js}', { cwd }, [ 'a.js', 'a.txt', 'b.js', 'b.txt', 'ond/a.txt', 'one/a.js', 'one/a.txt', 'one/b.txt', 'one/child/a.js', 'one/child/a.txt', 'two/a.txt' ]); }); test("glob: path dosen't exist (without glob)", async t => { t.plan(1); await isMatch(t, 'z.js', { cwd }, [ ]); }); test('glob: options.cwd', async t => { t.plan(2); let dir = join(cwd, 'one', 'child'); await isMatch(t, '../*', { cwd:dir }, [ '../a.js', '../a.md', '../a.txt', '../b.txt', '../child' ]); // Ideal: ../child/a.js etc await isMatch(t, '../child/*', { cwd:dir }, [ 'a.js', 'a.md', 'a.txt' ]); }); test('glob: options.cwd (without glob)', async t => { t.plan(1); let dir = join(cwd, 'one', 'child'); await isMatch(t, '../child/a.js', { cwd:dir }, [ '../child/a.js' ]); }); test('glob: options.cwd (absolute)', async t => { t.plan(2); let dir = resolve(cwd, 'one', 'child'); let opts = { cwd:dir, absolute:true }; await isMatch(t, '../*', opts, [ resolve(dir, '../a.js'), resolve(dir, '../a.md'), resolve(dir, '../a.txt'), resolve(dir, '../b.txt'), resolve(dir) ]); // Ideal: ../child/a.js etc await isMatch(t, '../child/*', opts, [ resolve(dir, 'a.js'), resolve(dir, 'a.md'), resolve(dir, 'a.txt') ]); }); test('glob: options.dot', async t => { t.plan(2); await isMatch(t, 'test/fixtures/*.txt', { dot:true }, [ 'test/fixtures/.a-hidden.txt', 'test/fixtures/a.txt', 'test/fixtures/b.txt' ]); await isMatch(t, 'test/fixtures/*.txt', { dot:false }, [ 'test/fixtures/a.txt', 'test/fixtures/b.txt' ]); }); test('glob: options.absolute', async t => { t.plan(2); await isMatch(t, 'test/fixtures/*.txt', { absolute:true }, [ resolve('test/fixtures/a.txt'), resolve('test/fixtures/b.txt') ]); let dir = join(cwd, 'one', 'child'); await isMatch(t, '../*', { cwd:dir, absolute:true }, [ resolve(dir, '../a.js'), resolve(dir, '../a.md'), resolve(dir, '../a.txt'), resolve(dir, '../b.txt'), resolve(dir) ]); }); test('glob: options.absolute (without glob)', async t => { t.plan(1); let dir = join(cwd, 'one', 'child'); await isMatch(t, '../child/a.js', { cwd:dir, absolute:true }, [ resolve(dir, '../child/a.js') ]); }); test('glob: options.filesOnly', async t => { t.plan(2); await isMatch(t, 'test/fixtures/*', { filesOnly:true }, [ //'test/fixtures/.a-hidden.txt', 'test/fixtures/a.js', 'test/fixtures/a.mp3', 'test/fixtures/a.txt', 'test/fixtures/b.js', 'test/fixtures/b.txt' ]); await isMatch(t, 'test/fixtures/*', { filesOnly:false }, [ 'test/fixtures/a.js', 'test/fixtures/a.mp3', 'test/fixtures/a.txt', 'test/fixtures/b.js', 'test/fixtures/b.txt', 'test/fixtures/deep', 'test/fixtures/ond', 'test/fixtures/one', 'test/fixtures/two' ]); }); test('glob: options.filesOnly (without glob)', async t => { t.plan(2); await isMatch(t, 'test/fixtures/one', { filesOnly:true }, []); await isMatch(t, 'test/fixtures/one', { filesOnly:false }, [ 'test/fixtures/one', ]); }); test('glob: deep match with higher level siblings', async t => { t.plan(1); await isMatch(t, 'test/fixtures/deep/*/c/d', {}, [ 'test/fixtures/deep/b/c/d' ]); }); tiny-glob-0.2.9/test/helpers/000077500000000000000000000000001404753442500160575ustar00rootroot00000000000000tiny-glob-0.2.9/test/helpers/index.js000066400000000000000000000005251404753442500175260ustar00rootroot00000000000000const isWin = process.platform === 'win32'; // unixify path for cross-platform testing function unixify(str) { return isWin ? str.replace(/\\/g, '/') : str; } function toIgnore(str) { return !str.includes('.DS_Store'); } function order(arr) { return arr.filter(toIgnore).map(unixify).sort(); } module.exports = { unixify, order }; tiny-glob-0.2.9/tiny-glob.png000066400000000000000000000311041404753442500160470ustar00rootroot00000000000000PNG  IHDR8UPLTEYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLYLtRNSx c&>VjyqeQ<( pѭ_2\Й]!3O `60NX-@P1C*7vnJfzoH B#=uR?,FTbmۉ+d;Ũ:W"K}g%[5G^)|rwZ;s .8~Lth$S/a9'4iī{DAUM̓IYlEk0w-IDATxӇ@LΘLuß kC : : : : : :LP6=0C>!Ot@t': :DD|C>!Ot@t2їuCP$: : : : : : :ԉf<㥻z7wM_ |C[\ ÊMHp)f}H3_oMr|Gguj܄GմYϟѢ%DZn6kߡ#|$ ]:unUҵr(z = M9 LW ]= V:ܣB%*MC'Dz1alZ;Y ۹1!>p1Q=SqvޭhZj;0-`a,mLLMjJ{ax-OGBҖ: N{u!z/)Bj^A[BW3g1P!5i͡ cjGJZEI^Fǐfw9 է+ ݏЯ,'!Kho) LKbCteB$g9 }h5iɝ@k02AOJ&GR(tBt ݺv4Уzk"$s] bi` DG>S HjZ:TB|E ÕH]5Q }AwH-ߤ6ҷvn Q }kFZۄMv BZ\̰$6mHt"L+5 IN[ˋ;hg%L+LeD=hՌvB)t~p7CI̦{-TQ8l-enCz8ҳv6 B/ajbhk'ҳv B5a;o*vmFz}4еFŶ\LKh!S j:DDBWg*6 s"BWz$1sBWl *v%mDK_BWG*m;-5 oABWG3Ç7QuDĖ&ZJZAB?D-Z:-! ]]c$ї kD++؇$.LQ f"t(ZЍX GÙhy t6RS }t][R26 >r42,)tH%@MlBzrV8chcG-@§M+HͤY+D˵BW7#  oƧN&ZW ]:'Kha@2Gx$ќ*v0r=|gHSB6&:hy R [)'"msC pK,JQa=lR}O B/M )ttAOLB? +/\'Z.B/  B`OKlBUC ˴9؉;)DBWhnh-'пށDM'ЗD>MhZ-'6|x9~R ~hMTO ] tNsKh ?)t^χпIs7Ѳ~R }|sh,6oS ]GifP-߆BoGhll@'YB/yҏ1hyR AxM O)t/cu0}hhy1<z#oB?LcA^KC[ ]קQ^BW] R/̨"遬Щ}|7e>AKhxd~B!+h+h"rdIz }XlЏW>wi4qBB"[n6 ICQ$FE ˏEҎ6Q^=1D6*t/B C$hEpD6RQ{zMuD|@;M'+tBrð$?*tB AMr,T9DTv߈~ ӽ(I{7E?t~U%#~)+t= k#B?<W]9Kc`t~(+tt[߇D׳ [?uBdѥɐ躇+;Gۅc5kUG'*(҅*H]*D9BW܆+3+Ctg$Ҟ͙zH3+tIN >vN 2UL 2P X;+so,\3+taz0wBW >y8gBWLK5r&tK"W:L =r 3r%tSUb0AqykTz͑V,ɍ:axu"7BWz?HD =>jZzA.бjAQB=W9Bz)@ }Z>-Uxe%c,- \[zև>v@zJ+! ȎY =Cǻk!PYz^SZYBoP:Hd 8[gq4dt]г6t|LcEv+, }>DO\gehFC͐ӱe = CICO ;GcV(l 4莬%U]TgUۖ+j* }&YOZC =B@#o= y/,#]LO?!IZd[g)r%^`\[/}GNh/L](QG?og5E4WF! ~l7z;"P hZxC/! ^'Fʫ@ }5\_(4D<hb8EJ,|^ZJCUha(hhAsAJSwxABRTA Z C ]2K-KbH=4w$.EY8*6ژ.ЗoDzQrBRn2vF@KF)Āk_JZ{BKf)W{n=/> @.пOnBR迦{TQ }(:(t(>}%zl%kSQ to?dB]MKF)t (t(4SQ }}).Пs ]2JdžѵPQ +.WеYkdB/)tQڊBRc%t4(t,2dB=EK)ҭPa 0{ ]2MF+t4zpdBG.зKo=.ѥ@K)!N;? ]2OwCP SV ]"@o)3{wAK(̬P 2R(t~|u DBMG~] .Ѡ{ЍQ; ]tO%*2:P2 ]"C7l=MDB+mP- 1@.G(tQ@F D$)tQ@j0!(tF+\BbOc\Sjr4w ]:oLӄ ]_2*+tQuyc2$p8ˏ@h: ,%Lpԕ( ,BB@@!RFk0AC*iŀݕb)o̹͛{{ʄnf攞[ \ۼ\gD!)wDiZ_A=?oΓ˕xn& x:f+K辁Uox*Ƶca=hʉSswL(I L|Y:cH4,d̼\>4y8QA3ʉW"l?7FS&.1DB?Z=5TzfCug.mഓB+A<3`TZ%)>YJ 1khŴ /؝_҆J=Vп_]SHh]mhm)ӍGKe/Ў0|Zmw,!!GEh`˷6hRг0T'9 gi`ǻ`}rq`#AZeVWCz>m>ƅU~0dȽ_d}NPƅP=S:4 ݔ˩ =m+aB7!AgBZGX9¸[NlIvCw8Ǩ W>4q0ΣʙЧa; 9eeP9zU:O.78uT΄މNr B>ʙ'әy5_=3/S5 1ʠj&tv*署 i:4C0zfBXHG$Y9OL;ᶸ Rc/3--?t΀o ZC?Eb& n>t"8zg3ڇ0d20q1NP-zҟ6>>t_3㨖 }Gf}C/ HLY=Fj:/TʄwaiC8c22?2<2`}cvè p메 } OAMC/wJ1 =t&ݾR&k:jZlyr/1#d/Š[w K*thwE齥7> zR_6 鴺yO5mp߯gfzT?VslzC[B-K eoݵ>'*N5 ǯf;B_H&1 % Y͛\j]@^Ċp\z<*3x\mur =5& ҇jNykfrҚկxJuP5VQsjxZLEpAEWS)p;~{O;SK乩Tbeݡo [a^? WEe6Gpjz! E(Ϧл{Qj*h(e#HSu }?VAbv]J'=n"#u sJ}HV_J}kK_"(yG) IZ%Hj3!4#}ήt Å2)Q6[_)w(4҆=w#XP~h^^B?@ng_V>5 }$P!k} P{CTB̽p3:ezBVy q  Kг(q6h@֖^/RN9JHdfo"=-|Fp) EGB(ЗA(EuS>,ֆdNQdܦ %Bh^ǧR$ DPEkCBLJ 2! %nHG!vV~(MVr(.sTgR"2ِeb(pNo(jSbQ.FZB?B |zg |).SA,A/z(#r- NǮ<S迣( %XB7 N?I,(!%&XPaJ lD{YЏT7 „d_v օ~7TM&)Κj*CJ\B=ZT#C8.SC^ LjG(ߺCq( )OS?S ņ9u2TLp*SwR>FϬ }?TXDp8 ZޘA-ʺkCxn/BVOP,NGJg6(q( " UJ4b(օ~%Tx6S"$|ZޙAhea9Pz N{ q7 } %9t{ Cqxnӕ"Ւ!p^WH, C>w nS2B^%.R}(C$%u2)2fCGRZ*%YF͠D1\'2-U3%&CEI2>;Jpه`-?Q4" =5Rc<uR&tHG2t6 egCp| l }M,QCe(4E[KY7B)4Ah})TkC 8*GR$/),̭ֆ#9LpA0 g*$B(зAf/ERl֬0\BkD>(q7eC"C OPRuJe܍URo Cɶ:t(2 F F@| ;"RI<hOᖇ~AlR J>3B!WBY:"x=)s\GEiomS# U>Cw T+l;NAkBB[`}z2Ep2T=SǔoR*ю #8(.xg>.DzPl$lGC0 (tѡS~CO>"{(c Pl/l mSVeʼeUp~2E^b$;rl GCn,Ce:\- R֔^"qQtʍʇXBjz*͋iPcO(#y+ɥ\*v5Pl=0Up{n~IʉBNV*4C:u˂{Ew B/Ltm-Uw?ܲй&ץ܏p';bOImDXY* vr)WVT`#l~֡LS?R῔*;&'qĤRp>^doVƎKO t3}kB^8t5tlrߓ%>x\@^.-]RI)0Fjzs{C6֨7_mEFB\ὫYĖ[rWF _eo踓SC` 7WmVhz6;jz C\.yLн}m=N'hzs$]CGs6P7Y ndw0 Dz63;2|Cͤ4vON=NqeC yC@?4 .Ű~ JZg]R&>{@@G3Wh:n?t.tjBס{A@SoiW*VA 6: tMieWbCoQ\t{/4Vs'є6h4t}mZnBeC`'0[h[\7>oHBF:׆f>/ څ ;>_ʳڅ~p|hBIgC~D-}{CGЄ1:ц>ܟ hܮGlЄ4dր7KnM6á 4o΁2U/*tܚKGY~_wEw U֑ }=Siq2dc{t]T.wZб/dcV:CCV0⧦R?!d}[JXy7\^{6.tЁ~r"6=0 *^T~7TcCBm 06eSj"XC:xPY@(C2ika+x] EAк0tD=P)EhC J[Qu1*([ BHɏmJZjAy'c4bN9{9Nw}_ (_N0FQwfotۥK_F{N>2h\Przk__z{3aK7wۤ.qGsH>&iw~us`3M6;bE #F?Z#ݯ[ \Q`_މ*\7+$"