pax_global_header00006660000000000000000000000064137634401560014523gustar00rootroot0000000000000052 comment=d2ccc5cd20c77828817cd3acb639430eac4a884d ts-node-9.1.1/000077500000000000000000000000001376344015600131045ustar00rootroot00000000000000ts-node-9.1.1/.editorconfig000066400000000000000000000003071376344015600155610ustar00rootroot00000000000000# EditorConfig is awesome: http://EditorConfig.org root = true [*] indent_size = 2 indent_style = space end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true ts-node-9.1.1/.github/000077500000000000000000000000001376344015600144445ustar00rootroot00000000000000ts-node-9.1.1/.github/FUNDING.yml000066400000000000000000000000261376344015600162570ustar00rootroot00000000000000github: [blakeembrey] ts-node-9.1.1/.github/ISSUE_TEMPLATE/000077500000000000000000000000001376344015600166275ustar00rootroot00000000000000ts-node-9.1.1/.github/ISSUE_TEMPLATE/bug-report.md000066400000000000000000000012771376344015600212460ustar00rootroot00000000000000--- name: 'Bug report' about: 'Create a report to help us improve' --- ### Expected Behavior ### Actual Behavior ### Steps to reproduce the problem ### Minimal reproduction ### Specifications * ts-node version: * node version: * TypeScript version: * tsconfig.json, if you're using one: ``` {} ``` * Operating system and version: * If Windows, are you using WSL or WSL2?: ts-node-9.1.1/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000013721376344015600206220ustar00rootroot00000000000000--- contact_links: - name: Question about: "Please ask and answer usage questions on Stack Overflow." url: "https://stackoverflow.com/questions/tagged/ts-node" - name: Chat about: "Alternatively, you can use the TypeScript Community Discord." url: "https://discord.gg/typescript" - name: "Help! My Types Are Missing!" about: "This is likely a configuration problem. Check our README" url: "https://github.com/TypeStrong/ts-node/blob/master/README.md#help-my-types-are-missing" - name: "TSError or SyntaxError" about: "These errors come from TypeScript and node, respectively. Use StackOverflow or Discord for usage and configuration help." url: "https://stackoverflow.com/questions/tagged/ts-node" ts-node-9.1.1/.github/ISSUE_TEMPLATE/feature-request.md000066400000000000000000000004371376344015600222760ustar00rootroot00000000000000--- name: 'Feature request' about: 'Suggest an idea for this project' --- ### Desired Behavior ### Is this request related to a problem? ### Alternatives you've considered ### Additional context ts-node-9.1.1/.github/workflows/000077500000000000000000000000001376344015600165015ustar00rootroot00000000000000ts-node-9.1.1/.github/workflows/continuous-integration.yml000066400000000000000000000075451376344015600237660ustar00rootroot00000000000000name: Continuous Integration on: # branches pushed by collaborators push: branches: - master # pull request from non-collaborators pull_request: {} # nightly schedule: - cron: '0 0 * * *' jobs: lint-build: name: "Lint & Build" runs-on: ubuntu-latest steps: # checkout code - uses: actions/checkout@v2 # install node - name: Use Node.js 14 uses: actions/setup-node@v1 with: node-version: 14 # lint, build, test - run: npm install - run: npm run lint - run: npm run build - name: Upload package artifact uses: actions/upload-artifact@v1 with: name: ts-node-packed.tgz path: tests/ts-node-packed.tgz test: needs: lint-build name: "Test: ${{ matrix.os }}, node ${{ matrix.node }}, TS ${{ matrix.typescript }}" runs-on: ${{ matrix.os }}-latest strategy: fail-fast: false matrix: os: [ubuntu, windows] # Don't forget to add all new flavors to this list! flavor: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] include: # Node 10 - flavor: 1 node: 10 nodeFlag: 10 typescript: latest typescriptFlag: latest # Node 12.15 # TODO Add comments about why we test 12.15; I think git blame says it's because of an ESM behavioral change that happened at 12.16 - flavor: 2 node: 12.15 nodeFlag: 12_15 typescript: latest typescriptFlag: latest # Node 12 - flavor: 3 node: 12 nodeFlag: 12 typescript: latest typescriptFlag: latest # Node 14.13.0 # To test ESM builtin module resolution immediately before a node behavioral change: https://github.com/TypeStrong/ts-node/issues/1130 - flavor: 4 node: 14.13.0 nodeFlag: 14_13_0 typescript: latest typescriptFlag: latest # Node 14 - flavor: 5 node: 14 nodeFlag: 14 typescript: latest typescriptFlag: latest - flavor: 6 node: 14 nodeFlag: 14 typescript: 2.7 typescriptFlag: 2_7 - flavor: 7 node: 14 nodeFlag: 14 typescript: next typescriptFlag: next # Node 15 - flavor: 8 node: 15 nodeFlag: 15 typescript: latest typescriptFlag: latest downgradeNpm: true - flavor: 9 node: 15 nodeFlag: 15 typescript: 2.7 typescriptFlag: 2_7 downgradeNpm: true - flavor: 10 node: 15 nodeFlag: 15 typescript: next typescriptFlag: next downgradeNpm: true steps: # checkout code - uses: actions/checkout@v2 # install node - name: Use Node.js ${{ matrix.node }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node }} # lint, build, test # Downgrade from npm 7 to 6 because 7 still seems buggy to me - if: ${{ matrix.downgradeNpm }} run: npm install -g npm@6 - run: npm install - run: npm run build-nopack - name: Download package artifact uses: actions/download-artifact@v1 with: name: ts-node-packed.tgz path: tests/ - run: npm install typescript@${{ matrix.typescript }} --force - run: npm run test-cov - run: npm run coverage-report if: ${{ always() }} - name: Codecov if: ${{ always() }} uses: codecov/codecov-action@v1 with: flags: ${{ matrix.os }},node_${{ matrix.nodeFlag }},typescript_${{ matrix.typescriptFlag }} ts-node-9.1.1/.gitignore000066400000000000000000000002401376344015600150700ustar00rootroot00000000000000/node_modules/ /tests/node_modules/ .nyc_output/ coverage/ .DS_Store npm-debug.log dist/ tsconfig.schema.json tsconfig.schemastore-schema.json .idea/ /.vscode/ ts-node-9.1.1/.mocharc.js000066400000000000000000000000641376344015600151340ustar00rootroot00000000000000module.exports = { spec: ['dist/**/*.spec.js'] }; ts-node-9.1.1/LICENSE000066400000000000000000000021171376344015600141120ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) 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. ts-node-9.1.1/README.md000066400000000000000000000320741376344015600143710ustar00rootroot00000000000000# ![TypeScript Node](logo.svg?sanitize=true) [![NPM version][npm-image]][npm-url] [![NPM downloads][downloads-image]][downloads-url] [![Build status][github-actions-image]][github-actions-url] [![Test coverage][codecov-image]][codecov-url] > TypeScript execution and REPL for node.js, with source map support. **Works with `typescript@>=2.7`**. ### *Experimental ESM support* Native ESM support is currently experimental. For usage, limitations, and to provide feedback, see [#1007](https://github.com/TypeStrong/ts-node/issues/1007). ## Installation ```sh # Locally in your project. npm install -D typescript npm install -D ts-node # Or globally with TypeScript. npm install -g typescript npm install -g ts-node ``` **Tip:** Installing modules locally allows you to control and share the versions through `package.json`. TS Node will always resolve the compiler from `cwd` before checking relative to its own installation. ## Usage ### Shell ```sh # Execute a script as `node` + `tsc`. ts-node script.ts # Starts a TypeScript REPL. ts-node # Execute code with TypeScript. ts-node -e 'console.log("Hello, world!")' # Execute, and print, code with TypeScript. ts-node -p -e '"Hello, world!"' # Pipe scripts to execute with TypeScript. echo 'console.log("Hello, world!")' | ts-node # Equivalent to ts-node --script-mode ts-node-script scripts.ts # Equivalent to ts-node --transpile-only ts-node-transpile-only scripts.ts ``` ![TypeScript REPL](https://github.com/TypeStrong/ts-node/raw/master/screenshot.png) ### Shebang ```typescript #!/usr/bin/env ts-node-script console.log("Hello, world!") ``` `ts-node-script` is recommended because it enables `--script-mode`, discovering `tsconfig.json` relative to the script's location instead of `process.cwd()`. This makes scripts more portable. Passing CLI arguments via shebang is allowed on Mac but not Linux. For example, the following will fail on Linux: ``` #!/usr/bin/env ts-node --script-mode --transpile-only --files // This shebang is not portable. It only works on Mac ``` ### Programmatic You can require `ts-node` and register the loader for future requires by using `require('ts-node').register({ /* options */ })`. You can also use file shortcuts - `node -r ts-node/register` or `node -r ts-node/register/transpile-only` - depending on your preferences. **Note:** If you need to use advanced node.js CLI arguments (e.g. `--inspect`), use them with `node -r ts-node/register` instead of the `ts-node` CLI. #### Developers **TS Node** exports a `create()` function that can be used to initialize a TypeScript compiler that isn't registered to `require.extensions`, and it uses the same code as `register`. ### Mocha Mocha 6 ```sh mocha --require ts-node/register --watch-extensions ts,tsx "test/**/*.{ts,tsx}" [...args] ``` **Note:** `--watch-extensions` is only used in `--watch` mode. Mocha 7 ```sh mocha --require ts-node/register --extensions ts,tsx --watch --watch-files src 'tests/**/*.{ts,tsx}' [...args] ``` ### Tape ```sh ts-node node_modules/tape/bin/tape [...args] ``` ### Gulp ```sh # Create a `gulpfile.ts` and run `gulp`. gulp ``` ### Visual Studio Code Create a new node.js configuration, add `-r ts-node/register` to node args and move the `program` to the `args` list (so VS Code doesn't look for `outFiles`). ```json { "type": "node", "request": "launch", "name": "Launch Program", "runtimeArgs": [ "-r", "ts-node/register" ], "args": [ "${workspaceFolder}/index.ts" ] } ``` **Note:** If you are using the `--project ` command line argument as per the [Configuration Options](#configuration-options), and want to apply this same behavior when launching in VS Code, add an "env" key into the launch configuration: `"env": { "TS_NODE_PROJECT": "" }`. ### IntelliJ (and WebStorm) Create a new Node.js configuration and add `-r ts-node/register` to "Node parameters." **Note:** If you are using the `--project ` command line argument as per the [Configuration Options](#configuration-options), and want to apply this same behavior when launching in IntelliJ, specify under "Environment Variables": `TS_NODE_PROJECT=`. ## How It Works **TypeScript Node** works by registering the TypeScript compiler for `.tsx?` and `.jsx?` (when `allowJs == true`) extensions. When node.js has an extension registered (via `require.extensions`), it will use the extension internally for module resolution. When an extension is unknown to node.js, it handles the file as `.js` (JavaScript). By default, **TypeScript Node** avoids compiling files in `/node_modules/` for three reasons: 1. Modules should always be published in a format node.js can consume 2. Transpiling the entire dependency tree will make your project slower 3. Differing behaviours between TypeScript and node.js (e.g. ES2015 modules) can result in a project that works until you decide to support a feature natively from node.js **P.S.** This means if you don't register an extension, it is compiled as JavaScript. When `ts-node` is used with `allowJs`, JavaScript files are transpiled using the TypeScript compiler. ## Loading `tsconfig.json` **Typescript Node** loads `tsconfig.json` automatically. Use `--skip-project` to skip loading the `tsconfig.json`. It is resolved relative to `--dir` using [the same search behavior as `tsc`](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html). In `--script-mode`, this is the directory containing the script. Otherwise it is resolved relative to `process.cwd()`, which matches the behavior of `tsc`. Use `--project` to specify the path to your `tsconfig.json`, ignoring `--dir`. **Tip**: You can use `ts-node` together with [tsconfig-paths](https://www.npmjs.com/package/tsconfig-paths) to load modules according to the `paths` section in `tsconfig.json`. ## Configuration Options You can set options by passing them before the script path, via programmatic usage, via `tsconfig.json`, or via environment variables. ```sh ts-node --compiler ntypescript --project src/tsconfig.json hello-world.ts ``` **Note:** [`ntypescript`](https://github.com/TypeStrong/ntypescript#readme) is an example of a TypeScript-compatible `compiler`. ### CLI Options `ts-node` supports `--print` (`-p`), `--eval` (`-e`), `--require` (`-r`) and `--interactive` (`-i`) similar to the [node.js CLI options](https://nodejs.org/api/cli.html). * `-h, --help` Prints the help text * `-v, --version` Prints the version. `-vv` prints node and typescript compiler versions, too * `-s, --script-mode` Resolve config relative to the directory of the passed script instead of the current directory. Changes default of `--dir` ### CLI and Programmatic Options _The name of the environment variable and the option's default value are denoted in parentheses._ * `-T, --transpile-only` Use TypeScript's faster `transpileModule` (`TS_NODE_TRANSPILE_ONLY`, default: `false`) * `-H, --compiler-host` Use TypeScript's compiler host API (`TS_NODE_COMPILER_HOST`, default: `false`) * `-I, --ignore [pattern]` Override the path patterns to skip compilation (`TS_NODE_IGNORE`, default: `/node_modules/`) * `-P, --project [path]` Path to TypeScript JSON project file (`TS_NODE_PROJECT`) * `-C, --compiler [name]` Specify a custom TypeScript compiler (`TS_NODE_COMPILER`, default: `typescript`) * `-D, --ignore-diagnostics [code]` Ignore TypeScript warnings by diagnostic code (`TS_NODE_IGNORE_DIAGNOSTICS`) * `-O, --compiler-options [opts]` JSON object to merge with compiler options (`TS_NODE_COMPILER_OPTIONS`) * `--dir` Specify working directory for config resolution (`TS_NODE_CWD`, default: `process.cwd()`, or `dirname(scriptPath)` if `--script-mode`) * `--scope` Scope compiler to files within `cwd` (`TS_NODE_SCOPE`, default: `false`) * `--files` Load `files`, `include` and `exclude` from `tsconfig.json` on startup (`TS_NODE_FILES`, default: `false`) * `--pretty` Use pretty diagnostic formatter (`TS_NODE_PRETTY`, default: `false`) * `--skip-project` Skip project config resolution and loading (`TS_NODE_SKIP_PROJECT`, default: `false`) * `--skip-ignore` Skip ignore checks (`TS_NODE_SKIP_IGNORE`, default: `false`) * `--emit` Emit output files into `.ts-node` directory (`TS_NODE_EMIT`, default: `false`) * `--prefer-ts-exts` Re-order file extensions so that TypeScript imports are preferred (`TS_NODE_PREFER_TS_EXTS`, default: `false`) * `--log-error` Logs TypeScript errors to stderr instead of throwing exceptions (`TS_NODE_LOG_ERROR`, default: `false`) ### Programmatic-only Options * `transformers` `_ts.CustomTransformers | ((p: _ts.Program) => _ts.CustomTransformers)`: An object with transformers or a factory function that accepts a program and returns a transformers object to pass to TypeScript. Factory function cannot be used with `transpileOnly` flag * `readFile`: Custom TypeScript-compatible file reading function * `fileExists`: Custom TypeScript-compatible file existence function ### Options via tsconfig.json Most options can be specified by a `"ts-node"` object in `tsconfig.json` using their programmatic, camelCase names. For example, to enable `--transpile-only`: ```json // tsconfig.json { "ts-node": { "transpileOnly": true }, "compilerOptions": {} } ``` Our bundled [JSON schema](https://unpkg.com/browse/ts-node@8.8.2/tsconfig.schema.json) lists all compatible options. ## SyntaxError Any error that is not a `TSError` is from node.js (e.g. `SyntaxError`), and cannot be fixed by TypeScript or `ts-node`. These are runtime issues with your code. ### Import Statements There are two options when using `import` statements: compile them to CommonJS or use node's native ESM support. To compile to CommonJS, you must set `"module": "CommonJS"` in your `tsconfig.json` or compiler options. Node's native ESM support is currently experimental and so is `ts-node`'s ESM loader hook. For usage, limitations, and to provide feedback, see [#1007](https://github.com/TypeStrong/ts-node/issues/1007). ## Help! My Types Are Missing! **TypeScript Node** does _not_ use `files`, `include` or `exclude`, by default. This is because a large majority projects do not use all of the files in a project directory (e.g. `Gulpfile.ts`, runtime vs tests) and parsing every file for types slows startup time. Instead, `ts-node` starts with the script file (e.g. `ts-node index.ts`) and TypeScript resolves dependencies based on imports and references. For global definitions, you can use the `typeRoots` compiler option. This requires that your type definitions be structured as type packages (not loose TypeScript definition files). More details on how this works can be found in the [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types). Example `tsconfig.json`: ```json { "compilerOptions": { "typeRoots" : ["./node_modules/@types", "./typings"] } } ``` Example project structure: ```text / -- tsconfig.json -- typings/ -- / -- index.d.ts ``` Example module declaration file: ```typescript declare module '' { // module definitions go here } ``` For module definitions, you can use [`paths`](https://www.typescriptlang.org/docs/handbook/module-resolution.html#path-mapping): ```json { "compilerOptions": { "baseUrl": ".", "paths": { "custom-module-type": ["types/custom-module-type"] } } } ``` An alternative approach for definitions of third-party libraries are [triple-slash directives](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html). This may be helpful if you prefer not to change your TypeScript `compilerOptions` or structure your custom type definitions when using `typeRoots`. Below is an example of the triple-slash directive as a relative path within your project: ```typescript /// import UntypedJsLib from "untyped_js_lib" ``` **Tip:** If you _must_ use `files`, `include`, or `exclude`, enable `--files` flags or set `TS_NODE_FILES=true`. ## Watching and Restarting **TypeScript Node** compiles source code via `require()`, watching files and code reloads are out of scope for the project. If you want to restart the `ts-node` process on file change, existing node.js tools such as [nodemon](https://github.com/remy/nodemon), [onchange](https://github.com/Qard/onchange) and [node-dev](https://github.com/fgnass/node-dev) work. There's also [`ts-node-dev`](https://github.com/whitecolor/ts-node-dev), a modified version of [`node-dev`](https://github.com/fgnass/node-dev) using `ts-node` for compilation that will restart the process on file change. ## License MIT [npm-image]: https://img.shields.io/npm/v/ts-node.svg?style=flat [npm-url]: https://npmjs.org/package/ts-node [downloads-image]: https://img.shields.io/npm/dm/ts-node.svg?style=flat [downloads-url]: https://npmjs.org/package/ts-node [github-actions-image]: https://img.shields.io/github/workflow/status/TypeStrong/ts-node/Continuous%20Integration [github-actions-url]: https://github.com/TypeStrong/ts-node/actions?query=workflow%3A%22Continuous+Integration%22 [codecov-image]: https://codecov.io/gh/TypeStrong/ts-node/branch/master/graph/badge.svg [codecov-url]: https://codecov.io/gh/TypeStrong/ts-node ts-node-9.1.1/codecov.yml000066400000000000000000000007611376344015600152550ustar00rootroot00000000000000fixes: # Remap from npm-installed ts-node to root of project # This can take the place of ./scripts/rewrite-coverage-paths.js - "tests/node_modules/ts-node/::" coverage: status: patch: default: # Do not fail when `patch` coverage is low. When this fails, it is misleading and not necessarily bad. # For example if a patch changes 2 lines, and only one is covered, then patch coverage is 50%. target: 0% project: default: threshold: 1% ts-node-9.1.1/development-docs/000077500000000000000000000000001376344015600163545ustar00rootroot00000000000000ts-node-9.1.1/development-docs/isExternalLibraryImport.md000066400000000000000000000056131376344015600235410ustar00rootroot00000000000000## How we override isExternalLibraryImport `isExternalLibraryImport` is a boolean returned by node's module resolver that is `true` if the target module is inside a `node_modules` directory. This has 2x effects inside the compiler: a) compiler refuses to emit JS for external modules b) increments node_module depth +1, which affects `maxNodeModulesJsDepth` If someone `require()`s a file inside `node_modules`, we need to override this flag to overcome (a). ### ts-node's behavior - If TS's normal resolution deems a file is external, we might override this flag. - Is file's containing module directory marked as "must be internal"? - if yes, override as "internal" - if no, track this flag, and leave it as "external" When you try to `require()` a file that's previously been deemed "external", we mark the entire module's directory as "must be internal" and add the file to `rootFiles` to trigger a re-resolve. When you try to `require()` a file that's totally unknown to the compiler, we have to add it to `rootFiles` to trigger a recompile. This is a separate issue. ### Implementation notes In `updateMemoryCache`: - If file is not in rootFiles and is not known internal (either was never resolved or was resolved external) - mark module directory as "must be internal" - add file to rootFiles to either pull file into compilation or trigger re-resolve (will do both) TODO: WHAT IF WE MUST MARK FILEA INTERNAL; WILL FILEB AUTOMATICALLY GET THE SAME TREATMENT? TODO if `noResolve`, force adding to `rootFileNames`? TODO if `noResolve` are the resolvers called anyway? TODO eagerly classify .ts as internal, only use the "bucket" behavior for .js? - b/c externalModule and maxNodeModulesJsDepth only seems to affect typechecking of .js, not .ts ### Tests require() .ts file where TS didn't know about it before require() .js file where TS didn't know about it before, w/allowJs import {} ./node_modules/*/.ts import {} ./node_modules/*/.js w/allowJs (initially external; will be switched to internal) import {} ./node_modules/*/.ts from another file within node_modules import {} ./node_modules/*/.js from another file within node_modules require() from ./node_modules when it is ignored; ensure is not forced internal and maxNodeModulesJsDepth is respected (type info does not change) ### Keywords for searching TypeScript's source code These may jog my memory the next time I need to read TypeScript's source and remember how this works. currentNodeModulesDepth sourceFilesFoundSearchingNodeModules isExternalLibraryImport is used to increment currentNodeModulesDepth currentNodeModulesDepth is used to put things into sourceFilesFoundSearchingNodeModules https://github.com/microsoft/TypeScript/blob/ec338146166935069124572135119b57a3d2cd22/src/compiler/program.ts#L2384-L2398 getSourceFilesToEmit / sourceFileMayBeEmitted obeys internal "external" state, is responsible for preventing emit of external modules ts-node-9.1.1/development-docs/repl-api.md000066400000000000000000000013541376344015600204120ustar00rootroot00000000000000## How to create your own ts-node powered REPL - Create ts-node REPL service which includes EvalState - Create ts-node compiler service using EvalState-aware `readFile` and `fileExists` implementations from REPL - Bind REPL service to compiler service (chicken-and-egg problem necessitates late binding) - Either: - call REPL method start() to start a REPL - create your own node repl but pass it REPL service's nodeEval() function ``` import * as tsnode from 'ts-node'; const repl = tsnode.createRepl(); const service = tsnode.register({ ... options, ...repl.evalAwarePartialHost }); repl.setService(service); // Start it repl.start(); // or const nodeRepl = require('repl').start({ ...options, eval: repl.nodeEval }); ``` ts-node-9.1.1/dist-raw/000077500000000000000000000000001376344015600146365ustar00rootroot00000000000000ts-node-9.1.1/dist-raw/README.md000066400000000000000000000016131376344015600161160ustar00rootroot00000000000000The `dist-raw` directory contains JS sources that are distributed verbatim, not compiled nor typechecked via TS. To implement ESM support, we unfortunately must duplicate some of node's built-in functionality that is not exposed via an API. We have copy-pasted the necessary code from https://github.com/nodejs/node/tree/master/lib then modified it to suite our needs. Formatting may be intentionally bad to keep the diff as small as possible, to make it easier to merge upstream changes and understand our modifications. For example, when we need to wrap node's source code in a factory function, we will not indent the function body, to avoid whitespace changes in the diff. One obvious problem with this approach: the code has been pulled from one version of node, whereas users of ts-node run multiple versions of node. Users running node 12 may see that ts-node behaves like node 14, for example. ts-node-9.1.1/dist-raw/node-cjs-loader-utils.js000066400000000000000000000117731376344015600213110ustar00rootroot00000000000000// Copied from several files in node's source code. // https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/modules/cjs/loader.js // Each function and variable below must have a comment linking to the source in node's github repo. const path = require('path'); const packageJsonReader = require('./node-package-json-reader'); const {JSONParse} = require('./node-primordials'); module.exports.assertScriptCanLoadAsCJSImpl = assertScriptCanLoadAsCJSImpl; // copied from Module._extensions['.js'] // https://github.com/nodejs/node/blob/v15.3.0/lib/internal/modules/cjs/loader.js#L1113-L1120 function assertScriptCanLoadAsCJSImpl(filename) { const pkg = readPackageScope(filename); // Function require shouldn't be used in ES modules. if (pkg && pkg.data && pkg.data.type === 'module') { const parentPath = module.parent && module.parent.filename; const packageJsonPath = path.resolve(pkg.path, 'package.json'); throw createErrRequireEsm(filename, parentPath, packageJsonPath); } } // Copied from https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/modules/cjs/loader.js#L285-L301 function readPackageScope(checkPath) { const rootSeparatorIndex = checkPath.indexOf(path.sep); let separatorIndex; while ( (separatorIndex = checkPath.lastIndexOf(path.sep)) > rootSeparatorIndex ) { checkPath = checkPath.slice(0, separatorIndex); if (checkPath.endsWith(path.sep + 'node_modules')) return false; const pjson = readPackage(checkPath); if (pjson) return { path: checkPath, data: pjson }; } return false; } // Copied from https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/modules/cjs/loader.js#L249 const packageJsonCache = new Map(); // Copied from https://github.com/nodejs/node/blob/v15.3.0/lib/internal/modules/cjs/loader.js#L275-L304 function readPackage(requestPath) { const jsonPath = path.resolve(requestPath, 'package.json'); const existing = packageJsonCache.get(jsonPath); if (existing !== undefined) return existing; const result = packageJsonReader.read(jsonPath); const json = result.containsKeys === false ? '{}' : result.string; if (json === undefined) { packageJsonCache.set(jsonPath, false); return false; } try { const parsed = JSONParse(json); const filtered = { name: parsed.name, main: parsed.main, exports: parsed.exports, imports: parsed.imports, type: parsed.type }; packageJsonCache.set(jsonPath, filtered); return filtered; } catch (e) { e.path = jsonPath; e.message = 'Error parsing ' + jsonPath + ': ' + e.message; throw e; } } // Native ERR_REQUIRE_ESM Error is declared here: // https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/errors.js#L1294-L1313 // Error class factory is implemented here: // function E: https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/errors.js#L323-L341 // function makeNodeErrorWithCode: https://github.com/nodejs/node/blob/2d5d77306f6dff9110c1f77fefab25f973415770/lib/internal/errors.js#L251-L278 // The code below should create an error that matches the native error as closely as possible. // Third-party libraries which attempt to catch the native ERR_REQUIRE_ESM should recognize our imitation error. function createErrRequireEsm(filename, parentPath, packageJsonPath) { const code = 'ERR_REQUIRE_ESM' const err = new Error(getMessage(filename, parentPath, packageJsonPath)) // Set `name` to be used in stack trace, generate stack trace with that name baked in, then re-declare the `name` field. // This trick is copied from node's source. err.name = `Error [${ code }]` err.stack Object.defineProperty(err, 'name', { value: 'Error', enumerable: false, writable: true, configurable: true }) err.code = code return err // Copy-pasted from https://github.com/nodejs/node/blob/b533fb3508009e5f567cc776daba8fbf665386a6/lib/internal/errors.js#L1293-L1311 // so that our error message is identical to the native message. function getMessage(filename, parentPath = null, packageJsonPath = null) { const ext = path.extname(filename) let msg = `Must use import to load ES Module: ${filename}`; if (parentPath && packageJsonPath) { const path = require('path'); const basename = path.basename(filename) === path.basename(parentPath) ? filename : path.basename(filename); msg += '\nrequire() of ES modules is not supported.\nrequire() of ' + `${filename} ${parentPath ? `from ${parentPath} ` : ''}` + `is an ES module file as it is a ${ext} file whose nearest parent ` + `package.json contains "type": "module" which defines all ${ext} ` + 'files in that package scope as ES modules.\nInstead ' + 'change the requiring code to use ' + 'import(), or remove "type": "module" from ' + `${packageJsonPath}.\n`; return msg; } return msg; } } ts-node-9.1.1/dist-raw/node-errors.js000066400000000000000000000020141376344015600174300ustar00rootroot00000000000000exports.codes = { ERR_INPUT_TYPE_NOT_ALLOWED: createErrorCtor('ERR_INPUT_TYPE_NOT_ALLOWED'), ERR_INVALID_ARG_VALUE: createErrorCtor('ERR_INVALID_ARG_VALUE'), ERR_INVALID_MODULE_SPECIFIER: createErrorCtor('ERR_INVALID_MODULE_SPECIFIER'), ERR_INVALID_PACKAGE_CONFIG: createErrorCtor('ERR_INVALID_PACKAGE_CONFIG'), ERR_INVALID_PACKAGE_TARGET: createErrorCtor('ERR_INVALID_PACKAGE_TARGET'), ERR_MANIFEST_DEPENDENCY_MISSING: createErrorCtor('ERR_MANIFEST_DEPENDENCY_MISSING'), ERR_MODULE_NOT_FOUND: createErrorCtor('ERR_MODULE_NOT_FOUND'), ERR_PACKAGE_IMPORT_NOT_DEFINED: createErrorCtor('ERR_PACKAGE_IMPORT_NOT_DEFINED'), ERR_PACKAGE_PATH_NOT_EXPORTED: createErrorCtor('ERR_PACKAGE_PATH_NOT_EXPORTED'), ERR_UNSUPPORTED_DIR_IMPORT: createErrorCtor('ERR_UNSUPPORTED_DIR_IMPORT'), ERR_UNSUPPORTED_ESM_URL_SCHEME: createErrorCtor('ERR_UNSUPPORTED_ESM_URL_SCHEME'), } function createErrorCtor(name) { return class CustomError extends Error { constructor(...args) { super([name, ...args].join(' ')) } } } ts-node-9.1.1/dist-raw/node-esm-resolve-implementation.js000066400000000000000000000773701376344015600234210ustar00rootroot00000000000000// Copied from https://raw.githubusercontent.com/nodejs/node/v15.3.0/lib/internal/modules/esm/resolve.js // Then modified to suite our needs. // Formatting is intentionally bad to keep the diff as small as possible, to make it easier to merge // upstream changes and understand our modifications. 'use strict'; const [nodeMajor, nodeMinor, nodePatch] = process.versions.node.split('.').map(s => parseInt(s, 10)) // Test for 14.13.1 or higher const builtinModuleProtocol = nodeMajor > 14 || ( nodeMajor === 14 && ( nodeMinor > 13 || ( nodeMinor === 13 && nodePatch > 0 ) ) ) ? 'node:' : 'nodejs:'; const { ArrayIsArray, ArrayPrototypeJoin, ArrayPrototypeShift, JSONParse, JSONStringify, ObjectFreeze, ObjectGetOwnPropertyNames, ObjectPrototypeHasOwnProperty, // RegExp, RegExpPrototypeTest, SafeMap, SafeSet, // String, StringPrototypeEndsWith, StringPrototypeIndexOf, StringPrototypeLastIndexOf, StringPrototypeReplace, StringPrototypeSlice, StringPrototypeSplit, StringPrototypeStartsWith, StringPrototypeSubstr, } = require('./node-primordials'); // const internalFS = require('internal/fs/utils'); // const { NativeModule } = require('internal/bootstrap/loaders'); const Module = require('module') const NativeModule = { canBeRequiredByUsers(specifier) { return Module.builtinModules.includes(specifier) } } const { realpathSync, statSync, Stats, } = require('fs'); // const { getOptionValue } = require('internal/options'); const { getOptionValue } = require('./node-options'); // // Do not eagerly grab .manifest, it may be in TDZ // const policy = getOptionValue('--experimental-policy') ? // require('internal/process/policy') : // null; // disabled for now. I am not sure if/how we should support this const policy = null; const { sep, relative } = require('path'); const preserveSymlinks = getOptionValue('--preserve-symlinks'); const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); const typeFlag = getOptionValue('--input-type'); // const { URL, pathToFileURL, fileURLToPath } = require('internal/url'); const { URL, pathToFileURL, fileURLToPath } = require('url'); const { ERR_INPUT_TYPE_NOT_ALLOWED, ERR_INVALID_ARG_VALUE, ERR_INVALID_MODULE_SPECIFIER, ERR_INVALID_PACKAGE_CONFIG, ERR_INVALID_PACKAGE_TARGET, ERR_MANIFEST_DEPENDENCY_MISSING, ERR_MODULE_NOT_FOUND, ERR_PACKAGE_IMPORT_NOT_DEFINED, ERR_PACKAGE_PATH_NOT_EXPORTED, ERR_UNSUPPORTED_DIR_IMPORT, ERR_UNSUPPORTED_ESM_URL_SCHEME, // } = require('internal/errors').codes; } = require('./node-errors').codes; // const { Module: CJSModule } = require('internal/modules/cjs/loader'); const CJSModule = Module; // const packageJsonReader = require('internal/modules/package_json_reader'); const packageJsonReader = require('./node-package-json-reader'); const userConditions = getOptionValue('--conditions'); const DEFAULT_CONDITIONS = ObjectFreeze(['node', 'import', ...userConditions]); const DEFAULT_CONDITIONS_SET = new SafeSet(DEFAULT_CONDITIONS); const pendingDeprecation = getOptionValue('--pending-deprecation'); function createResolve(opts) { // TODO receive cached fs implementations here const {tsExtensions, jsExtensions, preferTsExts} = opts; const emittedPackageWarnings = new SafeSet(); function emitFolderMapDeprecation(match, pjsonUrl, isExports, base) { const pjsonPath = fileURLToPath(pjsonUrl); if (!pendingDeprecation) { const nodeModulesIndex = StringPrototypeLastIndexOf(pjsonPath, '/node_modules/'); if (nodeModulesIndex !== -1) { const afterNodeModulesPath = StringPrototypeSlice(pjsonPath, nodeModulesIndex + 14, -13); try { const { packageSubpath } = parsePackageName(afterNodeModulesPath); if (packageSubpath === '.') return; } catch {} } } if (emittedPackageWarnings.has(pjsonPath + '|' + match)) return; emittedPackageWarnings.add(pjsonPath + '|' + match); process.emitWarning( `Use of deprecated folder mapping "${match}" in the ${isExports ? '"exports"' : '"imports"'} field module resolution of the package at ${ pjsonPath}${base ? ` imported from ${fileURLToPath(base)}` : ''}.\n` + `Update this package.json to use a subpath pattern like "${match}*".`, 'DeprecationWarning', 'DEP0148' ); } function getConditionsSet(conditions) { if (conditions !== undefined && conditions !== DEFAULT_CONDITIONS) { if (!ArrayIsArray(conditions)) { throw new ERR_INVALID_ARG_VALUE('conditions', conditions, 'expected an array'); } return new SafeSet(conditions); } return DEFAULT_CONDITIONS_SET; } const realpathCache = new SafeMap(); const packageJSONCache = new SafeMap(); /* string -> PackageConfig */ function tryStatSync(path) { try { return statSync(path); } catch { return new Stats(); } } function getPackageConfig(path, specifier, base) { const existing = packageJSONCache.get(path); if (existing !== undefined) { return existing; } const source = packageJsonReader.read(path).string; if (source === undefined) { const packageConfig = { pjsonPath: path, exists: false, main: undefined, name: undefined, type: 'none', exports: undefined, imports: undefined, }; packageJSONCache.set(path, packageConfig); return packageConfig; } let packageJSON; try { packageJSON = JSONParse(source); } catch (error) { throw new ERR_INVALID_PACKAGE_CONFIG( path, (base ? `"${specifier}" from ` : '') + fileURLToPath(base || specifier), error.message ); } let { imports, main, name, type } = packageJSON; const { exports } = packageJSON; if (typeof imports !== 'object' || imports === null) imports = undefined; if (typeof main !== 'string') main = undefined; if (typeof name !== 'string') name = undefined; // Ignore unknown types for forwards compatibility if (type !== 'module' && type !== 'commonjs') type = 'none'; const packageConfig = { pjsonPath: path, exists: true, main, name, type, exports, imports, }; packageJSONCache.set(path, packageConfig); return packageConfig; } function getPackageScopeConfig(resolved) { let packageJSONUrl = new URL('./package.json', resolved); while (true) { const packageJSONPath = packageJSONUrl.pathname; if (StringPrototypeEndsWith(packageJSONPath, 'node_modules/package.json')) break; const packageConfig = getPackageConfig(fileURLToPath(packageJSONUrl), resolved); if (packageConfig.exists) return packageConfig; const lastPackageJSONUrl = packageJSONUrl; packageJSONUrl = new URL('../package.json', packageJSONUrl); // Terminates at root where ../package.json equals ../../package.json // (can't just check "/package.json" for Windows support). if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) break; } const packageJSONPath = fileURLToPath(packageJSONUrl); const packageConfig = { pjsonPath: packageJSONPath, exists: false, main: undefined, name: undefined, type: 'none', exports: undefined, imports: undefined, }; packageJSONCache.set(packageJSONPath, packageConfig); return packageConfig; } /* * Legacy CommonJS main resolution: * 1. let M = pkg_url + (json main field) * 2. TRY(M, M.js, M.json, M.node) * 3. TRY(M/index.js, M/index.json, M/index.node) * 4. TRY(pkg_url/index.js, pkg_url/index.json, pkg_url/index.node) * 5. NOT_FOUND */ function fileExists(url) { return tryStatSync(fileURLToPath(url)).isFile(); } function legacyMainResolve(packageJSONUrl, packageConfig, base) { let guess; if (packageConfig.main !== undefined) { // Note: fs check redundances will be handled by Descriptor cache here. if (fileExists(guess = new URL(`./${packageConfig.main}`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}.js`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}.json`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}.node`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}/index.js`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}/index.json`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}/index.node`, packageJSONUrl))) { return guess; } // Fallthrough. } if (fileExists(guess = new URL('./index.js', packageJSONUrl))) { return guess; } // So fs. if (fileExists(guess = new URL('./index.json', packageJSONUrl))) { return guess; } if (fileExists(guess = new URL('./index.node', packageJSONUrl))) { return guess; } // Not found. throw new ERR_MODULE_NOT_FOUND( fileURLToPath(new URL('.', packageJSONUrl)), fileURLToPath(base)); } function resolveExtensionsWithTryExactName(search) { if (fileExists(search)) return search; const resolvedReplacementExtension = resolveReplacementExtensions(search); if(resolvedReplacementExtension) return resolvedReplacementExtension; return resolveExtensions(search); } const extensions = Array.from(new Set([ ...(preferTsExts ? tsExtensions : []), '.js', ...jsExtensions, '.json', '.node', '.mjs', ...tsExtensions ])); function resolveExtensions(search) { for (let i = 0; i < extensions.length; i++) { const extension = extensions[i]; const guess = new URL(`${search.pathname}${extension}`, search); if (fileExists(guess)) return guess; } return undefined; } /** * TS's resolver can resolve foo.js to foo.ts, by replacing .js extension with several source extensions. * IMPORTANT: preserve ordering according to preferTsExts; this affects resolution behavior! */ const replacementExtensions = extensions.filter(ext => ['.js', '.jsx', '.ts', '.tsx'].includes(ext)); function resolveReplacementExtensions(search) { if (search.pathname.match(/\.js$/)) { const pathnameWithoutExtension = search.pathname.slice(0, search.pathname.length - 3); for (let i = 0; i < replacementExtensions.length; i++) { const extension = replacementExtensions[i]; const guess = new URL(search.toString()); guess.pathname = `${pathnameWithoutExtension}${extension}`; if (fileExists(guess)) return guess; } } return undefined; } function resolveIndex(search) { return resolveExtensions(new URL('index', search)); } const encodedSepRegEx = /%2F|%2C/i; function finalizeResolution(resolved, base) { if (RegExpPrototypeTest(encodedSepRegEx, resolved.pathname)) throw new ERR_INVALID_MODULE_SPECIFIER( resolved.pathname, 'must not include encoded "/" or "\\" characters', fileURLToPath(base)); if (getOptionValue('--experimental-specifier-resolution') === 'node') { const path = fileURLToPath(resolved); let file = resolveExtensionsWithTryExactName(resolved); if (file !== undefined) return file; if (!StringPrototypeEndsWith(path, '/')) { file = resolveIndex(new URL(`${resolved}/`)); if (file !== undefined) return file; } else { return resolveIndex(resolved) || resolved; } throw new ERR_MODULE_NOT_FOUND( resolved.pathname, fileURLToPath(base), 'module'); } const file = resolveReplacementExtensions(resolved) || resolved; const path = fileURLToPath(file); const stats = tryStatSync(StringPrototypeEndsWith(path, '/') ? StringPrototypeSlice(path, -1) : path); if (stats.isDirectory()) { const err = new ERR_UNSUPPORTED_DIR_IMPORT(path, fileURLToPath(base)); err.url = String(resolved); throw err; } else if (!stats.isFile()) { throw new ERR_MODULE_NOT_FOUND( path || resolved.pathname, fileURLToPath(base), 'module'); } return file; } function throwImportNotDefined(specifier, packageJSONUrl, base) { throw new ERR_PACKAGE_IMPORT_NOT_DEFINED( specifier, packageJSONUrl && fileURLToPath(new URL('.', packageJSONUrl)), fileURLToPath(base)); } function throwExportsNotFound(subpath, packageJSONUrl, base) { throw new ERR_PACKAGE_PATH_NOT_EXPORTED( fileURLToPath(new URL('.', packageJSONUrl)), subpath, base && fileURLToPath(base)); } function throwInvalidSubpath(subpath, packageJSONUrl, internal, base) { const reason = `request is not a valid subpath for the "${internal ? 'imports' : 'exports'}" resolution of ${fileURLToPath(packageJSONUrl)}`; throw new ERR_INVALID_MODULE_SPECIFIER(subpath, reason, base && fileURLToPath(base)); } function throwInvalidPackageTarget( subpath, target, packageJSONUrl, internal, base) { if (typeof target === 'object' && target !== null) { target = JSONStringify(target, null, ''); } else { target = `${target}`; } throw new ERR_INVALID_PACKAGE_TARGET( fileURLToPath(new URL('.', packageJSONUrl)), subpath, target, internal, base && fileURLToPath(base)); } const invalidSegmentRegEx = /(^|\\|\/)(\.\.?|node_modules)(\\|\/|$)/; const patternRegEx = /\*/g; function resolvePackageTargetString( target, subpath, match, packageJSONUrl, base, pattern, internal, conditions) { if (subpath !== '' && !pattern && target[target.length - 1] !== '/') throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); if (!StringPrototypeStartsWith(target, './')) { if (internal && !StringPrototypeStartsWith(target, '../') && !StringPrototypeStartsWith(target, '/')) { let isURL = false; try { new URL(target); isURL = true; } catch {} if (!isURL) { const exportTarget = pattern ? StringPrototypeReplace(target, patternRegEx, subpath) : target + subpath; return packageResolve(exportTarget, packageJSONUrl, conditions); } } throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); } if (RegExpPrototypeTest(invalidSegmentRegEx, StringPrototypeSlice(target, 2))) throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); const resolved = new URL(target, packageJSONUrl); const resolvedPath = resolved.pathname; const packagePath = new URL('.', packageJSONUrl).pathname; if (!StringPrototypeStartsWith(resolvedPath, packagePath)) throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); if (subpath === '') return resolved; if (RegExpPrototypeTest(invalidSegmentRegEx, subpath)) throwInvalidSubpath(match + subpath, packageJSONUrl, internal, base); if (pattern) return new URL(StringPrototypeReplace(resolved.href, patternRegEx, subpath)); return new URL(subpath, resolved); } /** * @param {string} key * @returns {boolean} */ function isArrayIndex(key) { const keyNum = +key; if (`${keyNum}` !== key) return false; return keyNum >= 0 && keyNum < 0xFFFF_FFFF; } function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath, base, pattern, internal, conditions) { if (typeof target === 'string') { return resolvePackageTargetString( target, subpath, packageSubpath, packageJSONUrl, base, pattern, internal, conditions); } else if (ArrayIsArray(target)) { if (target.length === 0) return null; let lastException; for (let i = 0; i < target.length; i++) { const targetItem = target[i]; let resolved; try { resolved = resolvePackageTarget( packageJSONUrl, targetItem, subpath, packageSubpath, base, pattern, internal, conditions); } catch (e) { lastException = e; if (e.code === 'ERR_INVALID_PACKAGE_TARGET') continue; throw e; } if (resolved === undefined) continue; if (resolved === null) { lastException = null; continue; } return resolved; } if (lastException === undefined || lastException === null) return lastException; throw lastException; } else if (typeof target === 'object' && target !== null) { const keys = ObjectGetOwnPropertyNames(target); for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (isArrayIndex(key)) { throw new ERR_INVALID_PACKAGE_CONFIG( fileURLToPath(packageJSONUrl), base, '"exports" cannot contain numeric property keys.'); } } for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (key === 'default' || conditions.has(key)) { const conditionalTarget = target[key]; const resolved = resolvePackageTarget( packageJSONUrl, conditionalTarget, subpath, packageSubpath, base, pattern, internal, conditions); if (resolved === undefined) continue; return resolved; } } return undefined; } else if (target === null) { return null; } throwInvalidPackageTarget(packageSubpath, target, packageJSONUrl, internal, base); } function isConditionalExportsMainSugar(exports, packageJSONUrl, base) { if (typeof exports === 'string' || ArrayIsArray(exports)) return true; if (typeof exports !== 'object' || exports === null) return false; const keys = ObjectGetOwnPropertyNames(exports); let isConditionalSugar = false; let i = 0; for (let j = 0; j < keys.length; j++) { const key = keys[j]; const curIsConditionalSugar = key === '' || key[0] !== '.'; if (i++ === 0) { isConditionalSugar = curIsConditionalSugar; } else if (isConditionalSugar !== curIsConditionalSugar) { throw new ERR_INVALID_PACKAGE_CONFIG( fileURLToPath(packageJSONUrl), base, '"exports" cannot contain some keys starting with \'.\' and some not.' + ' The exports object must either be an object of package subpath keys' + ' or an object of main entry condition name keys only.'); } } return isConditionalSugar; } /** * @param {URL} packageJSONUrl * @param {string} packageSubpath * @param {object} packageConfig * @param {string} base * @param {Set} conditions * @returns {URL} */ function packageExportsResolve( packageJSONUrl, packageSubpath, packageConfig, base, conditions) { let exports = packageConfig.exports; if (isConditionalExportsMainSugar(exports, packageJSONUrl, base)) exports = { '.': exports }; if (ObjectPrototypeHasOwnProperty(exports, packageSubpath)) { const target = exports[packageSubpath]; const resolved = resolvePackageTarget( packageJSONUrl, target, '', packageSubpath, base, false, false, conditions ); if (resolved === null || resolved === undefined) throwExportsNotFound(packageSubpath, packageJSONUrl, base); return { resolved, exact: true }; } let bestMatch = ''; const keys = ObjectGetOwnPropertyNames(exports); for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (key[key.length - 1] === '*' && StringPrototypeStartsWith(packageSubpath, StringPrototypeSlice(key, 0, -1)) && packageSubpath.length >= key.length && key.length > bestMatch.length) { bestMatch = key; } else if (key[key.length - 1] === '/' && StringPrototypeStartsWith(packageSubpath, key) && key.length > bestMatch.length) { bestMatch = key; } } if (bestMatch) { const target = exports[bestMatch]; const pattern = bestMatch[bestMatch.length - 1] === '*'; const subpath = StringPrototypeSubstr(packageSubpath, bestMatch.length - (pattern ? 1 : 0)); const resolved = resolvePackageTarget(packageJSONUrl, target, subpath, bestMatch, base, pattern, false, conditions); if (resolved === null || resolved === undefined) throwExportsNotFound(packageSubpath, packageJSONUrl, base); if (!pattern) emitFolderMapDeprecation(bestMatch, packageJSONUrl, true, base); return { resolved, exact: pattern }; } throwExportsNotFound(packageSubpath, packageJSONUrl, base); } function packageImportsResolve(name, base, conditions) { if (name === '#' || StringPrototypeStartsWith(name, '#/')) { const reason = 'is not a valid internal imports specifier name'; throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, fileURLToPath(base)); } let packageJSONUrl; const packageConfig = getPackageScopeConfig(base); if (packageConfig.exists) { packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); const imports = packageConfig.imports; if (imports) { if (ObjectPrototypeHasOwnProperty(imports, name)) { const resolved = resolvePackageTarget( packageJSONUrl, imports[name], '', name, base, false, true, conditions ); if (resolved !== null) return { resolved, exact: true }; } else { let bestMatch = ''; const keys = ObjectGetOwnPropertyNames(imports); for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (key[key.length - 1] === '*' && StringPrototypeStartsWith(name, StringPrototypeSlice(key, 0, -1)) && name.length >= key.length && key.length > bestMatch.length) { bestMatch = key; } else if (key[key.length - 1] === '/' && StringPrototypeStartsWith(name, key) && key.length > bestMatch.length) { bestMatch = key; } } if (bestMatch) { const target = imports[bestMatch]; const pattern = bestMatch[bestMatch.length - 1] === '*'; const subpath = StringPrototypeSubstr(name, bestMatch.length - (pattern ? 1 : 0)); const resolved = resolvePackageTarget( packageJSONUrl, target, subpath, bestMatch, base, pattern, true, conditions); if (resolved !== null) { if (!pattern) emitFolderMapDeprecation(bestMatch, packageJSONUrl, false, base); return { resolved, exact: pattern }; } } } } } throwImportNotDefined(name, packageJSONUrl, base); } function getPackageType(url) { const packageConfig = getPackageScopeConfig(url); return packageConfig.type; } function parsePackageName(specifier, base) { let separatorIndex = StringPrototypeIndexOf(specifier, '/'); let validPackageName = true; let isScoped = false; if (specifier[0] === '@') { isScoped = true; if (separatorIndex === -1 || specifier.length === 0) { validPackageName = false; } else { separatorIndex = StringPrototypeIndexOf( specifier, '/', separatorIndex + 1); } } const packageName = separatorIndex === -1 ? specifier : StringPrototypeSlice(specifier, 0, separatorIndex); // Package name cannot have leading . and cannot have percent-encoding or // separators. for (let i = 0; i < packageName.length; i++) { if (packageName[i] === '%' || packageName[i] === '\\') { validPackageName = false; break; } } if (!validPackageName) { throw new ERR_INVALID_MODULE_SPECIFIER( specifier, 'is not a valid package name', fileURLToPath(base)); } const packageSubpath = '.' + (separatorIndex === -1 ? '' : StringPrototypeSlice(specifier, separatorIndex)); return { packageName, packageSubpath, isScoped }; } /** * @param {string} specifier * @param {URL} base * @param {Set} conditions * @returns {URL} */ function packageResolve(specifier, base, conditions) { const { packageName, packageSubpath, isScoped } = parsePackageName(specifier, base); // ResolveSelf const packageConfig = getPackageScopeConfig(base); if (packageConfig.exists) { const packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); if (packageConfig.name === packageName && packageConfig.exports !== undefined && packageConfig.exports !== null) { return packageExportsResolve( packageJSONUrl, packageSubpath, packageConfig, base, conditions ).resolved; } } let packageJSONUrl = new URL('./node_modules/' + packageName + '/package.json', base); let packageJSONPath = fileURLToPath(packageJSONUrl); let lastPath; do { const stat = tryStatSync(StringPrototypeSlice(packageJSONPath, 0, packageJSONPath.length - 13)); if (!stat.isDirectory()) { lastPath = packageJSONPath; packageJSONUrl = new URL((isScoped ? '../../../../node_modules/' : '../../../node_modules/') + packageName + '/package.json', packageJSONUrl); packageJSONPath = fileURLToPath(packageJSONUrl); continue; } // Package match. const packageConfig = getPackageConfig(packageJSONPath, specifier, base); if (packageConfig.exports !== undefined && packageConfig.exports !== null) return packageExportsResolve( packageJSONUrl, packageSubpath, packageConfig, base, conditions ).resolved; if (packageSubpath === '.') return legacyMainResolve(packageJSONUrl, packageConfig, base); return new URL(packageSubpath, packageJSONUrl); // Cross-platform root check. } while (packageJSONPath.length !== lastPath.length); // eslint can't handle the above code. // eslint-disable-next-line no-unreachable throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base)); } function isBareSpecifier(specifier) { return specifier[0] && specifier[0] !== '/' && specifier[0] !== '.'; } function isRelativeSpecifier(specifier) { if (specifier[0] === '.') { if (specifier.length === 1 || specifier[1] === '/') return true; if (specifier[1] === '.') { if (specifier.length === 2 || specifier[2] === '/') return true; } } return false; } function shouldBeTreatedAsRelativeOrAbsolutePath(specifier) { if (specifier === '') return false; if (specifier[0] === '/') return true; return isRelativeSpecifier(specifier); } /** * @param {string} specifier * @param {URL} base * @param {Set} conditions * @returns {URL} */ function moduleResolve(specifier, base, conditions) { // Order swapped from spec for minor perf gain. // Ok since relative URLs cannot parse as URLs. let resolved; if (shouldBeTreatedAsRelativeOrAbsolutePath(specifier)) { resolved = new URL(specifier, base); } else if (specifier[0] === '#') { ({ resolved } = packageImportsResolve(specifier, base, conditions)); } else { try { resolved = new URL(specifier); } catch { resolved = packageResolve(specifier, base, conditions); } } return finalizeResolution(resolved, base); } /** * Try to resolve an import as a CommonJS module * @param {string} specifier * @param {string} parentURL * @returns {boolean|string} */ function resolveAsCommonJS(specifier, parentURL) { try { const parent = fileURLToPath(parentURL); const tmpModule = new CJSModule(parent, null); tmpModule.paths = CJSModule._nodeModulePaths(parent); let found = CJSModule._resolveFilename(specifier, tmpModule, false); // If it is a relative specifier return the relative path // to the parent if (isRelativeSpecifier(specifier)) { found = relative(parent, found); // Add '.separator if the path does not start with '..separator' // This should be a safe assumption because when loading // esm modules there should be always a file specified so // there should not be a specifier like '..' or '.' if (!StringPrototypeStartsWith(found, `..${sep}`)) { found = `.${sep}${found}`; } } else if (isBareSpecifier(specifier)) { // If it is a bare specifier return the relative path within the // module const pkg = StringPrototypeSplit(specifier, '/')[0]; const index = StringPrototypeIndexOf(found, pkg); if (index !== -1) { found = StringPrototypeSlice(found, index); } } // Normalize the path separator to give a valid suggestion // on Windows if (process.platform === 'win32') { found = StringPrototypeReplace(found, new RegExp(`\\${sep}`, 'g'), '/'); } return found; } catch { return false; } } function defaultResolve(specifier, context = {}, defaultResolveUnused) { let { parentURL, conditions } = context; if (parentURL && policy != null && policy.manifest) { const redirects = policy.manifest.getDependencyMapper(parentURL); if (redirects) { const { resolve, reaction } = redirects; const destination = resolve(specifier, new SafeSet(conditions)); let missing = true; if (destination === true) { missing = false; } else if (destination) { const href = destination.href; return { url: href }; } if (missing) { reaction(new ERR_MANIFEST_DEPENDENCY_MISSING( parentURL, specifier, ArrayPrototypeJoin([...conditions], ', ')) ); } } } let parsed; try { parsed = new URL(specifier); if (parsed.protocol === 'data:') { return { url: specifier }; } } catch {} if (parsed && parsed.protocol === builtinModuleProtocol) return { url: specifier }; if (parsed && parsed.protocol !== 'file:' && parsed.protocol !== 'data:') throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(parsed); if (NativeModule.canBeRequiredByUsers(specifier)) { return { url: builtinModuleProtocol + specifier }; } if (parentURL && StringPrototypeStartsWith(parentURL, 'data:')) { // This is gonna blow up, we want the error new URL(specifier, parentURL); } const isMain = parentURL === undefined; if (isMain) { parentURL = pathToFileURL(`${process.cwd()}/`).href; // This is the initial entry point to the program, and --input-type has // been passed as an option; but --input-type can only be used with // --eval, --print or STDIN string input. It is not allowed with file // input, to avoid user confusion over how expansive the effect of the // flag should be (i.e. entry point only, package scope surrounding the // entry point, etc.). if (typeFlag) throw new ERR_INPUT_TYPE_NOT_ALLOWED(); } conditions = getConditionsSet(conditions); let url; try { url = moduleResolve(specifier, parentURL, conditions); } catch (error) { // Try to give the user a hint of what would have been the // resolved CommonJS module if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'ERR_UNSUPPORTED_DIR_IMPORT') { if (StringPrototypeStartsWith(specifier, 'file://')) { specifier = fileURLToPath(specifier); } const found = resolveAsCommonJS(specifier, parentURL); if (found) { // Modify the stack and message string to include the hint const lines = StringPrototypeSplit(error.stack, '\n'); const hint = `Did you mean to import ${found}?`; error.stack = ArrayPrototypeShift(lines) + '\n' + hint + '\n' + ArrayPrototypeJoin(lines, '\n'); error.message += `\n${hint}`; } } throw error; } if (isMain ? !preserveSymlinksMain : !preserveSymlinks) { const urlPath = fileURLToPath(url); const real = realpathSync(urlPath, { // [internalFS.realpathCacheKey]: realpathCache }); const old = url; url = pathToFileURL( real + (StringPrototypeEndsWith(urlPath, sep) ? '/' : '')); url.search = old.search; url.hash = old.hash; } return { url: `${url}` }; } return { DEFAULT_CONDITIONS, defaultResolve, encodedSepRegEx, getPackageType, packageExportsResolve, packageImportsResolve }; } module.exports = { createResolve }; ts-node-9.1.1/dist-raw/node-internal-fs.js000066400000000000000000000012351376344015600203420ustar00rootroot00000000000000const fs = require('fs'); // In node's core, this is implemented in C // https://github.com/nodejs/node/blob/v15.3.0/src/node_file.cc#L891-L985 function internalModuleReadJSON(path) { let string try { string = fs.readFileSync(path, 'utf8') } catch (e) { if (e.code === 'ENOENT') return [] throw e } // Node's implementation checks for the presence of relevant keys: main, name, type, exports, imports // Node does this for performance to skip unnecessary parsing. // This would slow us down and, based on our usage, we can skip it. const containsKeys = true return [string, containsKeys] } module.exports = { internalModuleReadJSON }; ts-node-9.1.1/dist-raw/node-options.js000066400000000000000000000055231376344015600176170ustar00rootroot00000000000000// Replacement for node's internal 'internal/options' module exports.getOptionValue = getOptionValue; function getOptionValue(opt) { parseOptions(); return options[opt]; } let options; function parseOptions() { if (!options) { options = { '--preserve-symlinks': false, '--preserve-symlinks-main': false, '--input-type': undefined, '--experimental-specifier-resolution': 'explicit', '--experimental-policy': undefined, '--conditions': [], '--pending-deprecation': false, ...parseArgv(getNodeOptionsEnvArgv()), ...parseArgv(process.execArgv), ...getOptionValuesFromOtherEnvVars() } } } function parseArgv(argv) { return require('arg')({ '--preserve-symlinks': Boolean, '--preserve-symlinks-main': Boolean, '--input-type': String, '--experimental-specifier-resolution': String, // Legacy alias for node versions prior to 12.16 '--es-module-specifier-resolution': '--experimental-specifier-resolution', '--experimental-policy': String, '--conditions': [String], '--pending-deprecation': Boolean }, { argv, permissive: true }); } function getNodeOptionsEnvArgv() { const errors = []; const envArgv = ParseNodeOptionsEnvVar(process.env.NODE_OPTIONS || '', errors); if (errors.length !== 0) { // TODO: handle errors somehow } return envArgv; } // Direct JS port of C implementation: https://github.com/nodejs/node/blob/67ba825037b4082d5d16f922fb9ce54516b4a869/src/node_options.cc#L1024-L1063 function ParseNodeOptionsEnvVar(node_options, errors) { const env_argv = []; let is_in_string = false; let will_start_new_arg = true; for (let index = 0; index < node_options.length; ++index) { let c = node_options[index]; // Backslashes escape the following character if (c === '\\' && is_in_string) { if (index + 1 === node_options.length) { errors.push("invalid value for NODE_OPTIONS " + "(invalid escape)\n"); return env_argv; } else { c = node_options[++index]; } } else if (c === ' ' && !is_in_string) { will_start_new_arg = true; continue; } else if (c === '"') { is_in_string = !is_in_string; continue; } if (will_start_new_arg) { env_argv.push(c); will_start_new_arg = false; } else { env_argv[env_argv.length - 1] += c; } } if (is_in_string) { errors.push("invalid value for NODE_OPTIONS " + "(unterminated string)\n"); } return env_argv; } // Get option values that can be specified via env vars besides NODE_OPTIONS function getOptionValuesFromOtherEnvVars() { const options = {}; if(process.env.NODE_PENDING_DEPRECATION === '1') { options['--pending-deprecation'] = true; } return options; } ts-node-9.1.1/dist-raw/node-package-json-reader.js000066400000000000000000000023221376344015600217200ustar00rootroot00000000000000// copied from https://github.com/nodejs/node/blob/v15.3.0/lib/internal/modules/package_json_reader.js 'use strict'; const { SafeMap } = require('./node-primordials'); const { internalModuleReadJSON } = require('./node-internal-fs'); const { pathToFileURL } = require('url'); const { toNamespacedPath } = require('path'); const cache = new SafeMap(); let manifest; /** * @param {string} jsonPath * @return {[string, boolean]} */ function read(jsonPath) { if (cache.has(jsonPath)) { return cache.get(jsonPath); } const [string, containsKeys] = internalModuleReadJSON( toNamespacedPath(jsonPath) ); const result = { string, containsKeys }; const { getOptionValue } = require('./node-options'); if (string !== undefined) { if (manifest === undefined) { // manifest = getOptionValue('--experimental-policy') ? // require('internal/process/policy').manifest : // null; // disabled for now. I am not sure if/how we should support this manifest = null; } if (manifest !== null) { const jsonURL = pathToFileURL(jsonPath); manifest.assertIntegrity(jsonURL, string); } } cache.set(jsonPath, result); return result; } module.exports = { read }; ts-node-9.1.1/dist-raw/node-primordials.js000066400000000000000000000025051376344015600204460ustar00rootroot00000000000000module.exports = { ArrayIsArray: Array.isArray, ArrayPrototypeJoin: (obj, separator) => Array.prototype.join.call(obj, separator), ArrayPrototypeShift: (obj) => Array.prototype.shift.call(obj), JSONParse: JSON.parse, JSONStringify: JSON.stringify, ObjectFreeze: Object.freeze, ObjectGetOwnPropertyNames: Object.getOwnPropertyNames, ObjectPrototypeHasOwnProperty: (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop), RegExpPrototypeTest: (obj, string) => RegExp.prototype.test.call(obj, string), SafeMap: Map, SafeSet: Set, StringPrototypeEndsWith: (str, ...rest) => String.prototype.endsWith.apply(str, rest), StringPrototypeIncludes: (str, ...rest) => String.prototype.includes.apply(str, rest), StringPrototypeLastIndexOf: (str, ...rest) => String.prototype.lastIndexOf.apply(str, rest), StringPrototypeIndexOf: (str, ...rest) => String.prototype.indexOf.apply(str, rest), StringPrototypeReplace: (str, ...rest) => String.prototype.replace.apply(str, rest), StringPrototypeSlice: (str, ...rest) => String.prototype.slice.apply(str, rest), StringPrototypeSplit: (str, ...rest) => String.prototype.split.apply(str, rest), StringPrototypeStartsWith: (str, ...rest) => String.prototype.startsWith.apply(str, rest), StringPrototypeSubstr: (str, ...rest) => String.prototype.substr.apply(str, rest) }; ts-node-9.1.1/esm-usage-example/000077500000000000000000000000001376344015600164235ustar00rootroot00000000000000ts-node-9.1.1/esm-usage-example/README.md000066400000000000000000000004141376344015600177010ustar00rootroot00000000000000To run the experiment: ``` cd ./esm-usage-example # Must be in this directory node -v # Must be using node v13 # Install the github branch via npm npm install node --loader ts-node/esm ./index.js # Or if you're hacking locally node --loader ../esm.mjs ./index ``` ts-node-9.1.1/esm-usage-example/bar.ts000066400000000000000000000000301376344015600175300ustar00rootroot00000000000000export const bar = 123; ts-node-9.1.1/esm-usage-example/foo.ts000066400000000000000000000000641376344015600175560ustar00rootroot00000000000000export const foo = 123; export {bar} from './bar'; ts-node-9.1.1/esm-usage-example/index.js000066400000000000000000000001571376344015600200730ustar00rootroot00000000000000async function main() { const fooModule = await import('./foo.ts'); console.dir({foo: fooModule}) } main() ts-node-9.1.1/esm-usage-example/package.json000066400000000000000000000001761376344015600207150ustar00rootroot00000000000000{ "type": "module", "dependencies": { "ts-node": "github:TypeStrong/ts-node#master", "typescript": "^3.8.3" } } ts-node-9.1.1/esm-usage-example/tsconfig.json000066400000000000000000000000661376344015600211340ustar00rootroot00000000000000{ "compilerOptions": { "module": "ESNext" } } ts-node-9.1.1/esm.mjs000066400000000000000000000004411376344015600144020ustar00rootroot00000000000000import {fileURLToPath} from 'url' import {createRequire} from 'module' const require = createRequire(fileURLToPath(import.meta.url)) /** @type {import('./dist/esm')} */ const esm = require('./dist/esm') export const {resolve, getFormat, transformSource} = esm.registerAndCreateEsmHooks() ts-node-9.1.1/esm/000077500000000000000000000000001376344015600136705ustar00rootroot00000000000000ts-node-9.1.1/esm/transpile-only.mjs000066400000000000000000000004701376344015600173640ustar00rootroot00000000000000import {fileURLToPath} from 'url' import {createRequire} from 'module' const require = createRequire(fileURLToPath(import.meta.url)) /** @type {import('../dist/esm')} */ const esm = require('../dist/esm') export const {resolve, getFormat, transformSource} = esm.registerAndCreateEsmHooks({transpileOnly: true}) ts-node-9.1.1/logo.svg000066400000000000000000000263101376344015600145670ustar00rootroot00000000000000 image/svg+xml ts-node-9.1.1/nyc.config.js000066400000000000000000000003471376344015600155030ustar00rootroot00000000000000module.exports = { all: true, include: [ 'tests/node_modules/ts-node/**', ], exclude: [ '**/*.d.ts', 'tests/node_modules/ts-node/node_modules/**', ], excludeNodeModules: false, excludeAfterRemap: false }; ts-node-9.1.1/package-lock.json000066400000000000000000002757511376344015600163410ustar00rootroot00000000000000{ "name": "ts-node", "version": "9.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", "integrity": "sha1-M+JZA9dIEYFTThLsCiXxa2/PQZ4=", "dev": true, "requires": { "@babel/highlight": "^7.8.3" } }, "@babel/core": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", "@babel/generator": "^7.9.6", "@babel/helper-module-transforms": "^7.9.0", "@babel/helpers": "^7.9.6", "@babel/parser": "^7.9.6", "@babel/template": "^7.8.6", "@babel/traverse": "^7.9.6", "@babel/types": "^7.9.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, "resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true } } }, "@babel/generator": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", "dev": true, "requires": { "@babel/types": "^7.9.6", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" }, "dependencies": { "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true } } }, "@babel/helper-function-name": { "version": "7.9.5", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.8.3", "@babel/template": "^7.8.3", "@babel/types": "^7.9.5" } }, "@babel/helper-get-function-arity": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { "@babel/types": "^7.8.3" } }, "@babel/helper-member-expression-to-functions": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", "dev": true, "requires": { "@babel/types": "^7.8.3" } }, "@babel/helper-module-imports": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", "dev": true, "requires": { "@babel/types": "^7.8.3" } }, "@babel/helper-module-transforms": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.8.3", "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-simple-access": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", "@babel/template": "^7.8.6", "@babel/types": "^7.9.0", "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", "dev": true, "requires": { "@babel/types": "^7.8.3" } }, "@babel/helper-replace-supers": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz", "integrity": "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==", "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/traverse": "^7.9.6", "@babel/types": "^7.9.6" } }, "@babel/helper-simple-access": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", "dev": true, "requires": { "@babel/template": "^7.8.3", "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { "@babel/types": "^7.8.3" } }, "@babel/helper-validator-identifier": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", "dev": true }, "@babel/helpers": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", "dev": true, "requires": { "@babel/template": "^7.8.3", "@babel/traverse": "^7.9.6", "@babel/types": "^7.9.6" } }, "@babel/highlight": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", "integrity": "sha1-TptFzLgreWBycbKXmtgse2gWMHk=", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "dependencies": { "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true } } }, "@babel/parser": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", "dev": true }, "@babel/template": { "version": "7.8.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", "@babel/parser": "^7.8.6", "@babel/types": "^7.8.6" } }, "@babel/traverse": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", "@babel/generator": "^7.9.6", "@babel/helper-function-name": "^7.9.5", "@babel/helper-split-export-declaration": "^7.8.3", "@babel/parser": "^7.9.6", "@babel/types": "^7.9.6", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" }, "dependencies": { "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } } } }, "@babel/types": { "version": "7.9.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" }, "dependencies": { "@babel/helper-validator-identifier": { "version": "7.9.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", "dev": true } } }, "@istanbuljs/load-nyc-config": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", "dev": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, "dependencies": { "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" } }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" } }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true } } }, "@istanbuljs/schema": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", "dev": true }, "@types/chai": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.10.tgz", "integrity": "sha512-Ejh1AXTY8lm+x91X/yar3G2z4x9RyKwdTVdyyu7Xj3dNB35fMNCnEWqTO9FgS3zjzlRNqk1MruYhgb8yhRN9rA==", "dev": true }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, "@types/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/diff/-/diff-4.0.2.tgz", "integrity": "sha1-Lpu4n5rMOrAQjw89xNvc8v/4qZw=", "dev": true }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", "dev": true }, "@types/glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", "dev": true, "requires": { "@types/events": "*", "@types/minimatch": "*", "@types/node": "*" } }, "@types/json-schema": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", "integrity": "sha1-OP1z3f2bVaux4bLtV4y1W9e30zk=", "dev": true }, "@types/lodash": { "version": "4.14.151", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.151.tgz", "integrity": "sha512-Zst90IcBX5wnwSu7CAS0vvJkTjTELY4ssKbHiTnGcJgi170uiS8yQDdc3v6S77bRqYQIN1App5a1Pc2lceE5/g==", "dev": true }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, "@types/mocha": { "version": "5.2.7", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", "integrity": "sha1-MV1XDMtWxTRS/4Y4c432BybVtuo=", "dev": true }, "@types/node": { "version": "13.13.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==", "dev": true }, "@types/proxyquire": { "version": "1.3.28", "resolved": "https://registry.npmjs.org/@types/proxyquire/-/proxyquire-1.3.28.tgz", "integrity": "sha1-BaZHuw2P5I/I7cwZPkPMeTEPqn0=", "dev": true }, "@types/react": { "version": "16.0.31", "resolved": "https://registry.npmjs.org/@types/react/-/react-16.0.31.tgz", "integrity": "sha512-ft7OuDGUo39e+9LGwUewf2RyEaNBOjWbHUmD5bzjNuSuDabccE/1IuO7iR0dkzLjVUKxTMq69E+FmKfbgBcfbQ==", "dev": true }, "@types/rimraf": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.0.tgz", "integrity": "sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ==", "dev": true, "requires": { "@types/glob": "*", "@types/node": "*" } }, "@types/semver": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.1.0.tgz", "integrity": "sha1-yMYw1MGM0ya+/3dASIdZb5ZAhAg=", "dev": true, "requires": { "@types/node": "*" } }, "@types/source-map-support": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.0.tgz", "integrity": "sha512-OrnAz5K5dXDgMdeRRoXIjDAvkodQ9ESvVJCyzrhzUJKmCkXgmYx/KLUBcVFe5eS4FiohfcY7YPxsdkmSwJz9wA==", "dev": true, "requires": { "@types/node": "*" } }, "aggregate-error": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", "integrity": "sha1-V9NbhoboUeLMBMQD8cACA5dqGBM=", "dev": true }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "append-transform": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, "requires": { "default-require-extensions": "^3.0.0" } }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, "arg": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==" }, "argparse": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", "dev": true }, "assertion-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", "dev": true }, "axios": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", "dev": true, "requires": { "follow-redirects": "1.5.10", "is-buffer": "^2.0.2" } }, "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.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", "dev": true }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=" }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, "caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "requires": { "hasha": "^5.0.0", "make-dir": "^3.0.0", "package-hash": "^4.0.0", "write-file-atomic": "^3.0.0" } }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", "dev": true }, "chai": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { "assertion-error": "^1.0.1", "check-error": "^1.0.1", "deep-eql": "^3.0.0", "get-func-name": "^2.0.0", "pathval": "^1.0.0", "type-detect": "^4.0.0" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", "dev": true, "requires": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", "wrap-ansi": "^5.1.0" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", "dev": true, "requires": { "ansi-regex": "^4.1.0" } } } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", "dev": true }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "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 }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" } }, "core-js": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", "dev": true }, "create-require": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.0.tgz", "integrity": "sha512-yEFVS7dQjDXp5iOEtWisN4uFmL+pUTyIaEizKda9Eb77XX58p6pgFOLAPaBCP+IR6ZPZ1jgJLAuf+ABk0zXYBQ==" }, "cross-spawn": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "dependencies": { "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } } } }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", "dev": true, "requires": { "type-detect": "^4.0.0" } }, "default-require-extensions": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", "dev": true, "requires": { "strip-bom": "^4.0.0" } }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", "dev": true, "requires": { "object-keys": "^1.0.12" } }, "diff": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==" }, "doctrine": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", "dev": true, "requires": { "esutils": "^1.1.6", "isarray": "0.0.1" }, "dependencies": { "esutils": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", "dev": true } } }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", "dev": true }, "encoding": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "dev": true, "requires": { "iconv-lite": "~0.4.13" } }, "es-abstract": { "version": "1.17.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", "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.1.5", "is-regex": "^1.0.5", "object-inspect": "^1.7.0", "object-keys": "^1.1.1", "object.assign": "^4.1.0", "string.prototype.trimleft": "^2.1.1", "string.prototype.trimright": "^2.1.1" } }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, "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 }, "fbjs": { "version": "0.8.16", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", "dev": true, "requires": { "core-js": "^1.0.0", "isomorphic-fetch": "^2.1.1", "loose-envify": "^1.0.0", "object-assign": "^4.1.0", "promise": "^7.1.1", "setimmediate": "^1.0.5", "ua-parser-js": "^0.7.9" } }, "fill-keys": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fill-keys/-/fill-keys-1.0.2.tgz", "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", "dev": true, "requires": { "is-object": "~1.0.1", "merge-descriptors": "~1.0.0" } }, "find-cache-dir": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", "integrity": "sha1-CQvsiwXjnLowl0fx1YjwTbr5jbI=", "dev": true, "requires": { "is-buffer": "~2.0.3" } }, "follow-redirects": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=", "dev": true, "requires": { "debug": "=3.1.0" }, "dependencies": { "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "requires": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" } }, "fromentries": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", "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": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", "dev": true }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", "dev": true }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", "dev": true }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, "get-stream": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", "dev": true }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", "dev": true }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", "dev": true }, "hasha": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", "dev": true, "requires": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" }, "dependencies": { "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true } } }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", "dev": true }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "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.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "is-buffer": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM=", "dev": true }, "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs=", "dev": true }, "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", "dev": true }, "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4=", "dev": true, "requires": { "has": "^1.0.3" } }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", "dev": true, "requires": { "has-symbols": "^1.0.1" } }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isomorphic-fetch": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "dev": true, "requires": { "node-fetch": "^1.0.1", "whatwg-fetch": ">=0.10.0" } }, "istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, "istanbul-lib-hook": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "requires": { "append-transform": "^2.0.0" } }, "istanbul-lib-instrument": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "istanbul-lib-processinfo": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", "dev": true, "requires": { "archy": "^1.0.0", "cross-spawn": "^7.0.0", "istanbul-lib-coverage": "^3.0.0-alpha.1", "make-dir": "^3.0.0", "p-map": "^3.0.0", "rimraf": "^3.0.0", "uuid": "^3.3.3" } }, "istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" }, "dependencies": { "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "istanbul-lib-source-maps": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "dependencies": { "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } } } }, "istanbul-reports": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "dependencies": { "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", "dev": true } } }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { "jsonify": "~0.0.0" } }, "json5": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "dev": true, "requires": { "minimist": "^1.2.5" }, "dependencies": { "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "lodash": { "version": "4.17.19", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", "dev": true, "requires": { "chalk": "^2.0.1" } }, "loose-envify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { "js-tokens": "^3.0.0" } }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" }, "dependencies": { "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "make-error": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=" }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "mkdirp": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", "dev": true, "requires": { "minimist": "^1.2.5" }, "dependencies": { "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } }, "mocha": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", "dev": true, "requires": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", "find-up": "3.0.0", "glob": "7.1.3", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", "log-symbols": "2.2.0", "minimatch": "3.0.4", "mkdirp": "0.5.1", "ms": "2.1.1", "node-environment-flags": "1.0.5", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", "yargs": "13.3.0", "yargs-parser": "13.1.1", "yargs-unparser": "1.6.0" }, "dependencies": { "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", "dev": true }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", "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" } }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" } }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" } } } }, "module-not-found-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/module-not-found-error/-/module-not-found-error-1.0.1.tgz", "integrity": "sha1-z4tP9PKWQGdNbN0CsOO8UjwrvcA=", "dev": true }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "node-environment-flags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", "integrity": "sha1-+pMCdfW/Xa4YjWGSsktMi7rD12o=", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" }, "dependencies": { "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", "dev": true } } }, "node-fetch": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", "dev": true, "requires": { "encoding": "^0.1.11", "is-stream": "^1.0.1" } }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "requires": { "process-on-spawn": "^1.0.0" } }, "ntypescript": { "version": "1.201706190042.1", "resolved": "https://registry.npmjs.org/ntypescript/-/ntypescript-1.201706190042.1.tgz", "integrity": "sha1-hmrpzDZoixQWBhVu0LzDXN9TYnE=", "dev": true }, "nyc": { "version": "15.0.1", "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.0.1.tgz", "integrity": "sha512-n0MBXYBYRqa67IVt62qW1r/d9UH/Qtr7SF1w/nQLJ9KxvWF6b2xCHImRAixHN9tnMMYHC2P14uo6KddNGwMgGg==", "dev": true, "requires": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "caching-transform": "^4.0.0", "convert-source-map": "^1.7.0", "decamelize": "^1.2.0", "find-cache-dir": "^3.2.0", "find-up": "^4.1.0", "foreground-child": "^2.0.0", "glob": "^7.1.6", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-hook": "^3.0.0", "istanbul-lib-instrument": "^4.0.0", "istanbul-lib-processinfo": "^2.0.2", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", "make-dir": "^3.0.0", "node-preload": "^0.2.1", "p-map": "^3.0.0", "process-on-spawn": "^1.0.0", "resolve-from": "^5.0.0", "rimraf": "^3.0.0", "signal-exit": "^3.0.2", "spawn-wrap": "^2.0.0", "test-exclude": "^6.0.0", "yargs": "^15.0.2" }, "dependencies": { "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "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" } }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" } }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" } }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" } }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { "ansi-regex": "^5.0.0" } }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "yargs": { "version": "15.3.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.1" } }, "yargs-parser": { "version": "18.1.3", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } }, "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.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=", "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", "dev": true }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", "dev": true, "requires": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", "has-symbols": "^1.0.0", "object-keys": "^1.0.11" } }, "object.getownpropertydescriptors": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.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" } }, "p-limit": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", "dev": true, "requires": { "p-limit": "^2.0.0" } }, "p-map": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", "dev": true }, "package-hash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "requires": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" } }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "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-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", "dev": true }, "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { "find-up": "^4.0.0" }, "dependencies": { "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" } }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" } }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true } } }, "process-on-spawn": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, "requires": { "fromentries": "^1.2.0" } }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, "requires": { "asap": "~2.0.3" } }, "prop-types": { "version": "15.6.0", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", "dev": true, "requires": { "fbjs": "^0.8.16", "loose-envify": "^1.3.1", "object-assign": "^4.1.1" } }, "proxyquire": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.0.0.tgz", "integrity": "sha512-TO9TAIz0mpa+SKddXsgCFatoe/KmHvoNVj2jDMC1kXE6kKn7/4CRpxvQ+0wAK9sbMT2FVO89qItlvnZMcFbJ2Q==", "dev": true, "requires": { "fill-keys": "^1.0.2", "module-not-found-error": "^1.0.0", "resolve": "~1.1.7" } }, "react": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/react/-/react-16.2.0.tgz", "integrity": "sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ==", "dev": true, "requires": { "fbjs": "^0.8.16", "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.0" } }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", "dev": true, "requires": { "es6-error": "^4.0.1" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", "dev": true }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "rimraf": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", "dev": true, "requires": { "glob": "^7.1.3" }, "dependencies": { "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "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" } } } }, "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 }, "semver": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", "dev": true }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=" }, "source-map-support": { "version": "0.5.17", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.17.tgz", "integrity": "sha512-bwdKOBZ5L0gFRh4KOxNap/J/MpvX9Yxsq9lFDx65s3o7F/NiHy7JRaGIS8MwW6tZPAq9UXE207Il0cfcb5yu/Q==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "requires": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", "make-dir": "^3.0.0", "rimraf": "^3.0.0", "signal-exit": "^3.0.2", "which": "^2.0.1" }, "dependencies": { "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } } } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "string.prototype.trimleft": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" } }, "string.prototype.trimright": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" } }, "strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" }, "dependencies": { "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" } } } }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", "dev": true }, "tslint": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.0.tgz", "integrity": "sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", "diff": "^4.0.1", "glob": "^7.1.1", "js-yaml": "^3.13.1", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.10.0", "tsutils": "^2.29.0" }, "dependencies": { "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", "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" } }, "resolve": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", "dev": true } } }, "tslint-config-standard": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/tslint-config-standard/-/tslint-config-standard-9.0.0.tgz", "integrity": "sha1-NJqUgZ2T1fjYA+PHHLWO847/iOA=", "dev": true, "requires": { "tslint-eslint-rules": "^5.3.1" } }, "tslint-eslint-rules": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", "integrity": "sha1-5IjMkYG/GT/lzXv8ohOnaV8XN7U=", "dev": true, "requires": { "doctrine": "0.7.2", "tslib": "1.9.0", "tsutils": "^3.0.0" }, "dependencies": { "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", "integrity": "sha1-43qG/ajLuvI6BX9HPJ9Nxk5fwug=", "dev": true }, "tsutils": { "version": "3.17.1", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", "integrity": "sha1-7XGZF/EcoN7lhicrKsSeAVot11k=", "dev": true, "requires": { "tslib": "^1.8.1" } } } }, "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k=", "dev": true, "requires": { "tslib": "^1.8.1" } }, "type-detect": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", "dev": true }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { "is-typedarray": "^1.0.0" } }, "typescript": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", "dev": true }, "typescript-json-schema": { "version": "0.42.0", "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.42.0.tgz", "integrity": "sha1-aV8hKnLZHUfAYFNx3Gl1l7eBfBs=", "dev": true, "requires": { "@types/json-schema": "^7.0.3", "glob": "~7.1.4", "json-stable-stringify": "^1.0.1", "typescript": "^3.5.3", "yargs": "^14.0.0" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", "dev": true }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", "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" } }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", "dev": true, "requires": { "ansi-regex": "^4.1.0" } }, "typescript": { "version": "3.9.7", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", "dev": true }, "yargs": { "version": "14.2.3", "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", "integrity": "sha1-Ghw+3O0a+yov6jNgS8bR2NaIpBQ=", "dev": true, "requires": { "cliui": "^5.0.0", "decamelize": "^1.2.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^15.0.1" } }, "yargs-parser": { "version": "15.0.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", "integrity": "sha1-VHhq9AuCDcsvuAJbEbTWWddjI7M=", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } }, "ua-parser-js": { "version": "0.7.17", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", "dev": true }, "util.promisify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.2", "has-symbols": "^1.0.1", "object.getownpropertydescriptors": "^2.1.0" } }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, "whatwg-fetch": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", "dev": true }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", "dev": true, "requires": { "string-width": "^1.0.2 || 2" } }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", "dev": true, "requires": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", "strip-ansi": "^5.0.0" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", "dev": true, "requires": { "ansi-regex": "^4.1.0" } } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", "dev": true }, "yargs": { "version": "13.3.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { "cliui": "^5.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.1.1" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", "dev": true, "requires": { "ansi-regex": "^4.1.0" } } } }, "yargs-parser": { "version": "13.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "yargs-unparser": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", "integrity": "sha1-7yXCx2n/a9CeSw+dfGBfsnhG6p8=", "dev": true, "requires": { "flat": "^4.1.0", "lodash": "^4.17.15", "yargs": "^13.3.0" } }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha1-HodAGgnXZ8HV6rJqbkwYUYLS61A=" } } } ts-node-9.1.1/package.json000066400000000000000000000075271376344015600154050ustar00rootroot00000000000000{ "name": "ts-node", "version": "9.1.1", "description": "TypeScript execution environment and REPL for node.js, with source map support", "main": "dist/index.js", "exports": { ".": "./dist/index.js", "./package": "./package.json", "./package.json": "./package.json", "./dist/bin": "./dist/bin.js", "./dist/bin.js": "./dist/bin.js", "./dist/bin-transpile": "./dist/bin-transpile.js", "./dist/bin-transpile.js": "./dist/bin-transpile.js", "./dist/bin-script": "./dist/bin-script.js", "./dist/bin-script.js": "./dist/bin-script.js", "./register": "./register/index.js", "./register/files": "./register/files.js", "./register/transpile-only": "./register/transpile-only.js", "./register/type-check": "./register/type-check.js", "./esm": "./esm.mjs", "./esm.mjs": "./esm.mjs", "./esm/transpile-only": "./esm/transpile-only.mjs", "./esm/transpile-only.mjs": "./esm/transpile-only.mjs" }, "types": "dist/index.d.ts", "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" }, "files": [ "dist/", "dist-raw/", "register/", "esm/", "esm.mjs", "LICENSE", "tsconfig.schema.json", "tsconfig.schemastore-schema.json" ], "scripts": { "lint": "tslint \"src/**/*.ts\" --project tsconfig.json", "lint-fix": "tslint \"src/**/*.ts\" --project tsconfig.json --fix", "clean": "rimraf dist && rimraf tsconfig.schema.json && rimraf tsconfig.schemastore-schema.json && rimraf tests/ts-node-packed.tgz", "build": "npm run build-nopack && npm run build-pack", "build-nopack": "npm run clean && npm run build-tsc && npm run build-configSchema", "build-tsc": "tsc", "build-configSchema": "typescript-json-schema --topRef --refs --validationKeywords allOf --out tsconfig.schema.json tsconfig.json TsConfigSchema && node --require ./register ./scripts/create-merged-schema", "build-pack": "node ./scripts/build-pack.js", "test-spec": "mocha dist/**/*.spec.js -R spec --bail", "test-cov": "nyc mocha -- \"dist/**/*.spec.js\" -R spec --bail", "test": "npm run build && npm run lint && npm run test-cov --", "coverage-report": "nyc report --reporter=lcov", "prepare": "npm run build-nopack" }, "engines": { "node": ">=10.0.0" }, "repository": { "type": "git", "url": "git://github.com/TypeStrong/ts-node.git" }, "keywords": [ "typescript", "node", "runtime", "environment", "ts", "compiler" ], "author": { "name": "Blake Embrey", "email": "hello@blakeembrey.com", "url": "http://blakeembrey.me" }, "license": "MIT", "bugs": { "url": "https://github.com/TypeStrong/ts-node/issues" }, "homepage": "https://github.com/TypeStrong/ts-node", "devDependencies": { "@types/chai": "^4.0.4", "@types/diff": "^4.0.2", "@types/lodash": "^4.14.151", "@types/mocha": "^5.2.7", "@types/node": "13.13.5", "@types/proxyquire": "^1.3.28", "@types/react": "^16.0.2", "@types/rimraf": "^3.0.0", "@types/semver": "^7.1.0", "@types/source-map-support": "^0.5.0", "axios": "^0.19.0", "chai": "^4.0.1", "get-stream": "^6.0.0", "lodash": "^4.17.15", "mocha": "^6.2.2", "ntypescript": "^1.201507091536.1", "nyc": "^15.0.1", "proxyquire": "^2.0.0", "react": "^16.0.0", "rimraf": "^3.0.0", "semver": "^7.1.3", "tslint": "^6.1.0", "tslint-config-standard": "^9.0.0", "typescript": "4.1.2", "typescript-json-schema": "^0.42.0", "util.promisify": "^1.0.1" }, "peerDependencies": { "typescript": ">=2.7" }, "dependencies": { "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "source-map-support": "^0.5.17", "yn": "3.1.1" } } ts-node-9.1.1/raw/000077500000000000000000000000001376344015600136755ustar00rootroot00000000000000ts-node-9.1.1/raw/node-esm-resolve-implementation-v13.12.0.js000066400000000000000000000506421376344015600234370ustar00rootroot00000000000000'use strict'; const { ArrayIsArray, JSONParse, JSONStringify, ObjectGetOwnPropertyNames, ObjectPrototypeHasOwnProperty, SafeMap, StringPrototypeEndsWith, StringPrototypeIncludes, StringPrototypeIndexOf, StringPrototypeSlice, StringPrototypeStartsWith, StringPrototypeSubstr, } = primordials; const internalFS = require('internal/fs/utils'); const { NativeModule } = require('internal/bootstrap/loaders'); const { closeSync, fstatSync, openSync, readFileSync, realpathSync, statSync, Stats, } = require('fs'); const { getOptionValue } = require('internal/options'); const { sep } = require('path'); const preserveSymlinks = getOptionValue('--preserve-symlinks'); const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); const typeFlag = getOptionValue('--input-type'); const { URL, pathToFileURL, fileURLToPath } = require('internal/url'); const { ERR_INPUT_TYPE_NOT_ALLOWED, ERR_INVALID_MODULE_SPECIFIER, ERR_INVALID_PACKAGE_CONFIG, ERR_INVALID_PACKAGE_TARGET, ERR_MODULE_NOT_FOUND, ERR_PACKAGE_PATH_NOT_EXPORTED, ERR_UNSUPPORTED_ESM_URL_SCHEME, } = require('internal/errors').codes; const realpathCache = new SafeMap(); const packageJSONCache = new SafeMap(); /* string -> PackageConfig */ function tryStatSync(path) { try { return statSync(path); } catch { return new Stats(); } } function readIfFile(path) { let fd; try { fd = openSync(path, 'r'); } catch { return undefined; } try { if (!fstatSync(fd).isFile()) return undefined; return readFileSync(fd, 'utf8'); } finally { closeSync(fd); } } function getPackageConfig(path, base) { const existing = packageJSONCache.get(path); if (existing !== undefined) { if (!existing.isValid) { throw new ERR_INVALID_PACKAGE_CONFIG(path, fileURLToPath(base), false); } return existing; } const source = readIfFile(path); if (source === undefined) { const packageConfig = { exists: false, main: undefined, name: undefined, isValid: true, type: 'none', exports: undefined }; packageJSONCache.set(path, packageConfig); return packageConfig; } let packageJSON; try { packageJSON = JSONParse(source); } catch { const packageConfig = { exists: true, main: undefined, name: undefined, isValid: false, type: 'none', exports: undefined }; packageJSONCache.set(path, packageConfig); return packageConfig; } let { main, name, type } = packageJSON; const { exports } = packageJSON; if (typeof main !== 'string') main = undefined; if (typeof name !== 'string') name = undefined; // Ignore unknown types for forwards compatibility if (type !== 'module' && type !== 'commonjs') type = 'none'; const packageConfig = { exists: true, main, name, isValid: true, type, exports }; packageJSONCache.set(path, packageConfig); return packageConfig; } function getPackageScopeConfig(resolved, base) { let packageJSONUrl = new URL('./package.json', resolved); while (true) { const packageJSONPath = packageJSONUrl.pathname; if (StringPrototypeEndsWith(packageJSONPath, 'node_modules/package.json')) break; const packageConfig = getPackageConfig(fileURLToPath(packageJSONUrl), base); if (packageConfig.exists) return packageConfig; const lastPackageJSONUrl = packageJSONUrl; packageJSONUrl = new URL('../package.json', packageJSONUrl); // Terminates at root where ../package.json equals ../../package.json // (can't just check "/package.json" for Windows support). if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) break; } const packageConfig = { exists: false, main: undefined, name: undefined, isValid: true, type: 'none', exports: undefined }; packageJSONCache.set(fileURLToPath(packageJSONUrl), packageConfig); return packageConfig; } /* * Legacy CommonJS main resolution: * 1. let M = pkg_url + (json main field) * 2. TRY(M, M.js, M.json, M.node) * 3. TRY(M/index.js, M/index.json, M/index.node) * 4. TRY(pkg_url/index.js, pkg_url/index.json, pkg_url/index.node) * 5. NOT_FOUND */ function fileExists(url) { return tryStatSync(fileURLToPath(url)).isFile(); } function legacyMainResolve(packageJSONUrl, packageConfig) { let guess; if (packageConfig.main !== undefined) { // Note: fs check redundances will be handled by Descriptor cache here. if (fileExists(guess = new URL(`./${packageConfig.main}`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}.js`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}.json`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}.node`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}/index.js`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}/index.json`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}/index.node`, packageJSONUrl))) { return guess; } // Fallthrough. } if (fileExists(guess = new URL('./index.js', packageJSONUrl))) { return guess; } // So fs. if (fileExists(guess = new URL('./index.json', packageJSONUrl))) { return guess; } if (fileExists(guess = new URL('./index.node', packageJSONUrl))) { return guess; } // Not found. return undefined; } function resolveExtensionsWithTryExactName(search) { if (fileExists(search)) return search; return resolveExtensions(search); } const extensions = ['.js', '.json', '.node', '.mjs']; function resolveExtensions(search) { for (let i = 0; i < extensions.length; i++) { const extension = extensions[i]; const guess = new URL(`${search.pathname}${extension}`, search); if (fileExists(guess)) return guess; } return undefined; } function resolveIndex(search) { return resolveExtensions(new URL('index', search)); } function finalizeResolution(resolved, base) { if (getOptionValue('--experimental-specifier-resolution') === 'node') { let file = resolveExtensionsWithTryExactName(resolved); if (file !== undefined) return file; if (!StringPrototypeEndsWith(resolved.pathname, '/')) { file = resolveIndex(new URL(`${resolved.pathname}/`, base)); } else { file = resolveIndex(resolved); } if (file !== undefined) return file; throw new ERR_MODULE_NOT_FOUND( resolved.pathname, fileURLToPath(base), 'module'); } if (StringPrototypeEndsWith(resolved.pathname, '/')) return resolved; const path = fileURLToPath(resolved); if (!tryStatSync(path).isFile()) { throw new ERR_MODULE_NOT_FOUND( path || resolved.pathname, fileURLToPath(base), 'module'); } return resolved; } function throwExportsNotFound(subpath, packageJSONUrl, base) { throw new ERR_PACKAGE_PATH_NOT_EXPORTED( fileURLToPath(packageJSONUrl), subpath, fileURLToPath(base)); } function throwSubpathInvalid(subpath, packageJSONUrl, base) { throw new ERR_INVALID_MODULE_SPECIFIER( fileURLToPath(packageJSONUrl), subpath, fileURLToPath(base)); } function throwExportsInvalid( subpath, target, packageJSONUrl, base) { if (typeof target === 'object' && target !== null) { target = JSONStringify(target, null, ''); } else if (ArrayIsArray(target)) { target = `[${target}]`; } else { target = `${target}`; } throw new ERR_INVALID_PACKAGE_TARGET( fileURLToPath(packageJSONUrl), null, subpath, target, fileURLToPath(base)); } function resolveExportsTargetString( target, subpath, match, packageJSONUrl, base) { if (target[0] !== '.' || target[1] !== '/' || (subpath !== '' && target[target.length - 1] !== '/')) { throwExportsInvalid(match, target, packageJSONUrl, base); } const resolved = new URL(target, packageJSONUrl); const resolvedPath = resolved.pathname; const packagePath = new URL('.', packageJSONUrl).pathname; if (!StringPrototypeStartsWith(resolvedPath, packagePath) || StringPrototypeIncludes( resolvedPath, '/node_modules/', packagePath.length - 1)) { throwExportsInvalid(match, target, packageJSONUrl, base); } if (subpath === '') return resolved; const subpathResolved = new URL(subpath, resolved); const subpathResolvedPath = subpathResolved.pathname; if (!StringPrototypeStartsWith(subpathResolvedPath, resolvedPath) || StringPrototypeIncludes(subpathResolvedPath, '/node_modules/', packagePath.length - 1)) { throwSubpathInvalid(match + subpath, packageJSONUrl, base); } return subpathResolved; } function isArrayIndex(key /* string */) { /* -> boolean */ const keyNum = +key; if (`${keyNum}` !== key) return false; return keyNum >= 0 && keyNum < 0xFFFF_FFFF; } function resolveExportsTarget( packageJSONUrl, target, subpath, packageSubpath, base) { if (typeof target === 'string') { const resolved = resolveExportsTargetString( target, subpath, packageSubpath, packageJSONUrl, base); return finalizeResolution(resolved, base); } else if (ArrayIsArray(target)) { if (target.length === 0) throwExportsInvalid(packageSubpath, target, packageJSONUrl, base); let lastException; for (let i = 0; i < target.length; i++) { const targetItem = target[i]; let resolved; try { resolved = resolveExportsTarget( packageJSONUrl, targetItem, subpath, packageSubpath, base); } catch (e) { lastException = e; if (e.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED' || e.code === 'ERR_INVALID_PACKAGE_TARGET') { continue; } throw e; } return finalizeResolution(resolved, base); } throw lastException; } else if (typeof target === 'object' && target !== null) { const keys = ObjectGetOwnPropertyNames(target); for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (isArrayIndex(key)) { throw new ERR_INVALID_PACKAGE_CONFIG( fileURLToPath(packageJSONUrl), '"exports" cannot contain numeric property keys'); } } for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (key === 'node' || key === 'import' || key === 'default') { const conditionalTarget = target[key]; try { return resolveExportsTarget( packageJSONUrl, conditionalTarget, subpath, packageSubpath, base); } catch (e) { if (e.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') continue; throw e; } } } throwExportsNotFound(packageSubpath, packageJSONUrl, base); } throwExportsInvalid(packageSubpath, target, packageJSONUrl, base); } function isConditionalExportsMainSugar(exports, packageJSONUrl, base) { if (typeof exports === 'string' || ArrayIsArray(exports)) return true; if (typeof exports !== 'object' || exports === null) return false; const keys = ObjectGetOwnPropertyNames(exports); let isConditionalSugar = false; let i = 0; for (let j = 0; j < keys.length; j++) { const key = keys[j]; const curIsConditionalSugar = key === '' || key[0] !== '.'; if (i++ === 0) { isConditionalSugar = curIsConditionalSugar; } else if (isConditionalSugar !== curIsConditionalSugar) { throw new ERR_INVALID_PACKAGE_CONFIG( fileURLToPath(packageJSONUrl), '"exports" cannot contain some keys starting with \'.\' and some not.' + ' The exports object must either be an object of package subpath keys' + ' or an object of main entry condition name keys only.'); } } return isConditionalSugar; } function packageMainResolve(packageJSONUrl, packageConfig, base) { if (packageConfig.exists) { const exports = packageConfig.exports; if (exports !== undefined) { if (isConditionalExportsMainSugar(exports, packageJSONUrl, base)) { return resolveExportsTarget(packageJSONUrl, exports, '', '', base); } else if (typeof exports === 'object' && exports !== null) { const target = exports['.']; if (target !== undefined) return resolveExportsTarget(packageJSONUrl, target, '', '', base); } throw new ERR_PACKAGE_PATH_NOT_EXPORTED(packageJSONUrl, '.'); } if (packageConfig.main !== undefined) { const resolved = new URL(packageConfig.main, packageJSONUrl); const path = fileURLToPath(resolved); if (tryStatSync(path).isFile()) return resolved; } if (getOptionValue('--experimental-specifier-resolution') === 'node') { if (packageConfig.main !== undefined) { return finalizeResolution( new URL(packageConfig.main, packageJSONUrl), base); } else { return finalizeResolution( new URL('index', packageJSONUrl), base); } } if (packageConfig.type !== 'module') { return legacyMainResolve(packageJSONUrl, packageConfig); } } throw new ERR_MODULE_NOT_FOUND( fileURLToPath(new URL('.', packageJSONUrl)), fileURLToPath(base)); } function packageExportsResolve( packageJSONUrl, packageSubpath, packageConfig, base) /* -> URL */ { const exports = packageConfig.exports; if (exports === undefined || isConditionalExportsMainSugar(exports, packageJSONUrl, base)) { throwExportsNotFound(packageSubpath, packageJSONUrl, base); } if (ObjectPrototypeHasOwnProperty(exports, packageSubpath)) { const target = exports[packageSubpath]; const resolved = resolveExportsTarget( packageJSONUrl, target, '', packageSubpath, base); return finalizeResolution(resolved, base); } let bestMatch = ''; const keys = ObjectGetOwnPropertyNames(exports); for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (key[key.length - 1] !== '/') continue; if (StringPrototypeStartsWith(packageSubpath, key) && key.length > bestMatch.length) { bestMatch = key; } } if (bestMatch) { const target = exports[bestMatch]; const subpath = StringPrototypeSubstr(packageSubpath, bestMatch.length); const resolved = resolveExportsTarget( packageJSONUrl, target, subpath, packageSubpath, base); return finalizeResolution(resolved, base); } throwExportsNotFound(packageSubpath, packageJSONUrl, base); } function getPackageType(url) { const packageConfig = getPackageScopeConfig(url, url); return packageConfig.type; } function packageResolve(specifier /* string */, base /* URL */) { /* -> URL */ let separatorIndex = StringPrototypeIndexOf(specifier, '/'); let validPackageName = true; let isScoped = false; if (specifier[0] === '@') { isScoped = true; if (separatorIndex === -1 || specifier.length === 0) { validPackageName = false; } else { separatorIndex = StringPrototypeIndexOf( specifier, '/', separatorIndex + 1); } } const packageName = separatorIndex === -1 ? specifier : StringPrototypeSlice(specifier, 0, separatorIndex); // Package name cannot have leading . and cannot have percent-encoding or // separators. for (let i = 0; i < packageName.length; i++) { if (packageName[i] === '%' || packageName[i] === '\\') { validPackageName = false; break; } } if (!validPackageName) { throw new ERR_INVALID_MODULE_SPECIFIER( specifier, undefined, fileURLToPath(base)); } const packageSubpath = separatorIndex === -1 ? '' : '.' + StringPrototypeSlice(specifier, separatorIndex); // ResolveSelf const packageConfig = getPackageScopeConfig(base, base); if (packageConfig.exists) { // TODO(jkrems): Find a way to forward the pair/iterator already generated // while executing GetPackageScopeConfig let packageJSONUrl; for (const [ filename, packageConfigCandidate ] of packageJSONCache) { if (packageConfig === packageConfigCandidate) { packageJSONUrl = pathToFileURL(filename); break; } } if (packageJSONUrl !== undefined && packageConfig.name === packageName && packageConfig.exports !== undefined) { if (packageSubpath === './') { return new URL('./', packageJSONUrl); } else if (packageSubpath === '') { return packageMainResolve(packageJSONUrl, packageConfig, base); } else { return packageExportsResolve( packageJSONUrl, packageSubpath, packageConfig, base); } } } let packageJSONUrl = new URL('./node_modules/' + packageName + '/package.json', base); let packageJSONPath = fileURLToPath(packageJSONUrl); let lastPath; do { const stat = tryStatSync( StringPrototypeSlice(packageJSONPath, 0, packageJSONPath.length - 13)); if (!stat.isDirectory()) { lastPath = packageJSONPath; packageJSONUrl = new URL((isScoped ? '../../../../node_modules/' : '../../../node_modules/') + packageName + '/package.json', packageJSONUrl); packageJSONPath = fileURLToPath(packageJSONUrl); continue; } // Package match. const packageConfig = getPackageConfig(packageJSONPath, base); if (packageSubpath === './') { return new URL('./', packageJSONUrl); } else if (packageSubpath === '') { return packageMainResolve(packageJSONUrl, packageConfig, base); } else if (packageConfig.exports !== undefined) { return packageExportsResolve( packageJSONUrl, packageSubpath, packageConfig, base); } else { return finalizeResolution( new URL(packageSubpath, packageJSONUrl), base); } // Cross-platform root check. } while (packageJSONPath.length !== lastPath.length); // eslint can't handle the above code. // eslint-disable-next-line no-unreachable throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base)); } function shouldBeTreatedAsRelativeOrAbsolutePath(specifier) { if (specifier === '') return false; if (specifier[0] === '/') return true; if (specifier[0] === '.') { if (specifier.length === 1 || specifier[1] === '/') return true; if (specifier[1] === '.') { if (specifier.length === 2 || specifier[2] === '/') return true; } } return false; } function moduleResolve(specifier /* string */, base /* URL */) { /* -> URL */ // Order swapped from spec for minor perf gain. // Ok since relative URLs cannot parse as URLs. let resolved; if (shouldBeTreatedAsRelativeOrAbsolutePath(specifier)) { resolved = new URL(specifier, base); } else { try { resolved = new URL(specifier); } catch { return packageResolve(specifier, base); } } return finalizeResolution(resolved, base); } function defaultResolve(specifier, { parentURL } = {}, defaultResolveUnused) { let parsed; try { parsed = new URL(specifier); if (parsed.protocol === 'data:') { return { url: specifier }; } } catch {} if (parsed && parsed.protocol === 'nodejs:') return { url: specifier }; if (parsed && parsed.protocol !== 'file:' && parsed.protocol !== 'data:') throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(); if (NativeModule.canBeRequiredByUsers(specifier)) { return { url: 'nodejs:' + specifier }; } if (parentURL && StringPrototypeStartsWith(parentURL, 'data:')) { // This is gonna blow up, we want the error new URL(specifier, parentURL); } const isMain = parentURL === undefined; if (isMain) { parentURL = pathToFileURL(`${process.cwd()}/`).href; // This is the initial entry point to the program, and --input-type has // been passed as an option; but --input-type can only be used with // --eval, --print or STDIN string input. It is not allowed with file // input, to avoid user confusion over how expansive the effect of the // flag should be (i.e. entry point only, package scope surrounding the // entry point, etc.). if (typeFlag) throw new ERR_INPUT_TYPE_NOT_ALLOWED(); } let url = moduleResolve(specifier, new URL(parentURL)); if (isMain ? !preserveSymlinksMain : !preserveSymlinks) { const urlPath = fileURLToPath(url); const real = realpathSync(urlPath, { [internalFS.realpathCacheKey]: realpathCache }); const old = url; url = pathToFileURL(real + (urlPath.endsWith(sep) ? '/' : '')); url.search = old.search; url.hash = old.hash; } return { url: `${url}` }; } module.exports = { defaultResolve, getPackageType }; ts-node-9.1.1/raw/node-esm-resolve-implementation-v15.3.0.js000066400000000000000000000724431376344015600233640ustar00rootroot00000000000000'use strict'; const { ArrayIsArray, ArrayPrototypeJoin, ArrayPrototypeShift, JSONParse, JSONStringify, ObjectFreeze, ObjectGetOwnPropertyNames, ObjectPrototypeHasOwnProperty, RegExp, RegExpPrototypeTest, SafeMap, SafeSet, String, StringPrototypeEndsWith, StringPrototypeIndexOf, StringPrototypeLastIndexOf, StringPrototypeReplace, StringPrototypeSlice, StringPrototypeSplit, StringPrototypeStartsWith, StringPrototypeSubstr, } = primordials; const internalFS = require('internal/fs/utils'); const { NativeModule } = require('internal/bootstrap/loaders'); const { realpathSync, statSync, Stats, } = require('fs'); const { getOptionValue } = require('internal/options'); // Do not eagerly grab .manifest, it may be in TDZ const policy = getOptionValue('--experimental-policy') ? require('internal/process/policy') : null; const { sep, relative } = require('path'); const preserveSymlinks = getOptionValue('--preserve-symlinks'); const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main'); const typeFlag = getOptionValue('--input-type'); const { URL, pathToFileURL, fileURLToPath } = require('internal/url'); const { ERR_INPUT_TYPE_NOT_ALLOWED, ERR_INVALID_ARG_VALUE, ERR_INVALID_MODULE_SPECIFIER, ERR_INVALID_PACKAGE_CONFIG, ERR_INVALID_PACKAGE_TARGET, ERR_MANIFEST_DEPENDENCY_MISSING, ERR_MODULE_NOT_FOUND, ERR_PACKAGE_IMPORT_NOT_DEFINED, ERR_PACKAGE_PATH_NOT_EXPORTED, ERR_UNSUPPORTED_DIR_IMPORT, ERR_UNSUPPORTED_ESM_URL_SCHEME, } = require('internal/errors').codes; const { Module: CJSModule } = require('internal/modules/cjs/loader'); const packageJsonReader = require('internal/modules/package_json_reader'); const userConditions = getOptionValue('--conditions'); const DEFAULT_CONDITIONS = ObjectFreeze(['node', 'import', ...userConditions]); const DEFAULT_CONDITIONS_SET = new SafeSet(DEFAULT_CONDITIONS); const pendingDeprecation = getOptionValue('--pending-deprecation'); const emittedPackageWarnings = new SafeSet(); function emitFolderMapDeprecation(match, pjsonUrl, isExports, base) { const pjsonPath = fileURLToPath(pjsonUrl); if (!pendingDeprecation) { const nodeModulesIndex = StringPrototypeLastIndexOf(pjsonPath, '/node_modules/'); if (nodeModulesIndex !== -1) { const afterNodeModulesPath = StringPrototypeSlice(pjsonPath, nodeModulesIndex + 14, -13); try { const { packageSubpath } = parsePackageName(afterNodeModulesPath); if (packageSubpath === '.') return; } catch {} } } if (emittedPackageWarnings.has(pjsonPath + '|' + match)) return; emittedPackageWarnings.add(pjsonPath + '|' + match); process.emitWarning( `Use of deprecated folder mapping "${match}" in the ${isExports ? '"exports"' : '"imports"'} field module resolution of the package at ${ pjsonPath}${base ? ` imported from ${fileURLToPath(base)}` : ''}.\n` + `Update this package.json to use a subpath pattern like "${match}*".`, 'DeprecationWarning', 'DEP0148' ); } function getConditionsSet(conditions) { if (conditions !== undefined && conditions !== DEFAULT_CONDITIONS) { if (!ArrayIsArray(conditions)) { throw new ERR_INVALID_ARG_VALUE('conditions', conditions, 'expected an array'); } return new SafeSet(conditions); } return DEFAULT_CONDITIONS_SET; } const realpathCache = new SafeMap(); const packageJSONCache = new SafeMap(); /* string -> PackageConfig */ function tryStatSync(path) { try { return statSync(path); } catch { return new Stats(); } } function getPackageConfig(path, specifier, base) { const existing = packageJSONCache.get(path); if (existing !== undefined) { return existing; } const source = packageJsonReader.read(path).string; if (source === undefined) { const packageConfig = { pjsonPath: path, exists: false, main: undefined, name: undefined, type: 'none', exports: undefined, imports: undefined, }; packageJSONCache.set(path, packageConfig); return packageConfig; } let packageJSON; try { packageJSON = JSONParse(source); } catch (error) { throw new ERR_INVALID_PACKAGE_CONFIG( path, (base ? `"${specifier}" from ` : '') + fileURLToPath(base || specifier), error.message ); } let { imports, main, name, type } = packageJSON; const { exports } = packageJSON; if (typeof imports !== 'object' || imports === null) imports = undefined; if (typeof main !== 'string') main = undefined; if (typeof name !== 'string') name = undefined; // Ignore unknown types for forwards compatibility if (type !== 'module' && type !== 'commonjs') type = 'none'; const packageConfig = { pjsonPath: path, exists: true, main, name, type, exports, imports, }; packageJSONCache.set(path, packageConfig); return packageConfig; } function getPackageScopeConfig(resolved) { let packageJSONUrl = new URL('./package.json', resolved); while (true) { const packageJSONPath = packageJSONUrl.pathname; if (StringPrototypeEndsWith(packageJSONPath, 'node_modules/package.json')) break; const packageConfig = getPackageConfig(fileURLToPath(packageJSONUrl), resolved); if (packageConfig.exists) return packageConfig; const lastPackageJSONUrl = packageJSONUrl; packageJSONUrl = new URL('../package.json', packageJSONUrl); // Terminates at root where ../package.json equals ../../package.json // (can't just check "/package.json" for Windows support). if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) break; } const packageJSONPath = fileURLToPath(packageJSONUrl); const packageConfig = { pjsonPath: packageJSONPath, exists: false, main: undefined, name: undefined, type: 'none', exports: undefined, imports: undefined, }; packageJSONCache.set(packageJSONPath, packageConfig); return packageConfig; } /* * Legacy CommonJS main resolution: * 1. let M = pkg_url + (json main field) * 2. TRY(M, M.js, M.json, M.node) * 3. TRY(M/index.js, M/index.json, M/index.node) * 4. TRY(pkg_url/index.js, pkg_url/index.json, pkg_url/index.node) * 5. NOT_FOUND */ function fileExists(url) { return tryStatSync(fileURLToPath(url)).isFile(); } function legacyMainResolve(packageJSONUrl, packageConfig, base) { let guess; if (packageConfig.main !== undefined) { // Note: fs check redundances will be handled by Descriptor cache here. if (fileExists(guess = new URL(`./${packageConfig.main}`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}.js`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}.json`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}.node`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}/index.js`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}/index.json`, packageJSONUrl))) { return guess; } if (fileExists(guess = new URL(`./${packageConfig.main}/index.node`, packageJSONUrl))) { return guess; } // Fallthrough. } if (fileExists(guess = new URL('./index.js', packageJSONUrl))) { return guess; } // So fs. if (fileExists(guess = new URL('./index.json', packageJSONUrl))) { return guess; } if (fileExists(guess = new URL('./index.node', packageJSONUrl))) { return guess; } // Not found. throw new ERR_MODULE_NOT_FOUND( fileURLToPath(new URL('.', packageJSONUrl)), fileURLToPath(base)); } function resolveExtensionsWithTryExactName(search) { if (fileExists(search)) return search; return resolveExtensions(search); } const extensions = ['.js', '.json', '.node', '.mjs']; function resolveExtensions(search) { for (let i = 0; i < extensions.length; i++) { const extension = extensions[i]; const guess = new URL(`${search.pathname}${extension}`, search); if (fileExists(guess)) return guess; } return undefined; } function resolveIndex(search) { return resolveExtensions(new URL('index', search)); } const encodedSepRegEx = /%2F|%2C/i; function finalizeResolution(resolved, base) { if (RegExpPrototypeTest(encodedSepRegEx, resolved.pathname)) throw new ERR_INVALID_MODULE_SPECIFIER( resolved.pathname, 'must not include encoded "/" or "\\" characters', fileURLToPath(base)); const path = fileURLToPath(resolved); if (getOptionValue('--experimental-specifier-resolution') === 'node') { let file = resolveExtensionsWithTryExactName(resolved); if (file !== undefined) return file; if (!StringPrototypeEndsWith(path, '/')) { file = resolveIndex(new URL(`${resolved}/`)); if (file !== undefined) return file; } else { return resolveIndex(resolved) || resolved; } throw new ERR_MODULE_NOT_FOUND( resolved.pathname, fileURLToPath(base), 'module'); } const stats = tryStatSync(StringPrototypeEndsWith(path, '/') ? StringPrototypeSlice(path, -1) : path); if (stats.isDirectory()) { const err = new ERR_UNSUPPORTED_DIR_IMPORT(path, fileURLToPath(base)); err.url = String(resolved); throw err; } else if (!stats.isFile()) { throw new ERR_MODULE_NOT_FOUND( path || resolved.pathname, base && fileURLToPath(base), 'module'); } return resolved; } function throwImportNotDefined(specifier, packageJSONUrl, base) { throw new ERR_PACKAGE_IMPORT_NOT_DEFINED( specifier, packageJSONUrl && fileURLToPath(new URL('.', packageJSONUrl)), fileURLToPath(base)); } function throwExportsNotFound(subpath, packageJSONUrl, base) { throw new ERR_PACKAGE_PATH_NOT_EXPORTED( fileURLToPath(new URL('.', packageJSONUrl)), subpath, base && fileURLToPath(base)); } function throwInvalidSubpath(subpath, packageJSONUrl, internal, base) { const reason = `request is not a valid subpath for the "${internal ? 'imports' : 'exports'}" resolution of ${fileURLToPath(packageJSONUrl)}`; throw new ERR_INVALID_MODULE_SPECIFIER(subpath, reason, base && fileURLToPath(base)); } function throwInvalidPackageTarget( subpath, target, packageJSONUrl, internal, base) { if (typeof target === 'object' && target !== null) { target = JSONStringify(target, null, ''); } else { target = `${target}`; } throw new ERR_INVALID_PACKAGE_TARGET( fileURLToPath(new URL('.', packageJSONUrl)), subpath, target, internal, base && fileURLToPath(base)); } const invalidSegmentRegEx = /(^|\\|\/)(\.\.?|node_modules)(\\|\/|$)/; const patternRegEx = /\*/g; function resolvePackageTargetString( target, subpath, match, packageJSONUrl, base, pattern, internal, conditions) { if (subpath !== '' && !pattern && target[target.length - 1] !== '/') throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); if (!StringPrototypeStartsWith(target, './')) { if (internal && !StringPrototypeStartsWith(target, '../') && !StringPrototypeStartsWith(target, '/')) { let isURL = false; try { new URL(target); isURL = true; } catch {} if (!isURL) { const exportTarget = pattern ? StringPrototypeReplace(target, patternRegEx, subpath) : target + subpath; return packageResolve(exportTarget, packageJSONUrl, conditions); } } throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); } if (RegExpPrototypeTest(invalidSegmentRegEx, StringPrototypeSlice(target, 2))) throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); const resolved = new URL(target, packageJSONUrl); const resolvedPath = resolved.pathname; const packagePath = new URL('.', packageJSONUrl).pathname; if (!StringPrototypeStartsWith(resolvedPath, packagePath)) throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); if (subpath === '') return resolved; if (RegExpPrototypeTest(invalidSegmentRegEx, subpath)) throwInvalidSubpath(match + subpath, packageJSONUrl, internal, base); if (pattern) return new URL(StringPrototypeReplace(resolved.href, patternRegEx, subpath)); return new URL(subpath, resolved); } /** * @param {string} key * @returns {boolean} */ function isArrayIndex(key) { const keyNum = +key; if (`${keyNum}` !== key) return false; return keyNum >= 0 && keyNum < 0xFFFF_FFFF; } function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath, base, pattern, internal, conditions) { if (typeof target === 'string') { return resolvePackageTargetString( target, subpath, packageSubpath, packageJSONUrl, base, pattern, internal, conditions); } else if (ArrayIsArray(target)) { if (target.length === 0) return null; let lastException; for (let i = 0; i < target.length; i++) { const targetItem = target[i]; let resolved; try { resolved = resolvePackageTarget( packageJSONUrl, targetItem, subpath, packageSubpath, base, pattern, internal, conditions); } catch (e) { lastException = e; if (e.code === 'ERR_INVALID_PACKAGE_TARGET') continue; throw e; } if (resolved === undefined) continue; if (resolved === null) { lastException = null; continue; } return resolved; } if (lastException === undefined || lastException === null) return lastException; throw lastException; } else if (typeof target === 'object' && target !== null) { const keys = ObjectGetOwnPropertyNames(target); for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (isArrayIndex(key)) { throw new ERR_INVALID_PACKAGE_CONFIG( fileURLToPath(packageJSONUrl), base, '"exports" cannot contain numeric property keys.'); } } for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (key === 'default' || conditions.has(key)) { const conditionalTarget = target[key]; const resolved = resolvePackageTarget( packageJSONUrl, conditionalTarget, subpath, packageSubpath, base, pattern, internal, conditions); if (resolved === undefined) continue; return resolved; } } return undefined; } else if (target === null) { return null; } throwInvalidPackageTarget(packageSubpath, target, packageJSONUrl, internal, base); } function isConditionalExportsMainSugar(exports, packageJSONUrl, base) { if (typeof exports === 'string' || ArrayIsArray(exports)) return true; if (typeof exports !== 'object' || exports === null) return false; const keys = ObjectGetOwnPropertyNames(exports); let isConditionalSugar = false; let i = 0; for (let j = 0; j < keys.length; j++) { const key = keys[j]; const curIsConditionalSugar = key === '' || key[0] !== '.'; if (i++ === 0) { isConditionalSugar = curIsConditionalSugar; } else if (isConditionalSugar !== curIsConditionalSugar) { throw new ERR_INVALID_PACKAGE_CONFIG( fileURLToPath(packageJSONUrl), base, '"exports" cannot contain some keys starting with \'.\' and some not.' + ' The exports object must either be an object of package subpath keys' + ' or an object of main entry condition name keys only.'); } } return isConditionalSugar; } /** * @param {URL} packageJSONUrl * @param {string} packageSubpath * @param {object} packageConfig * @param {string} base * @param {Set} conditions * @returns {URL} */ function packageExportsResolve( packageJSONUrl, packageSubpath, packageConfig, base, conditions) { let exports = packageConfig.exports; if (isConditionalExportsMainSugar(exports, packageJSONUrl, base)) exports = { '.': exports }; if (ObjectPrototypeHasOwnProperty(exports, packageSubpath)) { const target = exports[packageSubpath]; const resolved = resolvePackageTarget( packageJSONUrl, target, '', packageSubpath, base, false, false, conditions ); if (resolved === null || resolved === undefined) throwExportsNotFound(packageSubpath, packageJSONUrl, base); return { resolved, exact: true }; } let bestMatch = ''; const keys = ObjectGetOwnPropertyNames(exports); for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (key[key.length - 1] === '*' && StringPrototypeStartsWith(packageSubpath, StringPrototypeSlice(key, 0, -1)) && packageSubpath.length >= key.length && key.length > bestMatch.length) { bestMatch = key; } else if (key[key.length - 1] === '/' && StringPrototypeStartsWith(packageSubpath, key) && key.length > bestMatch.length) { bestMatch = key; } } if (bestMatch) { const target = exports[bestMatch]; const pattern = bestMatch[bestMatch.length - 1] === '*'; const subpath = StringPrototypeSubstr(packageSubpath, bestMatch.length - (pattern ? 1 : 0)); const resolved = resolvePackageTarget(packageJSONUrl, target, subpath, bestMatch, base, pattern, false, conditions); if (resolved === null || resolved === undefined) throwExportsNotFound(packageSubpath, packageJSONUrl, base); if (!pattern) emitFolderMapDeprecation(bestMatch, packageJSONUrl, true, base); return { resolved, exact: pattern }; } throwExportsNotFound(packageSubpath, packageJSONUrl, base); } function packageImportsResolve(name, base, conditions) { if (name === '#' || StringPrototypeStartsWith(name, '#/')) { const reason = 'is not a valid internal imports specifier name'; throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, fileURLToPath(base)); } let packageJSONUrl; const packageConfig = getPackageScopeConfig(base); if (packageConfig.exists) { packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); const imports = packageConfig.imports; if (imports) { if (ObjectPrototypeHasOwnProperty(imports, name)) { const resolved = resolvePackageTarget( packageJSONUrl, imports[name], '', name, base, false, true, conditions ); if (resolved !== null) return { resolved, exact: true }; } else { let bestMatch = ''; const keys = ObjectGetOwnPropertyNames(imports); for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (key[key.length - 1] === '*' && StringPrototypeStartsWith(name, StringPrototypeSlice(key, 0, -1)) && name.length >= key.length && key.length > bestMatch.length) { bestMatch = key; } else if (key[key.length - 1] === '/' && StringPrototypeStartsWith(name, key) && key.length > bestMatch.length) { bestMatch = key; } } if (bestMatch) { const target = imports[bestMatch]; const pattern = bestMatch[bestMatch.length - 1] === '*'; const subpath = StringPrototypeSubstr(name, bestMatch.length - (pattern ? 1 : 0)); const resolved = resolvePackageTarget( packageJSONUrl, target, subpath, bestMatch, base, pattern, true, conditions); if (resolved !== null) { if (!pattern) emitFolderMapDeprecation(bestMatch, packageJSONUrl, false, base); return { resolved, exact: pattern }; } } } } } throwImportNotDefined(name, packageJSONUrl, base); } function getPackageType(url) { const packageConfig = getPackageScopeConfig(url); return packageConfig.type; } function parsePackageName(specifier, base) { let separatorIndex = StringPrototypeIndexOf(specifier, '/'); let validPackageName = true; let isScoped = false; if (specifier[0] === '@') { isScoped = true; if (separatorIndex === -1 || specifier.length === 0) { validPackageName = false; } else { separatorIndex = StringPrototypeIndexOf( specifier, '/', separatorIndex + 1); } } const packageName = separatorIndex === -1 ? specifier : StringPrototypeSlice(specifier, 0, separatorIndex); // Package name cannot have leading . and cannot have percent-encoding or // separators. for (let i = 0; i < packageName.length; i++) { if (packageName[i] === '%' || packageName[i] === '\\') { validPackageName = false; break; } } if (!validPackageName) { throw new ERR_INVALID_MODULE_SPECIFIER( specifier, 'is not a valid package name', fileURLToPath(base)); } const packageSubpath = '.' + (separatorIndex === -1 ? '' : StringPrototypeSlice(specifier, separatorIndex)); return { packageName, packageSubpath, isScoped }; } /** * @param {string} specifier * @param {URL} base * @param {Set} conditions * @returns {URL} */ function packageResolve(specifier, base, conditions) { const { packageName, packageSubpath, isScoped } = parsePackageName(specifier, base); // ResolveSelf const packageConfig = getPackageScopeConfig(base); if (packageConfig.exists) { const packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); if (packageConfig.name === packageName && packageConfig.exports !== undefined && packageConfig.exports !== null) { return packageExportsResolve( packageJSONUrl, packageSubpath, packageConfig, base, conditions ).resolved; } } let packageJSONUrl = new URL('./node_modules/' + packageName + '/package.json', base); let packageJSONPath = fileURLToPath(packageJSONUrl); let lastPath; do { const stat = tryStatSync(StringPrototypeSlice(packageJSONPath, 0, packageJSONPath.length - 13)); if (!stat.isDirectory()) { lastPath = packageJSONPath; packageJSONUrl = new URL((isScoped ? '../../../../node_modules/' : '../../../node_modules/') + packageName + '/package.json', packageJSONUrl); packageJSONPath = fileURLToPath(packageJSONUrl); continue; } // Package match. const packageConfig = getPackageConfig(packageJSONPath, specifier, base); if (packageConfig.exports !== undefined && packageConfig.exports !== null) return packageExportsResolve( packageJSONUrl, packageSubpath, packageConfig, base, conditions ).resolved; if (packageSubpath === '.') return legacyMainResolve(packageJSONUrl, packageConfig, base); return new URL(packageSubpath, packageJSONUrl); // Cross-platform root check. } while (packageJSONPath.length !== lastPath.length); // eslint can't handle the above code. // eslint-disable-next-line no-unreachable throw new ERR_MODULE_NOT_FOUND(packageName, fileURLToPath(base)); } function isBareSpecifier(specifier) { return specifier[0] && specifier[0] !== '/' && specifier[0] !== '.'; } function isRelativeSpecifier(specifier) { if (specifier[0] === '.') { if (specifier.length === 1 || specifier[1] === '/') return true; if (specifier[1] === '.') { if (specifier.length === 2 || specifier[2] === '/') return true; } } return false; } function shouldBeTreatedAsRelativeOrAbsolutePath(specifier) { if (specifier === '') return false; if (specifier[0] === '/') return true; return isRelativeSpecifier(specifier); } /** * @param {string} specifier * @param {URL} base * @param {Set} conditions * @returns {URL} */ function moduleResolve(specifier, base, conditions) { // Order swapped from spec for minor perf gain. // Ok since relative URLs cannot parse as URLs. let resolved; if (shouldBeTreatedAsRelativeOrAbsolutePath(specifier)) { resolved = new URL(specifier, base); } else if (specifier[0] === '#') { ({ resolved } = packageImportsResolve(specifier, base, conditions)); } else { try { resolved = new URL(specifier); } catch { resolved = packageResolve(specifier, base, conditions); } } return finalizeResolution(resolved, base); } /** * Try to resolve an import as a CommonJS module * @param {string} specifier * @param {string} parentURL * @returns {boolean|string} */ function resolveAsCommonJS(specifier, parentURL) { try { const parent = fileURLToPath(parentURL); const tmpModule = new CJSModule(parent, null); tmpModule.paths = CJSModule._nodeModulePaths(parent); let found = CJSModule._resolveFilename(specifier, tmpModule, false); // If it is a relative specifier return the relative path // to the parent if (isRelativeSpecifier(specifier)) { found = relative(parent, found); // Add '.separator if the path does not start with '..separator' // This should be a safe assumption because when loading // esm modules there should be always a file specified so // there should not be a specifier like '..' or '.' if (!StringPrototypeStartsWith(found, `..${sep}`)) { found = `.${sep}${found}`; } } else if (isBareSpecifier(specifier)) { // If it is a bare specifier return the relative path within the // module const pkg = StringPrototypeSplit(specifier, '/')[0]; const index = StringPrototypeIndexOf(found, pkg); if (index !== -1) { found = StringPrototypeSlice(found, index); } } // Normalize the path separator to give a valid suggestion // on Windows if (process.platform === 'win32') { found = StringPrototypeReplace(found, new RegExp(`\\${sep}`, 'g'), '/'); } return found; } catch { return false; } } function defaultResolve(specifier, context = {}, defaultResolveUnused) { let { parentURL, conditions } = context; if (parentURL && policy?.manifest) { const redirects = policy.manifest.getDependencyMapper(parentURL); if (redirects) { const { resolve, reaction } = redirects; const destination = resolve(specifier, new SafeSet(conditions)); let missing = true; if (destination === true) { missing = false; } else if (destination) { const href = destination.href; return { url: href }; } if (missing) { reaction(new ERR_MANIFEST_DEPENDENCY_MISSING( parentURL, specifier, ArrayPrototypeJoin([...conditions], ', ')) ); } } } let parsed; try { parsed = new URL(specifier); if (parsed.protocol === 'data:') { return { url: specifier }; } } catch {} if (parsed && parsed.protocol === 'node:') return { url: specifier }; if (parsed && parsed.protocol !== 'file:' && parsed.protocol !== 'data:') throw new ERR_UNSUPPORTED_ESM_URL_SCHEME(parsed); if (NativeModule.canBeRequiredByUsers(specifier)) { return { url: 'node:' + specifier }; } if (parentURL && StringPrototypeStartsWith(parentURL, 'data:')) { // This is gonna blow up, we want the error new URL(specifier, parentURL); } const isMain = parentURL === undefined; if (isMain) { parentURL = pathToFileURL(`${process.cwd()}/`).href; // This is the initial entry point to the program, and --input-type has // been passed as an option; but --input-type can only be used with // --eval, --print or STDIN string input. It is not allowed with file // input, to avoid user confusion over how expansive the effect of the // flag should be (i.e. entry point only, package scope surrounding the // entry point, etc.). if (typeFlag) throw new ERR_INPUT_TYPE_NOT_ALLOWED(); } conditions = getConditionsSet(conditions); let url; try { url = moduleResolve(specifier, parentURL, conditions); } catch (error) { // Try to give the user a hint of what would have been the // resolved CommonJS module if (error.code === 'ERR_MODULE_NOT_FOUND' || error.code === 'ERR_UNSUPPORTED_DIR_IMPORT') { if (StringPrototypeStartsWith(specifier, 'file://')) { specifier = fileURLToPath(specifier); } const found = resolveAsCommonJS(specifier, parentURL); if (found) { // Modify the stack and message string to include the hint const lines = StringPrototypeSplit(error.stack, '\n'); const hint = `Did you mean to import ${found}?`; error.stack = ArrayPrototypeShift(lines) + '\n' + hint + '\n' + ArrayPrototypeJoin(lines, '\n'); error.message += `\n${hint}`; } } throw error; } if (isMain ? !preserveSymlinksMain : !preserveSymlinks) { const urlPath = fileURLToPath(url); const real = realpathSync(urlPath, { [internalFS.realpathCacheKey]: realpathCache }); const old = url; url = pathToFileURL( real + (StringPrototypeEndsWith(urlPath, sep) ? '/' : '')); url.search = old.search; url.hash = old.hash; } return { url: `${url}` }; } module.exports = { DEFAULT_CONDITIONS, defaultResolve, encodedSepRegEx, getPackageType, packageExportsResolve, packageImportsResolve }; ts-node-9.1.1/register/000077500000000000000000000000001376344015600147305ustar00rootroot00000000000000ts-node-9.1.1/register/files.js000066400000000000000000000000571376344015600163720ustar00rootroot00000000000000require('../dist').register({ files: true }) ts-node-9.1.1/register/index.js000066400000000000000000000000321376344015600163700ustar00rootroot00000000000000require('../').register() ts-node-9.1.1/register/transpile-only.js000066400000000000000000000000631376344015600202450ustar00rootroot00000000000000require('../').register({ transpileOnly: true }) ts-node-9.1.1/register/type-check.js000066400000000000000000000000571376344015600173240ustar00rootroot00000000000000require('../').register({ typeCheck: true }) ts-node-9.1.1/screenshot.png000066400000000000000000003554631376344015600160070ustar00rootroot00000000000000‰PNG  IHDRî‚Àé IDATx^ìÝpÕáÇñß5õÞeË–eËÝÆSŒé-†Ð ½„Pmz35@è½$&`Bc\qï]V±¬ÞOºûÏ®,!Y’­“Nç÷Ýf@÷ö•Ï»wÌüæí>›¸@@@@@Àr6£G^¯×k¹žÑ!@@@@‚TÀf\wA:û @@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w–:† € € € ÌwÁ<ûŒ@@@@À²w{™šY³>ׂ… µdéR-]²D;vXv2é € € € ÐRRR´ß~£µßèý4~Ü8sÌѽ¡Ûï#Á]ä›6oÖ•W^¥yóç|Rh@@@&I'ê™gžÖ€ÌÌ`ö^ÇJp×Ñ›ý«n¿ýUVUí € € € €ÝˆŒˆÐý÷ݧ³ÎšÖýÊ~&5Üí6‘¯¿ñ†nºù–ŸÉô2 @@@@ w <üЃ:ÿ¼ózW§{¨·w-`7mÚ¤Ã?BUÕÕ=ÄMµ € € € €{ˆ×W³¿Ô€‚Šàn×WÀãñèÄ“NævA¿$@@@@}-0iÒ$ýó£e·Û÷uWöiûw»øç/X _œðË}:4Ž € € € Ð(ðï}¬‰&5ÁÝ®éáÅuûwõ—Á#€ € € €V¸÷ž»ué%—X¥;û¤w»ØÏ=ï|}úÙgûdh@@@@ µÀÉ'Ÿ¤—^x!¨YîvMÿÈQ£µ£°0¨¿ @@@°Š@FF†Οg•îì“~ÜíbOIKß'@£ € € € €í äå5 ÁÁ]P/ € € €Ö ¸³ÙlÆôx½^¯u§©ç{ÆŽ»ž7¦@@@@À‚;‚;óûBpç˲¡, € € € Ðówww=¿Îh@@@ðY€àŽàŽàÎçeà  € € € €@Ï ÜÜÜõü:£@@@@Àg‚;‚;‚;Ÿ— 7 € € € €=/@pGpGp×óëŒ@@@@Ÿîîî|^6Ü€ € € €ô¼ÁÁÁ]ϯ3Z@@@@| ¸#¸#¸óyÙp € € € Ðówww=¿Îh@@@ðY€àŽàŽàÎçeà  € € € €@Ï ÜÜÜõü:£@@@@Àg‚;‚;‚;Ÿ— 7 € € € €=/@pGpGp×óëŒ@@@@Ÿîîî|^6Ü€ € € €ô¼ÁÁÁ]ϯ3Z@@@@| ¸#¸#¸óyÙp € € € Ðówww=¿Îh@@@ðY€àŽà®×wN›44,LCÂCͱ¬®®ÕššÕ{}^=rƒÓ! íc×à>v³þ5Û=æ?õ =Òœï•:$[†ÃüǸ¼ÛÌd•þù>"î@@@@àg!@pGp×+ƒ;#¬›Þ7M‡ÄD)Îa—ÇnWlXcpWZS+»Ç£’¾.«ÐÌmyòx¹aÝ-§†hʧâ"lòȦ¸¨Æ`¬¤¢AvyURåÕÿVÔë÷êä tÈègFÊ>Ú%EÚd“CÎh—Ù¿úò:y ±J¯¶GäÎâRÍX»I•v©þ_Mvj湑JŠ÷ïûãš:SX\«®Ô‡s»vº¬ýà…ý.Qa 1]ßÞnª)*SÍK;åù¶{ïáÛ[;|Ž € € €@° ÜÜÜÜué÷à®KlÜ„ € € €@§îî,ÜÓ~TvD?»^ãQY•íôÏ-@@@ðM€àŽàβÁ] §8`éš.Ÿ­ˆÃ)º¥R¯o‹º¹t §¸¦Xêjÿº8,nC@@@ Xîî,Ü›5"[#ÒSârúuMÖ¹ÝZž[ cW¬ïV½ŸÞ¡Q#â²w«žÝo®s{´t}•Ž¿§ª[õºŒSÄàD9üì×PW¯ªµ;åž^Ò­þq3 € € €t,@pGpgéàî¶Œ4]<¨¿"ÂÃüºŽ+««õÒú­š¹-¯[õÞzzˆ.>6J‘þ +ªÜzé“J=ð~÷~pœ©ˆ“’äŠð¯Ÿ»ªFUªáíÊnùq3 € € €Üu$`3.ãC¯×Ôü¥¤¥[rûؾ5D2ÒüÚ¿Í9yš´tM·ë´Û¤ïŒÔÀ~‘Ý®«e·UjòM~Ål’ëÉxEg¦øµå[ 侪دuR € € €´`ÇÁù°jpgôí7É šžÙG}’ü²~·é¾M9z¯Ð?ÁÓS\šþëpõMõÏ®¶œüjÝÿÕzï»z¿Œ×qX¸\gÅ("-Î/õU啨îÍRy¾®ñK}T‚ € € €í ÜÜY>¸3:øÚàL–ž¢Èˆðn­åŠÊ*ÍÎÛ¡‹ÖnîV=»ßüêÕá:lL˜¢"\ݪ·¼Ò­Ù‹ktñ3Õݪg÷›]7Æ*l|œ\‘Ý ë*ªU» Dî?–ùµT† € € €mîîzEpgtò½¡YššÔå𮢲Zó uÆê=ò[ðîáš84\Q]|ßÚÍ[]£3õoh×4X×± ÞõðÎ íV”Ê}_iøQ) € € €´ ¸#¸ë5ÁÑÑWgj|l´ÏÍÇ.(-÷ûN»ÝP^¹*\ã9Õ7Õ·Æã± ÖÕû}§ÝîýsÝ#ÇpŸ›5mX]ÍN;þ‚ € € €@îîzUpgtöŒ¤xÝ–¬”„X9]N…¸Ú<µÎíV½»^;ŠKõPÓnoëóŒƒúÃI¡JI UˆËnþÓÞUçöÈøgGQ­ù°Öoï´Û[ÿ쇆ÉqZ¸Â’cdw:åiÿD܆ºzyêëUSX¦†w«y§ÝÞ`ù@@@? ÜÜõºàÎè°qðŒŒTM‰R¼Ã!ݮذPs,¥5µ²{<*nhÐË*5s[žŸ—ÍÞ«3Î*žþë2©øH›<²).ÊaÞXRÑ »¼*®ôêëåõzàýº½Wèï6É1-RöÑ.)Ê&›ìrF‡˜­Ô—×É+Tá•g‰[ oûát[÷Ÿú@@@‚;‚»^ܵ\›F64.Š#€ € € € ¸#¸#¸ ÄJ£ @@@@ÀG‚;‚;‚; Å@@@@@ÜÜÜb¥Ñ € € € à£ÁÁÁ‹†â € € € €@ îîî±Òh@@@ðQ€àŽàŽàÎÇECq@@@@ wwwXi´ € € €ø(@pGpGpç㢡8 € € € ‚;‚;‚»@¬4Ú@@@@| ¸#¸#¸óqÑP@@@„ÁÁÁ] Vm € € € €> ÜÜÜù¸h(Ž € € €B€àŽàŽà.+6@@@@îîî|\4G@@@!@pGpGpˆ•F € € € €€www>.Š#€ € € € ¸#¸#¸ ÄJ£ @@@@ÀG‚;‚;‚; Å@@@@@ÜÜÜb¥Ñ € € € à£ÁÁÁ‹†â € € € €@ îîî±Òh@@@ðQ€àŽàŽàÎÇECq@@@@ wwwXi´ € € €ø(@pGpGpç㢡8 € € € ‚;‚;‚»@¬4Ú@@@@| ¸#¸#¸óqÑP@@@„ÁÁÁ] Vm € € € €> ÜÜÜù¸h(Ž € € €B€àŽàŽà.+6@@@@îîî|\4G@@@!@pGpGpˆ•F € € € €€www>.Š#€ € € € ¸#¸#¸ ÄJ£ @@@@ÀG‚;‚;‚; Å@@@@@ÜÜÜb¥Ñ € € € à£ÁÁÁ‹†â € € € €@ îîî±Òh@@@ðQ€àŽàŽàÎÇECq@@@@ wwwXi´Ê”ùš IDAT € € €ø(@pGpGpç㢡8 € € € ‚;‚;‚»@¬4Ú@@@@| ¸#¸#¸óqÑP@@@„ÁÁÁ] Vm € € € €> ÜÜÜù¸h(Ž € € €B€àŽàŽà.+6@@@@îîî|\4G@@@!@pGpGpˆ•F € € € €€www>.Š#€ € € € ¸#¸#¸ ÄJ£ zP zàp¹"bä®,SùÆ•=ØU#€ € €R€àŽàŽà.+.HÛŠê—­Š­ë‚tô=?ì±ÓŸQÜàýT²j±?|uÏ7H  € € € ¸#¸#¸ ÈR ÎFâG¾D!1ñšsïƒ!£&¸ 2M € € €û@€àŽàŽàn,¼`irè…3”>åxÕÜõà¤Üõ .U#€ € €ûP€àŽàŽàn.ÀŸ{Ów™a‚»À8Ó  € € h‚;‚;‚»@¯º jà.0“MpgZA@@-@pGp×+ƒ»¡ããUY^¯mk˽fÚ´çŠKRLÖpy=õ*úqŽù¹qÊgò„ß"O]­JÖ,VþÜÿH õíö7jÀ0…Æ'›”Vl^-WtœR:N‘ÍòUÛ7*ÿûÿ¨®xG»÷GôÍRxJ†ùYÉêÅj¨êØ%aÔdÙ\!òºëT´l®_ý¢ŽPHlbsG¦øáãUW^¢Õ¯?ܦ­ÚÂÜ=Za Wòø©Š0L!± ’×kÖU•»YEË穦`›_ûß²2ÌkËú"ûVÒØ) KN—ÝáR]Y‘JV-ÒÎ¥ßwø½hÕŸè8¥ì¤¢ú‘ÍéTUÞåÏ™%ÃЗàÎh?qìÁŠì;PΰHÓ³tíí\üù]åB@@°ŽÁÁùmLIK·Î·²=9áÂ,zJ?ål¨Ð¼Y¹Z0»@µU ¸ÓÿE’'¦‘WÜ+¯×«ÿ]qŒ²§]£>SOlÓPùÆUZüÇëÔPUÑæ³—Þ¥”ÉGªhùÚôÏ?kÔ•÷)$:®U¹úš­}ëqåóï6÷aÌ„;^‘+2Z…‹¿Õ²'oiw iS©açßl~¶ö¯+ç‹¿ûdô5)qìA®3÷ëµúõ‡Ú-Ÿ0æ@ »`ºy°EG×ú÷_ÔÖý¥ÓíùRÐój´g 3Ç‘²ÿí6op+^¼W›Vuؽ¤ ‡jèù7›óÛòj¨­ÑÊWgÊH÷vª¬=$TƒÎ¼J}9Q6‡£M[5…yZñò}*[ó£/L”E@@èA‚;‚;óëÕÛ‚»ãΠ#Îèß¼4êjêõã·;5ï³\mZYÖƒK¦mÕMñIîÿþ­ôC~aîz+]¿B!1qJ}€BÝb’r¾ü@kß|¬M%MÁ]]éNÉæ3"Róf«jûf…&$+uòQrFD™áಧoÕÎEÿkSGÒ¸©uõýæß×¾õ¤rþó­Ê„§ejÂ/ËfÖ½â¹;üî”q왊ê?¸¹Þ˜A#‘ÒWFèX¸èë6핬Z¨¼ÿý«Íß¾NºûUÙ]!Í÷žz·Â’“=ÊÜå¸åÓ·µáÝgý>£BÌ«WÒ˜Wˆ‰f‚;~£†ºj³ÿ‰c’ñT_]©÷^¢ê¼-mÆ;lœÆ\ÿ˜ì§Œ ®`Þ—ªÎÏQxJ_%O:B6›ä®,SXBŠJV-Ö⇯nS‡ÍéÒØWì1æg•Û7jçs䮪PDj?%O:LÎÐp5ÔÕjáW¨róš1¥R@@@ßîîÌoLo î$¯î§IG¦jÔAÉ ûiQÞæJý0+W g¨ª¼ýGS}[&{.Ý2à1J®þó£Êýê£æ›Bb4nú3 OÍPCM•¾¹öDó1Õ–WSpgü­Á]§%^g>¾Øt…&¥k­ϙ¡Öhî-gÊ[ïnÓ1c·_ÆÑ§Ëã®Ó‚™—70Fp3þöÝ/[U9Zp÷Ej¨®ô'C»uuõwÙgý^GýZž†z-¼çwí>NÑw€Â’Ò›Oö÷`ü1¯iSŽ×° g˜]3u^ùÊý­‹5ÚqÙݲÙí*Z1ßœ÷–—üíß_Ùg€ùÝYôÀ•­, ƒq7?#WTŒy[GÁÝÀ3®Pÿ㦙e6ümøà%Ù¼FíWhBªÆÞü”“ÓU¾iµÜs±¿9©@@@  wwæ×¦÷w?}ÛCÃì}H²âeüéñRw]ƒ–}W¨¹³ò´aii–Gçniðì\öƒ–>v}›ûqІüöæßçAÔnE¶ î¶~ö7­ç™6u´|ÌuÙ3·©pÁÛ”±9œ7ãYs7Wuþ6Í»ëByj«•}öuÊ8òT3Ð[h„?{x,³s£î\©®wcnü“ùn¼Šmë5ÿŽó;טŸKùc^'Üþ’¢³†É]Y®ïo:½Ý°tØÅ·)í cÍÞÏñ[UçmnIìбwóSæoüàmþçëmF™qÌo”}æUæßÛ î\Ññ:àÑ÷äp…˜;A=tµlíX%Ž;D£¯ži~²à¾KU¾a…ŸE©@@@ÀW‚;‚;ó;Ó›ƒ»–_úÄ´0M8*UOQ|JxóG…9Ušk¼ ïË|U”øw^Ë€gÕk¶ûè§ñÈèø[Ÿ7û³ìéÛT¸°uèÖ2¸›÷Åæ»_Žˆ(MùÓÇæûɶõ‘ÖüùÑv×»± mâ]¯šÖæÍ™¥?|©Ñ×>h–]û×'”óÅû¾þNt¹|Wƒ»‘WÝoJaœðý§ËSWÓå>tõÆîΫ32FSžj| 8÷ÛO´ú•ÆPl÷+~ä$óQØöæ'ëÔ‹•ùËóÌϾŸ~–jò·¶¹ßØÑyÐ;<Û îÒ;YCϽÁü|Éc7t| ‰Ã©CžþDŽÐ0mxÿ%mùן»JÇ} € € €~ ¸#¸3¿J?—à®y]ؤìýâ4ñ¨T: Q!aNó£Òµºÿ|ÿž¤Ú2à1elùˆkSÂÓ35ùþ7Íÿ\ùòýÊÿîÓVK¸)¸ó64è¿—Õá)£û?ø7óq¥ë–iÑÌË;ü030¸0.ã½eŽP,øJ+ž¹ÝO?«¦«Á]ƱӔý›+ÌFŒ]b[?ý›Œ÷á5ÔVwªá°H‡†NèøP‹Ý+YúM¡<žÖíî¼Æ§q7?iVºæ­'´ý?í¦Î¨XMyòc³Üî‡uŒ¼z¦’Ç¢úÚj}sù1ŽýÀÇ>Ph\R»Á]ÓŽ>ã»e<¦m±¯&ÛxjnYqî;÷{¿®¸–Ïü;/h÷}lÆa “g6w«^™©¼o?iÕ‡¦à®¶´Hs®;¹Ãþþ¬â6ƒ;½ñe]Mï‰3>¯Þ±]ó÷Úµs¢­_1v«¬«ÁñN¾q7?­˜A#šk4‚§ŠíU±yŠ—ÏÓŽÿm÷=Æ }²"õû''tzh·ŸþjkZ'wÝ×–÷/öví˜ÿU‡ý™úâ—²;]Ú±ðk-úÖærMóm¼—ð‡[Îìðþ w¾¢èÌ!íwcn|BñÃ;oa4²§“‰;JA@@@n ÜÜ™_¢ŸSpëÒ˜©ÉšxDª2²£›IYQ­æü;W_¼ÓöäÎî~cs¹¦wä§ÀλíÜïwëóŠ4²Ýà®é3¯ÇÓ¸Û®WÑŠyZñ¬ÿOîDÓA@@h!@pGpg~z{pgwØ4|b‚&™ªa“ätÚÍqy<^­YP¬¹Ÿåjå¼m‡ôǯ?ƒ;wE©¾½æ—vkü­/˜»Ð*·oÒ¼ÛÎé°\☃›ßkgìT3Þ‹Wð×Zñüþr§ëèVp×¢ã=n1ƒF)~ô$¥L:R®ÈÆ@¶týr-¼ÿ²v[èt';(ØÝymyØÃòîÒŽ¹_´Û’q¶ëa/ÿ׃¢4éˆT94YQ±!Í+¤xG枯>ÏSia­ÿWN‹»ðUµ<œâëË1O‚mï:èñ›¨â• ôã#¿o·L¨q8Å/Ëc>ò¸cÞl ÿÝmfÙ5yLÛgУ-+÷WpײNãŽý®yP±CwÔͽõ·ªÎýé$V ®»ó•5\oÑìÎú÷_ÔÖý¥ýùJHÕ¾g~¶uÖ»Zÿ·ÆSd«éýtž†z}}ÙѾûpÊ3ŸÊÙnp7ø·Pß#NQCmþwÕñÖá/7êA@@ðŸÁÁùmêm;î†MŒ×ñçTzfdójh¨÷håü"Íý,O«IÆV¦\Ý xŒ.¶ î::ù3,9]<ô®9¢-Ÿ¼¥ ÿ÷\›ÑÙN›þ¬bWmñÍ»óÕW”jèE3”~ðñjp×iáÌËU¹yMd¤!çÞ >‡¬úêJ}såq~k3aÔdí÷‡ÆSu—R»ò¥û”?ç³æû}†O»Úüï…3¯PÙº¥mÆÙw &Ýû†ù÷öN•MÞÿH¼ì.óóÿx½Š—ÿàw+*D@@è‚;‚;ó›ÕÛ‚».ÌÒ¡§ô3û^˜W­yŸçiþçy*/v÷ÌJÙC­Ý xŒª[w uÚåÊüÅY!Îý—«lý²6½Êžv2Ž>]ÆûÌ~üãu*Y¹Ð,ã —q€ADZ?ó‘ÉÆAÕ•=n5àWiÀIç›í̹á4ÕåwªM#€ô6ÔwX6õ ã4üâÆC:²èTC=<¯£®yPIc–ñ¸ò¼;ÏWÕöM­ZôÚlš0ãyóñg»Nß]ª´6]ÆîÉn kóæÌÒª—îmÓãÁç^¯¾‡ýÊü{{ÁÍ¢yO¡1ñªØ²Æ =uïBµ‡†Ëëi×]×]BîG@@è¦ÁÁùêmÁÝqç PRz¸æÎÊÕÚÅÅR¼å¬s«ËßÁÑêÆ_Õæ¾!yLHž|¤†_|›ì§J×ü¨E^Õ¦sIãÕ¨«î3ÿ¾ùã?kãß_jU&2sˆ&ÌxNvWˆ æÏÈáqÃ'jì›ýعì­}óqUïȑͻçíÆ ¥k—(îÌSdm-F=p„F^v·Â’ÒT[V¬9ןÚ#úc^c²GkÜôgdüÌï%\öômªÎk|¬×¦ì³®QŸ©'šÿóåZûæcmæuÄe÷(eÿÃÍ¿¯}ëImûÏÿ™† ±›qÈ9×›õW{Áñ÷Ôm~\Úx/àÚ??Úêôc£®¨þƒ•:ù(¥O=Ñ<¸¶0·s €R € € €=&@pGpg~¹z[p×[´Œszlìµbš¹ðÁ«T±qeOòȦÌ~«ä‰‡+<µ_óî0£Ñܯ?Öê×jÓ~¿ÎQÚG+²OV»}+Û¸Rëß}V¥«÷Xßý1¯MK›r¼²N½D¡qI­úkÌAî7ÿÖ†÷_PCUE‡c MLÓÐ nVˆ‰m¾+^¸KÇMSƧì1¸3n4Þ h<¾l¼q÷ËË7­2OÎùâ}yw…«=LÅ € € €{ ¸#¸3¿$w{]+=Z ep7÷¦ÓͶ"úPDŸ¬ÆÇ,s6¶ ìz´C=T¹ñN7ã}{6»ÝlÁ‡öô¾5WLœ"ûf+$6Av‡CîŠ2Uälè•»ÁŒ±Gg•qȈÝáR]i‘Ê7,WC'·7a)Šê7H6§SU¹[T¹em—fÊØÅg<k¾ÏÎØ±W¹mC«÷ëu©bnB@@ð«ÁÁÁ_—T×*k/¸ëZMÜ… € € €?‚;‚;‚; ¬f‚; L]@@@@ÀbwwwX”w˜º€ € € €€Åîîî,°( î,0 t@@@‹ ÜÜÜY`Q<ýr%Œ>Pµ%;´ô±ë-Ð#º€ € € €ûZ€àŽàŽàn_¯BÚG@@@Ú ¸#¸#¸ã§@@@° ÁÁÁ&]B@@@îîîø@@@@,(@pGpGpgÁ…I—@@@@‚;‚;‚;~@@@@ ÜÜÜYpaÒ%@@@@€àŽàŽàŽß@@@@À‚www\˜t @@@ ¸#¸#¸ãw Ç† ŒÕª ¥=Þ ì]À!i@h˜……É%»y÷¥*ihØûÍ’Bm6MŽÓø¨(%8œªô4h}MþSV¬|·»SuP@@@ swww[+”ê‚ÀAãStÍy#”ªcÎý¬ 5p‹?"lv•”¬aáÊ W˜Ãˆï~º~¿iVÕTﵩþ!¡º½oõ kS¶ÖÓ çósõIiñ^ë¡ € € €@çîîî:·V(Õ{®› “î¯üÂ*‚».øùë–>.—^4¬Ãê:ÜÅØzj@¶RCBÌz¾-/ÕòªJ%:]:6.^Q§¼^¯îÙ¶Ys*ËýÕuêA@@‚Z€àŽàŽà.¨zvðw=ëÛÙÚàÁZ]]­UÕUZQ]©‰‘1:)!Ѭ¢3ÁÝe)éúUB’YþÅüíú{ñÎææûºBôDæ E;*t×éüõ«UßÙÎQ@@@ C‚;‚;‚;~ zL€à®Çh}ªØîm,î±ýtÛyI)š–”Ú©à.ÜfÓ[Ù#î°k}Mµ®Ü¸V²µ¨LÒ©ñIº$5ݬï‘í[õEY‰O}¤0 € € €@[‚;‚»^Ü ¯Êòzm[k½GòãB4eÿ4ÈŽW|LˆêÜ ÚœS©oäkÅÚ½‡CÅêðÉéê›!—Ó®%µš·d‡¾™—¯ú†] L;¿fCĨoZ¤v×hÉêb96ºš&IVb\¨ŠŠk5ûûíšûcá^ ívé ñ©?2Qé)r:m*¯tkkn¥,)Ô’ÕE’Z7F¥û WbüOï?;ë¤AÚl²ŠKku÷Ÿµi7· Êï‡V„Ä$(zÐH³­Êœª)ØÖáx£ Sh|²ùyñŠùòÔîý=o{Åë%| Öý˜#{!»>h±Û®i¸q‡ÞÎ.ã'õë²RÍܾ¥—HÐM@@@Àºww½2¸;áÂ,zJ?ål¨Ð¼Y¹Z0»@µU;³§–£ÓaÓUçÔ´³êl·™%«Šô»éߨ¦¶m_ÃÃìºû÷tìÔŒvïÝ´­\Ó™ßaøwËåc4íÄZ¼r§þpï÷z⎵߰„6u}ðé&ÝõdÛ­©`ÿ>‘úã­“5$+¶Cª9 óuÙmßµùü©;ÔÔÉi&Þ[_:]Q‹‚6‡Sã¦?«˜ÃU³3_óî¼@ UmÞˆ¾YšpûKr„„ª`Þl­x4×kïñ%¸»$%M§&4œÆn»õµ5 ±ÙôTf¶žÌÏÑòê*ó³—²›WÕ»uÖºU½Ö†Ž#€ € €V ¸#¸ë•ÁÝqç Ðgôo^Gu5õúñÛš÷Y®6­, øú2v·={ïA:`lŠÙvQI­¾þ!OÛò*årÚ4x@¬Ÿ¢ð0§=ó_*)«Û­^½0sJóý·–köœ\U×ÔkÔÐxMÝ?ÍÜÉTQéÖY×}¥ÍÛ*ÚŒ±)¸ËÛQ¥Û*4qT¢¾š›«­Û«”‘¡ÃHWˆ«ñ4ј«YÿÛÞ¦Ž—]ï?w¤ú÷‰’ÇãÕ÷‹ ÌÝu•õæîÁáÙqš´_’Ön*Ó´k¿jsÿ¹§dkXöOß~ÃÕ/=RÕÕõúòû¶íý°¤P~¶Ùï󖜮 w¼"Wd´v,üZËŸ¾µUöP¿í%Eed©ª G î¾H Õ•~+ô%¸»7#S“¢bÌ᜴z™ê¼^­»ú Ь’b=–׸«ñ¶>ý4%&Îü÷SW/W•×ceú† € €X^€àŽàÎü’¦¤5¾›ª÷\^ Ü/N“ŽLÕ¨ƒ’ÖHWÞæJý0+W g¨ª<0¯È¿ú¼áºø7§v~öõ6Ýõ§…ªªn½«.)>T3®£{ž\Ü&¸ûÕÑýu÷uÌû?ùj«nûã‚VÅ=¥¾eÙí6}¿¸@—Îø¶ÍT5wÆ•UnýnÆ·Z¾¦¸¹Ü˜añzå¡Cär94gQ.»µmGÜÇÜmg\<»Xûxc›vâcC5urª>šµ÷G!÷å;î’ÆMÕ¨«ï7û¿ö¯+ç‹¿7eȹ7¨Ïa'Ëã®Ó™W¨bój¿~õ!v;cD—êüöãíZ=ßx¹g/_‚» VfX˜Êëëuúº•fÇÎILÑÙÉ©ÚTS£Ë6­5ÿvyJºNÞu€EÓμžµ#€ € €?o‚;‚;óÞû‚»Ÿfh˜]£I6C¼¬‘»}ŒË]× eßjî¬M F@w索ܶNIÕ¨+ï3ǵö¯O(ç‹÷»5Æön6¾“÷þß”.Õû÷gÖêûOs»t¯/7ùÜýyàP¥„„(¿®Vçmhü^ý!-CÇÄÅ«ºÁ£SÖ.7ÿvARª~“Ô¸ëôúÍ뛡õ¥_”E@@øI€àŽàÎü6ôæà®å‚NL Ó„£R5áðŧ„7T˜S¥¹Æ»ð¾ÌWE‰wátdÝ{}ãn¹›þAŸ~•ãÓoŒü}ýÎ/Í{þñŸÍºý±…íÞà¸=ÿÁæg>ÿ£ÞþdžVåZw¿¼ð3mÍk|ïXËë¢3†èšónh/˜;ëäºùÒ1æçg_7[ËVïý0= v_wæûîf<«˜¬áªÊݬeÏÜf¾ÿÎx„¶`ÁWZñÌí>ÍUg ;\6rivg‹·*·à«m\ÖsAsSc¾wïdS¬Ó¥œÚZ]´±1¸»½oÝøXtÓã³g'¦èœäÆ“joݲQ F Ö IDATªÚ>ÒÝ%nB@@‚T€àŽàÎüêÿ\‚»æul“²÷‹ÓÄ£R5ê€D…„5Qº³V÷Ÿ?ׯËý¶«Æèô_ 4ëœzæ¿TÚæýu{nnâ~IzåÁCÌBírMwÇÆ„èë¿`þg{‡:4wõõM8éÃvO}=ãYºõª±fÇž÷©òv´>Euäx½õÄaæç9y•zéÕúßy*,®í’Ù¾îŒN‡%¥kâ]¯Ê¥†ºZó0ŠêÛ5ÿ® ƒî½v-'Ñ—àÎ8-6ÞéTN]­.Úµãnzz?۸õ)¸kz|ÖøÛ-›7hq½7°K‹„›@@@=ÜÜ™_Ÿ]p·ëKŸ–¡ƒOì«ÉÇ6¾Ã¯¬¸N÷û½_ž¸ã~@ºÊ+ê4åŒù\·ñþºGg4¾Wsõù7mqhªtþG'™ï¨ûò»íºî¾ÖdSp·§~œþ‹,ݶ+¸;þ‚Ï´=¿í®¼›.­³On½[Ì8dcåºb-\¾Sÿž½­Ã5Ú¶‚;£g-5ßk÷À•ªØܧžúܽ6p¨ÒCBTè®Óo×7¾ðÒ”4’ÜêQÙ “ÒtFRã鳿ߴN«jZÃ>/n@@@‚\€àŽàîgÜEƺ4fj²&‘ªŒìèæ%^VT«9ÿÎÕïìýP_~ŒÇWÇX ‹jtäo?ñåV³ì ‡÷ÓÌ'šÿ~ÍÝsôß¹yÖ1çýîÔ7óótåsZ•óWpgTzÄé:ó¤?"Ñ [^%eµšñÈ|}» `¯cµJp—8æ`¾öA³¿ÆûîÝw©*¶®Ûkÿ»\À&¥öèÒíe;ëT]áßǹÛëˆ/ÁÝ“™5$»ãbãõûôŒV‡Sü!­¯Ž‰K0?¿xýjmsï~zr—H¸ @@Z‚;‚;óËßÛwÜÙ6 Ÿ˜  G¦jؤ9vs\Wkkîg¹Z9o§<ÿ¯õGgLÒÑS2T]S¯Ný§Ï »õŒ]{ƵçwäyµèãSÌ“eg}£ü¡U[þ îš*ŽwhÔx06EGÒWýûD™UTºuÒïfigÉžƒ+w¡‰išxç+rEÅÈÛÐ ›Ã¡êümšw÷EòÔ´Ýqèó¶sÃÏípŠ[Òûé°]ÅN[³BÅžõu…è•ACõ¢z¶ q—èýýhBd´ê½¼z¹ZŸ«ìYê@@@‚K€àŽà®Ww}EiÒ©sh²¢bCšWoñŽÍÿ<_?|ž§Ò®½Ÿ­³?×]4RçÿzˆY¼£C!öTWË÷Ê=ùÆr½òNÛÓ`ûÓ’ÃõÙÇ™U½ùá:=òâÒîZ6àpØô‡‹Fé·¿j|Œöþ§ëÝoÜ#Ó>îN¿åÅ ¡šùZñüÚï†Çå WÁ³µâù;:;Í>•û¹w¿ILÖÉi¦Ám[6jþ®C'NˆKМò254îü[ö0Å9]­váùGa@@@Vww梷í¸61^ÇŸ?P陑Í_è†zVÎ/ÒÜÏò´zA‘ä Ìj?tršž¼ó@³±Ç_]ª×ßóíÌÐP‡¾}÷ó‘ÔömEËGjo}t¾>þrk«öÄŽ»ÝÃÃìúÌ]¯¿¿F¿ÒøØdG×íWÕiÇg™;ô>ýãÀLH‹V²§]£Œ£O7wÚ-zøZ•­ýQiSŽ×° g˜¥Ö¼ù˜¶ùÿûe“ú øé»éK%…µª*·Ö£²ƒÃÂõÔ€ÆÀö£¢B=WÛfH-Ëü½h‡^,èø‘o_<(‹ € €³ÁÁùýïmÁÝ féÐSú™}/ּ̫Ïó4ÿó<•»¾ž›þýÚ1JMŠPiyN¿ò åÖ´Û˜(—jjTçnýÌîŸî<@‡MNWCƒG§]ù¥6l)ou¿Í&ýå‡jô°Õ¹tÔ9Ÿ¶9½ÖÁËi“»¾ãij宿=ílêü¿¦KÏnþg{§Øöäd%›ªQWßo6±ñÃWµù¯577üÒ;”:ùèÆ÷ÝͼB›\¦Ë—wÜÉëÕˇ(#4L õæÉ²¥ ­„½)=CGÄÆ›„×nZ«Õ5í¯`2f¬ € € €@wîîÌïPo îŽ;g€’ÒÃ5wV®Ö..–dëîZèÖýÇÒGLo<vkn¥î}r¡æþXØ\§ñ˜©Ì]g.—’\.…Ènþ±N-©ªÚk„†*ÉáR׫%Õ•{-ß« x½šmvy»»VÛÝî^Õ}:‹ € € ðó ¸#¸#¸ À:©2š-Ý´yCÀB°±á‘º*­2BÃZ²¨Þ­³Ö­ÚëÈퟥQQf¹W-“[Þ½ÞÓ[ 8$ýkØh³»oîÈ×›; zK×é' € € €@ÜÜÜ`±ï‹à®_H¨ž0H¡v‡¼^¯rÝuªöxÌÑ–5ÔkúÖM{ù£ýjTD¤Yî¤ÕËÌw?—‹àîç2“Œ@@øù ÜÜÜ`}ï‹à>:)!QnGزAkkª}éÍ}úiLD¤Ü¯.ܰZ}À×çîútÁO\F@@ØwwwXxû"¸{2s †„GjQey§v×€ÁRMÜYj:è  € € €@;wwwøiØÁÝ«‡¨OH¨¾,-ÖùÛ0ÊÞÕÁ]ïš/z‹ € €£ÁÁ]¯ îŒàeÜ®ƒ¶ÔÕª ¾ýSA÷‹ˆ0OS-¬wkS]m«uî”4i×ɢƩ©•Rœ.§ŒÐÙdÓ†š}^V¬²†½?(j´592FIN—Ê<õZTY©ïËËÌÇM;{8E¤Ý®¢b4,,B±‡*½m¨©Ö·å¥*ÚC&GEËÞâtצe(ÎåÔ’ÊJ}P´£Õ¸Ý^¯æWU´û›gô5ÂÖxúlËëûŠ2ym¶½þN6Ý¿¹®Æ<©Õ¨ëð˜8e‡‡+ÜfWž»N_”•hënsÑQÅÆi¼Æ¥¹\rÚí*t»µ ¢\‹;yÊmFH¨ŽUßó‘ß5µÕš]Z¢Z¯‡Ã)ö:›@@@Ø—ww½6¸‹q8ôîàfÿŸÏÛ®Kv¶»–Þʦ§K³JŠõX^ëg-똱e£’].]•ÚG.{ëતޭ[·nÒúÚšvÛ·Ù4½O¦öŽnóù•ú¨x§îÈÈ4?ÛÓ©²'Ç'蜤TE9ŒH±õe,ñjA®þYRÔnþ1d¤BvëwG?.{:Uöùƒ5 ¬õ)´F==œ¢éþw ô]E™îÌÈ4ý[^õ^žÌËѬҒÿR].]—–¡±‘§Úî~-¯ªÔÌœ-ÚÙPßaç'¥êôÄd9v óëju÷¶Ízvàó^N•Ý—ÿ¢m@@@ŽîîÌïFJZz¯[%þîŒ`ï¨Ø8åÖÕi^e¹Œ½ec"¢šC¬M55ºlãi÷]g^¯föÏÒø];÷Ö×Tk®±;MÒäÈhe‡G(§¶V}CCM㎂»‹“SuZbŠY¦Ä]¯o*J´£Þ­x»KÇÄ(Ùb~öt^Ž>n'¼ûCZ_9[ôíÀèX…ÛíæxVî¶;­¢Á£g ¶·;çF?’mõ ÕÀ°póß} î~(/Wvx˜œ²é»ò2Uxê•ÑÄÕztñ†µæw¿ú¸\z4sPsà·¸²BFPW/¯†‡EjRT”Œ¥›SW««6®Uu;§ÝNKLÖyÉifÕ;Ýn}]^bîšaîhl9'w½nùÓa@@@ (îîîvíÚ3 ¾(-Öc¹ÛšOO5ÇÞ§Ÿ¦ÄÄ™N×oZ¯å5U­~‹‰Õ-}ú›3¿Çs·6?RjózuUZ_ŸØ|O{ÁÝþ‘Qº§_–Yfae¹îÛ¶EU^Oó=!6›níÓ_“£cTÝàÑ…ëW©Ø³çGwß8T©!!ÝzÇÝ´„d—Ò~ùÜ÷l¬­Ñ-[6¨´Å#¾§Æ'é’ÔÆ øõ‚<ým·ÇxåõêO™Ùažˆ{Î}_YÞÊ|lx¤îí7ÀÜùþÎziG^«ÏÇ_8ÄÜh6^צg˜åvîŽÓuéýÌÏîܶIó+Z?ÚtŽ«qÂíié:>.Quu:wCû¡XSçöup·¨²\Ó;g¤÷ÓÔ]ï¼`·qüeÐPó}~kª+uÝæ ­~T[ZÄ9úKö0óóÇrÿŸ½óŽªhÛð½=½÷„$„@BïM{/ˆE?Å."EEš *‚ ØÅÞP”¥÷Þ!@zïuË÷›Y6ìf7½rŸ¿`÷L»Î™“ÝkŸ™ç¬M¢‹Úw” >Ä>{/$8œ¡->jgޤ¤¸kq»Øa     h(î(î(îê‘™¶—‹+æ†GI†óÎâï<ÇYR¸ºcÖ¹åŸÅu…š>uŠŒ ;z°ÊÓ›[ÜmÌËÁì„3ûh‰ªK)-Ũ ânELgÁX›ãý”$ütn ³Ø—pelWY|UV&ÞJ9/Z­ëtQ(ñSLgŠ»Ú€æ¹$@$@$@$@$@$@MJ€âŽâŽâ®âÎ:©Äœ„Óø7/×áîíâ†9áæäÅÝh¿@ÜãgÎ&[`0ÀdµW[eOƒR“ ÷?|щ; ø-¶‹—HLQb• £ªÁ~‘–ŠåÙòg…?ǘëø-+‹SÎ/m¶®Ãº-FÜ5éß6F$@$@$@$@$@$PCww½¸û&:^jÌøúFr¼ÍÔðP©ð]=Ä]7gWÌ‹0GÜU\®iÝÐ¥n˜fÞO­¢¸îã‡ÌYVÿïø!¤ëõ5œ¾UŸÖR#î~éÐIî'XU´\•#7™ðGlWˆ©ýgv&X-m¶.ç®TáûäKw r˱      &@qGq×bÅ«R‰;˜—:Z/•´ž#Jdb RÙ(â.X­Á'çöY«Jþ óöÅ£!ÅÝ`wL;—$¡b’…úÌ÷†wwûúãÿ Ù¡Gö£Ät>ske}{7²="œP×¥²ïGF#ÜɹF 8*ëƒeŸ¼½xî¬í>y–2ÖûRÜÕçNcY      Æ"@qGq×bÅØËlELYõ]z>NO¶›'QZ–œËØÚw0™ðC‡N2BU™^§‡´Á /‡âÎ[¥ÆWѱrߤ§bYYekó hqw«—ž •ÍŽ:q)eeÕv¡¾âÎ’·È`Äý'!ßh¬¶ÍŠ'Ì Ç@wO~ô Ê,?êíƒÇÍc£¸«5b      hww-V܉ŽÕ!ZÌ@:®BRñ¾E‰7Џ01( ×zyÃ`2áÑ“G_Vj3uÔ|ÕAFý‰£âRYñÚ¬° pó@¡Á€§âŽ#¡BÖŠ(BW• yFC•ˆ†wÝ]\ñÚ¹äU-¶îH}Åu$Üʬ ¼’Xå8=U*älY\ãáI!æ,¾o&ÅcuN–MBú.>Hq×iØ @PÜQܵhq7.07zûÊ1|™ž"#§L „˜¹Í[ì£ÉÔhKeE»mµ:¼Ó¶=T NaVüi¤êÍ‘i~j5f†F ½³Kùu$îÚhuX g¥™ú2¼”€Íù¹r,–Ã_­Á`wOÜäíƒoÒÓðg®­Œªøhq'8~ µFöëÄx(*€E“é&ÏwQv¡¾âNÔ1!0×yûÈú„p]––„L+9§ÐÍÅ W{z!ÖÙžþ`Þ No2âDQ±üw;g'¨Jü•“‰«=Í"Ê‘¸¯‹ µSB#¤¼G޾ ¥¥ EýÕj)¡,Ç‚Äø&w¢½An˜¥•D´ôãÝäÄòl®å¯Õs;QkÓCÃÑ×ÍCV+äë™’ä pU)¦ÕÊâH)-Ũ“Gìn]-ørXdù½q¦¸¹F#"u:yoü››>®pV)¹T¶¥M|ö—H€H€H€H€H€Z Š;Š;y«·Tq'ú>ÀÕ‚Cá©Ö”OÛbƒ?e¥ãó´Ìn)Pc-•µ4z‹—FùJ)d9Ä>m_f¤àÏœ,|{.{meâN”‘w£ýÑßÍ] ¿ŠGbi‰Lúðsf2 UgŸmˆˆ;KûB*Žö’Ôúh,q'ÚK‚oööÁ>þÐjíX” Ø[X€59Ùø7/Çá#[dý*—S[“É„µ¹Yx'9 #¢áäDq×Jþàq˜$@$@$@$@$@$ÐÒPÜQܵxq' "´º8»Â[­F¶^CÅ…(¨CRƒúN`­BNN.ðÕhkÐã@a! MµO®à¬P ƒ³ Dâ µB!÷p;]R\¾·¾ý¬ky'…®J,ÁwbjQ 2ÍÖµ=K¹p­¡­”¢%&ƒL’WR\£,·"HŒ³3‚µ:”M8V\Ôìë˃åI€H€H€H€H€H€ZŠ;Š»‹BܵŽéÊQ’ ´&www­iÆs¬$@$@$@$@$@$@$@-†ÅÅÅ]‹™®ì( @k"@qGqGqךf<ÇJ$@$@$@$@$@$@$ÐbPÜQÜQܵ˜éÊŽ’ ´&www­iÆs¬$@$@$@$@$@$@$@-†ÅÅÅ]‹™®ì( @k"@qGqGqךf<ÇJ$@$@$@$@$@$@$ÐbPÜQÜQܵ˜éÊŽ’ ´&www­iÆs¬$@$@$@$@$@$@$@-†ÅÅÅ]‹™®ì( @k"@qGqGqךf<ÇJ$@$@$@$@$@$@$ÐbPÜQÜQܵ˜éÊŽ’ ´&www­iÆs¬$ÐÀT:g¸„FBíì…B)kÏO<…ÒÌÔn‰Õ‘ @ë#@qGqGq×úæ}“86ʇOæ4y»lÐ1­O|» ”o¦l\ciI­Q)µ:´»g,‚Ý¥ZcSþÈgó‘´î—Z×Ù\üzÆÓ qÈ=¶§¹ºÁvI€H€H€H€H€HÀŽÅÅÅ Fà’^7ª|¼u¸väêFk‡׎€O—þè6q¾,´qüP”æfÖ®1c¦"øÒd¹²‚<”d¥Âd4ÊÿŸYñÒ¶¯«uÍU çôwáÕ ë–ãØg š«l—H€H€H€H€H€(î*PˆC¼f2™L­ùþ nÍÃçØ‰Àì ½1ôšp¤¤RÜ5ãºT[_q§q÷Æ%o.‡B©DÊæ¿pø£90ôuéÊQ†â ì €Œ¸£¸“·ÅŸA€â®1¨Ö¿ÎúŠ;ŸnÑmü<Ù‘]¯<‰œcë2K‚ IDAT{ëß©f¬â®á³i     * PÜQÜQÜñ!Ñh(î m½*®¯¸ x:><]öaóó#Pœ_¯þ4waŠ»æ¾lŸH€H€H€H€H 2ww-RÜÅôòFAžñÇò.¸Ùíë¥Å ~Aèí o-JË 8P€ ;RpðXvµýiç‰+ú#4ȵÙ%ض7 ÿmKÞPùŠî‘ rEFV1öÉ‚J¥Àeý‚з»?|½tÈÌ*Á?›±eOzµ}P*Kz¢Wg_¸@­V ¯  g“ °co:ö{¢ÉUæ6G·oøz;•¿vï­íЯ‡?²rJðâÂ]vç'¥6xÒ çฅ˶²n‡¡¤¨Êñút…RÒœ äæù“¸îýÌœõ¶â~Ë(D {È<ïs³º}J³Òá ÿ¾W@­sɆpèýÙHÝòWSÜÕO"    hwwò¶kiâ0!ª›ú^ˆ.—øCçdRâH>]€­k’°óŸTæ5M¦Ë§FuÄCwÇÊöW¯Ç¬…;QXdUçç­ÃÔ'»cö¢Ývâî¶kÂñâ„Þ²üëÎbú‚6Ëb¯‚yÏ÷ƒR©ÀæÝ©xtê»Ç…E܉7 ËððÔ 8p4«ü¼î±ÞøèµÁÐhTØ´+M³¯ãêKCd´8^Y²߬8e׎·§Cúâ—5gª}d5×wá7ý¢îxTöoËÔÿCQ²½T¨5¸äåиy uû?8¸ä…jÇSÓÔZ%FNíTÓÓmÎÛ°"G¶Û.=­SEUR霡ó3GF&Œµ‹V ºôÄŽ™jæûü=5[ÞªP¢ß+_I¡ª/.ÆžùOÛ,MËg»Mœ¯öÝd½;_‹Üc{lFáØý^úJµ‰§°{Þ8”åž—­ÎAáèùübh=¼P–ŸƒÍ“¨ Z|N~ÁPêœ ¢õʲ«_J^m…<H€H€H€H€H€ˆÅż•Zž¸;?tNJtì/%^ÛÎ^åo”•°c:¶¬IÆÉ}9 4eì«ñt×`Õ§×ÃÅIÃ'³qßÓëªÜ‹NHÇŠûÃ}½ðrtjïÜüRÜ0z5ò í…ãœgzãæ+ÍQ†Cùq¢î¬ÅÝ¢eðÑwGí:ûú”¾¸vp ‹ôx‡XBj»OÝ£#bñÄýe¹!w¯@N^Y½¸5—¸Ózø`À‚ed×é߿©–ÚÿÏèüÄlùúÞ7ŸEæ¾Íõ«uaqO¾ôý :Õ÷ÓâcؼªòýáêTiª‹¸Q{Ýž6g¢=õóG8ýÛ2»^ 1×ÎP(•Hݲß›esNÔð'~ýùÚÎWÇ"÷¨­Ø¯ ¾ ±‹@t7/ô¹:]øBëdN‘“Q‚9£·4èd›>¶;îº1JÖ9䞕ȱۿ®êæútóÃG¯–'9r–ÒžZ¬ÿæ&ù_GI,âN¯7¢÷­Ëf}~c[LÛCÖqݨUHN³Ý›¬so|õÖåòý„ä|ðíü»5éY%ubÖœâΧÛ@toŽðÚóÖsÈÚ»©| wo |ã'‘÷ë2Ä-ÿ¨Nãk­…ê"îz<÷6¼b{ ,?Æ™ïcGGô½ãvõò­“nGiVšù4¥ CÞûK^³´ÿÃÅÓ+­£ÏìOá…ÂÔl}þžÖz™8n     ‹€Åż/:qwnrE¸àÒ[BÑÿº`ùJnV)^ÙpK"Eo½0W F^~) _YëǂؿnþTó¾rÏÌÝ‚?ÿ³Oâ`©tû/·Ê=êþÞ˜ˆ /Û H‹¸«ªwÝØÓω»XÄû¨¼çíŠû†ÚF‹‰$‡Žgaç üþO¼ƒäŽ‡Ýœâ %¼þ=œ|ºí\z~»°ëîAôÝOÊ$[ž¿»Òè¯Z_ÌVR .â®ÏìÏàÖùñ§°ý…‘•’jsÓýhwÇ#òým/<€‚øãòßj7OI'Žøµ?áø—oVZG·I àÓ¹ŸÜ³nÃS7¶’«Âa’ \Œ(î(îä}}1‰;WO ºñGŸ+í^>os3K°é÷$¬ý¶ú¤ µ™ìbùªXÆšžYŒ«þïÚ•çÞtEÌ}¶ü÷¸7á[’+­cÓ·ÀÅYÿ¶'ãÉÎG‰ %îD]W Æ=·F¡W'_) ­ìÜL}};6ìH­v¬Í*îDÞ6‘·Ž†±¬TFoéóÍKP-K.3lÃÞ«G­OPá.µ.& äf”¢(¿a—sש#Uª‹¸ëw.ÓoÞ飨ñâ˜Jk·HUqÂŽ—AÞÉCò\­·?.Yð“ü÷Ù5ßâÄ7ïTZG—q¯Â¯Ç¥0”–àßÇÎgÃmh¬H€H€H€H€H€›ÅżÇZº¸SªèØÇ½¯ Dl_¨ÕJ9.£Ñ„£;²°eumË€ÑØðSjþÔ¾¸fPŠŠõpûoµn@D뉨=qT½Gž »V “™e׬OÀ³¯nµi«!Å¥bgºtðÆ€¸fp(ÂCÜä[ùe¸õá5ÈÈ.­r¼Í-ît¾AðÚ·2ÙÁ±/ßBÂÚáƒ>3?”ý>ðî,¤m][ëkV]&§°'Ô{ÖÇpoÂä3Ø:õ¾JFÜ2m‡™ÅÞÖé÷£01Nþ[åâ†Áï˜Åxâº_pô³ù•ÖÑýÙ…ðîØ ¥¹ÙØ8þ–ê.ß'     –Åż9[ª¸ i熾W¢ûeþpóÔ–O´¬´blÿ3[ÿLFNzÝög«é¬0¦3FßÑAž^YRˆªê²ÞWnѧðÑ·öÙ`Eù g¬þôzYÕËãõ÷÷ÙTÛâκ•J‰cºàÿn3/£óÎn|÷û©*15·¸ë:q|»ôƒ%ÒË’$A$?Ø8qLúúeÎu€âΞJ×§çÁ·û@·þñk*MóÀ6/oýwì 0æË‹Ô!C–¬†ÊÉ™¶bï‚I•Þ{ý_ûÎþ!È?sÛgUÝWÓ9ÎóH€H€H€H€H€H ¹PÜQÜÉ{¯¥‰»Ø>Þ¸at‚#\ËçŽAoÄ¡í™Ø²:Gvdš¿é7ÁqYÿ ,š9P¶ôæÇû°ìóž\5=t:6|w“\’êh ¬¥ë%µÓæoÇŠ¿ÏÚ4ÑØâN4æì¤ÄÆn•QË~<Š7?:På0g<ÕwÞÐVFè]z—y²¦>üû\ŽÎO¼$›ÝþÒ#èöôkÐzx#þÏïqüëEÓyþÞ¬M#Ùé%(Ì»ø–ÊFƒÈ[FKÖK`+²±,©u”X¢çóïÀ³Cwè‹ dÆY“Áž“Ö'—ÌÿQV›´~%Ž,{µ6øy. \P(î(îä ÙÒÄÝM¶ÅeÃÚȾ§'aÛŸÉØþg2ò²>zªº«V)ðû'×"ÐÏ9y¥¸ëɵHI/vXÌÃMƒâJËl×ì.œ9—÷†Á`ÄOþ“gòlÊ+Àç .C×X”–põý«ì²×6„¸Ó¨(ÓWn<­£þªŠ´tþ‰ÿ‹Å£÷v”ÿu”Ŷ:¶ ò¾J ~‚ÎɧàÒVV»uÆH&T1Ø í_„•Ôe;׈è;Óœ½7eËŸ8ôÞl;2Ö™€Ï¬ú'¿[bsNصw#úž±òµ#Ë^GÒú_íꈺëq„ßp¯|}ïÂç¹Çv/È‹ðrpH$@$@$@$@$@1Š;Š;y{·4qwýý‘ð vÆ–5I8¶; €¢Y§éµƒCðúsfسIxiÑNlÙ“^Þ'±ÌTˆ¹ b©é„uvYY{tòÁ²×‡@ÜŽ§ÎäbüË[o^"è¤Saò£]qûõfáô튘»d¯ÝxBÜM~¬¼=´øõ¯3ض7ÍFâ i7k|/™ˆCß\‹#§r«äÞ¿‡?ÞŸ;Hž³qG ^YºGò15Q4¤¥sÖ2G¼–sâvÍy¬Yï™–Üx]į%Û«ø÷É?À™?¾Œ‰Â#º+:#«¾¸ÛgŽ´Ëö«rqG¿¹_šÏ))ÂÁ¥3‘¹×,æÄ-<äÄŒ|Fîi˜wö8v¼øPyý-™7ûN$@$@$@$@$Ðz PÜQÜÉ»¿¥‰;ó×ôæ•ucîFv’òMiEˆO*K`#B]áîfÞƒï²{VÚ‰;ñúc÷ÅâñûÌÑi&“ GN堨؀‘puÑÈ×ϘçÿCA¡ýÁ†wÓÇvÇ]7FɶD²§ó›_ o¢Ã=Ê“~|öÓ1,øp žœ&|2o0zuñ/?W¯7¢ToŽ8üåÏ3xuéžÔS¿SœƒÂÑî—å•ùl>’ÖýR¿J[q麊;O zNY 'ß@IO$(J> µ›'\C"Í÷¾ÑˆÃ¿‚”«öîÜ]ƽ•Æ<ŸÄ’ÚÒ¬48„Bçm¾ÏÊòs±{Þ8ÄŸhÅW‰C'    ¸PÜQÜÉû¸å‰» sú‰³'GvB÷X»feã‡UqXúåa ŽCÎn»&cGv‚¿¯³My±ÂÄš aQµˆ²s ‚ÚÙe9È‹;вœ r'     ‹†ÅÅÅÝE39Êô¿)ßÞûÆ3ÈÜ¿…°H€H€H€H€H€H€Hà‚'@qGqGqwÁOSv°>*5ú¼ø±Ì&+öCÛ2eM£>`Y      VK€âŽâŽâ®ÕNÿ‹wàN~Áp ‡ÆÃÁƒo‚WL9ØC"éÁ¿_¼çÈH€H€H€H€H€H€.*wwwÕ”æ`ð›G"êö‡m`¤nY‹ƒïÍ"       h1(î(î(îZÌteGkJ xÈ­½úN˜L”f¦!mû?HÚðÎåĨi5<H€H€H€H€H€H€š•ÅÅÅ]³NA6N$@$@$@$@$@$@$@Ž PÜQÜQÜñé@$@$@$@$@$@$@$@ Š;Š;Š» pb²K$@$@$@$@$@$@$@$@qGqGqÇç \€(î(î(î.À‰É.‘ ÅÅÅŸ$@$@$@$@$@$@$@$p ¸£¸£¸»'&»D$@$@$@$@$@$@$@www| ÀH€âŽâŽâì PÜQÜQÜñ9@$@$@$@$@$@$@$@ Š;Š;Š»&˜˜J:89Ë–Ž!Ïhh‚VÏ7¢ÑÀO£Jùb)ŒØ[XXm"u:ø©4(5™°·¨ Úó[Ô &ú¸ºË.'–• ±¬¬EuŸ%     ¸ø PÜQÜQÜ5Á<ïéìŠW"¢dKÏ>Ùd¬‡³+Æ… Lçd3ÊL}î=~¸Ú‘Ïo‹..nò¼[ïGLÕ–i)'¨¬Œí*»ûEZ ¾ÈHm)]g?I€H€H€H€H€H€Z Š;Š;Š»&˜ìÍ!îÚhux'²tJL&’ÊJQd4ÊÑæô˜r6®Ú‘ÏBWyÞ­GöËÈ»‹å ¸»X®$ÇA$@$@$@$@$@/Š;Š;Š»&˜ßÍ!îžÁ­>¾(31ñÌI+.ªõH'‡´AwW”Mxðä4íßZw·V(îj…‹'“ 4Š;Š;Š»&˜xÍ!îED¡ƒ³+väÕ(º® 0\PMPÜ]P—ƒ!     p@€âŽâŽâ®  Í!î>Žê€­çda^R|Œ²e5Aqײ®{K$@$@$@$@$@­‘ÅÅ]‹wB¼ô<—8áLi Rõ޳‚vsq‘ÙTÓõeˆ+-±™çj}ÏeYS ŒF¨5¸Òà a:-Pàdq1þÌÍB®¡ú…¢¢­þ®ðSkkÔcWA6çåÊå¦5MNáªTb€›b\à©R¡ÀdÄÉâ"lÈËAf}èïæ¥ÕtO…ÁK£ÆÞ‚üœ™f3î2“ Û ó>óD_]æì³ÖÇæü\˜ŠjŸ“–ò§K‹e¦VQ×^ˆvv†³B‰ä²R¬ÍÍÆÙ ×¢²ŠE6^q‚4¨•J¤—•aG~v×0Ëm˜V‡ËÜ=ªÕÊ%¿GKŠðON6JLF&§¨öjò      æ$@qGq×bŇJ…ïÚw’ý79˳3Î¥¯¢cá£Ö`MvÞH¶<³®cê™Sð×h060¥­¸ÊÖ—aÚÙ8œ()v؆³B)!èçîn÷þž‚|ü’•Â"ä{Ue•êíƒûýá¦JÑö‰%>NMÂoÙ™ûðk‡ÎÐVèwe—ª²Ê¾Ù‘N¶YhE=5MNa)ÿmz*6æçbfX„äo}èMF,JNÀšœìJŸ &…¡‡«9«mÅã@aæ&œA†A_i£ýq—¯?T„cJi ^Œ?%QdYf•mÎ?Cl›H€H€H€H€H€H 2wwòÞ nq³¤¡Å{W{z!©´Û ò b˺»¸•K¬¸âbþ`–_µw¢Ì©’b<æ$r¬–øÞîí‡GÍ¢xYj2¾©°Œ&FD#ÆÅEfÄ“p› òl˜÷pvÅKm"edäiø -Ùæ}±Üùè2Q,3~öÌI¹ Úr\áî‰É¡æk&Š»Vñ÷Žƒ$     G€âŽâNÞ´Œ¸rõzŒ:qØ.z+B«Å{Q1’Ó)Iø1+Ýf¢¿Ö¦-º»º!ß ÇÈãGl„›8Q§P`Y»Xx«ÍË_‰»w"ÚÉÈ<чGNE¶ƒ½ì¼•*|+e”X2û]¦m?*>}.q7!î8ÙtMÈ̯Úw’<¶äåbfÂi›÷ººcf›HùÚ×é)ø4=Õáƒõ±€`Üæã'¹8ve2ÆÑ|Üç€ûý忟9}û‹le«x}VX„Œ¼Å]‹ûÛÅ“ @« @qGq'otŠ;s´Ý뎲¯šLø%¦3tJ~ÉLÇÒÔ¤ò‡ƒˆ„û©C'¨Jü“›×Ï:|p<RuWQ܉ä ":Lb_¸OÒS*}ø¼Ò&=]ÝeTÞÔ³qU>¤š[Ü¥••âþGöñå°Hôqs—ÑpOÄ·9gJp\æé±Þ]G:\+ tvvÁ‚ˆv²lÅHÈùáQèâ⊌²RÜWI.s÷À”Pó¾ƒw­âïI$@$@$@$@$@-ŽÅÅÅݹ¥²Ÿ¦&ãëŠË6ÏM鯣;ʱ5Ù™x#9¡|¢·Ó9aqÛöòÿ¦&á‡J¢ànðôÆÓÁaò¼Šâî:O/Ln#ß›‡íù¶ËB-y\E†Û'‚‚qƒ—/RKK1ò¤c)fé\s‹»]y˜R‰\œÜCÎí'ø@…q|Þ.Fîçw´¨NŸ´y¨Z³ðR«ñyt¬|ÿ¤³6‰.~hßQ&øûì½àXp†j´ø¨9’’â®Åýíb‡I€H€H€H€H€H U ¸£¸£¸«GfÚ^.®˜%ÎK8‹¿ógIàêŽYç–VwÖIjúÔ)20ìèÁ*Oonq·1/³Î8ì£%ª.¥´£*ˆ»1ecmŽ÷S’ðÓ¹%Ìb_•±]eñUY™x+å¼hµ®ÓE¡ÄO1)îjšç’ 4)Š;Š;Š»zˆ;ë¤sNãß¼\‡¸·‹æ„›“OTw£ýqŸ9›lÁ“Õ^m•= JM&Ü{üðE'î4Pà·Ø.r\"1E‰U‚ŽªûEZ*–ggÈSœ ücÌ»¼† IDAT®ã·¬t,N9¿´Ùºë¶qפwØ @ PÜQÜ]ôâî›èXx©52ãëÉñ6SÃC¥ÂwõwÝœ]1/ÂqWq¹¦uC—ºy`F˜y?µŠân¸ 0gYý¿ã‡®××púV}ZK¸û¥C'¹Ÿ`UÑrUŽÜd±]!¦öŸÙ™X`µ´Ùºœ»R…ï;t’/QÜ5È-ÇJH€H€H€H€H€H€˜ÅÅ]‹w®J%~ì`^êh½TÒzŽ(M‰%4Je£ˆ»`µŸœÛg­*ù3ÌÛ†8wƒÝ=0í\’„ŠIê3ßBÜÝíëüƒd7†ÙÓùÌ­•õíÝÈöˆtrB]—ʾp'ç%ਬ–}òö๳¶ûäYÊXïOHqWŸ;eI€H€H€H€H€H€‹ÅÅ]‹wb/³1]ddÕwéiø8=ÙnžDiuXr.ckcDÜÁdÂ:ÉDUezÒƒ<¼Š;o•_EÇÊq|“žŠeUd•­Íƒ !ÄÝ­^>x"(T6;êÄa¤”•UÛ…úŠ;KÞ"ƒ÷Ÿ8„|£±Ú6+ž034Ý=Qd4bøÑƒ(s°üx¨·4â®ÖˆY€H€H€H€H€H€H  PÜQܵXq':þqT„hu2é¸ HÅû $þÝ(âÀÄ 0\ëå ƒÉ„GOE|Y©ÍÔ PkðQTõ'ŽŠKeÅk³Â"0ÀÍ…žŠ;Ž„ uXW(¢]U*ä U>"BÜuwqÅkç’oTµغ#õwÖ‘p+³2ðvJb•ãôT©c°eq‡7&…˜³ø¾™Õ9Y6u黸\d Å]ü¥a$@$@$@$@$@$@u"@qGq×¢ÅݸÀÜèí+ÇðezŠŒœ2)bæ6o±w\Œ&S£-•í¶ÕêðNÛöP)8Y\„Yñ§‘ª7G¦ù©Õ˜öÎ.åÔ‘¸k£ÕaQd4œ•JdêËðvR6ççʱXµƒÝ=q“·¾IOß¹¶2ªâ !Äàøyt,|ÔÙ¯7ãq ¨M¦7š`<ßEÙ…úŠ;QÇ„ÀP\çí#ëÂuYZ2­äœ@77\íé…Xgm‹ ü”•ŽÏÓR0»M¤@µTÖÒè-^>å(¥åû´}™‘‚?s²ðí¹ìµ•‰;QFDÞöD7w)ü*‰¥%2éÃÏ™È0T}¶!"î,í ©8Ú?H P룱ÄhC, ¾ÙÛwúø#@«µcQb4`oaÖädãß¼‡l‘õw|p¨\Nm9L&ÖæfáäD,ŒˆF„“Å]+ùƒÇa’ @K#@qGq×âÅ€ˆÐêâì oµÙz=¢ I ê;µ :9¹ÀW£A®A……(4Õ>¹‚³BÎ.‰+Ô …ÜÃítIqùÜúö³®å ¸*U°߉e¨E5È4[×ö,åµ:„j´RŠ–˜ 2IF\Iq²ÜŠ"1ÎÎÖêPf4áXqQ³s¬/–'     h(î(î. q×:¦+GI$@$@$@$@$@$@$КPÜQÜQܵ¦ϱ’ ´www-fº²£$@$@$@$@$@$@$@­‰ÅÅÅ]kšñ+ @‹!@qGqGq×b¦+;J$@$@$@$@$@$@$КPÜQÜQܵ¦ϱ’ ´www-fº²£$@$@$@$@$@$@$@­‰ÅÅÅ]kšñ+ @‹!@qGqGq×b¦+;J$@$@$@$@$@$@$КPÜQÜQܵ¦ϱ’ ´www-fº²£$@$@$@$@$@$@$@­‰ÅÅÅ]kšñ+ @‹!@qGqGq×b¦+;J$@$@$@/„††ÂÕ͵ÿý7 ÃÅ;`ŽŒZ ®ÝºÁd4¢°°III(**j%#ç0I aPÜQÜQÜ5Ì\rX‹Ÿ·m‚Ýà줂Ba>eçt±Õ‹¯ê^]|á¬S!-£Gãr/¾^#rê‹Ê r‘wêP­{dàÛ¥¿,W”¢Ô„ÕOOo¤¤$#%9¥FexÒ…C@¥Q º«—ìPò™B䤗\8cOH Dvò€ÎI…ÜÌR$Å4P­Í_ÂÚ´AaAŽ?Þ¬êÑ£;žÿ´”vÖÇÐ[†¢¨¸¸YûÆÆI€êOà§Ÿ„›››¬Èd2áàÁƒxÿÝ÷qèðáúWÎH  ¸£¸“·y@Pp+¸Ý›nˆ!.˜5¾'úw°ktè#".>¿é:s´å‰Ã'sêÔ¥صb˜,»çp&FNü_êa¡ª ô˜²^í»!ûðnìž÷Tíq)U¸üÃu²Ü©_>Áé_>®¶???|ôñ‡ÐétxüÑÇq*.®Ú2<áÂ"àé«Å´ed§~Z| ›W%]XdoH <÷~_ø;c÷úT|õúÅó%Sˆ»O–}­Vƒ'Ÿ‹“'O6­ÚWáììŒ/¿úB~©7Ø·wQZV†÷Þ}z½¾ö•¶à*•‘an8q:¯‚]'[S§N»‡;‚‚‚Ê}~^î¿ .žDxÝI ±PÜQÜÉ{‹â®á¦˜F­ÀK¯BD¨»¬4%½Y¹¥å Lxi S ®Á ¸¦Kz`ܨNðñÖáÚ‘«ëÔSñvço·É²{gâ~Š»:q¬®Psˆ;ñ!îò+.Çš5bþëó«ë"ß¿ PÜ]€…]jp«¸ xðAŒq·”e“&=ÓàìjRáàÁƒ1ã…éòÔ…o-ÄÊ•¿×¤ØEyÎ}CÛaÔÑØ¾/S_ßqQŽ‘ƒ"o¼ã'<-AÌ}Ö¬YC($@Õ ¸£¸“·Å]Ã=+®‚ùSÍK_}w¾þµy~Án¸Õ½¦Ùzcè5áR^ÖU܉%Æ+>ºN:vîËÀ³¯n­{‡X²RM-îÚµk‡%KËþ<4æaœ={–W§ ¸k]®5‹YÜyyyâó/>—‘ÏÓ§ÏÀÖ-Mÿ7öÞ{ïÅèFÉë2ü®áÈή[„~­/ìXàO®ƒXµ±òŸ3wàõa—†€J¥Â¯¿ýFƒï¿û|ðaÃTÌZHà"&@qGqGq×À|˜Î}G”–Ðï¶_a›µÒ£!Ä]+E×äÃnjq÷ü”ɸòÊ+±{×n<÷Üä&/lw ѵ\Ø.fq'ÈO™ò<®¸ò ëéžv]$R3ŠpÍý«ª;ý¢~Ÿâ®å\Þ¦wžžøê«/ Õj±`Á¬^Å%-çN±í)Å]K½rìwm\ìâ®oß¾˜3÷e‰ä©§žÂ‘ÃGkƒ§Þç>òÈøó®;e=×^s]½ëkÉPܵä«W]ßMP*ZÚÄuòs Ÿ¿?·K©î¶áû$pŽÅÅ]‹w1½¼Q§Gü±æß¸·{¬7|¼œÊ*÷ÞÚýzø#+§/.Üe÷°Ù²;…Å›×Û¶qGH€3ôz#¶ìIwø€ ôwFt¸yß¼íû3PRb[G‡H„¹"#«{dAì wY¿ ôíî_/2³JðÏæÄJë·oÔ„^]üп‡?‚ü]à¢S#=»ûdá[’_h¿Yt·oøzלERj¡Ã¤bŸÀA}‚캔“_Šû3jõÜ® ÁÇÍE‹ì¼8ž6&"'¯¬Òºü}œÐ¥ƒ7 F#Öo5g;íã…«. CŸŠK ر?¬‹‡ÞÐøÑ®aíàÓ.Áиy¨/EIv&rŽîFÖÁí0é+‹ew/ô» ná P«Q˜|)›Ö $= 5wÎAèw%\‚ÚÀXZм¸ÃHÞ¼ÆÒ’'§>ü.<ôðC())ÁÝÃïAaaõ{>j=|àÞ®³JAÂ)§ÆWzíÜ"c¡óö—ï 6Æ’¢*ï''BBB‘˜€’â¦ÉŠÚ®›'œœÕH>S€Œ¤bèœUèyYBÛ»A§S!3¥;×¥"õlål";zÈryÙ¥H<éxcçàHWxøhQZjÄ©ýç—Ÿ¹zjë’"=ŽïËÁ€ë‚Ѷ‹' rJ±aE¢ì“§Ÿ—ÜïRÎbÃo (.°}î8wm;{¢Ë@_¸{kQ«Ç±Ý™8´-³F_T”*Ú÷ôF»®žðôÕÁ 7ʾìß”†”3U_Gq‘;ôô‚F«BR\>2SÌ×RdíØ×^þ:ä–!ùtöþ—f7–Z=Xádññë1"yIVòãªN‚à×ж²'ÙGvÁPXyÒ#¥R‰ˆðpdde!7§i–!ºûhÞÞ]>CoË’ýlㆮýáå§CY‰'÷gc×ú4+y†´q·¿ù>8¾×q¿Å}î"ë?¹?e¥ç¿‹kïê®ÁÙãyr® ¼1.îjœØ—m¦@|ƒî~™?b{yèv­OÅñ=ÙvW·¢¸ó vB¯+d 1Ž3Çò°g}JŠlçGe·IX{wÄöñO *µRfc>º3³Ò1Z×ÒÎ Þ~:äd––ò rBË úeÔ›–Xˆ}ÒËç@u·«¸?¾úæ+ýòÛo+ðö¢·«+Ò ï7§¸ òwFÇv^(ÓñßvóßzwW5n¾*Ñr›ŽøälÚ‘ŠÝ‡2«wçÞÜ'¡A.Ш•HN/ƦÉU~îÒ/*‘…ëÜñ¸žðñÒaûÞt|±Ü>ÓïÁãYHI·Í²ëë¥El;svï]3Pèà>tvR¢Wg?yα¸\¤f8ÎÔ;°g€óѸl$$›Ÿ¹=;ûbHß 8Ë=›ÇåbÍ¿ñÈ+°ýØðŸCk›Ev†³ÆF“‡âw ÇuèT:Dw—oæe">£ñ³*_qgn%ÿ½1¶ñ÷/Œ èW­;ôÆRIÜ]%Lg­+¢ÌŸ±R²Ï =?¹öðkY‚â®–Àxz«'@qGq''AKÛãî¦Ûâ²amp2ÛÖ$aÇ?©()¬Ù憞õK^ˆK{ÛK¦ÊÚq”UöùÇ»cÄ-QÈË/Å á+½ëƶ˜>¶‡|ï†VÛ%¸°Ô±ûP&¾´o½0Ýb}ìêúyUf-²ŠÖ' 7í©ˆ2¬xëñÊâ=øuí›·Þž9CúלEe}ñòÐâßÜd×nm“SC¡½¸¼zÏø*­©ÛþÁÁ¥/Ty)"##ðÚ¼yðööBzz:ž™ô¬ÌfØØÇÄwz#(Âw¶¦cô´Îp÷ÖÙ^½?.>Ší¥:쎥Žý›ÓñÙœƒϹ÷ÙXô Eà«ß»*º»y¹Š ôRbõ»î|fñ¼2|ôâ>ŒšÖÞÚòzÅóöí ;a´Š°wËß=†6ÜÑûJûg@ü±\|:÷•ÑÝXÞ7âxå¡­ÈJ9/$­;ÚvòÄ–5Iè>ÈN.êò:þ÷óY”p͈H›z¿xõ ön°ýÍZÜ:ƒ[n'…›õ‘—U‚¯æƉJ£8×;Ð w=ÕÑݽŽåÔ¡|ùÚ!äfœOhUñÄ»ÆÇ ïU8¼#ÏÚ«GDàê{Âe$õ!~\øôŽ oQβ}AVV6î~wm/w½ÎoNq7ôêpÌžØ%¥æíMõ ļÉ}áꢱÓìE»ðã*ûìçbOºYã{¢÷‡„L{î•­eÙ¦Ÿn‹Óùû²:S_ߎ•ÿØ~n±Þ[ùî±;üATd©ýåýkdõ/¼±¿üeûùÍÒ®%âoá'ûñå¯'1ïù¾¸¼¿ý¼MË(ÂÕV•4äçÐê8Tö~—6ý0êòçäÛ+v|†ÿüÕá©÷\úzG]½¡ ﬚†„ÌÆßº©ÅݵÝïÆ5Ýî’ãŸ÷Ë8¤åVþÙæòNCqSïûå¹o®|‰MÀƒâ®®w9˵VwwòÞoiâîúû#qåððòy[Z¬Çž ض: q‡r›t>¾£=:Dy”·Ù-Öm‚]QT¤Çß›íÿH¾ñá~¤gÙ~ymHq—œVˆSñùèÓÅë¶$álb!‚]pù€`h5fáòì+[°æ_ÇÀõ ÄÓû—Ë®ûÓ°ë@& Šõð÷rBÿžþˆ ÷À׿īK÷ذ9,±Ñž5f±uo:–¯>mw½\œU˜9®Wùë}ºùÁÏÛ©VYe¹'OŽì$ëÈÊ.Æêÿ!>h¶ qõƒCåeñ…rʼíøãöÑ[Ö„—¯9Û®€`±ûP–ü5\p}Ç·+N`î’½rßyuìƒϾ “шܓ‘w¥9™Péœà ßn rr¡¬{LDîQÛk":åÛÝ'½¥J !êR·ý¢”YÞ¿ï•"Àe¹pò @öáÝØ=ï)»±„ß2 QÃ’¯—d§#uëß²ŒGÛŽðëq) “ÏÊ(ùøãssòFï>’ò1mçzxgšMY¥V‡^Ó?€[X[¦&`Ç‹c`(r‰f)øÌ³ÏàÚkÍ_fÄñ믿á·ß©qŸêz¢EºÞ–‰h7z`S ôkçVþž¬Ä€×ߎì4{áÕâNô??§›W%É(¨>W™¥›x¦æé±eu2üBÑûŠ@ùúG³öáÈsô”¼·|µ˜¶l€üwzB!üB]–Pˆý›2d䓈œk×Õü€xý­q;m"¢,õtîï‹ûžïµZ }™û7fÈhD­N…½¼mÎ{þM×óUŠÝ"îÖ/‡§ŸÝ ¤Ø€³GreôŸ«‡mb< \¦Ý±¡®—¯ÑÊ^r=:>d¾¯÷,˜„¬Žh<}qÉü¥D?»æ;œø¦ò©ë®»“ž™TÞçÓq§ñðÃ4Ú,[Äøÿ¶?“Ñ÷š œÚŸ¸ÃypóÒ ¦·O¹Þø{–/=a×§†w¢âC[3pæhz_¿ gÅ'Ž}Ó‘t*_F—zú9áÌ‘\¼óŒmtŠEÜ¥'I1\”_†=ÿ¦#7£D x1V!òĽ¶ø™]H>m)+¢ážx­{¹ ‘}§fÃh"b<ÓÇâ#©hã­§w ´ÈñZ:‹¸K8‘'¹ÞöX{ FÄÏGvj 4:%BÛ»K¶ïLÚ%Ç\“ã¶a·á‰'—§>ñø“8~¼ñ#,ýzâÉ'pÛmC¡×ëqã ö?ÚÕ¤ÿu=Ç"îDù'ÿ‹÷^¾ §ÎæáäYóçÉvሠs‡Y̦©ð`W|òúøù˜?l݆Óå âÇS!Åu=“˜»ŸúÛ.nÖ¸žÐêÎKà+†ÈÏ'"ÊoÏ!ûß­8eù×âîóŸ!ÐÏדŸg÷ÍDvN)¼<µèã•R!E§õaù,[ßÏ¡u½––rCû<€Ao‚Þ ÇâÕÓí¢é„°âNË·~ˆ Gšf[›¦wÞ®þx~Øb(Jü½ïgü±ûËJÑNºùMy·Abæ)¼¹òÙú^‚•ÿü‹Ïˆuÿ¬Ãܹ¯Ô¨ O"ÖL€âŽâNÞÿ-M܉õ-Qݼä¯Î].ñ‡Îé|Aߺ& ;ÿI•_<›ú¨Ë¾n )îÄx ËððÔ 8pôül±¤÷£×ˤ›v¥â±iö_ZÅr‹ŸÞ½^:ä”aÒÜ-ؼ+ÍáuCBå’ÅŸWþZª G×ë½¹—b@€‹»ˆPWü¸ä*9Ö“gr1æù‘™}>‚!"Ì Ëæ ‘.;·7=¸Æné¯õaѧ—ßÙï?UÞ=?oü°â†Â"=.±%VK´ê¾óh×¾Ý/Aüß?£,Û~µÎ7½§¿ ­§/rOÂΗm¿‹Ø¤~/×HŠ ±ë•'‘öü2—ÐHôœ¼7³|v$îDýæ~ •F‹üøØõêX›ey®A§GÎG¶U%î.¹äÌzq¦lkÖ̱qcí"üzA—§æÈòǾ| k*GÝaä3¹|(Œe¥Ø9÷ äŸ>Ríe˜6m*.»ü²òóþø}Þ|óÍjËÕ÷‹tõ$.ÀûÓö¢ çürç!·…âæ1íd3«>;…¿¿· m(q÷í›G°ãoó±guAlos¤îÒ){ʗ׎_Ô !mݰöÛÓXýÅyÙn-îD™ƒ[3ðù+m¢âDDе÷FT:_-&-î gW ²R‹ðÁ û‘ž`»,öÊámpýýæˆ×O^ÚC[/Y³ˆ;! ýC]°é÷Dü¾ì”ÍF±drÈmaøókû ê{]ë[^Èç ~–r:uËZ|o–Ã*Û\?í†?!ßÛ:c$ Î?›*¸ùæ›1îéó2>!1Œz ¾]­¶¼µ¸'ÿ´ø˜Ä–ÃÝK'",Å’íÿo3ôž¡ %î„ ›÷è6¹46¼ƒ;Æ.è)»qbo6Þ›fþÑE,ï9µ³z3îÞhÓ‹¸çe&cñäÝÈË<ÿ7ED°Ž™ÕEÊ»£»³ðáŒ}ø˜ðÔ‚^2"UDÂ}ñÊA¬p‹ˆÓ_ì*åõúåg±â#Ç×Ô"î rÍí‹åôb[–†‹×JHÙ~öXn#î:v숅‹ÌÄ‹/ÄMu¼<ç%ôë×™YY¸gø=MÕ¬lÇZÜÅÅçÁÅYççmÇŽ}¶o{vò•ŸÖn´þÑÓ„/ß¼]b¼QVfÀ¤¹[ñ¿-¶K ûw÷ÃâÙføÙOǰàÃýUޝ.{Ü5†¸,„¬ünåI¼õÉXmâê¢Æýâñî—¶Ëù-ŸeÅëú9´!.¾J©Æ“×½Œ6~ÑHÏKÆ[+žE‰Þü7Å×=nšÆ{OoÂçë4D“5ª£©ÅèÔCWMGLHäfbÎÁûÂ|£ñô¯Ê14¥È\úÞR´‹ŠBÜ©8<òÈ£5bÈ“H 5 ¸£¸“÷Ëwç§­ÎI‰®ƒý¥ÄkÛùüÒβRµ‘Ž-k’qr_Óìé#zUYÕÐânѲøè;ûÍ¥_ŸÒWþz*D“XþYqó§GwƃÃ;H¸ÏÎÝŠ5ÿ%Tú|QZÕ%~« G ÖVÜMÓ£î0ãçÖ;Üï¶ë"ðâÓæ¨¾ŠRN¼fýAxãŽ<>Ã^0Ýss[Ly¼|yÄÓÿàà1û½‘šâLäÐ9ÔüE|Ãø[P–{¾ž1=Ðs²9çÔÏáôoËìºví݈¾g¬|Ý‘¸‹¸õ´½íAùþÎWÇ:Œêë2îUy'ÛùåœþÅq$ݽ÷݋ѣGÉóÆ<øΞu¼T¹*nÑ#žFØ5wÊ(Ã/=Š‚øãK»  _h~v}sï|æøÇÌçíŠû†FËíP®¼ï”–U~½.q'Æ´êñ˜üÚ¶_kqW×Ï¡5n¬š}Ü0þ¦×!önÛ}j¾üïM¡7öú9óm'…Þ•ϡ¸¬ú=vªOÍ!Äý—™#®?Z;‡í·Ê¹­ïC¸4öz”éKðÒ ¨´ê• ÅcâÄ ¸þ†ëÍÏÿ·båÊߪjÖC%Š;Š;yc·dqg=3ÅÍbLï+àà\þ–XÂ%ö¸Q%ùÙ…WYÕÐâîæWãl²ý‡‘1Ã;`Ühóæ³Cî^a—œá÷¯• .Ä/­Cù«Þ½º°pÔhmÅÝ÷‹¯D‡¶žHJ)Àõ8ÎX*–ãŠ}ôÄòá¿6$`Ò[™`-îf.ÜépI¯ˆbüìËe—'¾¼¥Â/ñõÆWã üû\ÎO˜¿ìlŸý°Í¦ömo7›EÙæ)÷¢8Å^”‰Ä—¼õ‹<Ç‘¸³$®æošt»Ã~ù÷» 3GU%î¬?¨ ¿k8²³k/Õå~wS—Èeº…I§±ñt¹ÿŒRÚ±Ϩ1;qbHp0ÚÇvÀáC‡‘’lŽw³î=¿§˜E(XöÕ²ð±wGweâÃG“XooPQŠÌø¬¿\>xúH.WX¢h},Qwbï ÷lr˜ÐÀ"îÄ2øylCF²ã ØûúÖ§~×°èòý"~¶‰ël%›H¾Òç…d‡—ÍCòúê#£ÜÝÝѳgO$§¤àè‘ê#QëÓKYkq÷ý¢#ædŽˆw<9ßýæHˆ5”¸û÷—xüöáù=¬f{‰ÜïnùûDZñ7s•“« ³¿1ÿøPq‰©E܉¥°³Flt¸Ïbû^xø¥n²üoÅÖ5ç#¯,{MŠh>Q¾¤Ñ&’i<ñšùÇ %Ïív¸õ‡µ¸ûnÑlwÀµ®×ïU¿C¥RaëÖm˜>mz]«©²\çÎбc'¨5*„†„bÐàAÒ0;+Ï>÷,NÇ9Þ{­Q:S!âî·µ§1}Aå{ÅVìÃk“ûâúËÂdåàá+ìYÎÑzËæ‘ÿõÌÿ°û`åI..q'ž¡·ŒYãð³de×ÂZÜÕõshC^ç.múcÔåæeŸßoZŠ@Ï0 ét‹Ü×μ„Ö~y~C¶_±®æwJ… ÓïxîΞØ·_üû†M·„ÌœqÇpurÇÎSÿâëÿ6&›ºCCCñÆ›oÈ=†Å!>ƒmÞ¼éHHHÄþýUG§6YGÙ \ (î(îä­x±ˆ»òy¥¢»y¡ÏÕè2ÀÚsÿæd”`ÎèÆÝ¼.²ª!ÅøÙûVñEÏ>•ÖðÛbÚ¹×Z…ä´óËÑÄÒϵ_Þ(~õë ¼öný÷l« GÏÆÚˆ;‘MwëÏ·ÊåFk7&`âËŽ¥ˆürµäJ´ô”{ÏÜòП6M[‹»ÑϬ—™Ú*"ðò÷®–/O_°½ÒD ñ¼WêœàÛu Ü":@ëé•Ö8·-ŽÖÝ[nh/Ž]¯CΑó¿¨v~j.ü{†¾¤ÿ=~m¥]øÆÏÐyù9wƒÞùj7dìÙ„} Í›>W<œÛ`À+_É—«w3^˜ÁƒÉón¸þF uK*ãäŒ>³>–ý2”–Èd"IÇöYV»¯]C\úÖa‘nÇödáƒé—Õ™k¿ï¹Žè>ØÉExíaû¨‡†w"²Î’‰sàÁöx{TLÞpã趸üŽ66K E­ÅÝ??œÅŸ:^Þ×íR?üßóæ='ÅRZ±¯˜8Ä-“?0G9‰d,;W^„ôЧ˜å1¦º]â‡Ït”¯WŒh²\륲¯?¶½¾—©ÙÊ÷šñ¾ÓŽ–¿["òÄœÞ8~hµY“›kÖânÉä݈;hÅ$²Æ>³¤ìâ·o–‰¦¬†wïÍŸ›£Yxç(¶®6 6±7ÜœÌÏ&ëeââÿqçhÿ;KE¦æ™_˜£¯þû-¿¾^ Lý¸¼üpöh.?{nÿ<÷¸›§Ó>é/ë¨LÊY‹»—Fn²p­Çÿî»oáåí…ƒ‡aü¸ñõ¨©ò¢£…{ï½×æñ…}öì—d‚ ¦>¬#î&ÏÛŠUë*_iP±o«?½Aþ.8p4÷OZo~f;Éòì_3¼½tXó©9²è…·và—5•ËÉ EÜÕå\ËgÙº~mŒk?´ï нeúR¨U¹ßàòÿgï¼ã£,¶0üf³é½÷H€„Þ»ØPDTDl(MĆ"MŠR¥^¤¥wivDÅ‹W©Ò¤—PÓ{¯›½¿™eCÊ&ÙMYRÞù²ß”3ÏÎ|»û~gÎ9¶]ü©*†“}>> @&Õ)ZÄ÷R3 SéÑ.Â-©‰9¨ŠÏ­Þm⡦}$GÝ=Ïæ‚y«öOǵHãŠe...=f4:th_Ç‘ÃG0eJéÉŪì dÇ$PM P¸£p'—f­îîn8Ïkt}ÚïfLLNÈÆ¬A‡«t;–G¬ªLᮼ™i:àë¥H6"ÛêÖ½YºÞC„»‚iu%Ð(ØÿªY]йD†ÙŠdó­Ì˜1]p>öƒÈ誴²)³«SŸŽBâ…òëµúp6—ÉŽN,9vPÛikaШ¸p§0ÅCkþýEü^f¯ÕU–Öè¾bŸ¼Tšp'âÛ‰8wB°Â]EJÁã±2®ˆßw£f¬ˆè¦eV‘>´YeE_õû_~×[µj‰æÍ[ÀL©„·¯7:vì DEEÉP‘…cÄéÓgEêî^õG¡ØÀeõûÏ·}äCBCÊ‚ÕÿbÓî’TáîÏ£‘xoºîLÎ%Í·2¾ËÂRŸºòxlÏYðu ’ÕÏÜ<ŒÍçëÓ´Üuz­ûj’uRªê7Š›½7Æ÷Ñ}ß}d5þ¾¬ù®&ÊkMD¿vòèð¼ÝïézæoÈ ª+2žO›6íÚiÞäääàÊÕ«ˆŽÁ¹sç±{÷nƒúce¨í(ÜQ¸“k¼6 wâ©wËînh÷ˆG~&B1GáArèÇüöUÕÃ(XU_v*ÚG«&ÎØ8_¤æÒ“øæ'ÍÅŠ”ò°Ð5ž!‡«%~ÙÔKv#²¢Í_]ò÷%Ó:áÁŽ^ÈÌÊEǾ…›UáηçËzé]9qT5êð~¤Ý Enzj~a[¿†hðܲΩOG#ñÂ=O£¶SVî~0Ò¯ãØäA%¾­'­‚C`Ób©…X©9nöûn\ÙRø˜…¶C¥üâwùgiÂÝÄ'à‘G4ñ³}ú"=½üñe\ZvE󑚀Ê"ØÉYoJ¼Q‘µ[Õm+"ºim«HåîÎ'aå„{™‹ w»W^‘÷X]ů±-FÌ×Ĕܻú*þº+ð5jí„a3škÖw¦JfÇÔ§|1ùßbñÐD;­pWSãÛiç®°°’ÇוV¸õóv„~½B^*(V‹,ÉWu{kêðªëÔhánòˆ¬¯Ú¢îÎüƒ-¥d5žýMWéQsöP,6Í9/›Œ©'â@j½[Ëâ¿ÛMB¸V¸«Šù{¿Ý ++Kœ9}|`œÌ’X²t±Œ3z?²Kîú¼¹7î޳XÒûdn¦À±½}äe/+K?ïñ•[/–ú`´ºw†Æ·“÷ßwZ¢ÿÓ d,¿nE†j9¾ðd}L¾{ò£×kûUþïeí!q]Þs&Ü4quÕ§Cêø5²…g½âZEâ§æ]Ü Nÿü²­øwìœÌ<œ:XêàöÎùO@…;úåpd_.‹Cž~¿ +´ÿË#Véóe§`"]_vô飴/LAõì°s…æØç¢õg±~Ç• qËÃB× †wv6JüoÇÓ²›o~ºŽ™KïKÒÑñê9ÝС•â³ðð+…ƒâVáNþx_ø-”––Hº|gŽƒ*«p¶M1-—VÝÐü}çMQá®Õø¥p n…ÌØHÿB‰ïi»`ëXL¸¡ÑZ{P/‰øë'\Z;GgJ{t[úƒ¼Všp÷æ›oàùž—õTî˜r"Óm»ike6\µJSSdDÝÁ±_G^fÕþ¨ðÆ1—µ…g€ JóàÑÆÅŠÊĆ?ò­O¯NFËnî(ÚGUw?¬ÅwÝщ§A ¼=»¥¼Vð`Á ŸÛ\ÄÉ? •4”umîļ™¯î½‘•¯‰-™§‚6 Œˆíxt’æOu-Æî &¸˜;ì(¢îÅ5Ykë7q@Ñ£²ezÜ• Ü•êÉi|ò­&ŽÙ?¿Gâ«…÷Di½£û"ðͲŠ}¶V•p'„³~ü^Úà÷˜;WóPÄeîæ mÛ¶ò¨ì+ý_5Æùc”W¸Ùý4,-”Øýó L_R<èy&RUÂ]`€v­Ô|Ç›úÙ?Øû«î‡ØÚñk‹p÷tÛÁ2®]^ž …©œÿ®#«q¨€×YyÞ§ò´¹1î´v¶©ßý»½/ÿ\ðíD&ÝB÷§ñt»Á’Íì]ï 9£äØ‹å™oYm.ú M›6•ñ-Å÷A‘ Œ…H dî(ÜÉÕQS…;ï@[´Ä-tƒˆ £- 1™2`óÑý‘HŠ5îAyÄ*mÆ1M¶WÝÆß|¹1Þ¤‰UÂHÖð׎§å1Ÿï¿…Ióï·,ïM´<,t¥=ÒzöR^­9¶YrQãÐÎg`m¥Ä¡Qx{rñl°Ú¶?¬{¾ž6¸x-/8P¨Ëê Ü97ï„£?•vút$/èšíÓã4|Eó…ìôüÑH8Ïã.xØdxv鉰)ÚLZ%§÷ïâ‰H¾~ì†ÂT‰k_¯Àퟷë}kvvrBûí…3§ïyLêÝA9*V†p§MŠ"âAMyQ÷½üÑ—üÑs@=iaU w‘7ÓðÙ{º?<,ñáM¼Æß¿¾…Ÿ7ß󨻼-<ümpùTÖL©˜—dU wžؼy“´Ëæ-Ø´is9Þõò5y÷½wѧÏ3ÈÍÍÅ“½z—¯“r¶ªˆp·{Õ£hàoC'£ñö¤Ê9¶\áîáN^X4µ“$ðòûpájñÌÜ­›º`ça¹®wM};`ÈÚ¸¼ßÿ³ îö>èÐðQëmپɿ—°¦œËÇ f÷S¸335Ç”~_ÀÊÂχïþÙˆÑO-€·S.Ü9ut?”5h‚VÞ¸i#¼¼<ñ÷ßcú´ lÍê$P÷P¸£p'W}Mî‚Û9¡×ð ¸çŠ.²µ]8#û"qéŸx@¸ ݇R±jø€`¼õJD¯Îý¾E†ŽŒs 'wÄ#]4Án«B¸ý~¹ä!„9!)% ü YÙsQœ2¢žïU©i9èú‚æI~yÊüÚã±n¾òH…˜{YeÃ' u3W9îCý@NnñÅàáf•,z÷¾˜¾¸ðÓòê Üyty!Ã&Éé™47uN½ÅØpnªùÁxfÉÄŸº÷×ç±Ѱ¿&VQIGël| ý̲Ž.á®Ùˆ¹pmÝM&¸økDo¨ssŠÙ!âð5|U̼4á.0(+WjŽý­X±{vΘYÖ{+®õ¾½ =íN~2ÉWNó[/ýH6¿¼å3„ÿ®_l”öíÚaƬ2“¢ˆ¯2a‡8ûoÅ~Xë3‡ÊîÞ™Ûõ›9¢¤€ù& `êæN°±77Špš‚E#u{ô{¯¡Œ5*îq" ~ÁìÞ¬l w_ܼX p¿>uÔ©LáÎÓÓCÑ·wtÀÏ?þŒÃ‡«6>ª®)·›±¶¾ sâ ’.ŸAÐËï!/7‡ÆöCNJ‚^”œ±êó•ptÔdî[»v-¾úòk½ÚV¤Rew¿€/Èu3åÅ¿­ã³qÐGMЬ³«4µª…;q”û㇑‘ZüH«înxeœ&yÊ–ÿœÇ™¿î%Zxnx:õò–ÇÁç¼vDg{}YW•p×ýÁî˜øg$§ÿl4t2{¿èz¾v8p8£fèwÏéÐÒ«ç> ‡zwêßøßñâœ_éÓÞÒx=×áÎÉÆ£{"…ªKá§°æ×Y0SZ`ä“ÿ‡£ŸŒé¶èûqÈÊ-~ŠÁÐ÷Lßú÷S¸6>Û~º?”Œ$løc.FôÒxÕnü㜽]r"7}çgh½mÛ¶ÀÕÍ ¿ü²ó?­Ú¸ƒ†ÚÆú$P P¸£p'×eMî ~ÌÀ±ý‘8¾?²R³«•wÖG¸{ê?Ìþ@œuÄô¿qðhá/]ÞÖ2{©…¹ÆÍ¿ª„»—z×ÇGïj²“nØy מ+ƒÈB›Pº7£VÍbk_m?âèsŸ7öãVDñ çûØ7¼¡‰›5cÉIìü¹x,‘ѯ7Å~š˜'º˜WáιU´x_“ âÜçÓsä·bØ‚[£Õ¸Åò(«(翘‰èÚ˜t¢X¸z¡ó'š鑇~ÁÅÕ3‹õÑpÐXø<ô¬|]—pçÙµ‚_׈b7ÌCäÁ""¬Âí¦¯‡­o}Y§4áNØùõޝààà€¿ÿ¹s ®ïÚº;š˜­gÏ:Üüv}þ|BÞš ŽiâÝÍŽÔ›—Ê\f“§LB÷î/Qöý¼ èŽãWfgT¨ áî…ÐþqOˆ¸Y3ZvwÅ«ã4^ºÆ8*+ÆYþÁIܼ”Rˆ„•­×´‡•Y±ä¢â}|ðô°@Ùfë§çqú`é™%EÓ´$Ý?+S¸[ºt k¼óòòðÎ[ïàúŠÇþ4`™Àç±çѰÿH)ÖeÅEÁÊÃÑÇàü ý½JŸyæi¼7â½üa#""1xÐ`CÌ(WÝÊîÚ<쎗ÇËñ×Íø+…—Û+ÚÂìîgcU wÂŽŸ6†âÀ7Å„¿5§›;";33Fvƽ_âtÀ¨Eš‡ Ç®%''uJ[ãU%ܽùÖxþùç¥×ÛóÏ¿ˆô´Ò?g˵(JhTS…»à@|u7©×ŽC1kYéÞ¬NHH*ý{ÓúOº¡M3·»ÙîÅg¹6OmÉÄ >ˆÜ¸ó2>+òÝÍÔÔD& ªg/;©íˆÙ6üñYðw BrF"}7)YIrî^ŽþÑk®ñŒï®à»v¿…;oÇŒ~z4)*ñ¶0S20kç[ÈSWìA}yîîÊCmê2 wîäú¯iÂÝëÁÕË G~‰À•Sâ‹|Ù_lŒµÑË#ܹ»ˆ„ OHñåVx*FL?” 9Àן~ØÞ62–Š(U%܉`Ë›?{ÁÏŒ­{¯bÕÖ‹…ž"‹/ˆÃ^l„\•óVÝË.©‹oÇVnøbŽ&KßßÿDaîÊÓ¸‘µÞ ìðÍÝØ,g.ÆcÖÒ“¸žmGYÙ"(ô½5`ok†=_ô€‹£%Ò3s1~îQüyL+†ªñ\Ïz˜2¢µ<|ézú¿*Ua£ªƒp'âÆu^° ¦æȈĿ‹Æ!=üžpàÜ¢3B†M–ñÝ´gCw~Ž[?l)ôv4y{Ü;<,_»²m îüºCÒ3ö~¨ ›/üéîæè0k ,]=‘›‘†—LDÒ%Mì@q­á€1ðêv/CliÂh3vìô|¢'bbbðê+úÇé²tóB»ië ´¶Eâ¥S8õÉH À—M‘Ù¶Ýôu°v÷‘Ytÿùøu¨2Jÿñ9fÌh<Ñë‰|^{víÁŠ•+«üvQÂðꟋÇã°õ“‹ÈÊÐHoÜÆ ¯Œ–ñ>E°|c wq‘Ø0ó,¢ni¼„h÷ê„4jå$ÿ^?ó,.-GÇÌ\Ÿµ–1ÿrsóðó¦8ôCx¡ þÖ¦hÒÁ{z".2;ß‹VðͪLán×î°µµÍï~ë֭ظAs”ÐXEÞ>Û S³{¡ N/‹„sú{Gôèñ(ÆOÐåZh¨!«ºT†pgïbŽIë;ÊûSlDÖÏ8‹˜;šµåêc…Bàæm%׸(Æîr²UØöéEœ;¬ ¢®P=j².‹rpÏm|¿öz1¼Z¡]\8ök$~Þx)‰÷hS¥ ›; í#ðkd‡OÞºò `gU%Üi…êS'Oaüø U½< õ_S…;1‰é#[£oOÍQí=ûobé†s…jš)MЮ¹žéáfðô°ý¥²}oPÞxY#V‹¨¾¹Z¦Ø'êj=õ22s1aÞ1ü÷ˆ&;¯ø>ôÑð–x¸³WþwÈÚ.Üõi7ÝBž”žºk~›…Ë…Õ.z¢oGMB¯=G×â¯K?e½ßoáNLòý^ÿßÝ »âïßÿÝŸNm5Êü‹Báî¾`ç 5˜…; wrùÖ4áN#9T±®à= <Âh?kl<ýh€ìJ¥Ê“™™þÞ¶HNÍÆŠ-0ñmÍ1‡ªîDß»oÅŒ.¨ïg'Ç?¤¯ÞLFZz\œ,åQ¶Šÿ¬,+V’ë?y@>=ÖÑ_v®æÉÞÞý·ôèCÓr›ÍñʳA:o·/½÷;.†jž¦jK—6î2æ‹ÖKQ†1qéðõ²…»‹•¬&Ž›ð'.ßH.Öouî„Q~½ú#ð…áÒ>q445ü:r’`åá+WO»îßEãüÚDX8»#êÈ~\ø|F¡ù˜9º¢í¤U°tñ¯‹ì´Ña°tó–±ë2b‘• dž-JŒcçÒ-F} Å]Ad©ÍIK­O)¤ / çfe"²„»,^²HÚ2fôXœ=[ræ_íDLL•hýÑ Ø×ANj2ŽM ÙñÅØÕAë—C¡4Cô?àüò):׌öEoÌ›7 ÇøÆKA±ªKew"[娥máêc­y_3Uˆ‹È€­ƒì-póR²Ì¼Ú¥··Q„;¿ÍÚ5q=ÙÙyð®gsKÍá½c‰nÁÍÅ˯Ü\>Ex-EÝJ—☘£Úe?¿EaÇ"ÝÞ”•)ܽ?ržzê©ü¥°oß/X0_ã­`Ì¢õ$ÕîÝ¿?èž~ˆ¤³gÏB«Ö­dçY3gáøñŠÇ0-‹AewbŒ—F7BÛG<åpâ¨jô (ÍLàêmŒÔìÛvϾ©ùl¨jáîÂÑ8ø5¶“1u…·J\–\›vŽa5üz*VL8UÈÛNËÉÌB† ¸­‹f.yjDßNGZr¬lLáæc/@–”F´« áÎÛÛ ‚R= IDAT6j¼—,X€}?ßóÚ.ë}®Œë¯{/½ô¢ìª&•öZZ˜bÁ¤èÖîîÍS#ôV “³ak£D=_Û|ÁLŸpnΖøzÙ#pv´ÈG+Nªò4§/:}Êaïó¸?fŒj›ÿzXd22Uð÷±™R©ŸÀ̱šëµY¸kîß ƒü@Îós{ñà ݱ?4Íü: W•ƒåû&ãNܵÊXÊ¥ö!²ÍÖoêˆôäÿ­øqæ*7@Ç x¾óÛùC}²w$b’‹¯'cزmûV¸ººí¤ƒ1æÄ1H * P¸£p'×WÍîªr[T¬ïò wV– Ì×wÖıӖ‹¡‰øèÓã°²4ÅÖ…¯©ªîDÿ¶ÖJ {9/ôª[³Böˆ'˜ÇÏÄbц³8{©xä¢ôļ^±1ëæƒÛ|Ï.QϰLlj y¾!^y&®¡B[t wâZ«gLx»š4Ôxûh‹˜Ã¡ј÷ù™|ÏÆ¢vWáNØ%’OÔv¨È –”—pyó¤\¿€ÆC?”^oÙIqøkLßb?ìEÖÆ¯M€sÍ‘lmI¾vç?Ÿß'úÃ÷‘¾¥& phÜÁCÆËãzYFÚ'íh;y5l|ê•)܉¶«¾X…õëã‡~ÀâEKŠâ/öwЫ£áûèsòõ³K'!öäÁÛø=Ñ/jÄÎ+Û#lÿ7¥ö/âÛ¹º¹"&:F‰4F© áNØéêmãKx«|OΊ•"™ðPëýZ Q„»ecOÂÑÃ}ß’qõ´%'K…ÿýÛnt,†Yxç‰D÷„¥µFì+XÒ’³qáX<þþ!w®>Ž«­W™Âè³y‹x䑇лwo½×je¯§¦Ðr¬F0¼õÓ6„î(ŸG¨››’S’‘•iœ„M•%Ü™[*ðòØ`4뤉c§-a¡©ørÁ˜[šbÄÍ1ÔªîÄ1Ù‹ÇãÑÿƒb{îÌ_1سòšâJ*"îdç'½ðàs~pr³,VMì•kÿ&âø¯Q…bä¬XÂÝ A1`à$''ãÕWmhçõÊ«¯`ÈÍñíçû½ í0V©HŒ;­ÂëòÅÞõeø /÷ÂßOD̬\ù½I<¬üåe‹$>žVx«tiã·»µc‰ïƒ?ÐÄçíWƒñÆK¥§µ¶ÄÆgÊÓ¿þŽÃ;Ÿ†••²Ö wÎ6îõÔ§°2·ÁíØ«Xöó$ä©5^èE‹•¹-Æ<5Ž6®ˆK¢ïÇ#3ÇxÇõ¾‹Žc®´ÄÇ/n€ÒT‰[1W±ôç‰÷Ëìýv/¬¬,±g÷^¬X¡‰}ÌB$P2 wîäê pW}nâh¬ˆ›¢ÎSãVXZ1O2cZ*â¢4 r€—›8¦kФÔ,œ»œXfl»’laØD¶×»Ž3ÈÎU#+K÷—ªÒæé`g&íÑ–¸„,yt·¤âïeƒÀ{ùô[xÙ¿Rþ9“Á±æ–Y&-œÜ ÊÌ@Zø dDêNVQš–î¾°õ „‰R‰ôˆ[H»uÅ ) ÊÂëÍÒÝêœ\¤Ü¼„¬8Í‘CŠ6»lJJ ^éÿ*²²Œ#&bc©k4²ƒ³—²3T»žŠÄèûÇSi®@ƒ¦ö°u4—±è®_HÒéT_ñ#Ø7ÈŽnR”ÉLÏELx†ôÀ»I‡ÞzûMôë×ËW¬ÀÞÝ{¾, &˜9:e ÒÃŒgÏè.a@q4Ö'ÐFŠ¿±a¿~?d«áßÈÂS4;+O ÉIqÙ¡r÷³–Ç|…`­BBt&"¯k¼LY ÖoX/³;Þãàb®>Ô“&ic|2ïüúkñx®ÆdR‘±øÛ!ÀÛVQÍÌV!<* —o¤”뻎°Cij"¿ïÜ c+½èJû¾ãìhŽV!.°²T""&g.Ä—Z¿"seÛšGÀÛ©>F?õ©4|÷‘Õøûr٠ߪb– 5ÂòåKe׫V~Ž]»vUÅ0ì“j wî䂦pW«ö5'CÕž€ðr[»~-¼½¼°|Ù2ìÝû]µ·™Ö=Ö66Ø´illl0hà`££.HYågoµW’BÏáä¬{GœêÞ»ÁW=z`ü„qQÄO3bR í|D,É­Û¶Jï‘ÝûÈ‘#@nn¶lÞ*f° Tœ@¿No¡SÃÇ“›…™;ßDF¶ñ€ˆx«––Vðôò„ø¿Èx.Ê믿۷nU|rìj9 wî(ÜÕòMÎé‘@u%Э[7L6±11xíµ×éuW]ߨ:j—…¥>žñ1Ú´n-½„W€±‹Gçžyc²öšوúûgc›Àñj1ám·vÝøøø`ÅŠ•س{Ï}›m§N0zÌh89i’ciKŸ§û #3ó¾ÙÅI ¶p±õÀÏ,‚ÒÔ Ç®þޝ÷xjÑ„O*• 7nÄ—Û¿ª-ˆ9¨Rî(ÜQ¸«Ò-ÆÎI€J#ðö;oÁÓÓ{÷|‹“'O T mÚ´Á»ï ‡ŸŸ:ŒÏ€ø‘aŒâÔ´=LÌÌ` ßžýe‘%ùè¤€ŠžGÆxêÊâ¸Ú«¯öGJJ*~¶Ðh1>Kâ+<±6 ‚¯¯/llm TšI1ÑX{¯®¼ïœgÝ!àë[ {¸Øy {H8Û¹!W•‹Ï¾kô¤ÃÞSSÒÓ2†“'O!>¾p–ùºóÎp¦$`8 wî(ܾoØ‚H€H 4x ž{î9lß¶ _ý DBc•WÿÓ{1@$@$@$@$@$@$@$@Õ…; wîªáƤI$@$@$@$@$@$@$@$@áŽÂ…;ÞH€H€H€H€H€H€H€H  pGáŽÂ]5ܘ4‰H€H€H€H€H€H€H€(ÜQ¸£pg„û€½Â,­äH—23’§2¨÷†ð63ƒ«™Ì¡/f#gÒÓË´¡ž…\MÍ­VãLFZ™õkTµílì¤Éá9YÏÉ©QæÓX      ÚO€Â…; wFØç­­l07 iüÍP£‰`­¬lðž§7|-, Í2>7¯\½XæÌçû×G3k[Yïé‹g‘u™mjJS?7—æn‰‰Â–¸èšb:í$     ¨#(ÜQ¸£pg„Í~?„;?s ,« …)Ôj5"r²‘‘—'g›¬ÊŇ·o”9óùþ ÐÌÚFÖ{æÒYéyW[ …»ÚòNr$@$@$@$@$@$P{ P¸£pGáÎûû~wÃݽñŒ³ ròò0æV(®df<Ó Þ~himƒœ<5††^‚qøl®A (Ü„‹•I€H€H€H€H€H€î wî(ÜaãÝánI@4²²ÁÉ´½¼ëŒ€¡Z Aá®Z½4†H€H€H€H€H€H@ wî(ÜáÖp?„»u ÁÛÜ¿'%à“ˆ;F˜eÍ‚Â]Íz¿h- ÔEî(ÜÕXáN/­ï&N¸•…è\ÝYA[X[Ëlª±¹9¸‘UhŸ+´¿›YTdMMË˃»Ò Ø;Â×Â&0Ahf&ö'' YUöAQ1VG{¸*Íœ—‹“ii8œ’,›ê›œÂF¡@'[{[ZÃÁÔiê<„ff௔$Ä—bCG[;( „ éé G3%Τ¥aw|L¡yç¨Õ8žžªóž'lµ6ÑdŸ-X§&CmbRæ}RÛþfv¦ÌÔ*úzØÞAVV°2Q 2'¿%'âv‘÷¢¤ŽE6^ñyš™A©P 6'ÿ¤¦à”žYn}Í-ð |ÌÍå‘ßËY8”ˆ,u“S”ùn² Àý$@áŽÂ]îìMMñuÃ&ÒþU‘áØ“§s/m †³Ò ¿$&à³ÈžgûøèÖu¸™™á=o˜) W‰¹9˜tû®eeêÃÊÄz ƒ]±ë§ÓR±7!S}äµÒ²ÊöqrÆ@WØš I±p‰%ÖEGà»Äx6|Û¨)Ì‹Ø]ÒÍ¥´¬²«ê5D=ËÂYhE?ú&§Ð¶ÿ*6§&cšo€ä_°äªó°$2 ¿$%–xÿó03ÃhO_´²Ñdµ-ZÎ¥§aNØ-Ä©rKìcˆ«^pqƒiÁ1*; ß¹‰ ɶÌ*{??†86 @I(ÜQ¸“kÃÝÓ«Æí’Êî„°×ÃÁÙÙ8––á[ÖÒÚ6_ĺ‘™‰·¯_Šz©Õ˜ã_mîzî]ËÌÀá £‚¬¬–• ɸ$án˜›žwq—usrñ¿ÔDÄäæÀIa†®ööp33—×–E†á{âÝO( ØÖÙÎV …œÏ…"Þi©ª<¬ˆ×ùž ;Ü”š±ü,,ÐÀÒJþßPáîhJ ‚¬,¡„ þNIFj^.‚,­ó…¸¬<†…^‘s,Z¼ÍÌ0? 0_ð;•– !ÔåBK´·µ…غaÙYxïúdèÈvÛßÅ ƒÝ6ªÄ›Ï\¿zhmc'½ò>º}£Ô›Ôýîbr²1ðÚ%6Îò­‡v¶vÒnø«…ê|èå‡!âà½pù¼Îc°¢AS+k,”m‹zBÎ÷o€fÖ6ˆËÉÆ«%Øð =>ôÑĤpW'>ï8I     ¨q(ÜQ¸£pw÷¨ìÆèHl/zlóî–Þ"=Ä~IŒÇg‘aù=ÐÂËë7”¯‰ŽÀ7%xÁõrpÂH/_Y¯¨p×ÓÁ£½üäµiwnàxjác¡Ú<®"ÃípO/ôrtAtv6…êÅ´ÆÝoáîdZ >,A\üÈËÝïÆ|­È<66–ñü.g¤aôÍÐB7Õ‚,•Jl –×?‹¸](ÑÅ7 Cd‚goj˜nÓÇÌk5ž”îjÜg &     :A€Â…; wÈLÛÆÚsüH†Ÿ„ÝÆï)º³¤v²±Ãô»Ç?‹ w“(è{×ÉÈS¡ïåó¥V¿ßÂÝß)I˜vK§Z¯º¨ìl ."Ü}߸©ô`4¤|]w0‹¸„?7—ÍNˆÇ¢¨{BkÁ>­MØÕ¸)…;C@³. €Q P¸£pGá®Â]Á¤³ÃnâÏ”d¸­µ-fûk’OzàeWM6Ù4• ê±ÚJºd«ÕxåêÅZ'Ü™Áß7“ó‰)² $è(m²[b¢±'1NV±21ÁîÆš>¾KˆÅò¨{G› öQp,zÜõs‡ƒ‘ èI€Â…»Z/Ü} G¥™ÌøúYäB[ÃÞÔ_W@¸kaeƒO4wEk¨«­=¦øjâ©î^tvÅPwM–ÕW/ 67WÏí[zµšêq··QO°4o¹Rg®Vã§àæ[{b<8Ú\°Â;5‘/Q¸«”%ÇNH€H€H€H€H€H€*™…; w5V¸³Q(°³‘æ¨cÁ£’÷ˆB ™XÂL¡¨áÎKi†õw㬕&þôurÁ[Þ:…»ìì1én’„¢I*²ß+C¸{ÉÅ ¯¹yJ3ú\:‹,õ½Ì­%Ù¶ª^CÔ³´DyÊ~Q/þ–Vz%à(Émœ¼3ii»pœi`nw3¶V…ÇÔj|Ó¨‰L„PZ¦×ÉÞ~èfï¨S¸s2Ub[P°œÇ—±ÑØPJVYCn•!Ü=ãèŒáž>rØÁ×."*'§L**Üi3ðf¨ò0ðÚ¤æå•9fÑ Ó|üÑÙÎyyxñòyäè8~ÜÇÉïxhæFáÎ`Äl@$@$@$@$@$@$`î(ÜÕXáN¾®A#x›[È ¤ïÉ@*®kE ñÿ*îŒñôÅãŽNP©Õx+ô2îädÚºîJ3¬mÐHzý‰Rô¨¬xmºo:ÙÚ#]¥ÂˆWV¤‚ /BSS¤ä©J½ET†p×ÒÚóî&ß(í(pAC**Üô„û!!K£ÂK§ƒ©)’T…Y„è»ü®g …;#|Òp      r pGá®F wï{xãI'9‡­±QÒsJmb!Ì<ë$bÇy"O­®²£²bÜúæXV¿!LMLš™éwn":Wã™æªTbšOZYçoP]Ÿ¹–Ô ‚•BøÜ,ÃáÔd9mqSšá;ôvrÆ—±1ØŸ\XŒ*z¨ áNpÜ g¥™´ë³ð;8—‘­L–›§FÞ=¥ îD£=|ÐÓÉYö'× 1ˆ/ Î)´°¶EG[YchèåBÓ·01ÁõÂÃÜB&üïÉ¿i²Ž¸ö®‡[µ…wåúü`#      *&@áŽÂ\bîžšä5­øš[`e½ |o¶Äœ\Ä«rànf&¯~66vh`iUew‚Yg7 v×Ä‚ËUçáZF¦ü •%”& üš!J—p'^j?ô â(I¹9ËΆ8(ê¦TJJ[„ß1Šp'Æëfk|ü¡( "jíXžŸÍ5ÿµ Ƹýqm²?ÚÛÚËn…øz++ É*lLð57— ,D‰ÊÎÆàÐKÅ–®ðœå[/mÜÊÌ@r^êYXȵñgr"ÚÙØÃÊTÁ£²5mãÓ^     ¨#(ÜQ¸“K½¦ wÂöN6víå¥Yþ¶ÍT©°+!›c¢0ªê¨¬vЧ1ØÍCŠBÚ"â´m‹Âþ¤|u7{mIÂh#<y £­üŠ–ðì,™ôaw|âT¥gŸ­ ;íøBTâæ)Ђ¥ª„;1†8ü”“3žwvƒ»¹y1Yy*œIOÃ/I‰ø3%Iç-[dýåå#Sk‹Z­ÆoÉ XŽÅA°´¤pWG>ð8M     ¨i(ÜQ¸«ñ˜€ðÐjfe'¥‰¹¹¸™Ž´r$5¨è671AKk¸˜™!Y•‹sééHWž\ÁÊĬ¬!W(MLd ·›Y™ùGp+jgyÛ[š˜ÀFa ­ó8†š¡G¦Ùòާmçon3s)Šf©U2IƬL½²ÜŠ"­¬àenœ<5®dfÜwŽåÁö$@$@$@$@$@$@uƒ…; wµB¸«Û•³$      ¨K(ÜQ¸£pW—v<çJ$@$@$@$@$@$@$PcP¸£pGá®ÆlWJ$@$@$@$@$@$@$P—P¸£pGá®.íxΕH€H€H€H€H€H€H Æ pGáŽÂ]Ù®4”H€H€H€H€H€H€H . pGáŽÂ]]Úñœ+ @!@áŽÂ…»³]i( @]"@áŽÂ…»º´ã9W       C€Â…; w5f»ÒP       ºD€Â…; wuiÇs®$@$@$@$@$@$@$@5†…; wîjÌv¥¡$@$@$@$@$@$@$@u‰…; wîêÒŽç\I€H€H€H€H€H€H€j  wî(ÜÕ˜íJCI€H€H€H€H€H€H€ê wî(ÜÕoéî kwimüÙ#岺<}¸¸¸ÀÇ×i©©¸víZ¹Æe# ?899!&* ‘‘ÄB$@$@$@$@$@$@¥ pGáŽÂ] ¹IÔnž,­ýcèå²ÚÐ>ÄöX¶l)6jˆ¥K–á»ï¾+׸l¤!йsg|­!”j†™¯{/½ô"RRRÐÿåW]3 §•$@$@$@$@$@$@F%@áŽÂ]î·qBZJ.î\I1ê†)m0s'78…´ƒ­ Ìœµ rRrãâþ=ŒÜÔ¤2m5QšÁµMw86n3k;d&D#æø¤„^€¾Â]eôÑ8¸–.]*í8áCœ8q¢LÛE‡Æ­¡´¶…:/q§Á¤„V¦VplÒN^ÍJŒEêõ zõo¬JV^°öô—Ã%ž?UVF©C;·ì …ÙIqH =_¦™õêà‹Õ_Èz³gÏÆÿ8XfV      ¨{(ÜQ¸“«ÞÝÓ«F­þÞCëãÁ¾~ Mű_"ðÏhd¥ßŸÄ j´ýhì›”ÈP•™ŽÐ_ ì·%Ö±ö®‡fï΂µW@±:·÷}‰¼œ¬2³ÊVFbðwÞy}Ÿë+=Áú<ó¬ÞI)\[wG³³¥ýW¿Z;û¶ëœoð°ÉðìÒy9Ù81g8Ro^ªVëÏ1¤ Z[,mº´áSDü¶DûìꇠíwõËe¸óËWzÍeÛö­puuÅÁƒ1k¦† $@áŽÂ\5M¸{b`=<ò¢Æ#J”ìÌ\œþ+ÇöEàÆ…dãîr…)Zó‡3-ü’¯ž“žrP«aéìçfíaáì.¯_Û±·ÚVÌ>3;G´Ÿ±æ.òZÜ©¿‘tý<̬máÞáQv/15 IDATX8¹!=ò6¬=ýäõ?†>P%}h;]³v5üýýqþÂŒz”A<ƒú¿ßÇ^@^nNÌ}·˜7G—'2l’ìóÊÖ…ûm—Aý£²@Çÿ| kw$];‡“³ß.q؆ÆÀ瑾r¾‡Æ>‡œý’ML›>]»vEjJ úõ{jµ•…H€H€H€H€H€H€î pGáN®†š&Üj4háˆöz Y7XXšæ¯êÈ›i8úKNˆFzJnÕïwBÞ˜Œ[?nCÚ«ÅÆS˜[ ùÈyp i Uv–wrÓ ‹‹}ï‡úȶ×ÿ‘þß©• Z~°öõCò_Ó%ÜUFb[[[ìÚ­ñ ܽk7V®\eCS%Z´BÚ›†ãÓ‡"/3]öaéî‹öÓ×ÂÔÒÑÇàüŠ©õmÌÊþ½ A¿·äG>€ŒÈ›Å†Ç’»|¶f¶öÏçåþ/aèС²Ï7Þx7oÜ2æô8 @ @áŽÂ\¦5O¸»·»,,hþ€›ñê7uÌ¿“­ÂÙ¿cqä—H„þ[v|¹ªÜ¯Á­Ñzü9ĹSeÜ:mQ˜[¢Ëâo¡´°BÂ…8ýéÈb¦Ø4Bûikó_/*ÜUFÚΛ5k†Ï..^¼?|ODÔ—‘¥›ÚM['ãÝEù ç?Ÿ!èµ™´ võKAïŸ_‡*#Mß.^ÏÜÞì„ÂT‰›?nÃõoV³Á­ÝÃh:|†|ýÌÂqˆÿ÷°ÞvvéÒÓ?ž&ëÏ™3Ðxm² €–…; wr-Ôdá®àvvñ´DÛhû°;œÜ­ò/ņ¥ãˆˆ…÷{Rà…Wä#ŽÂv]ü|µhì7Çvh5n¡¼VZ<µ³·äÇ¿+*ÜUFZ“{ôxã'Œ—Κ5ÿ[¾Ä ®mD³÷fÉ~.n˜ïzð{ü%M\;q„öÆÅj'n:bÜZ? hÛPç²¹ùûóàÒª 2ã£qhÜó01à¸kAtíš5øê«Õž $     0. wîj•p—¿}L€ Žh×ÃÍ:¹ÀÜR)/%Åeaö#U²ËD’ §à6°l +W/yŠ»yUMLàÞö!9îõ½ëqsïº||z¼€†¯¼/ÿ>>óÍ3¬†¼5“õŠ w•ч֠>Ï>ƒwß}Wþ9aüDœ¦ø`ÍMR‹íÛ¿Âúu÷Ö„>íY‡H€H€H€H€H€H ö pGáN®òÚâqWtËzX£ëÓ>èØS“579!³éœQß[€ÈBÚhðx™Ì ¬rã» ¸±ûžÈSÿ¹7ðÔ Ùìï±Ï!;!Fg/¿'=ÖD)*ÜUFÚAûöí‹w†k’1Œ=gÏž-kJ%^—Çc?Z »úÁ²Nô?àüò)åîÏè MèôéX:»#úØœ_y/&ŸoÏ—ôÒ»2©Ä‘‰/!3& ó¼<=±qóFÙæ›ßà‹/VÔž•I€H€H€H€H€H€j? wîä*¯MƒZvwC»G<àd—¿‹“ã³pèÇüöUå&°l†VãCafUV¦Œé–zNfUçiŽåš˜˜¢ùûsåÿo~¿×w­É·«Á‹ÃáÿDù÷_£žFN²î¬¤õû½…€Þd½¢Â]eô¡5¨W¯^=F“Ivê”i8|¸B§HT1q›Êþ¢þŽó«4qÝjJ©÷ìë¨÷ÌyÄW«¹©šx‰ífl€­o âÏÙc žN£Æ±l™&îáæM[°yófƒû`      ÚM€Â…;¹Âkºp§05AH;g´}ÔÁí¡T*ä¼òòÔ¸üOŽì‹À…cqÈ+¢¬Rv·¦µDvr"NÌy™ÑwŠõ+2Ã>°ügùzQá. ÏPÔïóš¼vx‹%znõ ßÇž—õŠ w•чÖèŽ:`æÌ™òÏùŸ.À/¿üRnNZ/AµJSMæßË› ü=åîÓØ -\<ÑiÞW0Q(peë"„ý¶¶ÑnšF|=·j:bŽþf°YíڵŜ¹sd»E ãÇ4¸6      ¨Ý(ÜQ¸“+¼¦ wÞ¶hÿˆZ>è[óüÝš“‰ãû£pt$’b³ªl+,,ñÀò}RÔ)-Ι­_Ú}¼^ÚqóûM¸¾ëÞ±HÏz#øµ‰òÚÉyï#é’î˜rÍFÌ…kën²^Qá®2úÐBòññÁú šxkë֭×ۿ*?—Ö ù0%rØxùëûS2Þ8Ón^.W¿÷£Qó1 àÒ¬Rn^–Ùpµ"jNjþÓê܃ÍzüñÇñÁ¸±²Ý¸qãpúÔƒû`      ÚM€Â…;¹ÂkšpÜÎ ½†4€W€MþUåæáÂñxÙ‰KÿÄêªß¼Îè<ÿ9Pižd~½"°ß›²Þí}_âÚWËó³ñoˆöÓ5BYèÎÕ¸õæb†‹Ä]î…¹½“¼VT¸«Œ> ºk÷NØÚÚ⯿þÂÇÓg ÒÂÕ í¦­…™âÎÅ™ÏÆÂÔÜm§~ïúHÃñéC‘—™®Wß½ŸêÎ:!<<6l@zº~íôê\JníBÓá/D‘@¤ÅÈyò½¸³®n×w5´Œñž~æi#¯oß~HOK3´ Ö'     ¨å(ÜQ¸“K¼¦ w½‡Öǃ}ý¤í±‘8¶?Ç÷G"%ÁpϧŠìq…¥µ<+–Qø{qyÓübÝ™Ù9¢ýÌÍ0·w”×"~Kæª×qÞ×°ró’‚Ö±I Vibãi‹[‡GÑôíéùîÄ…ÊèC;À´éSѵkWÄÇÇãå—4ñ÷ô-"!EëWÀ¾A²’âq|êä¤$Èæ6¾h3ùs˜š[KöPRÿí;tÀìÙÑL”ƒÿ=ˆY³fëkNåÔ3U¢ó‚]°°wBZøu)>ŠrtÊ ¤‡]/×Ë—/CÃF qéÒ%ŒxO“U˜…H€H€H€H€H€H€  pGáN®‡š&Ü=1°\½¬pä—\9%D!“û¶³ÛLúöM—›ƒs+§!îäŸù¶X{×CÈ›SaçߪÌt˜ZZK´?Ó‘Ôï‡û¢Ñ@M‚ƒ¨#ûqiý'ÈËΔÛ5—‰-Ìlòëëî*£í=zôÀø ãäŸC¿†ððp½ùj‘ O2ái—pîXá¹>ÒhæªWZç³ÜŠz*• Ï<Ý99Æi¼ðü{½’ojÒµs89[“}×Ðbmcƒo¾ùJ¥7nÂÖ-[ í‚õI€H€H€H€H€H€ê wîä2¯iÂæìýë Þ¶@Ëq‹ PšÉ—…×\fL8ÌìdÖQ±Änì]Kwxv~Y‰±84¦oáÛ‹‰ÍG}—æåë¹iH½s fÖö°ñ©'3šÆžüÜ;<"¯ëîP}ܵÊÂÂÛ·o…­6l؈m[·éu;tmû š½;KÖ½õÓ6„îX©³]ÓsàÖú9¯sßEê‹%öïíãƒ+–ÁÚÚ:¿Î€ƒ¥—M•UÉÊÓçÜØ.mšˆ?ö–«û'z=1cF˶ƒFDdd¹úa#      ÚM€Â…;¹ÂkžpW½6¦cH;4ü¬Ý} –Ð]«õ÷ÏðèÒ !Ã>’×L€Œˆ›…ê*Ì-øÒ»2ƒÂT™-+!×Í…ÒÊM‡kâÍéîTFÚ‡ŽgûöÁíÛ·ñúÐae·qí¦¯ƒÒÚÉ×/àÄœá@‘#¿ÚN”6ö2Y‡¥³;2bÂqüãסJO-q g''4iÚ£F„½½½<¾+Žñ»´ž´ Me‚ !¾æ¦%—Ë„ù >E‹-pìØqLúhR¹ú`#      ÚO€Â…; w•µÏM°«×V¾Pç©),µaY2”¶òè­ÒÊB´KºrÈSdeeôáçïÕ«?‡B¡ÀÈ#qábÉ^qWÎÊâxéîÝ;‘’’‚çû½PÎ^*ÐÌT‰. vɤÑÇàüÊ©åêÌÛË ë7®—ž˜ãÇMÀ©S§ÊÕ‘ Ô~î(ÜQ¸«ýû¼Ü3qîD¼»ƒÿĬ™š#°÷«¼òê+2d0~üñG,Z¸Øèf¸wì&oM“ãžùìÄŸ=R.ÆŽƒžOôÄ©“§0~ü„rõÁF$@$@$@$@$@$@uƒ…; wîêÆ^/×,ÝÝݱzÍjXX˜cø;ï"44´\ýT´Q§N1eê™âao"&&¦¢]Ô^dÊm÷ñ:™MVÄ0<òaƒ=)Å€ÂÛnͺ5Ò‹ñ½wGàêÕ«ÙÁÊ$@$@$@$@$@$@u‹…; wîêÖž7x¶"‘‚ÎNŸ:ƒÝ»wܾ" ¬¬¬ðÚÐ×ðÔS½‘““‹éÓ¦ãäÉ“éRï¶"fŸµ§¿L2âõ@o86n%Û^X7QÿûQï~ V|üñÇÑ¥kgœ?w_½£\}° @Ý!@áŽÂ…»º³ßkÜLE&ÙmÛ·JÏ´%K–áÖÍ =ªrBþO BƒçÞ(4Dô‘ßpþóéU9,û&      |î(ÜQ¸ã ¡ZÇu£££n£W÷gàÓãy¨Õ*dÇÇ æøDüõLŒn $     ¨«(ÜQ¸£pWWw?çM$@$@$@$@$@$@$P­ P¸£pGá®ZoQG$@$@$@$@$@$@$PW P¸£pGá®®î~ΛH€H€H€H€H€H€H Z pGáŽÂ]µÞ¢4ŽH€H€H€H€H€H€H ® pGáŽÂ]]Ýýœ7 @µ&@áŽÂ…»j½Ei @]%@áŽÂ…»ººû9o       jM€Â…; wÕz‹Ò8       ºJ€Â…; wuu÷sÞ$@$@$@$@$@$@$@Õš…; wµF¸ëÑãQ(¦…6\JJ :T­7au4ÎÞÁíÛµ-fÚí;a¸|éRu4™6‘ @­#@áŽÂ]­î¾ÿá;˜››Ú¤7®ßÀ›o¾Uë6®® Ù5h3k»b—rÒ“‘zÁ !ÁÁX¼tq±6{÷~‹åË–ÔWm«Ü´i˜*ÍpíêU¤¥¥Õ¶éé5 4†Z­ÆÙÿ•ÿ² h˜ZXÁÚ§”V¶01QÈ×Rï#;>šˆH ÂÌíaåá …¹%îþ”Eâ•ÓÈËʬpßì@ s 84l!÷xjX(²bôoÌš$`  wîä’q÷ô2péT¿êZáîêµk¸xA#TÅÆÆaÛÖmÕÏØ*°¨õäUphдXωWÎàÔÜw ÑÓÓ/¾ôb~›ž={ÂÌÌ ÷K¸S˜(àf﨤;Í£²+wíÚÓ¦OCTT^: ÙÙÙ墋­=œL•²ýµ¬ \ÌÌ(w_ú6t45ÅÃöޱ´†£Ò yP#.7ÿ¦§á¿É‰È0@€[¾|6jˆeK—áÛo¿Ó×Ö#|–î¾pjRܳW_D±'þ‹œäÄBÕÕ&&piÑ ÎM;ÂÊÃJ +äf¦##ê’¯_@¹ãÈII(qSk[87òG‘Òܹéiò yÜ©¿|íl©æ™˜*aW¯1ìê7wÌ\ ´¶…*#]ï>J6N ¯®O Y%þÌadÅGé¬îÑ¥Ed骘tå4ÒÃnè‹ü¾×³l¿@iG^v6¢þþé¾ÛD*‡€¥›7²“—UõŸ…•c±î^ÄùÀ—߃W·ÞP(Í Uº´i>"þØ[•Ãç÷-îeJk;dÅFe¼Ú>ˆ]ƒØú7Bnz bŽþ®÷t­<ýáÜZÖ×¾÷ KkxtzL¾wâOd'ÇëÝŸ…«‚_›§âŸG>€ŒÈ›z÷u?*ºwz ¦–ÖH¹q ©7.JCÚÀÊÃY ш?­ÿ))sgw¸´è,ûˆúûgäeg}JŽ!mÑjÜ"9îͶàúÎÏnC­Pa k/¿õÝÄXï…; wr­Õ&áî›ßà‹/VkU›qê?ÿ޼Ñi‹CPs˜Û9¢<Â]ÑIíÚ½¶¶¶÷E¸ëÜ5y×¢Îaû_Kîo!\®]·BÔ\0öíû¥Ü¶4µ²Æ|ÿùOI¿‰‹Áš˜Èr÷§OÃÇñŽ»¬L5Oþ‹–Äœ\̸ãé©út‡víÚbÎÜ9HMIÁ!C‘œœ¬W;V"-÷N£É›SÊ äŸYo!%ô|~{Ÿykl}”ا:/×÷¬Å­ï7«J2Þÿ©AhðÜù—Ï,_âœ.‹¿“÷ÿ²Ê•­ öÛ®²ªU›ë­'­‚Cà½T‡Ç¿ˆL Õæý)!BÀzé]¸´ì‚£½‚Œè°òtSmÚ4~ý#xuí%íÉIK‘b„¸ïˆ"î;1Çÿ¨R[…Vƒ‡Ã³ë¸º} "~_¥ãÕ•Îë÷{½_EzÄM4@ïi{ví…à×?’õÿú€ü×ÊÝÿó¥üÿɹï"éʽú†ÚÏÜkOÍwý¬øhd§&å·=»lRµj;~²V®ž¸¾w=nî]'m~c <;?.?ÏÌ­ QɹYG´3_Öÿ{TƒP½)£¢cH;´·PÖºùÃV\ß¹ª²º®“ýøôxþO¼Œ„K§pqõÌ:É ´IS¸£p'×…»Úwoh5~)ƒ[ÕxáîÃgWÂÙÎ 'BÞWáîÙ¾ÏbøðwÁƒ†@¥R•kÑ»õÂßÂ2¿}U w]mí1ÙÇ_ …¹ê<ìOJÄÕŒ  ¯©¥ ºÛ;ÈkÙyys3WõôxÐzÝíøzV¯^S.lTw ¸¶} ŒÑ ÀÜÞI®É<èà×&"îßÃH8A/ —mêšp×ìýÿÀµUW$^:‰è£Ðhà)â‰#R¹i<ª_æBª¦j“pçѹ'BÞ˜,IžØ™ÑÆËKá®jzu•ƒCcŸ«š‰Vq¯îªp ïžÂ…»Ò˜ˆ"*¨ëxZD wšeb[?.Í;ÁÒÍ ¥Yñ1ˆ?{‰þѹŽDL%Kw±€wúo@­‰c¢«ˆ`´Ú`²i·¯êŒËcã(½)ÄQ+qä+/7Y‰ñHº| çC›£÷-¹¦ w!>m 0Ñ$m¥_§·`gå€k‘çðç…ŠÍÿNü5$¥Ç•ÈÅÁÚÍü;ÀÓÑVf6P©UHNGxü \Ž8´¬²ðÍš=:tÀ¹sç0z”î£}e¾1j5梙µ æ‡ßÆÍì,,­$›U¥p×ÐÒ*œ=ñ±X­;PõÇ>èhg/íyáòy).êS&O™ŒîÝÀÍ›7ñư²Eˆ‚} OÆÄ%$ 9é^œ}Æ­Œ:"x·kË®° l s[äf¦!õÖÄÿo™±RD!§¦í¥boÊ€ê S¸µ{Í ŽL‰ØFÉ¡ç{ò€žB(² h$÷uü¿‡e_Â&ÏÎ=aãS_f‹ËŒ —÷ Ò’"È„ M;ÈÏÎnP«ò‰¸Ó‡ËL¦ Æ´ hK!Z%Æ"õº&±©Di‹*Ò£n!æØF‹'fˆpçÔ´ZŽÕ}=·b*bލŒå¡³s¶ÂÚÓ_^ûóÇ¡ÒóXyÁÎ:ÌÙ&c‰ã´‡F÷)ÕV±ŽÄñ[S K2®­¸oÂ¥¥¼½}†¬Lã{¡ëâï$‡k;¿@ÌÑßÐiÞW’Ýù/f"úpé1G+c¿Š±Ä^÷ ±÷Å=#+)N~ö‹ïb ‘JŠ å‹DÜïÞ¢ ,=A|êíˈ;û7 &L”ÖßÇ<”ÎõšÃï¥7س’xC~š"QQnRÃB*lN‹ýjÈJü|´V‹©¬gÉ|pÇèdôÎp Ä(YØ;3Ï^J46èý¤œ’¯ŸUŸušÂÜÎýF×´%:|½~³E(„6Ûù׃¥³;;ØÈŒº·žÁ¯À¶”w4;:’…몼Ißâ®AíAßÚfV¶ÈÏHeÍI—O×…œ„hÜúj)RÃ.ê´v<«ÀÝ‚·¿†¥Ùcþ·²öÛëp1ò˜Úl]¿—š¼™ä¥ ÍXT\ˆmÏGD\¨ÆjìííñþïA ÓW_ýÏ`•â×]0ÚÛ׳³0!ê.êXÛ<àÎQ&Ãwu°çû35«bÕ{¬¬^ ml‘[T„þ·oèäqGeöèÑcÇ}ÎÊ6l¢îÝ/«ËØuK+K¬X±ÈËËÃ’ÅKpòä)î5F&ß®¯# ßP9瘴̼JýïAUI½H$¡ =MÆ­”“FKoŒ;B}Ñ IDATû¶ ë„4‰ž&Eù8þIW87i‡†ŸÌ†™µ­JÞ[_-G̱ŸT~§c£‘s™Úº”tý¶ÍÓúñ8d¼;ô@Òµ³¸¶zjô ÿÞƒ˜W˜4QjÈÜ!ODéKàέyg4µ€5µ¢9¤âÿ}ÒUœÑq`¶[±–.Ȉº s?ÒzWƒOæÀ£MWDý² ‘¶Ãïå·Ÿ pçï_K—-ƒ³³1aüDDGGëøÄåÏæÔÇ,f…ÌÊ@ÖKöÂÆÃ—yßÝØ2Kk%Ƙ¯æNh4j±<\ZaŽŸù Ñÿý„f“׳ŸOO¨ÐP˜6yZR ß³N#R»Õ‡`é肘¿áÖÎEò*Dôœ,$œ?ïN=å׈òêš h4z »WL÷ÃqaÞ0µ‡¤„Hß#¤œ¬œè;æø/ß½J-?›È³EùŽìŽÚoO§^*ådDÞÄå•cUÀCéÖeddÇ?¹)oé’Õ <åYC«¿ú.j¾1\çz+BU–À²–³ôd;5¾¿Âæ×¿ïGlͧtvڻȉÕü¯ÖãmÔ xýžŸû‘œg”þ׫äÐs¸÷ó.4útŠHNan.Â÷¬F܉_5ÚMTæõ騋y8+'â½ñŤ߾¢³íË›ñiwÇ®€kã6:7]“ª¬©¥ê ž Ö/ª-+;ö>;U^Õe2FTîóÜI¹¥¶ÒWœ¢z¯Ù¼3•=®¤å‘Gù•c‘vë²Îc@ŸŒµß ¿®ý‘vç:®¯Ÿ†FŸ-†cÍÇâObY1Ç~aûOM©.‚Wbí²¶ ÉëØ©(‘’ŸŸ¡ÈÙ$~”“òyèL:twµÏµI[FŒNü++Çéô±ò¬wÚŽ€™Ì\¾œ6¬ÞšyI™qˆŠ¿¥²Ìžºõ¢UoYë¼ü)ËOv×îŸCJVLéDÉε¼ÁÕÎ;ÿ]„°GšÁÐÎ]:aúô鬜iS§!$D½÷¥¶õßYf†í5ëÀÚT†1÷îàn^.¤žpéqGíÚè_µ¬¬ŸŸa‘·‘§Ä‹â*3Ã5™âì_©ÉX«»ª_Íš5±e«À¶eËVد›BåË/wÇø ãåf‹º…aÃôóØ3ô+òÄÐýùé©H¸p”…HZ8¸€¬\4ZÎù–Nnòµ‹8ÐLÍdpiÜö50„($S“Ç®ÜDöºïc‚ ´å&Å1A»€z PVr5´ʺOàNºq¥P²¥®ÞeµCẩ í×ü㉠f6¶ˆ?ÙÑQÌ«“ú¸K ô%Ô¤KÄ MÌÌ4a5ë6e?ÑØLºrÙ™ll»·êÂ6úô޽¸x¤p¨«Í É÷4€»j¯¼ ÛjBd%òÀ£Ã ?/©Xßý~“ÊÚ^ é„ÕpiÐ’•Aß O (?‡­g¤æÌ„Ër²˜è’:ÐÖeˆÏð<wäa\í¥7åýâÞúEfC}€;ϯ¢þ©¬ Šv u˜ybËÌ`ãîüÞhmÔF‰aÈ8–Þ#w¹Éñl\'-yØåÄEÃÚÇQS˜š[°[®ož…ÄóªÑ å]CM†IiTyÒü&gúžSNt ®-¥¼6©ì÷sàŽwlŒVUàŽ^F-flcÛäMºq&’®œT˜·t2Ýdìrö‘ûླྀûÝF…ë⦗N½ORØ“šÐ '7´+å`ŠØ¿÷ïR(ƒ^Æôò$~¦%¯>ÊHU-flaà"m..(àxV;åEÓPUÙq½VÁÛ©:Óc°ö×ÉÈ-PRV,}ƒ¨“ªùtyĈáè׿ûÐ|½ÿÈÌÌÔ{]ŸáS œp(9›KCUŸ$pheEÕ`+“álF:6ÇG#¶@»®ei…Ñž¾¨gcƒÄ‚|ŒŠ@‚!Ùä‰xðǃ°¶¶Â±cǰ`þBìÓ³gOŒùl´<ï£èh þp°N÷–'m´š|&„˜$‡žÇõ3P,QݤˆF#æÃ5(˜}Ÿ<)*UJ:­¶róÆò¤ùï売¢ÿVU“wT†ÌÒ7¶ÍS9]%5T ™¤6i ühš|ãþÍj<úç1hJk[í·F£Z÷ì–ˆÛqÿÅuG,K\Ã(ü†RDßCØ ÃbML~/¬ÒyÜÁÄm–|+÷X& òÞ/bÔp*)`qïç¯pïà­C‘<L`SKKXºzóMWøtéË€Pêï‹ Ghäf£{iƒlíæÅÆhâ¡ïõîÔ5Ö2«ïîݨ•ÓOzïôéÓйKgùO¿ýú;V¯^]ž©¨ó½‚Cd–ÎLt„ í=ñY/­ž©O“ãÎXk¨ØñOóYÄ6Êq' ü0þ´ o¨¥~!:™–3Qåwý&wôo:h¾JÞBáWåó‚ÚFêßô-K`©+(Õ8Õ_EH(âàvÅwª‹'‚&¯‡µ»7;\º0ï1h©ó¢b@FzHQ\P w!…2Sø0¥ìG‘ìÿ&23X{ ‚`¹ 1:«‹‹ïj}8V½:ô@½!ÓX]¦¶c¡Â>…æsƒáshK‡ŒÔgÊÉeˆe’B:QÑw…úS²pvgk@ä%ª§sQ×eôÍdéæ%Ø6æ¾ZïbºZï[:o?Ê4œ´d§Y”4Œø½üj¿)x™<½¨õMþ}†À¿lÇøÂÓTNÕîL°ôݽ̻îDد8²S_sËó/]¶Íš!9%o Ô?\§­=fWóGjA!>м…¬bñIwT_€…%†{ú i©’mfQ!d&¦°65EaI1Îd¤3þ»ÄÂB½mµiË&Ô®U <À!º}D;:9bóæMps¼Å6mÚŒþ¨wÝúÞÐböæ‰V™†s3ÞS;è½íŠ}™[hTþ”nލ †„@I7yäùB§Ýº~ ™Ù: xÕAvJ^ÂW–¦j SÚ,ÞÃ-ö¡?q€Ú͘¸`¿Ì³xŠórõ5­QóëãqG³–Ï—ÉO‡é7Ú8JÚ­+Hºzéw®ÜFÚ ´œ÷³% '+‹{F|i¥ôq{êDÜ®•L|çPÈÙÕ•=Sõî(Ô†¸Z‰7ÇÂÑE! ›¼×.-…œ˜²U¤›5Á¢E‹`nnÎBÛ'M˜„°›7 ¶§>7·[ói‚ÇÊq§~gÿ¦>i¿þ0ÛT¨óì’ÖQÞù*ò’ÀÙ©ï¨l‰÷+˜Ö +VmEwv[×_ÿ5^{ä­ŒB·Kë › ¯vÝ{úOÜÜ>_nŠZ0ŸB°ÔñŸÑ†±Õœ,ü^ Ÿ—ÚR ÜQ(þµUǧ˜ÏçÅ~Ìs—RȼaZCðžØeÌ5T|î§õ,šÆº>ÔÒ~Uç©Iuˆ^®äívj\?¯=º.îÔtSQšþ-=” ¿¥ï^òâ$0ZNy6-„’?)/p}Ö¬ŠÊkp×bævØÔCAVÎL Q[ë !÷ÒUnkŒ2*Ê&•¡\};:Œê²íûþµw¾]ûTC ÜEìߊû‡¿ViGƒóàÑêvsläË ó±"ÖPÜi ¸ãÀ!U¸?2hssrÔ«I]Éã…N)]\4RqhbŠàUØ ¢Ô@:õšÏÜÆ\ÒY×¢-Ðî-_@Ñ‚§AY”§jwÀ¼_ÁÚÒ7^ÄŽ#¹‚ô5þW»¾‚··Aâ Ö&&ØV³.ÜÍ-°*æþLN)=iàÎA&CwGgôsvƒ«ùãPdj˃¼\ü˜’„ÒR«F«‹½Dp“6ô½zöÖå–‡ø›5k†Ø¸8ܾ¥î¬sA:f´öª6‹„“²NF›”†–h:e”9‰± W§Tª­iÒM^ì©ßqó ݼ©L^·‹{BðÀQNý?Fžï³ŸÏÏüPð^Ì+îÂv.ÖÊ=¤£©ËM_àŽ§š P÷ýñòaåFd>ŒÀo×éD´¬|oƒáóàÑú­!^Ê÷¨î(úÑßûsâ°ÆÐeòji1m3JJŠq~Ö (]»:ïCÂ…ÿíƒæÐfÞeµŒ€c-Ç&ëÑ=œŸõ¡Va%ñ¹h¬S¯.n†ÝD\l\¹ûX×Þ¯¾Ãlzl_ᘦ×Á¹~3æ½sF‹Êoyæ+‘w‹BÚÖ†£ÊC+¸;þé+òÍ·_÷7Qû­Q`ÿc^“›T~•·àÕ?²o•´ˆP\Z ™›Môº#˜ã£z¨xè4)€7¿\‚Øãª¢Qä©Ñ|ú–çú†*ÞÂÒ¾Z`—1×PñyžÖ³Híi¨Ç…è¯<ÈÂÕ…I“—NÓô­+îD.JåyNhÖþÂ@‹è£‡p{× y)ôÕU4 eÈÌÐqÃoŒNF]‹®k˳–O_àŽ€•ë…ùsò7ÜÚ¡þ[˜Djˆªƒ…Q?úçq„€1ÊxÖì¬o{õî¨üöë…¹­=;T¼¶f’¾U%¿¸;3ùM&†¦œª¿öj¾þ ûùÄè×¢*b åÀö®åÀîØ©ªÀ]ÛûŸUzd [bI–„Á˜ÀÜÁÁ+„™º­ø‘L''?ï£àöNum–ìe÷Þþz•VÂ{ rmÜŽ)M’w„ÌÂ(å‡'¥0QÉëÒÒ1H»uIëì®êÀݦ¢¾_ f£sáÿàÜñ )ÅZ”Õtßþààà€ëׯcÜXUÏmð©‡z¹¸",' cïÝ•-ºçIwþ–˜çç æù÷GZ2"òr ƒ)ê[Û ›£3ã·‹ÈÍÁì‡Qz…Êҳ̘1: œ:¯½Ú¥a¸Fù²0b!^_C½ÁSX‰,ìj©zžš9_çÝÏ™r#ñ‹™((J“ts¤¼ùеÉÒM^èÖ9H8û®·¢FŸ!(õÀ%pG“§qöA8%M¤¾Ràî䨾zóŸéÜh=2܉Å€GÜ,Nõš3Oäh¡ëä™D^(ڈѕ›)µõ½C_âÞ!Ý?ÎL¨6/õ̺´øS…PH±ÖÞ5Ðf¡pH"õ’T7PžØeÌ5T|®§õ,šÆº>wT†8nÈ[™ÆSaVº¼hi¿_^þ™Z®>¸#ŽÔÿ†wÓÈ5* Ë(f‹ž_t?…XÓ7µøMN yžn‚Vs¿„w è{èU¡‹U®/pçØ Í&¯c­º½gZʺ&ÏQæë6Fl–§^¼!À]ã1K ¥˜c‡¿0íEQ\ôÄžGîÈyå¿a/¨õn%zº{ ¡'>h1UÄÊ;íÝÏ;ܱRU»NÛhTóÑ4uî|·ÿ€81Iy?”?ìI5¨f¿¡ …‘>„ 2{]IË`*—ý‡©U”TnKY ¶”¿ªwnöÞùòØ[;ÊÍ—W‡è”HUAeÏ))€C‚]™î¨t¹Ô»ùæŽEˆ=©Þ#Xy”†s©+˘k¨Xþ³ÜY{UG›Eß°ÇQ>hn4f ;!:ê'u!¬"p——–ŒÓÄù¬!Mݧ:UD~šN\çú«®)ñòI\_'È=ïI_àN:WC7ÍDBÈQ&ê´í_F;pñB7‚l”ŒQÆóÞ/†wÄõ×|ê&æá*&úË|Ψh\§†é/†§­Å5h Ngµš$õ‚U~¯UÄÊ;í=È;ܱR;ò:è¼í_öüÄ/Eÿé’"܉Gÿ ’µõ¢o˜ú#…'…nœ!¿.*p‘*ÖµµêÝ¡¥xD LaY#§^ N4»juä„Ñ——EjXˆÖæVuàŽŒcké€n_GÃj­ál'KÓ•{§ðÝ©((ÊÓhË=ß~ÃxØî„‡cäHa¤KZU½&ØØâXz¶Å«ºŸXZc~5VÔá”$|›ÏþVX„ËqÒËŽNë- ¯yˆßÒT…èÚ7/ tl4éþ]\ÍVóÐÒœ æ£u›Ö,”í•—{°ÿWÆ$òAQÛˆk :´“y¨Ù€HCøí¨ ›¼iï!'¶l®1Ñ®¤ÄåÝ©'û“xG¤RÛÛÕDËÙ9ýÝ6ãÁo{TºF¾(c³õ$ûÔXÀ´Í¢g4ýFëxÔO_j}$ò´"õM éJº| ×6L3ÊixýOfÁ³ÍKlžPxŠ ʬm¼êGþþíz$„¨*¸ùté ÿ^ƒX»I¤€8(å§$è×=¦2tÚòÛ¨¥ß½‹ …P˜Ê–¤@%m(³c(6ÑÄÕ_y‹¡êT.ÅÌ噯R¾6ª Ik¼;÷Fà‡ÀWY€»Ô𫸼Xà×unØMǯdÿ¦ "Šuã3e„å÷ó>/À1×Pq<ëÀ=‘ÑStGFäM\˜/ˆ”÷\»UØA·¶ÐT¸Óä©.ÚI qWœ›MßÂÂøÉ3šyÛé’oœÇM‚wèóžôî<ÚvGƒ…ákk§¨ˆïIíÕqÓŒ£3éÚ\[-¬c”ŒQÆóÞ/†wdòtôïõ!Üšw‚•«§Š™âÏÁÍ‹t/Ñ×Îåî*b åÀö^äÀî„…ÙË[ßù^éòÿrøgXXX`ßû°mÛvÚ×qËßLáOÙ5\§›•2Õè=}‡0Bô“Ÿõbi[¿Zh5ï+–óÆÖ¹ˆ?û·JѦ–Ö^ý̬¬‘+{YÐMR! ÜéßCäçïQõ}›£QµÖL¸‚Ò‘ë?â×Kª„¬b 6®Gݺu‡Þÿ@çŠwÔ¬ _ Kó‹§FEà’’º”Þ…Hnçå‹îN.ì—ïÞDœ†0Öæ6¶XT½&Ë÷eB,¾KÒX³n Ô¯¤¤$¼ýÖ;åin…Þ+ «;5¾¿þ`‡¤uåÄbÊÜIA(má­u›¢ùÁËæöîUˆ>rPÅÆU¸£µ–6'ôÚO¼t××OÕ8Þœê·D“Ï—²0["I¿ºz‚ÑjB¤·ÌAÂ9!Dš”õ‚W>VÖg2ÚEoP±ýº__UVt$ÎÏÐ}mÓ§]åÍÛlÊ8Ömªs1Ê¡<â噯ží^FýaÂaœ&Ò~ºVí•·QkàH–ÏPà.xÍO°ppVñî¤ñ4QÁÒÇãN ÜQy‹Bx¬¦°y] ý¼wÆ\CÕ®é]ìj¬<sÜ•6@:ÞE^Tñp™BXOO|ù©‰j›+w$àsrŒp°¤.5Ÿ¾•…êççù+%Q%™¼úÎMÑ_ ÌX6¬¬åè ÜIE<´ÑqÐQk—/þ<ÁÏÁ-Pc”QYíi¬v ÜIë'<Ç:áÚ¤-Ü›ub†”¢~݃È}BÔ„±Sy»ŠXC9p§½—9pÇ;6Bª*p×jÁ.Øúh”¹Ög‘”rÙ‘'DÜ©ßäŠo…y98õyoµJ.󢃯å¬*M¼!tÍ·ÛÔyGàªÑ¤'moÓ‰ká\¿y¹1ÄòÄpÑC‡~ÂÆ ‚HÇ“JSûn†‹½;.F÷'…Юò&G? ï>öVŽÈÈMü>ÒXäÔ©Sð‹/ 77}ûôCq©*lYm¨,ÀÝLßêho/„ ¿†¤RÕAåö7²¶ÁŠÒÐÞ}Iñø"Awòù]»wÁËËW¯^Å„ñOj˲‘‹³3Zµn…˜Ø8\½r¥¬ìå¾îÖê4!¼hóœÑ¥¢òbùåî¤ ñs¦ß½®¶ÙžÁ¯ þP!ìåÚº©Hº|B%_UîèÁÛ­>KGÍJ¼Lä¢>‚&¬aÞÄÁteå8+…¬ê2F4å¡pÙ†Ãç°Ë·¾ZŽ˜c?±?QàNf&xÜÉÌ~ — €“¶äï_õëáFhÜ¿_Vör_'o„ö«± LNÜCdFGª-ÓÜÆŽ…CS ÿf5ý£ ~–g¾ênNu×ù`<|»ôeíPÈô)©£Û`LLÑiëßÌ R9,ÛÀ¹ƒÚ¯ù™UUBÿç¸3æªvMF;¢h·ò #Îðçw¸»wSÔ¶ó«m‘#d©8űÝ5®›¢HJJØ\Yþ¹|^“¨Žï‹ý N¥Ü ÊsP€¾À”Æçîþmxpx·Z+Xºx¢Ý FãÁŸßãîÞõò|Æ(ã90½ÖGÃŒïÿ¶?”d³ññGÓIë`éàŒ¼ôœþ\wÑ7}l]^à®"ÖPÜiïAÜqàŽª ܉Ú6rzBi{}@Ê+ž"ŠJnm–~kwoÄžþ7· *lÊIº±>;ý=äĨ—k2~%\¶f·3bý˧´6¯ÑèÅpkÖñ‘”÷ä²¼À]€¿?²rr§;$>ܤÞkáîè‹ÐçñÕÑ¥úv‰Æü=𽋠dÞÓ¿}ù…êÃeû÷ïá#„0²áŸŒ@DD„Nmp•™ÁÌT Œp»¿¥æú ¡²¿¥&ao©‡[Ja!òµ„p6 j‚>}ú  ¿ßìù÷£´‡WJ=î&FEàšo>iHí— 1ø.Iý‰ºòÃ;99âû¾g?ïÛ·Û¶êæíêââ‚-[7ÃÉIà÷رc¾Û+”SQÉÜÑÁ«2«¨Ã_#r)9»–«+pçT¿‚&®aEi ¥kÒP†S^G~²’-MU¸#z„‡ÌÜñçàÆfÕð*ß4›¼žy¢UhGv àéß `ª‰),Õ„ËHûʧSOÔè)xÇ‘PRêMA¤H¾>i9RÁGÿDø×‚¢ ¦ÔªeKÌ[02™Œ‰ÏLž<ׯ•ÍjÀÔ’ßâÜõ‡NžuûÄþCmq¦V6è°îx%‡žÃÕ•ª"B噯d´_û aV#“6¨õ¢=°ñh ”;˜ÊÐyûaíÑàAaëW­æ áÛÜQ¹­~ÍýÓî†âÒBͪ²ÚúÍØÀ{›®hø‰dŸŸ3í—êg IDATY÷ÃË3lt¾×˜k¨Xie•¥÷\ûÕ?²&QÈý£¿ô¯ŠúüôT\[7 -flcå]_?‰—Ži´±¸Ó¤ kåî¶K…6)ÒC++Ç#%ôœÎýY2ê ÜÑÚE´´6j[»¤á°Êk­1ÊxÞû&xíϰ°w2 ®h+‘§”þ>6â%µŽåµky»ŠXCEÚ©²¢"ÊûìÏêý¸ãÀ»U¸³­Q­fï`6xtôG„ïø_4%s{'âtO·×Q÷Ï™ÅõÓÑdŒ4i ¯q –çÓäÊNDâAײ~Jº„¹ˆ|^Ärvê[ÈMˆ1x*p7gîl3>§_ìÀ÷ß«òjk؈îóPÓ³3b±ôà(‰¬˜æ»LJ¥xE~@u9¶‰Vµ_DAa>¦íyGc¹5kÖd¥µkÖâðá_ ¶£ôFCÄ)±{÷.X[[±¢ñþ{ HIlBZÏkN.íåË~:––ŠEÊQt¡¤«jÔbœ|”¦DEಎáºmÛ¶Á¼ù‚ÛŒ3qî¬nÚ½{÷¨Ñ9cbbñáÅ¶Ú  ¶‰ã.dÞ0äÆ)qfIo61…™‚²žx¹<@€XFy€;™Ú­:È>s¢™AIa£/QÛ¥{™ç˜”¯HÙ>Ï:pgfë ïzDaÀéªV ¦¼ //pgÌïPñYD[jÁ)ïs?Ë÷sàŽwlüVUàŽž=pÐxwzÙ!æÄ¯ˆÜ·ùéÉòyM “S½fŒHÞ! >ÎN}[㜧2óè‘ÉØGméÄòÔ¸¾?vhÓÙnåƵ—“‹kk&*¼X]š´Cý¡3X™fÖ°±+îÖÌËFy¤¤ôä9rûË‘“ðH.@/hÍþ`Šh(p× A¬Y+ðòP"OÞ½úhš”ûJÐ[èÚø öóÑÐC쿬¼t­ë®½•F¾²gnÿ‰«Q§‘’%åk3Aó€ŽÐnÌdæ¸vÿ vý·Bky_íú >ÞÞøçŸ°tÉ2£¬ù†wµjÕÂæ-›êŸ4q2._¾¬±Mv¦¦ØY3ff,Ïÿb±?9QîÕG×?öðAw'gv=*7#"ÃQ¬ãà:l(€œœ\ 8y¹š?²¥ìÖ­+&M~,Ör7"#>aÛj+ÄÚ»ZÌÚ3Kk6Goýo¯œ„‰ÄË‘ÂFÜ[½ŸúâþÏÿS«ˆX^ €ÚXàŽî¯öÚû¨õºqÿÍ‹Q”Éþ¦°Ë†ŸÎ‡c͆ìoeµk©žuàÎÂÁÁk>šcþ;„„‹'„>,œÜà×} ü^ÀBC ´¥ÃŒ‚ôÇ ßfµZ°Ön^Œ¸ÿÎÞµr[jO)7/)lpˆCÑ÷¥ˆ;õ;¯œBVÔm9_)…}’tÍþÃØ{’.žnÊuëÜ‘çw^zâÏþƒ´ð«r.GzF§ÍÐoì«ÕfE§„]•僶4nÜX¼Òãy–üˆM›Ë¤©NÚÀÍÓŒ¨Û¸0W3› ¥j¼ôïÐ-³‘pNžSyç+Qa´œ¿‹ykÒ;=|Ïj&XB‰ˆÅë¾'¨É KIpW÷ƒ ðé"(mÞûé+DÚ)¬;23øu€Zo|Â@âU¬(àŽ¼gšÏØ;¿ÈI!³ÑG(€#$’âÚ´=|:÷dsêÖNEàÇØÀyLRH4y4Ò!QdD„¢D _ÖxÕõº±ÖP±¾ÊàqGm šºNuš0 ææ—K‘té¸Zîdmvj>sûæ“.^êRàŽîc"@?ÿOPw%}ÏÒ:,U<–¶CʱGž¡á»V((›]õ:ðlÓ Þz!dîGz{ë:>*[>C€;‡ÚÙA mw‰Sðú†ò÷#½j¿3>z±GÕôN2F•Í–Ælo××Qç]!ä;úØÏˆúy×ã}dI‰Ê¡*}³MÛ„è#‡˜U^R¬¼9¤zµíŽÀA“Ø»@YðИí./pGm1öÐ(jôñÉ#÷Áïßju˜1¦=ž…²8pÇ;6N«2pG/.Úàº6nËlAjYÑQlCffck¯ T£DÀÚÙI´Îm‘\WÌôðïý¸³GiÓ”ªõxµCt*F\>é)°ö¬Æ6’ä™qmÍ$Ô<–.ˆ;û¶ ^NÚ’t£ œï¬*–†wMš6ÅŠ.ò #àŽ<]“½µ3ƾ¶öÖO%ò’+.UÛýáÔ&\‰R &ànÖAI“RrF<’3ãajbwGP™”2rÒ°ñ÷iHÊÔÂûÖÛobÈ!ÈÉÉÁÀoê Ni{FC€;333¬ß¸µj "”–/[¿þúK«9[ØØa¶_ X˜ §|ÅňÎχÌð²°€Yéé_za!&ß@¤–n劾þf7<<<ð×_cù2«Q—dnnŽ…  ¨Y²³³±`þ„„\ÐåÖrçqiÚ †Ïe ¥üŒTÆ¡URR +gX¹yÉ븹cQ¥îhÃßäóepiØŠµ—x2ÞeÂ+¶Õk³Í¥²ÄwžàN:0œ#‚t y<è:76ÏQ ÷²ñõGëùêù4 ¸K‹?eÀ˜˜¤â'âoÄoJà y=JSê­K¸ºz’Þjqºw-fn‡}@=yutbO^€Ȉ^Ût1ëÑ=\^6F«'›Xˆ¯/–.] OOO<ŠŽÆ¤ “ »€¾“–¬hlSÒ0 A©{?–¸£vèÐ`Ø,FஜèàáßPóuA…SpGß­æîd›1¶î¤§"/-Ö®^ ð£MŠKã6ŒK¬¢€;ª—@ÈÆãV2ï?qÝ ¯ªâü\¦jãU]þŒÊí`vhÙ G Ô!³+€*¢]èYÛ,5­¡RJ7kô;S-râáÂìÁú!Ýòi +«,À…Â7»Ba¬2%aAñýìÔwP A`B|ïN½8è1g­.ߌ"p——’À¼ ø#Ž.¢€¡1¢Ž¡DkóÅEŸjTR÷ï3þ}÷9ÈyÉq05³€µ§/[׍n®éÖùÏ^.C€;zÊ}†  Ôžä5œùàû^°ó«)?ÒÉ¥¥£5z™£ŒgÏ⺵˜<šMÛ¤t‹wfgâĨ ‰‡â4¾sc`bjÂÖ_ñpÞ¤øž›­[CôÌe àÎXß¡bÓÍÜÐjΗ°pht(±o˜â"öï[_.Q9˜Óó±Ÿéì¸ãÀÀU¸c01…ï‹}Qí•wÔJråç!õæEÄžøŽhKÒÓBÊwqáp•°u÷“ø©ÒŠ'öbžŒ{·p{÷JdD†!pÈTxwx•y ×OÁKH]™trSãÕ÷áÛµ,ܲèò&Þ`(pG|H+W¯dŠ£”8ˆÍ›·è½hºØy [ãôiA!ULßžX‡‹‘Šœ+æ2Kôkýêù6“ƒtÒ{Š‹‹úð<~Ù…”,UÎ/å:;9áë=_ƒÀ¦E‹ãè‘£z?ƒò †wT†¥¥%‚š5ÅÀѸIcÛ`a‰ažÞhnk¯ÒöÂ’bœLOÇ ±HP ·Ôö Ä··|¹Ö}6ú3„ݼ©·]ÜÝÝ‘ž‘n0TŸÊÉ󎼟\ƒÚË.éý䦟xá?<üëµ zÆÊëqÇ–.s ø÷¿n¯3i"@’[ ×&í*¸£zÉÓ¿F¯àݱ§°-¶‰Öޤ«§™Nfd˜B7VpGxu| >zÃŽ$sØ<½ÚÆ¡1ÖP±üÊÜQ{ƒP½Ç;lM”^Ð5]TÕ) µÃúÃŒ-=" ¨†w+ÛUîè›ÂÁëÔ)LFþaž–¬óÆÑPàŽê"°«y‹fÈÊÌÆõëê•/u}Êgj"ƒ…=‡Eä梸D8‰Q—\í<ááè [K—#37 “#—¡OµÕeÏŸÁôi‚JçÓL›6m@í:u0üãለÔþ,m§³© µ­­á 3CQI RŠ ž“ƒì²89Ô<ìÄIñÒKÝpýÚuŒ§Jÿ4í£kÝ´9¡€Ò©i~fÛPHCt-ëi棹mЖÎnÌ[…ÚŸySç9þ4Ûn̺É6>°vó†ÌÊŠÔ’÷rFTx¹Å‡tm'ù´Ð;ÄÆÓ¯<3Aav²cï³ÿtŒB×µ:µù¨ äQeåî â)3•ÉP˜“Ü„GÈxx·ÌCŸrU^n6•1ÕMZ/Ä0{1\—@â$RæœÍBïyS,]ØØ$>Ų6ÌfRSìýaåâÉ€#Ùq÷Ù·‡”> ÂêWS0]æ -“±«´‰5¦ª³¦gyž×Pz6ç e­C¶Õë0>NJ·¿^…è–9 ¤ÀBÞÌ´&³PÍG‘evÊ•…ÆZØ92¯òä£ore¶2Ç3€óík‚€S™9òÓ’YXz‘ªéÆ(ã¹î S˜Û;ÀD&Ì7zhón%n\Ÿ0·ub!åtàCÞÏâø®5Tf&D½•r¼ÓA—6.ãçzlàÀîØž€»cÿ“ äæääô¼Oü²žÏÆÆòlsæÎa‚‡ý„6–uûsyÝÏÏÛ¿ØSSS–EÞS$ø}’ݨQ#¬Z½<À!CŸdÕòº¼½¼°ãË ðÝqã&T¸ÂäSyH^)···€Ž¨ÿñlx¶íÆBÏÏ|_Ç»x6nÊiºN„OçÞ ˆ“Sãúét𡸫œOÇ[Å-À-À-ðìY€w¸{î€;é4¼yüɳ73Ÿr‹ë׫‡µë•7iªÊÀÙaä§#Ñ·o?~óç ?O:‘HƲ˯ܜÙsqê”"¿ß“jÏø ãñòËÝqòäIÌS6ßâ“j¯‡[€[€[ ",@" Êjµb=.h½à˜YY!ê—݈<°­"šÀËäx" / Ö v B)z(Óràî‰t¯„[€[ ŠZ€w¸cCÿyð¸›1c:ÌÌ2v1ÅÇÆW¨òÝóºnøúúbØÇªž\gÏœÃo¿ýö¼>v™Ïekk‹±ã>q=­_·ÉÉՇ˼Ùúôí>øöööعs'ö~ûJÕ¿k++ŒŸ8žÙaóæ­ˆÓ.î¡ ünnnÊeÆŸ bñçÿEZøä&'°⻫ýÖ(X{ú1¡›™ªå·«\OÃ[Ã- h;ÿzŒ{ÑÚÃÄ¥É„Ñ p~Ö`)[8pÇG···@ÅY€w¸{n€»Š›&¼dnÊa•+WÀÍÝ›7m™3g+G£x+¸¸¸ª€”ã•™D1®­ŸŠôÛWª€5ø#>oh2a5\´”?qs…³Z'n;ñ&Ü=o£‚?··@e²î8pÇ»Ê4#y[¸´XÀÅÕ©))®èÈ;[€[€[€[@ÑNõ[À£õ‹p¨ÇD?H9°07¹‰ÑH¾vþüiIÜlÜϤꚇšPR‡ì¸‡ˆþïNjÎÒ‡­9`\·C^j®­z6«žÉÎãæà¨àÀî8pW%¦:HnnnnnncY€ÔOËRæ4V]¼nnnnnnªmÜqàŽwU{ àOÏ-À-À-À-À-À-À-À-À-À-À-À-À-À-PI-À;Üqà®’NNÞ,nnnnnnnnnnnnnnªmÜqàŽwU{ àOÏ-À-À-À-À-À-À-À-À-À-À-À-À-À-PI-À;Üqà®’NNÞ,nnnnnnnnnnnnnnªmÜqàŽwU{ àOÏ-À-À-À-À-À-À-À-À-À-À-À-À-À-PI-À;Üqà®’NNÞ,nnnnnnnnnnnnnnªmÜqàŽwU{ àOÏ-À-À-À-À-À-À-À-À-À-À-À-À-À-PI-À;Üqà®NNs'7ØûÕBII Ò¯¢8?·¶²bšdbfçzÍYá™Ñ‘ÈOŽ×»"3;G8ø×S{_ú½›(ÌLÓ»L~···€Á0•ÁÖ'æöN0•ÉX1y©IÈzxÇà"ùÜOÃ掮°¯V›U~ÅyUçûäiØ›×É-À-À-À-À-@àÀî8pW ×ÿ~Á¿× Ö²++Ç#%ô\%leÅ4ÉÂÙÁ+°ÂoíZ˜£‡ô®È¥Q4·Bí}——EjXˆÞeV¦¬Ü}Ÿž‚⼜ÊÔ,Þ–çÁ¦2ØxWCö£{ÏÃÓTŠgð}é ¶ž›Û9*´'þì?¸±uΓi#ïW£ÚÙÂÅ®MÚ±2ãNýŽâü<£–_™ óhÛ >žÉšxvÚ{ȉªÌÍÕ«mU¹_õ2ÏÌ-À-À-À-ðÄ-À;ܱAçáåýįP³úEž² WWM@òõ³UÆ\Æîl«×ŸÁr›Ñ†Ù©Nö÷³ ÜYyø¡ö›ŸÂµi0ÎM{9ñªÌ¸àZñðí6Õ_y )·.ãæöù_a¨Á«CÔ2=iQA>rã£Q\TÀþN¾v‘û·T¸x¿ßÄÒáSŸ÷A~z²ñ+©¤%>ÏÀ]Uî×J:Üx³¸¸¸¸J-À;Üqà®.¾]û£zÏa‚\[?a•°•Ó$cwÊ-s l†f“×=óÀWû¨÷‘œòî*fVÙRÛ,ûÖn^ˆ=ý'îŒ4 ZÎÛ;¿dEßÃåe£Qžj¤’u/†÷«î¶Ò5gUx8p§ë(áù¸¸¸¸¸ŒgÜqàŽwÆ›O¼$#X€wšÈ;# 0^„F p€Ç¸ƒCfiŽ›ÿd…FØŽû¿ì2n:–ÆûUGCé‘wÏg¨lUîW=†?ÏÊ-À-À-À-ð,À;Üqàî)L<^¥f pàŽw|~< p€Ç¸v'¾¬àûY¡7¿Z†Øc?·Kãýª£¡ôÈV•îq§Ç@áY¹¸¸¸¸ŒdÜqàî™îdÖ¶pª×öþuaåê S3 d¦";î>’¯œÖ9œÐÔÒîÍ;ÁÞ¿,]€’äg¤";& É¡ç‘ÿ°ÌiG5·æaç[f6ö()*D^J2ÜAòõsZÕLmýjD”SúÝkz‡WÙÔ‡{‹.°rñ@an&Òn_EÂ…ÿPR‡:MajfެèH¤%)TçT¿9dV¶È~Áìfje϶/ÁÞ?2 kä&F³0ºœ˜2Ȩefp¬Ýˆýgí Šr²“‹”ÐóȈ¸¡Ñ–ê€;‡ºMYßX:º"?3•‘tåPR\fŸP†r‡ÊÊÌàܰœƒ`éâŽâÂBfŸÄ‹ÿU(‰¿µ‡/l|kÊŸ‘Ôvý^zƒýMÂùiмJE¹9Z…7JLLàÚ°5¨Ÿé9JŠŠ‘—‹¤+g~÷ºN¶44y95hÉnO¹qž):Õo · `X8¸0±äÐsHºz&eTBcĹ~KØU¯U:WMP‘‚Œ{·tíŒNªÁÔŸ¦VLÕ37!†ÕHsƒç­ÜòR“‘vû2Rn„ ¤Pà2SNT¹2"ÃØ|ó}±Ìlí‘zëbކII ÜÛt…kã¶(),BÜÙ¿ËT±r÷†kP{ØÒÚceËÖ.R¤Nº|B#q¾KÓv015“7/ðÃI°ppBêÍËxð×÷*íθwù) Z{‡Öj7µÇÔÌ yÉ líK »PæÐ1FŸ”Y‰Žˆ'Ó-¨ƒð2sÆa–zó_(*T[ŠÌÆž1YØ;#pÐDöçð1!MìÝp年-Ò=[yû•”oj7fÒ»+/Q˜š’C­†0wpAIq!{çŠÉÒÍvÕj³ñGK¤îÑêE8Öm™¥ rcrY÷Ãuz8™Üš¶‡}­†°°sDan2ï‡#1ä¿'Î1gpWî÷«Ì .õ[0[eÅD!/)V­Ýë5ƒÌÌ‚}{d=Šç±ö®¯êl½ËMŽƒßK`ãY Y1÷ðèï}ìm_³ˆ—‘Ö”›´ýÂÖ#iRîÁ½Eg8Õ ‚™•r“âØ»‘Ö7]Ryú•ÖpZ7(Ñüb‚M¦2¸·ì ÇZ`n”x¤GÜ@â¥@q‘Ö&Ò¯º<#ÏÃ-À-À-À-À-P^ pàŽwl =«âµßŸú2 J]*).fžá{Ö2ÐJS¢N½ÁSaáà¬1ÏÝýÛðàðn׫÷úþ½ÁTöx#,Í\\Tˆ++Æ"íÖeµeÔ~w,üºöW¹¦—8…‰)ê¾?>]ú¨”“yÿ6®¬™Œv˾göº¹cbOþ¦OäcŠúe7/GãÑ‹aá誇žãöÿ–!ö„â½b&ú¨¯óîç0·µ×h+(¾X¤vã!în½ ´‘~E¥¬ŒÈ›¸¶q:ò“ãË\ËÜ9ÕoÀ&ÀÚÓO¥ž’’a|í^Å@Zc'¿—ßFí7Gê\lvü#œ›ò–Úü$lÑhä\ØU¯«özÒõsÛ6O'ÐKçI2Z{Õ@›E_³_..ß.}áÙ¶›JQi·¯àúÆ(ÈPå#à±Å´-p¨Õ@cŠr³±ý#x:iJ¢Rľ-xø÷>4>nAíU²ç¥&âô¸~ ¿Ûø ñ˜%°V´‹s¢që«¥H »¨RfÐÔL,%úØÏ È0³¶•ç¹ÿû· Ô”Š«ÐÅÐM³rD¥,S KÔzk|:ö‚‰L¦r=717¾X€ôÛWT®uØü'Ì,­uîÎÛæ#þŒú©œ¤©7x2œKåë©á×pcó,ä§&VHŸèüed4µ´bïÖ/ªÍ™{du€-flÕ¹)¥*[Þ~¥C¬à5‡ØØˆ;û¶ÎÓøLƯú‘щ—Oâúº)ò¼Þ]ú°µ“D9ˆ“³ñgKa_½ŽJYþ=ˆÛ߬Vˆ¤}»¾Ž€~Cafc§ra^"~ØŒèêlûòf4à)ïûÕÌÎÖýš¾gýýƒÚÇh·ú,]sâ7ÜÚ¹HžG½¢ƒH:œ´ó«%¿–~÷îÚ‰FŸ-Qø†!ÀùÎ7«ê‘w—–Ža‚It¸§œbOý[_.Ñún,o¿ÒºCß4”.,øé)h2n%l¼ª©´§¬±L7Ò¯åKü~nnnnn],À;ܱqò¬wâ8?- ©·®"'þ> óò`éìÇZ a_C)È‹çÚšIjç ­æî„©¹ ss‘xé²££P\X+w8Ôn‡€ú  uÄ÷›Ô–áÙáUÔ2•]£~Â…c(%3ƒ»óp¢MþÕµ“<¤…Ñ)·KÃ6ì'3{G¸”z'éÜd‚} IDATI§è”hÞpá( ²2àX³!\ƒ‚‘‡šõÙumÀ]Ò•Ó°ó„©L†Ä‹ÇQ•Î>ÌÅMyQ~ÎM{yÉq*ö7´™"†¼– ³3@^6>ì¹LLM‘“‹‹ó‡©4Rà.;öû§ÍrÂ…ã(.ÈyÑÉ>%ú=dÎEbã î\›uDÃsÐY\Ïú•<eVpiÔZ¾Y‰?÷/nl™­Ëš«Wç&íàÙæ1¸Ecˆ¼)%\:ò°“&šêƨ¹ƒZÎù–Nn,{JØE¤Þº S3\·“Ï“ŒwpqþÇ=Åôj¼Rf)p—ùð.Û4a?/škÎ [Ê•iœ^\4BÕ;ÂT†._e%Ó½éwB‘›ϼc­\<áÒ¨,]<Øõ»?lƃßöhl²Ü=øó;X:{À£Õ lþgD†¢ # æöŽÌûÄÄT†ãŸtU(‡<ƒ&® 'yú‘÷£ÌÒ ä%éÚ¤-dV6 °¸²rœ h&®[lmº| i‘7@ü…6¾ `œye>‡ï‹ýÙ3ÑÆúâÂOÚA IЄÕp¬Û´Ô&‘ ¹[ÉŒ]Î6À÷ÛÃ<%¤I ÜÑïäźq†Â©}ÞƒÐwˆÖvHË4¸³prCë»™‡ WVWÙ¨Wïùjö&ôÓºÉH¾|ªÌ¾-OCÅ)?šïö=XÕá߬ƣÈ›Ac³ö[£Q­û@ÁžD¢/î¨ ݦ–4ì0àõOPãµ÷X;ÈÛRÔ01Eýa3pÿ×=,ÄU9‘÷yõÀL¶Óãû£0+]­ÉEˆÀ_ {täGöçfËóS¨xµ—ßBÔ¡ ePh 8ÿ=ˆ5d–®^h1c ²¹àc…ûEàŽ€¬³SßfžFRo­”°K¸²| »Ç­yg4µ€­OÇG¾¬à9Lë_õWÞfùÈK6âàv¯%KOM^kwo.^˜7Tëð3„ ÆO‹Ûذ¡g"éÊI…zÈkµÉØå ðÇ^ÜýNXÛ”Syú¤<óJ¼—Oê T›ãÎü° Ƨ{Ë.Ì3“ÖX®®«µZ)¨p󫥈=&xK=édH¿Òo>} k*…åÇ=¤¶Ù?[×¦í—–Ìæ›4Q ÜÑÍw¾Û„‡|ûx~±ùº Îõ›3œa”ßä ßä³eìò#o\é%à¹Ñˆùì`Š€÷³“²°ùŠNúoéæÅªÉ޹_f&å;ú·!ïWcw§'`‡‹þ·_û3óú%oåScû¢(/TWû5?±±~yùX…P})pGϱ+)Q™F/†kcá òÒâOYؾ4«_¥sŒÖrúN»CÞˆÿR\ ݈J Ñk÷Ä6¤_+z¬ñò¹¸¸¸¸È¸ãÀ› Ï*pWÖ4¦ú~ƒÌÜ‚m²ï|½Jå–¦ײ4‡ÌTV‘*×)|¯Ë¶#,Líá_ûpçÛµz—¡|ƒ!À]ÝA“àÓ©Ûö®ZN>©§OYÀÝŅÑ~7T¡iô¬Á†ãàÌ<…®­›lгM^ÇNù³ÝÃù™°*&)pG§ý§' Táâ£v´Yø5\rbØfM[2¸«%³(ÄY™ŸŠê#Т՜,ü4éÚÙ2Oó 2–ä&C€;3[¯:ÈÔµxy>âwj6iû[Sx)]Á ö"<ûnl£w]Únðï3Dîzòó^ Ï*ÎC⋼¹}>+†6»·ýËþ}ïç¯pïàöoòf#›P¢pCâV¤DÜMmWìckõ—–ŽVË H^£G árJ¦_Ò€‡C€»¶+ö³¡´ˆP\Z0\mu¾/½:o À6à.79g$öÒÂ[ ×F­ :©¬Úïƒß‹ý@á´'FtWh«¸#±‚«+Ç«}–€þÃP£çìÚ™)ok1¸ ^ý#ó˜ÒfOª[ôº#0êø¨‰ëõéMy îD-Öç;iä&”z§žŸù¡©¹1Ú.°¤å×zóSæåFé䨾* mYm¡lò ¡¤ìá#½W‰ˆ§±Ü„貊Öëº{ËÐp¤BBž¼¸Sì°ñwæùr{Ϲg·wÜ ðIJ7)(¢Õ+WfÆî§°MM^²âƒÜ5ød<Úte'G½Ê¼uÔ%éšvqÑH¤ß¹¦’­¢ûD[ÀÝaýa–%æäo¸µã17˜ô>"Âo:^8 ÿfV.Åg¸óí6uÞ°õñg÷ÒQ¡ )p§Î‹CÌ,F(|*ñÂÛ¢/pG\Um—~ÇÊc܆ûJ çM¿¹w‰ XøÜdzØïg& dJ‰• îjô‚€>ƒY“ÎϤ1T›¸¢}º€åÓ&B`è³I7k÷}ɈÐÕ%Ïv/³pXJÄG Âʉ<.‰ëÂù¬Ý¼ŸLK{ÅÄ-º°["}©æ*–% Ë”‚ú< ¸6n»uÙ;)/ÃT(EE…Q"pO»uI^´Ü)ïà5?3U×[_-G̱ŸX~âŒê´å/öoòªÅmDϯ’¢"œø¬ sCéøT£­æ~É”oµñMÑ=†wâ­wŽžQÍ<1wpFð !L-lçbÄøUÅÔÆè}úOšWºFHSåò¤àI̱_˜‰¦ô¬w´n·[uyuª£5)"è½yy©ê»U Ü]Z6i7Ï©ÍMw§×˜·øñ‘Ý圥^_C½Á‚Ø£"¸zVãø"A$ŸÎ½™¢é™‰‚òveK"pgèûÕXÀ²eƒáóàÑú!’æ¥!ð‘?îDÔO_ÊÍ)î®®žˆdRZV“Ä:ºtbLO¹ð‘1ûU:Ç¢Âí]+*[·óöp p p p p ŸãÀHÏ*p'(Na¡®e%å01?…¨5›¼AA©’6ÙёȌºÍ€:‰.),ÐX…û4Ÿº‰mºÅD|;D.Ož6äa”v¡¬&ʯë ÜQým DüÊÙÒJI ³õ|—NpG¡ë®'å$zØÐéöÙI‚†4Ïq¦ywêÅøqÊJG?ꬖ)î´)ç9ÔiŠæS7°âoýo9bþ€uI_àNZvYí—^™;™Q·ô¹E¯¼†wRµbéæI¹b‡ZÐ|ºêþíZ<úkŸ^m++³¸ÓÎäÜ % tcÛ<ÄŸ@+1‘ÐKÝ'ÉIíµÕ+ 9UÎ'‚DDm­záme35ÄþÃa5忼üs…ù/ˆD5Hih…ûwÞú+ZZNÓ‰k4*¸jj‡6OGºÇà®Óö#•´5µC“÷Uyû¤¬1¨í:ð G aË¡›f"!DAQ—:mû—ñõ%\<†Ð Ó5æ{Ö;z°úÏfêÏ$|sjüëòÃ(»h9[‹&…ð¸Sª*ãRàN[X±Ô{úÔ¸~råaRj¯ÙO;/£²ñ À&.ÈʘDàÎÐ÷«±€;e/rñ. Ý'û5›±…‰Ë(¯£RàŽÂdÕñÓýÒþ#úQÌŘý*cw¿ß„¿?æP¬Œc€·‰[€[€[€[€[ÀP pàŽwlì<‹ÀÌÆäIBŠaî–|õ ’oœC^rŠ óås¢Ö€ ¯Ô𫸼XVPI¦2ø½4ží^b¡!ʉx\hƒ¦-œŽ>ªý{}·æX›”Sü¹#,TQ—P\};Ïh=7«R[8œµWuÆ'D©¢€;1ì†ê œøóÿ!'á¡‚£W»W˜×¥£C»(x&J;m*ö5ë3R|JeMúwÎ [£éø•¬l`Q,(}–•.¯«YV~}¯ܑ¤w§ž¬ªc#_V v—Ö/݈—¥Èªo»)¿¸ÓäqEùƒÐl² .©Ì­DàbФµÌ{“B“‰›Ž6¡©()í#™Nœk"Hd¿T¤…ÂÀâÎüUªžœ‰³¶ÛU«#.Q&w7¸{L/òR‘—ó¶Ó!%ß8›ïPuI_àNÊËG|”ôŸ.‰ýýƒJÖòô‰.õjË##®­¢"°!½·ã¦?˜—gÒµ3¸¶z¢ÆbŸàŽ€ò ‰o«T]u"…]4P÷^“wÚ¼‘¥bCRG©X ÕCêÑe%Rr>=¶OYÙžÊõg¸Sæ®”Îu!Ô¢q«õxôýEéü¬ÁrA!cö«tŽq~»§2¬y¥ÜÜÜÜOȸãÀjÏ"pçßï#ø÷Ä@»ë¦#éÒqµÓ¦e©x€VàNr'n@àܸ+"lÔÐõÝàN :µqÆ9ÔmŠæS„þÒ˜Úv)p§Ì¥q[¦@J)tËl$œ(5›²Žu›"?=PËk(³¶EÇ¿ óM‹X‚¡ ‘©¥5‚Wÿ3++FæN¡bêxݤ¢ Ü5»‚©6’2í¹)'`y“¾ÀÕ×qËßYX¢¬°Q]ÚfhŸèRvYy¤"¡[ç á¬à娜:êòÅÌ›˜cnlÑ „>À=/‰£Øxø"þÂQÜØ8“QQP-QP<:ú#Âw ‡ÊI ÜiãÍ xcj¼ú»ýäg½åª°Õ_}5ßøZOïü”„²º±R_RÀ]ðšŸ`áà¬" Ð(jôüP…·µ,;mÀ]Èü‘I´ j’T G ܳ_9pW©‡·ø,äqyjlo¤§j\Om«×A«9‚‚®t­~ÍýÉÓòÒBõ*½OzwoÓ ?€×ós† ë~x™MzAj •†Ôžšð:ò“ãË,[Ÿ R;mJ½MƒwûÒÍÞ¨òÐ^)`r{×JDýQmõÕ^{µ^ÿ˜]{ðÇ^Üýn£Ú|†‚DR€SßdüJ¸4l-¬D¬ù”¼Æî¤ ü••ã‘zNŸîP›·õ¢o`ãU‰—Nàúú©:•WçƒñðíÒ—…”ŸžÐEÙ:ݧ.“¡}bp…’‰›³Ã†ßà¡-V&¶}âNÿ¡±úÊÜÒ¯Ò‡"/ô¶+÷3.C¢%p®ß’©…Ä…Ù‚ðº$¶]ö¬Ü¼˜ ÓÅùÂÜ¥dîèÊÞô™uøkDî/ 2F‡?…2Ê ÜÁT†ÎÛöøu"÷ œ¤ÒdëW­æ O¸Ó^·^´6^ÕõèÎÏ|¿Búµ²wþþÈÊÉA|\ÜSi¼JnnnnçѸãÀ×Ï"p×bÖ°÷DvLó„Sa%åÉ  «åîšBÊ(짤H3‡™t£®ÖcɤT€¡Dà¶R—D@‹< Ž}ÒµÌp["¤§p?ÚD–¥)ÖçÕ©'ê šÌþŒØ·÷¸ìÄD€màÌ,­ÙOÜÕzóST{YÛ;9® RUÌ!å3¢‹Ê!PRàŽ®SxrúÝP…rˆß°Ý²ïø§ItDzóÖÚð; YŽ9þ+n}¹¸Ìõܯû›¨ýÖ(–/tË$œS:'dnïĸÖ*2Iù¦Â¾Xˆ¸SBH¨¶$ k#%àsÓßSuÍíÑvé^ÆÛ•yæ+«X½¯K;º9dÞ0>@²!©ùR;’CÏáêÊñòzL­lØœ %[“z Ýßjþn¹HŒ¶ðMCA"— `4#(‰j ©¤0nâ+}½¨€ÅÆîhh»|óä%€›<’Šóó4ö …ø–¡D ]ÐäõL —ÖJâÓ…À¶F]´š-x?j ›ÔežÚ'zF 7ˆüœ$Nt~ö dGßSÈIï”Ó¶0Ooâ󣵫03Mcõ•¸3¤_•ªá¨…poÞ 9qaéæ%€x߬ƣh|~)pGâg¦¼¥rh%õ`Uçé(ö qÜÑš‘÷@sw›˜²wBaVº±†„QË)7p uiز2È)6TÒéï'ÜmÁ™Éߨn)•…:‘ cõkeîæÌàà`Fã²ã‹øþ{U>O£,^····@•°î8pÇú³ÜIyq¢~ÙH + ±1³u@wÇ25<úà7³¶EQ~Ž ï¦²%’÷´ð«ˆ;û7S‘•nV‰ë¬áð¹Ì€…¹Žï¯ÖI¶#o„ i›}äBŽ /)V¾xÐFÏ«mwšÄõI6tã —ŸÎ‡G‹.(.*Äݽë™gaa) =ÒCl”™¡ÕÜ,l6ž?î@챟™y~0–ÎnrO·Šî¤›0òZ!ùÆVf†jÝ2Î""Ó§>¡¤ Ì)w6][7Ù„M4õmƒásàÒ°û[Ù›I“qÅ…{ÝÙ³ñ!GäÜdêìI8Ígl‡_ £Ùè#ÀâSsmÚ>{"'!·v– êÔù2xÕ~õ!Mv!5ÇŒˆP­À3%õB#%Ì›;£(;“ÕBönøé|¦HéúæYH<¤<ÍT{¯2pGÀÕµS+„žèÖpä<86c+‡—Òobx<õGèæÙ ¼–’^ÿãYL\†Æ¸~×V=ÿ¤ 3$¢ñ×nåÆëFÊÊ×ÖLTx\š´Cý¡3H,Žñˆý[qÿð×òêÜQaží^FýaÂzBž¡á»V((<U€]õ:ðlÓ©<‡Ìýy‰1ûV ¥£ ÷ÛÃu£Mw§×X¹1'~Eä¾­ÈOO–×Cà±S½f Po‡€ú8;õmµm0´OŒ5Xj7F³©àš}×7ÌOò®ýÎøtêŪ{ôïA„½JkÕ•¸3´_¥÷öî;.êòø޽AöFHTܸͫ\iCKÓL+5-ÍÑ0ÍÜ–MGVVf™Ù¯iå¹÷ÞA@ö:àà÷zž“óN8ô@Ž>ß¿âîù>Ïó}ß÷9âãó|q_7xm¾æ%ñût÷ø¾šï}ÚÁx_ìj|æËP‰&ä.a¨ÿÚ|X»zÈßSûßz¦Øýfë„È©_Êpáß¹å ñØ.˜imT!fãz4ëߎ}qmÍrÄí*¾Ã­±î‘û©ÇÁ]­ç&À·ƒzó ñÈ€+|­¶PXÀÿ‘'úÄK2 ÿ¿QÁè‡ü]ÿÅ M`*V 4xu¾üÿ&ñ]¼÷­g‹ý#ž±>תÜÕ­[rçñyyyèÝ«T*ÕýÜ:<— (w îä00ÅàNìâÚtÚ2Í®"XᎹ¥%‚jAai…ä3‡`« ­Ä±÷ÍgŠý‹}Ñ’Hñ~nzŠ|†*?6n^r™‡8DvjñT$Ù^ìkCw­?þCóºprcafn&—Y9×ïÉêÏz©Ôiµ+·ñðEä;_ÂÒÁ©X› GvàÔgo{]„bv…xhøÝ‡ŦE܉6Åb5´’Íç+³‘sJ¥ü#M\‹2%§—¾‡Æ“?•eÎ}û>b·ÿ©é®vp'fŠpB™×/@•›+ëÁ•8 ='ÊŠà(ò¥š0EÛ§¤Em=ýPüù`vqˆç‰eÞ¸"wP³ÔÄç+ž¹&û²s-Î}=»˜»±_Ðþ#\Þ›bWÑ<õL«ìøýK×òS\GFô%˜›+`&gÏÈkØþÎ}«žMfìC;¸K1Ý?,ûžqý¢ Fåçje-›Þò.ê EĦ- '~,g¢ŠCÌ ;=[:¹ÂÁ?T.Wÿø6ž~ðnÕUÞk{Æ?®÷Rî'$ è1¡OªŸ(¾2n\A^Z2l½`ëî-ÃöOBíç߀µ›'nîÛˆ3KÕÏꇱ‚;Q—öàå= eÒM˜[XÁÖË–Κv÷LzªÔàÎÒÅÍÞýF3cQÞóy¹2ǹoæêlRT±µDø[£~KµIA2oDÉÐÞÂÎN޽¢ÏV„û&=iôÏÄX÷kPŸaé£^þ)f̈ûSŒÿššïŽô¨ó82oL‰;4õ¥ªw÷ú¹ê˜š™£åû?ÃÆÍS¾lÈnÌÚÁ]јKª3£/ÊgVYá|Zl¢µvÛn [¡îËÓ5=ô! IDAT³Ååïé›Ñ(,,€«§ ˆŠ}¿×ŒuoÜo=ÆîÄXÿ@'‚9qˆÿ¯P¦&¶†·üG9¸»Õo!m+#¸mˆçØýNQXZÂ>à!ÍlcñK7wëRñ¹Vµà®AÆøà­€[¥’ÁðxP€ îG€Áƒ;yÿ˜bp'úmãáƒÚÏ¿%Ÿí¦}ˆåÞü®þþ•œQ$–UŠCß³±Äl$ïV]äL5}‡X’"v7M=wTïûâV1»¯FƒšN» øÃ>ñèNˆ‡I—6ÛE_åâ_¥ÃŒkÝHM¸"Ê•܉÷ÄõЉ»G¶“èˆ?ŠÒ.ŸÆåÿ-•AFË9+eSú–ã 93eàx?ü¨NŸ…CÂѸ¸â#9§¤gjw‡f¾$ÿ(«5h¼N!f{\_ÿ#®þþH þ´÷«‰Ð¯ÈÙ?Ea•8¹´?BÅ « ^ÏÁ§mO½¡Ÿø#òÖñ=rNI»ëÜA z·} ¾ízÃA„n·ÿ€§–¶Ã¨XZÜ{üé¯ >‹š× f„‰€ Yi`7uŠiwâkÑPØÀWuLÅQÿ|/7•ОQ£]‘K¦¨5d‚&L-zO™Ë¿~)—{µî:ÃÕÁvIÏ¡»ŸàNÔ+6Ÿé;L3ƒµ¨âYšçW,@ú•3ö&|~TÎKÇ‹®É˜ÁhW<‡3¸ï pªY§ØG#ÆúÕ³rÆnÌæ_ô>ûRû$ñÔëy¸ÕkkwúJ}>¤™9ü:õE@÷g4ÿ˜¢óœ«DÊÙÈ۹VÎLÖwÜïgr/÷¥¾s¼î~/»~±\Φ×þ]$¾óίü¤ÌÙÛ÷û¹VµàN¡P`ÁG P·Žú»ø·_Ã’%ŸßÏmÃs)@ P€R€Áƒ;y#˜jpW4Žm¼à3 KùG²x&š˜UžCì$jï+g7˜+ÈËHCFÌår…mb–œo,í]d $*1;£´ç ÒG±ÔLÌ0,šÝ%þ€,«N±LN̶Ë’ŠžáçX³"§|¡þÃëƒqH>}Ðæï©Œðt ‰€…½#ò2R‘qõœÎò¹òT*B'—Z å²d±t/åÂñbÏÔ)W}–rÉ­Æ3WYös‘Ìò™Šb&¦˜ñ—Ÿ…¬›×ä’º’B¦òôé^ÊŠÏX>³P¡§‹pT{£}uŠ%ÀŽ!uå²i13J,íN»rV³Ìü^úaÈ9wwb9›˜uãÖVN®òsKÖUZ•”X¯™¹ü,l½üål°œDq g*ýs!µSh„\ê§ÊÉ–÷BÑÒ_CLŒ]F̬Kc­œ¥‹ê3£/—ù]Qb?ê™rfê8W„Å–èë9YÌü³-íälP1Yô£´gðÛâ~ë9p ——¹Bü^I’ËÒ º?ï·ñŠ>ÿ?×zcæÈ™²âwìî×û—ù¡ÜÍö÷¨Spm(ll¡¼u©O–ë_ijE@-~ˆß‹¹©Èй¢óˆŠŠæ« õ‹ï1YüÿŠ˜í+6ü1$L®¨¾‹GˆGrˆGäܺ©Þ½üöL]CÚ¬NŸ«¥¥%šD6FfFNžÔ¿‹»!&,C P€Ð`pÇàNÞ¦ÜqX&àÓ¾7‡L”…w½Ö«ÔX «‘¥(`˜€¾àΰ3YŠxÐâ9r-æ­’³ÝJÛ!V»Ÿú‚»}lŸ (@ ˜¢ƒ;w îLqä–Ðg±yAÁí ,Š1W ò/àTKÎr82{d5ºr^JU`pWÕ?!ö% m@"fõŠÍEÄ,ʲwe ñ} P€ (`˜ƒ;w î +&Q*ðÑgáѬnîÙ —ÁfÇ‹xÂ! T>‡Æ-¢¹üùø‚ñºLÖ$°ØÉJ`pW©ÜlŒ÷% °s;M‹%­nõ[Á§í£²>±aÐÙ¯fT7ƒ;ƒ˜Xˆ (@ ”)ÀàŽÁƒ»2‡‰éÁ]Í'^.±Ã"´»øãgˆÙô³é\{Z-ÜU‹‘ñÏOküæ"«Ïp<2gtÙϽ}ƒ»ÿÈÍÂˤ(@ P ÂÜ1¸cpWáìòመáñß–ŽÎrIejRÎAôæÿ!3ê|åuˆ-Qà¶€xȽ1óäOW~ý·Žî¤ (PEìBáïˆ-oŸ‘†¤Ó䎭em~£}9îÍ:"¸×óò¥cŽG^ÝíµŠ~ì(@ P€Ð0¸cpÇàŽ_ (@ P€ (@ P  0¸cpÇà® Lv‰ (@ P€ (@ 0¸cpÇàŽß (@ P€ (@ P  0¸cpÇà® Lv‰ (@ P€ (@ 0¸cpÇàŽß (@ P€ (@ P  0¸cpÇà® Lv‰ (@ P€ (@ 0¸cpÇàŽß (@ P€ (@ P  0¸cpÇà® Lv‰ (@ P€ (@ 0¸cpÇàŽß (@ P€ (@ P  0¸cpÇà® Lv‰ (@ P€ (@ 0¸cpÇாì¬P#T¶t-ñ"²s3*¡Õ;M¸;xÃÙ¾,–òÅ|U.Ýªë „xÕ‘åÞüa ò òÊ<ÇT ˜›™cÞ Õ²»Ž­ÆÆãêÿæA P€ (@ P€¨* îÜ1¸«„Ñø ‚;Og¼öèxÁÝØsà† ±Ç š]W Uª wUêã`g(@ P€ (@ P@ƒ;w î*á«áAw“û.„»£7_Ùw~R WiZM0¸3­Ï‹½¥(@ P€ (ð_`pÇàÎdƒ;s3ò©/ûŸƒä̽c8Ô+Bî¦šš™„¸Ôk:eæ¨íÛD¾&vYÍÉË„«½‡´…‡“/Äí›…ƒ—¶!S™Væw„h«Ž$œmk +7]Îv;uý ¼# ÞœÂÆÒuý#è^ 6NÈÉˤ+8qmÒsRJìƒh× Íûý[¾G[g\Š;…gþÖ9/¿ çnÕïå]6vÅÞ;}@aÙ·Ï¿™rMîÔjma+=ýkÔ„µ… neÜ”ab|jt™u‰þ5ÂPǯ Ü<¡0W %3 çoÅÅ›' :ßÃÉ‚ÛÀÝÉùù¹ˆNºŒÃ—·#O¥äæ ²(@ P€ (@ <(w îä½çéíó îÁ{n×ÞÚ ï>õµ<ÿß`çYÝpª¨âwžø N¶.8pqVïY¨Óžv_nš{w<Þ|,:å2²Sñåæ™¸‘|Eo­,l0¨íxÔñW‡€Ú‡ÎD߆t˜$_.mWÙ6á=Ð­ÑØZÙ«G™Ÿƒ­ÀîóëõöaöÀ•°´°2ȳ´]e_ïù¼]ŠÕó¦›S¿åį8½C;L†£­«N}ª‚|ü²w)\ÚZb]í=ñd둳õWâÏâûí"-;©Ä:º7ˆŽ}an~'Ð…“3ðíÖ¹×k<—»ÊtÛ°(@ P€ (@ T²ƒ;wò–cpìE†¶“»¯ž933s„yÕÓ„XqÉ×±`Í8Àì®QZŒèòjù4”oˆÙq§£¡…¨ë ¿5‘vCÎàGIÁÝcM£CDY&=;'¯íEJV"m\P/°… Åñë¾/±GOx÷T«Q3‹ŽˆÀæšnQñçt:›…ß|¥÷ëFôÃÅNÝ–§‹?|]ƒä—7¸;}X^»ÂLS×÷#+7Cþ\Äåå+1ÿÏW‘’™X¬îÞÕ}†&ð»{WâOCUX€ ÷Z¨í×XΆLLÃGM@n~N±::×Ý ¯§e%áXÔnd*3äsÿ"ü›ê|& î*ù7›£(@ P€ (@ƒÜ1¸S4œq']þ«w/Òìž*–ã>Ûvµ”ï/Z÷6®&è†`b¦(#õ¬¾EZKJÍЯÅ´ªÕU3 õwb)è°NoÉ2çcá»m@™Ÿ­9G,õ}®Ý¹ W™§Ä¼ßF!]™Zê ³ï¸9zÈe¡?îúÔ /„» u®×Ý”/—7¸çĦ\ÃÒ ïê,3nW§z5"ë\{d%¶œüU·ÙB`L¹ôC¾*+þý§cê” óª:¿-gFþ{úOüuè;÷År牽?‘3o$GaÉú©rtÑÑ8¸-žiûªægw÷t{ð$ P€ (@ P€¨`w îä-ÆàÈÌIÇœ__†R¥Ôv^Îþ˜ÐûcùšˆDP¤}¼Üe:B½#›‰Y¿¼¬¸‰r– +¼Ùo mœåiú‚»×/g£‰>|°æUdäžž£µ³¬G„Qÿþ[Oý^ê×CUî®} Q‰çïꧦ>ù•ô8}_o£ó~„3 í8Y¾¶ùÄÿ°îè*½×Ù»éóh[ç1éþÞÏÑ_§)×¥ÁSèÚð)ùóâõSål½»¡ß3ïÄÁஂÓ°z P€ (@ P€¸'w îäÃàN=Ûnծϊ¤B`ö3?ÀÒÂ;Ïüƒ?ªŸ«'1næ€r‰ê‘+;°²„Ý[ûµxQ3ëîîàNlž0©z××-'ÃÚ#?”8˜_|d*òi gå‰gò•v<èàN,õëËz»8¼ó„û6’³á>úëu2Ï><BÚ@<oÚª!łԢÂ!µ1ªûLùãÝ3!Gu›Ï:HÍJÂÌ_^ÔÛ‡†Ám0èöLIw÷ôûƒ'Q€ (@ P€ @ 0¸cp'o1wÀº#?bóÉ_ô¹©O.“3Ä\Ü‚Õ{kÊøºc\ÏäÏZOÿ¡÷üaà‰Vêëîà®YX'ˆçÓ‰CÌ>;sävê‡éݾEa3ôi> -ê"7W˜ýÛÈR¿tp'vÔýbÓ{zû(6òhÜZî0;÷·Ñ:eÞî÷¹|žßõÄ‹X¸N½|¸èÁ‚Úö6N˜Ò©|÷§Ý‹pPk£‹÷ž^.7øÏÙûzël½}pwôÁä¾ê –Á]ÿ¦aõ (@ P€ (pO îÜɇÁݽíLûw¼Øeª4üqç§8|e»ÞXׯ)žïô†|ïîàN{CG±2/SV .µøƒîN^ßåÛæëícѬº¤ôÌù]7€œûì*M6 1Ysp9¶ŸY#‹š›™cÞ Õò¿÷_ØŒŸ÷.Ñ[…µ…-f\!ßcpgˆ2ËP€ (@ P€ @e 0¸cp'ï9w÷Üio*±bûÚ£w ‡û4ÂðG¦è îz4zê?.ßËÉÍ’»Ñ–uä©ò0ãÃK-fŠÁ…¹%æ<û£¼®|UòT¹eQh‚·gÿ–ÿm­°ÆÌgÔËwŸ[‡ßöëß=W»-w1³(@ P€ (@ T²ƒ;wÕ>¸›öÄ28ØŠe®bÇ×…:CÌÞÚ ï>¥~fݾAQøs÷8|牯àdëR¬Žš^Ùuº,.v£= µ\S»Žz-0¤ÃDùÒÝ3î:FôÅ£MÉ÷fþòR³nåkÀƒ;qᳪŸ'XÚl¹R ùƒ–KŒ^Ú†Ÿvë~æEçÚZ9ཧ¿•?2¸3Ê-ÇJ(@ P€ (@ PÀÈ îÜÉ[ÊgÜÙXÚcÆ€å²ÿÚK%µÇˆÌ1û™•°PXTHpWÃÁ o<¾¨Ìð§mížèÝl¨Þà®AP+ n§Þ áîMîg¼#¸ëX¯müŒìÆ[+ŸEÞ];îêëßë=?‚·kîu©ì„^ÁË%À  8Jò)zNÞ¥¸Sø|ã4½Å|]C0®çûe~v÷óð\ P€ (@ P€ Àý0¸cpg²Áx–ÙÜg’3«¶žüÿù¾ØXðu ¸^ äë1ãN¬j³¶l­J 𷛀A-õwŽ6.xç‰/åul9ñÖ-yWÙò vcwm»£osõ’ÜÙ¿ŽBrf|™]¸ßà®h^ež³~}Ù¹™e¶yw¡&#" ”ù9x÷§ç‘_W¬Ž6á=зù îÊ­Ë(@ P€ (@ P ²Ü1¸3ÙàNt|rß…pwô–;~ºV½ùƒöQ‰×*$¸ðT«WÐ,¬ Tø`Í8$¤ÝÐ郫½&õù KùúÝKeÅkC;¾ÿ¦ÈÉËÆ'OBbzl‰ßb¡•²s3Jýž0Fpê]/wyW¶s÷έ%5~¿Á¯[MŒ{L½©Åžóðë¾/J½N±Ü9S™¦S¦iÍŽxºz·ÚŸ÷,Áþ‹›uÞ¡ï¸ÇÈ™âàRÙÊú•Ãv(@ P€ (@ P < îÜÉûÅ—ÊŠ~÷oñ"ZÖê*¯aãñŸeÂÜL¶uãŸEAa Í**¸óq Äk½ssn$_Å·[ç!93AöÉÙ®†¶Ÿ÷0͸ÔÜy:ûcì£samaƒôìdü²÷ œŠ>(¯¥èp±wGƒÀVhÞ ›ÿ‚ƒ—·–:ÖÜ Ç)ý?‡£­+Ò²S°z÷B\‰?‹‚B•l[¥R¡:ý¸ßàNTödË‘hþPgYï‹[±öÈHÏIÑ´£0·@¨W"C; °Fæý1F§– +Lìý \<ä†ßl›‡Ë7OÉ2â½Ç›@³°ŽšsÜ•ç×ËR€ (@ P€ @e 0¸cp'ï5S î<œü0¾çšÙléÙ©HÏI†˜åfkem§þ@-ßFðu ª°àNøu®×ÝT‡Yùˆ¹uUþ·_`ˆIl’Ð4´ƒ|M_p'^;Ô>Ûn¼ ïÄ‘™“†„ôXÀÅÎ]†PEÇO»UJp'ګ؃ڇ˜¥v÷¡oCcw– k<×þuÔök"›ák|JŒœYgke'_¹…8’Ò0ç÷‘Åú&f ïô¶æÞ¸™rY¹ðv ”÷†Ø8Ü· ¬-­9㮲~ã° P€ (@ P€(—ƒ;wò†1ÕàNô½®_S<Õzìmœ47nžÛϬÁúc?á…Žo¢¶“ îDíkuC÷ÆÏÈP¨èÏiÛx|5^ÚªÙ½¶¤àN~ÎþèÞhêú7•ßÝGbzN^Û‡gþFZvR©ƒÝ3¢¸6_×`6+*¸ˆ%Á­Ã»¢}Ý>:¡eQòò•›Oˆ|_Û£×BìúûdË—áîä£y¿°°‡.ÿ‹ßö‰1ÝçÊ岜qW®ß,L P€ (@ P€•$ÀàŽÁÉwâÄ ­šžuà`댌œTD%\@N^ù75¸ßq'–ä»×†“«œÝu5þ,rò²Ê]­•… Üà 6®P˜+‘“ŽøÔëš%¸å®ÐH'XYXCìæ{{Ø G™¥;ÍÞoó"Ðôpô•¡¨ØÙVl’›| yªÜ²«.„´¬áè…|U>b’.?pDz;Í (@ P€ (@€Áƒ»jÜq0S€ (@ P€ (@ê&ÀàŽÁƒ»ê6ªy= (@ P€ (@ T w îÜU‹¡Ì‹ (@ P€ (@ P º 0¸cpÇ஺j^(@ P€ (@ P€ÕB€Áƒ;wÕb(ó"(@ P€ (@ P€¨n îÜ1¸«n£š×C P€ (@ P€ @µ`pÇàŽÁ]µʼ P€ (@ P€ ª›ƒ;w îªÛ¨æõP€ (@ P€ (P-Ü1¸cpW-†2/‚ (@ P€ (@ê&ÀàŽÁƒ»ê6ªy= (@ P€ (@ T w îÜU‹¡Ì‹ (@ P€ (@ P º 0¸cpÇ஺j^(@ P€ (@ P€ÕB€Áƒ;wÕb(ó"(@ P€ (@ P€¨n îÜ1¸«n£š×C P€ (@ P€ @µ`pÇàŽÁ]ÊÞv¸•ªDV¶ªŠöÝ¢(@ P€ (@ P "Ü1¸cpW‘#ìêôµÇøáõѾ¹7úŒØˆk±™÷P O¡(@ P€ (@ PÀÔÜ1¸cpWÅFqŸGñÞøHÙ«^/l`pWÅ>v‡ (@ P€ (PY îÜ1¸«¬Ñf`; î „b1 P€ (@ P€ @5`pÇàŽÁ]ä îªØÂîP€ (@ P€ ƒ;w&Ü…7qEfz>¢/¤? ¡c¼f}ì䤩°EC ì*ž¹ð(“rtËÊÉǾ£ :¯5ލG+äæ©°ëP|©sr°Dd=wYæRTšÎRÜ6‘ž°²TàìåTÄÆg!$Àuô‡¿·=D»ÇÏ$aÃŽdå¶a†Ÿ·-Ú·ðÁCAN°·³DRj.ŽœNͽqP* «£¼ÒŽ.– W{Æ]ËÄ­X]?íúüÂàRÃZ¾táx2r³ ÊÛËS€ (@ P€ *L€Áƒ;ysyzûTØMV?6,í@Ìå Ø‹C[ã¡Ìª˜ ¨"ú¯]ç~ar3 Ck72ÐkøFâ£ÕÆKÏÔ‘¯õ~q#¢¢3J¬nèa7LÝÞÓc¶àì¥TMÙÍ?ô€»« >]~ YÙù˜8¢> sºbofbÂÜý8y.¥Ä6¬­˜8¢úu .v¾8IÔñÖ‚C8|ò–¡—mp9……FÍk„€ZŽHNÈÁÇc#;#¿Øù^Av» 1,­8¶3?Ì;kp,H P€ (@ P€¨ w îä}fjÁ]÷ÁÁèôT fŒäæäãØ®[8°>WϤUÆØ1Z7ó£ü5õùyÛ£Qòç­{nÈ™nÚ‡˜÷á²S:¯ùxÚ៯»ÂÜÜ Ë~:‡O—Ÿ.±¿.é,gø½”‚§ÇlÕ)WÜ]¸šŠ° '¤¤*±v{ n%ç <ÄÛøÈ .5=ÆnÅ›YÅÚ±²4dzڠñíY}—¯¥aû8¤eä!È×]ÚúÂÎÆ9Ê| ™°]'84ª›—5^ý¸ l,qrO"¾›­ëaieŽ16†w=ã²ñÉ«‡M6ø5–ë¡(@ P€ (@ª'ÀàŽÁIw@!j6pA³Î^¨×ÚÖ6 Í芋ÊÄþ ±8¼5YéÅgZU½a¨Û£{}ÆÝ’­Ñ:Ò ñ·²ÑmÈ:èYõQË+?î œ³ä(V­¹¢7¸/Š™}C'ü‹[)¹š2m›yá“©-ex·aG4&Î9PŒsü Ò¿–|]„ˆŸ}w……wŠy{Øâëym!Ê3’1àÕmò‘D´¬!oGȺ_z»ÿŠÕ´ÓotZv÷E~ž ‹&CÌÅ’g(VHçX)(@ P€ (@ PÀw îämbj3î´ïmksÔoë!C¼Í[y¹*œÜˆ}âpùÄå Œ‹Zä^ƒ».û⃷ZȾžº;Þ,voŽjˆ=kÊÙn]¯“³à´¢wâµ±Ówãß}Åë˜=1u „JU€.ƒ×ê{5\¬°öÛî°¶RàðÉ#BѦ·Ľ°ðõ£ˆ½š‰ú­Ý1÷rCh IDATøÍº²½?–^À.­@¯B:ÁJ)@ P€ (@ P€÷(ÀàŽÁ¼uL9¸Ó¾÷kxÛ ò/Dvô„«§­æ­Ä˜,ìÏÂÛr)U{Þ½w 3l\Ñn.ÖX¿=“æêΆ³´0æï{ÀÅÉÿl½Ž7ß?Xìk£(¸KËÈEûëµ×¾…>ÖZž;yþ~¬Û£©çÉGC0å•FòçQïì*q£ Ñ×?÷„­>[~ _ýtþ¿ÂJ?Mý¼»†¨å„øèL|7û FÏo(—О؀sÎTH»¬” (@ P€ (` w îªUp§f@X4}Ä õZÖ€•…|+õ–³†î3ÆØ©°:î5¸÷B†ö¯e®JΆKM¿3£N{FÞˆ7w`ÿ±Äƒ»C'0lòN½×èåa‹ Ë»Ë÷î~žÞ¬ ‘èÙI=¯ÃÀ™¯3ßÎìöä;1ìV/ì$w­]³9 S®0Où¼»OšÀÖÞyJ•ÜŒâV\6>æsí*ÌœS€ (@ P€ €qÜ1¸«žÁÝíñád‡6½üТ›z×Ü´ä\Ì|n¯qFOÕr?Á]¿þü¢‹ìÙœÅG±ê¯;ϰûtZK´oáƒë±™èùÂz½KX‹fÜ­û7“ç~¨WÌ–;´¦¯lã×uW0ýÓ£‰/æ´A‹†žå’ùw_,ÆN¯ØÏD{y,ŸkW®‡…)@ P€ (@ Pà 0¸cpWí‚;{gK4l禼àæ¨^iIJìù'›ºö‡\ÙMßOp'jÿfþÃhRϧ/$càíijç6|׿¥.M- îÊšwôï¾Cçï­×ðÖû‡4õ݇íѰ¶ ‘™¥ûü¼’®|ïÑxL˜­?$,[˰u›»aè;õdañ¼»EŽâÆ•LÃNf) P€ (@ P€ À`pÇà®Zwæ 3Ôiê†ÈÎ^¨ÝÌMTâÒùCÉØ·>gÜÒû̶4öJlö~ƒ»ž0kBSYÿ#7áBT:ž{< ¯¨/—°vºñ·rô¶_ÜmÚƒ×gí×[ÆÚZý¿õ–ï­þû2f-:¦)·xF+´‰ô–;Òö¾±JкxZãµ›ÀÎѪ˜+Ì‘x# Ÿ¼vÊlU•è#;A P€ (@ P€Ð'ÀàŽÁIw¾¡hÖÉ Û{ÀÁÙJs''äààÆ›Ø¿1©‰J“ý÷܉`mÓŠîpr°ÂŠß.àƒ/OâçEP+Ä;öÇá•w÷”èQÜiÏÖ»»°örÜE߯«Îiм5ªžîŠìœ|<üä_ÈW>P{èŠÍ)à óÎ`øÌ°¶QàøŽ|?Ÿ›S<ЈS€ (@ P€ @© îÜ™dpW»©+z ­ Ÿ {Í ®Ê/À™ƒIØ·>ç%03rpp€¢¢¢››[®¯¡îü0oRsyÎSc¶àÜ¥Ôr/ ¿1²!öª‰¤%ÆNßï?ê(ë7c/¶ì‰-3¸ËËS¡½Ø\"«ø¼}»bú¸HYÇ+ÓvcÇ›šúºµ÷ÃüÉ꾜² »Ç—»ïÆ<¡÷ˆšx¸·¿œi÷ù[Çqõtš>≧^­-›ùýó ØýwÉÆì ë¢(@ P€ (@ ”W€Áƒ;yÏxz«7o0•ã±a!hÿx€ìnb\6lŒÃÁqHO6ì¹jyõ4ÀŒÓagg‡±±7ö5$§¤Üdó†îørN[Y~Ê‚ƒX³ùºÁç qÂêEå—¯¥¡f “rÐuÈ:¨J™W4ãNœ·àËøî·‹wµ]ˆv@ƒÚnÈÈÌC§Ak¡TÞYnjme޵ßvC œ½”‚ç&l×yÿî ±³UÈþ(s Ê}eѲ†¼!‹mX…M?FiN8¡6·÷”Ï»[<ùb.f”Uß§(@ P€ (@ Tºƒ;wò¦3µà®ûà`¸ûØb߆X\8š¬w‡ÔJM·œ3w6"#Õ3Òı|ùwøáû 6ß¶6ˆŽËÄ”‡pò\òòË7…påÇíQËMÓÎáÓå§Kí‡vp'–»Nš»Û÷«gÔ‰Ýdǯ‡gû„ÉŸ¿\u ¿+¾ÔTû{ÇÎ&aö£8{Y{Ö`!ÂC]ðhô댧ÇlÅ›YûRÐÍ˯~Ò¶ö–¸r2Ÿ¿}…ZÙ µ­¯~ÚîÞ¶2øýäÕÃPfñyw†Ø² (@ P€ (@ Tžƒ;wòn3µàN½Ö¬òFJ9Zúàƒ÷Ñ aÍ+W®Ä·ß,/G À+ÏÕÁˆêåœâ›lä䪃¥ë±™xjô–2ëëß=SÇ6Ö”ëóâF\.}fYQpwðx"Âk:ÁÑÁJn4q+)ÁŽpu¶–õ:Ÿ„a“w"Gk¶v‡Fª—Ÿ©£y)&.7³`i¡@€¯=\œÔõˆ£ÇóëÜ),Ôϵ ¨å„¬ô<|4ö°ÞçÔrÀÈyäF&'v'`Å>ï®Ì›Š(@ P€ (@ P RÜ1¸“7œéw•:NÊÕX›6­ñö”·aaa´´4Œ}e¬\2[Þ£o· <Ñ-á¡Î°²ThN7tÇV± uûªÇ`i©ÀÉsÉxvܶ2»PÜý±ñVÿs s&6C ¯ƒæ< ®ßÙ‹!-£ôeÉm"=1jP]Ô w-Önaa!ÄëþÁª¿.#7ÏxKeû¼†6=}e›Ëg©½·J¼îöýüñØó5åû|y»þ¼Q¦ P€ (@ P€ *K€Áƒ;w0ÚüýýŒ“'O %¥ü›Kèv©v6P(Ô3 U…ÈÊ.{Y§üVÖIž3gñQ¬úëJ™WªÜMýèÌÌ€†uÜàëi‡ìNžOFBRN™õhðp³‘ᣫ“•|ž8ÿüÕ4¤¦•oÓŽr5Ê (@ P€ (@j ÀàŽÁƒ»j0õ]ÂԱп{r”ùè2x]™3äDwwÕ”†—E P€ (@ P€0 w îÜ™ÄP-_'¼íðëÒGäÛß7DaÚLJ ª€ÁAL,D P€ (@ P€¨w îÜUÊP«øFê>ä7gkøûØaH¿Zðõ²C^ž OŒÞRæ¦E½cpWñŸ[ (@ P€ (@ *ÀàŽÁƒ;CGK/·tv´lä©é¥Øbî’c=ÛŽÁ]ÿpÙ= P€ (@ P€øO 0¸cpÇச ýic¡AíÈÍS!*&?¯½ŠC'ËuuËæ¶…‹“¶î½…ß)×¹,L P€ (@ P€ €qÜ1¸cpgÜ1ÅÚ(@ P€ (@ P€ €QÜ1¸cpg”¡ÄJ(@ P€ (@ P€ €qÜ1¸cpgÜ1ÅÚ(@ P€ (@ P€ €QÜ1¸cpg”¡ÄJ(@ P€ (@ P€ €qÜ1¸cpgÜ1ÅÚ(@ P€ (@ P€ €QÜ1¸cpg”¡ÄJ(@ P€ (@ P€ €qÜ1¸cpgÜ1ÅÚ(@ P€ (@ P€ €QÜ1¸cpg”¡ÄJ(@ P€ (@ P€ €qÜ1¸cpgÜ1ÅÚ(@ P€ (@ P€ €QÜ1¸cpg”¡ÄJ(@ P€ (@ P€ €qÜ1¸cpgÜ1ÅÚ(@ P€ (@ P€ €QÜ1¸cpg”¡T5+ ð¶Ã­T%²²UU³ƒ&Ô+…µmìPÃÂRö:>?2Ó ¾‚+ktvvA •-¬ÌÍŸ—‡½iØ›ž†3ƒ«aA P€ (@ P€ø 0¸cpÇà®ø@_{Œ^í›{£Ïˆ¸›Y ¯²â/©…ƒ#::º ¶­¼­¬t<˜‘†)ÑQubˆ»'ÔðÄí¯sNeebfÌ5$«ò ª‹…(@ P€ (@ Pà¿#ÀàŽÁƒ»j8Þû<ˆ÷ÆGÊ+ëõÂw÷øOòñG'gW½gÜõwuÇ/YÇ­¼\lHMFfAšÚ;¢‘½ƒ|ýLv&F]£»{ü x(@ P€ (@j*ÀàŽÁƒ»j8¸ÜçCèã:¶v8‰3ÙÙ8—…!a²rC‚;7…ß„†ÃÚ\˜\%ÆG]BªêβåQž¾èíVCÖ·(.kR’ŒÓqÖB P€ (@ P€ÕB€Áƒ;wÕb(ë^ƒ;ã|¨€Î,8€¿k×78¸{ÎÝϸ{ÉòïEGawFšNǬÍÌðmhm¸ZXàF®Ã.Ÿ7NÇY (@ P€ (@ T w îªMpgc­@«ÆžhR¯Ü]m`fÄ&dãЉDì=|Ua©ƒÖÎV-|аn ¸:Y!+;W£3°e÷R—šz¸Ù ^-W¨ °}ÿMÙFýptnãowä(U8t2k·E—Ùqn0<ÜÔ â9u¶6 de .!ÇÏ%ãÀ±(s Š]G =Bƒœ4¯·hè}BåÏ3EbRŽÎ9Y9ùØw4Áè_bÎáaaç€Â‚|Ü:¶%í¹ °¶…Kݦ²}eJ"2®œ)µ/æææ Ä­äd¤¥¦½ß†VXÞànQpBml‘šŸ‡g.ž…¾-B´gݽxù<®å* íËQ€ (@ P€ @5`pÇà®Zwb†ÙØç#d`§ïˆÏÂkïíÅÙËúCŸvͽ0íÕ&zÏW© ðãšËXðÕ ÏÌÐåa_|ðV ¢Uÿ?1éÅè×=¤X7N_HÆ‹oíDz¦þ'™‰àqÖ„H<ÒÆ¯Ä¯ŒÌ\vªB>î°cáßåIäçáðœÑÅfÓyµîŽ:Ãß–m_øá#ÄlþµÔ~tëÖ¯Ox]S&êjFŒx±Bú^V¥å îÂmlðIðC²ÊŸãñM¢z6æÂ P„ÙÚṋgŸŸ‡`+k|^³–|ï·¤,+«|Ÿ (@ P€ þ# îÜÉ[ÝTƒ»–=ðùÌ6ãÅ«ixõ½=ˆŽËÒ¾ÖVæöT-œ»”Š-{buÞ37þü²+|ì‘/gĉ%©E‡X>»è½Öhá._:q;Žœº¥S‡vp'ÞKSþ犦Œ»«5¾y¿}äòÛÿ.¶ÜU„„[~èss3l؃‰s÷û ²²4GŸ.AøsS”Þå²Ú'<ÈgÜ™),Ðø­Åp ©ƒ¬ø|w rÔŸ‰§?š½» ;ÄÜŠÓ‹§–ùUÛ³gOŒ}uŒ¦\Ìx~ÈóežWÊܵutÆÛ~²‹oÆàÏä$ˆóÿ€…™9fEGaGFœÌX]«®,·;=ïÅ\«ˆ®³N P€ (@ P€0Aw îämkªÁÝŠÛ£Am7ºõ½ 1qÙ%Cñ̻»s'–È~önku¸²â –þx¶ØùA~öø}iª­û7“çÐ)£Üí>t#ß)¾Œs@ϼ9ª‘3°<ß/2¸ý´ñðAÓi_ËçÝÅïÛŒÓKß…ôš¼ý9ƒÃe whú Peg–yYÎ.ÎX²d1ÜÝÕáéâÅKðûo¿—y^E(Op×ÕÙã}d7>Œ½Ž ©)ð²´ÄòÐÚòµ¯âcñ¿¤Dˆ 0þº½áÅ‘Ìt¼yýjEtuR€ (@ P€ € 0¸cp'o[S î|<í°îÛn²ÿ%-c-kL¾ñRÍ&[Wbð·|A;¹ô4%M‰öþÑ©V;¸›öÉaü¾^ýì2í£amW|÷aù’¾`.<Ä «u–ïôõ |û¿‹eu½Ô÷tp':çÞ¤=ê½2Söóì·ó`®O«Ÿk'–Ð^-’–tQŽŽŽhܸ1ânÞÄùs%?ï¾Ð 8¹<Á]o7ŒòV?¯pnÌ5lKOEM+k,¾½,V{ùìÚðzrÖè™ìLŒ‹ºl@OX„ (@ P€ þ  îÜÉû܃»níý0rsÙÿ×gí“Ϧ+ï±ln[4màŽÔô\´{úïOŸür<Ó[½Kk×çÖâfâ]Zµƒ»¡¶ãÈiÝ¥´âœGü¾ôyþ”±fóu¶ÄrÞõË»Ëçê‰ÙƒßüïÖ»ÚÞËQ‚;Ñï°g^ƒÿ#ý¡ÊË…¹…¥ §Î¯ü76ýr/—õÀÏ)Op÷˜‹ÆÜîæÇ\Ç–ôø[Yã«»ƒ»ÂB¬«Ó@^Ûɬ L¸vg™õ¿`v€ (@ P€ ¨ƒ;wò4ÅànPßPL|Qx<ýÊ–wŒ-m„ý²¸3‚äóñúÚ\bÑž®…±CÔ;„>5z3Î]IÓ”ÕîJêG°¿þø¢‹¢¾|и­8qîÎ3êŒ܉ºk;aø€p´nâ G+þ¨TX´â –­>_æ·DU î 6ªxc!œCÕ¡güþ-8ýù´2û_U ”'¸kfï€!òR¾IˆÅO·åÿŽ–VšÍ)<,,±"LlnKMÁÜXÝÙ˜UÕ‚ý¢(@ P€ (@Š`pÇàNÞe¦Ü è‚7Gª7|¸;L3tèü´°#j×tÁÕètôyqS‰§½4°6F ®#ßüåM¸|íÎÌ7cwE°P˜á¡g4oàŽ­|4»ÚŠ÷GOÝo–z‰U%¸ ðŠ|®]¡J3…z&áùïàÆ¶³¹„¡÷EIåÊÜù[Zá«ÐpYÕ_ɉXxS½£ñdß´stÆà‹g¤R¡®-> “ïýp+nÅßo7y>(@ P€ (@ Tw îä­lŠÁ]Ûf^X8]½#lI›B”5N¾Û m›{#G™–ýÖÛu¶èüé¯5Aß®AòLJŸ\ƒôÌ|MÕÜÝÝïníü0wR3¹³íúíј4WwgÛ»ËW…à®F㶨?f¶ìÚÅŸÃÞ'>ízÊçÝž=™QeÏ,º.7WW4kÞ ±q7qüر²>Ö {¿<Á(û¿‡"`«0Ç™ì,Œ‹º$ûåki…º¶vØ”¦žµÙËÅ £o? oVtvdÜY†]aŠ)@ P€ (@ PÀ$Ü1¸“7ª)wÎŽ–غòQ(æØy £§í)÷ =¸^¨^¦XÚ¬½¢%µ×c3Ñó… :íTFp'\ña{4¨í†Sç“ðÌkÿ–z­Ý;øaÞ$õÆOÙ‚s—RËms?'X»û é´e°´wÄ­“ûqüÃס°²AäÔ/`ø|w r²ÊlÆÍÍ Ÿ/]YvÙ²eøiÕê2Ï«ˆå îDûÓý‚ÐÂÑ ù…tñ,RTªbÝ**£*,ÄÓN#£  "ºÎ:)@ P€ (@ PÀÜ1¸“·­)w¢ßï¿Ñ]ÛùÉkxeÚnì8  ©™àâdäT¥Î0­ꌟ>ë$_[»í:Þ˜°Ø0ÖžÙ·ü—óøpÙ)2Æî,-Ì—_XêWÈ_˺"ÀÇ{ßÄËSv—Z¶yCw|9§­,£oÛŠü®R4~s1œjÖ25 §E^z²lÒÞ?M¦,…ÂÊñ¶âô’©ev¥wï^xeÌ+šr±±qòÜ2Ï«ˆå î:::c²_ ìʪÄx|›¨{ZYcqH,Ì̱?=Sc®VD·Y'(@ P€ (@ ˜¨ƒ;wòÖ5Õà.ÐÇ«>ë{;KdçäcþÒãøsÓ5ä«î„`µ\ñÚЬþç26î¼Ql¨~>³5Z5ñ’¯¶ü¾ùߨnŸß¨®>œÒ5\lþ£7!&.[§cwb)쀞!øe]¶íEFÖ¥¸v6 ¼ülm é_K¶;÷ócøñÏË¥~åØÛY`ó÷=`kcè¸LLYp'Ï%•ã{,là«ðïò åL»äSºËz};=ŽZƒÆË¦.üð1b6ÿRj³<Ò“&OÒ”¹tù2F¾4Ò]-³7…"líî”3ÞöS/™¾”“-ø¢#¿°{2uwý5/–Ö|Ö6È+(À'q1š%²~–V˜æˆ@5>êÎäèÞ[ev(@ P€ (@ P Z 0¸cp'opS îDß[5öÄ‚·›ËðN™Yy¸t-ùªøyÙÁË]¼L˜½Oopçía‹oßoOu¹¤%¢¢Óáâd…@'ùZAA!¦~tk6ßñÓ(Á]{?ÌŸ¬^Ú*Úºt- ‰I9p°³DÍ@G͵;›„&m7(€{å¹:1@½ ¸¨Þœ\õRM±ä÷©Ñ[ŒþåæÙõFÏ”õ^[»—^¢·ˆ1³áѸ- ÄóîæŒFÆÕ³%öÅÒÒ³fÍD£Æ••…™3fâàÁCF﻾ [Ù;bZ@°Ameàñóº³1ʼn5­¬± (L>ëN·òòU ‚¯•5b*(€å qøñV‚Aí°(@ P€ (@ üwÜ1¸“w»)w¢ÿ¾öó\:¶ò†¥¥z÷Ò¢Cl<±i× |´ì$“u—Ê•ñr·ÁÄë£sk?¹„öqåZ>øêd‰;¹#¸ rĘ!hÑÐv¶žDù˺«Xüýidçþ ´¾Ý‚ðD·`„‡:ÃJËåÚ ô¾Ñ¨ßt6â¹vï~ ;¤]9ƒÃ³Gª;3µ³°wBÓéßÀÆÍÙ 7ppú Pee”Ú¤¥§A™£ÿ34êÅÜ®ÌÁ¨*ØÚ¯zû£Žöì=Éùùø6!ëSÕUð (@ P€ (@ h 0¸cp'ïSîŠnj±¬´^¸«\ÚªP˜!áV6NœOFVvñMô}ˆYvâ|W'+yΕèt\¾¦»ü±"¿BDŸÃàë{[ äæ 6! g.¥B©4ìô÷¯v6ÒDª‚BƒM*òzÿkuû[Y#ÈÊ–ffHÈÏÃÙì,Üϧú_óãõR€ (@ P€ø¯ 0¸cpW­‚»ÿÚæõR€ (@ P€ (P}Ü1¸cpW}Ç7¯Œ (@ P€ (@`pÇàŽÁ `v (@ P€ (@ê+ÀàŽÁƒ»ê;¾ye (@ P€ (@ ˜°ƒ;w îLx³ë (@ P€ (@ T_w îÜUßñÍ+£(@ P€ (@ PÀ„Ü1¸cpg˜]§(@ P€ (@ P ú 0¸cpÇà®úŽo^(@ P€ (@ P€&,ÀàŽÁƒ;Àì:(@ P€ (@ P€ÕW€Áƒ;wÕw|óÊ(@ P€ (@ P€0aw îÜ™ðf×)@ P€ (@ P€¨¾ îÜ1¸«¾ã›WF P€ (e¶ÿž IDAT@ P€ € 0¸cpÇà΄0»N P€ (@ P€ @õ`pÇàŽÁ]õß¼2 P€ (@ P€ LX€Áƒ;wUtxÛáVªYÙª*ÚCv‹ (@ P€ (@Š`pÇàŽÁ]Eް{¨;Ð×ã‡×GûæÞè3b#®ÅfÞC-<… (@ P€ (@S`pÇàŽÁ]Å} Ä{ã#e¯z½°Á]û|Ø P€ (@ P€ @e 0¸cpÇலF›í0¸3ŠÅ(@ P€ (@ P€Õ\€Áƒ;wUl3¸«b»C P€ (@ P€x@ îÜ™dpÞÄ™éùˆ¾þ€†Žñš ô±Gh“¦Â =0°O¨üyæÂ£HLÊÑi,+'ûŽ&è¼Ö8¢\­›§Â®Cñ¥vÎÉÁ‘õÜe™KQi:KqÛDzÂÊR³—SŸ…G<ÖÑþÞöí?“„ ;b•c؆~Þ¶hßÂ9ÁÞÎI©¹8r:ÛöÆA©4¬ŽòJ{ØÁÃ×VžvñX2”9¥VQ»™+ææHOÎŵó¦?•׋å)@ P€ (@ P ê 0¸cpg’ÁÝcÃBÐþñÄ\ÎÀ ±8´5Ê¬Š ‚*zøé&7£0ô¸v#½†oÔ)>jPm¼ôLùZï7"*:£Äê†>†qÃÔí==f Î^JÕ”ÝüC¸»ÚàÓå§•‰#êC¡0ש+öf&&ÌÝ“çRJlÃÚZ‰#ê¡_·àbç‹“Do-8„Ã'ozÙ— màŒ—f5”åÿ·ð<ö¯+ñÜ€Z³ ‰|ÍW—°ãƒÛaA P€ (@ P€ @E 0¸cp'ï1OoŸŠ¾×ŒZ÷ÁÁèôT ¦ÎÜœ|Ûu ÖÇâê™4£¶UÑ•=ÜÌ vð×4ãçmFujÈŸ·î¹!gºibÞ‡ËN鼿ãi‡¾î ss3,ûé>]~ºÄnÿº¤³œáwöR ž³U§\Qpwáj*‚œ’ªÄÚí1¸•œƒðtnã#ƒ¸Ôô\ »7nfkÇÊÒ_ÌjƒÆ·gõ]¾–†íâ–‘‡ _Gtië ; ä(ó1dÂvàÐ8Ö…˜ôEs¸ûØ"êlMÿNê4¯”„Ì~a¿˜ÄɃ (@ P€ (P¥Ü1¸«VÁft™a \Ðô/ÔkYV6ò­Ô[Jù,³ª|Ükp'®iÜ Ú¿”¹*9.5ýÎŒ:íy#ÞÜýÇK îHÀ°É;õ2yyØbÃòîò½»Ÿ§7kB$zvRÏÆë0ðdfçëÌ·3»=ùN »Õ ;É]k×lŽÂ”‡þ‘ÔnêŠaÓÔ›p,›~ç&iÚpp¶ÄÛߪgämZ… ?D½}VH P€ (@ P€¸_w îªgpw{dxÙ¡M/?´è¦Þ|#-93ŸÛ{¿ã¦BÏ¿Ÿà.Èß~ÑEöoÎâ£Xõ×%¢ŸNk‰ö-|p=6=_X¯w kÑŒ»uÿFcò¼âϯõŠÙr‡Öô•müºî ¦zgó‡/æ´A‹†žåòùw_,ÆN7þgbf¼ùUs¸xØàØÎxü0ﬦ_íúú¡ç ¡(,,ļû‘tSY®>³0(@ P€ (@ P 2Ü1¸«vÁ½³%¶ó@ÓN^ðsÔŒ#±drÏ?±ØüÓµÊ[÷ÜÆýw¢Ñoæ?Œ&õ„G!?O…™Cöi6+÷Yø;àüÑd|õΉûm†çS€ (@ P€ *D€Áƒ»jÜ™+ÌP§©";{¡v37P‰CHç%cßúXœ9pKï3Û*ddÝG¥÷Üõì€YšÊ<1r.D¥ã¹ÇÃðúˆúr k÷¡ë+Go‹‚»M»bðú¬ýzËX[+°ÿ·Þò½Õ_ƬEÇ4åÏh…6‘ÞrGÚ^Ã7Þ‡‚qNuñ´Æ_6‡¹¹þXz»þŠ…_˜^ý¨‰là‡÷OãØöâK†Ó:k¡(@ P€ (@ ÜŸƒ;w&Üù†: Y'/4lïg+ÍhHNÈÁÁ7±cRMkäýw"XÛ´¢;œ¬°â· øàË“øyQ'Ô qÆŽýqxåÝ=%~kwÚ³õî.¬½wÑw§ñŪsš"oj€§{†";'?ùòU~LJ¦×Cx7Ä\JÇ'¯AŸ¡hÓÛ™i¹˜9tTy¾÷÷5γ)@ P€ (@ P º 0¸cpg’ÁØx ÇКð ²×ŒMU~ÎL¾õq8w(éîêààDEE!77·\ßÝ;øaÞ¤æòœ§ÆlÁ¹K©å:_~cdC ìUI)JŒ¾ßÔQÖ1nÆ^lÙ[fp——§B{±¹DVñxûv Äôq‘²ŽW¦íÆŽ75õukï‡ù“Õ}9evŽ/wß}Bý6îüF]Yí§ã`Ø´òîü3~yÉØÍ±> P€ (@ P€ €ÑÜ1¸“7“§·zóS9‚öÈî&ÆeãÀÆ8܇ôdÞ«V‘×Y¿A̘1vvv¸‹qc_CrJŠÁM6oèŽ/ç´•å§,8ˆ5›¯|nQÁð'¬^ÔYþxùZj:!1)]‡¬ƒª”YpE3îÄy ¾<ï~»xWÛ…Xña4¨í†ŒÌ]~ºÔ~hwb¹ë¤¹û±}¿zFØMvüðzx¶O˜üùËUg±ð»3ÅêÓ~ÆÞ±³I˜½ð(Î^Öž5XˆðP<ÚÁýºãé1[qãfÅh>‚ýÔA¯8¢Î¦aÑÄ;»áüá° (@ P€ (@ P Ü1¸“·›©wêu°f•8T oêƒÞGƒ† 4'¬\¹ß~³Üð ÄÔçê`Ä€ÚšsÄ&9¹ê™m×c3ñÔè-eÖ׿{0¦Žm¬)×çŸQêyEÁÝÁ㉯éG+¹ÑÄ­¤8ÂÕÙZžê|†MÞ‰­ÙvÚT/?SGóRL\&n&fÁÒB_{¸8©ëGç×Wxpçîg‹IŸ7Ó´ùë¢ Ø»®ä%Ãeâ²(@ P€ (@ P Ü1¸“·™éw•0:6mZãí)oÃÂÂiiiûÊX¹d¶¼GßnAx¢[0ÂCae©Ðœn莭bêöUÁÒR“ç’ñì¸mev¡(¸ûcã5¬þçæLl†@_Íy"@\¿=³CZFéË’ÛDzbÔ º¨îZ¬ÝÂÂBˆ 0ÖýƒU]Fn^Å-•-j|ôûTÛ y¹*̲ÙÅŸßW& P€ (@ P€ *Q€Áƒ;w0àüýýŒ“'O %¥ü›Kèv©v6P(Ô3 U…Èʾó\¹’º/¿ÕŸu’oÏY|«þºRæ•jwS?:33 a7øzÚ!;G…“ç“‘”Sf=Ú<Üldøèêd%Ÿg'Î?5 ©iåÛ´£\ÞUX<çnÊòrSŠc;ãñü³÷SÏ¥(@ P€ (@ TŠƒ;w î*e¨U~#SÇ6Bÿî!ÈQæ£ËàueÎ=¼;¸«ü^WL‹Úyà™‰ê¥»Ë¦À¹Ã⹈<(@ P€ (@ P€U[€Áƒ;wU{ŒÞSï¼íðëÒGäÛß7DaÚLJ ª§:w 3¼öI¹›lbl6æ¿t@ýˆD (@ P€ (@*.ÀàŽÁƒ»*>H í^݇\àæl ; éW ¾^vÈËSá‰Ñ[ÊÜ”¢¨êܹyYÃÃÏΖhÞÕ!õ\ä%®þônTï’˃ (@ P€ (PÕÜ1¸cpWÕG©ý[:» Z6òÔ”@Ì]rÌ gÛU·à®ÓSè>8DGîèöx¬|ŸÏ¶3ðvb1 P€ (@ P€¨ îÜ1¸«Ñ]˜6¶Ô®Ü<¢b2ðóÚ«8t"±\U/›Û.NVغ÷~w¦\çV¥ÂÍ»yãá^~»à¦%æâø®Ü@½Á P€ (@ P€ €)0¸cpÇàÎF*ûH P€ (@ P€ ÀN€Áƒ;wÿ¹aÏ ¦(@ P€ (@ PÀÜ1¸cpg #•}¤(@ P€ (@ Pà?'ÀàŽÁƒ»ÿܰçS€ (@ P€ (`  îÜ1¸3…‘Ê>R€ (@ P€ (ðŸ`pÇàŽÁÝÿÛ»ï0«ªsÀ3 ¤ BˆD@¬¨(X#šD£ÑÄh®ÆÄ(ö[blQ¬±ä^ ¶˜bŠ%ñj¢‰½Ä«€ 5HSAé Òæ>gO™af+g3üç™sÖÚßZïÙë<¿g¯½ܲ7a @€ @ >îw‚»ú°R‘ @€hp‚;Áà®Á-{&@€ @€ꃀàNp'¸«+Õ  @€ @€' ¸Ü îܲ7a @€ @ >îw‚»ú°Rq³hÞ©[4iß) 7IæVºjE,œðæf7O"@€ @€Ï. ¸Ü î>ûú©ó=·îÒ"æ-,‰âe¥u~¬uu€Í»ôˆ¶}wI†7ë…¿%ÿ-hÖ":ïy`òïy£ÿ/V,š_ëá·í·kl{Ü£E—•ú”,œ#Ï=¬ÖÇÙ š6΃†$¥?~ëåXùÉÇå¿{‰ÂfÍcÑãcé”w7ÅÐÔ$@€ @€Àf) ¸Ü•ÿw—®›å ÞP'Õc«–ñãwˆýv‰ÃNz:¦ÎZÚP)>÷¼»ìõµèû£‹“ã¼pÂ>ÉsWËíqÝýɿ߼öôXøÞ¿kU§yמ±Ûå÷Da“¦QVVË?š«J–%}W.Yÿ¾ñÜZgS5jÚ¡k ºáÁòy_V,œX~…à Цí;Åäÿ½;¦>v咽º @€Øìw‚»ä¤Üm^kû°¯öˆ+¼k2©Cô”àîs|½3¸ëý_çF÷ŽˆÕ+WÄèkO%Nø#˾«à.{s  @€hØ‚;Áàn3ü Üm¼/ucw.½+Úôêóǽ^篮«JPp·ñÎ+G"@€ @€@mw‚;Á]mVJ=k#¸Ûx_ØÆ î^w´èÔ-æŒz:ÆßuåÆdFGÜe­  @€þ# ¸Üm6Á]³¦…1h—N1`û-£C»fѨQĬ¹Ëâ1Ǩ7?ŠU¥e\ø-šÆþ{t¶Û2ÚµiÅËVŇӗÄs#fnp«iÇöÍbûmÛEéêÕñâ«s’;ôiìÕ=ºthËKJãw>ŽÇ_˜^ãr}ûõn{ïÖ9r÷©kÞ¬0Š—­ŽÙs—Æ¿'.ˆ×Þž%+V¯7][Æ6=ÛT¼¿ÇNã˜Ã¶IþvÛ[ññüå•ú/_¯¼5w£þæt;ì¼wäàKÌ­qh³NÝ£e·^É>™øf”/©v<ѳG˜·`A,Z¸p£Ž»¦ƒ}žà®ý΃£Q£ÂŠ}Ž¿0š´iŸLx+¦=]~¯¸5¯²•+bþ;¯lp8-{|)1nÖ±k%Åød›1ǫÜcikšJ”5j[ömû ˆ¦í;FYéê(™?;æ½=*Mz§Æþ‚»‰4 @€ @€ÀFÜ î’ª¾ßã.w…ÙY?ìŸvU½f}Tç\9*&L®:ôÙw`ç¸üìUö/-]÷=:9núõ˜X½~fî½UÜxñÉÃù÷¸pèŽqÄÁåÔº¯qï-ˆ¡¿‹—V°ä‚Ç«Ïß5¾ºW·jù’¥+ã+Ç>%%•Ÿ{ü½“‡QÔö5uæ’8ôħkÛ¼Öív¾èÖhÛgçX>ÿ£yÁ·£QYõaéçÜ[î8(V,þ$Fþø[QVMðÔ´YÓ¸ñÆ_DŸ>}¢¤¤$®»öºxùåµÓçmøy‚»}î|6 ‹šÔjzªlAÓfÑ÷‡?N¿R届gOqw]µÁ°4”nÚÏ£Um«<Ƽw^M®\µ¤ú`TpW«¯R# @€l4Áà.9™êspwê±}ã”ïõKæQ²¢4^z}v¼÷á¢(]Uݺ¶L®^Ëzç_óJ<ýÒÌõÏÀ:ÄíWíÄÊ•¥ñÌË3ãý)‹¢ÝM“P®s‡IŸ¿>þA\uë[ëõ_Üå>xä©)qøž1ú¹ñÖøѾmÓŠú¹ÏxlR\3¼ê';o@z@Ïäø?X/¿6'æ/,‰–ÍÇ{´ŽA:E›VMbÐâ啃»½wï_ß¿{ÅØºui;÷Û2ùûù‘3#w…ݺ¯Üx7ß3v£ý¬9PçÁG¿–üùöMçÅ‚±¯VY£h‹-cðE£Â˜öÔƒ1éþ[«ËA ‰óÎ?¯âó)N‰“NºÑÇ^Ý?Op×ç‡?FWºÃ€}¢qÓæ±lîÌXø~å+ÜV/‰÷ÿtËzÃÈEŸ;K´ßn·ä³âYSbîè—¢tŲä~y[î”»ª¯Q¬Z¶4Þ¸jh,›=u½cµi»]ñÛhÚ¶CòÙ‚ñ£ã“‰oEAãÂh¿Ã hݳ<Ì[<íý}ÕÐ([µ²JÁ]f§B @€Hw‚»äD¨¯ÁÝž»tŒ;†í•ï¸(ξrdLŸ]\iy7mR'µmLœ´0ž9«Òg¿{Hlݵe,[¶*¹".·%uÍ+·}öWWŽýË\ðb¼9v^¥c¬Üå>ÈmMýË??¨hÓ¡]Óøí/ö[µJ¶ßîÌ?ÖÛîš ŸûÓ×¢  Q<õ⌸àºõ¯&EqØ=ãïÏL©r»ìºƒÚT÷¸+hÒ4Ýôpµl½òlŒ»óŠ*j·>ø˜Øæ¨Ó’Ï^½ôûQwV¬^Qy+ruƒÛㆿDó]böȧbÂÝWÕj]öþZô=áâ¤íœQÏÄø{®®´-¶ãnûÇv§ü<TûЋ>?º8ºîõµäïýé–˜ñìÿVÔ΃½>3¶rTòÞäÿ½;¦>voÕc+l-ÖÌûãY±º¤|ÞÍ»ôHBØ•‹ÄÊÅŸÔj^ @€ @€@Í‚;Á]r–Ô×àî7ï;ömŸ„nGžþL̘½¬Ú³>wÏ»OïÜÌm‘½õŠÁIŸáwÞ7a½þ=»µŒGî<0 Õžø×ô¸èú×*µY7¸ñÆœ8õÒõ·q}H¯øéi;'ýŽ9ûù÷^åp#w_¾ßÞ°oòù‡½ÏŽXÿÊÀš—óÚ›*¸Ë ÷Ý8"JW®ˆç¥Å‹×únWÞ­º÷ŠE“ÆÅè«OÞàÔ¶h»EÜ~ûðèС<<>üöxäáGÒpÔ™¶Ÿ%¸ÛõÒ»£u¯¾±réâuáw¢tÙÒõæÓ÷ÄK¢Ëàƒ’÷_¹øØX6{JE›Æ-ÛÄà›Ž‚¢&É•voÿâìõ= ckÿÍ;n%É6çïD”U±/¼ÎH @€†€àNp—œéõ1¸ëÚ©E<ñ»ò°¢ºm¬5-㟜¼cÅC¾~ÂÕ¿¿ißdëé'‹Jb¿£ÿYé°ëw—ÿ÷èxäɵ¡Éš†;õm÷Þ¼ògUÁ\Ÿ^mâÁ_|~ËoÆÄïþú~MCßàç›2¸kÙ½wì~åo“ñ½{ïM1ó…Ê![«/ôÝ.»;ù|ÂïnˆÙ/>Zã\[·n»ì²KÌž3'Þ8±ÆöuµAÚà.ºí}ë?’éÌzùñ˜xÏ5UN­]ÿÝc§ónN>{ïO¿ŒÏ>TѮÀýbû3†•{ÿ暘ýÒãU£×C£ç!Ç%Ÿ½véñ±tÆäºÊh\ @€h0‚;Á]r²×Çàî ýºÅ  LÆÞÕ¯$÷¦Kûºçº}b·;ÄÂÅ+bßï–$U½.:eÇøÞ7ËŸÒ:äûÇœ×n\7¸ûÁù/Æ›ã*o¥Íõéµuëxäί&ý/¹éõxôÙi•Êä¶ó>ùûƒ“ûêå®üí_ß‹'ÿozòTÛÏòÚ”Á]n¼.½+¹ÿÚ¢Éãcô°Ê÷£[sEÞª’e1âœÃbuIõWI~–¹×å>iƒ»-úì»\ô?É”Þýó/cæ3k¹uçÙ¸Õ±÷ÿ<–¼5ëÅÇbâﮯø¸ça'D¯ÃÊ·¿vÙbéôIUuØu¿Øþôò€/÷ ‹F=U—) @€ B@p'¸KNôúÜ{ø6qÁГñ÷Œçª}bì†VòCÈÞ_h“ÜïÈÓž­¶é¾»mœu|ÿäó£N6&~°¨¢íºÁ]uãøB÷Vñ·»Lú\vóñ·gÖ€À}¶ŠkÎß-ŠŠ +޽à“å1nÒ'1fâ‚xâ_3âƒiëo;­jЛ:¸ëºß7£Ïñ$C{õÒã¢xƇɿs÷†tóÃѤuÛ˜õÒ?câo®m?´k&™6¸ËÝ¿®ÿiå÷Â;üÒ˜ûú Õzí{×sQи(æŽ~1ÆÞVþ€ÜkMPšû÷KgRíScÛl³} øÙíIŸ÷îûï˜ñô_Ôwc² @€¨‹‚;Á]r^ÖÇàîÄïngþ'LûæÐ§cÊg¸:íÑ_˜<4büû â質E¾ÿ­ÞqÞI;$VÇžû|Œ™¸öu+¸Ë{Û/´‰îƒtŠÖ­šTúÍ(-]¿úÃø¸çÁwkü-ÙÔÁ]AÓæ1ø—Kž :õ‰ûbòƒÃ“1¯{U×èkN‹Eï©q.›Sƒ´Á]§=‡ÄvC/MÆü÷ObÞÛ/W˱Ïð'£°Y‹˜7fTŒ¹¥<4ͽúüà¢èºï!É¿_<í X½¼òÃ[Ö´kÕ³Oìvù¯“?'ýåö˜öøŸ7'zs!@€ @€@½Ü î’·>wGÚ+~zjù>¦Õv5>pÛ—£ïÛÆ‡ÓÇaCŸ©¶ÛÉÝâÆýRIDATÇôÓŽë—|þ­Sž‰ÉS×^ù¶1ƒ»5h\Ø(¾Ôk‹¸c‡ØP׊§Úæ>?ý²ñÒës68ÅMÜ•F?‰®û~#JΑ籺4¶?ëºè°ó^Q¤gòçÞßy4/]Uqè|wŸ÷Aûv‹ë.Ü=y²í“/N ¯«üdÛO·¯ Á]›múÇ€ŸÝ‘ -wµØ¢ÆÆ ›Ž‚ÂÆ1éÁá1í‰ûjúz*>oß®]ì>p÷˜5{Nüûí·kݯ®5LܵêÕ/v»ô®d“º+¦ýãUN©iûÎ1èÆò­­Óžz0&ÝkE»­>&¶9ê´äïÑWŸ‹&½Så1:>8úX¾ÅvÌÿü4æ½õR]ã3 @€48Áà.9éëcp·Eë¢xþÏ_‚xéµÙqúå#S/àÓëCé›ôÛÐU{k¶ÔN›µ4ùQå›ögÜåÆ÷‡›÷‹û¶±ïÎïó¯ Îõàý»Åõ–?¸ã¨3Ÿ‹‰“¦¶Ùv»ò÷Ѫû“û®-|÷ßÑûè3bõª•1ò¼#cåâµ*Ѿ}û¸ãÎÛ£mÛ¶Iû{î¹'¸ÿÁZõ­kÒwMšÆÞ·=žÜ»îÓ[`×Ûº[jÇß=,æŒ|²âã¶ýv/øeò÷†¶À®»¥vÄùGÆŠùÕ5>ã!@€ @€@ƒÜ î’“¾>w¹qÿâ'cȾݒ9œqùˆø¿×ªÞBÚ¨QDÛ6McÁÂ’J‹¼ï6[Ä·~%yïñ¦ÅOnx}½u¯ìûýCïÆÍ÷Œ­ÔfcwEÅÊU¹ Õ¿»gHlݵeŒ='N¹dÄÛÜ©CÜ}í>I›ªžb›Õ/]·¿_:æì$¬+™7'šwî½þ|Œ¾v+gMcùæ73Î<£¢Ù¬Y³ãøï_S·:ùyÚà.7‰5Û‹ËJKãµËÅ3Ëô±æUÖ¨QìzñÑf›íbõÊ1â¼#*=€bÝ‚,›;3Ù¢\¶je¥cµn{^r¼ÅLˆ7®:©Nú @€š€àNp—œóõ5¸ëѵeÜë—£e‹¢X¶|UÜpç¿ãïÏLU¥kC°þÛ¶‹s~Ð?üçäxú¥™ë­ñ;† ŽA:'ïßúû±ñÛ¿¾¥ÿé¿óvíãæKöˆ-Û6‹eËVÅ‘§?3f/«tŒÜå¶Â}H¯xè‰)ñ¨Y±¤xíVÜÍ ã”ÿêǹmR÷º;ÞŽûþ>yƒ¿U-[4ŽgÿøµhÞ¬qLŸ½4.¹éxgâüÃÁýظe›ä)²…Ek´ñöMçÅ‚±¯ÖºÔW¿z@\xÑ…í'Mž§ž|j­û×¥†Ÿ%¸kÓ{‡Øå§¿ŠÜOÕÒ™Æ;·]ËfOI¦UФYôþÞY±Õ¾‡&Ïxîáxï7¯7å­¿q\lsäÐäýÜÕ~sm”/IþnÒ®cô?ýªØâ‹åOM~çöËâãמ¯KlÆB€ @€+ ¸Ü%'} îrc´K§¸ég“ð.÷ZZ¼2&M]«JWG·Î-¢s‡Éûç_óJ•Á]—ŽÍãw¿Ø7ºv*o7ÿ“’˜2}q´mÓ$zõh“¼·zuY\vËñè³ÓÖû±Ø(ÁÝ~Ý↋ʷ¶æjMšº(>ž¿ôć1üãbÙòÕµ^î‡Ô3¾}ТÏ6[D“u\¦Î\‡žøt­óy¶ë?0v:ï¦äSÿsLþËíŸép;vŒE‹EÉòª¿ÃÏtÐŒ;}Öà.7Ì.{-z14š¶íPiÔ¹í±³^úgL~èΊ«èªšV£¢&ñ…ožÝ¿zd6mV©ÉŠÅŸÄÔü1¦=õ@T>û3RŽ @€* îwÉ Q߃»5gun[éö}Ú%[[ ÅÜyËbÌ» ¢xYù•f5½rWÙåú·kÓ$éóÁôÅ1yê⚺m´ÏscîÝ£ul½U«hÙ¼q¬X¹:fÍ-Žñ“FIIíæPõ`Ê¢E³Æ‰IîUºº¬Ö&ŸwrÝ<*¾tÌ™Éa^½ô¸(žQùmŸ÷ø ©î~v­{ö‰f»FAaQ¬X8?O¥%•·ooÈ$÷À‹Ö½¶‹¦í:DÙêÕQ2ov,ú`BÄêÏs~5¤oÁ\  @€ €àNp—œm›Kp—ÝÒQ©6¹ ±{\ýÇhѵg,œ<6ÞvJmºiC€ @€D„àNp'¸óS7΃Š~']’ü¯¯Ž9#žÈ[-&@€ @€››€àNp'¸ÛÜVõ&žO»þ»G£¢¢hÓ³ot?è˜hܬY4#^ýÙ±¥kŸ–»‰‡©< @€¨ó‚;Áà®Î/Óú5Àýî~!®}@ȪeKãí›~‹'«_1Z @€ °‰w‚;ÁÝ&^„›[ù]¯øM4*h¥%űøÃ‰1ý©bùÜ™›Û4͇ @€ä]@p'¸Üå}™)@€ @€H/ ¸Ü îÒ¯= @€ @€yÜ îwy_f  @€ @€Ò îw‚»ôëF @€ @€@Þw‚;Á]Þ—™ @€ @€ô‚;Áà.ýºÑƒ @€ wÁàNp—÷e¦ @€ @ ½€àNp'¸K¿nô @€ @€ä]@p'¸Üå}™)@€ @€H/ ¸Ü îÒ¯= @€ @€yÜ îwy_f  @€ @€Ò îw‚»ôëF @€ @€@Þw‚;Á]Þ—™ @€ @€ô‚;Áà.ýºÑƒ @€ wÁàNp—÷e¦ @€ @ ½€àNp'¸K¿nô @€ @€ä]@p'¸Üå}™)@€ @€H/ ¸Ü îÒ¯= @€ @€yÜ îwy_f  @€ @€Ò îw‚»ôëF @€ @€@Þw‚;Á]Þ—™ @€ @€ô‚;Áà.ýºÑƒ @€ wÁàNp—÷e¦ @€ @ ½€àNp'¸K¿nô @€ @€ä]@p'¸Üå}™)@€ @€H/ ¸Ü îÒ¯= @€ @€yÜ îwy_f  @€ @€Ò îw‚»ôëF @€ @€@Þw‚;Á]Þ—™ @€ @€ô‚;Áà.ýºÑƒ @€ wÁàNp—÷e¦ @€ @ ½€àNp'¸K¿nô @€ @€ä]@p'¸Üå}™)@€ @€H/ ¸Ü îÒ¯= @€ @€yÜ îwy_f  @€ @€Ò îw‚»ôëF @€ @€@Þw‚;Á]Þ—™ @€ @€ô‚;Áà.ýºÑƒ @€ wÁàNp—÷e¦ @€ @ ½€àNp'¸K¿nô @€ @€ä]@p'¸KN²þÛïs?þ8ï'œ @€ @€5 tìÐ!ƾ3¦æ†›q‹F¹Wn~eeee›ñ&žá…Ûi@€ @€ /ï¿ótôíÓgS ¡ÎÔÜ}꫸ó®»âÒË.¯3_ @€ @€’ÀUWþ { if (err) { console.error(err) process.exit(1) } const tempTarballPath = join(tempDir, readdirSync(tempDir)[0]) writeFileSync(tarballPath, readFileSync(tempTarballPath)) unlinkSync(tempTarballPath) rmdirSync(tempDir) }) ts-node-9.1.1/scripts/create-merged-schema.ts000077500000000000000000000041241376344015600211110ustar00rootroot00000000000000#!/usr/bin/env ts-node /* * Create a complete JSON schema for tsconfig.json * by merging the schemastore schema with our ts-node additions. * This merged schema can be submitted in a pull request to * SchemaStore. */ import axios from 'axios'; import {resolve} from 'path'; import {writeFileSync} from 'fs'; async function main() { /** schemastore definition */ const schemastoreSchema = await getSchemastoreSchema(); /** ts-node schema auto-generated from ts-node source code */ const typescriptNodeSchema = require('../tsconfig.schema.json'); /** Patch ts-node stuff into the schemastore definition. */ const mergedSchema = { ...schemastoreSchema, definitions: { ...schemastoreSchema.definitions, tsNodeDefinition: { properties: { 'ts-node': { ...typescriptNodeSchema.definitions.TsConfigOptions, description: typescriptNodeSchema.definitions.TsConfigSchema.properties['ts-node'].description, properties: { ...typescriptNodeSchema.definitions.TsConfigOptions.properties, compilerOptions: { ...typescriptNodeSchema.definitions.TsConfigOptions.properties.compilerOptions, allOf: [{ $ref: '#/definitions/compilerOptionsDefinition/properties/compilerOptions' }] } } } } }, }, allOf: [ // Splice into the allOf array at a spot that looks good. Does not affect // behavior of the schema, but looks nicer if we want to submit as a PR to schemastore. ...schemastoreSchema.allOf.slice(0, 4), { "$ref": "#/definitions/tsNodeDefinition" }, ...schemastoreSchema.allOf.slice(4), ] }; writeFileSync( resolve(__dirname, '../tsconfig.schemastore-schema.json'), JSON.stringify(mergedSchema, null, 2) ); } export async function getSchemastoreSchema() { const {data: schemastoreSchema} = await axios.get( 'https://schemastore.azurewebsites.net/schemas/json/tsconfig.json', { responseType: "json" } ); return schemastoreSchema; } main(); ts-node-9.1.1/scripts/update-schemastore-schema-with-compiler-options.ts000066400000000000000000000042611376344015600264530ustar00rootroot00000000000000/* * NOTE this script is meant to be run very rarely, * to help patch missing compilerOptions into the tsconfig schema. * The TS team updates it manually and sometimes forget to * add new options to the schema. * For example, here is the first PR I sent after running this script: * https://github.com/SchemaStore/schemastore/pull/1168 * * This script adds some options that should *not* be in the schema, * so the output requires manual review. * There is no good, programmatic way to query the TypeScript API * for a list of all tsconfig options. * * TypeScript-Website has a database of rules; maybe we can use them in the future: * https://github.com/microsoft/TypeScript-Website/blob/v2/packages/tsconfig-reference/scripts/tsconfigRules.ts * * Dependencies of this script have deliberately not * been added to package.json. You can install them locally * only when needed to run this script. * * This script is not strictly related to ts-node, so * theoretically it should be extracted to somewhere else * in the TypeStrong org. */ import {} from 'ts-expose-internals' import * as ts from 'typescript' import { getSchemastoreSchema } from './create-merged-schema' // Sometimes schemastore becomes out of date with the latest tsconfig options. // This script async function main() { const schemastoreSchema = await getSchemastoreSchema(); const compilerOptions = schemastoreSchema.definitions.compilerOptionsDefinition.properties.compilerOptions.properties; // These options are only available via CLI flags, not in a tsconfig file. const excludedOptions = [ 'help', 'all', 'version', 'init', 'project', 'build', 'showConfig', 'generateCpuProfile', // <- technically gets parsed, but doesn't seem to do anything? 'locale', 'out', // <-- deprecated ]; ts.optionDeclarations.forEach(v => { if(excludedOptions.includes(v.name)) return; if(!compilerOptions[v.name]) { compilerOptions[v.name] = { description: v.description?.message, type: v.type, }; } }); // Don't write to a file; this is not part of our build process console.log( JSON.stringify(schemastoreSchema, null, 2) ); } main(); ts-node-9.1.1/src/000077500000000000000000000000001376344015600136735ustar00rootroot00000000000000ts-node-9.1.1/src/bin-script-deprecated.ts000066400000000000000000000003471376344015600204170ustar00rootroot00000000000000#!/usr/bin/env node import { main } from './bin' console.warn( 'ts-script has been deprecated and will be removed in the next major release.', 'Please use ts-node-script instead' ) main(undefined, { '--script-mode': true }) ts-node-9.1.1/src/bin-script.ts000066400000000000000000000001361376344015600163150ustar00rootroot00000000000000#!/usr/bin/env node import { main } from './bin' main(undefined, { '--script-mode': true }) ts-node-9.1.1/src/bin-transpile.ts000066400000000000000000000001411376344015600170060ustar00rootroot00000000000000#!/usr/bin/env node import { main } from './bin' main(undefined, { '--transpile-only': true }) ts-node-9.1.1/src/bin.ts000066400000000000000000000222021376344015600150110ustar00rootroot00000000000000#!/usr/bin/env node import { join, resolve, dirname } from 'path' import { inspect } from 'util' import Module = require('module') import arg = require('arg') import { EVAL_FILENAME, EvalState, createRepl, ReplService } from './repl' import { VERSION, TSError, parse, register } from './index' /** * Main `bin` functionality. */ export function main (argv: string[] = process.argv.slice(2), entrypointArgs: Record = {}) { const args = { ...entrypointArgs, ...arg({ // Node.js-like options. '--eval': String, '--interactive': Boolean, '--print': Boolean, '--require': [String], // CLI options. '--help': Boolean, '--script-mode': Boolean, '--version': arg.COUNT, // Project options. '--dir': String, '--files': Boolean, '--compiler': String, '--compiler-options': parse, '--project': String, '--ignore-diagnostics': [String], '--ignore': [String], '--transpile-only': Boolean, '--type-check': Boolean, '--compiler-host': Boolean, '--pretty': Boolean, '--skip-project': Boolean, '--skip-ignore': Boolean, '--prefer-ts-exts': Boolean, '--log-error': Boolean, '--emit': Boolean, // Aliases. '-e': '--eval', '-i': '--interactive', '-p': '--print', '-r': '--require', '-h': '--help', '-s': '--script-mode', '-v': '--version', '-T': '--transpile-only', '-H': '--compiler-host', '-I': '--ignore', '-P': '--project', '-C': '--compiler', '-D': '--ignore-diagnostics', '-O': '--compiler-options' }, { argv, stopAtPositional: true }) } // Only setting defaults for CLI-specific flags // Anything passed to `register()` can be `undefined`; `create()` will apply // defaults. const { '--dir': dir, '--help': help = false, '--script-mode': scriptMode = false, '--version': version = 0, '--require': argsRequire = [], '--eval': code = undefined, '--print': print = false, '--interactive': interactive = false, '--files': files, '--compiler': compiler, '--compiler-options': compilerOptions, '--project': project, '--ignore-diagnostics': ignoreDiagnostics, '--ignore': ignore, '--transpile-only': transpileOnly, '--type-check': typeCheck, '--compiler-host': compilerHost, '--pretty': pretty, '--skip-project': skipProject, '--skip-ignore': skipIgnore, '--prefer-ts-exts': preferTsExts, '--log-error': logError, '--emit': emit } = args if (help) { console.log(` Usage: ts-node [options] [ -e script | script.ts ] [arguments] Options: -e, --eval [code] Evaluate code -p, --print Print result of \`--eval\` -r, --require [path] Require a node module before execution -i, --interactive Opens the REPL even if stdin does not appear to be a terminal -h, --help Print CLI usage -v, --version Print module version information -s, --script-mode Use cwd from instead of current directory -T, --transpile-only Use TypeScript's faster \`transpileModule\` -H, --compiler-host Use TypeScript's compiler host API -I, --ignore [pattern] Override the path patterns to skip compilation -P, --project [path] Path to TypeScript JSON project file -C, --compiler [name] Specify a custom TypeScript compiler -D, --ignore-diagnostics [code] Ignore TypeScript warnings by diagnostic code -O, --compiler-options [opts] JSON object to merge with compiler options --dir Specify working directory for config resolution --scope Scope compiler to files within \`cwd\` only --files Load \`files\`, \`include\` and \`exclude\` from \`tsconfig.json\` on startup --pretty Use pretty diagnostic formatter (usually enabled by default) --skip-project Skip reading \`tsconfig.json\` --skip-ignore Skip \`--ignore\` checks --prefer-ts-exts Prefer importing TypeScript files over JavaScript files --log-error Logs TypeScript errors to stderr instead of throwing exceptions `) process.exit(0) } // Output project information. if (version === 1) { console.log(`v${VERSION}`) process.exit(0) } const cwd = dir || process.cwd() /** Unresolved. May point to a symlink, not realpath. May be missing file extension */ const scriptPath = args._.length ? resolve(cwd, args._[0]) : undefined const state = new EvalState(scriptPath || join(cwd, EVAL_FILENAME)) const replService = createRepl({ state }) const { evalAwarePartialHost } = replService // Register the TypeScript compiler instance. const service = register({ dir: getCwd(dir, scriptMode, scriptPath), emit, files, pretty, transpileOnly, typeCheck, compilerHost, ignore, preferTsExts, logError, project, skipProject, skipIgnore, compiler, ignoreDiagnostics, compilerOptions, require: argsRequire, readFile: code !== undefined ? evalAwarePartialHost.readFile : undefined, fileExists: code !== undefined ? evalAwarePartialHost.fileExists : undefined }) // Bind REPL service to ts-node compiler service (chicken-and-egg problem) replService.setService(service) // Output project information. if (version >= 2) { console.log(`ts-node v${VERSION}`) console.log(`node ${process.version}`) console.log(`compiler v${service.ts.version}`) process.exit(0) } // Create a local module instance based on `cwd`. const module = new Module(state.path) module.filename = state.path module.paths = (Module as any)._nodeModulePaths(cwd) // Prepend `ts-node` arguments to CLI for child processes. process.execArgv.unshift(__filename, ...process.argv.slice(2, process.argv.length - args._.length)) process.argv = [process.argv[1]].concat(scriptPath || []).concat(args._.slice(1)) // Execute the main contents (either eval, script or piped). if (code !== undefined && !interactive) { evalAndExit(replService, module, code, print) } else { if (args._.length) { Module.runMain() } else { // Piping of execution _only_ occurs when no other script is specified. // --interactive flag forces REPL if (interactive || process.stdin.isTTY) { replService.start(code) } else { let buffer = code || '' process.stdin.on('data', (chunk: Buffer) => buffer += chunk) process.stdin.on('end', () => evalAndExit(replService, module, buffer, print)) } } } } /** * Get project path from args. */ function getCwd (dir?: string, scriptMode?: boolean, scriptPath?: string) { // Validate `--script-mode` usage is correct. if (scriptMode) { if (!scriptPath) { throw new TypeError('Script mode must be used with a script name, e.g. `ts-node -s `') } if (dir) { throw new TypeError('Script mode cannot be combined with `--dir`') } // Use node's own resolution behavior to ensure we follow symlinks. // scriptPath may omit file extension or point to a directory with or without package.json. // This happens before we are registered, so we tell node's resolver to consider ts, tsx, and jsx files. // In extremely rare cases, is is technically possible to resolve the wrong directory, // because we do not yet know preferTsExts, jsx, nor allowJs. // See also, justification why this will not happen in real-world situations: // https://github.com/TypeStrong/ts-node/pull/1009#issuecomment-613017081 const exts = ['.js', '.jsx', '.ts', '.tsx'] const extsTemporarilyInstalled: string[] = [] for (const ext of exts) { if (!hasOwnProperty(require.extensions, ext)) { // tslint:disable-line extsTemporarilyInstalled.push(ext) require.extensions[ext] = function() {} // tslint:disable-line } } try { return dirname(require.resolve(scriptPath)) } finally { for (const ext of extsTemporarilyInstalled) { delete require.extensions[ext] // tslint:disable-line } } } return dir } /** * Evaluate a script. */ function evalAndExit (replService: ReplService, module: Module, code: string, isPrinted: boolean) { let result: any ;(global as any).__filename = module.filename ;(global as any).__dirname = dirname(module.filename) ;(global as any).exports = module.exports ;(global as any).module = module ;(global as any).require = module.require.bind(module) try { result = replService.evalCode(code) } catch (error) { if (error instanceof TSError) { console.error(error) process.exit(1) } throw error } if (isPrinted) { console.log(typeof result === 'string' ? result : inspect(result)) } } /** Safe `hasOwnProperty` */ function hasOwnProperty (object: any, property: string): boolean { return Object.prototype.hasOwnProperty.call(object, property) } if (require.main === module) { main() } ts-node-9.1.1/src/esm.ts000066400000000000000000000071671376344015600150420ustar00rootroot00000000000000import { register, getExtensions, RegisterOptions } from './index' import { parse as parseUrl, format as formatUrl, UrlWithStringQuery, fileURLToPath, pathToFileURL } from 'url' import { extname } from 'path' import * as assert from 'assert' const { createResolve } = require('../dist-raw/node-esm-resolve-implementation') // Note: On Windows, URLs look like this: file:///D:/dev/@TypeStrong/ts-node-examples/foo.ts export function registerAndCreateEsmHooks (opts?: RegisterOptions) { // Automatically performs registration just like `-r ts-node/register` const tsNodeInstance = register({ ...opts, experimentalEsmLoader: true }) // Custom implementation that considers additional file extensions and automatically adds file extensions const nodeResolveImplementation = createResolve({ ...getExtensions(tsNodeInstance.config), preferTsExts: tsNodeInstance.options.preferTsExts }) return { resolve, getFormat, transformSource } function isFileUrlOrNodeStyleSpecifier (parsed: UrlWithStringQuery) { // We only understand file:// URLs, but in node, the specifier can be a node-style `./foo` or `foo` const { protocol } = parsed return protocol === null || protocol === 'file:' } async function resolve (specifier: string, context: {parentURL: string}, defaultResolve: typeof resolve): Promise<{url: string}> { const defer = async () => { const r = await defaultResolve(specifier, context, defaultResolve) return r } const parsed = parseUrl(specifier) const { pathname, protocol, hostname } = parsed if (!isFileUrlOrNodeStyleSpecifier(parsed)) { return defer() } if (protocol !== null && protocol !== 'file:') { return defer() } // Malformed file:// URL? We should always see `null` or `''` if (hostname) { // TODO file://./foo sets `hostname` to `'.'`. Perhaps we should special-case this. return defer() } // pathname is the path to be resolved return nodeResolveImplementation.defaultResolve(specifier, context, defaultResolve) } type Format = 'builtin' | 'commonjs' | 'dynamic' | 'json' | 'module' | 'wasm' async function getFormat (url: string, context: {}, defaultGetFormat: typeof getFormat): Promise<{format: Format}> { const defer = (overrideUrl: string = url) => defaultGetFormat(overrideUrl, context, defaultGetFormat) const parsed = parseUrl(url) if (!isFileUrlOrNodeStyleSpecifier(parsed)) { return defer() } const { pathname } = parsed assert(pathname !== null, 'ESM getFormat() hook: URL should never have null pathname') const nativePath = fileURLToPath(url) // If file has .ts, .tsx, or .jsx extension, then ask node how it would treat this file if it were .js const ext = extname(nativePath) if (ext !== '.js' && !tsNodeInstance.ignored(nativePath)) { return defer(formatUrl(pathToFileURL(nativePath + '.js'))) } return defer() } async function transformSource (source: string | Buffer, context: {url: string, format: Format}, defaultTransformSource: typeof transformSource): Promise<{source: string | Buffer}> { const defer = () => defaultTransformSource(source, context, defaultTransformSource) const sourceAsString = typeof source === 'string' ? source : source.toString('utf8') const { url } = context const parsed = parseUrl(url) if (!isFileUrlOrNodeStyleSpecifier(parsed)) { return defer() } const nativePath = fileURLToPath(url) if (tsNodeInstance.ignored(nativePath)) { return defer() } const emittedJs = tsNodeInstance.compile(sourceAsString, nativePath) return { source: emittedJs } } } ts-node-9.1.1/src/externs.d.ts000066400000000000000000000001501376344015600161510ustar00rootroot00000000000000declare module 'util.promisify' { const _export: typeof import('util').promisify export = _export } ts-node-9.1.1/src/index.spec.ts000066400000000000000000001046501376344015600163110ustar00rootroot00000000000000import { expect } from 'chai' import { exec } from 'child_process' import { join } from 'path' import semver = require('semver') import ts = require('typescript') import proxyquire = require('proxyquire') import type * as tsNodeTypes from './index' import { unlinkSync, existsSync, lstatSync } from 'fs' import * as promisify from 'util.promisify' import { sync as rimrafSync } from 'rimraf' import type _createRequire from 'create-require' const createRequire: typeof _createRequire = require('create-require') import { pathToFileURL } from 'url' import Module = require('module') import { PassThrough } from 'stream' import * as getStream from 'get-stream' const execP = promisify(exec) const TEST_DIR = join(__dirname, '../tests') const PROJECT = join(TEST_DIR, 'tsconfig.json') const BIN_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node') const BIN_SCRIPT_PATH = join(TEST_DIR, 'node_modules/.bin/ts-node-script') const SOURCE_MAP_REGEXP = /\/\/# sourceMappingURL=data:application\/json;charset=utf\-8;base64,[\w\+]+=*$/ // `createRequire` does not exist on older node versions const testsDirRequire = createRequire(join(TEST_DIR, 'index.js')) // tslint:disable-line // Set after ts-node is installed locally let { register, create, VERSION, createRepl }: typeof tsNodeTypes = {} as any // Pack and install ts-node locally, necessary to test package "exports" before(async function () { this.timeout(5 * 60e3) rimrafSync(join(TEST_DIR, 'node_modules')) await execP(`npm install`, { cwd: TEST_DIR }) const packageLockPath = join(TEST_DIR, 'package-lock.json') existsSync(packageLockPath) && unlinkSync(packageLockPath) ;({ register, create, VERSION, createRepl } = testsDirRequire('ts-node')) }) describe('ts-node', function () { const cmd = `"${BIN_PATH}" --project "${PROJECT}"` const cmdNoProject = `"${BIN_PATH}"` this.timeout(10000) it('should export the correct version', function () { expect(VERSION).to.equal(require('../package.json').version) }) it('should export all CJS entrypoints', function () { // Ensure our package.json "exports" declaration allows `require()`ing all our entrypoints // https://github.com/TypeStrong/ts-node/pull/1026 testsDirRequire.resolve('ts-node') // only reliably way to ask node for the root path of a dependency is Path.resolve(require.resolve('ts-node/package'), '..') testsDirRequire.resolve('ts-node/package') testsDirRequire.resolve('ts-node/package.json') // All bin entrypoints for people who need to augment our CLI: `node -r otherstuff ./node_modules/ts-node/dist/bin` testsDirRequire.resolve('ts-node/dist/bin') testsDirRequire.resolve('ts-node/dist/bin.js') testsDirRequire.resolve('ts-node/dist/bin-transpile') testsDirRequire.resolve('ts-node/dist/bin-transpile.js') testsDirRequire.resolve('ts-node/dist/bin-script') testsDirRequire.resolve('ts-node/dist/bin-script.js') // Must be `require()`able obviously testsDirRequire.resolve('ts-node/register') testsDirRequire.resolve('ts-node/register/files') testsDirRequire.resolve('ts-node/register/transpile-only') testsDirRequire.resolve('ts-node/register/type-check') // `node --loader ts-node/esm` testsDirRequire.resolve('ts-node/esm') testsDirRequire.resolve('ts-node/esm.mjs') testsDirRequire.resolve('ts-node/esm/transpile-only') testsDirRequire.resolve('ts-node/esm/transpile-only.mjs') }) describe('cli', function () { this.slow(1000) it('should execute cli', function (done) { exec(`${cmd} tests/hello-world`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') return done() }) }) it('shows usage via --help', function (done) { exec(`${cmdNoProject} --help`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.match(/Usage: ts-node /) return done() }) }) it('shows version via -v', function (done) { exec(`${cmdNoProject} -v`, function (err, stdout) { expect(err).to.equal(null) expect(stdout.trim()).to.equal('v' + testsDirRequire('ts-node/package').version) return done() }) }) it('shows version of compiler via -vv', function (done) { exec(`${cmdNoProject} -vv`, function (err, stdout) { expect(err).to.equal(null) expect(stdout.trim()).to.equal( `ts-node v${ testsDirRequire('ts-node/package').version }\n` + `node ${ process.version }\n` + `compiler v${ testsDirRequire('typescript/package').version }` ) return done() }) }) it('should register via cli', function (done) { exec(`node -r ts-node/register hello-world.ts`, { cwd: TEST_DIR }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') return done() }) }) it('should execute cli with absolute path', function (done) { exec(`${cmd} "${join(TEST_DIR, 'hello-world')}"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') return done() }) }) it('should print scripts', function (done) { exec(`${cmd} -pe "import { example } from './tests/complex/index';example()"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('example\n') return done() }) }) it('should provide registered information globally', function (done) { exec(`${cmd} tests/env`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('object\n') return done() }) }) it('should provide registered information on register', function (done) { exec(`node -r ts-node/register env.ts`, { cwd: TEST_DIR }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('object\n') return done() }) }) if (semver.gte(ts.version, '1.8.0')) { it('should allow js', function (done) { exec( [ cmd, '-O "{\\\"allowJs\\\":true}"', '-pe "import { main } from \'./tests/allow-js/run\';main()"' ].join(' '), function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('hello world\n') return done() } ) }) it('should include jsx when `allow-js` true', function (done) { exec( [ cmd, '-O "{\\\"allowJs\\\":true}"', '-pe "import { Foo2 } from \'./tests/allow-js/with-jsx\'; Foo2.sayHi()"' ].join(' '), function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('hello world\n') return done() } ) }) } it('should eval code', function (done) { exec( `${cmd} -e "import * as m from './tests/module';console.log(m.example('test'))"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('TEST\n') return done() } ) }) it('should import empty files', function (done) { exec(`${cmd} -e "import './tests/empty'"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('') return done() }) }) it('should throw errors', function (done) { exec(`${cmd} -e "import * as m from './tests/module';console.log(m.example(123))"`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } expect(err.message).to.match(new RegExp( 'TS2345: Argument of type \'(?:number|123)\' ' + 'is not assignable to parameter of type \'string\'\\.' )) return done() }) }) it('should be able to ignore diagnostic', function (done) { exec( `${cmd} --ignore-diagnostics 2345 -e "import * as m from './tests/module';console.log(m.example(123))"`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } expect(err.message).to.match( /TypeError: (?:(?:undefined|foo\.toUpperCase) is not a function|.*has no method \'toUpperCase\')/ ) return done() } ) }) it('should work with source maps', function (done) { exec(`${cmd} tests/throw`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } expect(err.message).to.contain([ `${join(__dirname, '../tests/throw.ts')}:100`, ' bar () { throw new Error(\'this is a demo\') }', ' ^', 'Error: this is a demo' ].join('\n')) return done() }) }) it('eval should work with source maps', function (done) { exec(`${cmd} -pe "import './tests/throw'"`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } expect(err.message).to.contain([ `${join(__dirname, '../tests/throw.ts')}:100`, ' bar () { throw new Error(\'this is a demo\') }', ' ^' ].join('\n')) return done() }) }) it('should support transpile only mode', function (done) { exec(`${cmd} --transpile-only -pe "x"`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } expect(err.message).to.contain('ReferenceError: x is not defined') return done() }) }) it('should throw error even in transpileOnly mode', function (done) { exec(`${cmd} --transpile-only -pe "console."`, function (err) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } expect(err.message).to.contain('error TS1003: Identifier expected') return done() }) }) it('should pipe into `ts-node` and evaluate', function (done) { const cp = exec(cmd, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('hello\n') return done() }) cp.stdin!.end("console.log('hello')") }) it('should pipe into `ts-node`', function (done) { const cp = exec(`${cmd} -p`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('true\n') return done() }) cp.stdin!.end('true') }) it('should pipe into an eval script', function (done) { const cp = exec(`${cmd} --transpile-only -pe "process.stdin.isTTY"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('undefined\n') return done() }) cp.stdin!.end('true') }) it('should run REPL when --interactive passed and stdin is not a TTY', function (done) { const cp = exec(`${cmd} --interactive`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal( '> 123\n' + 'undefined\n' + '> ' ) return done() }) cp.stdin!.end('console.log("123")\n') }) it('REPL has command to get type information', function (done) { const cp = exec(`${cmd} --interactive`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal( '> undefined\n' + '> undefined\n' + '> const a: 123\n' + '> ' ) return done() }) cp.stdin!.end('\nconst a = 123\n.type a') }) it('REPL can be created via API', async () => { const stdin = new PassThrough() const stdout = new PassThrough() const stderr = new PassThrough() const replService = createRepl({ stdin, stdout, stderr }) const service = create(replService.evalAwarePartialHost) replService.setService(service) replService.start() stdin.write('\nconst a = 123\n.type a\n') stdin.end() await promisify(setTimeout)(1e3) stdout.end() stderr.end() expect(await getStream(stderr)).to.equal('') expect(await getStream(stdout)).to.equal( '> \'use strict\'\n' + '> undefined\n' + '> const a: 123\n' + '> ' ) }) it('should support require flags', function (done) { exec(`${cmd} -r ./tests/hello-world -pe "console.log('success')"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\nsuccess\nundefined\n') return done() }) }) it('should support require from node modules', function (done) { exec(`${cmd} -r typescript -e "console.log('success')"`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('success\n') return done() }) }) it('should use source maps with react tsx', function (done) { exec(`${cmd} tests/throw-react-tsx.tsx`, function (err, stdout) { expect(err).not.to.equal(null) expect(err!.message).to.contain([ `${join(__dirname, '../tests/throw-react-tsx.tsx')}:100`, ' bar () { throw new Error(\'this is a demo\') }', ' ^', 'Error: this is a demo' ].join('\n')) return done() }) }) it('should allow custom typings', function (done) { exec(`${cmd} tests/custom-types`, function (err, stdout) { expect(err).to.match(/Error: Cannot find module 'does-not-exist'/) return done() }) }) it('should preserve `ts-node` context with child process', function (done) { exec(`${cmd} tests/child-process`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') return done() }) }) it('should import js before ts by default', function (done) { exec(`${cmd} tests/import-order/compiled`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, JavaScript!\n') return done() }) }) it('should import ts before js when --prefer-ts-exts flag is present', function (done) { exec(`${cmd} --prefer-ts-exts tests/import-order/compiled`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, TypeScript!\n') return done() }) }) it('should import ts before js when TS_NODE_PREFER_TS_EXTS env is present', function (done) { exec(`${cmd} tests/import-order/compiled`, { env: { ...process.env, TS_NODE_PREFER_TS_EXTS: 'true' } }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, TypeScript!\n') return done() }) }) it('should ignore .d.ts files', function (done) { exec(`${cmd} tests/import-order/importer`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, World!\n') return done() }) }) describe('issue #884', function () { it('should compile', function (done) { // TODO disabled because it consistently fails on Windows on TS 2.7 if (process.platform === 'win32' && semver.satisfies(ts.version, '2.7')) { this.skip() } else { exec(`"${BIN_PATH}" --project tests/issue-884/tsconfig.json tests/issue-884`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('') return done() }) } }) }) describe('issue #986', function () { it('should not compile', function (done) { exec(`"${BIN_PATH}" --project tests/issue-986/tsconfig.json tests/issue-986`, function (err, stdout, stderr) { expect(err).not.to.equal(null) expect(stderr).to.contain('Cannot find name \'TEST\'') // TypeScript error. expect(stdout).to.equal('') return done() }) }) it('should compile with `--files`', function (done) { exec(`"${BIN_PATH}" --files --project tests/issue-986/tsconfig.json tests/issue-986`, function (err, stdout, stderr) { expect(err).not.to.equal(null) expect(stderr).to.contain('ReferenceError: TEST is not defined') // Runtime error. expect(stdout).to.equal('') return done() }) }) }) if (semver.gte(ts.version, '2.7.0')) { it('should support script mode', function (done) { exec(`${BIN_SCRIPT_PATH} tests/scope/a/log`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('.ts\n') return done() }) }) it('should read tsconfig relative to realpath, not symlink, in scriptMode', function (done) { if (lstatSync(join(TEST_DIR, 'main-realpath/symlink/symlink.tsx')).isSymbolicLink()) { exec(`${BIN_SCRIPT_PATH} tests/main-realpath/symlink/symlink.tsx`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('') return done() }) } else { this.skip() } }) } describe('should read ts-node options from tsconfig.json', function () { const BIN_EXEC = `"${BIN_PATH}" --project tests/tsconfig-options/tsconfig.json` it('should override compiler options from env', function (done) { exec(`${BIN_EXEC} tests/tsconfig-options/log-options1.js`, { env: { ...process.env, TS_NODE_COMPILER_OPTIONS: '{"typeRoots": ["env-typeroots"]}' } }, function (err, stdout) { expect(err).to.equal(null) const { config } = JSON.parse(stdout) expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/env-typeroots').replace(/\\/g, '/')]) return done() }) }) it('should use options from `tsconfig.json`', function (done) { exec(`${BIN_EXEC} tests/tsconfig-options/log-options1.js`, function (err, stdout) { expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']) expect(options.pretty).to.equal(undefined) expect(options.skipIgnore).to.equal(false) expect(options.transpileOnly).to.equal(true) expect(options.require).to.deep.equal([join(__dirname, '../tests/tsconfig-options/required1.js')]) return done() }) }) it('should have flags override / merge with `tsconfig.json`', function (done) { exec(`${BIN_EXEC} --skip-ignore --compiler-options "{\\"types\\":[\\"flags-types\\"]}" --require ./tests/tsconfig-options/required2.js tests/tsconfig-options/log-options2.js`, function (err, stdout) { expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) expect(config.options.types).to.deep.equal(['flags-types']) expect(options.pretty).to.equal(undefined) expect(options.skipIgnore).to.equal(true) expect(options.transpileOnly).to.equal(true) expect(options.require).to.deep.equal([ join(__dirname, '../tests/tsconfig-options/required1.js'), './tests/tsconfig-options/required2.js' ]) return done() }) }) it('should have `tsconfig.json` override environment', function (done) { exec(`${BIN_EXEC} tests/tsconfig-options/log-options1.js`, { env: { ...process.env, TS_NODE_PRETTY: 'true', TS_NODE_SKIP_IGNORE: 'true' } }, function (err, stdout) { expect(err).to.equal(null) const { options, config } = JSON.parse(stdout) expect(config.options.typeRoots).to.deep.equal([join(__dirname, '../tests/tsconfig-options/tsconfig-typeroots').replace(/\\/g, '/')]) expect(config.options.types).to.deep.equal(['tsconfig-tsnode-types']) expect(options.pretty).to.equal(true) expect(options.skipIgnore).to.equal(false) expect(options.transpileOnly).to.equal(true) expect(options.require).to.deep.equal([join(__dirname, '../tests/tsconfig-options/required1.js')]) return done() }) }) }) describe('compiler host', function () { it('should execute cli', function (done) { exec(`${cmd} --compiler-host tests/hello-world`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('Hello, world!\n') return done() }) }) }) it('should transpile files inside a node_modules directory when not ignored', function (done) { exec(`${cmdNoProject} --script-mode tests/from-node-modules/from-node-modules`, function (err, stdout, stderr) { if (err) return done(`Unexpected error: ${err}\nstdout:\n${stdout}\nstderr:\n${stderr}`) expect(JSON.parse(stdout)).to.deep.equal({ external: { tsmri: { name: 'typescript-module-required-internally' }, jsmri: { name: 'javascript-module-required-internally' }, tsmii: { name: 'typescript-module-imported-internally' }, jsmii: { name: 'javascript-module-imported-internally' } }, tsmie: { name: 'typescript-module-imported-externally' }, jsmie: { name: 'javascript-module-imported-externally' }, tsmre: { name: 'typescript-module-required-externally' }, jsmre: { name: 'javascript-module-required-externally' } }) done() }) }) describe('should respect maxNodeModulesJsDepth', function () { it('for unscoped modules', function (done) { exec(`${cmdNoProject} --script-mode tests/maxnodemodulesjsdepth`, function (err, stdout, stderr) { expect(err).to.not.equal(null) expect(stderr.replace(/\r\n/g, '\n')).to.contain( 'TSError: ⨯ Unable to compile TypeScript:\n' + "other.ts(4,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + '\n' ) done() }) }) it('for @scoped modules', function (done) { exec(`${cmdNoProject} --script-mode tests/maxnodemodulesjsdepth-scoped`, function (err, stdout, stderr) { expect(err).to.not.equal(null) expect(stderr.replace(/\r\n/g, '\n')).to.contain( 'TSError: ⨯ Unable to compile TypeScript:\n' + "other.ts(7,7): error TS2322: Type 'string' is not assignable to type 'boolean'.\n" + '\n' ) done() }) }) }) }) describe('register', function () { let registered: tsNodeTypes.Service let moduleTestPath: string before(() => { registered = register({ project: PROJECT, compilerOptions: { jsx: 'preserve' } }) moduleTestPath = require.resolve('../tests/module') }) afterEach(() => { // Re-enable project after every test. registered.enabled(true) }) it('should be able to require typescript', function () { const m = require(moduleTestPath) expect(m.example('foo')).to.equal('FOO') }) it('should support dynamically disabling', function () { delete require.cache[moduleTestPath] expect(registered.enabled(false)).to.equal(false) expect(() => require(moduleTestPath)).to.throw(/Unexpected token/) delete require.cache[moduleTestPath] expect(registered.enabled()).to.equal(false) expect(() => require(moduleTestPath)).to.throw(/Unexpected token/) delete require.cache[moduleTestPath] expect(registered.enabled(true)).to.equal(true) expect(() => require(moduleTestPath)).to.not.throw() delete require.cache[moduleTestPath] expect(registered.enabled()).to.equal(true) expect(() => require(moduleTestPath)).to.not.throw() }) if (semver.gte(ts.version, '2.7.0')) { it('should support compiler scopes', function () { const calls: string[] = [] registered.enabled(false) const compilers = [ register({ dir: join(TEST_DIR, 'scope/a'), scope: true }), register({ dir: join(TEST_DIR, 'scope/b'), scope: true }) ] compilers.forEach(c => { const old = c.compile c.compile = (code, fileName, lineOffset) => { calls.push(fileName) return old(code, fileName, lineOffset) } }) try { expect(require('../tests/scope/a').ext).to.equal('.ts') expect(require('../tests/scope/b').ext).to.equal('.ts') } finally { compilers.forEach(c => c.enabled(false)) } expect(calls).to.deep.equal([ join(TEST_DIR, 'scope/a/index.ts'), join(TEST_DIR, 'scope/b/index.ts') ]) delete require.cache[moduleTestPath] expect(() => require(moduleTestPath)).to.throw() }) } it('should compile through js and ts', function () { const m = require('../tests/complex') expect(m.example()).to.equal('example') }) it('should work with proxyquire', function () { const m = proxyquire('../tests/complex', { './example': 'hello' }) expect(m.example()).to.equal('hello') }) it('should work with `require.cache`', function () { const { example1, example2 } = require('../tests/require-cache') expect(example1).to.not.equal(example2) }) it('should use source maps', function (done) { try { require('../tests/throw') } catch (error) { expect(error.stack).to.contain([ 'Error: this is a demo', ` at Foo.bar (${join(__dirname, '../tests/throw.ts')}:100:18)` ].join('\n')) done() } }) describe('JSX preserve', () => { let old: (m: Module, filename: string) => any let compiled: string before(function () { old = require.extensions['.tsx']! // tslint:disable-line require.extensions['.tsx'] = (m: any, fileName) => { // tslint:disable-line const _compile = m._compile m._compile = (code: string, fileName: string) => { compiled = code return _compile.call(this, code, fileName) } return old(m, fileName) } }) after(function () { require.extensions['.tsx'] = old // tslint:disable-line }) it('should use source maps', function (done) { try { require('../tests/with-jsx.tsx') } catch (error) { expect(error.stack).to.contain('SyntaxError: Unexpected token') } expect(compiled).to.match(SOURCE_MAP_REGEXP) done() }) }) }) describe('create', () => { let service: tsNodeTypes.Service before(() => { service = create({ compilerOptions: { target: 'es5' }, skipProject: true }) }) it('should create generic compiler instances', () => { const output = service.compile('const x = 10', 'test.ts') expect(output).to.contain('var x = 10;') }) describe('should get type information', () => { it('given position of identifier', () => { expect(service.getTypeInfo('/**jsdoc here*/const x = 10', 'test.ts', 21)).to.deep.equal({ comment: 'jsdoc here', name: 'const x: 10' }) }) it('given position that does not point to an identifier', () => { expect(service.getTypeInfo('/**jsdoc here*/const x = 10', 'test.ts', 0)).to.deep.equal({ comment: '', name: '' }) }) }) }) describe('issue #1098', () => { function testIgnored (ignored: tsNodeTypes.Service['ignored'], allowed: string[], disallowed: string[]) { for (const ext of allowed) { expect(ignored(join(__dirname, `index${ext}`))).equal(false, `should accept ${ext} files`) } for (const ext of disallowed) { expect(ignored(join(__dirname, `index${ext}`))).equal(true, `should ignore ${ext} files`) } } it('correctly filters file extensions from the compiler when allowJs=false and jsx=false', () => { const { ignored } = create({ compilerOptions: { }, skipProject: true }) testIgnored(ignored, ['.ts', '.d.ts'], ['.js', '.tsx', '.jsx', '.mjs', '.cjs', '.xyz', '']) }) it('correctly filters file extensions from the compiler when allowJs=true and jsx=false', () => { const { ignored } = create({ compilerOptions: { allowJs: true }, skipProject: true }) testIgnored(ignored, ['.ts', '.js', '.d.ts'], ['.tsx', '.jsx', '.mjs', '.cjs', '.xyz', '']) }) it('correctly filters file extensions from the compiler when allowJs=false and jsx=true', () => { const { ignored } = create({ compilerOptions: { allowJs: false, jsx: 'preserve' }, skipProject: true }) testIgnored(ignored, ['.ts', '.tsx', '.d.ts'], ['.js', '.jsx', '.mjs', '.cjs', '.xyz', '']) }) it('correctly filters file extensions from the compiler when allowJs=true and jsx=true', () => { const { ignored } = create({ compilerOptions: { allowJs: true, jsx: 'preserve' }, skipProject: true }) testIgnored(ignored, ['.ts', '.tsx', '.js', '.jsx', '.d.ts'], ['.mjs', '.cjs', '.xyz', '']) }) }) describe('esm', () => { this.slow(1000) const cmd = `node --loader ts-node/esm` if (semver.gte(process.version, '13.0.0')) { it('should compile and execute as ESM', (done) => { exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm') }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('foo bar baz biff libfoo\n') return done() }) }) it('should use source maps', function (done) { exec(`${cmd} throw.ts`, { cwd: join(__dirname, '../tests/esm') }, function (err, stdout) { expect(err).not.to.equal(null) expect(err!.message).to.contain([ `${pathToFileURL(join(__dirname, '../tests/esm/throw.ts'))}:100`, ' bar () { throw new Error(\'this is a demo\') }', ' ^', 'Error: this is a demo' ].join('\n')) return done() }) }) describe('supports experimental-specifier-resolution=node', () => { it('via --experimental-specifier-resolution', (done) => { exec(`${cmd} --experimental-specifier-resolution=node index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver') }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('foo bar baz biff libfoo\n') return done() }) }) it('via --es-module-specifier-resolution alias', (done) => { exec(`${cmd} --experimental-modules --es-module-specifier-resolution=node index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver') }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('foo bar baz biff libfoo\n') return done() }) }) it('via NODE_OPTIONS', (done) => { exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm-node-resolver'), env: { ...process.env, NODE_OPTIONS: '--experimental-specifier-resolution=node' } }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('foo bar baz biff libfoo\n') return done() }) }) }) it('throws ERR_REQUIRE_ESM when attempting to require() an ESM script while ESM loader is enabled', function (done) { exec(`${cmd} ./index.js`, { cwd: join(__dirname, '../tests/esm-err-require-esm') }, function (err, stdout, stderr) { expect(err).to.not.equal(null) expect(stderr).to.contain('Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:') return done() }) }) it('defers to fallback loaders when URL should not be handled by ts-node', function (done) { exec(`${cmd} index.mjs`, { cwd: join(__dirname, '../tests/esm-import-http-url') }, function (err, stdout, stderr) { expect(err).to.not.equal(null) // expect error from node's default resolver expect(stderr).to.match(/Error \[ERR_UNSUPPORTED_ESM_URL_SCHEME\]:.*(?:\n.*){0,1}\n *at defaultResolve/) return done() }) }) it('should bypass import cache when changing search params', (done) => { exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm-import-cache') }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('log1\nlog2\nlog2\n') return done() }) }) it('should support transpile only mode via dedicated loader entrypoint', (done) => { exec(`${cmd}/transpile-only index.ts`, { cwd: join(__dirname, '../tests/esm-transpile-only') }, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('') return done() }) }) it('should throw type errors without transpile-only enabled', (done) => { exec(`${cmd} index.ts`, { cwd: join(__dirname, '../tests/esm-transpile-only') }, function (err, stdout) { if (err === null) { return done('Command was expected to fail, but it succeeded.') } expect(err.message).to.contain('Unable to compile TypeScript') expect(err.message).to.match(new RegExp('TS2345: Argument of type \'(?:number|1101)\' is not assignable to parameter of type \'string\'\\.')) expect(err.message).to.match(new RegExp('TS2322: Type \'(?:"hello world"|string)\' is not assignable to type \'number\'\\.')) expect(stdout).to.equal('') return done() }) }) } it('executes ESM as CJS, ignoring package.json "types" field (for backwards compatibility; should be changed in next major release to throw ERR_REQUIRE_ESM)', function (done) { exec(`${BIN_PATH} ./tests/esm-err-require-esm/index.js`, function (err, stdout) { expect(err).to.equal(null) expect(stdout).to.equal('CommonJS\n') return done() }) }) }) }) ts-node-9.1.1/src/index.ts000066400000000000000000001236031376344015600153570ustar00rootroot00000000000000import { relative, basename, extname, resolve, dirname, join } from 'path' import sourceMapSupport = require('source-map-support') import * as ynModule from 'yn' import { BaseError } from 'make-error' import * as util from 'util' import { fileURLToPath } from 'url' import type * as _ts from 'typescript' import { Module, createRequire as nodeCreateRequire, createRequireFromPath as nodeCreateRequireFromPath } from 'module' import type _createRequire from 'create-require' // tslint:disable-next-line const createRequire = nodeCreateRequire ?? nodeCreateRequireFromPath ?? require('create-require') as typeof _createRequire export { createRepl, CreateReplOptions, ReplService } from './repl' /** * Does this version of node obey the package.json "type" field * and throw ERR_REQUIRE_ESM when attempting to require() an ESM modules. */ const engineSupportsPackageTypeField = parseInt(process.versions.node.split('.')[0], 10) >= 12 // Loaded conditionally so we don't need to support older node versions let assertScriptCanLoadAsCJSImpl: ((filename: string) => void) | undefined /** * Assert that script can be loaded as CommonJS when we attempt to require it. * If it should be loaded as ESM, throw ERR_REQUIRE_ESM like node does. */ function assertScriptCanLoadAsCJS (filename: string) { if (!engineSupportsPackageTypeField) return if (!assertScriptCanLoadAsCJSImpl) assertScriptCanLoadAsCJSImpl = require('../dist-raw/node-cjs-loader-utils').assertScriptCanLoadAsCJSImpl assertScriptCanLoadAsCJSImpl!(filename) } /** * Registered `ts-node` instance information. */ export const REGISTER_INSTANCE = Symbol.for('ts-node.register.instance') /** * Expose `REGISTER_INSTANCE` information on node.js `process`. */ declare global { namespace NodeJS { interface Process { [REGISTER_INSTANCE]?: Service } } } /** * @internal */ export const INSPECT_CUSTOM = util.inspect.custom || 'inspect' /** * Wrapper around yn module that returns `undefined` instead of `null`. * This is implemented by yn v4, but we're staying on v3 to avoid v4's node 10 requirement. */ function yn (value: string | undefined) { return ynModule(value) ?? undefined } /** * Debugging `ts-node`. */ const shouldDebug = yn(process.env.TS_NODE_DEBUG) /** @internal */ export const debug = shouldDebug ? (...args: any) => console.log(`[ts-node ${new Date().toISOString()}]`, ...args) : () => undefined const debugFn = shouldDebug ? (key: string, fn: (arg: T) => U) => { let i = 0 return (x: T) => { debug(key, x, ++i) return fn(x) } } : (_: string, fn: (arg: T) => U) => fn /** * Common TypeScript interfaces between versions. */ export interface TSCommon { version: typeof _ts.version sys: typeof _ts.sys ScriptSnapshot: typeof _ts.ScriptSnapshot displayPartsToString: typeof _ts.displayPartsToString createLanguageService: typeof _ts.createLanguageService getDefaultLibFilePath: typeof _ts.getDefaultLibFilePath getPreEmitDiagnostics: typeof _ts.getPreEmitDiagnostics flattenDiagnosticMessageText: typeof _ts.flattenDiagnosticMessageText transpileModule: typeof _ts.transpileModule ModuleKind: typeof _ts.ModuleKind ScriptTarget: typeof _ts.ScriptTarget findConfigFile: typeof _ts.findConfigFile readConfigFile: typeof _ts.readConfigFile parseJsonConfigFileContent: typeof _ts.parseJsonConfigFileContent formatDiagnostics: typeof _ts.formatDiagnostics formatDiagnosticsWithColorAndContext: typeof _ts.formatDiagnosticsWithColorAndContext } /** * Compiler APIs we use that are marked internal and not included in TypeScript's public API declarations */ interface TSInternal { // https://github.com/microsoft/TypeScript/blob/4a34294908bed6701dcba2456ca7ac5eafe0ddff/src/compiler/core.ts#L1906-L1909 createGetCanonicalFileName (useCaseSensitiveFileNames: boolean): TSInternal.GetCanonicalFileName } namespace TSInternal { // https://github.com/microsoft/TypeScript/blob/4a34294908bed6701dcba2456ca7ac5eafe0ddff/src/compiler/core.ts#L1906 export type GetCanonicalFileName = (fileName: string) => string } /** * Export the current version. */ export const VERSION = require('../package.json').version /** * Options for creating a new TypeScript compiler instance. */ export interface CreateOptions { /** * Specify working directory for config resolution. * * @default process.cwd() */ dir?: string /** * Emit output files into `.ts-node` directory. * * @default false */ emit?: boolean /** * Scope compiler to files within `cwd`. * * @default false */ scope?: boolean /** * Use pretty diagnostic formatter. * * @default false */ pretty?: boolean /** * Use TypeScript's faster `transpileModule`. * * @default false */ transpileOnly?: boolean /** * **DEPRECATED** Specify type-check is enabled (e.g. `transpileOnly == false`). * * @default true */ typeCheck?: boolean /** * Use TypeScript's compiler host API. * * @default false */ compilerHost?: boolean /** * Logs TypeScript errors to stderr instead of throwing exceptions. * * @default false */ logError?: boolean /** * Load files from `tsconfig.json` on startup. * * @default false */ files?: boolean /** * Specify a custom TypeScript compiler. * * @default "typescript" */ compiler?: string /** * Override the path patterns to skip compilation. * * @default /node_modules/ * @docsDefault "/node_modules/" */ ignore?: string[] /** * Path to TypeScript JSON project file. */ project?: string /** * Skip project config resolution and loading. * * @default false */ skipProject?: boolean /** * Skip ignore check. * * @default false */ skipIgnore?: boolean /** * JSON object to merge with compiler options. * * @allOf [{"$ref": "https://schemastore.azurewebsites.net/schemas/json/tsconfig.json#definitions/compilerOptionsDefinition/properties/compilerOptions"}] */ compilerOptions?: object /** * Ignore TypeScript warnings by diagnostic code. */ ignoreDiagnostics?: Array /** * Modules to require, like node's `--require` flag. * * If specified in tsconfig.json, the modules will be resolved relative to the tsconfig.json file. * * If specified programmatically, each input string should be pre-resolved to an absolute path for * best results. */ require?: Array readFile?: (path: string) => string | undefined fileExists?: (path: string) => boolean transformers?: _ts.CustomTransformers | ((p: _ts.Program) => _ts.CustomTransformers) /** * True if require() hooks should interop with experimental ESM loader. * Enabled explicitly via a flag since it is a breaking change. * @internal */ experimentalEsmLoader?: boolean } /** * Options for registering a TypeScript compiler instance globally. */ export interface RegisterOptions extends CreateOptions { /** * Re-order file extensions so that TypeScript imports are preferred. * * @default false */ preferTsExts?: boolean } /** * Must be an interface to support `typescript-json-schema`. */ export interface TsConfigOptions extends Omit {} /** * Like `Object.assign`, but ignores `undefined` properties. */ function assign (initialValue: T, ...sources: Array): T { for (const source of sources) { for (const key of Object.keys(source)) { const value = (source as any)[key] if (value !== undefined) (initialValue as any)[key] = value } } return initialValue } /** * Information retrieved from type info check. */ export interface TypeInfo { name: string comment: string } /** * Default register options, including values specified via environment * variables. */ export const DEFAULTS: RegisterOptions = { dir: process.env.TS_NODE_DIR, emit: yn(process.env.TS_NODE_EMIT), scope: yn(process.env.TS_NODE_SCOPE), files: yn(process.env.TS_NODE_FILES), pretty: yn(process.env.TS_NODE_PRETTY), compiler: process.env.TS_NODE_COMPILER, compilerOptions: parse(process.env.TS_NODE_COMPILER_OPTIONS), ignore: split(process.env.TS_NODE_IGNORE), project: process.env.TS_NODE_PROJECT, skipProject: yn(process.env.TS_NODE_SKIP_PROJECT), skipIgnore: yn(process.env.TS_NODE_SKIP_IGNORE), preferTsExts: yn(process.env.TS_NODE_PREFER_TS_EXTS), ignoreDiagnostics: split(process.env.TS_NODE_IGNORE_DIAGNOSTICS), transpileOnly: yn(process.env.TS_NODE_TRANSPILE_ONLY), typeCheck: yn(process.env.TS_NODE_TYPE_CHECK), compilerHost: yn(process.env.TS_NODE_COMPILER_HOST), logError: yn(process.env.TS_NODE_LOG_ERROR), experimentalEsmLoader: false } /** * TypeScript compiler option values required by `ts-node` which cannot be overridden. */ const TS_NODE_COMPILER_OPTIONS = { sourceMap: true, inlineSourceMap: false, inlineSources: true, declaration: false, noEmit: false, outDir: '.ts-node' } /** * Split a string array of values. */ export function split (value: string | undefined) { return typeof value === 'string' ? value.split(/ *, */g) : undefined } /** * Parse a string as JSON. */ export function parse (value: string | undefined): object | undefined { return typeof value === 'string' ? JSON.parse(value) : undefined } /** * Replace backslashes with forward slashes. */ export function normalizeSlashes (value: string): string { return value.replace(/\\/g, '/') } /** * TypeScript diagnostics error. */ export class TSError extends BaseError { name = 'TSError' constructor (public diagnosticText: string, public diagnosticCodes: number[]) { super(`⨯ Unable to compile TypeScript:\n${diagnosticText}`) } /** * @internal */ [INSPECT_CUSTOM] () { return this.diagnosticText } } /** * Primary ts-node service, which wraps the TypeScript API and can compile TypeScript to JavaScript */ export interface Service { ts: TSCommon config: _ts.ParsedCommandLine options: RegisterOptions enabled (enabled?: boolean): boolean ignored (fileName: string): boolean compile (code: string, fileName: string, lineOffset?: number): string getTypeInfo (code: string, fileName: string, position: number): TypeInfo } /** * Re-export of `Service` interface for backwards-compatibility * @deprecated use `Service` instead * @see Service */ export type Register = Service /** * Cached fs operation wrapper. */ function cachedLookup (fn: (arg: string) => T): (arg: string) => T { const cache = new Map() return (arg: string): T => { if (!cache.has(arg)) { cache.set(arg, fn(arg)) } return cache.get(arg)! } } /** @internal */ export function getExtensions (config: _ts.ParsedCommandLine) { const tsExtensions = ['.ts'] const jsExtensions = [] // Enable additional extensions when JSX or `allowJs` is enabled. if (config.options.jsx) tsExtensions.push('.tsx') if (config.options.allowJs) jsExtensions.push('.js') if (config.options.jsx && config.options.allowJs) jsExtensions.push('.jsx') return { tsExtensions, jsExtensions } } /** * Register TypeScript compiler instance onto node.js */ export function register (opts: RegisterOptions = {}): Service { const originalJsHandler = require.extensions['.js'] // tslint:disable-line const service = create(opts) const { tsExtensions, jsExtensions } = getExtensions(service.config) const extensions = [...tsExtensions, ...jsExtensions] // Expose registered instance globally. process[REGISTER_INSTANCE] = service // Register the extensions. registerExtensions(service.options.preferTsExts, extensions, service, originalJsHandler) // Require specified modules before start-up. ;(Module as any)._preloadModules(service.options.require) return service } /** * Create TypeScript compiler instance. */ export function create (rawOptions: CreateOptions = {}): Service { const dir = rawOptions.dir ?? DEFAULTS.dir const compilerName = rawOptions.compiler ?? DEFAULTS.compiler const cwd = dir ? resolve(dir) : process.cwd() /** * Load the typescript compiler. It is required to load the tsconfig but might * be changed by the tsconfig, so we sometimes have to do this twice. */ function loadCompiler (name: string | undefined) { const compiler = require.resolve(name || 'typescript', { paths: [cwd, __dirname] }) const ts: typeof _ts = require(compiler) return { compiler, ts } } // Compute minimum options to read the config file. let { compiler, ts } = loadCompiler(compilerName) // Read config file and merge new options between env and CLI options. const { config, options: tsconfigOptions } = readConfig(cwd, ts, rawOptions) const options = assign({}, DEFAULTS, tsconfigOptions || {}, rawOptions) options.require = [ ...tsconfigOptions.require || [], ...rawOptions.require || [] ] // If `compiler` option changed based on tsconfig, re-load the compiler. if (options.compiler !== compilerName) { ({ compiler, ts } = loadCompiler(options.compiler)) } const readFile = options.readFile || ts.sys.readFile const fileExists = options.fileExists || ts.sys.fileExists // typeCheck can override transpileOnly, useful for CLI flag to override config file const transpileOnly = options.transpileOnly === true && options.typeCheck !== true const transformers = options.transformers || undefined const ignoreDiagnostics = [ 6059, // "'rootDir' is expected to contain all source files." 18002, // "The 'files' list in config file is empty." 18003, // "No inputs were found in config file." ...(options.ignoreDiagnostics || []) ].map(Number) const configDiagnosticList = filterDiagnostics(config.errors, ignoreDiagnostics) const outputCache = new Map() const isScoped = options.scope ? (relname: string) => relname.charAt(0) !== '.' : () => true const shouldIgnore = createIgnore(options.skipIgnore ? [] : ( options.ignore || ['(?:^|/)node_modules/'] ).map(str => new RegExp(str))) const diagnosticHost: _ts.FormatDiagnosticsHost = { getNewLine: () => ts.sys.newLine, getCurrentDirectory: () => cwd, getCanonicalFileName: ts.sys.useCaseSensitiveFileNames ? x => x : x => x.toLowerCase() } // Install source map support and read from memory cache. sourceMapSupport.install({ environment: 'node', retrieveFile (pathOrUrl: string) { let path = pathOrUrl // If it's a file URL, convert to local path // Note: fileURLToPath does not exist on early node v10 // I could not find a way to handle non-URLs except to swallow an error if (options.experimentalEsmLoader && path.startsWith('file://')) { try { path = fileURLToPath(path) } catch (e) {/* swallow error */} } path = normalizeSlashes(path) return outputCache.get(path)?.content || '' } }) const formatDiagnostics = process.stdout.isTTY || options.pretty ? (ts.formatDiagnosticsWithColorAndContext || ts.formatDiagnostics) : ts.formatDiagnostics function createTSError (diagnostics: ReadonlyArray<_ts.Diagnostic>) { const diagnosticText = formatDiagnostics(diagnostics, diagnosticHost) const diagnosticCodes = diagnostics.map(x => x.code) return new TSError(diagnosticText, diagnosticCodes) } function reportTSError (configDiagnosticList: _ts.Diagnostic[]) { const error = createTSError(configDiagnosticList) if (options.logError) { // Print error in red color and continue execution. console.error('\x1b[31m%s\x1b[0m', error) } else { // Throw error and exit the script. throw error } } // Render the configuration errors. if (configDiagnosticList.length) reportTSError(configDiagnosticList) /** * Get the extension for a transpiled file. */ const getExtension = config.options.jsx === ts.JsxEmit.Preserve ? ((path: string) => /\.[tj]sx$/.test(path) ? '.jsx' : '.js') : ((_: string) => '.js') /** * Create the basic required function using transpile mode. */ let getOutput: (code: string, fileName: string) => SourceOutput let getTypeInfo: (_code: string, _fileName: string, _position: number) => TypeInfo const getCanonicalFileName = (ts as unknown as TSInternal).createGetCanonicalFileName(ts.sys.useCaseSensitiveFileNames) // In a factory because these are shared across both CompilerHost and LanguageService codepaths function createResolverFunctions (serviceHost: _ts.ModuleResolutionHost) { const moduleResolutionCache = ts.createModuleResolutionCache(cwd, getCanonicalFileName, config.options) const knownInternalFilenames = new Set() /** "Buckets" (module directories) whose contents should be marked "internal" */ const internalBuckets = new Set() // Get bucket for a source filename. Bucket is the containing `./node_modules/*/` directory // For '/project/node_modules/foo/node_modules/bar/lib/index.js' bucket is '/project/node_modules/foo/node_modules/bar/' // For '/project/node_modules/foo/node_modules/@scope/bar/lib/index.js' bucket is '/project/node_modules/foo/node_modules/@scope/bar/' const moduleBucketRe = /.*\/node_modules\/(?:@[^\/]+\/)?[^\/]+\// function getModuleBucket (filename: string) { const find = moduleBucketRe.exec(filename) if (find) return find[0] return '' } // Mark that this file and all siblings in its bucket should be "internal" function markBucketOfFilenameInternal (filename: string) { internalBuckets.add(getModuleBucket(filename)) } function isFileInInternalBucket (filename: string) { return internalBuckets.has(getModuleBucket(filename)) } function isFileKnownToBeInternal (filename: string) { return knownInternalFilenames.has(filename) } /** * If we need to emit JS for a file, force TS to consider it non-external */ const fixupResolvedModule = (resolvedModule: _ts.ResolvedModule | _ts.ResolvedTypeReferenceDirective) => { const { resolvedFileName } = resolvedModule if (resolvedFileName === undefined) return // .ts is always switched to internal // .js is switched on-demand if ( resolvedModule.isExternalLibraryImport && ( (resolvedFileName.endsWith('.ts') && !resolvedFileName.endsWith('.d.ts')) || isFileKnownToBeInternal(resolvedFileName) || isFileInInternalBucket(resolvedFileName) ) ) { resolvedModule.isExternalLibraryImport = false } if (!resolvedModule.isExternalLibraryImport) { knownInternalFilenames.add(resolvedFileName) } } /* * NOTE: * Older ts versions do not pass `redirectedReference` nor `options`. * We must pass `redirectedReference` to newer ts versions, but cannot rely on `options`, hence the weird argument name */ const resolveModuleNames: _ts.LanguageServiceHost['resolveModuleNames'] = (moduleNames: string[], containingFile: string, reusedNames: string[] | undefined, redirectedReference: _ts.ResolvedProjectReference | undefined, optionsOnlyWithNewerTsVersions: _ts.CompilerOptions): (_ts.ResolvedModule | undefined)[] => { return moduleNames.map(moduleName => { const { resolvedModule } = ts.resolveModuleName(moduleName, containingFile, config.options, serviceHost, moduleResolutionCache, redirectedReference) if (resolvedModule) { fixupResolvedModule(resolvedModule) } return resolvedModule }) } // language service never calls this, but TS docs recommend that we implement it const getResolvedModuleWithFailedLookupLocationsFromCache: _ts.LanguageServiceHost['getResolvedModuleWithFailedLookupLocationsFromCache'] = (moduleName, containingFile): _ts.ResolvedModuleWithFailedLookupLocations | undefined => { const ret = ts.resolveModuleNameFromCache(moduleName, containingFile, moduleResolutionCache) if (ret && ret.resolvedModule) { fixupResolvedModule(ret.resolvedModule) } return ret } const resolveTypeReferenceDirectives: _ts.LanguageServiceHost['resolveTypeReferenceDirectives'] = (typeDirectiveNames: string[], containingFile: string, redirectedReference: _ts.ResolvedProjectReference | undefined, options: _ts.CompilerOptions): (_ts.ResolvedTypeReferenceDirective | undefined)[] => { // Note: seems to be called with empty typeDirectiveNames array for all files. return typeDirectiveNames.map(typeDirectiveName => { const { resolvedTypeReferenceDirective } = ts.resolveTypeReferenceDirective(typeDirectiveName, containingFile, config.options, serviceHost, redirectedReference) if (resolvedTypeReferenceDirective) { fixupResolvedModule(resolvedTypeReferenceDirective) } return resolvedTypeReferenceDirective }) } return { resolveModuleNames, getResolvedModuleWithFailedLookupLocationsFromCache, resolveTypeReferenceDirectives, isFileKnownToBeInternal, markBucketOfFilenameInternal } } // Use full language services when the fast option is disabled. if (!transpileOnly) { const fileContents = new Map() const rootFileNames = new Set(config.fileNames) const cachedReadFile = cachedLookup(debugFn('readFile', readFile)) // Use language services by default (TODO: invert next major version). if (!options.compilerHost) { let projectVersion = 1 const fileVersions = new Map(Array.from(rootFileNames).map(fileName => [fileName, 0])) const getCustomTransformers = () => { if (typeof transformers === 'function') { const program = service.getProgram() return program ? transformers(program) : undefined } return transformers } // Create the compiler host for type checking. const serviceHost: _ts.LanguageServiceHost & Required> = { getProjectVersion: () => String(projectVersion), getScriptFileNames: () => Array.from(rootFileNames), getScriptVersion: (fileName: string) => { const version = fileVersions.get(fileName) return version ? version.toString() : '' }, getScriptSnapshot (fileName: string) { // TODO ordering of this with getScriptVersion? Should they sync up? let contents = fileContents.get(fileName) // Read contents into TypeScript memory cache. if (contents === undefined) { contents = cachedReadFile(fileName) if (contents === undefined) return fileVersions.set(fileName, 1) fileContents.set(fileName, contents) projectVersion++ } return ts.ScriptSnapshot.fromString(contents) }, readFile: cachedReadFile, readDirectory: ts.sys.readDirectory, getDirectories: cachedLookup(debugFn('getDirectories', ts.sys.getDirectories)), fileExists: cachedLookup(debugFn('fileExists', fileExists)), directoryExists: cachedLookup(debugFn('directoryExists', ts.sys.directoryExists)), realpath: ts.sys.realpath ? cachedLookup(debugFn('realpath', ts.sys.realpath)) : undefined, getNewLine: () => ts.sys.newLine, useCaseSensitiveFileNames: () => ts.sys.useCaseSensitiveFileNames, getCurrentDirectory: () => cwd, getCompilationSettings: () => config.options, getDefaultLibFileName: () => ts.getDefaultLibFilePath(config.options), getCustomTransformers: getCustomTransformers } const { resolveModuleNames, getResolvedModuleWithFailedLookupLocationsFromCache, resolveTypeReferenceDirectives, isFileKnownToBeInternal, markBucketOfFilenameInternal } = createResolverFunctions(serviceHost) serviceHost.resolveModuleNames = resolveModuleNames serviceHost.getResolvedModuleWithFailedLookupLocationsFromCache = getResolvedModuleWithFailedLookupLocationsFromCache serviceHost.resolveTypeReferenceDirectives = resolveTypeReferenceDirectives const registry = ts.createDocumentRegistry(ts.sys.useCaseSensitiveFileNames, cwd) const service = ts.createLanguageService(serviceHost, registry) const updateMemoryCache = (contents: string, fileName: string) => { // Add to `rootFiles` as necessary, either to make TS include a file it has not seen, // or to trigger a re-classification of files from external to internal. if (!rootFileNames.has(fileName) && !isFileKnownToBeInternal(fileName)) { markBucketOfFilenameInternal(fileName) rootFileNames.add(fileName) // Increment project version for every change to rootFileNames. projectVersion++ } const previousVersion = fileVersions.get(fileName) || 0 const previousContents = fileContents.get(fileName) // Avoid incrementing cache when nothing has changed. if (contents !== previousContents) { fileVersions.set(fileName, previousVersion + 1) fileContents.set(fileName, contents) // Increment project version for every file change. projectVersion++ } } let previousProgram: _ts.Program | undefined = undefined getOutput = (code: string, fileName: string) => { updateMemoryCache(code, fileName) const programBefore = service.getProgram() if (programBefore !== previousProgram) { debug(`compiler rebuilt Program instance when getting output for ${fileName}`) } const output = service.getEmitOutput(fileName) // Get the relevant diagnostics - this is 3x faster than `getPreEmitDiagnostics`. const diagnostics = service.getSemanticDiagnostics(fileName) .concat(service.getSyntacticDiagnostics(fileName)) const programAfter = service.getProgram() debug( 'invariant: Is service.getProject() identical before and after getting emit output and diagnostics? (should always be true) ', programBefore === programAfter ) previousProgram = programAfter const diagnosticList = filterDiagnostics(diagnostics, ignoreDiagnostics) if (diagnosticList.length) reportTSError(diagnosticList) if (output.emitSkipped) { throw new TypeError(`${relative(cwd, fileName)}: Emit skipped`) } // Throw an error when requiring `.d.ts` files. if (output.outputFiles.length === 0) { throw new TypeError( `Unable to require file: ${relative(cwd, fileName)}\n` + 'This is usually the result of a faulty configuration or import. ' + 'Make sure there is a `.js`, `.json` or other executable extension with ' + 'loader attached before `ts-node` available.' ) } return [output.outputFiles[1].text, output.outputFiles[0].text] } getTypeInfo = (code: string, fileName: string, position: number) => { updateMemoryCache(code, fileName) const info = service.getQuickInfoAtPosition(fileName, position) const name = ts.displayPartsToString(info ? info.displayParts : []) const comment = ts.displayPartsToString(info ? info.documentation : []) return { name, comment } } } else { const sys: _ts.System & _ts.FormatDiagnosticsHost = { ...ts.sys, ...diagnosticHost, readFile: (fileName: string) => { const cacheContents = fileContents.get(fileName) if (cacheContents !== undefined) return cacheContents const contents = cachedReadFile(fileName) if (contents) fileContents.set(fileName, contents) return contents }, readDirectory: ts.sys.readDirectory, getDirectories: cachedLookup(debugFn('getDirectories', ts.sys.getDirectories)), fileExists: cachedLookup(debugFn('fileExists', fileExists)), directoryExists: cachedLookup(debugFn('directoryExists', ts.sys.directoryExists)), resolvePath: cachedLookup(debugFn('resolvePath', ts.sys.resolvePath)), realpath: ts.sys.realpath ? cachedLookup(debugFn('realpath', ts.sys.realpath)) : undefined } const host: _ts.CompilerHost = ts.createIncrementalCompilerHost ? ts.createIncrementalCompilerHost(config.options, sys) : { ...sys, getSourceFile: (fileName, languageVersion) => { const contents = sys.readFile(fileName) if (contents === undefined) return return ts.createSourceFile(fileName, contents, languageVersion) }, getDefaultLibLocation: () => normalizeSlashes(dirname(compiler)), getDefaultLibFileName: () => normalizeSlashes(join(dirname(compiler), ts.getDefaultLibFileName(config.options))), useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames } const { resolveModuleNames, resolveTypeReferenceDirectives, isFileKnownToBeInternal, markBucketOfFilenameInternal } = createResolverFunctions(host) host.resolveModuleNames = resolveModuleNames host.resolveTypeReferenceDirectives = resolveTypeReferenceDirectives // Fallback for older TypeScript releases without incremental API. let builderProgram = ts.createIncrementalProgram ? ts.createIncrementalProgram({ rootNames: Array.from(rootFileNames), options: config.options, host: host, configFileParsingDiagnostics: config.errors, projectReferences: config.projectReferences }) : ts.createEmitAndSemanticDiagnosticsBuilderProgram( Array.from(rootFileNames), config.options, host, undefined, config.errors, config.projectReferences ) // Read and cache custom transformers. const customTransformers = typeof transformers === 'function' ? transformers(builderProgram.getProgram()) : transformers // Set the file contents into cache manually. const updateMemoryCache = (contents: string, fileName: string) => { const previousContents = fileContents.get(fileName) const contentsChanged = previousContents !== contents if (contentsChanged) { fileContents.set(fileName, contents) } // Add to `rootFiles` when discovered by compiler for the first time. let addedToRootFileNames = false if (!rootFileNames.has(fileName) && !isFileKnownToBeInternal(fileName)) { markBucketOfFilenameInternal(fileName) rootFileNames.add(fileName) addedToRootFileNames = true } // Update program when file changes. if (addedToRootFileNames || contentsChanged) { builderProgram = ts.createEmitAndSemanticDiagnosticsBuilderProgram( Array.from(rootFileNames), config.options, host, builderProgram, config.errors, config.projectReferences ) } } getOutput = (code: string, fileName: string) => { const output: [string, string] = ['', ''] updateMemoryCache(code, fileName) const sourceFile = builderProgram.getSourceFile(fileName) if (!sourceFile) throw new TypeError(`Unable to read file: ${fileName}`) const program = builderProgram.getProgram() const diagnostics = ts.getPreEmitDiagnostics(program, sourceFile) const diagnosticList = filterDiagnostics(diagnostics, ignoreDiagnostics) if (diagnosticList.length) reportTSError(diagnosticList) const result = builderProgram.emit(sourceFile, (path, file, writeByteOrderMark) => { if (path.endsWith('.map')) { output[1] = file } else { output[0] = file } if (options.emit) sys.writeFile(path, file, writeByteOrderMark) }, undefined, undefined, customTransformers) if (result.emitSkipped) { throw new TypeError(`${relative(cwd, fileName)}: Emit skipped`) } // Throw an error when requiring files that cannot be compiled. if (output[0] === '') { if (program.isSourceFileFromExternalLibrary(sourceFile)) { throw new TypeError(`Unable to compile file from external library: ${relative(cwd, fileName)}`) } throw new TypeError( `Unable to require file: ${relative(cwd, fileName)}\n` + 'This is usually the result of a faulty configuration or import. ' + 'Make sure there is a `.js`, `.json` or other executable extension with ' + 'loader attached before `ts-node` available.' ) } return output } getTypeInfo = (code: string, fileName: string, position: number) => { updateMemoryCache(code, fileName) const sourceFile = builderProgram.getSourceFile(fileName) if (!sourceFile) throw new TypeError(`Unable to read file: ${fileName}`) const node = getTokenAtPosition(ts, sourceFile, position) const checker = builderProgram.getProgram().getTypeChecker() const symbol = checker.getSymbolAtLocation(node) if (!symbol) return { name: '', comment: '' } const type = checker.getTypeOfSymbolAtLocation(symbol, node) const signatures = [...type.getConstructSignatures(), ...type.getCallSignatures()] return { name: signatures.length ? signatures.map(x => checker.signatureToString(x)).join('\n') : checker.typeToString(type), comment: ts.displayPartsToString(symbol ? symbol.getDocumentationComment(checker) : []) } } // Write `.tsbuildinfo` when `--build` is enabled. if (options.emit && config.options.incremental) { process.on('exit', () => { // Emits `.tsbuildinfo` to filesystem. (builderProgram.getProgram() as any).emitBuildInfo() }) } } } else { if (typeof transformers === 'function') { throw new TypeError('Transformers function is unavailable in "--transpile-only"') } getOutput = (code: string, fileName: string): SourceOutput => { const result = ts.transpileModule(code, { fileName, compilerOptions: config.options, reportDiagnostics: true, transformers: transformers }) const diagnosticList = filterDiagnostics(result.diagnostics || [], ignoreDiagnostics) if (diagnosticList.length) reportTSError(diagnosticList) return [result.outputText, result.sourceMapText as string] } getTypeInfo = () => { throw new TypeError('Type information is unavailable in "--transpile-only"') } } // Create a simple TypeScript compiler proxy. function compile (code: string, fileName: string, lineOffset = 0) { const normalizedFileName = normalizeSlashes(fileName) const [value, sourceMap] = getOutput(code, normalizedFileName) const output = updateOutput(value, normalizedFileName, sourceMap, getExtension) outputCache.set(normalizedFileName, { content: output }) return output } let active = true const enabled = (enabled?: boolean) => enabled === undefined ? active : (active = !!enabled) const extensions = getExtensions(config) const ignored = (fileName: string) => { if (!active) return true const ext = extname(fileName) if (extensions.tsExtensions.includes(ext) || extensions.jsExtensions.includes(ext)) { const relname = relative(cwd, fileName) return !isScoped(relname) || shouldIgnore(relname) } return true } return { ts, config, compile, getTypeInfo, ignored, enabled, options } } /** * Check if the filename should be ignored. */ function createIgnore (ignore: RegExp[]) { return (relname: string) => { const path = normalizeSlashes(relname) return ignore.some(x => x.test(path)) } } /** * "Refreshes" an extension on `require.extensions`. * * @param {string} ext */ function reorderRequireExtension (ext: string) { const old = require.extensions[ext] // tslint:disable-line delete require.extensions[ext] // tslint:disable-line require.extensions[ext] = old // tslint:disable-line } /** * Register the extensions to support when importing files. */ function registerExtensions ( preferTsExts: boolean | null | undefined, extensions: string[], service: Service, originalJsHandler: (m: NodeModule, filename: string) => any ) { // Register new extensions. for (const ext of extensions) { registerExtension(ext, service, originalJsHandler) } if (preferTsExts) { // tslint:disable-next-line const preferredExtensions = new Set([...extensions, ...Object.keys(require.extensions)]) for (const ext of preferredExtensions) reorderRequireExtension(ext) } } /** * Register the extension for node. */ function registerExtension ( ext: string, service: Service, originalHandler: (m: NodeModule, filename: string) => any ) { const old = require.extensions[ext] || originalHandler // tslint:disable-line require.extensions[ext] = function (m: any, filename) { // tslint:disable-line if (service.ignored(filename)) return old(m, filename) if (service.options.experimentalEsmLoader) { assertScriptCanLoadAsCJS(filename) } const _compile = m._compile m._compile = function (code: string, fileName: string) { debug('module._compile', fileName) return _compile.call(this, service.compile(code, fileName), fileName) } return old(m, filename) } } /** * Do post-processing on config options to support `ts-node`. */ function fixConfig (ts: TSCommon, config: _ts.ParsedCommandLine) { // Delete options that *should not* be passed through. delete config.options.out delete config.options.outFile delete config.options.composite delete config.options.declarationDir delete config.options.declarationMap delete config.options.emitDeclarationOnly // Target ES5 output by default (instead of ES3). if (config.options.target === undefined) { config.options.target = ts.ScriptTarget.ES5 } // Target CommonJS modules by default (instead of magically switching to ES6 when the target is ES6). if (config.options.module === undefined) { config.options.module = ts.ModuleKind.CommonJS } return config } /** * Load TypeScript configuration. Returns the parsed TypeScript config and * any `ts-node` options specified in the config file. */ function readConfig ( cwd: string, ts: TSCommon, rawOptions: CreateOptions ): { // Parsed TypeScript configuration. config: _ts.ParsedCommandLine // Options pulled from `tsconfig.json`. options: TsConfigOptions } { let config: any = { compilerOptions: {} } let basePath = cwd let configFileName: string | undefined = undefined const { fileExists = ts.sys.fileExists, readFile = ts.sys.readFile, skipProject = DEFAULTS.skipProject, project = DEFAULTS.project } = rawOptions // Read project configuration when available. if (!skipProject) { configFileName = project ? resolve(cwd, project) : ts.findConfigFile(cwd, fileExists) if (configFileName) { const result = ts.readConfigFile(configFileName, readFile) // Return diagnostics. if (result.error) { return { config: { errors: [result.error], fileNames: [], options: {} }, options: {} } } config = result.config basePath = dirname(configFileName) } } // Fix ts-node options that come from tsconfig.json const tsconfigOptions: TsConfigOptions = Object.assign({}, config['ts-node']) // Remove resolution of "files". const files = rawOptions.files ?? tsconfigOptions.files ?? DEFAULTS.files if (!files) { config.files = [] config.include = [] } // Override default configuration options `ts-node` requires. config.compilerOptions = Object.assign( {}, config.compilerOptions, DEFAULTS.compilerOptions, tsconfigOptions.compilerOptions, rawOptions.compilerOptions, TS_NODE_COMPILER_OPTIONS ) const fixedConfig = fixConfig(ts, ts.parseJsonConfigFileContent(config, { fileExists, readFile, readDirectory: ts.sys.readDirectory, useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames }, basePath, undefined, configFileName)) if (tsconfigOptions.require) { // Modules are found relative to the tsconfig file, not the `dir` option const tsconfigRelativeRequire = createRequire(configFileName!) tsconfigOptions.require = tsconfigOptions.require.map((path: string) => { return tsconfigRelativeRequire.resolve(path) }) } return { config: fixedConfig, options: tsconfigOptions } } /** * Internal source output. */ type SourceOutput = [string, string] /** * Update the output remapping the source map. */ function updateOutput (outputText: string, fileName: string, sourceMap: string, getExtension: (fileName: string) => string) { const base64Map = Buffer.from(updateSourceMap(sourceMap, fileName), 'utf8').toString('base64') const sourceMapContent = `data:application/json;charset=utf-8;base64,${base64Map}` const sourceMapLength = `${basename(fileName)}.map`.length + (getExtension(fileName).length - extname(fileName).length) return outputText.slice(0, -sourceMapLength) + sourceMapContent } /** * Update the source map contents for improved output. */ function updateSourceMap (sourceMapText: string, fileName: string) { const sourceMap = JSON.parse(sourceMapText) sourceMap.file = fileName sourceMap.sources = [fileName] delete sourceMap.sourceRoot return JSON.stringify(sourceMap) } /** * Filter diagnostics. */ function filterDiagnostics (diagnostics: readonly _ts.Diagnostic[], ignore: number[]) { return diagnostics.filter(x => ignore.indexOf(x.code) === -1) } /** * Get token at file position. * * Reference: https://github.com/microsoft/TypeScript/blob/fcd9334f57d85b73dd66ad2d21c02e84822f4841/src/services/utilities.ts#L705-L731 */ function getTokenAtPosition (ts: typeof _ts, sourceFile: _ts.SourceFile, position: number): _ts.Node { let current: _ts.Node = sourceFile outer: while (true) { for (const child of current.getChildren(sourceFile)) { const start = child.getFullStart() if (start > position) break const end = child.getEnd() if (position <= end) { current = child continue outer } } return current } } ts-node-9.1.1/src/repl.ts000066400000000000000000000205451376344015600152130ustar00rootroot00000000000000import { diffLines } from 'diff' import { homedir } from 'os' import { join } from 'path' import { Recoverable, start } from 'repl' import { Script } from 'vm' import { Service, CreateOptions, TSError } from './index' import { readFileSync, statSync } from 'fs' import { Console } from 'console' import * as tty from 'tty' /** * Eval filename for REPL/debug. * @internal */ export const EVAL_FILENAME = `[eval].ts` export interface ReplService { readonly state: EvalState /** * Bind this REPL to a ts-node compiler service. A compiler service must be bound before `eval`-ing code or starting the REPL */ setService (service: Service): void evalCode (code: string): void /** * `eval` implementation compatible with node's REPL API */ nodeEval (code: string, _context: any, _filename: string, callback: (err: Error | null, result?: any) => any): void evalAwarePartialHost: EvalAwarePartialHost /** Start a node REPL */ start (code?: string): void /** @internal */ readonly stdin: NodeJS.ReadableStream /** @internal */ readonly stdout: NodeJS.WritableStream /** @internal */ readonly stderr: NodeJS.WritableStream /** @internal */ readonly console: Console } export interface CreateReplOptions { service?: Service state?: EvalState stdin?: NodeJS.ReadableStream stdout?: NodeJS.WritableStream stderr?: NodeJS.WritableStream } export function createRepl (options: CreateReplOptions = {}) { let service = options.service const state = options.state ?? new EvalState(join(process.cwd(), EVAL_FILENAME)) const evalAwarePartialHost = createEvalAwarePartialHost(state) const stdin = options.stdin ?? process.stdin const stdout = options.stdout ?? process.stdout const stderr = options.stderr ?? process.stderr const _console = stdout === process.stdout && stderr === process.stderr ? console : new Console(stdout, stderr) const replService: ReplService = { state: options.state ?? new EvalState(join(process.cwd(), EVAL_FILENAME)), setService, evalCode, nodeEval, evalAwarePartialHost, start, stdin, stdout, stderr, console: _console } return replService function setService (_service: Service) { service = _service } function evalCode (code: string) { return _eval(service!, state, code) } function nodeEval (code: string, _context: any, _filename: string, callback: (err: Error | null, result?: any) => any) { let err: Error | null = null let result: any // TODO: Figure out how to handle completion here. if (code === '.scope') { callback(err) return } try { result = evalCode(code) } catch (error) { if (error instanceof TSError) { // Support recoverable compilations using >= node 6. if (Recoverable && isRecoverable(error)) { err = new Recoverable(error) } else { console.error(error) } } else { err = error } } return callback(err, result) } function start (code?: string) { // TODO assert that service is set; remove all ! postfixes return startRepl(replService, service!, state, code) } } /** * Eval state management. Stores virtual `[eval].ts` file */ export class EvalState { /** @internal */ input = '' /** @internal */ output = '' /** @internal */ version = 0 /** @internal */ lines = 0 // tslint:disable-next-line:variable-name __tsNodeEvalStateBrand: unknown constructor (public path: string) { } } /** * Filesystem host functions which are aware of the "virtual" [eval].ts file used to compile REPL inputs. * Must be passed to `create()` to create a ts-node compiler service which can compile REPL inputs. */ export type EvalAwarePartialHost = Pick export function createEvalAwarePartialHost (state: EvalState): EvalAwarePartialHost { function readFile (path: string) { if (path === state.path) return state.input try { return readFileSync(path, 'utf8') } catch (err) {/* Ignore. */} } function fileExists (path: string) { if (path === state.path) return true try { const stats = statSync(path) return stats.isFile() || stats.isFIFO() } catch (err) { return false } } return { readFile, fileExists } } /** * Evaluate the code snippet. */ function _eval (service: Service, state: EvalState, input: string) { const lines = state.lines const isCompletion = !/\n$/.test(input) const undo = appendEval(state, input) let output: string try { output = service.compile(state.input, state.path, -lines) } catch (err) { undo() throw err } // Use `diff` to check for new JavaScript to execute. const changes = diffLines(state.output, output) if (isCompletion) { undo() } else { state.output = output } return changes.reduce((result, change) => { return change.added ? exec(change.value, state.path) : result }, undefined) } /** * Execute some code. */ function exec (code: string, filename: string) { const script = new Script(code, { filename: filename }) return script.runInThisContext() } /** * Start a CLI REPL. */ function startRepl (replService: ReplService, service: Service, state: EvalState, code?: string) { // Eval incoming code before the REPL starts. if (code) { try { replService.evalCode(`${code}\n`) } catch (err) { replService.console.error(err) process.exit(1) } } const repl = start({ prompt: '> ', input: replService.stdin, output: replService.stdout, // Mimicking node's REPL implementation: https://github.com/nodejs/node/blob/168b22ba073ee1cbf8d0bcb4ded7ff3099335d04/lib/internal/repl.js#L28-L30 terminal: (replService.stdout as tty.WriteStream).isTTY && !parseInt(process.env.NODE_NO_READLINE!, 10), eval: replService.nodeEval, useGlobal: true }) // Bookmark the point where we should reset the REPL state. const resetEval = appendEval(state, '') function reset () { resetEval() // Hard fix for TypeScript forcing `Object.defineProperty(exports, ...)`. exec('exports = module.exports', state.path) } reset() repl.on('reset', reset) repl.defineCommand('type', { help: 'Check the type of a TypeScript identifier', action: function (identifier: string) { if (!identifier) { repl.displayPrompt() return } const undo = appendEval(state, identifier) const { name, comment } = service.getTypeInfo(state.input, state.path, state.input.length) undo() if (name) repl.outputStream.write(`${name}\n`) if (comment) repl.outputStream.write(`${comment}\n`) repl.displayPrompt() } }) // Set up REPL history when available natively via node.js >= 11. if (repl.setupHistory) { const historyPath = process.env.TS_NODE_HISTORY || join(homedir(), '.ts_node_repl_history') repl.setupHistory(historyPath, err => { if (!err) return replService.console.error(err) process.exit(1) }) } } /** * Append to the eval instance and return an undo function. */ function appendEval (state: EvalState, input: string) { const undoInput = state.input const undoVersion = state.version const undoOutput = state.output const undoLines = state.lines // Handle ASI issues with TypeScript re-evaluation. if (undoInput.charAt(undoInput.length - 1) === '\n' && /^\s*[\/\[(`-]/.test(input) && !/;\s*$/.test(undoInput)) { state.input = `${state.input.slice(0, -1)};\n` } state.input += input state.lines += lineCount(input) state.version++ return function () { state.input = undoInput state.output = undoOutput state.version = undoVersion state.lines = undoLines } } /** * Count the number of lines. */ function lineCount (value: string) { let count = 0 for (const char of value) { if (char === '\n') { count++ } } return count } const RECOVERY_CODES: Set = new Set([ 1003, // "Identifier expected." 1005, // "')' expected." 1109, // "Expression expected." 1126, // "Unexpected end of text." 1160, // "Unterminated template literal." 1161, // "Unterminated regular expression literal." 2355 // "A function whose declared type is neither 'void' nor 'any' must return a value." ]) /** * Check if a function can recover gracefully. */ function isRecoverable (error: TSError) { return error.diagnosticCodes.every(code => RECOVERY_CODES.has(code)) } ts-node-9.1.1/src/tsconfig-schema.ts000066400000000000000000000013101376344015600173100ustar00rootroot00000000000000import { TsConfigOptions } from '.' /* * This interface exists solely for generating a JSON schema for tsconfig.json. * We do *not* extend the compiler's tsconfig interface. Instead we handle that * on a schema level, via "allOf", so we pull in the same schema that VSCode * already uses. */ /** * tsconfig schema which includes "ts-node" options. * @allOf [{"$ref": "https://schemastore.azurewebsites.net/schemas/json/tsconfig.json"}] */ export interface TsConfigSchema { /** * ts-node options. See also: https://github.com/TypeStrong/ts-node#configuration-options * * ts-node offers TypeScript execution and REPL for node.js, with source map support. */ 'ts-node': TsConfigOptions } ts-node-9.1.1/tests/000077500000000000000000000000001376344015600142465ustar00rootroot00000000000000ts-node-9.1.1/tests/.gitignore000066400000000000000000000001061376344015600162330ustar00rootroot00000000000000!from-node-modules/node_modules/ package-lock.json ts-node-packed.tgz ts-node-9.1.1/tests/allow-js/000077500000000000000000000000001376344015600157765ustar00rootroot00000000000000ts-node-9.1.1/tests/allow-js/run.js000066400000000000000000000000631376344015600171370ustar00rootroot00000000000000export function main () { return 'hello world' } ts-node-9.1.1/tests/allow-js/with-jsx.jsx000066400000000000000000000001571376344015600203040ustar00rootroot00000000000000export class Foo2 { static sayHi () { return 'hello world' } render () { return
} } ts-node-9.1.1/tests/child-process.ts000066400000000000000000000001521376344015600173530ustar00rootroot00000000000000import { join } from 'path' import { fork } from 'child_process' fork(join(__dirname, 'hello-world.ts')) ts-node-9.1.1/tests/compiler-error.ts000066400000000000000000000001071376344015600175550ustar00rootroot00000000000000function upper (str: string) { return str.toUpperCase() } upper(10) ts-node-9.1.1/tests/complex/000077500000000000000000000000001376344015600157155ustar00rootroot00000000000000ts-node-9.1.1/tests/complex/example.js000066400000000000000000000000471376344015600177070ustar00rootroot00000000000000module.exports = require('./foo').text ts-node-9.1.1/tests/complex/foo.ts000066400000000000000000000000361376344015600170470ustar00rootroot00000000000000export const text = 'example' ts-node-9.1.1/tests/complex/index.ts000066400000000000000000000001551376344015600173750ustar00rootroot00000000000000declare function require (module: string): any export function example () { return require('./example') } ts-node-9.1.1/tests/custom-types.ts000066400000000000000000000000751376344015600172740ustar00rootroot00000000000000import { foobar } from 'does-not-exist' console.log(foobar) ts-node-9.1.1/tests/emit-compiled.ts000066400000000000000000000005171376344015600173510ustar00rootroot00000000000000const extensions = ['.tsx'] extensions.forEach(ext => { const old = require.extensions[ext] require.extensions[ext] = (m, path) => { const _compile = (m as any)._compile ;(m as any)._compile = (code, path) => { console.error(code) return _compile.call(this, code, path) } return old(m, path) } }) ts-node-9.1.1/tests/empty.ts000066400000000000000000000000001376344015600157420ustar00rootroot00000000000000ts-node-9.1.1/tests/env.ts000066400000000000000000000001051376344015600154020ustar00rootroot00000000000000console.log(typeof process[Symbol.for('ts-node.register.instance')]) ts-node-9.1.1/tests/esm-err-require-esm/000077500000000000000000000000001376344015600200545ustar00rootroot00000000000000ts-node-9.1.1/tests/esm-err-require-esm/esm-package/000077500000000000000000000000001376344015600222315ustar00rootroot00000000000000ts-node-9.1.1/tests/esm-err-require-esm/esm-package/loaded-as.ts000066400000000000000000000002071376344015600244310ustar00rootroot00000000000000// Log if this file is loaded as ESM or CommonJS if(typeof module !== 'undefined') console.log('CommonJS') else console.log('ESM') ts-node-9.1.1/tests/esm-err-require-esm/esm-package/package.json000066400000000000000000000000271376344015600245160ustar00rootroot00000000000000{ "type": "module" } ts-node-9.1.1/tests/esm-err-require-esm/index.js000066400000000000000000000000431376344015600215160ustar00rootroot00000000000000require('./esm-package/loaded-as') ts-node-9.1.1/tests/esm-import-cache/000077500000000000000000000000001376344015600174035ustar00rootroot00000000000000ts-node-9.1.1/tests/esm-import-cache/index.ts000066400000000000000000000001211376344015600210540ustar00rootroot00000000000000import './log1.js' import './log1.js' import './log2.js' import './log2.js?bust' ts-node-9.1.1/tests/esm-import-cache/log1.ts000066400000000000000000000000241376344015600206110ustar00rootroot00000000000000console.log('log1') ts-node-9.1.1/tests/esm-import-cache/log2.ts000066400000000000000000000000241376344015600206120ustar00rootroot00000000000000console.log('log2') ts-node-9.1.1/tests/esm-import-cache/package.json000066400000000000000000000000271376344015600216700ustar00rootroot00000000000000{ "type": "module" } ts-node-9.1.1/tests/esm-import-cache/tsconfig.json000066400000000000000000000001531376344015600221110ustar00rootroot00000000000000{ "compilerOptions": { "module": "ESNext", "allowJs": true, "moduleResolution": "node" } } ts-node-9.1.1/tests/esm-import-http-url/000077500000000000000000000000001376344015600201175ustar00rootroot00000000000000ts-node-9.1.1/tests/esm-import-http-url/index.mjs000066400000000000000000000001141376344015600217350ustar00rootroot00000000000000import 'http://example.com/this-url-should-be-ignored-by-our-esm-loader.js' ts-node-9.1.1/tests/esm-node-resolver/000077500000000000000000000000001376344015600176145ustar00rootroot00000000000000ts-node-9.1.1/tests/esm-node-resolver/bar/000077500000000000000000000000001376344015600203605ustar00rootroot00000000000000ts-node-9.1.1/tests/esm-node-resolver/bar/index.ts000066400000000000000000000001661376344015600220420ustar00rootroot00000000000000export const bar: string = 'bar' if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') ts-node-9.1.1/tests/esm-node-resolver/baz.js000066400000000000000000000001561376344015600207300ustar00rootroot00000000000000export const baz = 'baz' if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') ts-node-9.1.1/tests/esm-node-resolver/biff.jsx000066400000000000000000000002601376344015600212460ustar00rootroot00000000000000export const biff = 'biff' const React = { createElement() {} } const div =
if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') ts-node-9.1.1/tests/esm-node-resolver/foo.ts000066400000000000000000000001661376344015600207520ustar00rootroot00000000000000export const foo: string = 'foo' if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') ts-node-9.1.1/tests/esm-node-resolver/index.ts000066400000000000000000000004241376344015600212730ustar00rootroot00000000000000import {foo} from './foo' import {bar} from './bar' import {baz} from './baz' import {biff} from './biff' import {libfoo} from 'libfoo' if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') console.log(`${foo} ${bar} ${baz} ${biff} ${libfoo}`) ts-node-9.1.1/tests/esm-node-resolver/node_modules/000077500000000000000000000000001376344015600222715ustar00rootroot00000000000000ts-node-9.1.1/tests/esm-node-resolver/node_modules/libfoo/000077500000000000000000000000001376344015600235435ustar00rootroot00000000000000ts-node-9.1.1/tests/esm-node-resolver/node_modules/libfoo/entrypoint.js000066400000000000000000000000371376344015600263140ustar00rootroot00000000000000export const libfoo = 'libfoo' ts-node-9.1.1/tests/esm-node-resolver/node_modules/libfoo/index.d.ts000066400000000000000000000001261376344015600254430ustar00rootroot00000000000000// TypeScript does not yet support package.json "exports" export const libfoo: string ts-node-9.1.1/tests/esm-node-resolver/node_modules/libfoo/package.json000066400000000000000000000001131376344015600260240ustar00rootroot00000000000000{ "type": "module", "exports": { "import": "./entrypoint.js" } } ts-node-9.1.1/tests/esm-node-resolver/package.json000066400000000000000000000000271376344015600221010ustar00rootroot00000000000000{ "type": "module" } ts-node-9.1.1/tests/esm-node-resolver/tsconfig.json000066400000000000000000000001771376344015600223300ustar00rootroot00000000000000{ "compilerOptions": { "module": "ESNext", "allowJs": true, "jsx": "react", "moduleResolution": "node" } } ts-node-9.1.1/tests/esm-transpile-only/000077500000000000000000000000001376344015600200105ustar00rootroot00000000000000ts-node-9.1.1/tests/esm-transpile-only/index.ts000066400000000000000000000003321376344015600214650ustar00rootroot00000000000000if (typeof module !== 'undefined') throw new Error('module should not exist in ESM') // intentional type errors to check transpile-only ESM loader skips type checking parseInt(1101, 2) const x: number = 'hello world' ts-node-9.1.1/tests/esm-transpile-only/package.json000066400000000000000000000000271376344015600222750ustar00rootroot00000000000000{ "type": "module" } ts-node-9.1.1/tests/esm-transpile-only/tsconfig.json000066400000000000000000000001371376344015600225200ustar00rootroot00000000000000{ "compilerOptions": { "module": "ESNext", "allowJs": true, "jsx": "react" } } ts-node-9.1.1/tests/esm/000077500000000000000000000000001376344015600150325ustar00rootroot00000000000000ts-node-9.1.1/tests/esm/bar.ts000066400000000000000000000001661376344015600161510ustar00rootroot00000000000000export const bar: string = 'bar' if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') ts-node-9.1.1/tests/esm/baz.js000066400000000000000000000001561376344015600161460ustar00rootroot00000000000000export const baz = 'baz' if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') ts-node-9.1.1/tests/esm/biff.jsx000066400000000000000000000002601376344015600164640ustar00rootroot00000000000000export const biff = 'biff' const React = { createElement() {} } const div =
if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') ts-node-9.1.1/tests/esm/foo.ts000066400000000000000000000001661376344015600161700ustar00rootroot00000000000000export const foo: string = 'foo' if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') ts-node-9.1.1/tests/esm/index.ts000066400000000000000000000006731376344015600165170ustar00rootroot00000000000000import {foo} from './foo.js' import {bar} from './bar.js' import {baz} from './baz.js' import {biff} from './biff.js' import {libfoo} from 'libfoo' // Test import builtin modules import {readFileSync} from 'fs'; if(typeof readFileSync !== 'function') throw new Error('failed to import builtin module') if(typeof module !== 'undefined') throw new Error('module should not exist in ESM') console.log(`${foo} ${bar} ${baz} ${biff} ${libfoo}`) ts-node-9.1.1/tests/esm/node_modules/000077500000000000000000000000001376344015600175075ustar00rootroot00000000000000ts-node-9.1.1/tests/esm/node_modules/libfoo/000077500000000000000000000000001376344015600207615ustar00rootroot00000000000000ts-node-9.1.1/tests/esm/node_modules/libfoo/entrypoint.js000066400000000000000000000000371376344015600235320ustar00rootroot00000000000000export const libfoo = 'libfoo' ts-node-9.1.1/tests/esm/node_modules/libfoo/index.d.ts000066400000000000000000000001261376344015600226610ustar00rootroot00000000000000// TypeScript does not yet support package.json "exports" export const libfoo: string ts-node-9.1.1/tests/esm/node_modules/libfoo/package.json000066400000000000000000000001131376344015600232420ustar00rootroot00000000000000{ "type": "module", "exports": { "import": "./entrypoint.js" } } ts-node-9.1.1/tests/esm/package.json000066400000000000000000000000271376344015600173170ustar00rootroot00000000000000{ "type": "module" } ts-node-9.1.1/tests/esm/throw.ts000066400000000000000000000006031376344015600165440ustar00rootroot00000000000000// intentional whitespace to prove that sourcemaps are working. Throw should happen on line 100. // 100 lines is meant to be far more space than the helper functions would take. class Foo { constructor () { this.bar() } bar () { throw new Error('this is a demo') } } new Foo() export {} ts-node-9.1.1/tests/esm/tsconfig.json000066400000000000000000000001771376344015600175460ustar00rootroot00000000000000{ "compilerOptions": { "module": "ESNext", "allowJs": true, "jsx": "react", "moduleResolution": "node" } } ts-node-9.1.1/tests/from-node-modules/000077500000000000000000000000001376344015600176025ustar00rootroot00000000000000ts-node-9.1.1/tests/from-node-modules/from-node-modules.ts000066400000000000000000000007761376344015600235200ustar00rootroot00000000000000// These files are resolved by the typechecker import * as tsmie from 'external/typescript-module-imported-externally' import * as jsmie from 'external/javascript-module-imported-externally' // These files are unknown to the compiler until required. const tsmre = require('external/typescript-module-required-externally') const jsmre = require('external/javascript-module-required-externally') import * as external from 'external' console.log(JSON.stringify({external, tsmie, jsmie, tsmre, jsmre}, null, 2)) ts-node-9.1.1/tests/from-node-modules/node_modules/000077500000000000000000000000001376344015600222575ustar00rootroot00000000000000ts-node-9.1.1/tests/from-node-modules/node_modules/external/000077500000000000000000000000001376344015600241015ustar00rootroot00000000000000ts-node-9.1.1/tests/from-node-modules/node_modules/external/index.ts000066400000000000000000000006321376344015600255610ustar00rootroot00000000000000// These files are resolved by the typechecker import * as tsmii from './typescript-module-imported-internally' export {tsmii} import * as jsmii from './javascript-module-imported-internally' export {jsmii} // These files are unknown to the compiler until required. export const tsmri = require('./typescript-module-required-internally') export const jsmri = require('./javascript-module-required-internally') ts-node-9.1.1/tests/from-node-modules/node_modules/external/javascript-module-imported-externally/000077500000000000000000000000001376344015600335405ustar00rootroot00000000000000index.ts000066400000000000000000000001061376344015600351350ustar00rootroot00000000000000ts-node-9.1.1/tests/from-node-modules/node_modules/external/javascript-module-imported-externallyimport {basename} from 'path' export const name = basename(__dirname) ts-node-9.1.1/tests/from-node-modules/node_modules/external/javascript-module-imported-internally/000077500000000000000000000000001376344015600335325ustar00rootroot00000000000000index.ts000066400000000000000000000001061376344015600351270ustar00rootroot00000000000000ts-node-9.1.1/tests/from-node-modules/node_modules/external/javascript-module-imported-internallyimport {basename} from 'path' export const name = basename(__dirname) ts-node-9.1.1/tests/from-node-modules/node_modules/external/javascript-module-required-externally/000077500000000000000000000000001376344015600335355ustar00rootroot00000000000000index.ts000066400000000000000000000001061376344015600351320ustar00rootroot00000000000000ts-node-9.1.1/tests/from-node-modules/node_modules/external/javascript-module-required-externallyimport {basename} from 'path' export const name = basename(__dirname) ts-node-9.1.1/tests/from-node-modules/node_modules/external/javascript-module-required-internally/000077500000000000000000000000001376344015600335275ustar00rootroot00000000000000index.ts000066400000000000000000000001061376344015600351240ustar00rootroot00000000000000ts-node-9.1.1/tests/from-node-modules/node_modules/external/javascript-module-required-internallyimport {basename} from 'path' export const name = basename(__dirname) ts-node-9.1.1/tests/from-node-modules/node_modules/external/typescript-module-imported-externally/000077500000000000000000000000001376344015600336005ustar00rootroot00000000000000index.ts000066400000000000000000000001061376344015600351750ustar00rootroot00000000000000ts-node-9.1.1/tests/from-node-modules/node_modules/external/typescript-module-imported-externallyimport {basename} from 'path' export const name = basename(__dirname) ts-node-9.1.1/tests/from-node-modules/node_modules/external/typescript-module-imported-internally/000077500000000000000000000000001376344015600335725ustar00rootroot00000000000000index.ts000066400000000000000000000001061376344015600351670ustar00rootroot00000000000000ts-node-9.1.1/tests/from-node-modules/node_modules/external/typescript-module-imported-internallyimport {basename} from 'path' export const name = basename(__dirname) ts-node-9.1.1/tests/from-node-modules/node_modules/external/typescript-module-required-externally/000077500000000000000000000000001376344015600335755ustar00rootroot00000000000000index.ts000066400000000000000000000001061376344015600351720ustar00rootroot00000000000000ts-node-9.1.1/tests/from-node-modules/node_modules/external/typescript-module-required-externallyimport {basename} from 'path' export const name = basename(__dirname) ts-node-9.1.1/tests/from-node-modules/node_modules/external/typescript-module-required-internally/000077500000000000000000000000001376344015600335675ustar00rootroot00000000000000index.ts000066400000000000000000000001061376344015600351640ustar00rootroot00000000000000ts-node-9.1.1/tests/from-node-modules/node_modules/external/typescript-module-required-internallyimport {basename} from 'path' export const name = basename(__dirname) ts-node-9.1.1/tests/from-node-modules/tsconfig.json000066400000000000000000000001301376344015600223030ustar00rootroot00000000000000{ "ts-node": { "ignore": [] }, "compilerOptions": { "allowJs": true } } ts-node-9.1.1/tests/hello-world.ts000066400000000000000000000000351376344015600170440ustar00rootroot00000000000000console.log('Hello, world!') ts-node-9.1.1/tests/import-order/000077500000000000000000000000001376344015600166715ustar00rootroot00000000000000ts-node-9.1.1/tests/import-order/compiled.js000066400000000000000000000000431376344015600210200ustar00rootroot00000000000000console.log('Hello, JavaScript!'); ts-node-9.1.1/tests/import-order/compiled.ts000066400000000000000000000000421376344015600210310ustar00rootroot00000000000000console.log('Hello, TypeScript!') ts-node-9.1.1/tests/import-order/defined.d.ts000066400000000000000000000000641376344015600210610ustar00rootroot00000000000000declare const v = 'Hello, World!' export default v ts-node-9.1.1/tests/import-order/defined.js000066400000000000000000000000421376344015600206210ustar00rootroot00000000000000module.exports = 'Hello, World!'; ts-node-9.1.1/tests/import-order/importer.ts000066400000000000000000000000571376344015600211040ustar00rootroot00000000000000const v = require('./defined') console.log(v) ts-node-9.1.1/tests/issue-884/000077500000000000000000000000001376344015600157175ustar00rootroot00000000000000ts-node-9.1.1/tests/issue-884/index-2.ts000066400000000000000000000001401376344015600175300ustar00rootroot00000000000000export {}; const timeout = setTimeout(() => {}, 0); if (timeout.unref) { timeout.unref(); } ts-node-9.1.1/tests/issue-884/index.ts000066400000000000000000000002421376344015600173740ustar00rootroot00000000000000// 2x index files required so that memory cache is populated with all build-in lib and @types // declarations *before* this require() call. require('./index-2'); ts-node-9.1.1/tests/issue-884/tsconfig.json000066400000000000000000000007071376344015600204320ustar00rootroot00000000000000{ "compilerOptions": { "module": "umd", "target": "esnext", "sourceMap": true, "forceConsistentCasingInFileNames": true, "noImplicitReturns": true, "noImplicitAny": true, "skipLibCheck": true, "moduleResolution": "node", "allowSyntheticDefaultImports": false, "declaration": true, "strict": true, "noUnusedParameters": true, "noUnusedLocals": true, "lib": ["es2015", "es2017.object", "dom"] } } ts-node-9.1.1/tests/issue-986/000077500000000000000000000000001376344015600157225ustar00rootroot00000000000000ts-node-9.1.1/tests/issue-986/index.ts000066400000000000000000000000221376344015600173730ustar00rootroot00000000000000console.log(TEST) ts-node-9.1.1/tests/issue-986/tsconfig.json000066400000000000000000000000701376344015600204260ustar00rootroot00000000000000{ "compilerOptions": { "module": "CommonJS" } } ts-node-9.1.1/tests/issue-986/types.ts000066400000000000000000000000331376344015600174320ustar00rootroot00000000000000declare const TEST: string ts-node-9.1.1/tests/jsx-react.tsx000066400000000000000000000001521376344015600167040ustar00rootroot00000000000000import * as React from 'react' const Component = props => { return
} export default Component ts-node-9.1.1/tests/main-realpath/000077500000000000000000000000001376344015600167705ustar00rootroot00000000000000ts-node-9.1.1/tests/main-realpath/symlink/000077500000000000000000000000001376344015600204565ustar00rootroot00000000000000ts-node-9.1.1/tests/main-realpath/symlink/symlink.tsx000077700000000000000000000000001376344015600264262../target/target.tsxustar00rootroot00000000000000ts-node-9.1.1/tests/main-realpath/symlink/tsconfig.json000066400000000000000000000001371376344015600231660ustar00rootroot00000000000000this tsconfig is intentionally invalid, to confirm that ts-node does *not* attempt to parse it ts-node-9.1.1/tests/main-realpath/target/000077500000000000000000000000001376344015600202565ustar00rootroot00000000000000ts-node-9.1.1/tests/main-realpath/target/target.tsx000066400000000000000000000001641376344015600223050ustar00rootroot00000000000000// Will throw a compiler error unless ./tsconfig.json is parsed, which enables JSX function foo() {
} ts-node-9.1.1/tests/main-realpath/target/tsconfig.json000066400000000000000000000000621376344015600227630ustar00rootroot00000000000000{ "compilerOptions": { "jsx": "react" } } ts-node-9.1.1/tests/maxnodemodulesjsdepth-scoped/000077500000000000000000000000001376344015600221275ustar00rootroot00000000000000ts-node-9.1.1/tests/maxnodemodulesjsdepth-scoped/index.ts000066400000000000000000000007401376344015600236070ustar00rootroot00000000000000// Import as values, forcing internal classification. All files are typechecked import {foo as a_foo, bar as a_bar} from '@scoped/a' // Values are not used, so classification remains external. Obeys maxNodeModulesJsDepth import {foo as b_foo, bar as b_bar} from '@scoped/b' // We must have two .ts files, one without type errors. // Otherwise, type errors would prevent imports from executing, so external modules would not be reclassified as internal. a_foo import './other' ts-node-9.1.1/tests/maxnodemodulesjsdepth-scoped/node_modules/000077500000000000000000000000001376344015600246045ustar00rootroot00000000000000ts-node-9.1.1/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/000077500000000000000000000000001376344015600261615ustar00rootroot00000000000000ts-node-9.1.1/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/a/000077500000000000000000000000001376344015600264015ustar00rootroot00000000000000ts-node-9.1.1/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/a/has-semantic-error.js000066400000000000000000000002201376344015600324340ustar00rootroot00000000000000// Due to allowJs and skipIgnore, this file is typechecked because it is reclassified as internal /** @type {string} */ export const bar = 123 ts-node-9.1.1/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/a/index.js000066400000000000000000000001311376344015600300410ustar00rootroot00000000000000export {bar} from './has-semantic-error' /** @type {string} */ export const foo = 'foo' ts-node-9.1.1/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/b/000077500000000000000000000000001376344015600264025ustar00rootroot00000000000000ts-node-9.1.1/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/b/has-semantic-error.js000066400000000000000000000001601376344015600324400ustar00rootroot00000000000000// Due to maxNodeModuleJsDepth of 1, this file is not typechecked /** @type {string} */ export const bar = 123 ts-node-9.1.1/tests/maxnodemodulesjsdepth-scoped/node_modules/@scoped/b/index.js000066400000000000000000000001311376344015600300420ustar00rootroot00000000000000export {bar} from './has-semantic-error' /** @type {string} */ export const foo = 'foo' ts-node-9.1.1/tests/maxnodemodulesjsdepth-scoped/other.ts000066400000000000000000000010021376344015600236110ustar00rootroot00000000000000// Import as values, forcing internal classification. All files are typechecked import {foo as a_foo, bar as a_bar} from '@scoped/a' // Values are not used, so classification remains external. Obeys maxNodeModulesJsDepth import {foo as b_foo, bar as b_bar} from '@scoped/b' // `a_bar` has type information because it has been reclassified as internal const shouldBeBoolean2: boolean = a_bar // `b_bar` is missing type information, so this is not an error const shouldBeBoolean4: boolean = null as typeof b_bar ts-node-9.1.1/tests/maxnodemodulesjsdepth-scoped/tsconfig.json000066400000000000000000000003101376344015600246300ustar00rootroot00000000000000{ "ts-node": { // Force transpilation of node_modules "skipIgnore": true }, "compilerOptions": { "allowJs": true, "maxNodeModuleJsDepth": 1, "moduleResolution": "node" } } ts-node-9.1.1/tests/maxnodemodulesjsdepth/000077500000000000000000000000001376344015600206545ustar00rootroot00000000000000ts-node-9.1.1/tests/maxnodemodulesjsdepth/index.ts000066400000000000000000000000631376344015600223320ustar00rootroot00000000000000import {foo, bar} from 'external' import './other' ts-node-9.1.1/tests/maxnodemodulesjsdepth/node_modules/000077500000000000000000000000001376344015600233315ustar00rootroot00000000000000ts-node-9.1.1/tests/maxnodemodulesjsdepth/node_modules/external/000077500000000000000000000000001376344015600251535ustar00rootroot00000000000000ts-node-9.1.1/tests/maxnodemodulesjsdepth/node_modules/external/has-semantic-error.js000066400000000000000000000001531376344015600312130ustar00rootroot00000000000000// Due to maxNodeModuleJsDepth of 1, this file is not typechecked /** @type {string} */ exports.bar = 123 ts-node-9.1.1/tests/maxnodemodulesjsdepth/node_modules/external/index.js000066400000000000000000000002111376344015600266120ustar00rootroot00000000000000const hasSemanticError = require('./has-semantic-error'); exports.bar = hasSemanticError.bar; /** @type {string} */ exports.foo = 'foo' ts-node-9.1.1/tests/maxnodemodulesjsdepth/other.ts000066400000000000000000000003371376344015600223500ustar00rootroot00000000000000import {foo, bar} from 'external' // `foo` has type information so this is an error const shouldBeBoolean: boolean = foo // `bar` is missing type information, so this is not an error const shouldBeBoolean2: boolean = bar ts-node-9.1.1/tests/maxnodemodulesjsdepth/tsconfig.json000066400000000000000000000001621376344015600233620ustar00rootroot00000000000000{ "compilerOptions": { "allowJs": true, "maxNodeModuleJsDepth": 1, "moduleResolution": "node" } } ts-node-9.1.1/tests/module.ts000066400000000000000000000001051376344015600160770ustar00rootroot00000000000000export function example (foo: string) { return foo.toUpperCase() } ts-node-9.1.1/tests/package.json000066400000000000000000000001051376344015600165300ustar00rootroot00000000000000{ "dependencies": { "ts-node": "file:ts-node-packed.tgz" } } ts-node-9.1.1/tests/require-cache.ts000066400000000000000000000003241376344015600173320ustar00rootroot00000000000000const moduleName = require.resolve('./module') const { example: example1 } = require(moduleName) delete require.cache[moduleName] const { example: example2 } = require(moduleName) export { example1, example2 } ts-node-9.1.1/tests/scope/000077500000000000000000000000001376344015600153575ustar00rootroot00000000000000ts-node-9.1.1/tests/scope/a/000077500000000000000000000000001376344015600155775ustar00rootroot00000000000000ts-node-9.1.1/tests/scope/a/index.ts000066400000000000000000000001051376344015600172520ustar00rootroot00000000000000import path from 'path' export const ext = path.extname(__filename) ts-node-9.1.1/tests/scope/a/log.ts000066400000000000000000000000601376344015600167240ustar00rootroot00000000000000import { ext } from './index' console.log(ext) ts-node-9.1.1/tests/scope/a/tsconfig.json000066400000000000000000000000731376344015600203060ustar00rootroot00000000000000{ "compilerOptions": { "esModuleInterop": true } } ts-node-9.1.1/tests/scope/b/000077500000000000000000000000001376344015600156005ustar00rootroot00000000000000ts-node-9.1.1/tests/scope/b/index.ts000066400000000000000000000001051376344015600172530ustar00rootroot00000000000000import path from 'path' export const ext = path.extname(__filename) ts-node-9.1.1/tests/scope/b/tsconfig.json000066400000000000000000000000731376344015600203070ustar00rootroot00000000000000{ "compilerOptions": { "esModuleInterop": true } } ts-node-9.1.1/tests/signals.ts000066400000000000000000000004641376344015600162620ustar00rootroot00000000000000process.on('SIGINT', () => { process.stdout.write('exited') setTimeout(() => { process.stdout.write(' fine') // Needed to make sure what we wrote has time // to be written process.nextTick(() => process.exit()) }, 500) }) setInterval(() => console.log('should not be reached'), 3000) ts-node-9.1.1/tests/throw-react-tsx.tsx000066400000000000000000000007371376344015600200700ustar00rootroot00000000000000// intentional whitespace to prove that sourcemaps are working. Throw should happen on line 100. // 100 lines is meant to be far more space than the helper functions would take. const React = {createElement: (...args: any[]) => null} class Foo { constructor () { this.bar() } bar () { throw new Error('this is a demo') } someJsx() { return
} } new Foo() export {} ts-node-9.1.1/tests/throw.ts000066400000000000000000000006031376344015600157600ustar00rootroot00000000000000// intentional whitespace to prove that sourcemaps are working. Throw should happen on line 100. // 100 lines is meant to be far more space than the helper functions would take. class Foo { constructor () { this.bar() } bar () { throw new Error('this is a demo') } } new Foo() export {} ts-node-9.1.1/tests/tsconfig-options/000077500000000000000000000000001376344015600175535ustar00rootroot00000000000000ts-node-9.1.1/tests/tsconfig-options/log-options1.js000066400000000000000000000003251376344015600224440ustar00rootroot00000000000000const assert = require('assert') assert(process.required1) const register = process[Symbol.for('ts-node.register.instance')] console.log(JSON.stringify({ options: register.options, config: register.config })) ts-node-9.1.1/tests/tsconfig-options/log-options2.js000066400000000000000000000001251376344015600224430ustar00rootroot00000000000000const assert = require('assert') require('./log-options1') assert(process.required2) ts-node-9.1.1/tests/tsconfig-options/required1.js000066400000000000000000000000311376344015600220040ustar00rootroot00000000000000process.required1 = true ts-node-9.1.1/tests/tsconfig-options/required2.js000066400000000000000000000000761376344015600220160ustar00rootroot00000000000000require('assert')(process.required1) process.required2 = true ts-node-9.1.1/tests/tsconfig-options/tsconfig.json000066400000000000000000000004711376344015600222640ustar00rootroot00000000000000{ "extends": "../tsconfig.json", "ts-node": { "compilerOptions": { "types": ["tsconfig-tsnode-types"] }, "transpileOnly": true, "require": ["./required1"], "skipIgnore": false }, "compilerOptions": { "typeRoots": ["tsconfig-typeroots"], "types": ["tsconfig-types"] } } ts-node-9.1.1/tests/tsconfig.json000066400000000000000000000003141376344015600167530ustar00rootroot00000000000000{ "compilerOptions": { "target": "es2015", "jsx": "react", "noEmit": true, // Global type definitions. "typeRoots": [ "./typings", "../node_modules/@types", ], } } ts-node-9.1.1/tests/typings/000077500000000000000000000000001376344015600157435ustar00rootroot00000000000000ts-node-9.1.1/tests/typings/does-not-exist/000077500000000000000000000000001376344015600206255ustar00rootroot00000000000000ts-node-9.1.1/tests/typings/does-not-exist/index.d.ts000066400000000000000000000001031376344015600225200ustar00rootroot00000000000000declare module "does-not-exist" { export const foobar = 'test' } ts-node-9.1.1/tests/with-jsx.tsx000066400000000000000000000000621376344015600165610ustar00rootroot00000000000000class Foo2 { render () { return
} } ts-node-9.1.1/tsconfig.json000066400000000000000000000006521376344015600156160ustar00rootroot00000000000000{ "$schema": "./tsconfig.schemastore-schema.json", "compilerOptions": { "target": "es2015", "lib": ["es2015", "dom"], "rootDir": "src", "outDir": "dist", "module": "commonjs", "moduleResolution": "node", "strict": true, "declaration": true, "sourceMap": true, "inlineSources": true, "types": ["node", "mocha"], "stripInternal": true }, "include": [ "src/**/*" ] } ts-node-9.1.1/tslint.json000066400000000000000000000000521376344015600153110ustar00rootroot00000000000000{ "extends": "tslint-config-standard" }