pax_global_header00006660000000000000000000000064132405441070014512gustar00rootroot0000000000000052 comment=0c136c4c6e1e445b4274e61898f62c3dd928a82e buble-0.19.3/000077500000000000000000000000001324054410700126755ustar00rootroot00000000000000buble-0.19.3/.editorconfig000066400000000000000000000001531324054410700153510ustar00rootroot00000000000000[**.js] indent_style = tab indent_size = 2 end_of_line = lf charset = utf-8 trim_trailing_whitespace = truebuble-0.19.3/.eslintrc000066400000000000000000000011211324054410700145140ustar00rootroot00000000000000{ "rules": { "indent": [ 2, "tab", { "SwitchCase": 1 } ], "linebreak-style": [ 2, "unix" ], "semi": [ 2, "always" ], "keyword-spacing": [ 2, { "before": true, "after": true } ], "space-before-blocks": [ 2, "always" ], "no-mixed-spaces-and-tabs": [ 2, "smart-tabs" ], "no-cond-assign": [ 0 ] }, "env": { "es6": true, "browser": true, "mocha": true, "node": true }, "extends": "eslint:recommended", "parserOptions": { "ecmaVersion": 6, "sourceType": "module" } } buble-0.19.3/.gitignore000066400000000000000000000000631324054410700146640ustar00rootroot00000000000000.DS_Store node_modules dist test/**/actual sandbox buble-0.19.3/.gitlab-ci.yml000066400000000000000000000002171324054410700153310ustar00rootroot00000000000000before_script: - npm install test:0.12: image: node:0.12 script: - npm test test:latest: image: node:latest script: - npm test buble-0.19.3/.travis.yml000066400000000000000000000001531324054410700150050ustar00rootroot00000000000000language: node_js node_js: - "stable" env: global: - BUILD_TIMEOUT=10000 install: - npm installbuble-0.19.3/CHANGELOG.md000066400000000000000000000465231324054410700145200ustar00rootroot00000000000000# buble changelog ## 0.19.3 (2018-02-13) * Make sure browser builds are actually valid ES5 (except for the modules build) ## 0.19.2 (2018-02-12) * Correctly specify browser field in package.json ([#107](https://github.com/Rich-Harris/buble/issues/107)) * Fix a compile error about using `super` outside of class methods * Fix transpiling rest properties ## 0.19.1 (2018-02-10) * Fix transpiling let and const if arrow functions are not transpiled (i. e. node: 4) ## 0.19.0 (2018-02-10) ### Enhancements * Add support information for new environments * Add (pass-thru) support for aync generators and for-async-of * Add support for dynamic import ([#102](https://github.com/Rich-Harris/buble/pull/102)) * Add support for JSX fragments ([#62](https://github.com/Rich-Harris/buble/issues/62)) * Add unpkg build and transpile browser build for older environments ([#93](https://github.com/Rich-Harris/buble/issues/93)) * Reuse tagged template quasis ([#67](https://github.com/Rich-Harris/buble/pull/67)) * Transpile trailing commas in new expressions ([#63](https://github.com/Rich-Harris/buble/issues/63)) * Add support for destructuring in for-in and for-of loop heads * Add support for destructuring in catch clause params * Add support for rest properties in assignments ### Fixes * Don't remove commas in comments after the last argument ([#89](https://github.com/Rich-Harris/buble/issues/89)) * Support transformations involving aliasing of variables in block scopes ([#60](https://github.com/Rich-Harris/buble/issues/60)) * Evaluate expression only once with inline default pattern elements * Fix nested object and array patterns, rest properties and default values in for loop heads * Only put own properties in rest properties * Improve declaration of helper variables * Allow modification of mutable variables that shadow a const before declaration ([#59](https://github.com/Rich-Harris/buble/issues/59)) * Correctly detect modification of immutable variables through destructuring assignments * In object methods, support destructuring declarations initialized with a variable having the same name as the method ([#86](https://github.com/Rich-Harris/buble/issues/86)) * Fix properties with string literal keys after computed properties ([#91](https://github.com/Rich-Harris/buble/pull/91)) * Fix methods after computed properties ([#101](https://github.com/Rich-Harris/buble/issues/101)) * Fix short-hand generator methods * Fix template literals in array after spread element ([#105](https://github.com/Rich-Harris/buble/issues/105)) * Fix arrow functions in array after spread element ([#100](https://github.com/Rich-Harris/buble/issues/100)) * Fix arrow functions in new expression after spread element ([#100](https://github.com/Rich-Harris/buble/issues/100)) * Restore decoding HTML entities in JSX ([#104](https://github.com/Rich-Harris/buble/issues/104)) * Correct various entries in support matrix ## 0.18.0 * Allow anonymous functions and classes as default exports ([#37](https://github.com/Rich-Harris/buble/issues/37)) * Handle non-breaking spaces in JSX ([#46](https://github.com/Rich-Harris/buble/issues/46)) * Allow anonymous classes to be assigned to properties ([#33](https://github.com/Rich-Harris/buble/issues/33)) * Add `trailingFunctionCommas` transformation ([#50](https://github.com/Rich-Harris/buble/issues/50)) ## 0.17.3 * Move `chalk` to dependencies ([#35](https://github.com/Rich-Harris/buble/issues/35)) ## 0.17.2 * Fix nested template literals regression ([#39](https://github.com/Rich-Harris/buble/issues/39)) ## 0.17.1 * Error on nested rest elements ([#31](https://github.com/Rich-Harris/buble/pull/31)) * Allow destructuring with computed properties ([#34](https://github.com/Rich-Harris/buble/pull/34)) ## 0.17.0 * Update dependencies * Transpile arrow functions unconditionally if spread arguments need transpilation ([#22](https://github.com/Rich-Harris/buble/pull/22)) * Better object spread support ([#25](https://github.com/Rich-Harris/buble/pull/25)) * Rest properties ([#30](https://github.com/Rich-Harris/buble/pull/30)) * Fix ([#24](https://github.com/Rich-Harris/buble/pull/24)) ## 0.16.0 * Allow truthy dash-cased props ([#2](https://github.com/Rich-Harris/buble/pull/2)) * Make class accessors configurable ([#3](https://github.com/Rich-Harris/buble/pull/3)) * Support JSX pragma comments ([#5](https://github.com/Rich-Harris/buble/pull/5)) * Handle JSX with no spaces between attributes ([#6](https://github.com/Rich-Harris/buble/pull/6)) ## 0.15.2 * Don't create function names for object methods with `namedFunctionExpressions: false` * Simplify destructuring assignment statements * Give unique names to methods that shadow free variables ([#166](https://gitlab.com/Rich-Harris/buble/issues/166)) ## 0.15.1 * Fix `Object.assign` regression ([#163](https://gitlab.com/Rich-Harris/buble/issues/163)) ## 0.15.0 * More informative CLI errors when input comes from stdin ([#155](https://gitlab.com/Rich-Harris/buble/issues/155)) * Prevent PhantomJS shadowing errors ([#154](https://gitlab.com/Rich-Harris/buble/issues/154)) * Use local `register.js` in tests ([#153](https://gitlab.com/Rich-Harris/buble/issues/153)) * Correct CLI output filename with .jsx input ([#151](https://gitlab.com/Rich-Harris/buble/issues/151)) * Fix whitespace removal bug ([#159](https://gitlab.com/Rich-Harris/buble/issues/159)) * Allow computed properties in object destructuring ([#146](https://gitlab.com/Rich-Harris/buble/issues/146)) * Support rest elements in array destructuring ([#147](https://gitlab.com/Rich-Harris/buble/issues/147)) * Fix array swap assignment expression ([#148](https://gitlab.com/Rich-Harris/buble/issues/148)) * Allow template string as destructuring default ([#145](https://gitlab.com/Rich-Harris/buble/issues/145)) * Support multiple returning loops with block scoping ([cbc17ad5e](https://gitlab.com/Rich-Harris/buble/commit/cbc17ad5e1dc6e8af820fee372e6fb68e475afa4)) * Fix `super` with spread arguments ([#129](https://gitlab.com/Rich-Harris/buble/issues/129)) * Arrow function returning computed property ([#126](https://gitlab.com/Rich-Harris/buble/issues/126)) * Allow computed property and object spread to coexist ([#144](https://gitlab.com/Rich-Harris/buble/issues/144)) * Add `namedFunctionExpressions` option to prevent scope leak in old browsers ([#130](https://gitlab.com/Rich-Harris/buble/issues/130)) * Fix exponentiation assignment edge case ([#122](https://gitlab.com/Rich-Harris/buble/issues/122)) * Allow CLI `--output` flag to work with stdin input ## 0.14.3 * Prevent crashing on Node versions more recent than the latest 'supported' version ([#102](https://gitlab.com/Rich-Harris/buble/merge_requests/102)) ## 0.14.2 * Allow `.jsx` file extension ([#127](https://gitlab.com/Rich-Harris/buble/issues/127)) * Handle trailing comma in spread operator ([#133](https://gitlab.com/Rich-Harris/buble/issues/133)) * Allow empty code blocks in JSX ([#131](https://gitlab.com/Rich-Harris/buble/issues/131)) * Allow computed shorthand function name with spread in body ([#135](https://gitlab.com/Rich-Harris/buble/issues/135)) * Add `--objectAssign` CLI option ([#113](https://gitlab.com/Rich-Harris/buble/issues/113)) * Allow numeric literals as shorthand method keys ([#139](https://gitlab.com/Rich-Harris/buble/issues/139)) ## 0.14.1 * fix initialization of block-scoped variables in for-of and for-in loops ([#124](https://gitlab.com/Rich-Harris/buble/issues/124)) ## 0.14.0 * Always wrap block-less bodies in curlies ([#110](https://gitlab.com/Rich-Harris/buble/issues/110), [#117](https://gitlab.com/Rich-Harris/buble/issues/117), [!80](https://gitlab.com/Rich-Harris/buble/merge_requests/80)) * Make sure block-scoped variables in loops have an initializer ([#124](https://gitlab.com/Rich-Harris/buble/issues/124)) * Destructuring assignments ([!82](https://gitlab.com/Rich-Harris/buble/merge_requests/82)) * Support string literals in object destructuring ([!81](https://gitlab.com/Rich-Harris/buble/merge_requests/81)) * Standalone arrow function expression statements ([!79](https://gitlab.com/Rich-Harris/buble/merge_requests/79)) ## 0.13.2 * Fix spread operator when used with `new` and `this` ([#104](https://gitlab.com/Rich-Harris/buble/issues/104), [#115](https://gitlab.com/Rich-Harris/buble/issues/115)) ## 0.13.1 * Handle destructuring in for/for-of loop heads ([#95](https://gitlab.com/Rich-Harris/buble/issues/95)) * Allow early return (without value) from loops ([#103](https://gitlab.com/Rich-Harris/buble/issues/103), [#105](https://gitlab.com/Rich-Harris/buble/issues/105)) ## 0.13.0 * Require an `objectAssign` option to be specified if using object spread operator ([#93](https://gitlab.com/Rich-Harris/buble/issues/93)) * Fix spread operator with expression method calls and template strings ([!74](https://gitlab.com/Rich-Harris/buble/merge_requests/74)) ## 0.12.5 * Prevent reserved words being used as identifiers ([#86](https://gitlab.com/Rich-Harris/buble/issues/86)) * Use correct `this` when transpiling `super` inside arrow function ([#89](https://gitlab.com/Rich-Harris/buble/issues/89)) * Handle body-less `for-of` loops ([#80](https://gitlab.com/Rich-Harris/buble/issues/80)) ## 0.12.4 * Allow references to precede declaration (inside function) in block scoping ([#87](https://gitlab.com/Rich-Harris/buble/issues/87)) ## 0.12.3 * Argh, npm ## 0.12.2 * Files missing in 0.12.1 (???) ## 0.12.1 * Don't require space before parens of shorthand computed method ([#82](https://gitlab.com/Rich-Harris/buble/issues/82)) * Allow string keys for shorthand methods ([#82](https://gitlab.com/Rich-Harris/buble/issues/82)) ## 0.12.0 * Support `u` flag in regular expression literals ([!62](https://gitlab.com/Rich-Harris/buble/merge_requests/62)) * Save `buble/register` transformations to `$HOME/.buble-cache` ([!63](https://gitlab.com/Rich-Harris/buble/merge_requests/63)) ## 0.11.6 * Allow shorthand methods with computed names ([#78](https://gitlab.com/Rich-Harris/buble/issues/78)) * Include code snippet in `error.toString()` ([#79](https://gitlab.com/Rich-Harris/buble/issues/79)) ## 0.11.5 * Preserve whitespace between JSX tags on single line ([#65](https://gitlab.com/Rich-Harris/buble/issues/65)) ## 0.11.4 * Allow computed class methods, except accessors ([!56](https://gitlab.com/Rich-Harris/buble/merge_requests/56)) * Compound destructuring ([!58](https://gitlab.com/Rich-Harris/buble/merge_requests/58)) ## 0.11.3 * Ensure inserted statements follow use strict pragma ([#72](https://gitlab.com/Rich-Harris/buble/issues/72)) ## 0.11.2 * Ensure closing parenthesis is in correct place when transpiling inline computed property object expressions ([#73](https://gitlab.com/Rich-Harris/buble/issues/73)) ## 0.11.1 * Fix computed property followed by non-computed property in inline expression ## 0.11.0 * Computed properties ([#67](https://gitlab.com/Rich-Harris/buble/issues/67)) * Allow `super(...)` to use rest arguments ([#69](https://gitlab.com/Rich-Harris/buble/issues/69)) ## 0.10.7 * Allow customisation of `Object.assign` (used in object spread) ([!51](https://gitlab.com/Rich-Harris/buble/merge_requests/51)) ## 0.10.6 * Handle sparse arrays ([#62](https://gitlab.com/Rich-Harris/buble/issues/62)) * Handle spread expressions in JSX ([#64](https://gitlab.com/Rich-Harris/buble/issues/64)) ## 0.10.5 * Create intermediate directories when transforming via CLI ([#63](https://gitlab.com/Rich-Harris/buble/issues/63)) * Update README ([#57](https://gitlab.com/Rich-Harris/buble/issues/57)) ## 0.10.4 * Support spread operator in object literals ([!45](https://gitlab.com/Rich-Harris/buble/merge_requests/45)) and JSX elements ([!46](https://gitlab.com/Rich-Harris/buble/merge_requests/46)) ## 0.10.3 * Disable intelligent destructuring, temporarily ([#53](https://gitlab.com/Rich-Harris/buble/issues/53)) * Fix whitespace in JSX literals ([!39](https://gitlab.com/Rich-Harris/buble/merge_requests/39)) * Add `: true` to value-less JSX attributes ([!40](https://gitlab.com/Rich-Harris/buble/merge_requests/40)) * Quote invalid attribute names ([!41](https://gitlab.com/Rich-Harris/buble/merge_requests/41)) ## 0.10.2 * Don't add closing quote to JSX component without attributes ([#58](https://gitlab.com/Rich-Harris/buble/issues/58)) ## 0.10.1 * Fix handling of literals inside JSX ## 0.10.0 * Basic JSX support ## 0.9.3 * Better spread operator support, including with `arguments` ([#40](https://gitlab.com/Rich-Harris/buble/issues/40)) * Fix indentation of inserted statements in class constructors ([#39](https://gitlab.com/Rich-Harris/buble/issues/39)) ## 0.9.2 * Allow class to have accessors and no constructor ([#48](https://gitlab.com/Rich-Harris/buble/issues/48)) * Fix help message in CLI ## 0.9.1 * Prevent confusion over `Literal` node keys ## 0.9.0 * More complete and robust destructuring support ([#37](https://gitlab.com/Rich-Harris/buble/issues/37), [#43](https://gitlab.com/Rich-Harris/buble/issues/43)) * Correct `this`/`arguments` references inside for-of loop ## 0.8.5 * Allow destructured parameter to have default ([#43](https://gitlab.com/Rich-Harris/buble/issues/43)) * Allow `continue`/`break` statements inside a for-of loop ## 0.8.4 * Allow class body to follow ID/superclass without whitespace ([#46](https://gitlab.com/Rich-Harris/buble/issues/46)) ## 0.8.3 * Performance enhancements ([!23](https://gitlab.com/Rich-Harris/buble/merge_requests/23)) ## 0.8.2 * More robust version of ([!22](https://gitlab.com/Rich-Harris/buble/merge_requests/22)) ## 0.8.1 * Fix `export default class A extends B` (broken in 0.8.0) ([!22](https://gitlab.com/Rich-Harris/buble/merge_requests/22)) ## 0.8.0 * Subclasses inherit static methods ([#33](https://gitlab.com/Rich-Harris/buble/issues/33)) * Performance enhancements ([!21](https://gitlab.com/Rich-Harris/buble/merge_requests/21)) ## 0.7.1 * Prevent omission of closing paren in template string ([#42](https://gitlab.com/Rich-Harris/buble/issues/42)) * Separate variable declarations for each name in destructured declaration ([#18](https://gitlab.com/Rich-Harris/buble/merge_requests/18)) ## 0.7.0 * Allow arrow functions to be used as default parameter values ([#36](https://gitlab.com/Rich-Harris/buble/issues/36)) ## 0.6.7 * Support `static get` and `set` in classes ([#34](https://gitlab.com/Rich-Harris/buble/issues/34)) * Support spread operator in expression method call ([!14](https://gitlab.com/Rich-Harris/buble/merge_requests/14)) * Fix `for-of` loops with no space after opening paren ([#35](https://gitlab.com/Rich-Harris/buble/issues/35)) ## 0.6.6 * Fix another subclass `super()` bug ([#32](https://gitlab.com/Rich-Harris/buble/issues/32)) ## 0.6.5 * Fix `super()` call in subclass expression ([#32](https://gitlab.com/Rich-Harris/buble/issues/32)) * Less defensive template string parenthesising ([!9](https://gitlab.com/Rich-Harris/buble/merge_requests/9)) ## 0.6.4 * Add Node 6 to support matrix ## 0.6.3 * Handle empty template strings ([#28](https://gitlab.com/Rich-Harris/buble/issues/28)) ## 0.6.2 * Handle body-less do-while blocks ([#27](https://gitlab.com/Rich-Harris/buble/issues/27)) ## 0.6.1 * Always remember to close parens in template strings ## 0.6.0 * Strip unnecessary empty strings from template literals * Intelligent destructuring for object patterns in parameters ([#17](https://gitlab.com/Rich-Harris/buble/issues/17)) ## 0.5.8 * Fix exponentiation assignment operator edge case ## 0.5.7 * Exponentiation operator support ([#24](https://gitlab.com/Rich-Harris/buble/issues/24)) * More informative error messages for for-of and tagged template strings ## 0.5.6 * Add `dangerousTaggedTemplateString` ([!2](https://gitlab.com/Rich-Harris/buble/merge_requests/2)) and `dangerousForOf` ([!3](https://gitlab.com/Rich-Harris/buble/merge_requests/3)) transforms * Prevent deindentation causing errors with removed whitespace in class methods * Use correct identifier with default destructured function parameters ([#23](https://gitlab.com/Rich-Harris/buble/issues/23)) ## 0.5.5 * Ensure `return` is in correct place when creating bodies for arrow functions ([#21](https://gitlab.com/Rich-Harris/buble/issues/21)) * Prevent deindentation of class methods causing breakage with destructuring statements ([#22](https://gitlab.com/Rich-Harris/buble/issues/22)) ## 0.5.4 * Install missing `chalk` dependency * Informative error messages when `buble/register` fails ## 0.5.3 * Add `register.js` to package. Yes I'm an idiot ## 0.5.2 * Add `buble/register` for use with e.g. Mocha ## 0.5.1 * Remove unused dependency ## 0.5.0 * Support `--target`, `--yes` and `--no` in CLI * Compile entire directory of files via CLI * Sourcemap support in CLI * All transforms can be disabled (or errors suppressed) with the `transforms` option (or `--yes` and `--no`, in the CLI) * `import` and `export` will throw an error unless `--no modules` transform is specified * Fix bug with destructuring * Fix bug with block scoping and loops ## 0.4.24 * Throw if `let`/`const` is redeclared, or `var` is redeclared with a `let`/`const` (0.4.22 regression) ## 0.4.23 * Add `buble.VERSION` * Tidy up build process (don't bundle Acorn incorrectly) ## 0.4.22 * Allow double `var` declarations (only throw if `let` or `const` is redeclared) ## 0.4.21 * Add `find` and `findIndex` helpers for 0.12 support ## 0.4.20 * Bump to resolve unknown npm issue ## 0.4.19 * Fix block scoping bug with for loops that don't need to be rewritten as functions ## 0.4.18 * Fix break-inside-switch bug ## 0.4.17 * Support `for...in` loops and block scoping ## 0.4.16 * Add `ie` and `edge` to support matrix ## 0.4.15 * Rewrite reserved properties if specified ([#9](https://gitlab.com/Rich-Harris/buble/issues/9)) ## 0.4.14 * Allow classes to extend expressions ([#15](https://gitlab.com/Rich-Harris/buble/issues/15)) * Experimental (partially implemented) API for disabling transforms based on target environment or custom requirements ## 0.4.13 * Fix return statement bug ## 0.4.12 * More complete and robust transpilation of loops that need to be rewritten as functions to simulate block scoping ([#11](https://gitlab.com/Rich-Harris/buble/issues/11), [#12](https://gitlab.com/Rich-Harris/buble/issues/12), [#13](https://gitlab.com/Rich-Harris/buble/issues/13)) ## 0.4.11 * Remove source-map-support from CLI (only useful during development) ## 0.4.10 * Basic support for spread operator ## 0.4.9 * Support getters and setters on subclasses * Disallow unsupported features e.g. generators ## 0.4.8 * Support getters and setters on classes * Allow identifiers to be renamed in block-scoped destructuring ([#8](https://gitlab.com/Rich-Harris/buble/issues/8)) * Transpile body-less arrow functions correctly ([#9](https://gitlab.com/Rich-Harris/buble/issues/4)) ## 0.4.7 * Add browser version ## 0.4.6 * Report locations of parse/compile errors ([#4](https://gitlab.com/Rich-Harris/buble/issues/4)) ## 0.4.5 * Sourcemap support ## 0.4.4 * Support for class expressions * More robust deconflicting * Various bugfixes ## 0.4.3 * Handle arbitrary whitespace inside template literals ## 0.4.2 * Fix bug-inducing typo ## 0.4.1 * Rest parameters ## 0.4.0 * Self-hosting! ## 0.3.4 * Class inheritance ## 0.3.3 * Handle quote marks in template literals ## 0.3.2 * Handle empty `class` declarations ## 0.3.1 * Add `bin` to package ## 0.3.0 * (Very) basic CLI * Handle `export default class ...` ## 0.2.2 * Initialise children of Property nodes * Prevent false positives with reference detection ## 0.2.1 * Add missing files ## 0.2.0 * Support for a bunch more ES2015 features ## 0.1.0 * First (experimental) release buble-0.19.3/LICENSE.md000066400000000000000000000021071324054410700143010ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016 Rich Harris and contributors 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. buble-0.19.3/README.md000066400000000000000000000007111324054410700141530ustar00rootroot00000000000000# Bublé ## The blazing fast, batteries-included ES2015 compiler * Try it out at [buble.surge.sh](https://buble.surge.sh) * Read the docs at [buble.surge.sh/guide](https://buble.surge.sh/guide) ## Quickstart Via the command line... ```bash npm install -g buble buble input.js > output.js ``` ...or via the JavaScript API: ```js var buble = require( 'buble' ); var result = buble.transform( source ); // { code: ..., map: ... } ``` ## License MIT buble-0.19.3/appveyor.yml000066400000000000000000000002731324054410700152670ustar00rootroot00000000000000environment: matrix: - nodejs_version: "stable" version: "{build}" build: off deploy: off install: - npm install test_script: - node --version - npm --version - npm test buble-0.19.3/bin/000077500000000000000000000000001324054410700134455ustar00rootroot00000000000000buble-0.19.3/bin/buble000077500000000000000000000010241324054410700144610ustar00rootroot00000000000000#!/usr/bin/env node var minimist = require('minimist'); var command = minimist(process.argv.slice(2), { alias: { // Short options h: 'help', i: 'input', m: 'sourcemap', o: 'output', v: 'version', t: 'target', y: 'yes', n: 'no' } }); if (command.help || (process.argv.length <= 2 && process.stdin.isTTY)) { require('./showHelp')(); } else if (command.version) { console.log('Bublé version ' + require('../package.json').version); // eslint-disable-line no-console } else { require('./runBuble')(command); } buble-0.19.3/bin/handleError.js000066400000000000000000000023351324054410700162530ustar00rootroot00000000000000var chalk = require('chalk'); function print(msg) { console.error(chalk.red(msg)); // eslint-disable-line no-console } var handlers = { MISSING_INPUT_OPTION: () => { print('You must specify an --input (-i) option'); }, MISSING_OUTPUT_DIR: () => { print( 'You must specify an --output (-o) option when compiling a directory of files' ); }, MISSING_OUTPUT_FILE: () => { print( 'You must specify an --output (-o) option when creating a file with a sourcemap' ); }, ONE_AT_A_TIME: () => { print('Bublé can only compile one file/directory at a time'); }, DUPLICATE_IMPORT_OPTIONS: () => { print('use --input, or pass input path as argument – not both'); }, BAD_TARGET: () => { print('illegal --target option'); } }; module.exports = function handleError(err) { var handler; if ((handler = handlers[err && err.code])) { handler(err); } else { if (err.snippet) print('---\n' + err.snippet); print(err.message || err); if (err.stack) { console.error(chalk.grey(err.stack)); // eslint-disable-line no-console } } console.error( // eslint-disable-line no-console 'Type ' + chalk.cyan('buble --help') + ' for help, or visit https://buble.surge.sh/guide/' ); process.exit(1); }; buble-0.19.3/bin/help.md000066400000000000000000000027261324054410700147260ustar00rootroot00000000000000Bublé version <%= version %> ===================================== Usage: buble [options] Basic options: -v, --version Show version number -h, --help Show this help message -i, --input Input (alternative to ) -o, --output Output (if absent, prints to stdout) -m, --sourcemap Generate sourcemap (`-m inline` for inline map) -t, --target Select compilation targets -y, --yes Transforms to always apply (overrides --target) -n, --no Transforms to always skip (overrides --target) --jsx Custom JSX pragma --objectAssign Specify Object.assign or equivalent polyfill --no-named-function-expr Don't output named function expressions Examples: # Compile input.js to output.js buble input.js > output.js # Compile input.js to output.js, write sourcemap to output.js.map buble input.js -o output.js -m # Compile input.js to output.js with inline sourcemap buble input.js -o output.js -m inline # Only use transforms necessary for output.js to run in FF43 and Node 5 buble input.js -o output.js -t firefox:43,node:5 # As above, but use arrow function and destructuring transforms buble input.js -o output.js -t firefox:43,node:5 -y arrow,destructuring # Compile all the files in src/ to dest/ buble src -o dest Notes: * When piping to stdout, only inline sourcemaps are permitted For more information visit http://buble.surge.sh/guide buble-0.19.3/bin/runBuble.js000066400000000000000000000065551324054410700155740ustar00rootroot00000000000000var fs = require('fs'); var path = require('path'); var buble = require('..'); var handleError = require('./handleError.js'); var EOL = require('os').EOL; function compile(from, to, command, options) { try { var stats = fs.statSync(from); if (stats.isDirectory()) { compileDir(from, to, command, options); } else { compileFile(from, to, command, options); } } catch (err) { handleError(err); } } function compileDir(from, to, command, options) { if (!command.output) handleError({ code: 'MISSING_OUTPUT_DIR' }); try { fs.mkdirSync(to); } catch (e) { if (e.code !== 'EEXIST') throw e; } fs.readdirSync(from).forEach(function(file) { compile(path.resolve(from, file), path.resolve(to, file), command, options); }); } function compileFile(from, to, command, options) { var ext = path.extname(from); if (ext !== '.js' && ext !== '.jsm' && ext !== '.es6' && ext !== '.jsx') return; if (to) { var extTo = path.extname(to); to = to.slice(0, -extTo.length) + '.js'; } var source = fs.readFileSync(from, 'utf-8'); var result = buble.transform(source, { target: options.target, transforms: options.transforms, source: from, file: to, jsx: options.jsx, objectAssign: options.objectAssign, namedFunctionExpressions: options.namedFunctionExpressions }); write(result, to, command); } function write(result, to, command) { if (command.sourcemap === 'inline') { result.code += EOL + '//# sourceMappingURL=' + result.map.toUrl(); } else if (command.sourcemap) { if (!to) { handleError({ code: 'MISSING_OUTPUT_FILE' }); } result.code += EOL + '//# sourceMappingURL=' + path.basename(to) + '.map'; fs.writeFileSync(to + '.map', result.map.toString()); } if (to) { fs.writeFileSync(to, result.code); } else { console.log(result.code); // eslint-disable-line no-console } } module.exports = function(command) { if (command._.length > 1) { handleError({ code: 'ONE_AT_A_TIME' }); } if (command._.length === 1) { if (command.input) { handleError({ code: 'DUPLICATE_IMPORT_OPTIONS' }); } command.input = command._[0]; } var options = { target: {}, transforms: {}, jsx: command.jsx, objectAssign: command.objectAssign === true ? 'Object.assign' : command.objectAssign, namedFunctionExpressions: command['named-function-expr'] !== false }; if (command.target) { if (!/^(?:(\w+):([\d\.]+),)*(\w+):([\d\.]+)$/.test(command.target)) { handleError({ code: 'BAD_TARGET' }); } command.target .split(',') .map(function(target) { return target.split(':'); }) .forEach(function(pair) { options.target[pair[0]] = pair[1]; }); } if (command.yes) { command.yes.split(',').forEach(function(transform) { options.transforms[transform] = true; }); } if (command.no) { command.no.split(',').forEach(function(transform) { options.transforms[transform] = false; }); } if (command.input) { compile(command.input, command.output, command, options); } else { process.stdin.resume(); process.stdin.setEncoding('utf8'); var source = ''; process.stdin.on('data', function(chunk) { source += chunk; }); process.stdin.on('end', function() { options.source = command.input = 'stdin'; options.file = command.output; try { var result = buble.transform(source, options); write(result, command.output, command); } catch (err) { handleError(err); } }); } }; buble-0.19.3/bin/showHelp.js000066400000000000000000000005501324054410700155740ustar00rootroot00000000000000var fs = require('fs'); var path = require('path'); module.exports = function() { fs.readFile(path.join(__dirname, 'help.md'), (err, result) => { var help; if (err) throw err; help = result .toString() .replace('<%= version %>', require('../package.json').version); console.log('\n' + help + '\n'); // eslint-disable-line no-console }); }; buble-0.19.3/bublé.gif000066400000000000000000011110161324054410700150650ustar00rootroot00000000000000GIF89akMX*/)2(!Ousˆ|͗I2HN2Vn٪p'0v4Fy)QU/-'4o2J(,NmpGTHPqI[>32yk&r)潣b{O'39DkpǨmH1ѴYVWAO)UeLB keRCS5e㴘憂αoTeٹOlVVKA=RL"b*wu[Tuhrf2vdm/hKV;wHCźRPj35JV׶FZe[gcUB"WYiyAJ̧ϴr?8hzzz;"%! NETSCAPE2.0! XMP DataXMP ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!  !,}_l_/¾ͻ_ !!Z ZZ ?,peB "\!Å_*D0(hшBǏ<ya "S\)˗0_L9-O*ԙ' ZAF@sCr! F≶hh&QF TqwT)\ cVvz]Y^W*d^IXC~V`b&À母]!G]uzk۠&PhM@#3+Xjs]SVԏD9VvzQڞg%Tj'aꚘ6  KfsZhnڳJ;h'ZWjC,$2>unsvZsj:>5 eRª4BX` /Ս '!gqj|> lyۊp0Gny*X*R 9Ge85)xz;KwS b`pQĆ~20A2p݈\RBŋS!@x!^t%QJ؂:7 8 7a B7P@ZHidılIDQX!A5̐3R (Wuȳ/S3AQEC%QiZ`FB (12B7D69I?,8ԄH⼍:kތld ^P]=+"K(|8yԥzAQho,ZL` [@`KHb=.! B4ΦaPtT ,>Á 5EhRH iB}c-kFmXe\'uGz h!o}K{ Eɟ\!ht]juڪk@K+ Lɱlc q#B & Sj .Ĕ(ӮV֮ Jݜ|; 3v .?*X@#x ^}jUz;h*XA#U?S nG+Az/v1b+ ~Qհ*YKF^  (#RR u8LgjA U@@ &FgM!,0cv4vt [|&2p$u#,/ ~4@lhO0pD:ˠ·16_@K]+" QK] S wa CgzNUbx C:ж PV'V3\  xU~HvVa/8Lî* PYr#4A dpmp N5t9hr/ a 0ø+DD?g0@R^@^2=)oj&*AEߑ<} ~UǾ`lm ̀HFQ5"}+`гJMhvhK[:6Ԡm{_6f ]xpYo{ܖt.0t !,Lc`G7اuGM[3yohN2|^mG+2_ζ#KO `+* կukcwkw9ko[{aj1 a;cc0f)/ xLyߧTC0='szesfs?`PAhtXu`MVP8 4uSQVm^Ԧguvc'nVnfvYnWwwv}ރonp?.r9Bgp wtk~ PpyЅKдFyaQ*7z4'sfPs! Zs2qWEǁd[aAf)Q{9S|0)YWmuafFvgvvdn8xunGw>Hoc2DA0er%R@~pp)7\vRY iU rTo,Wszz 3!Q6恑t]'Um7|h|`&m;`Ԇ|pwƃ}x'mZ[V`0dDtN](6Op{{'UpZ a'<<`xr3Z5gk(vEh֔єԔtQVrKm'u'G؆mhjvnאFwCh`{gB fpbyi#bxye В0iR&%*`8"5G20:zsz2!OXtEe YY0g)Wy)G@\nȏXǂe /gvϗ9lwnɃxeֹyUX`pwPxp# S&iU@ D qzZCj᎗QY+@ *\S VvhkɊo)gte[`}fT{@IR(i0 hzaJʞP6>'b9gsezx(WPPO)QyX7"mgm]gnϧviIowo wFvB8v;f֙WFabx7p '  P'SL q-IpZzs =rfOt m:XSE3T'ͱ#mwm]ǧ~mgnhXz}:.ꨏ`fQEQAtRpw#@ %P3ʤ JrH`[j7р?" f: RA9HuyeTu҆*zʧj`v0 }[lv;؜wngHDn0e*C%lAQ@xCi0Z w 5Vk5Pz֘1aْUySr*꣍Qo2E! .NiʦsVTgQU_\7{d`vfv'}Joڧ @kBf&_q9j&~7OU{8Oap, Z,9uP p8&V擽 S(x )WNз*ikZh7&{P"G4[6^ײh˜&:IC &g0l>) p T{Oл%0(ڤ-) S-07y4vrՋ'z OBIWb*yB  eAS8aTEᵂ_eumeg>8r7Jwɺk^KI%`KK#`()tY%3 -I;n8R0irHA k2,s4z7LxIgO [Aaet*{FlĄt53ۉ`|ڭm%*o&mnfbL3l%7L)pG s|OYZ0%ђZ0 ,rh{-l\bɻR5|uH;[P4eCiȶSp" 5]Qzj2e>pV\ wmVYAe{;l yXx J`{6w\5zK&|6rn8\HΈz vz[,!{ tUWɀ5Axq"W|+zrŃŌ![رgS8AZh^ c`DaĜc6>Y>`Ht`a%̐Ph6B 71 THd[F$K]tppE:t,sEA]%E\b%SXj(MUJ"@A2.k7|9c}'  4`6y2~ P@3hc^dj(i `1b tTA}plp0n1 ;ZF+Ő@ 6]Q$NCU,'D/0D)etQKݕ2v]b+0)"@첀/ X>qbXHJ&BnT!0"7p,Adf?8|ќdnJ?+VаFPz .1<"@-X@[G.`.c jjϘ*4Q]|S_hD&%[wH|@5D }" 9T EIIP $  @x4ܠ#:af$ K=N*:LJJ]&@UtGz B@fbpA>O/ICcrBFZP]}ʤ&Ǘm،SX?&ExBuSH G u5xExDU Z0N;V{ !Q'<ř8(IGRB @@V=ָ\p` A4 $qʨ&hiJ4PF.{b] 36+IoTehb9 *V6*ǸP'a(ԉqtzKгTv6A-laߒB&\SUhEd>hF`KqdT-5>@/֒R"A20%f0!50>KLMK#DE>JhPb% 0Xu^@@Tu2 2,0xFXy] XAT Whk#(59ŮS8T`foqZ̎I\"@Nag(\Vk0 0zvRTk-ӝ>ngfUoaMRd`erH`!;X;YY]o]NT i; 3.Pj(A008Wcm\y9T ~ @h3R?# (y<:Z`GK`(7J 1D4&Y6? rL! &zD{K:NWs F2 0 +@(̥&$P>н 4HԯO8;wccön|'fd& ¢-;9qITc %KS'P cFTu!l|jUMPɫFzX׸ -X{I8B8cuSW( v0LTNi٨)Q`AaO00 'ЂfA}w]OSmPGNwWd#EdPFMFX?/![s0!ccq4,ցr1~%-lK0T5sP۳voi F 1R/i'Q4@p|u}h=@/,'C2?mUަ P 0~]$sI0hr0h8aD}Sigc" U0#i+c+.*d0`0fPR q&58 S[WP_Wjؐ-4={A"0 'ovuKVRhCy16|= 6{|}}Spf_00`Sw s7FgM#|05Y6 `JBuL !0_PxP1($]({Va6hF&aT-bT2 A*HŇGeKD)HK@k @e^yR ORЈ0Y~ xbyҙ&s'"0UP 0 `C_ךDY oo ,Z pH?:PSyo0=h[f`S8TF\p"&޴- US-N@As''GF507_𣽥K6fg'8=jrpص`BL3lK@~ə蠭x|L"1)Yn5'u `/1u.Z TCcP4[C!x.[12+l{Vvha?{x2W +ZK7[-ʨHG[]`aAiʶH—WIy[曷qW*,РyY|aCk_db/K=9P9}=H|[9ql@~0 YDP1+:E2,1!@!%֬Ը ̏xqN*O µmmG0[k,[ Qy*ɶ؀~[{>P:1 ~, zXn/{g<!pㇽZ#;}@F)=<.x y܆9+rdʅ 9n22 Ps7`xfP [zD#`Ƚkʽw{iP [pW\fѷ a*D(6R`=LYl'o˅S{A_P~p _#WGJ`Evȴ2`5A%&@@@2<[s%AľK˶h$_sЯ4> ;~PCd/1 RfIT/u9u0$ K\,DɰȊ,aL1׺wae$)p@-[NK[ N\#`G2_Pn zn|, @0 F3*hM/PR>Ƿ]\Ը-'DR6]Cn|p I0.Qpo0 qBN `'{.hFLǤP)~_z5P7P6P)}MF0T2!qdXKF#A|$k7Nry,g`g.}کm2j U  Wqy۠{Bdc'*Rl\xDZ2kE"z De0vK hh;~`[n/0 (2aMIKTWP} [9 i z u%[mj>Cɦ" opJr; ̛ E !&;p1Tw|2[%˔y6<_&M4Gs].*_~,55 @TliJ# kG2[ Gr0 ~K-hUm;zڎW0zcDQљ| ZоJC{TꏬxZ !, ""L' = SS<`a7wwiCw1u~l~y~,!o>">=.==>.>emN"!~_lTl,DE%% (%O55(Jn# T~-##a#-[?W ,(4A+'CA2nB/ ;t2. )pI&T3f<(dÛ?E8qc*0`}nB>⡇GUЇI( ci 2 12kC.7A+z@ Ā碮2'UoYN! ,@ RÆً *b~fc#xkSc Xw4R]5` i0pzaE\$oIRbׯHf:_[U[0LID *=BLt*!-qE+XYbBP-'ݠ! "SY>B Za·w=*5@ @ D@ն6lDLt2BG$boH̔b. 0 Z?BèHJ P9u <\NXԭ<7aMB4Bb?jt`"B 3P7~ǀȕ! otD!Aj `D) x+!PS T q8BQ7eD8;TN;#p h`6$a HP| #vـ*c)0#-Hu3"V,<Ȗ`T>jhȆ @HiFK -@xaAUJ(`?ҕ9"H- p>%V;%*q2Y: صI)eY bT']bdI*rV]Zל!~nWIbB`Ce0Z'|CxX5^yz$O 2H~x<"rႃa0FZ[ q1䃁ЭL!)aHWů}*]鲀 N-@Gԋ>bd][`- a`G&) r&,]|HЀNؠ^5 AH!<&h `E#%J.V:= `{`-,E _rЂK ȝH48lrMw&_ܕϔ/!- (q(Ҍh0p4Fa - mŜaQXs$"&ZD4WRB`k /hQ-9-\ G h1{P||/x==:39֎Tѕ믃-vp;M}`>'Bb/=xmmHuO"[Nt Ȗ$~+ׄT~ :Blp$lʽR ?L-a/p"T Ӧ[! :|0%wcjzHc*gk,\fB:`d\W{du{Wts^}Ӷ S0h*n~^3 ; ub_X 4~F`pw*bZ1KR9`@ ¢A<Ɠ3x~.W puxzi* hvbpE |{BExczH5(AMg"ddtNWsUlr"]WP5V3?|a[[q 0m V(`xWUuQR(vH&I**VI{8xXu9@ #+ `rxڸ!3xxxc%1D`|0N@TFU$ljz' H7@ƀ v/dЕwl@)lbh[Hf_}VqAQ0C!(S؅ڦ':eHxJ@JptO23f-|wpKgS@Qj2Pycg k&MASJOgwTeNs0)7V3'P `2]gF`Hj[p<>:)m:p-3pZp-xK$\[46RiwxvPjjlPf ,0E#lC* B-C@ D9N0]:f]Ve.p C.Gf j4``P4;2sUb+NRIٛ\ pgpY$ekpSIOp8R Ve99۩ zkI2r` XԞ.! 0 Rp pqq{eg) ǒ|) G`qp{sP;ٓ"\sGfo6$I@aKI\pգI(`80%p6W~pNP:_j(h2"yt0fDEϐ"x I`Od}*r& DZ,S:i CHfPFpbHy}4p:zs( 2PvfX#Db."ZMc0pJ(k"]y,pxC )`@Uj0PfuZ #h.X.)Sh*I:SbGRɒq^ۗ|k%!@(&G1:D  #i(K)p}Y5kȚJl"I#+5hUjh*e e]kiU]]{:0eGZoi˯o { Wi `$wx4:ATRe6`8` vAK׉OhԝםɳhIETɻNju)!_Pˮ  Q g˯SBh *|Bʓ|۷s੷7H&︇渒AK92C]<)@6O.aE)k6:ܺ˝30빭TM.e%[) pt\ˑM`S`  jڨviskI yĪlWH^1I؎b91TK3jCAtiw^Y K89slLǏde$&gKۻ".<QԾ)vU.U)tU@UCX jٽA|M;OIAX?7uu)wpi 7D$#8J@KƌJ(po*=l);1K0bAߜ<+ypLqdTUj,ld`+o1Db\ʶHBLE d@Q?/1˰d4EnaTKe8O0J9P0C/Мv 9< ۩e7i "SfSpԁu.:b\KXEU}U:I|Fp]_@,ġ$10 -6єAaF#) KJ (k =98-LӨ}7L (`ıE%'PIvٟL:WgHin9:@d7d`O|{U AKCPœ p8YO`c9`f/_M7Mlf{#B 0"2y0n6=E9ɟD@ȸإ-($1?8m Nk=Hs}|::`v}- >K2L>$#Nzuo</عͣ= d?PĵjvL0vek䮃؎d,DWemv\69H`wUyFA+1=wxKLNv(0k =]c`ӿ^= 'BpR?~B'K!vOF2F\.uF$(]P0Yr*(NՍdHυd. bˈ*AK#P  V^]']in"FvU>T j%a?`F`[خ_]*`Oʠj˙iF?~H|ȠLl7F~ "\?3 p]D((ll7=&!@kU/}ZS{o7;I$$|4F@__:ݙ~ H{,yyTlT_}}_]u11K77i 3\#Q##k#n6)6J]K]}__//TQD+ '=' ,,!ffrf?fWy f,Xr d$q! #J8 ^Dб 2C@$2’J 9b3N%KdJ3 O@*e@TV`) l)IK֬ 1k9"& ,XhΊ=SF4lؾ[76@}!]/p,x『Y!fگԮI͛r}@X`b9\m$`!4@ӟ`PLуS(YDQ < ĉ( a *"<@!MtCp#7 qBeT̅ %0 ݢzKD9 vLY3d5V1B |E `p+W @ǟ>@Z,JZ(9TjFU0ITyJDDH@g+$AJXKbV%d2ơ1pdrsŐ@nXG,TŖ6pi^}eyUy̌͸Ҽ߹CRHZ@;@,v>04o1rP ꨦNj!6؈n2[i % ʰ.w&0vB5mS^Fn-qxܚ _pULF'[[5c5`ƃlvpLl"PArf1+/#7r3(a \tuܜ@J(TvT)p-G*V{ɠԜ`lA'F0| t}TafnF$rL#GMpO00- gP,d)fr֕ |2KtLr햑4-=z҅s9"Pגg(& 09 ۞0&tχo04o `18 7 EsQ.p2@gZMH`siFUdw 3.iQKZ0& YG- n S퐇&(T! ه)`m@^RYV' :GƉ&p8CB@T8ZPn& q k#8,cǤMAqF;g"o:h8$$0Sak27l/` 7"L,0K:/pĸ:BpfL((AМ0` Z0#3+;A3XP:[6-x==MB,,:ѩ:4A4=0{,pH$!m<I)aZFOy`aѫPF/JI4UqP4g:B;5C5|pԝu'jPaI0SjS9ΰUTlkIӟa0o=e(cQ}Ԑ`K,1~In躸M WI4 I&KP\!$S.$xS L@jn M"1nvӢvڭVa޶ 9\nWV²c@P.lnAUkQGD']`381d3!āXKhG;]i(k[Q3kGp~0X`p:SVJ |>~&0Rjb X[HA܀ӍnM*]25G[ 7hqBVB`KoZ5-fP=[>M5'p^3֝WYIj 6OIy!;0?{(T'>*EI ~@Bz. *ՠ#M 5377Q`3(ۀgx]Jx2S~KN26*c ٠AU~3B g`\< MثaܒSR`n.B@*Bxo_n(!#&DLfx-h_W>ZwF,qϞITcfz`q)KdC\6xmcn!2cVҍM@m_]G\"ت$vP_g.0PN!3뻬Tm0y%|$g=Wh e3~{X197Bdv3W#L`N<1` Tb!upZ[dgvk`ei7 s{%r'[4UFrF!3֍I^a{ J`_W;֩W8 ~ VmV`5llxx;PS`gwl ѥ8.XN:rT60\dHN jL{G? S+dAɓV zTNIk+Ok+:9$KOgA0!NpV3 0A&Vc0kS9yPaP~B۱#nrenZeY*J-.4rrsaN)mQ5[ꉶ`06p6R *=eyl)8<iuj$ : tCLTɋ`p vM@w{X y6&>6"cNF`NFP07'@qC^/ xE@`,e)ЈX hXG`".4qb" QF0#\BúP!b` e*$# 2HAN A (Ȃ2B,oXC0C=2CR4BGT@!4SGjDЄm6ۤ82a@;B DbUBX<t , ctCt%<]`P5aXp~R* 2z@)LoQN* -7DPХ/hqdVB8s @RPUt c$7MOU1iM_&D;Ʌ.t [@F85 D1IEQL*S^P cBL!s G6 r $$'յ.Rl:"j0Ts#ܰw{PEK CPakDto@]GO Nr¨p-jrFɠ|`,nBΨSպ#Dx⨍/耩ư8ᛂpL`N4t"DXa۬HXe!0Si]@p k[V!]ÏطTט[A "cQZ3!5/_rtd]}#e 6!c(;nYsa,!t?{Og Sm$Ѓ++Sԩ'BĻ =#dnΰspD'bAfdJB4òFaXsԁ .a8g%/ڂ&]"!0|zBD4B#9 &aNKEMG#Ti6fHi_u;pNV`ɰP`aW}07Pk.8AYsZk4Q PQgXRvRdVmK99s} Wtysg Vz PzS!onGb!VoVW*a_Ձ$N`*څ0wqTi puvv1X@~QtB%~Wfۦ9c%2% f)t{r>NN[qHNkDZdot H;N`FiHg(7Uq6Ph>q'Tu0w򗄅L(otq"8 O9iZg[R) uajzDb"րv("\הx$A;8kxXc%PF)5 GQkA{'D~'ݖXt7Ca FKp& KI ;\"_905{zz#ČNmpoYbY1^N!$x}6wPP1PDYO85PHpǏP WP:4&%6.7K&s `PP9`8{Tz":u}Io#ƗR[7/ٞEvD`؅E+qnWB )`>1᷏ޗJC!%9cKX"ZCe L!nig)Ɲ bG/z9PVU鴗^N ce بx0A|7#pqDi8Yp7}y')5\pYu Tscs7wZt 93 6$ AyVz0ih;@W>[ƞ0FCZG1H)+ѕk`5)\[:FZu@TUS`U\+1Ki fil6wڅ:&:%1B_3~0ZTKSpcT }9: cFb?::vA@<hjxY0{)J#p0*rB)3'6HDKR+%Yaf3gvf$\xZʤ9[}tn`?K:I03) hVdi.)\zw[` FyV=LyÆS悯*[EyimKPO𥴚53n <`?47AEDD7CD8+@@eDGty@<zt`l{K 7 T^ZО0ȯdDF7A|g%HCeT9+z9vF)3<.(9JQ~Ё+͑{TFjeLtgD@tap}:p3\Km; 3 |U;'T- \@#UgvB==L kiȦu$dt &RgvYz'RP ">*R#0 % eeİaJS/3P 0 PHJP:n&9C QL`ka=~ jyZB1G@3!}A@Vz(zp٫08FN G`GcDG@M|yEY")%40<t8P }pjk քжj]pЃp ?PQCp'A 6fg-:䵤S*9$py 9$zCk RNZS.H`tH)*]% FY&/5(l@C@ "dX,APmɴ=-He%U\':/Z'GMg!G׋>kl*I` 0'`4J{$3"%.rG30tX3`3 8m.>p15.WM6Ry-݊%}78a6ڭyӔbZކG0>Kuy~fbl-m gg<S`EBw)`4bM*;y^t}\]FY4>’,7,]/Q I[RJAq'us7K^d=eG '0:m:B-!L>{~eI0 ig p^L39r^8_XX@%nۂˇ8:N-l]]cЦjC^EN'SZsñI$2"!9BW<3.L hn@DDIt/ &[B4b.[zX5pRX%0祥XB0\@n0Le\LQ@LAPH3 D$F?N4tHHL!t3ˑ$ "2RB'O0(r %f"ƩDP 0pJ7ZЂ !3P誥n*3FG+`O4DԊP 2-[6}V9tiX!!BLA\qqA'zHXF'$q-'":Bb&'DJSHde!߄z .3e,a)B 7T:Ħ?8k  7T #u7ZyrÈc%@(*HRhS3EpN8d"B(DhiΈp "@HA9 9Dg$Dbm!2 rRJTp1bMthtw!‰v%RKV~$`DTpd \[1ILILSM,4I-4M% p1P|'8qbK3 S tB z F0!rCVB#͢ڕ]^B`:#.c*!>E@fϰf4""%π1!)u1a7@_mgZ 4ȗ HBXD@pd;RJBD!n<77c/ :v& ՚hƆ҆ `1+jF AfS82q?k 8"Ũ(b;<uދh`Ln0šu"!A5~{ z`c! 廻9!6_1`±S8Bk@J0꺡k81J/46?`X[ZҼiN… HЏiCvgX?c](|,3xCTnWb,[t3R#H\m,^ e0E7Adij@LiB0*%tw?$<̀3Xn p FW Wd  h_B,> P@N $/N )>%)HK6tIQ?a0<`LUND? Z(kEvgxv P$2y|y=*G,zk'SQ-0:%1IkV%N[B gTjFJ`: s|Wo r  `PFI<`x* XE#!qd3Z@{w]KiMX}P PukR yx!W2Lc,q5X@ @ %.TY W!=bhb/\>wWT G [`czH\y2zH34e97""N#a:77T= fLXwT p_0|0̄T{l' :t5p B!F ~DV't/p V 2t 0" `(z! c P4fcqŧ #xr X{B  P3J 4'2Q'jS1pwP|X 0rWjeH 4_P}@!QE4$DD< On#6To tESm>p8Goq`~xI N,wpe bV, mTe% 1֙Ay'>5%bkK0uPu y\!`=@8uZ`"Q<1Z^Lw^u'tTx. Z@yGpmX exg!Puq ]I`G py`r.,#Re R"I#R_F &|S]{ŀ{2z%GP3Ty!nE-YAh6 hvR ) v/b`$gn MHPpp+NwxİŠ|誈|##)2xQkȉe@@ZФУl8U\0=>pGP*kz{~ I<4.Y`Fh X6`5YZT 04¥0%'e`y l.R (:٣ FQpM RH JU43s΢"S(*>XW1`g{'B"^VT `DXPh&S:pL$('E~RfwCMG]a #0"GE 9q!Z7*wh֝9 >PK(E ؙt#Vmk@)=H Т)j65|7u v y)Rkmq:l'p3hW@0Op)=:hArs1:F#& EE VP 0h~G>um!o04Gifb#ff Ā@\6;l)<0n7&[+ 1T=">y>,* QJ42X aPD ST0N)a=J]AV (&&t*Z1ku iU6cJf>> Sr#֝ &b#X*tVu((Z`kQ.z$GPmPQks@Vv5) (5)/ {Tf{)-o?=T<Ā>B RtهZ U_@PN <4r. j_:9(J)c1D  ]F7iC S! *P;G '9ɋ AQF, Gq)T|@@7.(037 - {~ [7MNK dvLXM{և RHGJB!ЫS V7 RP] p`ap0ip{9(,'2.P3Ҳ˾7yt52VhP /UY/`On k bjNU8*@qL8gplṯZTս) ϠG J(* jM,gVrQd1y\fg`k-{9*#7NUXe*4,T'``E0e"'Zv qǓ @Tvk3 2 u\d1( CMqG U@Y] =zT7cѫy yUhP@#-koi.8,)E QV/ ipZZ0k\Im*B:. _rz๜< % `e`w vWP?pPgZz$0 RM}H\upN k*T=I:8z'dkoPJ,fhy&nBWpCѪɵDkq3gN`97# "9l{_0`˲$KQo G ^'vbwIZ/-`97y$8 AU' \t|܈:^u>3QU?Qxdy<%.Oap_^u 2TnaI@ S7@n'p-qKU`U~H` 8@k2Yy[/--pWΙ2yGNNUaawuuZ u u! -PUUZZZP~Z*DD3%% %53 n#Q \ 7P<*RU1 Ioo=+R+0  dU/,hK ~GnD6&{e (@IrNd|vN8IҀUMl3(41#hPGBDZJEa yEKh'CPBZNDê+e @ 3P0`0ρk DkB&'cŕV,]mB)r)* W$FdȐA{(! Cll QӃ'+Avk)|J߬xfu$ D ͞hZ5 D(# ZZ-j v7 ![qO]3+3,+<PSS3!ṈURB %Ctl=V@lHېq$+y+ INJ'DSo~ph(-RTQ pAT DaQ`H a7 ! ]@~HYB[E!\tq\Xp,Jf  D,Bf>E|BCV!!! AE fG\&1OpK9yU(\Gf {6b' 6M>uf{VrpՏ~4[l^|a0 @2+҅a":2hO^F֊=U,a-BBŴCR+$0%C"iy_ R@lǘ059}+@E5M /x4opg .b\Q{K`*5F`)@!Y?V3jT<W Ub#BgcN(Q A<< l-P<6nD'=hXc^!Y8y}ajE & ,Hv?."'@ |)X|`pE磸1bEa8whU4b&(` QRĚ *XEKTmH,JL y7o, Cg H@s]`q&pX_@C(LRp B|%e# ֥J2b z5 p%d?@B1n0*XV,X">gA ؕM y X!N(6nw6+ tR @ #0hx 6`(!W[,fD$`f0 hz8DdebbE@DEW%-8?E^ 0t8|B+>jS:-P_J}4SP)|- *WH07G~wY/}GvO  66AF€=RA7MA=fI32cC/҈ ; hu@;JE5 pKcc A3uv>>2PaWK1pwwupK90uP6(0(|G6 Acp#}@yY-uyWb3_ 'dr +CӖ!?:;˲B )ETD5s;VQ Sj%[pnJJ_Iv İ!ř l&ewd`T 3X P90)@9pwX%Ay 8P9jF`p DkK6+%!C R>lR$4I>Χ-PVV* :0}_yJ؟R8pnU''w@~Âh:9$03J@I )#0]@kKbLuyQYyx_`uz zL5\VZN kEUy<'YEQLp'ѳ*­&Dc=;煥:?E9渔K[wf֦ I9'F ̭7,ȓqPOv c` X7!׻0,RS{3B-|6\,*,(>{@ 뗭*`˸RV|jp?$*pѮf lv`c`0ɼCA9p}ػ4;L w]$YbU.^*pMq MFN`bt,FϒFrVOʿ [WXř;2^ erBl`wph`})1a]P{]{#EIY,Y[,<9r¥'@@*s0n!]X3Lt3@ ,@s2 Щ Ůn'ܦ^,3`x!XA `E cYWyx }QE,SEUFͭr%D-@W 1<#{3vcidPۏ[jfjp (0 t~&4_` bH[))0,uK0C0w`x܌ӋmӕǵqRPN`!!t?p@WO!a({=U}{!- \Gp `[[`n) l ƘP#4Igbب}x<]0k uТ,*uK,blD0( C9q=rfL( Q6!,0%a=N0|)^@o;0#FfzgX\ m)a }/ aړ0aD,/-tlǫQ]17*-lҵ(Θ1,pY&H mݼ\Aj'w  Qg>b^? 70;),H 8 Yf7bSY $L`m(Un+U8kWgu&6[6ھFBɚ. 'usIvB6מ0_U"` 0#HdviAPC 6."9(Zf$@mHB. KTOErX%3^4c]6}AE6u :s7 KWvb)rw@ 5XaGȀD$q6HRRG@G V!v ꑉ4I1pMM%UUWa WZMt;VWYlT]hE 1HxM\AB?^|zG^`|aEК-HH"vD 6 nU#" ,R ҈ \pW1:5j'XA!Y@vG:iH9=MϮ!lcW2H ~D҂t#@́`1tiɑ͋I@K2@PU3`^/ZݘW_8gO} EذSb%b/d^w݄T, %!8IȠ6fgG4Z LCڠHgBqp5PG Z܀4 /.2= ulsj9 Geq=C芘#k~vHVbH``Wᴔ>8?B8b#9kV  JH K@`/xfĠ H!5Qu K-&!ٰP4~@ݠ,Gi)NˌLud4Wpb jX4qR&(X/z yI^X)+o T@ȍ$5`Rg@$9%$DPTLXEj$H $%tF>`F7YqVJ ati _@+Ti0[޸ L#\Vpҟӡ̄\tAt\H)FD 4ZGjb%`tICpt/4P.$o‘1/d"+=c[AP‡NY-Z@4zAQ&-ЉQbBPy dR9:ﴆ Ji!"G^ytn@lbbm[k2a>6h\BH%I/76nG1?$W!IgACP@'Ǻ]#,H9 ) VQ_brp^`1u|{ϱR_(PlKmbt٨9-8-q0O0v(JowN)q% mv|D}[s='ySHb2Ci+sU|vdnTp@1H'm23 E[U94j@9x`d9 !f!QgVv\KpW0P0YF^a(y s]BXDI#dC%T #2(t=x$Kru5:AuE>yGPyKo !01qJ qJfC0|10H.cU+s(u}$l1oAyS7?>J'X {8KTwEђ eF= QJ!B.PpՅl#WA whaH/HXo*IłҔcZ aZ,R'YTk3FUz9~P⍭eKR|1k{O{5xMCB=ЗA t21LiӋ7iVZ%(Z@UI[T7'&jaua2" ('!QB 8v)k0}+lm%a8MH91ހTrOrhCN=2IID"Q68`]fjuEvՈY+<Z3Zp"Z@t ]sT9{&g`Y:tzr P@!H0z4&hs+*ڐY(3R@ q-I3dA9(a@!,Z F ?!?W!!Z ZZ~y_Tl҄x;; HFqӇ?FPQR[4nME2 M*\Ȱ<"'7p2eN!r A‚-RDQ?AhPHE D\$13ȆH.  <gqe}uRRT& %iOAm茫a ~r  { -'3U2+HY0E?Dzߡ2n[v} b ##w5aVUubYw( @TSMNe PT{zmRA{%߇ @"HSPQ W[)[:PX!։v "i@!:i$BLBG xbHX%# re !!LNqbFb:@4NL' R#>h?1GB )M)^ \* ((Zڈ dYb(^f "XPb@5QbH ! F,sq"1"n Q{NtwUڃqzf l".l:E+dGj+1S@Uһ—hI& G؊Z|W][l#??T5F'bMƁMb( @5B\GVȍ|* jҩ2 J%$n9ڥ* H &71B  qCr :^]!1`<&9o{Y2 <Fj!<`f0&Q`FO`?UH w#u$JPЃ4TALvMD h |g$^ r3֠au`!9  TAmfDe*`G6S- ƪ 6"^C/~Ct5# LJ5-mTjg!24 W㟂r XxX!&&% U_5j koܴ 7pr]X1h-s7LNC:0: d$HbTCW@ٍ@·%ⓣ T:œwvNb ?%} ASs;7-$<0T#FAyϹ2Jp qH[a yz?@Z4ّnVIKβ P`9E\t`A&DB@N&yp'%ZÇ\kA,PLzm^Xpg1@ 䭴Ko ?An zH0n|J iQ. ]"/̀'ֵ&FrJ50&'/Daʋٮ5!2fFDǡ/Xp )TФ B΀?ֻZz[OkpvOX5^#P77v;7KZ?U{w-gj`wW!]"}Wf=`&#dkG"vBpx.*jtzw"ebXm@uրG f""nRKpp77&v;ti/'8cjQ}q@Fx`BBD"txx` Iqei6yalsdAGn  &d`i7usCq-P{{=,H]R8-?,c&a@UG,f@}`]hkb/dp⊝% Gpz+@VW5:HP, }Ek w8+Sa0(V79I(Y`bMDA[`Aw=H @8~=7e*06Gxx. 01_hm7f~m&tux6Cım;fSTA{6+wCnwpoqӍYpA->Y!ѧS|1}DH9, U'q6*#t)/Zp#_)x=A)_oI m*t ΁i_XY!u`wn$CY5P{K䓂`P0iLK$)w`V@= .d`r~AD5Vp:r. P37sM>z s^0>&zx6#Rɒ7nho{3pt3JLM(psUza(Xtӥ/iP!Lc ljsq;c~QA;K@|T.0+*+=M1wo)s宺H7, mƶD^z4)q{n(v0%M8@7ի22S H 0LL}j3")cUxqJL@vZ2ԭSSA.`)rީ_ʆ:m51wiXЗnpPXRV󩆹5֍M) Py)q U[#cgi/qE@*p?9N dkL*/; : 'Iv#=p"&+]FƦ> c JsŖ{F"JZT'7޸LlZ5(#PTW٥@T ױP0Lf R!)uwvq"r080򛄐?2d;P (PVu{V;pF1('x?D ژCRk`(Pċ8O$\a༃`0'<09[H+, X5d va%s0#A{ROIc{" H&lY*m89fЦYPt 1niP=y{Q* [(\)`7uC)beO$;@0,tp(]"p o6dGe)A@|j^@0%:/SpK@b X+q+^ֆ*zНv X Peh* = L"ɫ-l(Y )OpcG5{[H P PmBL"mH 0. *x~.xSпaq_#mQ+mUyLm7Ɔ icNG6+403p,,ωmJNM*'\J9σ);@-S-JҤ<8[nGuF+ IF SD"{I`).}4w)=Ip#=` N@^ |@3`1 P&P`‘;"@X` `-p ;P+O¯ڶP3 `7uǴ}t&V8±0 1`D Es]E^%)AI/3)uGb/Os ]#<`Aϭ{>z"%Y@G13GdHUE4g%R*p 80x|Ȯ,K"<Ͻw΃8\46EGzddHa'uN0{:YQ Kx_ZU ,Qu[[k4IˍJ7bVxF`/CtpP ܘ`ȇȄՆ„0 ۰4Dq?p`[g&x֑TdNLf]b+}dWk=p"[9c0#@R؋'x'@:҆ o/UӒ>Ruךk5y{v~x9)X5 JۄpX >n@&8D%qI`A?EHVe2LvL6|N`"rGxGdBB@9`$p'Ml-NSO5U <ZnbIϏ?\CAF*q*"O_2s$$Qa{4‰ NF2YoPa#VZ?'<.1цL\?ڦ)&J2/ɬ|q 5|0* hT?VB mm \wOPI "( )2EDIHAm,M19A#PҢP'c%(A 80XSI( #p78y7an#p2qZѨIaفW_}%RD;dPa@PB-?7 D4O&$}֤ӫ8'0p@J@+0h1L0 -e \ CXb͠7o["9q_vBI GQX 9j+Po">b"&ᥨ=GG`)IL @*#d##4dLBC(BqF H1$1U3x-Lu n,Hy씉C"p DBxCι8a %|Z"*d?9?@/(BN I`Flb`d.SDSN&Jp^\'I0E )2C,:"wX- B pWq^r^`&79s@_Cga+H#{:( qE AZ#%L# B$*T=G ""  _Spp**eOdf:fљ o`41x A D p5%.[Ë pxMO:s &O"G "M"`FmQgt$ppGEH"`H%rq@'LD) 8=ɤ$FY(A)@v4|ؤ rJ P 0B l7@ң^׳$H/; X  0Adlל0 @sB :fDnD AXJs<$L6DtJ0`ŤDc:0H*QH䌆 @%!Ii]8a@q?H t8NpNɋBS}0:d*qH#ѣh UqX!㸑XD5o*c(P[1C >NX$E,$hWkq)T !p.@  P?Cl~#m GlsDB[ ᖭ` Y=!C9B6T?4 HDD+шE"*d\[@n_͠Vl2gЅoQ`%19Š2D(J(bس K*âJ L e<< h`SE0{ nl="%o)?@GeprBH`@ch "Zr|XAL)q 9T>"gd&>8`VD„X\:UE S,(K2HND8>  @-@ED6JBK E$` C"JdɟƇ Aju TT4v1o=-1p+7DBQHc*U,lh_%Qʓ%vr"&\O3etC 0# KCaPf7.@PUSB")!8)h"9Zp04 S  Q_h_B)PTe DD CJHS*rf?T`SBОD<@3@3Sdީ>rP \LZ)1Az"֐< dMC;}dvc4F\wםYi sZh@hVWh3!uo 'POx% 3 wƢ ܅brT}h` W5-?`l6A`EpU`\GScVCs?3 prztrC/s8@dMp~P141,|Nw&@}luZ<'f"Dt gZx-!uarځ&CE$ pCZfP[p٤.LA z29PsP5x@4@U0s71ZpillIp_0֋UY[}"ptzWcх,T-ʣ40+74G3DirZH M F}Q 3L]`PQq 0 y|*%E3E {c!?Y;Z1pwZcyWkQK}Q( AXH3<\x- s 7g`EB 1!a"Dc"aF}Q* xXyWYG0z@wS4B@me!M*r)brZkShw,}P 1؋mp}&zERQr&gs&R\nKsDЅZV\q!j>5S=B[MDI_`& 0 1"popy)A84G!18|h%gK ~vKPl@HW ~e'p9 e-a3IPn(<4YK\ug P<b< ҏa4aqKgkWpI(@7)B!| ~i8A19=V|7Y_&f5ً l5h] P`a3bjx0<|V>Z6~0ucT{L ! 13pZ_*ieq >#wsƒ$J6<5qz>a5m/Y] `Yy%1% "`;u!bR68k  `ZsmYt9)sl~@=qg--JPDc)h"GSD9Q";GGd FiٙZ Rm?bUYQHSF)@)D mBlkZK@r:pSz4~wyF+4"V~ J-!U `r,p jHa YP4\#X@u"ωPиXss1pg/ 7_,;h'AO1y#AqoA4}0ZhDj=*tZu:)tXi36 $hnf%9tsQ*߉FKtqx ql$Fv.20iDzi9 Z8P> NАF8)a>qѳ Bw&&̋J4ma+%kNdB=CWzZ p>X $g G C P69PKo8+Z f0A%;6EAPȥu2iK[WP숙ɹ*o9j0 YeKWzr0Rf̨*S~抵] M0de0.H~@A @H3"hŃ)`9`Vsև٭݁7L~cpPmU GF~L< y. $bFaR ` N #yUrCTwy\WU[z+ d U vLm&%I$[Z Z*OIa 6z4flme_CPp0iw =5F>{C-F.bPpg ,yGpMWWCVZV?RP+k.Й͙۵oy`J% A'ڀܧ9ry*&+>P뾈ޚ,nX^*mx|f'-F! P1 <@Nu|u9!!j"FG\%_w}]ҖsPP DLl9O[Q$Ȗ#\Ql)td6Dqi#<5$ 2AC9I@ ]xRxn-P ym xp'lI&z$т Lɺ(~Ҋ\'ԃIP'sgsA< E( x<' r0,"s2/r/+\IȜG"!\ ?'C 8 S${DIQEQHQT!l\u$uFvC54/M6L\"A,OaTw] * 0;UbX(P0 z?T"PGj ( uPL;*-0$T-%J,Kp~n;AO$o '8Aa3c Ü0d D0Fm!˨eoJ Lۑj(V{1<*> *3&l@`%$A!T'&ƹ?zم1qУdyKn ^ r=4'DEOE \&"A! I@B[hAX"K5i,vDI4l6T3^ie@ Y tZ0pI(E"a& QS! 14 h['TV;c18NG8Bhz@LmhC w\ O4Pp&6kDaGPhZ-/O ͨd<  < P(]3@ Ð2`0Ţ@ ?LnlQP $R)],(@F\B!k2tBqĜ&E e%g((4ӹ<8衹pf H<QA0p\$)IWߵ*A'LK A~cBbJ@-CgPO "j"@ R(2qA%ij)*l9vzJ6G਍X]蒇y!ph@-l $=yGec>'5! oJ,)MD 劄V8*n=2ĉDzB "/a2\@"`)?/-}XR7V)t\ 4c F2d74AeL `"N=N\0D <NAbCcWD0ZJ `0k؅st? I0œ>RSwAY"?x 3mD3JBk!|-̀>CwXq+[qiuI&Vt'NZ6 Ihs8{M\ї xL?ZPx%/b`?x@Q.( .yR@2]@ŒV 3dļ 5TL].Rִ&V@ӊV  ܌ b3?X"eN>)NXf1:yO@pg< 4Uv pk&_ eT Q  i B*ѡpfb?4m$;e3 %Q&8ssY3nLS \bcEV%cmP_rlgo 2$CU 6xn{7ngg``&jgo%2%A*"~'<0iaHZx(B m!qk(;Yr}v9U ȱ"P4 JErNpzBvl87t[RTbiE^0MNK$ htioXW L b=7G0&vr/rS$S@wסP12 e9+6DC1;DİyDчŔ%g@ns%YPZkt>7dM6YIPi90_@$q I搥?O@/  Wx2c;^B9 e4+ @;!3g[X938 r'@SsK *lvl&Y5&ZYX@[%@Ij⎬H@C5y>B*Z60C)h"/ (`LT}٘i}rX!` Y1F e0i3,2 *MZ"}[k¨%j.*]O8(HU=E5p޹)7Մ v]@/ .a}&CxMwYW@1Rx. "4j3# b5>E; wOY4ťXM(45::OPʩu#@o$ZDr}$ao/0^:0xY 6 H/OZ (@)`)` }A&ez\Ci-9wPXQ3D. PG*CxqC%HCw%=*ǦkJ 9V{X8P1J:  {ouY+%]}\ -UJ ɘᖋApx@b- pj2SI;uHcfw>g*TY{Z)5`ko޹ ;s]Kj1@XJCu_۠)~A$wa`L\yh'4[:ԍ~zS$Q@kVNYk8[La=Kɐ K g9P:)`|?*<K'_K  0rZ( B90"jѦ#6@CoSdA1@1B 0RF l\;O=a+>߹m۝v$lQ/z{ K]wⰠ`$wbZt.pqqu;tjSS2xj4[5+Ї+`ܴX Y˵ƛ67pa[ƛ ByL%!vǞ0C!_k|"˘rFX[ /;k4fPG&j0D uSfgvr_@pY S8 eR < n,ʼn)MmEk- kWً͞9|Τט{T_'@6#@4FF@f0GaK4Cf';[{B2 UZk"h¼\`R1Xtxܶ;/,CPa!jRΖҘѼdb@6Ts@NcF0*آS&G%Yի13| ̔< kleb,lœw Z* ٘ϛZ ] u`ȡxmx~qm>D~= 6] FwJ KlrYmqP N˖Ȟ &:Jnr}ܛP| yݩ&w C9`=@K0]: ;8޽=!~P\k;Ec;Dr Y࿆40_H p ;>wƽ^lL 0p5#.D6}Z͞|! 0'<&C簎È>J/,pPİıQ?@c'cgZZ%RKqD\ X<x4]]V+h׼[m޳$L ׁ~6 c\ Kpy)6΄sx=Ϊ#KU/1Q*q ?]SQ(Ġ*EF,YmYDOˠ0O$Lr )dc~X |n }Dbr ylq9pcx)2t!|9L8<%[ E}6%ߐ%¡*Ji3@@NLv\c (@$N!$on7JJ_JkPHZ k8v+!=4%QeC_Z-Ꟑ k6WAĔNTk@SBv8Yi/i?nOOjt/ i«c9`P m7}u;ޥ] bA,ju+AcK]++0b^3 TDQQgg 3t%5%55Oi11uul_}}/_J]]9)9}ľĥ_Ƹǽũ/ 7Z l~! s  o6(ţY=L%a…N4pE`2H%>@)IR MZb$J+U/Lf/n*5˄^cr̲!ן%ڌ5Edڊ935p`mI.] cewaO SKh8Qĉ<,I"k,323 -8yji3UӫR1] F/;EDFU2߳vKխWSg't>"ǦlZQ ]{7Y?'AWY ?_UFe0"'+DSj L443  KkF$, /X M0T/7hUu'EWU9%N;j)$=ܵ_GbW_PBZ t=`A&I&]@tI(tLL3PGu|+a/h50̆;:f[1AeRC8m7˓$Uv$_@'$arB^+À!CtFtyPT)6'2,Ѕ YCG}/X  [aacP|@P%UC^w#kuc{D0(O2NvyBծUPPR#H6.] Z+^ H8kB}JT*):t-鋧 Ѵa|`q/ᰄt'-7h;5Aw̃/¶cP*bs)iY l-:}x\&)Gz rS @`| +*|a v} %@4EPߕ+X-RAJy)0N$GDi3OrB=Vζ KQ v`G`&P`BDf$w1vbt1=g%PvUfB"&mDws}BRAF7i#0` 4SGyJf.Ld6]cei)$TGj3 ~SB[[6+RERUsAvܱ,0`Il@m4k ]ւTusHo d M;E5@p_#t"uσzcCx y&Ue+ VΧ^U,"J1r"VkICkxK5vh *}QsyRpܤ_7 Mi9>d:CRoWք=yaE+zCDߡ=6JUr{,t'IU$P Ԇ]-KIK<2n#*D$:iG:c_*_#&D_8`{{S74YoId+Rl +`2I)Bx06c sWGMN&T%E~ A;8e#Pw/__x$c1&1nQvU?} c'DqNI7p.4 #k `): e>"_LauGMgYp HYyp[1>rXNa p`1YZx+*fj uwZ \P5 @}$iYTz<"nV d`čIMGRFBPU k,hqa W|j2ȜOuB}!N  i_CU3xu 'Ey@x54jwͣYIcs\GTvTJX8qy1PB&~IYI`QU?@@Z , å b!cZɘN@l:A]vPYk VS5\{ k c0J2bRSpD Vz3Щ!,Z F ?W__!!ZZZ²đ~DD0V;V݇2?ӄ?WF R[RgA44M4n4)"H ̰P(\)Gŋ4 <"H 0b&#?`tMD 2Hy}H#=ITi".HS@P 6a݄׮ d?xJbHF#q C?,cPEA*2RE A2AP_3k~1F!0@A+)A`v.NϻlRU_Ap0a6A TMF7kHChAg Z`!e16e ڊUDO0QOł !53W5`!Yg pDE@;< "O# !T"JiT\1Q '=W!hh [E]^6~H}eA+_a/"<+0Ȯ 籄Y,{jȡ&"(*Zl-|GixQ!LL8- ) `'qLq!\& RWUH@,2khy>RD@%3Χ՜P$-L4ksA PX[V*}#~Q {Of f!hp<@!R/T(%H&KRbEQV@"X%' ThE*XW/ a)f:/f QE>0[6<"Q{| A0x{-_yÑ+]]O6GTn ng8gZ?aCAi:g9 lADឫ,q!n#*z׹7DL!*~H 6t#n1ApXB۞V`a^`|^[˄-|}AD ̃l=I4tcHܞ! a i4M7)` L=q:{x  2XK -Y&A~)]ds;;;jbQ0o{iOpag`{0ntENG<0oSuX2"'@ 20pcwcp6 1`v*}:Ct'wB'1rGel%'wlkl m7f~U!0a#5PaOpHS``Luzdo$fo4i8si?`]TA7jW``}?V2hU2P+tC?< #7~qeF#kel7]u8O R@D,ERRi8aZ1Lj>ex8L Z{dM{u?bWsfP0>4(fRHR@,ӎc2ruIyv fGkgxek_F!fP.6)lz x&=kؐWTnind3`ppfqeL3phL5|&(v6 xa]Dy4(*pC~ɒBtuIhUlq__({RX&X!FkImW<cC@u>IhpLxSs.)&t4"A|$,qcR=|}-$rCuiD'B$.Q60rgA!- Y`P8cx7h~yӔATMhH*J3#`ZvTTFf[3ReIBp7v Q $zrIe#|YO8`3L6E@jSΔJX7O0"%UP*]qwAG`v&(b`2|c1^({ICvIȦƹڊk>P!lldy6YGCgX*;:ET3*~T6  |5)gzBAǨӒ7*YPJ7Wq@bto*`\j[ k@ `Z"%',f3+' duzW8pZf@g!J|"W&kEz):$(`TT*50sh @d.EuM5*;ϕ%FڅDVLwHBhJtD~S  Pgjr#F۸O_6yjdzIpQCu#Pa*Iع)8zO5<:jC0 Uh4E@bp `3kaKBkt,h1b'R<@; ?*eRrXgs١h`sN(NV<z~jk,X{S *|FKZe5=\)8GcVV$N]w}J Ow۟H'T[SY'S@7@ vk_ PQIYMLҡW$Z^#G6)U @tp8v&)g6jUk5`P%n-@ =U`;h[tJWYdtNN@NWOBf Ldm!Q8xЋj El %#&3ZaU;3M1 (`@{\H `[T]ݐmɻBQZ'6a%GNmw'=P'ǣ=0I`4 0F><gHGkq.HPu}QcxxH6S3@0v8)خX`̐OPJpjn ^LIԤV@2V-ܣOLp П%T-i-*gF$Gu K.8Id"K,B`MN TC].0p*(SÚn  3`U 2£!(32 k80'`*e짋9LqH݇-R!yIf2L%GؠDQ<%q.f*g1hOzr`dAo'e+Go_#, lқ``P1؉mzch?IM4y>؀-j% "'>b++R0R*=.L.e== = I Z 'S* P#P~a掣<a@A i-q,!B"8`"+,i",IHfu 6*UDPAIQD`'yPғX9< \P0h@ Jq?tS!b 'YH h8- ]1`` Â@F@zjy%Ta0ͦ.p,FVd"F6!р2` $ET8! e(CuP*0tZByDJ0DBv2(k% XDRD ;>O KDbD!&  w`D#[ mI! DU[,)TMLj6* BPX(; /B#YCV$a P0@K \+e-n Rh4bY=<.zMe*S5@@FDҴ9YP[T [Z!KM_:d$VPEkFKA'A4`4($h>L›} "LNP5`)O"wH DX×w@1mĻvTn̘DF0D4DCLTVo 20-= %c^KzN! iN8*PƓD);!̎Czh.&BXP%ICTMQ*Z\dM3 X #u$Q8@:aEH.a!ax&:"FTB~_r`zx``S8lpW2gKa8p3[~M Md%pؘV pq ߆ Ƶ"$y6Zp1zL!t0 JGl$X{@TCpew 400)  't ܔ yS Њ,x1E7KX_P 5.גx_/V2NT 3X$ZP;Dw#/mt!7\F\%NG rPI%ArGV;1E&,r8L"% WKTlP aOQ)^`A'r7CyC)ք1pKP_lG-[h~u7 I!E= L@|a˔.\@0x38ܱ_Bj.A11zg]01 H"*QLYϙIK@s Sd$ =Q&!`u/PZ~pKp]p)`,Wp)FP/W@~Hl'o07J (?Zf0K  ɕ\BU@Eg2r#ɚ,Y[XuY$,SU @nm<ʳ#_P=t+P.1ud xZ10]0}`,}g ъ~B @hlo 7P8:дx 7i HpmP*^1#UrWXXI[:jӞ]b4wleY5x ; NA焺儚_x)TK ujZE~p7h^H{|9M\ )F}0" l x-N ЕGP$:#N ~@_-ß!R]Y8ACW,9t,Na y=`Z7vLլ<~Py: '/{8SRK}!`)q{rbf<*4n`ru\9`JP`q1I9< p @#qXJPuY3H$\qx;<!PL_`x!`K!&_bHjJƹo,pu5?@Tp~ 6`Yn7# y0?%ܗ/+>!^zPy~*ʚyqjzmtLY@JRwf=CL'Qk̬l̫/{+398y$j „o,3(Np)G}F |3Z6|øH%p\0FFRÕՃjчU`K[}WBl (&Rк,a+TkcXb-n3-!5۹ǛG~z,xTڡs T3LPt'x PJpTT5)cڤ7F`qGWGdF0sB\P#Q6Yif0jTVYi >PE9QЦP4Ѓ5<1,N5S6y۫ P |F3%;I !G%JyG}s?A>O  )!bzҬ ,`Ӓ?Vh\WG)ǒ3ΣnY}yPx%U`N $v<ɐ0<55C}À}+Jf.epNP PlPpKD@yg>2h0O57q1 (P(h<2P L% U}cNU3[ Ή`rypf0uB{>2.ٱIuZ<ӷz05gv!vwBB\y+##m`pWve. w?z8PY{k(:>wkRgzO?{om y Z8 ֦'D{Q@L"`VʉfqC&C}T܄+rMJRFP)-I#0yCNUP''r/>6;-#ỷ^eX;ݷ<` Gl_(󀖰!] z+̄+:}P}GlNC*c P}W W' hd[ɶ}Z 7>@B"4$,=P@Yp`uˢ3}Sbx0{z# FY x[Q# !ZޒOτ_ ".4g W`@A%ݮ Blg-u%EgP-";AxupBD N~.}p3o|j/>>ϪgXqUC^reMׇ *i3K #d׮uU{ '~ QZ11uu1 ZIIZI" u +DDt5%3  3% U# a-P_!PIQIo""m*DzgR_V, p RU@T)6AAӠ7785Db4j:!Z!B% ZJAըF=q)D"O[$:sЇ?3+|AĠ?n(tUTv%r(]b@̓?oDP==2+'Ȗ W&@toBp mgD J* jJ̚6Ey w)ҤCcZ)"J =-ZA  heB% pERӄ50G !CRAp8A Y!;b =d@Z![`S@At@CTd!BvS$n~$@($!'O>8J*SUt8m%%Uw%G!kNM$x$3'|O%*4Z Q^ĥL! P D`pGS$!6!qE&P@s̑fQ0VĔPAlQAQm,bH<уqn%W5pӈC~$UH |/{fPdzPp~I)eq!s@! WKx|:NH6`l!= Ge hS=tD9-BIz Ux yS$0$}՞UY $'z0Z+< O|@% 3,Ʀsa!æ eڈ*7{3>Z ExE;"KA_T~u!S15V->.r>нpnE  L G{ 1 $,pDe% pYS( Z`.oE0w ME PA0Aw. ! XdA<݃4R&y# 9GReYVň [Z eY!ЃP,x@MB@$QGDq%C`IpK4N LdTF2||6` )@ ,V@F]o !B - ɠfWx`AXt @I |JW@MG)HX5&D63Z 9R @!lS0` e(ר40*˄&GLde TR&!PB I^AZkdCh L &.nd fe@Eph` $( |'^!Wh5 ZOzЃA .y1kR3 *h ԲU lbM8vT-"*(91k\n^q^WfhR"/ "nuWCC+4ff-&;AnUp62i(J^8z [ٺn,R;Z `m 4Xc p\Oݬ]t@x-j("]r $B(nS<Ƌ?@ x- 't*-PeoM l`9IIޡ@瓀<p]F;|-Zn ݄6 X 7)`rpW$l'A@XԀ X!WBo"}xN(Rm 1XMaTqk^ABc4zcӨusʢj՚e).:3\ȱDa |mB.-3a'Taa=Ry~D X NFLy E2B ݰ)^z00fp|C!*C,[TiK6JY߶o}Κ1w 0LX lWb \:{c5O,+|SYw>t">d bQ FaJҬi&1,>fi~HD ! xp[34=!J x=nOȊ_1Z 818'Q7H!K`-2N42?l-qp"3B24`M7` -ݤdREW-[`UTLp>.KSVk4f+@K\5 5 Hj[M&n4 tg# P~~m6m~_1wo _I`,x1@R Vua! jKx)D-ob*/D [\k"BP0!f0BFc=,5Rs5T=F,5{PNMWN!^7|[3esH`K4`;BXhb\W~hG~fq8v k@Q( V 10Rk,&24rZ3e)CLG/#x@(?8W{.(>,P 'e[aF KAc0qS2K^`[ȈnP_XRMh}Y?#重Xo#K@P1(q!:1RMyP10p(@b'YQ]q0#PcXpkc^6Q 45S=H{QsGPe *Vb>AtV (+Y[ @ׇ8)njfXQ(G: "^(h~vihj `aY10 $#J`$f#>B-Q̶"'tԁ>p*#ޣs -܄{Ғ5N4{`Emt%).+ٙ|Qpj@ZgXBY zYJqh( wp e  )@)Ch'Mqb}Df@NpI'zpL''eK-@^=8EO58lǖ5-!>pciqBap|:TXg@)n[`O(9 EIFRM~PTV]0K:0 phvf[TlMNP@ҷӅ Ԃ[˖TM4eYU'{C`ЉY t i/ifYR^/ͅ@KH@T˻3)-a3J SmXi_BN)0At q,Svw+%ٚ/ q9|[e=؅{a<[T#UbAtUkd筸 <ԇ,yHCtP\կWϧ}wo 90w q]t-QekMRUpr9Kr^w f[E/ ǥz^[i˓\Btk|\[E}E-H'v[Hʼ ð-BL}7׋i @kP `B,pcC`wѣ .]8h,Cx6,G[ZS\;Y.׍UsMM,+(NdȨGd-(W..NM1AIݏY!f!!,~,  o*S.SS+1K7ip (33(#aiw1]1u uu_K69$Cu_]vc} #O |aO?1" G~(aAPp JqO5"f]P d FL?IMj s:ș0O`u9S`£1)K9TEG/#|W)6~9b>.\dGN'9\r(礜$E&o<.| UV%UDRND5C<%'m0Ȗ56c hkKqsûfMw߿!TECNGfAiRlBxooA"lR8rSO*` #H=rC*0U, 7i0a1CV3 U 6apom7]l(R@b>&S9e' >X+}w`af hq&@!(>'82ER0N  (*kT@E\0|LXP40ۤ V~C=]:<29_DH`_sw nD fDeASKʛiS;=m1G%NHʢ\L"U-G*NV[`8ZZ [`լ9_хE]ꗵkG#c X}v JgXdFV;o:!{ +#RJ P qBH)GS'l iS_7MbxT6̰祗60βѳ#3oC5nSCe ЃsPg4Y9#L:roؑJjvL"LIl:sÒr┣$SP],P03f _ޘcIb8bhBv) (C@]1ځ,һhNq L(xl$ J2A#6 =z犍?n@# [ ȶ)EX5%Cڙ zf ֶ8R]:c'XPwtZԡ*!Itg!QJ'dH Lo,l  )} [9F XYْ?͌L_xe:y=˖#];׺4.ڱ3H… 1I)!+`T  W8ґ #NlhQl(@# cM@} Y! 4l 蘗2h 8NwP YD"LP)fC KRMA!KH9LQI_~&"t3@*Pi ]7bK -h| J(r1Z}2mP4vH#/D.=M]yF:c*_+17U"I C~0V£>)LTܓ,PI&%h(hyZXE t>#vn 1HF2`ךٌ_ٔAf"Fv#†<0&MNKTWSx2/(E<3p@;TwH 0?ek w9spr?&%hGfIjR4:wuiy(S_lڬec{ "X$AĨ?<@6pۃ&)lo6C B509Y(PB \h|Q1`dN  4,/]4TjsG]y41Rll| ӳllN$7s X$X8:CF `U ,a sF5| OxB J?# h-C;.S=nСZc  ^ZjpB#/9f8)^86CI%h&k)o8~oi870KP2XzW:=sxLguwiQ'.uATvBjHeq}b'"ѣ Y|D=&#Ytl'ȇ4-K`%Yc֘JKR!5S=C@ /vPWc@u4Ai.4w]$NvGi] 4#aJ\X t@FwOXjbȪYj7zS`$JËir ("Ik466TY)S:0bBZC5 %:c~q~x :scpL6[&a[`e3tS( eR!K6eMѴ!pU8 j VepUұc9!_!,ZF? W_!! ZZZZ ~yTԄ0V;hV HF?ՃWFQR[RgA4Mn4O" *)(" ."DdG B@[YREF_*N4Rcd(a;c QT~LXا"f+  '{ h î颍*σ`:irGRZE@ Z# ^?`\*"惄aF@e8.B Z7 bKAj7j`&E'fyp@Yb,A+p Ѕp$)h Z|,( A},dT$!(& 7H Z!.Ƚ]kD݈@yȰ[A @1>a~ AH4GrLԿm񂋾͎}!a \. AkpX+)U(Q R2"l#*!ȀƱbQ`A!})!0^We]Oͭ l(lMkZUtIKjЭg{ 6Č0CCjԐ4A̘W3 NqcXW)Plmf#bH R &l8@[*1<U(t!\Jr'W*ip^Q5FlAb2{8ɍ1?XBVZ *L0RC9 FFcKyD<43>/[3Fa H*R TG PIA*. 3V@;#U* p5d }}F!~SB.z+jj,Msn \BSNvq\`N$IjyIAh7-@GgAK LsA;tqpHc}S^q1̖ & Cyf|Hχ͉1?lA6dו.Hi\ _rk0<뎭@MpWc`g[HP[2/ ^u>B#t8W'1F`ztMGoB{~JuTc^awvboj@bo W%wR"%; B)Ay `x%ewOsl:C~f'f&UP0 Pp6sz!z!rhs96L.(-5c|o@bj0v Cpd0j0F@vU;`0Mdqw0aPxNuVuD1?qkπr4gDRֆgH1o6T% w؃gK&/o~C"8"_k7@bf7|`|$aj@%'7eSFbU&Q:#`rwVplq4aFa&Fez6eUVU<'wH&T`"iWix4TK$wZU3'o39bg+FՈj`hi{@j$ݐ SvT'``pF]xwpi&d YV `*'Rnff"_VG pzohwD*Iu-R5892'1'Hhi7&% dwjŔS/Q@NJVi0MqYPw* U& V0=! 1A=@L&epDu9(3h8 pׇ+hpׂ8pFp@jڐ E(L7MD\gN[y@i 0J%Pp&gi P@vo9_0 tp!00가 r4{o(LCZv 4vGGo7cv^ @i6o7/kq:yJP50OdUr(Wg27m+O'C7A``A'z£\.h LHDEPE=p-h-1jFpV`LCi?F9ZFzc[]N?5P`pu֢Tqt気WjNphXhE --u'ZFh pGʷ|}?jv-h&"Z{٦NǕY؊O %3#pzV- sQp9,0 yLצA`ڮg @p9H8%Ò0;KRCu} vV*ד)%;ƫEQz0PXd.u!@d/2˸jx~;k8$UnRH[T Pǜ=3j5t\!tGd9򝳷Jy12-'*%#c7hUʍ SCcpQPى)и < kV^yGmeFsi}%N !eHpCA38+3-,.`YC%i*FpXjh`[ՂjBI(|`@9}%S6?ZDR@Gy:?YD\(pV~YA U@RS@sg6H/ZxHЮswv H@#+kݩ/SeK(SDCoK' dՓ%*ȼŠ]j}o`b1?؏x?,{`8ijzgf!%+0&A:_U_'G9 ?@z 9e@( ). PCi~\!\p$y^j;;I\Ry`l'ٖmJYZ( ) v56 W_$ oXՅDTLDp萝Ё ͮ"ƍ.4>)@CɟQ5\c58XbeAԺ$ JJ UC$?O(jxJ))pBlThDA7W _EW$QJPhrB#*ߙ0OJҩS%oj)s@fS3EYC/9f۠i`ŕL/E@85aqaM2mp-3Y_5Q`$T$ #<%V# *BR?P L~'Zbc w BSͽ236'Ἥ&Em|4 H&tE<8pw:ևpĊ`i3\xp (By+j @uB P&LFa}hQG D.{uLD/)-Z@:\|/EkR[HP}EFd_C7`ڴS6)t@e[-`O^O܆0Ј-@N#j 3S0qW8S~I9hxHL**'8$FdJ9Ğ.)؜_ 45.gbjNvu¤p8LTB#2?yt0X50M{LG|MtZޡiݸzl ލ/d IaC3GߪDIAR]P'I` @,RѼ#%Xu,-euʔD;)}}2?C32k0M5@PM?blN?PQY_G~q!@I?awbNRu=P#h Z}----@c.'YˀMT.F8 )qH)좤WM=6FO.NMiX3>(@apuF-7\XeB1I`AZ?_a* BLU7p> b8t'_N^x|/X<KRD+DEX883%8O(%5J% 3n ]WFU<*RAåE0E00BBD+**== +R*G .e..Z .=='hBu`d%RP$( ;!DC 0B54Jt7B1J8GB*8*H'DѬi&Tۤ,G .;AS@ -DZ4HD`Nqġ)!BȱG;7@d48@)P 6GscU0 ҥETj0bTD1d 5D Yd''|? TFD]'T Q'D" "A_YTDFp]ؑ`3 pF$G-\4AP #[Q$2TSqt$V^mc E8a0].f(Z`@Λ|#? |b0A!,xWhxaDnVDI!O`OrG 7I#Ɏ7a.\s" ]eU( ^uvdAs ׀$#ب x .؃GL%('?lP<NעhSȣ%` !( :8 F)I(rDB%ErtNC\}wT]]#ﺵs\༫6܂+=<.Lq ` 4@``"إ E:H9"TZ{!`AG H1OT+(n{BƂdPsU'whP:$BDB"%B==B=$`|и fI$j+>cU+Z +Di}pr$8fJL #(ÝJ(D1En)\n A`*h403)ͥa14:zQ_ 00M/H8v W~zczSKH@5ASXՑ-KbGP# !p` bp" #nD&Uq0 ,`e:YN"2gPPs\Ad,9Y]z4B!`6k ?$}B:B0PC^0)k #(t/YHKfa} P*P9B#*, Qb$9$(8-@A rQI5>D;Y/6 <^`H~dX<6x$ ( ZtkIВ Om|$|XA* hwQX5Q8(M }\"|)X) p n HdH炍؎-Ga`ci#LĞ ` $fi(Gz~vnͰ\'=${gCWMud=Df S8,5ljTbornR$Ya\+Ke d`a|CIK:J^ yZ?a lΛ)T26=&Bѥ=2g`칄?PLźj!8p| IC̞ WL nԡ)S'A'>bA t` nJd$@N+`@}a0X@Pgzv>4BB'A83Xm|,p}2l~Puo~P0x!GU d71!Cha/Q@(L7paPa70:w-p1"f@'PV O>A]Pbl\c54WsAs`l!l<UiK04SCu/P'PⅈP+T'ZpiP-Z/!P_P]PZ PPnx!4 t J8FNPZht`T#P$g/ $pՑ+VGp(TiE2 ` 0@g7zR"tdbI#mыzA=#7K`x@u2i-l`_XG7acؑ(lF=DgPO@T"a0¡8 p8?`PNPWBONR !G 8nAs%' }heli w%+0+ki PR5u1`x^|1pK }!Ȋ%77x0F!WEPiS~8.D7p00;) =yOuYs2jp'%WidRkxx 3$E" "L`synYwp`[ -k cv6_Zi@* YK]}PCfpv pwk^lP)h7 Mz 5? PnPco;Gyߡ°j]2 )'oHU9~xP-"ЇQcBlA6n6*F#J8uc0pn jvꅘliBh 7h"8nT:"-"k) E5HpmmqW\PWWxv>'1P4]CDƆ S* 3 X1uly`/X6n!}~pS( W~7=y- [GT?xpv+'N7A> ؟@K !Z ;S`RQBukJ'i_k~9A)lD"QTuRDN(nu9lt!6 Ù* 1 `Ac$xzV 6:6n@ H-LOIѕHPp0U Cs@ Rp0 <(OWeXC;>Io`Y!@.XS{` F ) Cl˘8jxd\gqOJVrgFPa,=@u8nY%-'z2N*X9AՆDDl 7;]y13esgs-Xf3ȟp( 8UJP#T gU2! cp{9qJk@ ƙyCCݿ K;QjjlXzMGc9Q:]= /%[{UR* Te>5 ?^7A1б?` "pOpH+ . T:gD=.nz# j+e\`o.Q= xxJ  a4W[dAkж L3'"IzI˟:ǨVڡOw*T yĪ+ĝ(D: v XapAO=r<[A @fDPCt ETn}jFHnPG}`VPq1R qR*XvNU G@Pƴwu xquYndžVygMz~8CJ3WICE$gEH |i;!`IbHQRfF' ns D_%dh1FA cGh>WT gңy x=3N`@C TJ1@-4SK-\TЋg{d]pg=CW R P u8`_30W%`LZ@t\LI%s HkE(E&kx[Igl=&IEKEZ00el{%&ø:)B*ZX, .n{41g~ '˧H=-`"@/G!J1:3y:-X)!&LlGqI&Azq&IiQTpZ-zC&ilB.Pdmn Y4cn)2hᇝJ*[^z^b,0@`.[h"A8CbcRœyBs0JpT)\:V s h يQH&$EB 4 Z UQx0e5 prI` 'B4|7up ZEwQ#>q''`IM ,e%:0 X?H>]9d4/*B1@#X^XYCZ}LEFD) $ %-|ӒZ! ` \x( ɎVG H7"` H6A u\07KvR e`ɮt@@$KEOhWUAz hD$BL87##%iHC#Dh& S@fY 4`ZeE15o\@4`#FWNczapP (*Ԡ-;.9uF]IphGI|V e+CVں78a mV"$ [P6>tlE]HKю%p )h/ :U]Jt#kWՌ:('J@o =޲L`:oq@\XH7f=$(3L bGE- Pl!H Q?$['@L_/GL0[0hwGQbxT}q-1 S0iʦ)LtFg lg 8k=aįiu壱D@ Ѝ a 60, 8@Xcٕ5ED)Bz +p[}W. Qڐ|wAqNJ i&"`6`ZH Ib , j@W-n p/5H:a JV~Ă-PZB H@t:bcb0B"=. h[BI$=rsL5-i(->kp]E;pq`P f PtFVptpeXP? Uzpʓ'J"gYn )6XҧntHc-P9P9hIjQ7(hp4CRyfWNaPb3W B` xa",4`V MƃɢwC,dy>IaIRp]IZ8 )in:~/j`)yw/g5_P]Kq&geڒusp09$>a_)6РT@|eȷ:@+ysH)|6ŴfؙoƢTEKkjƃTZA`,46 *fB-=FO<\;f>dCUc&L 6<HuÄI0D&E|5"4l+#|T vܒ[[,v]&1뚾:<庡AR c{zlfCn ]2*ZIvdpi.]  SBG]B+Hi`A[jXa!0 Db ~NHV~@~$L5c֧p~wzڴ/T>T6ezG,<g2`D{r̈S0G;Hv(yא 7QfM狕| + pJКg0Ϛ.̵~oT6%K= -a D>b=@4 W!67pO sG$Kpۏ ipO`ig͒ 7y `Pk v~JaшҬa-$ 1pY/TS4Nz**-_ qo >-bq(Vi )ix~@Xl.(m ѕ_90L~ J%,q^ ulu~~~! ,  @ooL"SS 'yll}_}}lu1K7#))8O%3 \Qai J(i]uk96B?$h˗[*,b! ;/Ɵ:53Ħӄ8Lm[o(aGV2$VtSS(pcɰ%i5=QC7޾#B:͇ύ%ucS$:XP#Æ,vxN+>S!}ܬ!g!F|5ڐ?6 ;'!nb%)SxLw)O ?Š̊uYg1.l3M6LncH~uH=26HA4]d c)Qb,A 4T\42IA#1lf Ê-@caf!%OavKI%%#zچ('8'QȲh0Ɇ~⩈t-*2E>sZB Z8OksXئw4 2%8YL{pD>(P@ B¸Qu@t˝E7(ݠ. \\naDĂݝ(3r%&20|* p11anX yQ@ "הs$y40[p!:Q,N@cJ`௕H9_:a8+05<$ 8 ϙ'KYͬˍc,AhJm\\`}cm0}c8+}*f/6-YC}˝Q;m*N¨@pe:B2MK^(VDWTC,s62UJWZO L5,pMy{ kry3kLZK6 B֫0#9d_ љ Ia4Ƨ:SXu4lU^O iZ hA ~:p}F @}1`dnnUk2șf B)j< *ӤY H}j31uf4`*-&c˪ǎVv3ؔ•{XHnqq6eM?8ĩP|Oz3Pi@S}h"LM,e'uj0Vtgu`` A KLiVJ$pȧuZ~p8lPJ;c wm }pb W2hL$e-xD?/W0s2N0iiB) #U .T {SBXRle8_k.\eO:P|pDGd!h@EFK\F6 yW7R#Fh<;z$n;gNdvogdAY=iS/iuNGE=  B1cR#.@btE Js| GtB]'wz'{3];r41]E (y6vyEtdiHEx<(Cp؉QGp gFB-4YX^H#T#[-l%pSJEEw|'pŇu1Xqb.s8;4=e/U^e!uNGo=j ~aQ 3GWF30a\ 14KAgbYAAb&LKc]m2yyY!ok6EB6i0aj'#VDesbf):]”7j-%(V.'F;8f L6([ YRYI ^ .Ʉ4)YAF/3Y `S9sDHaJ!EWLdxipaqW%8Aڂ-'Wwp%#fL2(NL1rD*% !)!*Lf/`TND#[ˠ8`v)vp@eD(fRiLr0sHw;5FN(JeK*fC@0ڶdJH{3uI{W+-)Oy  k@P&Pk"W"nD2װqb "x>a?$3jdbXAH%4ӝN (`)- -!` 7x&ba ť53 <@3i@ӤKwlJW,*px(l 6MM5DVf/7Y2@8I4PJUf.c rIj6̐D34@0X\(Ző,AKxJ i3d~mĆ44YRȟ2a=xp!`^:FE@dD/C:1%}F7۔!(a=,F0F,*TG? Uv .0t Sdc)UPM?oRh`+tFNVdrbvKٓ 46GMi7GF&z D".L pWH+4:թ3N(oB¬R5`IG%MSDP,HWs5uh+'xUU? 5`V[Kz25`PUtRE/SgV0d9 B[t 2h& Iw4pհ  @{ 3RY?|>g!CX\P:xk|ֈj"UиKI'l?0ˋ恞2O!>Dʨ#NOPw N t(}oimBgIټ~ Q,Os&,YF%!1(@x5!`39K(6'dY(l4 av7_2Z%8,Ph?[DMf&¸8X _ݒ# pOXZjp}񁔤}6{(AXcqaaʻp: =(' ]j͎yLj%M|4CZقq?6@@`fu(1]eՂ 0G&@b&@v Ёv7h@]@9'k q nc`PoC]pptlpXġ ~m /W?Zf"WzqOT:.B(22.[ w{Vi@iad:hps|A/GcCa{_x`YϵO ChPP,W'tK1`l1Pjd7 yD` f01DPnt1a3|@uul 35 s lg:%'ևQyG}Wj#EhuKwQw9m XaK`A!BGs. )H…V-5T6= 2m$!65Fvi oH؀@8DcD]n "(a Kgw`lVJg#`z Qe .'m8`/'* ކ@UG ?BDZuLYZ0}Hy(5+|@8i_ &8$(9* c;0&0bԅ_zV -lwSl^' 10l_ m0\7!Ӊ?C<p NKu4(H|Abhui ȸhx )3 gb&Z8QAC,g( `yeП1<lVXE`emat etC*s(`Z-$DY! :p{w 8iSv&Di&0`VC#ZCОzG}(PP%0ydj}ݣ U` *‰x6UOQIN 6WN$Y1@(\0w Ȣ pW3 xgDt”hePh5?P1P0E5 L&k`1UjfF%'kGyd 7 !a))XCLp5rN-TM(V[oڲ|9 ( Q 0w? grE7(P `W }kZ{x+0 [F} K`w qMf%3;NbfT#2SFC&b՜:v{70 碬37xb@kCKd'-x`P5E5ET;P5(s}g1^{CmUFS\R8"P36ezxGz5N~KЬʺ0dU=Ҝ0vd@/+K|Ёt;0bzrq1XȈEکSRJ= 0^l&S@~R 5;gSʛmX؄#r[!` QHDT&@v 5|;(u&Kh'\HPwx@|hIcJc78kj jڜ# &sMbqG.ASp`ipVKFYH"gO0P.'AZdYi"e8&S7^7Sj;3Xұ NJ%1G}1uZI0O2aipt mNtpKJbb'XU3Q3@ZPsLJ؋ Tgأ SQ`81wR[P%K|[D Z1wtUXrZ6VG`X6ٖ{A}> 4{ܪ%3Ө֠Wh`3VPR\1n>|4@tY0 Q+қP( p=e}0`"e4}ub\1i6|&KJԠU{M=@P` "`Sgؒ6V9f V>ZbYh,cIIUtPg@5 T %3n`_Fh m $7/!2RΤQa܀NL_&./ZR񱮯7TDp~%pXЩ]ʯ,P3`Vk ]E F#m0}UQR*Aҍ|]*< `T7Yb60ĩ:nI'IZ'' =+*BN. D3Y)Xn8)%%O55%  5%J3n   ]??W ?2PU*R00EA` $E0:PTI TQIʂL \Y`R$CHE&mIHE.$?60hRx=NJAcX*?R,+F^3@ 8dKfU{~7\0B\n$ߞ`.$ CG#vneYCQ C=H.r2.G:"JJmAGDB .8bB.(x9$Ќ*Cˠ]g1 -La.?$ ~.dM-u\f plxJ>1| |")bnzb"0!#-饡ĩ>RFPr#0EL) ? BɺUH'QL8@ ~ p{ lFPv Fg$26Ř O2+t .'Bft"ɯrZBt N%I(fH$WzRةu@jaz`v HEStz261 `s7 8A6*=R[\K yb"b0(3`- ’vQ(Zpe>( ]D-x!FppՒ&,4A mԉ"a -lk{tnCuk&ՉLDA"g=6yI"! '.$ ;IQ?Ia ^4 o}%8С9CVWg)}x]ʲdd R[IH8l97BY*(La#Rl qQDTT:&7M W$H4t plI8$^NL`0p'pa Tv] _iStV p :4YgzBL*sP \`HA𫥄Vg;#\F@%A>`>4NpIc YJd "!6ȉa~ ` BY$")f,tq5[4A83DI˕ЂQJᅬȚn"8@ 0m5ua  1r\r'@Or,aJԭ&y\}W^ݷr1q* B/Gaz>)PZrBDWIh'БPdjhs1-i.Q5i#H (R"` H5~| "^[<\}2 XNړ  ) q5 pLzWҡrGz=Ur"7G"!!0c}C̶&ZO{&9Iq"1U`@-[e 2Tk1"uhP\P=Fu`:@ DWm?#g%|Jacv Qmq @70@fYfof@ZoNYB !K2 9s q"o@Cz4?M#<3@BG@е2b)k"k@ @*ri }b귄KX!H2sAP$ Q|W%ǣ0D%aa-\5cw$'6d[P 7PRp_C8,7x7"17jiwp Mٵ@5sC^ sipc0_Pdwɐm wiZ XKPLƛ]#y_D Hfaha%\~pCJnPelt=>6炅\H U kw+B975"YJe a@G] 0!-7P<pO|v=Ҽk}n,@EPt@Ka&KX&`OY᪫pwWKPw.W n@Bf𤤀P > ?" 5\ʊ 7W<±@P\7B֜lw*.[0 ymp>0 <'@3Oz3iJ {\50_W6 -vZp}=Zz'^X?0qIIJܛWpgH1o?-c4̑q*s-∎XJZ@v9=R [2A,PCa=+*% K\˰T0JFyYN3\DY].7p/ LQ~G|ēʡ{pъ7v*ӃN017P^T о<>">pViHU ۜ򱷎x"u<<ձ.u.V?%n~vt3 WX pi9CCJ`~@v]"釤 p?7{k.0W>^xp\̽Zj@458> #`K8vtԾ7A ! HQp0>o"qI`Gy|-4.Nk~nݷ˭bErP-%U;J`70}KXYnp=o^8 0o1ؾG.*MV hp`NQiΘϖ۠~.S0G4 Ldlܰ45- GR TuB+r\# pyٍ]TUE=ȋ?}=DNONU9qhs!obN;AL"@DMm1C`<~GU9=.pՇ]B5+6 a n10!c McJ%n(6PubF^niM 9Yj!lk"Pքj7`p D/Q`{kwpml`)PSLUBN`j2; s-#X3 3%%%55nn--\##-7F FgI@o=*BEg[UF ____Ѭ܄_ll!ZQ[QS ""o"NZ , Bza>zŸ:1"X'A-chr* AF1X(!TI'<`b% ~BL!- >̠3чn =*z@1RaUXF?X7h$B g rÕ H3|9k/lZ5l҂x\Ӎٲ%y/ޘʟ4aSN#戡ȓQ0{ **(P0PfsS6CƠQ$HfXb 0Lez$gí$`7v?n! A@^L5@` M6tSuLtm04r gXA>8CuA%Мl1G 0H'^Q\rpsŊOw r!R#%|XB HeyTłTMF|%ܢ_.9/+ؖ0g GUP 3LaL38H*.S |E ,9AhhCxvb}diA ll ]X!Дi"@(&R4$fdO ,0.(0X* g@CsH|F}#NBC :|?L Y~g;.',\" IF={g&-ZҲ&2LC@DQ c@>@ ! LfSFpc7Jb3   `ʠ#ǁ $'9Y:ىA9&36"eu `H72V\vsJTAG( \0SVGN>Ê0A 8PRYiZ$J-=ٲZ8 S:SG. %Q!Q! '@Ϻ:Л@ @(C"C#$ H\=@dcڨ5!ȕ0aVQB,gZc-u 4h_yƛM0pB 7 0KY՜S]d-57}%5HZ70܀9\A8(PHb (\.|B S*xKB.bR dpFAR Rf< .^wwF.IPs7 b ;e tE\כ58 /p^5CzQ1hs3!7HV $슙P,` :d TJil`7*1׈Ew dcь ,I0 4րw|D0|Ly |kiJΦuّkѨUx;qP lC`yW?[BЁ"uZ b 0=-fs˅uy011r qPL!$S=v +> X;5`9 4 1r" T. 0tdDHv 8 x;.x\3ϽNpmT 9P C[6 1̡G0) bd BȨѠ|4ZiNWtJ% lM%f5g)@3;$PJV23e=IЙw}z򭞂0`K ^$bM@, ooT+ɂ7ZLfgr@4*`20C j[4 7b,!{ׂ U̲&3>+| u6@ `hVb3Gq5 EtRBtLf~~`A Y<t:%$J$eB Sb) r R yk^ szs[ 4kpaT{pp GL#0MuRuTG \66p.0fp.H3if" pnH+D:W,pq~eyx^8 W!p6l"R J#ܐbS=z hqq5 {4dK4Q0UA&hr gt`/Tdu4Ǘ|Y&ue DbVrp_7GjC J  v!kBl J`qH`Ghw7qbc,`iJx%R, jd ([U(%qF~>s|y\ Ɖ.IXUQ lёXVmv `$@Jp._GTt-9WJ9]`+T V|~0b{H" A wB ^ 43I @B#Z JvH'J"*"j` -y+pr~&w6^7w@ 9U40I3BpnQ|ƃ<8 R?H66VJ3NC~8Em)#fs0I0H ע^0Pe$w"ABVR;J2ɣibh('X iUz|js[ dy 6njeXF /`?gu2}C 0( j ĸJj kGu!#"a(pshY'e@-; ` qĕFD Hܠ)7h:  `Y $ dx9iTz6!N7 |C0 (`O6e6vdFv šݰBAl(g0ZI@1@*3젣0'Ba 7zb{#(gyjiK ~IUj`AYj- J䉖P.ҙzfp5Se+ᮊ`Z{p>ȡ9١JnBWug śP-e":%u:tiYvD!n~rÖ`Oo~^h[02;̪tl>;o҉$5ؘ~H ]K@_9( HHtnp]xPZnZH`n[׶@ .33K!S)+Zd yT3Ԅ&`k)XdU|U YJ*:Ktf.?K"Op5:J; `p9O)P0:ښ;Jү?C: _ KPBp {8"3; jBJFvXR'VcK#۝8+d\@ˬ@ DJO҃ntNǮ5^u! jnPk@ K c:i18Iuz+{D -J 0z+0c`!rNأ+WV\*|0T j0hMDt V+?uLo*ǭ[V!NJ v] IQ+oQmܠv+"`S:ړ ʳ:J_i vNڤehX|~H@gї(f nh.erTɑӬ\Q6 m%#>NFN3D3` +$FJf:RvɱbCd ͱ-y72SaкQ@ фda&iO߳|Z l޳{ c ~1Û2QQB  F`rۖr6rX;88-z(z*u ' έ-:REt  v:<R \], xޚVL N)JSaXƉSc]BV/珲gQ>u u>z  <h 2`TmL6=O[q, z!uc0=ǃA=  ! `3-'?/g.kFqR *[MU(k P`VVx G,σ% Tm%eb&ٟyC= ){)v0} UU 2孙^I@ܽ  $&eaD7r|ФzV- R0"zq2 7f*.i^ty!31 >u@zZΐzS~}1Lv2LA3n^I=bMx,YG5Z> ;Cj82So/iUHj)|Si@O`@&/iP{|6pȇ,Vv`h0 ̋˄YOYM}8 gr6֮(=lkaZU[MGn;vNE޾z:A+:HtAPٷ_gԑ\l! L6KM= n`F+ e+HX'H F("=GTĐ3x bYv1x͒߼5xw9@Bɷ~UT<*"Tq ''@a)6M b ctLE뫣Ef>!t2e.RyptjUXd4d¹? pD?((X 65 "x[8 Z[ЯGC0\E-!zL P lp7 J_; @ɊJәşL,>SȬH%'#11od ).$@mky@8[e = &)0B(A@$( < nV U1 %,-gzla+ut)ߙ@b` 11L9 D>iYS2Q V5AT͎C`mҒ=Q"*lb$.pJ@ֺp;CA'!+;GzO@J硫\"r0)1 c1 E/po:fLC(ZV [~f)8S;BIR@9O6$0;AȫXD! b[Њ1 cYT\ ! r1}P8]L!,3QB!B!08:B+̐8"҉N{; ]!ͭV2UFN+(zh}^.j/PoI/ vVϘ81^}DB]TBQh@ lf"{*/<5S28´=$#9B4 kc@`%HrD-W€m֠qű@!\GJ@|qc 9 (Bbn`2ٴ$(E Lz`Aہ@PXAEܼu H%R\DҐJZq+”0. @Aq1w]faL[O9ĽF ,S=P~i~PSkalfw#00vViuleR>t̗-FnDRd2m1WEw !8!ݒ 5h`&.e{oH7w!.yp_M!zAT$( @Ms1{KD{5([#K6AJIrx}W>\VHlhy%F}SEm#RfY .;Sd~A3.I747(T))V.'BkPfZX{(0[WPA+_@Vc3&@E&|3+hiڦsdta,Dx @wp>_<(T@r5,b5Z&dMb+`_ǀkJ`vHUuF7sц,amp79*](? ڗ}|]t&r&GLjY3gohy쨍Lx#7hjd;f53S4qpۓJp7Pѳ8QhuR.GQu&-5hqFW ?7 v33x<5M^@Rv . Qg;ypz%^?ҁ Y=ۓ[ҊC0K %('Ά rw`J]@,*]?Ɛ3|8+XUh 858dnM G EGGʼn4y4OAprKr`8[p#D&,W\DQEYR*Ux畁HV?C/%yTCe8j'TrN;,73?g`!2 \] )v= V[ 7pc1Fhک>W!KM\w#&2/'Xb4}'Bt8 .~O5xQcif)tA L(:7@!`X |\K]ғӹ#0 =ҏ1m3#vaQYsIfhd}:9֧5 IWo@QSMT`gS4 j0Na5yʠ~Y?cpvГe65!j%wVJKѶhvb/E>zXs1x7pjG%j귗p98ףR(Y D'pTM:~^"QA}f^7[Řwc++CQvs=W'wWc(r1vLůi]uQ!@:39st eo3dyy-ᄮni} 7!,}_l_¾ͻ_ҵ Z ZհٶF? WW_!!0PHpXZ0(X*8Q"ŋxL#aXau@#W&SC XDV|Lv +DX,#H(Hƫ&"8}Og :tⲛ݄)Ыi}a1 pXVJPcc]DAx`ቀGFaɀ#SV`i: P,H -A8OzRGOYzhHbfŸ 9SV`i(e":R-"Y+48Gh$R& ]VfW ,Br ]GJӽ"^p'n$Kd9֢ca+ VpPHC0s7nҲ[u N$N$@Y.@@: Fu4+( gG4(#A}@Gf2:%FB RۄX%\U܅d]qd%b>ݚׁ*v4›'¹Qyk,YV-谱(6!,K- P jܖe cD!Nsʬ(ٝ⊹{`12 eMa`AL$/^|Ke! Qv:+lb+/l .z^'+/4'KKȱ@ '[= |ܷ?<4:fl4›-˹\d>"9ro2CyԑF"y 2ՓM im{*R!GtHĵ &ʵflzٹ Vo'wƗ 0VYe 8Ai@Ń*Hٔ qzp\""CehJKG&˫4*hauyC!4X@ AFԅ)DESdA,@ T'F-hYW/Px5Xp†ȃ[ĩM'1~Qnەt aPQ~ - t%a7xbAhAF"d -/i3-C1 Z‰DбYo P$y e $)LWfdh"sE-E7 [Ѱhm`0ѐ"_Ec-cxAI!H(6'rHXg|Gqw@wP]d]:0q' 7 e;HrL[S!JrtQp p0YK0kQKrC R#p yQVzzĔReH2(ao[PWd6.dHH 0}p] {g ZwRΥCl$AQ0Ux5 5rZQ#Fct5Y#Y< $ 4P@c |02S|&0I4!I2.|Ch>0| ' 8jH 7Z Ehh@aXr|6J-cWmxipX[zyy[R (aC5ccA;2RH{s&Y~N P$v,o7|ӎ&{$W4jh q7~H & 4WzD]|噲Ў.9js'"WqGqFvvGOQq Ӛ`zARPxqY1pi0%% Б}"r PPьGD-2haf Bdxb@Ipɥ볂") JFp7eVp _IQ^Y ]) P4,lQQQ7#`ZF5P0scp3gJ7nHQhВWГI Ee#L HpS\=T rQcZN3*۲;rx 0 ^A<Ч)Rz| %POOx5 %z!n NaXb|8bd'b@O+ ÕU(2G|}vgW6+(=؃yw >"ek+`Ypg,`WQȧEC + pXu"{1zRs,Y;K!Z Vxe }!.I+& r""h ڠU#qe[Y YYuDpQ@H 8S모k6S{nE*` #;ИF2ma{K!e WW.@Iˆռk6 (0}hPdiʷP wjF`^4{ʆ#ʜkpXN̹OS5I#s6gS;Іg 2y, TWu7KÓP %BPJQH4.'oya‚<'"Mwe^#xH~,d\NA]VE!m<ĩʌZ 5(пEk@; }`$B?k Zpu KѯP ˮ y_, PiFKCSv, 8ReR%[Nh.؜"0G";&[H0' H'em<0} Ev ְ`(-A:g -a@zR % )p  PPU "kGAP0< ,L pWtV2$OQbz:]I=Vf9n%'=ܑZ@ 0[NNk>Xpw#ǂޥ}'x@(; X8,EAksJ m )YPˈj}]UB7840J:01TFcO7.'IVbp0Pr\}Pfa "B T LXVͤjY D@3PgY`x7T V ??)n b0tJBd5 0 1 xOg `}e[S@(ˆ$bfhEST)G~> .\2It,ѯ9>( OpՍ?ZaSasS[ĺ{ ]$ a0[Py;dR"&:\,{s t 7v]" j&pxSO/27{"v 0^*3pJHKFJ0ڽp @uWSLA581,PG`WP?%LH@'R'acH'tK'/ "`Io]+H# Iycv/eS-IcABsR߹QJ1# Yɣ 6 0_ LN!U_I4StiXe20sK?&GfK t Rܱ'r6#q4tt8OO  J55%5%%(3 nn#?FU<<*AEA00ŖBȠ+DDBP+E]Cra*4gOȔb +Z"*2pA 5QMȈLqC 07?P1 /0hgՓ0tWU2  FW3 dQ\pb?C)) P:NDZ8fnH "0 g(-QI-ƫ7Ђ+\5d NJc*npEGJB{dUÀЃH U1E8If}w.a `DE z'SWD'$ #`Stt􊅝aH))\%Vz@ \C&B ҍ(1H)n+W Gv$˝.O:XX-2N-59w.Y`t F1*|3O>v)' J~ E:aCJkR".? `p9#A+ȊG\@,+P@:Rd,HXEτ*% B 3bh`[L] |1NPz Nt -vH@{| 6`'c0HtsM3zA>R F2xJc= f 0αF DIǀ`gʅ|a M-D@"O{q$ H,y%)% Ju@9 ΅ c `D5a[EC %  %m . Wp9܀#d5(GdPdXU/b )1 B&;LpU%!jĀ,-$<'DPOAb@^J-2 h`B.M/o}2K$G8Fs2xVF(YPXY" E0Z+l,Nh޶7nkBŏ&!zi< DC*;Lx@x'jQM0$Kh,EthFelru*(l-Y!QWFc3#)\0#PU /@`.L ub?4-ڴ?؍ 0DLA(x 1$0#Pu. c +0h!@1Q5GEtCO-ԈF\x36p H625 pvO n\OHI؅A3Ps-X TPNPK-- "h?L6 ˴Ą.DFwWJ yv 'GԴ"Lc مj3Fc(1Dg"TBc(RԈP̫\2 XPױ#-IFQx 0,K.19 _May ["/,~(B*x+痂v͐3`KbܞT.Z* ;]#T TM&\"d* &ǫ`'(PH x7Cub ՃBp-A"XNq g~8R-xUcEzЃag~p @GZ9J/!J PHM#l4 ]/D&ʣU(&Hj U\ΏlA OiҷBJye@a 9P|o 6 v.S/<:3 r2DH@)@`pG Bi@ 8'Py!ЀŐ~(v rqca070TERT `t>a ih,yuWgERw ̡:f0a f/PZwP+=GVQ` 0 Qqw,pnD73nI'WqOQuPi 0G |c7#1 ".# #Y,Va&e70HwE怃`[$P2e5 \0 uԀl3@`/*{a.N0<lgCpB5D}'חJ1!0s_P8+QX @o"MsEX 9296kp:3Qwj-*wtD 0b (s^Q]uVPoe zPFks0sSG({8Cؖv Ϸ wttB]J 3wwR(G7bq)d  e8p>t-j`V2sԑ"z!1Ul C zd sԀ$)8 *{&Ȑp0BK*5=Q!xh Ŕ'iOx+s(xloQ S;?)@[52BN``ﴐsjr>pNi`H;P03[R$]8])N{̹hG`Kngi0KR+@$hL7#0~w0ul08r$$pT9}c|wYj%"~ 4\]."9`G&5[5t U,>Eb?7@GRHsӏ.g yo '> ` Нk $c_gXԕJW} @b!pcxUj3EY"y GG{24mmZ%b_Ahzs+`pWJ  L59'aG>4!qID8Sxbb10cFaڑy piP#qN9Vp|U 2ZP5pWC[p 8rIB]L >PmGuDg  H:rGIP\*Gw8r϶'"QH0{g/v)Єx,24r:yc* Gj P>CUc߁QEI_Тj xЕ}v@.< &dqaCDy"JDL&5LIlqStG_B/T>p821#JH!n* s> n`@µ&\`$ɶy!ЋIZU`GаS3R JT Kuٝs~@yPa*@ `8{Pmf"5'Kď!bI(SU\=a l l#z OO! o%O{3(kbRVa9W`:!]ٕ@o}:3W lLvu,𷅄vI raCJ@k_PlS?vJGpm BZs{dlZ j g ̯=\ɥrJvk6(*Xs(5 ՏEyA&LmAb|F*P"SK =],ږ<.pfbs3L!sxDq019FV[WP2F\FP ]夂&,bspmkؕȥypX*oP&FTm!0ٴgIg q5{{wCip=M͓{Ai2..-BkDע+!BD 0%)(0;{jyCVGaF2>S_{ʖpRER-7SH<j >M U<]St੊!Jfo6x@)?ZphF;Js=ߌ;+EM@8)\)PNx1@~0#3r)3dϽ;PBT@gW0hkޖ ĠER²-)7pi ;1 ߨJ oditgPgߎ]^~ @~r{W<"pŠJ:(}ʱ|!`N(q=11 m[r 2C2`y^lADj`6S<$kڶ@AZP("3Q Q5 8*RpE'#f=Jڪ&0yhZ(X !aԊ"m$Q?Y2e'`Q v"p߉%[V9eC"ddvt\_g@d`Hg"ƝSKaap=;!PZPH-[O/?h^99>fZ?4 O>Ĥzp%T›@- __!UUPPQ[gP"P  "N_rGTۇ#}T@#yHS UKIM#]‚pA YeUg$Jau#0)h=_rJ:y9|,=` D=B$v8 3#m6~΁㜩œ̖ E HpҔsOR᥻Ra E0Ga|-8UWM}aX3c@#IO-$mJ MwΪ1D~O8;|,rBY8,VB*Rq#>֋4vo+Q!\e-7r%yȎI=hqěK ބ-D*Bf`.D)5Ab s=XN0{"jǮQ qЇ௘ւG\ <NjX{fQ#(\@41ĕ?$-~QW9e^+2'bpCp-$e,(%@@CbAI n qn! )jnBNA*]2s?L+e#\./7X CNI b`9b5>ZF:rX%S*!*?N̡NWD$='䴁'!) ;P](*=AQ0 $9 u)DAF:`?({?l%K_"<%ӈLdT ?h` P*n`k "lAx6k0'J7?G덆%TLM{rGLAn"--p!+%I#<9kDA<]&8"0\8!\R0p-hm#G uB,PTn}E^BЀOr j%XE= VIAɘRQ !,_Jp 9y<3-A~h ا7XBmXU'` 4? ^dHaHl:쇜Fdc\@[#'h v, ^իWR' \D'Xɪh(b C-D—TWNAx ` ZciG(P.ƤP[<]lh$ 7`#6c`L9@[ֲs-uK9JX2wf-Tc P븎7 0V70qceD OIx5@mx7h2(RYPXБQu5ȑ8 0 wؒ苽/9`(Pwt9q# nvP/phV#5p\2=p!ЎG^J wfsx7 q`Or 0CG cxx:jMI6ȊOИ6؃ؘȘ~ǒ-Y>Jؔ!x5 66 ODDB9(aJRhXB/ww Sj"׎ U s_R/ظzFm)+pWpE*c^09lfO%)Ɋ>胎阬9u ,H7.okPkpDf!Dē)9Z"q4qN$p&H-H٣TtDzzݵzl$ =,R0WA@  ِ n%YI^ژ5y1]P@vkM)9/R6 7$(~;$@)pv /0@x*1lR$a-29M"DWf@~c>bVzo#lH dC oyccF!~xj@YXXfI؊vh&ǰgZoRڋf>/ Kv`Lj~x9(`6FKRYaU!m(박#o5|H)Wsxss$ aV`YWJ `Nic:@z$Y^Zيgئq*x4JHkKK(n01@9k0 J כU!uf!a-$IA0a JzF좏@F.hicNQ6 QxEjAjENj^jU+[ʬY7jZתIvc]PJ0(a#0*v6ovX "`@5k)rFZ [zc](7.gN.7ֺvu櫱*!:`ci3ƇX$٬_9)'.I(<+c@K9Cp` k0jpJ F6 Z`@Q0k٩ I##9F.Nr?"h0w{Qګ@и|+[)*"w/Ш}t ;]1v02Q/KQBKz>S2C PSpȆ.P'} 0JGN'|]@&7. S}CC2V] cN!V]&]!+P-Hо6FJjjPE[z=єiw<,x; dwaAkJh: 67 Y)a>t̀Jtj7!JY-.z`4aƶ]2_{@a`D-&^G{Ќhj@|]giqRi\Cĸ_KL 5J49nM%%"*o4qIEu 7k5FOWV,P^ ֿFH Ĥ@G`֎@ ݸ;[Pi90f5M!.Uh pjj\Ɔciu̖o7.v,N?WkJ|a2گ'IΤj]eʁdۤWA{xUxE\`Vx PV17#2㙙ԪW}oʛ6@6@@p4K>λj,NUNlpKn%ߴ`-% 'ۘlbNV\] &fN1j^&l$ȗ.p J ($ PPjBuǚJ0㚙! *h'鮻O25ṚyiN9qUn.=Ml!T8/#v'Opa!aL4+<3KިzvLq{'C`6[+OqjCi6U [-_$xZ `JLO'H@/L4H~1A^+ 1krjۚH?n9ƤǮ /}_/}/Z!u~l~ f, @oLLoo>Sэ'Ҙ',y~~1C-## 3 3(1 u]_}}:pߢcK)D]r$C@ DĈPǍ}ITh$Et)OIP:7S9xڀD$X>޼ 4 S2s6j^6E ?ݼѼp!LFE0Fu$Hb1G[CF;JXSpA<$p%E~t)0?F(UR!'h!0aaJ1L{$hٲD\LI`מH,egHpO0pܹs#{OG_`B;٤ ՒfMBJ`!/%  2]dakEPT" Ao0q̡r<@5Vew polBl]p^aDaW^F@ fdRk(E*h P&!!Kxڈ$Q%Hȓjbs˝zPAu*5O?!ruqŕ6ҊE5T!2^ K\UZyep^ك ?(_~gG~HkD9tR :iI'lM%2(ԫhi+QS5nHiуS(MV(`V#֊Ē[+k71ksaFZg]M$~6XHtaRBkt"Kdy~G4hG(i6NYϣCH, + [_Ksf#3Zhx' \\ v(DAN3k{;[O)$4H4RvHT ޒ!@^5!Yc K OH)"U2B Mzd*FO"5- Ȁ.K"X  ओ2  @B n@](-P,c > &`l?QM&%|f_]b <)f,2K ;0mQT"\"Znz걠o,^a0D +XAe!D"5$ 9p×`L0!wd` Dg3 2>>c% T A{jH#6aKeMv6Q"B@&01 iꈴH/4BVqk*BK >*."1 QWhDj6x ց$_cFU x$HBk)Y¢ 4zzr4t“SU`HۓPmM"P֢赨{h-0^bbkREnWJDT c`cX͚@(&09 ̴p0/ڙ~a C8\Ƣ.x<y D1 lnt T -&bop*0/EC+6ʹ!o.pwpT}$Ih PcVHD4: o nR}Kj!K,նBCb60`=,;`iºrTD nhׄ58ǜ 6kAP~֠|4q,=[!{3]j@@b&",[_ v*Yf-p85%EdZY19\N37%Q|9@,ӗ d +m0hUZuag#y.Z(FupFg+ň(D@W?{ :mbK60br6Y]mp#.)kbn%7V+ lPI '8!@0'LALX  ZcC@JId (Բ?5RA_e ]"te;_8ahث!5eTd?O֕A\D knq[DQP9䱀p?!C|AT*ӾҪu1!M #ZFcė͡H'`Z=ŊUVN1QuLn!y-qE6hp(MS)88俠62>{"%@ PCpx]zmoCPἁ+Y̪EP40 /f?T8_Pqõ_s^QpJ9< HKr:_s~3#~'>\1D[&`:@l{uEARN]/#?C ,07jTFx nAMmW #,ijp`Ve 1uVSs`Pf W#!b=i3=ʓ6"^"I">A $?b+$1BX-B+b[v}e KJłm$~C0F5MCa#Z` dFz I g fQ* kRϵ$= 1*# 9lm&q}+Q,CY65X -A#&oZ\EC2uT iu@Pr0#rK&uqfk12#1гM.0=`P0bpJXd:CU&J&fN/&%4q`9(R7k'RGa! S…#0u(.RKy>= P^Rqw~Y\Q.b`~NXuJh[S!󤈞D@0,GvҊ6W_4b\H{̃ɴ".+R+r/fH @Z`Z4}vmlz*'zm~*'6~|A|Z| %$Ne꧃H*rzJ:LURF!``٦:?>aL!, Z FW !ZzD0VV;VhH2?F[A44M4nEE*ND4P^Y`$8~@,HGJN0?K) PF])PaB8s "Y爗#ծCA?~t%-D0(D'A)͚` W&hڥ]`D "? ʈOԧ4aOǏ BCeAHWH >ԣH03ͻc"퀎}$pе=%&Ǣa  1"B-0Ej0 @H9,XǦwkp A4DxkMmQq^xW v݁ksZ>Wb]U؏m4,p IGU"QAY#;%q6gje uh,!g!!( (ԆaxAS8'^vc@BRls*;' 3i ! PqE3F .4)J&bhLBIzm%T4Q aCba" ̑ӈ_aVIԒZtdVwG<`~6a(F * N*:"'ev J1pFTpf(U!ɓfdY(X o lv.HPh":(B?`8 )$,էQyiTm"CDBX.:* /¬1 rKt,(H,䒂d+ \Gm5Do6+CdrуtQܤo1{* \i*#2QzQ^ekƳ$쩵)Nc]v(2 #XW++'ÚlKuD"OaAIJl(=]'Y"#H@@wZSuS0dK[B% H9W V`_Y>l%M8A`&Oq5 xz#`vꕾٲO{i71u %"FD׹Ր*RI 𝖀&E-FZ$Ol*M9D9e?%7[Ih[g0mx!A[YHз:yIcH75в,5/+(`- 6qוRl6H${ "i^ &>vkE!}MSO c3w{S >`gU缑X%QrkDQqR醲8np8+.˲[.Zu KlG*dPpy JӪG_%Le;L$S,ƹ<TH!BT4PtKY=êcAzPt\pP#p I PpG\Y8,[P,Dr */.Թ&[X7$2XHO;A̧[q0[.|.ypL0 X">>DvmUUU%F6< E A_RtY%/4nPx%PͲ8Pİ А-@3&,PXIDǨAm[ '9ӧt,Dzak+HL/s,*tvv,{<Z@P g"PD ;5>0B脼6 q c>Ա2|:Gp4P)Py {ڲĉP3_"-6a)K4 E)Q)QAW阞Otׂ<E<={+-A^ty]ި==s eE<٘;Q-.0nÓI, \i @`P΄("V\qS;yًA]|=t`0y$ZI_%U mB1vCy֓.=."1M9LSCb@Xs'. L]$6@ @w:GAC4OcA!{@}O~%`.%T]nSlWpTpbEK!/_0KEqZE 29qX킠p:_+)5_$?E  DD4XOY%gI.0 >Di02ăc-S[#([o lGQ0Y3C 3| *-0 F0SPyiUUQy%1PCW$M\RW]0G9W[m@ ; H(v G `!gl&eXP@YfddJeLYln,YB Y 8%˕|R0 pT3`WI5c%fU,C9֗_^K;(Wz")"Hta= ZC ( A"rLȧFGÄ?b6r`Ck$nK&1ȔSP[øe 2H1$WĀ]3#(Eyj-yisIe8 E0"}![3 ]R" ="  oJŇ4:+LԬNA2.Im 8dcQeOd,G%X=v9\fW`\!Y@atw\mN^ʵe[PŞwBS8_ UG4D!@SDz"\ۑ5M@+ BH S$R;# ,TbZgaE:8w @ .yjrd@A2?&t8 kUרA@YH[ m ) ç8i `!h#!0B)tD1ѝ!A&̠UQX"Y;;p`?da9R%aDM[(FaBdSʆ#`h2 G+b- !9- w7'h0CA1Q!յU@|р#E- \!?Xp A2/Lx02M>bYGm X!x*Um,WT ?j;<~nQA w8w|%a |(F@bԀ` kA( L_(hD("AHDc%4OiHtϓ_I@MZ(͒Ig+Hz jH@f~O PC4DD۶PEA %@Εr]D< UQ6=Ղ1ّ<%Y - @"nE:\-֠s䜀u!P`56ȄVJ&DDZl݀[؂%Al0+TBc*R2Zm@ `8ɛrBt/хi<2 "2d'D.Gll BύX`#np4\ l=?|a$.1YwA! I94NAEb{pdJ2'P LJ(0\ N47AP\-'Dq5k<$ AYVb| DHlHt @gʹHzpG ϓ]OVa٪^utLDs #laӄ&'o TuN_PP'UUf_DoPkB)#*ipz46pw*du PiPiS>l!"pjȧcmv`tIg ;&?u8$v7vl"Pv *ra5 7@1g3Nz qExpa7P'0y(P;9+ yrr+?VցcE)33s9 1f .[p5!.u{lP[@|;x|PuWݖ|u0O D pg4paTc'-Dg [ c[a d"azpCA2 Nvejpw+|70L.`ppBh"QW Ztpwi?TMFg%vw呃y'p3`#dcKZkm*&у02MyfH qq(ng!NfdqhzG:z.bXeUPSp90_'Puw ltQG[$5{&Q%I0 r MxP[_Ojw y@@|a0 ep@p;{75V p)6G NN1YK8}~@>Pe@A5BW8AA(2U@טwl| +sP[ |~AWtwnJ Ơp(`OOD̕[uR=tj&\pw[RfKpF/EBwXG*rcL18^ΥC^¾[㶽7H@<%G KqJtt55FuDQJDP({e>Apطt|[{|G|j7yurE%JPi_huX#kIipx~puqLlb ^w>@! D7G3aZK@1<- D@V]CL@ kdhe+PkNل0z`>j~'bOg~Z kQy/##TH?{ϠX[o+BtCo6݋??bݑɎ SI3X% 35(\ Q a ?P""o">*+DzgE\U_ȉ_ƅՅ  PI˅`*"NN飉 s""Zԩæ`'Q8aBB(Q$B!CbЂbI ZB$X-"4*I%|@4cƢeJ tQe.XlAϟ+mĆo mB L^RҌ9˳*|͛mlcCBD;qx,kUEz ƒ.\p#ʋ@i\# () v bȆV""2AQ"AAp҈(a:b`D dT7Jl`gXzZǬ^|ra83)eLWB6{1GT<aT`yBDpO=Bb!L @#< AlB -J+ɆlFLj$Id$U$ 0-` %Es?tP T'8 H?8^"%M$R jmzR4EM"XQ &‚>lNApΐf\F̨mu&IVNZkVVl U2`C.З ;(!I"ԩpSRlxT%qႠ!@g%ZD$DW_0i`UE!z6!`alSx†ykIZxA ZtdTRI夓hQ [I[v LZ)a;-Gqӝw|O g'(Pw*`h"G-hj ;cW5UH~LX!`tfC&r&r<hr"VJR`q6-)С -=<-|,8!GFyG6x $M\H 7J08}.l{  B3D-x:"frB2t9 aA ƂRe$ QJt0f 8BQ"LAb,C I;-GW (TP IR&ûgPbiIp3loGlF@2 UX20ah戮ɯ񳊧pXHPBP$CB0B8E$FB4 Qbt(a <@^:dwh ՀSPC 80! >$L,4},PyNtؼ9G2bRb K A 0>8bic$浱wCЁ>HZ F .X@"g9\ ߴ% d^(i?t\FB|e ba+bqUEGuIJlTD <|4UG<"5GEkd! 712"5 D"䓱u'I*a" Y?A1LB!<"¡X0í&@Kmxn,]Dc}q~bġnhG!)ܥ4XxL&fxC}RX"uSJ2dl(xB բ,afDx9]q\ ~)= DPZЫ!XtC.2( HFF _;Q{1x_T ,HhB+,ј 3yÃ-ЀMxme+ LPAJ82 CCciT5[q70@tϺP!*Tْoh:@`ˀ!HE-_Zx,#~: nclՆUzvbtn C!oA@"VI[), )W `P`K@u,:]T?_+0 ZVsi,>beQUD&^t')o/5@.qtP$- c{ot Q@tY D/1:A2d!T K#b(#+`w?.TgG&Pq$l #H!'w+Gk9&=?1pB_Ձ>>90NJѰV st((*@F׳ UwE8G!codx9t /wƸf 0|fθLQ@jHP+&3CT 8GYFIbX}(PFk$5P8VToT0@pY`(4B1# RY:R)aK*X*::@x&Ph(q$ 1C@GٚHf.D<,]PK`O#\(Y(xvel^`&z@@Ht ?2"D6`Bo23RCA'/tP+~wuW:'9j2`_qP Cw* .k§FJ8\QeT<J`9k+jp_P)Pai]v_R5@_"B'fvQI19I0s,`QeAf-D` hj@Ԫ _wt4|]$aX P C 5kp7@{`0~PeꀣRl0ˀ(}T9AO9'!z,AZzPS/mȌd%:d2:+qx p#ഫdTK{؁NJk(p](eb4`׀ee5 B`%S`@R0nq !nU ne*hP|dH/ڬdZgJԊ4{[3t(kJE pB 㲮sņuU(z(_l1 C0ڒЩ>6Nj*rzKC``n"B' `+@m]$_CS)cg~{赟;@ z(zQFG۴E9K V[k _ Z0ʉv`$W!kP k{[o ~Ӑ]G27 20KkAjK !pt vPs w;eZ^/sQeATwpi p0G{S(+c 1 ck]n03)h_@ @CFR& B4Ҟ b\^aLd^cvƻEKr\d @ zLrjnDkX1`4]`¦ z/82YIvV, 9 [IrtZpB 'AJFh-;hv,! B nh`o[l/Z*Ƣ˟ÌfƼtftq&q1pKiyUJ7c*UcDǙrM%h .| UOU1 &Xa~"rZBU̞K⊖G ޠ*ٹpuìhy|#_9l\*NkH=&K6y{.gTP`cOZ,UΈ@t1ϧ} [! Kv/##Tl?`!-Э R WĹZO&P yVxx `^5q,)}o0x\JF0'-ڶ:]04 6Z ~X-]~=dq*4dNtK؞bE!kKƲgIBZw.ptMB ʧ*+0rQKOy-0-&V+'m=z`JP՛kkߤ*IWIg<)\@mQp +p[m6TmA.!{F #&gWw/Uȃ\/4j<l` Q]o,EyJ>L~z] h,]ΩXd~S=)/@<ʼny*4i+Ʉ#9.ph֫)y z_uc1q]q,Ҝymȡ5z<@pP~9<)V+ҙ{MM){{u[OTI ;[m~B p)"oYWS=; əUaTzD/Ycpkyk6@Wv7 jE N=lfjAt B@CmK @LL ֆVvIAm1 KL1K$P\2R3L\_(@l`]-Z!/IY [P$σJ\h)Xp3  ϛzUH ٌh.(Xͺ0;iC0~PZB.M:`8|c T4ZCA'P ;U i^z\JaOqMR:P TiDcp<):z*dqJBЗba (A P k,ZuLbilfR $v!! !i-B^JDz X ^$]lIKyq'blADtC_HY.- 3"|78AR26S? S Hi68B8ۄGqqZCךFH"C;]}F^M WW@iY{73Ms _43$ 6|:9p#E d fB]ﰟK ʭmvVflV#p 'A$I0b4EVhT/Q%Qj8x.2)'&>gMCY;(P& M0W!GN7 M`"!0y\!0KiUgq)p[buUlMQa %$uGWQO3̀]fShdS;v0}<&#0dK:C5tPtMR6zE.zcTg`\B𒂦~vBf!J\adCMv71PD $ @$Ѐ)INb rs 5  ]涆CXSkw4~&hhrMvze)Z/;'UH#ǖId]24w3awC#3s  {dW4)0!%tdyu8ցhd}!5'qGzXo vp~RWe\V6Ib0vB}PAԀ Ci2P`\80J)۰< uL4#r|UTfN1V.XkC9 NeLjGe_pl/8;**ISJZZ MҝLr iY" 06FdDLeS GT&џl 6aS 7QM ĐM$ Qa7OD RwMb Iݙ# E` HQ7!,Z ZF? ?WWW_!! ZZĂ!~ylDz0;V;h HFq?ޅQR[RAqFBaP"4&VBȱ#"wx h{cG͙@ Aʂ~a" B0[?zx`ʄ|dPh«ÊH$@YhGw p^|&r 0HB4![kQ'-+P3"A"iH+8 :t֣YpQ$#@xGj n0?`λǒT2I2ʶMmz8<$9߉H`ЄpK̊#! ND6B~?jsT!@[Xi_,Բг $Rlbрz0 *lAkxg` 1C! AwkC.  r!B`0J#7ПAG^2@*T`D^!FA`[ꘛU\#$zVVrl"x# {e61ZcZ81vz'. \ ]zӑFȧ!  \!2.AXD0.q9YDA< T[.fD>@0}j#a*I[Ba!MEH`ɣd, R3s* Zc6 h%{7, b luŒ*$dRh!0,d  2H&iޱB~VG@ $u8j:0&8@ Mk j@/ ecMَ4"H2j8GHY@ @ ~pGv @ p%B P\eC.2].`o0y d@F2|qLGoA4jSQ2kAĈ GW.BPY<;q"p##`V&@XƐ:Ue!zTx_1_A~+B(0^c P"2=Xֲ*uRUZ4ǃ(Em+euZBG<6<1P{nk*.AwN\LϼZ8| c 20`'XeꖛC|`+/r@M@6B]AnanJ5BQs$Hp? i(zVk!{Jys ]AlA`2|qCpZ3+)4cHE=9a .VوBխƒx A ԰`B4\co ,vP鎯 dEuxAEϬ1HZ[]kQA> DRzE0 A``Bzhn 3T]t`N=r79͂ -[DL=!XlC@ [lq !_sa(@ҰꅣzE$;85Sj]29ۓB {eZϷ Al:N"񟭸)VS9\H^t0uh?a[a\[6vWMBp"gaQ0#p jJ}AdOy7wwH 7W-qw2{f f gFy6 sv*?m+ia?F3S30(|`t| { %;-aiq`o(P&M׶@va0p4Dwje;pSp}W|5xr24|`tn@hWG\o_z[;?{#11s#dC|1@k<;pC]eVPqdvV-@_\r %PrIDS4/1By '#Ê(,aƴE9RhcZbLjh(uP\ܰ=U)6cp";Qpi0dwHV}1ppA;/(5O1p@eelAEIsNbGmfMgb+VE(hZ֋t h(W'o@{u`a7gVC$e#sa0*p+PaA?YS6wJ60(J3 hdY72II\jS )rq6 b9 L#'s*e4EiE+R?!Z Y[v,m c +u<::s҇7p;ַpp 55P0PVGsk5EuuPɃ|BC%XM$"UHr ؠ5Lj?e`?Wd0gfEzi5i+ʢf:T<4|CpKЎ+8k %O@%ppG^MNvdzWKS'3_@%4UIPD y Q#S'rLE*uny+J[(ri҆ `n=ZjA 'd"xMZ 8  ( @)#w{t]vqQXCe22H2rSɃF_35bPFw9CS@s:+Oeuh&z :T@Zei8ƘIcwTd%pik(\@P n+SK'3NU)X&Ks3E `)᲌{YjASw?mӧ{Lj!Axgn^P[Rk-fXjApgø+0x,D}`(POjO'|5 s畔U^\SIj s$Q'KG+S'hX;Z2ִFhhlin[d  TLQPHK 50+JpP1׫ȃ@aXB ``QtFTsE$ePLr]/ H6h56.Q{,vbQ&Q]B 4ZVpٙ:#L+L(L) ‹ɭ*  F7Qx`ZqJQPB:L;ĭiV'(`=e>N+z&)l\\vzPS *QȸgZpJ}|  8:%Y8@‰l0TnVRD` V״Pܔʘk,>r*qLF =>+ǧ=p' >q:M66j~c TV T0agf!F5apB;w  + ȅ 8ЪO:n@ͫk%<1NEITՇp"c`UV.Fet֡ELJ .YyX >`SPT І$CCM>?VØς3P8|AԨ΂@k ԃ\:n]D# vCl^C0Εmk!*"ia?=WRX pS0 RDU`JFPTUs+gJ\ g"F4@g P)PjۇnۅڅXIiaxCV PY FD9;ҝt].yq9KE?~4~Ѧ\ſTDWEaDnEġE٣}U0gYt@E%7ٙLOȎ­YnÕ kÕ$ӂ!=)^֏mDRy"W>p+ת?E''`P=LY?+<9L>ѺF0my6@ ]3kKn%ۆ7Ol $8-jبG L`?I%*@Њ:~`0'@? S+c|EVcTõPzh i|O^*/o>fd{SAPNkq"?Š#yl @v='?>SP\_ K,aD4ڠY#SE@q G0Ձnv.ڮn@@$%^lAB]>+< N"= e+b++R+> S.  == .''ZZ'e<x#C`o#%?$fh D‘V*bHdID 4D=S$ȸlUd$S1&F"VSDn<ЀR,+*=PGW͈V8W]e/mue_ @yD`a}熀GR@$Wa EqGEj$֡ E#UHTpIeB%#; "BAR( IQ&kp`X0#h`^W XN63wjG_=7HBP ! ~"'`?"FX 81$"Q,$DB * >S"(@Ip bZH#/% HЮ7Ia, "aB8iĚ4Ӭ<kV3"ЀXK8֥wg1A=0`hc(WPbfE,qQhv!n2`ҠD6 HA""/, ia/ )TrbR B&8Ǯ1 J `b Ax)zK\Oa'Ɣ\)Kk?| \3G^bGjf.a3CxP(ŭb4> DL `!4<0'bk=+ c He 7@NYPvH)GHoZ^\cvt'y] :7  %P<CH䃦;3Яx(.J8P1HEP ,# ʼU@bj.Qh ܑ""GHeYIٟ"9 H< 'NHx R@0(u vǢGXq[08:Y ΘFWu4>5j,#f;Ӡ6wm0:`b~а?TT TA,cBTV0ܖ?@` [tv! 4ge`0C7CaVpgC`|zeb 72V0mmF]<3Hz~p;?؋iqcRmH (3,ĎSQ@ns 0)"K肑0 (6ZjΒ;w#1`:ޘ'6!? Ip2'ECp:+ɡReW!:tA y`cQXlFIt#O}P`P nhTv ,H3F2R ~%0TE -ЄXT!QF&+qr4#؀r\qxNvTnLW{@0:{u gxhϥ1 |*H8g 7@/^9t<(: [0Jhhn\d U[Ɛ!ػ6qRXpA ~D Pw `:!C3N!eMW!kG`֎ ~0*2!RU4` ,\ȯ_ss ;+srs 3i0<f2ʑf%T[ZuFW 7p{ r_x!hnɧw3 _QrQ+o;C"PqIӂX~pFW[wu}~r/APC|'p EKj]&=fhֆOWZr(P-C#=>>\3fx  u khr Xyjr dsspR #.0f +Ij;"8b 1("T~pKw s0vL Z7klZ;A#DDG0}!MyZ= w sSx q>p U")0[-_83W 04 Y2卋,O ;^bA70 W~5wP_@l qWSF@[ EX]x˕kkY9AJmo( ;b:C$4 b+h y peUdA$Hegw&EW0k yI^<&!¡D "x 50E U+sr>6*QNؔgHȓTH3-'BQ`eP0>QW gX7`(c_*LȄ #ؕl py c+pX~ !L+Eq ؄L'\mFG yV?0iW9Y> @PN xpG) e/t7KkHQ #WL Z$k̅i #wTT y@h2Mp|'6(P^ PO0!\% 4 pR[ l/xP>9 GPV\>HWMm0P `-B}v{nn3&HFJ1##>4+@@_Ր` D@=Xe6_4 BE ;P ~n%.fV8YsQ|wڠ  W-L'>Чr a:1pe  &2"8 S{}pʷw69Ey!^r;t>Ï% `AtpPBi{ npPmyr.l7"ZGTb8J?mVKCiТu t=rQIv{ lwYW[%$?+!+pe@#4yps뱐3 | !'1wZEK7iEr *q8 @9( wU+20%A :,WQHL{>pj$X[ Ǡ}@_|b] hg N,1BPR\.Z| !b(怋J@5[$:ir[di~7bu  <™o *rJJP`/^ WTϡP+2"3Զp { y De)x_p+ \~JJ0:\-:TpTt"'W-D"g K]iTQ@9r#IȀzl_fĩ+XuĹ74V(.p*qR+pb;Z;T\Qm`(@  ΜnP/Mqk!dMo@ЅSUPpWдà`iG'?΁!(%'B090H H;e;*CC;SVUMWQJxhMmf#9Mm#lDhcj(T@7Z#Ԁ AU 20(HFPۆ<*q#g0, pl_ ZQ+-# d(4 #q3 ~{~!=4C틾2m#0U,4xMľ|º|" JS C +Q.6( %d7%?G\`J]] w|pO<slf C݈42Mg#0zC݈4>=z ׾I@J"k ~3pFL̪O4ĪO(ڬ(Av 6r}t r' ?p. kv۩!?vU! Bb:dPۣ #nqepaYsKC{$(= B#JSMQ>}{x KZy(E@ |?\%^;Η1ۧ <F(u+%V`s:dJ{ͼ `M^Z6fhNj֣BxtC3%z;N+(Zl4 mW%<}t~gPb|^!Αrম\`ƒ rI NtP+I ٽPnݪ?M, D>%  "-) @3b:AD,"C.ȟ H2E3"I64h8ydȊ^P3[y" S! yf3(M@)u@{Quu.aPK;.@ƒ#|bX9szNPO=_AA!ģҘL4$4HG6r CX=3B+ RФ<*|tQ'ro '6 8H8G0`@ l!G9YI}T@[BBLC]pUlquhIO<ݍK0 bLK G|4 @+Њ-\`a X <@A RqVh)uIxdipɜ6 hA1릑 5tr93((Dm+p yZ\` UP4X-Up0Uvh 1TB5po 񇟦r, *H3Ä^OWDrBHrAL |F޳FT9HP!9 NQB8 d)y&ióF @R72[ g 3Tt(B 1d[ #!0XLd0)/@X1AaU3!(@_YB\B1ì A(#C]pAb*WE!?8D@`9GId;䳥 i=l?(aboaVw #p{41@ fلQ50(yрyGP"#{HŒ!e@ 2pN`u6tЂ@/I1H-[_pVXf bzwV#Q2Pw7k(P5%0nhg#Pwwp"L@'` w9Q@zUs2 rP0WAy# ^7:^@ _FuCXeuKwJ`Sh3pYg OHGp9$0ۘK0)A0qWұM`Ggdqz3l|I M&+<H1L`QS if@g<15h_0/ɋ1wЄi anTkm㏘2'!h"WOsGe S@/PM@ifm&0@z>$T~`_`p]p8C0h']^0L)@Swp#-`2 |Fc#\a1pr?ևyk,U124Nqx92C|Dtt6vIi Fh0_t643&1_/əi ʠ3P-m6P8QE((0 qXdj8pU,{$'""*r$󈒁FZ3 8eѦ^3hXX|ht"39Ay#~@3yMp%X8wwE99TP0K7p :]]pxV(VpH!gЩm*ِp9* A9 Fs kuKP@HL՞mi%9]zJ70B( =gQ&68e9qř]a#І(0 m?[fj_ :UF=B5;|dxSV1(g1OA^]2$[EuIJ5ǒplpK`q/%.wjBwaU@ :E]SJ`kǛ >a˯P 26 ` +p o*v%i!G~p] q2 1;PO# |8g";H:jjRƭsgːA9PKk͸]<61TU8E S 7)0[E(SuKb (0J۽tUEƉ~&_軘Xdc$!ij5uP3k}ohs~GE8_J܋c/Y c@sǯe;Q:*0ͻ2"`o24CWe*Ɉ16CG/+K뻥ʃ|@ C k[:.g&z:0K]`D̎Ѣ,   3 ?0 424,^2B8C_e a곸Id0+k|g5кRV{(0SSYQ@Eu+ꨃ lQjwYJأ(L~*d*, 6,ɫ¾"!9l4E{}H4d@|VϯfH.w9l0&z3E <C=mP 0Q KPkcP#i h x)MTA)Z`2kȰu |Y+^oPJ^JRx B `2!yy_ *~ܲ Z3x n֍9%$0z~Z{ݨ+,qMg@ "yS0,)- #G!};0tF7 >^0' 0]\nJKmWZxzr_i#pK0 ݃/pZp:LI/󷓠n"$ d0@'mAžX:@Az!iB;Ka~Z$Ni1 ԯ~ `9330ͤq~P"sj@Q4ؠְ7 ːlÉZ ~\ۼ>mo~Hغ ) )|Ŝw6v c2.(pǕ̄!u8q"u?x W*ᱷ7WQ0A] [\G;::jΧ'Cz󨥂>oWW_"/Im"}ҰBA/pHN˝ZWA5xш<;:[w`$f\D2荂5;j H5;+3"=gyi)&ʶ'P_ 'q41_ ;k^{K -po1$#0̰kHk8^^Nqq`SfD:𼨟#sooLos?S=I!,f!_}/}/l]KiCJ88O5%3 aai-ZJka-77#J)9v$k//}lס,Eu)L" "j@(Qxӟ={m0%H>5h @lSbDP0H×W/uĸ!Ccf̈i#&p$Q.H(IH]yֳ,╧hp; UM} 3YC3Q-pqb碙&mSU v,XϭfX c5>(cYWg P;Bp1$L$ştqu-zAA{緝oR-nx?Cնf#yAQ \I"= 04 @!p$PA%FKaFpu$pC#p%(ǜW] W` pA ]K:pe٥{sO<%vz-gSoԟ"l,J uT =ʈftG#@! Aф @!B BSNɀH8Ԁ ) C`"أoQTSİHdW9tUwe"6@Xf`}9'B7lsB!hfAM8)N~h J"'ʧ7sB 0ĀRsyIO\ Ͳэ0 caC\$ oY@&_-ɡl{XFg*!łEDQÊԈedvQH\ /Eآӥ+fPpT yFE/r _q]䌐]<0,Aw&L%VnLR+Ն~kT[FgTGYȣ C',Sxj r4H=`Aŏ:r.Ll(p\4A9uSސ@wE\`=J{F)MGkBE ?y`C xM@iN0S?xmsMO T1""pA*惯B1 {?, "*F T$<0cVn؁O_bхjL}dDj@?\lKI[|a[r0Doe80fS,,`b& l)G79KRt;ZyP ^ہe|M$kq 5HՋֶAP5n6DbRΧ.uB`X*SN3p%J߸n?1u(DS k(bޔuz@ʗBf a/>9f"g[&<98^fx (  ܨ'o1=*l`$IëaFВRvXCBB!)ZGL2~@5 {͛T'p#c̔aٌ^Ή-j"!%FkÛIv1M-H.a ]?e,tQЭXVwхlIt!0i0Zs+ l.!$YD!fUx(+l)/P@"<*pp>&5@̡`b b8ïYluvX´beQpu.Msn-@M뵈{#|#5iC}A3 nAGEgJƳE2 EGˆ0pe]0B=V魫Š}w"ȤK"j}/b `g/&Q,ea_-Qih3i/[Pp!jr*Ov;' үi$?ڀ,1:_q{rjOlV[˟J$[Dm`5'~QO'ĥ?Q%KFw%8Ŵ@˵m.w;0{s1yXe(4 7%^f!<'*5c Qz?!7rpCw`-= `7vWd&ŀViugK`.l'wv@)#ǀdi@y1}f/xx6[S }Q(*A )jsĂ%QXv.  9{LhUn![qb(haR3}o"'g&D-6\wxF! )eyud<dj}i;"B&=. 0A`Cuv^eHGX'1KOpD|--9g?acց"d.78XRw!P"1(""y +}1 [B@ *t}كTF= WE 0 /uuQvWc &cܶW.vՏKhbbdu(|h(ULJԄ6qGp* Sv @ 6}CPl@%i ?oJc(`QBc0_TJU.&rl.Y Je9!Ж a"o&򖠐do7HV"Ic !,?? _~ZZ hVh  H2FUM4n4Mnօ4EP!WxxłʄqqоW~dF-RY NC4+W$C9Xݠy@bPJW&Dz%D !c^X, #h@5AR`( aF4P#&_ L3T%.h6ޟ-)aϤh Jwq`19F)ǜuBC4Mj3g&2OaMAxٞFQk/Q:l( 2ӝb!(,Yrf5+w SHY =B?5,Q.!!/#ZOފ9!E\1 Ĵ$Ӏ1 [aLxOh%` lHUBQg7H.c eG" 4=  KwKE` WbbB͸I"e#9ި)Hࣝ88IHnK;?\`AȄf91A!Cb?—%!P\6AH%=BʹtIgxb笰Z<*RQ @$ @aABT&B%NTual)`GJŭe2Ҧ!#n*`6{-8gcO; bu.0v-0$Tb"TENWQwRN@!t\pt2n#J 绅+͋@"B/!y'<șskB ,7 `v3 B29q`LyenxU 9.ܛc `L*Xk, \Tt- #N2i,PfN̊i""z,|ض`P2PI\߁N87W^x.c뷿<Ή rJ\ P K lvRB eE2BO,, < $ VB,< +xAENa! 7%nDh]-8[!,1s B@X/k2 Fa "頠!b$rBv~TD(p- 1Q& Je2P0ҸR)؎+83r… @@%7C QD42Êb8O <&3@3͜p[pc hΉ :cIAG+p^ W6P *2@@'Z?O> ~Am s4F͌q4&`P?4!V@pR[ 2 '^(E"QLzf2-ΓD4oD[a$ЁX"+n&cl7%8 c)@0A1x,qD`=*!dhE54yT#O-v (SӀ@Z,&v8A|*Ah}." j?B_ z h9"&) 00  P?Cئ)s ԨQFAx:!THFShxy ug"TpBUpr;ׅ-ֆ 殘@W]['=@BZ`FcQpeVQCc|} 5H!<#-CAPAbP,#uȠ!:Oina&ACal6`,cuk (^EWܥ k{a4ˮ*W[VWg ]&L],'@.p;hHBx!R{BL0o, u.Ƽmɽ/H2 EMiCtQP2$zJ6JXȄR8` hRe1 r3o.7x p+,#| dv;G5gY/GGX@ :7(uq"Gmv +Q+dOF8(8p4c`} V۬*:ZG#pMWQ˅wAt&hޮVpT`@P؂@Z0g!H_hD #C pD= \h>xM!i2A^+N_ͨ?#'SUiz0{EG t_qYkh{tdr=%<wK[o#mz7I &6/e#3spO7' 1g] Ecn~uV5,=,^Oh''c-Uj4LTFu:bYP_F7EBlbBCD!M;'#* }K%>\46hvdP+v~g>G&@'C#!=EC'`pGw@|Ӈ35e#냈58b82n`78cB8Vr]\Q$H5;qoG;`AW4Rj􅰧_h^MLWuP_57%`3$&*8!^Ot[WXgN@I.c+Sg1'88hOW\kUc>HEGv V61tw#Q0@tWS tp0 epkkhcFZ#y`X,=| ^㇈yoe/L78=%&~4zucd5nd`P9 mRdhX`GCGhD`% % T PϹZP`@1cP NgadA["I<Vbp8C>?T5\ sdVIy+>pvX[0Xys?Y5]xXC^jYO@5p#蜛 lL-Z+S)< A NM@aN2As'؍gx<ٙI>%S$~Ai`i>0ij5lDSWԐLVp)kd:*5(C0_c!Uvq4;`ԃ݉1mA{)#s3\}AtOhU26yh0y:6WhvV`J}Ydd:{rPw*8p5(kt*k Csh@:ڝa0^y'H07O]B ?Y>8bC֥0yc> WSc[Pm7j phc5 OwY`6{{v}P cqQ0fWH: j0pwf Q |#|טg #x;iO$sZ`3ÅxUP5ѠՏD9]HgQWjР"b0EzVqwjs5{tJڈDypIⶈ`rx@~Un;$Yj噠G)YD?/>R^Kp_uJXz8dg{mI;a%%tG@=g{3#+<>C܇*F892''U@[` H0Z]2c9c tPCg4`PdKOӶkd@kuX,к0Pk^ad$ @wHV e|b|mI/"{O1m#&ZxR8#lLiȪ9`iM+ mLj9p1첅pY{L( \?a!Rt%BXE[EV}¯U>#|%a+C+| p:+pGPGPH |RȈ)s)Ȩb+z˖JP6;5P]YxZJо + XPʻ`I@[VDG͇O|+`M.P—<k ~3+<I ;*BD% >0B~Bsa@b4h0W?}D0 P)P-$^:Ѵlx3 [ta2$l&4-MOA[+O"7>)9r`ӈ=B*;`=ӼT-C:{UC5u3 +P/`E:SP ap}MvфP%˃𲃀F_Sam1JEP4ܼ~wOGgLjBE-`UT-'pOě8R=~9~5xT t \S NP+{r*p'cׂ0MݹƩ܀ރ5$ F2pԤA@pP̃A sh= n#&qP<~{x@η<9tOE}3cx":W:It082kt;kI҇TSY ҫ+N>b}`B =~=?YO >0.'`t `i9MLͼuG*tb 3 9>k\p(ч0u 2dT0b1PaN|+9=e8L<`/"+c'BC+ѝ*!%0\Z!jq_7 ?Ζp? Gπ|D AAE0E00BDB"PIN"L. GN>eB+*+SQ=' =ÿ =bb'"2P+Sܛ8X3g88%(q?-AbFCD31X0?PQ叔Cx>>:SO!Q#YD a=HDž?@(HC-ABF @#0vau`I dD wAn.h&tV a>;@g;ۅ <.4"'g ]# 'II.P T(jH%PN\0@(gYQlL  XL͑2D"@@/ 2ɅRB̃4f$LNGyD03ceA@OȦU-r@ `"*%gx!.KwW0m,08#~ cỲtHu6% Q:{?50)$~sFQŴ gx5Ƙ.(\AA(% 0x @<^{wX8E- xA@!l@0ά&u@D]sR!HB-"O4?}B Uo?s AWL 愢z-X@6"vZ# q@FLo᥮y@NW>h)i֎Bc4waX0l,RpuH@"/Z4aj1o*`WB 基y˫g?'&嫁 >Q qqZBuuupP|0]:P2R~,#a cp". : }`>?*̨(\vKJc0@ P$b+ws %[T]ts;-)@`VN5]) 5[K~Qĥ\ִ-Lmvoaw}0)VtXGFR6{ pTY'W3up faaF@1#Fe x::t4 @u7dj jxG)sdZAQ~ @HVke'GP^&kx^^l191@s!{ Hp #l0dpz &ADCt(SW!5L #=n`h2jfBp H!'Ap}UIP߷N<[e*pX0_-+e lX 8jD2iuw0t}!PC*Vvrf`~@ Ah(p0R!{ f \PpWqQNa5'qq&U}8wuQQf  ЅЅwi0tp<I 0ex@Y!8y,WpRvI\g0zy zq6#TpK71a?N8 #$# q,cMx@ HP gAPBf_ s R(LPcs)YP +$цir)f~q&LK0K-2yF`2 h@g-2slPl@Am752~!$"8?#8- }G6f;"g$W@ w" Yt0XC"`"ȅ]Xqf`@4lX{<~,AW17LP *ClIw'Au'x88!),Mu8pn-\kQ$)r% `XqkAə[0&y pI 55 Iks.p pJ9G$ziȴ-PUp&)0*Bp %8z' gSxc >F?`9 P֎ s0!cZ}FЛv? շ_{9ivQ#G` h&?5mkdH'XI4n0z0g$&ZPmq&*V0A!_0)ECH PC >q \Ф 6n?R!v?"MTpkW*3̺ z z"oBfP >~fwwJf7WGZg{]!i`?N kq!pIv63@n ` w`wլsl74]?gO(WyfjUP[hQ2trdO%e~" gDj$CS10i0#`|A-E2d*0yyI hc" sc!+1r K9 "ǷVf69(J"g}y WPW!"dFU"0.W,`y(#u !>n@Z(q!NmV=ß{d c3p]4p[yK(jqya 7 Z CYYKwD'(DpL{Ǣ9<@VL {8Gk{K'+O,݄ $_ ̕LFpTj@ 2w;u:{K( l^=ehӧ?%oE\נ`7w}s8 r, 1qAYpe b28Kd R@A?4i-BL9G)ImTdPDS H8j9bS&RZE 4ԚPF ,gb'VWRH@Q_/| E6`a0~9xobpw7$pZiexO1DGz AiVPYŽkzg޲oP":vLPA7 6PҔ("!D.rN A".,:x""q?캅 i9ZP;¬kr$; ,#k5u,gH.˰4{oP@Q|"8-/^$AƍE\ P5%u)HuVCEM_T'( BaE =0!-hBEBM~H|4и#!/-JQ!,4B~pII!j,0J$uZ ,u/vZ`~v/@,b} Q`  №H@2$b/Nu^!t8 rDD Í16l:ŏxG:?`W)O0ќW[AhP74Gh@ ł)Aܚ.H-_h:ـ(pP O:tAƆb} Hƒ%,`5K.(G, F`9fIXZUx*-)jGGD-[pMa /@b`34b Zyɞ - `z'0bd`]8HְMcm ml.c8&bb` L%NUB8xO 8GHM'8 4C C?Xv#` Lžbޞ|lX{ WG i&XJ" vX! rRCHI1Xٔ^}2 +8vhFx0P'HDhبEZFLDI˸w WiL*Gl׎p@',Tj)  Xz:Ii U`\>X0bP`%bb77*րX'lT+l*5pP.NE w7=.w a>!+P-!\k"wG7Gh &H#"-yu1sW]vz z"% _P_|9P_i#mOX/guu1sɔ!S"fSp6K3#D=~r~$Dz%@w! b &+`\"7k"xp?(d`d$7G 1 zesH@0x#|#tg JP{ 08|Za^w`~@'Lr +q71T#abO$b=%W@Zptd0U?eh2#7 Ȇsz (W1Pb6XX_7fc Kk`7OJ(07@|3x28`Vg#%dWַDi GT>yRRfT,~=/U1Mcd*PkCe(p`,#lJn0H 3ʶW@)b& ؔm]CQ1`r7kpa(S5c Y3~gRphPWwTTB!~>wboWB2.ldր;{ l*ytXezB)1 !PItؔ6p4)` kP f`]pcI7,) 'j R/oi ނ$ V[w=r>6N%LQ`hܹ\r09d :^ F ' V6{}sP80 )P@]`9PC|9`c@1B9,9BYtL#  mtG"s7x L~#"ʴjidC9V5^П"   zA9L>BwLTLSS_ | Z[B~IHa ;`sꫤs7HŚ !Ҭw7Y4e a:H{8r$Eq`d $,$$=EIq Q3j#a]^6f.Bk˶ :oұu+sgz]@(15jAk!'Kg­')dkj Jx)٘Sp+0;`]hпV/Y i0aE)pZA_8q7&c0D,, a8س;g8|( `sYy0a0 [R{=NLēGp<\ xCUFL0 1 |E|} ]7RuBX̎46| (5zfL7u"$r }7zwhE, |.=irV# ;Nb +P"Hx߇PP]R70Vxe*XGI N9l3K v`򸧟u9ȳX9k4Q :xi XwQa K\Ǩ-`y mƦD2vzwX]vlA'IG t"+zaugK,Ă# / oD6ć`Of@߅T[ 0 p6vIRo~Lj\Н9912Wǣ uK 46$0sZAP;KzA/ZRꉇp|} *}`4YN8awԤYjr6Wګ(FO ֬x OsgѰZ mus֦{ -[_v ڼf `K‘,sUxgڍѮJ $ڭL`Ոa"*LpNqR;6;Y.h-=as8(2amukܑdtlK7Ϡ9K=m||=! h̀Ɖ0# tl|ن#%Q!ڝ0R5xf 3jNR yeܱsN {̛i=]{=e`Y旅=݉44 U5BaިRMts7}oP0o@{JVI`AO3x'Minkke&lPXFtGg3%^*n <=`(^lZ . `6TH4A3N Axk6䘶J> Eng7#ON)p*supmHkP<3yj60$KCຳM43?KvgwZQ!}ބ,D.ꪲuw-'=p ڝpi3 ߕE#&?L6^ yhP11lP z?ڬkF/@9/۽)Ɋ^556Ӕ,gP~N^wH.SVZMp'ۧ"Pd`^Gc& F@Je9i]fop ueum̎FgmvG&k%uXZT7gϼêG݃I$|u7*,gp6Nu, s2"2U%)%6nk T}}_KcKKi#k #a-1 u u__}uK6vuc9K//_  ݜE B`ĉ B HBxh@h(,!t/u*(,aܸ_u#:]X}hu-ɑi ĉ2^t睺y^wo?MH(!hpߟ*W*2"]#%7 ?=,2bĊ/?D!MXF!@QWbhQXkj0bŴk Om쬙7n.q:.OH= pC,q]a ī%՜eaR]HA 0PUߨKoa썆Cwthq!|VUn./ Pˊߵ8ӏOyEPPڮ[8D21Gd)[9Gyx²fmp6@8J2/XdY}Abv<8zdKbǝ}ޗ?Nت ]s|2" (9ǬDQc@4hLE(p cH_ۉƓ #.ďμYS誥QAqO} &VRj(4PB9+mm2 A /1(i p.Yաxl2^=RW}GXuK/)ɂUM%\FkT + BU6 DcB`CS~'uJ(.CHG0`ocBf` 4RJ 9#ٛʂ9WLDRDL z-(Š.ulN@(B,D ԧAn?0ףPr}S, йZBpI}xUT(&ዅ/’td)_|il85kcHɠxu+#d- EhQpnȫiSa%77XB !U$( i1Lco_p^ qmI/e39Ч?Ay9ߊȯZ@$cpHF{H%d ]^; P J )xu\,]ʐ;{ f% vtA?T<’5YUFDJ!>*D&DB?L? ~ "p X4!"҉J)7ߜ~i? ?$(Mu!7;N6~lP~"[[\mJ&-|\ЀqP,!,Z Z_! !ZZĉz0VV;xhVqŅ??PQR[R[4Mn4MEE0\p(n*\X(? z&H#0$CAߟeof?l R*\0ѣ  HBU#$d '۟89fA)V"8͐R1d8 !frH+Ax'BD/,H,Xab)Td徸bғl!*D4(E ^1S DC,`*#۶aNWZu4\׌ ן~, PBc*S[`kA7 q bpKݓAkД _ Ga]aP|(cR0T P6E >m S\tL_h`c8B 0'"HX" [_f0eHT&Y66qGeY= 3/ R ]8@"&:A&>(&ᖓ9i)( %(CTIyJAGZ#D[[C]$ !89aQv(–fBԘ*f*"+և,D7V(ȀÄfQ*ů[.\-0 Obo"F ~ *[v)jXlnf)&0"!BE*H8FV) |[8H ` $!hb>q paCXBJ5,1];TrEH0BrPt@ #Ȅ.+L@s1V'MT%f'\:`6en@F ;kD?LDp[@:b$,E!04Kn m"z[BiI:z:bme 8Bh:Iօcヤ`A3aR\ "vĆ pᒍN{lar]R@ kA79JWFIA(`E!Wa@R 3@Y24`Ӷ4F)6Ԏ%ijmX "X "sڳn M(}40n ye P]  D8QdpR&f NA<6Y Cj`B6pR}΢v60b Set3FpA༓k]Y ݮu (֗0! z (A`[@DvOR* 4HquLۚ{:3RTǝf>#Yي aY, tAp'`qi[ 9l .@ϻa/4AEv# ?wugkQ3 p 71b62w$\V}vh} h`Tpll}uV91*2b`=rhFcPn Ec^:/;JdYT YN6 8ApYVb`vAggB_2qYkȷ`Ieor:"Wـ}a^+ 4V1~0IR~BGKp# v8iKh36Ppc'D^OQ$%o3 j]YQ^edk{-lpfU@drofFT{Hr0a#d(6AROD a ٓx=f8i>PyMHQ*XYd_`Y6UF*ASi]@P5PWU`^`KLGR@FmqDHdYGiOuP&vEB3G%r6`0og[UNdPw0" }%ߤ(.a)~iC# s#`8ەWEPܵ76XzӔ9D@Ą\!P.&Y";ft6@FZUdeaĉUo{i ݑp5=~Cx3JP(piZyU1@ c2majHUYrHrXLP$SË.c7 d*Lՠ^P@UUT&r!#&Pm5hV xd19~tn#CP%@(`a`F Py8xBtX[}%Q  Е`"PA|V$UV.d鐺GqBq.qÁk:*1#)8[`h>DV 秼M+J`c2ƕ asCiJ8g8 \P=ʩ0&` X0uB&d)ua =6]9cJ5O:)An.0S k;!N}wMdym>l˹} @aU1Nv0IOM=>x3֓OO࣠*WE9p"yuH^cX@tDy [ ]P0MVE)ZFm$2q** jP Tfa˘qwRH.EXapCFh)(PY> `i`FItz-pX2R!XYdg$q!~ `{H^+вG1C'I@Hp [[:nrDlڂbKeMZy"Ha\.CИKn5^[^Jf(UEHb4 N0RV)F5o\5pYNpA`5dG;sd0={x0egB{}{ y ~XDN BkPS~e{{J:*hkp)@{*\J@Cxռj{DQK uA PNENp_bZ2B+;.);2@"&/,>j P*&jASq\gC5I(%˩( 0<Գ[- 4ox"a!!TFlF3,VpAf d;;'Z@&%H>!fw[`+;<Q3Tx\Z` ؘX+YУ˩x W2p8d4H3zТ[4'B`t&0.!mei;0ł˿<@@FV1}Ƹ2D 'q2%SRAMk\XP 0aV9j2'sP]< ,,\[58‚^np [WF' tɢcV|&:M*'-  `[O%[t e=6Gط>rjXFcDSckM7d&,'8YYX])@n+xt"Юڒu>LQLt`'m')ak؅a,=a%.kx4"֙<2Lp 0S  P68j1',,\3ۃ rWM @Q6>S޼H4,G@L|d4=zmG)%==_P@_[cƀKp#;ݦ".2.M7"v#@@,3p .sZK񼩃Yw?1}OiQpa ˀ-6Av"L9*m`2 pI7塢7p2}.,.d&gXP۷Ms_mNW͵Y͵^n 8}^ WFy>ǽ=,:lZ0Z|@m [Kqbb6:^d AװʲNZ^ɳ%M3]t#It@ pXA ț mIpX@&ʟ#{QD٫>GB ݻrK^;@u,aKD؃-7/#7}* _$UIY030ߩěrV-tjӎ(#z4^;==RyBta5_p4^4+T;|x*^P_ҥbpyM^%q<&2“d[ɳg@Ypm^՜*^ ^ ` Iڮ7_q#/?rS$ LM!$Alݻ1*`p+=. ='= = >L "=PN.DDDEt8YX A`R5O3(3\##n%%YJ( n- 1?WfF 0RgE0`F4 d?C-ş2TRTQ-2ㄣsbIlH &'@2" +D ?%T,> 8 J dJgjczQTw( uBD*Uq1I*tQF8?`-u%(+YSN+{+_YAp`ʁ'J PIgnQ?ia :n A(֔cEdA fBd)+D > (*'J4 $l  GS vj+BEwE4a!Wa-XcV g[lS)r? 0sEH YcG(Dgq!jqD(bc$"5!5Rn[6PI3ٶ[KMHoA@ @ ވ.-*G`1C23\)p0B51\7H\ 8pa@ !*aA 4 3Rڏa[Xv! '$MÌF֊ FNa$%K0g><@hqTR4ے˳DA3q15V\G$p#0}M: _P"C1A8HX[X-jmcEQ G <((Qdd SXD "l R'KBK@Q4g+L"Ҋ5İW(?iպ- w F"p{r[硨"EêJ8?cD0Ÿ軀 xͨ UbB򈏨EL̓0R+It(DvR2`P&#pu(FUWTk ^b00DS.|VbL1Ps< eRWq3 QvP`@@ P9A0T)L%0gü^#'EZ \w?'>hAFh Ed$0[Md$rH6 Ht"Š`@H@'E %zY O(pW)ƻT>6$yP y*"Z#x?KA<-"5JD4I0x RxvS@ T&bv7JjNDe,YP.$+-E b.|]"3XOly p=/H@Z ?f>3 !-]H(LJ&YGAU@8[ZKP-(H$!mIAEH{хt trb"D a*I%8ŊDf)E!={?p\p>aIB8l]s{%UHGt^s0"`"RLLLE+w`|"o 3?|(FwQ7DyT>p1du, #mV2.&TwI$-DI 0Lqyuc+-l(PMFapeF20] P#s; Bm]0Uw_8~PI8146cbGRX-63Iu3%IJ5iFpJ%&]@  UxD-X5 ].tMvoQ'0E'S sGXI*@`['6t%8BWHsmu!pGJx|HB8I}5!C%dń10}զdwhyy-c xa 3&S&fC`Q?ZZ Qkz/j>20gA#mp)4`H2^(z$P! ȂL0!"UP6ׂ3&32T `%. +¡^~Tp N@2BSrv00LMDB3_0^ěӐ:Z#p7!qQy' `04 j;|<0"v`㩐VLw2g5$Rp >*Pu-`Fl$>D'3g |GV@+wP_l}3*4vy0y'Ѝ9DjÛ"6h?w(7ٰM u"N8 %PY;: R"Ppw88WCGitM!t!4m)yOS-Jfo 6bg<|r i1{ j *Hla*G0q,okx :`r[ cM!}I]ʸ#pF 3N\> HP1dz21_PN:!&({wEIlPRnt ]Z4a#kZ`Vh'L0$>Pͧ `%'i?-+xq@ }_y2g' kU6x7|eUYy|\#V>KP{HS`~9tĤ7~p P0>0P>E5/ F&$&<;&Vuʉ;>mg{B4!p_жl-۲& kq9U~ L5-``h!pBWf NPI(e-PQ:tP5ՙ+ Ӷݛ4ĄB( 'G 9Iv7P7@Dd̘WK %mмm HR 07{O%HsWpp@{̚ m59<<+/t_tQp:p%*R@.Mc4tKʜHL 'p2'CA1  ]a)aQ7{8%@O qH/&7u@Xm?p]H@@3IPp_FնS:Ջo`N+v(ڂ2jvW,4p70 a#}c-Ѵ \),݋˶zcW '5lJ7}@iAu2P/W\*(̫޹ `U\\"_NGS_+sg`G"BjrZI'j,0Mׄ=߹>R 6k-j8&k L&F1p N GeW@a@@P*ՈZM|Y鉔Ww_@T45Іu`%B#ųpذI}؇fJ+pGPP!!nk,Q}M]Ւ~ Lj~zQ9 RpAtVKC>ЊrapKD3P08Q QQc;gqr [Lpm&JjdnxdF!b~E:!7Rּ1"ƉW|ṓNGVmծ'p=|H+m^#(PRn *5 "FoZPQ䩹sQ`<pgofxѣ4ܡ-RE_q.(5f6uF$Viqwdg|1 IMaS pm8yi9wޅC/ap_Sg!VC #g0_ m SygnI׏lޯ1Jٔp؃Mlc_Fu0FyVQlĸ QG讲;pu!*.f$.tǽOGpzSA((/$Ow/5#_C¡)O]_ap`r!yg65`y= Qd,,,~y~_!.Dz+'53 3%5%( n\ a# -2-y NP@"o".*+REA[P _߇lTT~~f $D`4)$=*dر"@}1S nHpC?0P X"!?B8BGD9 Mfj+&FUZ5`\B\ aJ0o6lb#NL3`9SF]e\R BQ?A'IhJ#ᑈO8Q[ĿF!40PS \q@Ȑ2_Ң4|dϭZxd! Q-5q#[U( %P1O?ZFF|L d@UT\8*\Da DOC>,ӔBtű A?@-'`HhAo>Ո irD%]FE΁rSpӓ>W6a&P!@š(I#(ϽBm50@ B# =a+7>IahRDa0.-Mχظ&uVcA3dA0% YTٚ>DLwY KwMaד cC ((n#  EA$3IZpni6x@N &fd`Vv8qnT J#z m`G\HpTHkz`- jGp( ! [B0 tP'7~{JpqN\!H'=a\:Ї|A ;~6aUH-#C"9X#B&AR $ 0L q(`7B?"ƣ\ȘPV#<@6ZC(!v-h1j>pMx[ >6!LgԥDQ'몏Af  x& DZAXG/TV "Ք2MaBkFb@cgHN4Qaը5j$(H "Ջ"B&׊N3g2veG?)hS,K180ң y}H3!]T- xZ7OvN>&0"@ G: a_y 0F2<6,,.?`HA"Y1X&Mbf#Vp4q D;&dg3Z c ܉z?+_A -Ȅ"F6FgOX9b0ӈ86 l)}ȖDA ̕KǒG=<GSj&)HAXF N1FX hPh Mhv>e r[':|1/v0!FH6Bq΄&j@,wSa.z|6hi٬7%`4a @!( 3R3ZN]dQP֍ǷD#}NhBJ*bF 4u>5 O).0p*PD8}EKxJ gާ|a Cxw!vl42a!i 6]ÀMLK΅#[<] S`c%M `Eڔ\&R';@9s;lU{@_d!Ega- `u0tGkFh|] 6| X3:|#(kD}KTjao!"b3> 3LPx4u[2Tj,`KX: Ѐh+RQHh! hf揙066) )AQ-0JHvPTvv #0p Tg0iafY LL\`8#}U U8^(ST y Y:kj/AVt S($>301u&P/8HVmCPS p%6@69J}%T"ia_Fu8dp֐Bň !a @T<‘Ĵw[¤kU>Ӕǥy|y0 [[ 2w[&kW@7% @9iMf?D/,H, E0ɇ\ P$f6k[dDKlCJ 35~Py(=M{62sj,`S o Y AZ(sjR 0^1t %AfVHC(@|p|v PuiP5ig709uih @!R+ FCW(@s,1%qG#5T,J$4WP4%#2*`Yyd@270(1c5dP1&|ȝx|k0vO7(4(7QvE ૖3:jIooǦMLR8\ԩA pf|/HH?cES4wn C5 7K0)"!+[m }h`gZ B`B @ `@dj@qPTB#$ꍟY :2FX-aYe@F"nrf@mBJH"}K`HuPuJCphPv!Djǥ K)<5NJD=M0?B a,#*[1q j\:LWH<6Q 5{`_$a{Zq(`8i,fIc]yCv0y(* vC/DVB,62 N#gHG#kl|0OۮZRp SQyed)+W>ڶW]`c0)v k0[Yhh:LP;98f.7ٹ-wkCF10,6L?EDTD(+y B ,HXK!&o3gm@J'|`k?KS\"09hv}e(;Lvae{8`)w"  :c#bKm3Zڤ&07x[K! h;V׍xw ռTp-`М2Æ2٩Wpkgۆ}J]t9?(Y _t!=RMuj *Bii[T8 kf@ <% *ĮAUsU<R0 ]B B !(628p&slE"Ѽ;?f<=ufC*LK0knih̫޷W>$ ~ 0@>?ӭЭeq#}0cF6=UM9qr w.#0˃m70"1k \#pjK-sI|֫6 _6`WcC JMl>yg#6R*$DFzyDj80oz9rpsk < X00]4uVj"1^R\a-o˂;M@ߛ:#PC``C;Dvӻԫ ~=ݾ/=!-D !%@絝ǰ>0.C$OW1p|ԩ9#˶< }\CmC<w [R"I簥{]4`$1$[ lJJ2L2+0rWU&_/^@15jhR$WNFxRԑ@'IjQ?m5 E' E*" X!(*S2[](@a`hQe.hc$&=~m!!JL@C?9qhcL9J<[GF'azre^IR-R*LSs#u{ِG0E;AEթa ⊢C&Ia#œ5P0`mZ 0^ !O @'crL8b~%I ?X"}g K '%E 7N:emMjS"#Pl BR=, SlqN,"pт"İ"KLQu)QvQ5OBn^&EBuXAc8BR !LJ,$uOi_lrUTT",@-dUQ5GTpB=(P# @B nC TpC OP3lwVxaJOT Ewm]]lTu`~%un$-Ih4g"蠟j(zS2J3m2B7E׸aPP0lsCB$Tw(Gwgq!=vE\E`)upF`!< )2R#zVtHP_N(=ģ3B*i?ͱU)쉧ȅz Ln ToGE*Pq 2DO"pAؓyX$8AuUC9S[r:eU$+!zv͠Hߎ]#ayaTnj9j"sזAP/"O4/!Gfl9l R  J^/!U'L3ғ#Ԍ\MƠKqm ;+#?)"[ IaJ1*xy+|lH\H:-$:]y̗058emI-l^c L)qJ^:kNQ"0@2SdA(Ͷo= jDKH@xPax,^"w::BB҂9y}\iDG΄u'3ő f҆7ԡ{Gu4=0MӜ'`!z#y@'u1A|I?h@b^2y;! eX9͆d4̢szT'@ ]tp][/_wB|@rwj[#jQ7 4ygL5XR- o]Ns~y 50*0me 3BMr< =ֳh0 0`y0iH ݀Ap}1\AL&d@7LdE!V^VX%oqT |2 Fy@ qY4p9PvX=U%7( .Zt*_rhFQ`XW%_`!&b42$&Qw;GtW*!]D Y kS^R|7{6=N= wHTٔ uYʼnb':x6L0}7}'q&v;"4֕gLxdd]L~(iGcQu"NKhIYS `>@ p#( u 0u1bkua,ɒp-xP6gf$Ip1 @ ђ%( A>0 6rh/Y| dgCÕّ!,Z! Z Z ZF? _ ~+SD+D+DD+˃zVx;VhV H2F?%Ÿ-RC 7#A^1@ؑڠk"S XH%!i`C(xE'H\* V beKƫ2 Wd)0,ٳcpmdI4۶|InIb٬IH 4AY >$Fg 9 `VvzaQu\؂ Б6]jItdH{sNx(BHT[l!LuȲ2p9 9!B ^?? a kvp&\K+06"rDOX@ {J)XFNb 5$f(x,j5LzUzNў{N6_kM`%Wm 4`R]Dӓ1Nq:Y;<?–A Bʀ7HUfBw}@h$4K$[16LRbF e,9&H H"F)(J{,G!Z _y\&ѳ!W(HhfЧcO@U2bЀ犄L4j PTM$EErGBۀה95W1 LR^uF@B9Lf*"B^0( G@qiߏ& +Smt,ELFݥ4B4 ubtknrK@ĨL2WA *!EYx'z^z<р,\Wytxn `3I I͸褑7JrmVYRq̄\dCp?ta:SER4IaDh tWXed7v'=*B\bf+Rzs !!aG'lt%%Yd> 8N0!lR7aCh5[B3D'+2B`]AL qDhz0AB8dDeX$I d$5pxRSG^-i܅/[)h@ bп%q#Do%+?~C6% VH XG#D`T.AOqc}?S?yw(?$u")L T=m.| aw `U-%+a:;q| >` < A4fuuNPR{҂ %eIeGU0#]^:u]]Pkq'vGAwP&b9RRap'mDycm(%s>Yufu`BUy5 *[Jfd2FLV #3`P ;9;V{=B'U2dH P,]vTSU|vj@d6Nk0&vww%USpimKp10Hyb#EabdY~:!av!";uԈG?+\CB?`8z"1I4]SpHx=SШp {BV&|f=qqɷ ϧpRcIF; 45QT`pa(v~>8R7?7gt6. 99 tH6ne#; Qk[p[VHfąb! HLTPCԲI0x0Ӆ1vwxq(q@&X|1|gh^x`Q70Kx$u񗃟5gmayM;AS(% bғ7YwH" ;R5pdW/tp u^8<) B|T?)rXe|%e<N4RPwfw R+EgF# _dzfֆ`gQ @FRJiˇ օ:i`GNe 0.`IIt4?Fw!h`]{N-yI5 p^G$VR-pgE`bt~`D~a FKfJ لvtnBAsyL@|7#)~Tc+ppQ]]eq=9@d 7^1ֵ0jSr9vEi0@iKY4 e/Fuk2Sxz$72Zg-*" 54`H35:0]p7dy䘟>?%8U7S-VdE6T( Eg7@:7dig P Q! !SG[5`i)Z 8](H  1ZR CX.iH {Idd W>k|1*eB:`:JaxUԏ7.'(5PPڛl f -03(NnVUSHi(  20 ь;t/]8=B45hjjmW) {w^橢%yJ'3P5O[(pQJY7m` auTuH=[SH-XWW!0 w@I.)S0C*$.'"{A֥km7YNڇJyZ@Y(B(_:0J0p(d`fvpa-;F; Ub*qe'b e٨E I+Px7TcBNf{j!AP}fҐ*QszRh꠳) tukÂJ$71.I!&;cS=% *? ů = [6yQ-2elGp0:HIкPP;IfwiLu]|ฆIvPFiurZ yipK-EX4{)7YPJ#pZ7 Fx@@c<ă$dV10HUGDYI8 JG ϸu0' F-HB>Ir* z^PQۇWkn5M7F PpdEH`7586̱mOPyɩf15.Pa tH&ODJ7Nd 5 kfX\ jc5<"HХ(SIp)ffl񤷖K΂@u@e~d@=b$'e9S@+wpEcՂn%)Mɂp/fd)SV׃ˁ2-CGp+ ev 9CnhH%H)b}h@TtL^ɗ^|E  %<0u$=$@gZSI`L(0+r8m/Em`@4/MŒ{*!BN7>6 Q#;dHnSMMԴ$h @Z>ktޔ RuxQc\6qQy#nK r]%%`;9׋\r-Wp05*Sp&qtUx 9Mк5eNPB]=0[ <]olhcPM3VN$V M.IZ%>q DA/> x-d8-㝌53j- ]6rRN$o&V*ר+"eH)]]`@$HeWU!YPt@Sp3O`s{8,α*}/n 邀e, Oƍ2ȱ %7$RFJ)QG4JY'ebTa ZlɂuB]~{`+Yg0TS&-iWJ? 8CLB=ćA<|T> 9ԣߠ \8ylA2R%nѐF8b@'KL:F~o"%êVK"x+(8nAJǚذҊc{oܿ?o=]W).3 DV(4HbLfC$ytG&G3d! AH O )N0 4 [ ̀6&UЅ0xטQPW<yo[*hQEdb6a)D0H Q(>1N  `-#p Ԑ +B Gɔ1/ x Q@Õ5 Gtɍ %q E )0y .wB`a "b!IRA R8L(A84`3JE 8`#O㌖pQe,4e,G#mh{Yc%^"ĸmB`&B:e_"8_M={H:W:1B adG+Юk)VhǠrp8T(##0H 0\nqVRsɚڽݴ̀E5Ǥ% yRMHzdeu=*1|穫  I_);EL 7z+Hj7}R8KO>thj ?` eWfVa0 Ma9Cv0%k]',00+\ %Ct$3;4Ӄ$QocK $&}@az"EpA$+*MEC @H %A8U-pFh&pl7hrXt$@)e,dF՝":4$v.2# <9uU kS01Q>"Ĝ| sB18%a"X(A8(A`o~c#HhBتt>rn`?F@,C?|2 $!@1`P pyC)A=#'I^lpM}0Igs 39AR-͞hR~"@ :J:?*,A B0?\ 0 B;-@*vKҨE-]4(6Q 4x.uAq&!Խm- b=`#9I I0zb`ƣnlcH b(ɋ|" p ( P 8YKtn c-h&]2RK\T(#lx@x`i%\Jk~'R 'p(.L9Ab Io|^]bI4ߨXky,M&&p\6sj( A$-@J_$t2X9-jIzd̀*(ܭ|zC!3() ~€pkVANU=:KBTq NV"Q`1z϶C=DJM ؾ X1pb2*nF`* )RFj;#Ȁve;R*U;@$+Y?$Aސ7TqoaZ@ D:m hC/1 Qe(SBg CWC`'F <#6ȧSp̠U#*x@B7,@h; dL PQpb FX@ i]oS aiE1HnѣBPՔ W` @a  &c,҄#;h UֵpLѫE6W'P d/V(< HγV  6X͡~|-%2c-mBM=zWѶb$Dv^;٣ҘƐXĪ&D  bA Y@;r N Ppa A1TPzPU(7[&Rt$%^`uqsB01Xȷ|{S>FT kiPTY 07lT=(Wj I@[WPndF!1f2Gyy/y$V0 P+-0-0H,DfHhR!W^V- 7W V U[f@hnbהwP c@6'pD &xC WOKt}plc`@7]eP7]yFA!W4E @*Q0+ !#p.2Gf 5@R{C|Ppe|vz#gr ;%&g7p & ao%7,^őpclpW`TU]D]`z;G\jU t*UP-Pap62NAUP >c36 Pe֒2Xm8,d oE91'00Y  0pc= efwHOIhP@Pzd<]eGcf7'`#OUaP* ( V0cw> m/qI CB @яXKoUu7uO`s`Zsz``<"nZIE`b,WFlPjuy`SXzS[W0H07#c)&cވ:# @ӣ2Q0"(#e`Ck\YB@6pb{` 0yXx0HmNg 7L{YR!# }Nv7Ə,jYRl}HOyeGPh0c# !pa5v+zrz6sz&THq5†Oc2 gN@M`1>**JJ:4ЩS XNЁ>P&rSpK7PI/of K7IP[l  }~(( bIz}hgT %cgrTT@vjZ]Ćg#(]`0+* <\8.<<$%ù{-ʠ ۖPm<[4S`;GwBc6a|/MZy/Z@O@`z-q jV5P>tkA а#=CjTEp :ArK :jVlH_CIZOs8!Ph-P:W60"/vé{`Yr |*A2>`ǁG@pMa|ӃF x⊗QT+;;7!p5JB (:k0y`' <r䠃, Kǖ3 vj,PUEf4K 30\ɕѶ@ɪ0 !p!pZ1ClQI4uC`[7l1=P;[DXX6G%%m=P MT?1r#Py*s+ċ 4@@ZKI4$D/?7H x(%eLu{_аw3H@@Eo:&}{sZCf'BS~l@l1۹)H1Z Fm`~ lB~+[~@P@ <#@$3v2L@YVF@x XVQ|@6& ~4Ju{NLvQ(^ PR{W=fDC[!! B|b +0qZugi ,`&IRԞdܛчΘ~T0JI 6J d4LlOA- xi2ugf;|e9@[4 u ,~X P LG=qZ jzG[@07?#AwpCUF?{tY<<~ M&H\ cEViH(6dKl!TfSIWP.Xznf4+Y=аm2*5uPywNn 6|p 77a%`a0p`B};l~4qN@dt#n۶&5L <`pճ)zE0ϵ*ZJ`5)dQQ( BYs [pˠ8_HdMĀ (* {lC pY R I QiL+V*K4qf3Ni[|5-KrmĹ c `~#DyڰXI+7r0ń jm] 3'Ԩ; \7=PUKS0EP<SIX=;Q#`RYP(1 C APAUQt@VEr16F\`LrM5j-3\utIgʀM{0QbN LX|S=U^NPRI0I ?Xxq!gpWc09q^0 9 ?"70HU eL޺p8'"z5~u/Y\a\>vK:7jOC sC}2-ڔE0,?Zi0Z, ,7b6-}+`?dr?!(K?v$z 0QUMSW0]Fp@겳 3%΋F T__ -QQUII`" "P"iull}l!ZIP-ZU ! Z`zzDSgX%33  3%(nnqcN-.\J?(@A Q dC""  d鋡E4 U *T`&D ': "F8a?I*^"0T~{?!(Ps·0hq*nR8#A `΀4W܉5J|^y\ e#@! WhShĸeP D .\)G&}G'Ubx>@S(`BsO?1xiÔNh0R/",X^N[ jYUT2P@A ǬU zqGgL><0O A<HvP-qe!R-sF*"zdHն!#HrL0wIT@W%%TG~aF@4wN| I)F=`'H Q}hdGT|G1njLB }C>W3- (B1N8TO4Aa3%ȈIV`-h!R " >I DP$\$.riBc4eGť҃P$eTNњ85%%Rc(T,>BQ M4-4S08!Pj;@< J"\pn''q "PoBk+GH65"%*9eWPHrS4d`Fjp1*'CIxB\Ugujv |Q"u _7X_0gPۇga^fg 0cP/ w%Wˑb'Qr5bQ 0  c~7F.`>>>f?v S`Zpz%! #Xj`~S7Vn5+5|2|6"o^7GX]p}c'p2@KuRU}p 'UA"PqWciFG=R8yy%cr_y7EN\ڡ:=pzH Lw h\V{&{G6_1yPm18f1S\">gqvU6@ 6I$g~p J0TwT 2LjK$eLkOj]B NͳFGks3甫UЈjf%G`t aPYbQ%Rtvsu5}t9n)`OMH;l"tk0fLhFU\!!|ai 4y B GRY3 p GQdzkHG L: beYIH0K7 p OCSgfBD;"mg>n vKP! 6n9P%h0AQ' Bc$v ?ܵ7 r\Brr 4R?6udu ԔZ5u e@@W)dE_2nW i YC!:*+X1I֗C93 P-)`J4% Z )  @rD#q:wbHC phr|# .bgs6 j>#y಑xU :gHdhY(@T[ t7CPY3T;n%᷐n_`}v@gu)@"} 7)kw%\hxa$[55vtUzB@%!%H RP``7#0X B-Ku!EX`k0ip3YHJUj]0\c1wLዤZ Dڦ8/ TM'\č$G6`ҍd <0 ( (2`~@9yVK kk@JB*_(–B_ٱ6pJ(g70]PaK@zTwUϴ%SŅ c2#C]ZMH\6*[%qU D!J%j0P9p+)tM;K@g]PuJCБJ}v0P`[XU41qa[1Q_; `@FQHf@"І??PU[>cGWԧUbk ڎb{*P`y`pv0#t[Q]}=ѽcu0)kP]pq`$9ww+` bGL9 'bqxP+y`G_Rwb([K & ȗ^ r(>cXC`3Aʽvs]@ k(tVI U01g41Ǖy =@:I 83a76 846,pw$c8+ 58^ȍt@0Qۣov CU0 0J\< KzgT*!p!B@i=0 cc0e>C '>`7ewyαwTS ͔5UȻ100BĀΡ `Ql"A86ŖscŇV|a&阺ř;UԬ"&IpFpZjrac-EtTk& h ㌩qAmYpk8*2;T""8UkuPWM!pN5aKbt7~q%"J/s!6f xbMrG|]?0VrɡM ؊;`hx'o%[5Q(}̰#Ԑ50|n?_)0K0cU}ּA,p=~Pqݡ/T2U8MHO&=8w].ލWa$!=ƄN  x0 x <$,Y;:0& 613ZYBW^,3CA=\B,F/~֘:%Ǝ{.5Ko G:@MCv ?bQ@RHJ/[&&a a姢, p .{)}.y[ZRse /\|ޘ/O 2 pHzB1nLH F/BUҵkXIoo} ҝP}}_l 11i# 3##-7u u_]JJk]}v69vv9_//}Ť_}]ull㳢 @ @ ooL{\㏄L(! Wl 7XCY~|V ؠ_DIƀ? fĠ%L#¤pS %UX#+,%9lF [e/LVFj1hUV8,k:ȑxછ@(7 :~LyY&>? ?\3*P)H } Yyc(f~@1L#v=Sv֤\4$uZ?}v%.e^%|taf)kۍ̝u;Xbs pG~wޟeB!\M+#/ڍ%=t%48l]MQ7Z|TZZީs^seTN,&8-Ee9b!M(QpӝuqCqGCZj5Z0LIj3kHpzKW^bLW9* UiYou9R9]Nf iZ0! R@'@57IO$I^`Џk]@ۋ0`Dn)|n(؜Su #pZ τl,,=t,s):Lg:4bTߢm\o+~ă#y$ ue=0+.# `tw& _+Fg<(k|` B' ~c8ƋB=-ЀKKb5H`a%6]+vW!xgE!-y3|S3~,|N/m-IT0i#BkQ`!|Bu %G]#A$~|~Rsn{LOE@$gDN3Rswctat j  wnkp.C~TVgCCIM7r u6"' 32K>rEWk wcw5>&cP|ŐU%V=VxF&/s0?'&Po>F$-T,3 G#]7UFk0;xcVuneal - qg]r'gI$c|e#o^/_ZWiށL@syadnaXe4%Co@P = ~k(<8RS>öSHhAga_Q123cm>TD&83qipsLC2LG+&sA2;wotd?F7!8"VK0 kpzw1Ffqe3gt ){$gQT1cf11s k~`ﰊc2=h^+dq dpbN+2E,Afr_Qq)(b (RÈz#V6 c[1A1Ct.dD823,-_daLoQs6Sb$.w! '0&@6+Uѐ @p~77pQ3$] HC 0gjT%wOJNw.y*p#Xmq>Vs̔\]+\Tyws1+I8A T nm' _zrlf zs uqIjGe3pu`" I@1j$I?0!90&kB ɏ&: ,:l}!,__W !!ZZZ;?F?WQR[VM4nŏ*fݻq?q20AAԊAz*If  Ȉ3, H3(ޢz8 G`d?* ˗ڜ'‚GcpuLP ,Gf NGHD*\Qԧ+a}I$>!VT/bP_?0EIAְ_#;KY`D0eM ^tHuHJ I(u'a qHAv-!$qiOЀDY,$`s"@lيȟ+ 7Gt!=v i[!ViC S݃@*tgE5UyꁏdeRf1y @ZuEd5!5%'yvcVYRn 7@li?,!K@lӎRܩ;v%TTޕVN<`F8 2㌯0ߜ+/ ȫ bBpA --$DOC ?!C r S!Ee˞O!#e)\ P H6lAk ,k0`٫AN 2,{ - #b_paġ5F橧%8>'ȵ 142:- XcBA+pu!R/7}μ  { Kc0C w\ ㈴#v b5Bh*X  . _<$s矬. jqt W"p6T Fb9 Z]< -7XR! HYa/ $oN_"B f63 &fnX_"9}Q02j& zsO0+u]0$`i-L/ TF-{@TB(j4B9lJ)،SIr~%+1Q*Ѐ{IlA  @b6Z@@:p&4IM$Hz:B $`XtqQ ?DAgT Q &( Rb' Ae D|,q3#7!h:VrO^BP qA47i2A-Vg8 0 [9ucG h Ɛ~BAFY!eܦ-1{Art&-j*\~B Cb.y^ KҦ%f@:۵AgmЂ(Td B 3R40A|Y[a!( g>FH_jZQXBϱS6KEԘ81s1. (>4 ccU'P a cdH?v &3m,Ў%E{cP~u󤉐V&,``)}8X`zib-[p VWxaȝT*Bta K(y5_uj ` b þ 1?c4VRFtGBfx(_}qHV4b:BdPC/_  "-ϛF=C Al# (%!c7 DA= h ׏VE5lFpiSc8oyOj6\( m d'`9{R?\܁u\BlA.!ˎDxA`&"ADc c"{5`VڊtJup 2[L2Ÿ}(k1x6! pj;. }ȥzl'l\J?AMYh Jyh]&㘢 ^`;:!ܾ.?nFx!^'7| ?sַpCr{PaZ Xkr1+wcy @ PW7%nSMJ7JLo:1BYWat'e8?Z ?:"=?'S _ {e@ec[ NmDRmKG}$#pPBjCg#$UVO,7O?7VV%ز R5(Uch/G VxRS'9B#GCK05Sj kheG|{eH`'LBT'Qv}U{i`P1lSG6ZrU]7@~mB$3W*<iF3C!!%?'$AR':"+''prWG juvXW ?Z$=@Vc`f;w5i#;a`a0t468BagB>xD(@% 4$[[+"VAHL:e?3Rp8*3?X3u{ 'vh:^@e_xhB`:+R1Fwa3T-)X12XB#$a | eBOt k BPs U8(WC'E'! =P:EXY9?^djhmK9 t[dFv`Fwp`(F^m~`~OhJR'82 ]pcw]wi[1Kq:UYsB#?4#>vSE`gׄtؐIV%@QiaFg\E6pG5P% `3r]gq=Yb+sP=0IN02(ax[єf p|2bzR'D>IB4Kpi2:>@q@B@&X7``,%$g0%POYJ0-UOh 0~ >DEZnpiNp dӹ49 sCdj8qeh@Yf>Go^xYp=y8xBVΈ,TP6Ez3ua}t}tNh4\c\dsA B2G3 pQdꔥQM`9K/>4= 0;#j;@M  Kć; k4jha=4T:wӈ,V#F8]Z\):[79~OW*"JIP!N5yΥt-2NptPU)P4*?")0V3"h9nd :Y,Ygu%pfk}ȲZkE]80O0(18 V @/(BCHAa8D䅀wsيTV/:A0t\4O 0I=}-POE1opP|#io~T酐4;ROo  <4'q`  ߻ >ȳ]]{HZ\ՄڄJʎnpΞἍArrEd7kA56T?/t#39-{L$mzC#}8 <8w+RcN o4> @g8PG 3z@ڸ}n?c[۱ %0 1cLWXq;c>8 B"=G*+RS= ' .I Z 'eb"P+ +D+4X853Rg58%%O55%% n\#-a#n(J%(33 n F??I1ȟ EaPRGEBhCd`b~ !"I?.  (VIN@)$:I"`ß219* 2 *~RU-"Ʋ̣q&Ɂ,O> `-: p Z(f(蝃-.I$HYF  Ba冃ΔQ!DLȠ$KYfiI0d IatApqꕘ2 *񇇯\EVr K'j`c}%<0C_npт*5eB"TFQ RFzE-"B*l" DN@! A` =pHr W%IaUԐrkXBe&S#0}%t`2g̀4 U|׼e@ tu1pA $# n1 "BTe"hPa+fjl*IEV4Udtb F\.Fe!֡dX1[Uq˗Yt|0Y % 5o0\711E[ ރ(cr@x uhDaaC q S \: J PfR#к+U .y ZtǁUkP"l0.b攀PQ00ua5F "0h*~BFKAe%N8mT`FB u74[!,L7Pqe;9#z (ybNutGG $Gщ"g;d&Dҝ*txBJk#jYF6ڂ`{P=%  H@0Aac3d1?PɌ 4éP!$V<^DA,X %'9! 2&6ƸmXP׷ȶIh<{ xS 9ME-f+aI ؂d$L (Tz׌]4@ș$`g_$@ _؅O+@;6D( 07wX梥fWJgI @ِ)=c6 y,-4 p߀OŀR >$&2x4R t ǎ%n:n^"?Y!Gd bL䭒MPH/!83d-m&j `НĜE`.nXPG1|D>wB'!u'q p)4Efh Pnk:C 'H o`Bm̈́ 0`ipv .0+ `c!|CfK07amGf U_LD2lmZP: DSg~ZQ\ 9aor TS0'7F²!6?CP{UY}w fئ]:N"rpk߅V% ;PPy zDW`.qKnx:_0}a{uVTRRJRp&DK$ |!|s'V%"&m` \s"s74w 6gxq05 u 0.`qUBA + :pf_f7u`ma6?Dx9 l@u ^%66‰g<|69'o04 \doUp3G` mp p>p+7" \Wf~WWW_G 0kR(O~r-r+ S2i<Kg\sxAN8s:lPV_ I`;YR|'|ϷGF(ljp ;4P H0]}v4#n1vqXa@ +3`HqA,gy 1V_gTcNH2dpd9,YA)2ҰDZ.-'  g2c4P(`~p"~]~Pavi@PRpшP#iU|s `9 I!2Qdm<3יlpz P@#.8fZЏ0d E@Sg2ZpS݀= r{5 s| P 7 D #0gUjV1 D@! LN1wؘXX'=Pq+S>' }fCUnD5f" * ymЩY@6(~A/ ID~[Q(L@]|rD`:lFBv>`0t~4jwfc@`]@>  JQ,G9)P_3 0$ITvDUu0:[:2Wj8+G0",yx3=` @Nfd/`6O@'.& Wfk7ё*+1xGDu{sj * *qI`@@X$ L}$7up J+>s/2x&jlD@%|y \g6+$L B%tr4p\^(k)(FgjJm~W,!FN a@s r/!.6'wU;Kpw$:ZHm@:wY~TW6 Lw1L"'uq' [{v3 "u~;j !< Z7]PH/+I:+!@J,]#clcpuf0ܪ+gۭ$=xzy.X=Ez=p0#)IN$H2> m=xV(2~g`~m jzU9L@RH4c Z Qۍ5|i0C-Lz0=F++ʛ"~e> 2T8Y@ZCfP=E'^a  %S](G{zrV8X¡#XAT_x1JIUɗڪl~;+s-sI݊c*ĵ1 Y|J<˒09(p':J=3ĸU#F`T[0] {% nt6t~w <kU֓2ձ䤄 [Eb5Z`rs󪨭;Ϟܼc>м"eY{lyVzuDYJp;ȔnpTe71UgcFᖷx jӪ'weaUP֒8T `PXXrUv`x~϶ , ܳ6DնYsvHӒ  0 =(m1W`'TTP>P<мp١As7x87-r+ ~yU0P`Cj3V}P9FX3xNFm=[g_a =DgRFp|Ip݀ DxwE|R9z)hkr;rꊡ151{e@&ǬW)<~Ӻ\n`H}x  @IxQKq@TO 1,Á;ܶW:{rASїZ+yR3B25ac shVX嗹mv\FC5?GfB ,O+ڵ &+V}~T>[`ĩe`~inj% v&=`) |0q>dW-md0bQzr\`~P>]e΃`ms]0++%rtʒ5oՎO<}JAۭ[XPQ1ZBy-SC\|L-pi&%+=յ+aQTz!j3mV{w*Y zf3 Ec"HI^ ݼ >=.*>22"EA[Q__`#E!y7A"*xJ䨂?q礇G'=B]Att`;*&jR%T~BARSUD\2*OP!Bag -.p$NN*#M s׃CG%A#O~!&\C*_AcZp2% `0sIxW$`0QXJXjҥE;QaBUJ9#R6H9S@{Tƌ3aˀفc Mq9yQ7#IE hUzE"ms1PZ)??\A "DI Л"A`"`ĩC R&ETPޝi&%N}Gmp{Dq@ w.s1-3 tBL!08lU'H-%3P``Duٍ4cꐬ\a# ÃH!d3E*"WWI~F`Ա"46f9 ~dBT۩Q~ȉ*viF(w  P @0"lE-8rH kL+3o===Q@B#t"Pk=Rkx@ej$S%e&4qlsy&޽)o%Pg@F 7X}+ZF Pv)`_x#*C#d'O(Ź"f<;G")1;yA"6VE^+"HiI .%]~vOItx3_q<sD^@xA,0Heq!lJq"ӑEȊQW3kR49j\#1VLd5 0)bVp8 "tʄ' ]Pȗ6P+oS}/znc\p $wԍq-}!)DC&89!z=AA NR*";(qdh8B̑Vycm* `$(y d`-sAC_a-!dž-nSxC'\ PD%P 1 OQ1~|;I)^ #tD@hXUfD-`!~‡Ӏ<2&J > ,#^)e@-@ [p;ЀwL'08yz *OŌ g&?1 @ yX CQs$BIZ(zd&S;!QZOBӧR ;thɣYDZRmWH?Mp@ϫ&f}wBL!7`tЪTN|8]L@d s;y\rSE,FCRW @">rwlomDvM7鈢XF*Xěz c;q("[hD<5$,(M%Ml`b0"@ 5A7\HqL: a #V*8xd!E V8¾@z@xp$#W&` xap *E”GhG+JY@ $@ teq4]%@m 9.A _ɍW+C jVGTg>sޑYf5h^Q@Wr:RJh%) }!m,7R1@wf| oL{ӚU<:XiyBUk\q10n8fpARcNVL8` nd1rN9*. ;ޠG{fVL}DBDͶ\Q}N> RЩhX8i@MQ&5ML5ic:WJvvM}OA9H< @]y46>+dUAA3uMTJ: $dw+%! M'P9 a7b?L#.l/jb}w5wdUP7\0(f!3@jr  /f`xkP T]T9S]B`*@^'4y%$LG#Ԁf3E!Xbw+A#,RVD2Kt{9{@0h`| Vdp }|l7p_7`1&c~7?8fEhO p7b9kP(`XvP)k8@JGYx#j%!$P(2W!R!Q%>3Ca;ڦ+@c1UEwl`A0`, *#f2vpwXM7wpc0iŀp7# @]Oc0Y#ra5$`0͈AWƧ #" uXhs#qQ " vxX^p37MH ^0n?709c 1fP9+ ZQ|eB!Dwa5_!s>鍡|!`؎8{ԈT.9&'%)1W7wf7UC (v ]px`K04#7R% ~B $Ia6 (?"X:IR0+pzƁd@R @/}&WiP8hi@Y7fdFy7P@]`60J0CrI)@HcVVv y=y-$+=X]l+7#%'+`Hpgڎ{43Q %*b-JТ0N3wi#v90v0 ya;(+XxGU +^0DDFPY;)Yc f`EC Q*`g |J:%`i)&_`d8pez6Z0Cu`v0PZ 8OK@qHz"a:r+SlhC VLB%jS#pnР(2b#L$ꭿ雟1r*q=؃z #p6Ncv1TYhdLD>@r/;ek׶4'̲㠸12H`n&I Q#bp Yy[]`~֙yb)@W3yC׺ulXh# roP1BDFXnۥ85G5ss IaEss{&Hb F 8j|``1 ~&3 cҟ./i *ˡ1Y(ZvXRX @XǶúeȌϑmvYNO?S\X[: LA16| EdرQJ#02ؐ_[O̶,ܽКPr!RarJr2XwmL)$ [V[ԼbcFmom0I0Zo#@e@_tQGa6 >]t\`ğ YIa rÛ19(1F8LR0Q -y (8ʇIb*h"c3TR12܌US[Ȱz"<&U6%0ea4fo^C1tqCJKh4'VN4[%8`-:.Q3UT\y2f @Ri}[,2LqOŔUFqeO`~{,űb6H@ (hga gNb4P{K}TT:[RWH  NS[̧!ŵ|qu$B8< :E,#>Brus$ PrztPv"wuup[WYMf +bKyn5p7~Lpqz}W']7&ԧذ7B} PC u$P9DDh-侖SIDk(d?LTHI25 9s1GV)C`UVq cl[&.ƗhcRl/}C0p{-b#GOCHt P 8?^tH Mx[סVQsxBs)Q3 @AU!xUxn * |a 0hi4҂M@G/0q5g\,H$i"h[ϞƵL8xM5,9Z;7jәFmΙ%I"%Y.Mk~`"BDU!B) PUkI1f*8q=ֶ o>bq_EkQՍ[y6åKERP):DRΆIlPHx2L@U1̑ⷝ* -DmS'J#4QcRTńW"ڵ *6pM`*ƆsЦBv[vzN;\)9@ H'k\*}&Mj_{tB lJEXZ5 UYa ڎѾ̰ 鯂Ŏè8)xEB֑@j IpF,bC)s2~K.sc]kZVA"@$:ݦ1Ùoha10HÌ|!j6R)y6]Иϭi+%gC:#P4(o-:H 9S,n.DhmTP )EF!7Cp[;Fn޵u2M^Vz1<=|%օ]%HJ9&@%2uhˋo{;@kFmܥq7<&X0Vo-Vi mƊ"~bGZ0^"oϓ%).AP(rL v@`RU&\ Y,g!t3(ܮmkT`ESvƄ;u<H9A& 3(cޥMYr-ii(Q_S/'#Mi8w!NS{ϭ1!, !!ZF? WW_!!! !~=.S S ++S܂0Vh  H2F?FU* HsOwhaPy⊩R0U 5IIB0#1)Uʜ'{ yOP8 gh;,X'g FdJc!$RݥTTA^hii}GWY5XbVI*@[G$ e 68U8OA(S@?0[AĶn/D%$``1jл%\XʻH`:v5ݎ?JARX)xYc'@9#q@xL2qA&'>=l *ƉQN &p AhQ?]! 00 aS 3YgIRBiEhH. ` ]B PvaI@SAd-BbA@ԕlZyӊZ0Xq u0Nuj(Z?arY1򺩗D>, I;b( cAX~vwtCGP4mq ;4-miL B/8|(ƞvtXXRgh"m֠.9ּsj |],ۮT1ZcGyhVkG!cZu "w?r6<`w_v'#gX 4" !GN*o؂X(AA8#Yu0,ߌc] a(@sa 1DOb5tN`m? t& PvT:^cKU=uQ !&vidbvv.xog'vF sG}s.w: y-: ]fwWx\U4]xuPѐ\UZ6l"t fa A (N u <$+{c`T`0X.Ga0b!o/Z+8Y;xc1f 2wo';;^NW1G Q0 7G.;CP~XT\MNe'gD--YXb|-YVvF9)G0M43dlW^l3M1_4*gB /ɘ0 hL4)SF}ةXYJl&ii2|;X}i |wY;Z`?~LFF0M4~ǥiddW]$ZFd] 9SA 0_%DG!Ѐ:stR)|b Q:{SQ9F({ bp*|: '|bY<MDoz\i`F +ǡMU tɅtMP%lz3^;EA1Z q6g3C/*"p !S J{pubR`ꉖ)`JFk$J8 0(FfDhrTFq @^5B1g6y5tFq@NmWdT8e֠NG>Г>O[1b6Uvcg >8vZаfQ0~;Q;#JOP(sqVPWMUeS^/ ,ېa(fo'F9j@bZQi:̷jZBnAG ]ߔ#J5O5P%Pr{apZ{{`k{^;g[ VPK@#X7@#Dڰ{ L ?n 4=io%crUa:hpifcchiM9/8@6<笭@e Rˢ+B/~S.Sb -I0h`* JP;J!9}h`OJ;|wDZ=Y+ kR%Qw`xlxC(P1 Y%0l?\ b8B.u5RP,tC@. J}yw%  DZ1e +GPL@ 1sIjPaAS0Abb 6a P4;~R!WvrT5 O1f]J#@F'et $2Dz7w^*Sy NPQzPz~4S JHTQ8 “a t,mP7\ƳK&x@Ic=9n n)0Of-`zR hk` _b(BƔiw9CL[ҽ%.p.Cn>%>pW !V" ; ^Goh[w<ȃڹ2M!R&}`\RޢXddՂ$켙,g=5`)) 7dн@e%fL0 7-m IKRvXXʌJ/*pXJLQ51ҜI\ >`>%2s  A=TXdh70~My).%5%8`)qDfD܀CSlFLOA1200\tm {]KF5h8TKe?MO^N |JnINoIW"'GN QW7R P .?Kڨm EUUj_ݱ.YP]0n0\0Mp1ZX: A7-}\u'u7tbu*ғ S@b !`mJ\abÿĿؘ ("ޖ+Pt^qJ^3h(@n<<"בCPVU]+f%UOXwK %6 'PCL0. ԅQseI kީ$@e1" ?Kt)@P)79(00´5p4<ö/; 0-eKԱ.&9KDIeނ^[QQK_R|hQY!X q pѲ5+D43=%5O i#(5O)OY5%(3 nnn\ ?1?FP(`Ĉ?0(UXYUğJ(ū+$#ٟW(`Ri` F7l `;!6I7  T8b}IYǟ2WSpNflx0H Lz)Y'1:yKemʛĒ .Bk 0'UAQښ* P| P mc1c &\2s}6@" ]Sd6Dh%/&: R8(,L=c0A(pSpJnX241ALUa0MӐlXa [D.1:b.*8A2x- N[7Zϋg=`#\e"SKWT S܋O7(pa"J!A hc,QL}PΠg(N pXT@z0 r6P5څ[ (t~:طicRPR$C3 }4vkj3ِhaD K&D`*JNR``˖$ .6\!A.HZ`8,iH!yR%5%;AEADCR̍ vm4ѶR |`]HCF41F$aGDh# Ma -IJhc8.'i좀nEvI "I~|ߛ: ЃQ2#\pW͕QY ]}iq-& gS .|M 'A7DJB "e N "SG1N`F>G\u 7H@&uD 0p V; hA;lȲjʓf-A܀XK!=P*8J ¼VHƥB5plxGMlP\髾 !ȊKPP,VɅ/P Vn( zP-kx5s@h=@@ N!yfz(\@=8ςQ%taa4`› x:DJF'nd/40"r1L[ '$9:#*` ZuXvIm7;wEYtɶS]#:bHXĂ4p{29b D.TA(t/A!͆<o a6> QHrQD7P#Tr?A^;yU^! x`2`` ze]6E"@@D3";-s$GRI3J$-%Z&[b]fp0CQ=57`P40};1D ]v^"E)@0sBip3pmx/P0ɰrP]7ZN{8X`e1T zFBE@'BY `;s Mb3RfHZWEWЧK KE&PrKVt U_"Gs\@)7hc[oxeZU!q'!Zpfa4w^l Ep _ zlZ1y 3NrOq{@^R?@BOey0B\86c2j&5QUhhH0Q'͸wwcSpi`*8`TrGA)5f-z88EW*)6h@!@>9f2D]X$< ASIݑ ^H4WeVQ1e|QD0ZBsUB 7f/V@0Iwiw" 6C p*E\DT wt bȈK0}i _^z} Gr#v2VP52e\`(3dTP#;Fm]7G.1g4A ǒv(y YGUiU7F,[p4T LeP1pKPl@l8u0i4WeH1 ey} /H P悻QIg:9+Ap\Z876>#am<|uИ@[r B_%!`."@.a pppMIy"󡈺" 0ANB`YiҙzYW]&1 E(XS0O ꂃ`XLp-pO=)Hfj(sa:)w<A0X p0wFA@ fQ"] JyהV5HY'T;*IĈw`c 0 -DУ86Z%DG&#]afKjL9x)%6+1HZHo NP}"!m0# DIiP:JK-r`aU 8$219[Be05*Lj C010upmU O!0~ r2{c3AAp ax  I:a p."XCYԺ;JjZXYH AR`#a{eb7()fqE *@[P#I1CТ%PP`ka=Q(ݓ"pMř @ 9Rg:˸3# E~pW3١n X,` P psPPC9ig ya еU|K!׈`P=0$1r([ixu@|5CОUHRX( Jx0Cȸe=ʩ=*CI;GUdt0EpEç Dg첛)0["J)g@SQ-pX‘bdaPwP[;!gpF-)01 1>k biCt-eU'(BJq6!@`5wlĉ@OɧJI4|P_PAv v I*е6P K4PE_TQ!꒨[kefd:7̛P>b*Om az;^PZ94 c.83xTh0ifE-? `J~k;2"ں4Qhޚɐ]h L#Ƀ>P΀(<1P0cql? QЛb!|fFiA(x=5;- ma0Bd#-sd1% >-py@Ɣ8WFwE`rX"("snx>K \ЭNݭXڎ%!J".2!cDI{g`a0|tiОZ@0 >( 0/.cKv$%8F =u)u_Ry>PffWUHd9MԻ(h Z9*, e ϧ 7uƒ A,лi `QJ׬|UQL >$7l%t߼З(`Eàe,P0IBZaBa`@ۆp*]C N ʓZuCy 닮q uD/eE>`@fU$xS=pw{=T-l@ө*s汔WE$ 09 > mLi 7_} . A2)J,} |4 <0R*kpxKIy;^@Sߝ riaSEU`=SP#x>Dy@LN6c 9/~5E!WY(W`:i8sY_?hɐU_@_4hKgR0/QihaB+9fB7A \AĜPSPEPD1Es&NADLC~p`57@eѢA4!hGϘ@*Pdz0`*혠k!~4H 1:-נaVor rRpI>|ޓ+|a0--VE?d_Z+Dgt%(  \59C 1#n( y 7F~T!P"`I">BDzE\P!W__҃_لӇ -<QRQU`aP |運^AlIgĈ0-„1p@UZTL 00l1Z0(7#Lu#ZsCƅ%0"?_6y30AȒ b f4lfrvK *`?DUoWd?s6ϝ:5չ&L0#(&G0AV  !Ry 'B<{Ì(QN}Ї@Q! = F!62^'uC]рs!ޘ3́5M7LSa5c!Q i-q IqB=U2S@QZ8 ˊV 7&lG"qa` p 4L BA~TP$1N=I0ՅP<2 5g kV 8Vsjx 1Ih!\!^ *8wʲrӇM5(,0 PS$ V}.ND 00ǟ4l_FGq%XZ$B 4@M)g HP X0b %&uK1C^a##FP/oFi 2EP AHB5M=CuhTPsHT|iLDV"4vHC?Zki+JH1Fl8Et%V$P(iH.!gLI R }yHwFE ܫwXpJ' *o̱Ƅ ]UPPAf7"L6!)r,T@zp4Ljm좒4!Qlw\QGU2旿qZJ,4~\;>` f)E#$ B'` P@8 o@| B< 0|3c*`ZǺ ,LJ3=En ZLX2{ g2T$m";V%(Lz_G=gyZӢų)"`}DLtN%f%pĐSCIX Fv@ 6@HBd`텄!YN"2BX U~KUb{h8teX_@( M::rfy`2H꓂I'f{@u|Xw  /*Pyi)U}Y*:1=f'F?t.CP^`;0GLXD5Fdxyɳy#$h hV(Pw;F$͂ds!~Pl3Q2pW`FunUw]uzBpX 4 javY?Y2"'@w!3(FS3~BrL (GͨC6P!p"p@ ILB2}h)nw F (-7<Є^\($Ow$eE!\09& AFu,k%o9tl#z/P/4 f  R2xWi 0^n0XL@+G/Qabgax@x/;:ii95 ^8PxnuuE Fy0MeN P/yyjI`3pL1Zp- kC05ifQ "$ (4WQ`^I^gƉ)" %:;xB2,C4!Up7لm\1k璟\NYq(C8n 5p=At*{ #R#Hg0Ɖ`8 r@C} )C212|jR)Ã'UN>]#C!@D3gp;d0[IxxXE+P D!:y9l 6Par.s/aI6  J2曄A%WDpz *C'=A]Ǒ&sكnh# b:-+UKJS8; PVDRTiß1y8:$16GI?q)p60f{*X bt%%GpEX z+Мҹ0,;MQR(2?xs?C!ɤЪ;`WN!GY*q h8Ț(`xvr6Pv*ZP 3qY4:!DKc R0+C#CBj %R1v Yb`dk=dPxRЈapEUK ]pHV (2K0pJPkf@cg2_!*` jb;;SfCVka:yOCxPh1ye+iW0F&wGr{.a7uPDZػyf51pai#0CPJ@NpQ(=qyy+`qXgl 0I-9BBBE}w% ;2@:W4&ds0yT]&{= Y"y ) K0c cL ꭪(-C,pR0)ںpo%c@-r~Q1RbwX{}%p6VҺh⛲6=+_"c?N7<}P9p 5vypajx*>병^^$w89`:?j2e? ->QI_+A 5d s  @ooLoL"L{o{SS+' ' ~~~ylT~ C 7u}/}_}v9v)w__}]J]//3e دQ> eҥΟ  Y uB YF$PP$2(Sx`6Gd?*&`bL`s[pݼhΎ.|Y?na_C9jШaC O\.7"%[ds#HD hCqDj$GF42)Sjȿr OYҊN1lذ`srXb 7Ɨ8'L//X<1cZdHKxfQ"4gZ#=a)=%AJ&I"ri pL (#DQh@ SYu#g}aTvx`xޭEc_?My)XC ]GFca%I0Si92 "@DAjA#Mi:n2@!,k LQD0xABas8:FM;]сv_QGw)(!^c,D~@ȕUηГ\%ATGvMUF@¦!, "FAis8G&&4|p"2kAPn@ET|1DJ(Q(0Mqb d7QNA9kL s!y9]D9ؖ1v` >,͔GTGbf# P2!4mJsҭ#/}f ^qnyʢ! AIPk(Ff6(,m6?`}bqiMED9JBFxD$E )Z #E=xɫ6* Qrz D6wؠā.R,UyxE|lRjՅ.E D;)-4X5#`allV!;yp}A}@*(u3xwn7ԬW!0~ΌK(Q7!3iѫ/d3TC]PZK.pP&Y B;dyؼH$\@WJ$(.EQTxxnʦ;gV0ifgyׁ!y#g8ͫ 8- ;M@S؈IP{DH )QK >1np)Ns6os5Sax+bVjpt'; }d LT@7TX!z&='-@cSv'Lc35Z,4 DIGsE^8c@[2 ey>1@!EH!LAM]DF:yC!gRv~aWlw.lT`v `0r0bȣBlT 21cpc0ctH@SH0baؐ h `Gt6,68C^x؂? 0@,OW?lj/?,D2F)b;& 2 2ΔCg 7)DDC>$"p@ ABNn,hP%6 `iQ\B ڌ:` k0Xg42F\t`"e V0DQvTF0VDfr@(j %z0 9C=@t)b+@!sKPx4QG2j$suB"fA!^2xb EEi;H畡E!7N|*H!zB[%JvkՍ| k b@aaXG{n1E Ly!&BbSeBD4h @D 6!Kpp"d sK/RC& mGSs/(tGhB?Ġ`خCr; r Aw@Y4BH 6x+p_8tiϧ-xY6'`ZG>E =ϖISK;rYwp,;h ((;Q @LʔMǀA4A [(SFSx+P<ݔiP'InBZ |'KEL[=LV :UIpDL az70`pP5P  6X4C9?JK7F@3H;CٶA%c68c(_-H.`n,tNGЀ}JT%U5>p ۀjP~5h`HKHQ`Tu:"w4k`XȎ`9^ u@-g@Nh{p/o q4ɠ%9tTpi0d-<冃p$.Bso(ZP'h"gP2IJO/e190&00 H)9R”kkp()КO9N zX IW^sR(`%P9 +]z`1Bc1DC72)sI6=SP=*2>`yCIT=tpcjRw󧔏X OrJ5YuubI2aT  F# Al0.zLJVfBrIF==` U6P NЁ`Hp n3J xp|SnZPHa0lIO8oe5(upg WsC$1S04p|D"jf.4=pmA=`sf[-"0*Z1 +Rذ7+3jb"VFR30\QCq(O@+%O0oJ0ಳE]Y<%D*+ZbH|{ ` s8NH6їc"p,Rhk3xN$}Cj<2"HrX08,aplZJP6 % ;rn'#QFPP!X:eC;2Fb|4&Խw%= `s3/[kS0 Փn夆=_Xsw@.4D0+K;&&=\=/[R9`PyYTЫ"*V0p8tĔxzAafKW$`x]?h/m]PWng=hjl[OȂ;.7% @ R0`ZH7CP @ ЗI/[A Eڑ (v`{@7Bg0CRDu4!MŽA PcBu`C[r?lf3Џ`#wJ(AI|Pb@ P2S5-H![n9D b81lHCR;X˕) WlrguCA _޴ׅ$ ۂD0H*K5}˕gB~8(8DXf7'~^P67C0`<I8'Ђ8 ibPj%M(Ih2W 5\-r.Q0SXk.AcQk)REaU<'pS=D[QeVLxa6"QV\ 7M /=a/T ~Ʀ |@Q3`"&+ -Y Pz2ս=2x*$a:&>fw!1%ʇÁբP, 54/Tșyܯd0Kl6lY t0{L/Ǐ'scOU.ۿ .V$t-TY|ï< !9؀Pi^%i,u 1uPJJ ~Wf_'ŸBޜ 5p"Ny?daЂ*.T`2wB E,YQ` )x"-9lpr<ڢRq4 :Uzq(y$FQE뷀 l!+(rU@&n&jR'pQX@J\o' Pz˄s!'zmuSwwDA[T8 Wdw-΋I oi[v+iaBy@_[+]khŽHJJ U#^N98f5.)A(; , h&&DDc"P:*< siڤ(桷Vt =[P(kJ3%L-j5.wvc ` `=5*#@>{P7]aKJUX.A 0SzvEs/I1`%s9f@Vɷs 3sWpAug$J-nr9Xl52u[ç#'!r8h@=<M"5 ' 1#}<@( -!oc Z[,p8 ]}ʘ-&[]Ny.{Ҥ#ALfo0{KDຓ) \. ~LhWhWO̬]T x,B?#Sa[f*M!֛UQx\ԇi8r69gbJH& 7$ץ6!bWetx9 X1Pkt|q"F "e^h"u @Y#0T!]q@`Xuӹɿh[cWyTĒ[jA%Sgu?Ơ "h'_@p fmo\)a =,Tƽ76 ^LEQ0p HD]u]؅]{'M8 $LIA<0'+Z[~6oB& P\reN'.:=H!pU.o?XHrm\] RP0avh3Z T݈ vpS K w93~yP^זQW ͊ !{˓03天"tA[MQ6x)'E!!Y\Ï13N 'P=6@Vv&^j}|_5q{bRP# Mkg@k ;7i\uX6ARHNjnV`\p)p)[uu?ȪpT,)}Nl/Aà"}f]l1`PIpR3Oq O$=&6|4 R1а+]_"Jfx^!lto&[v|9*HlJo2s.A![P'$/(mJ ?8 R"MѯT*>{lTT=`S.f f, PRR4M[PUQ\[ QQ#U UZы}}c$ Q%t%3 #a--7--71 }//' "`NhdfX CK(P QaHdIF2TɣEI+\(5'Q O3h EM-\ ?J -(՗ }QۡOKHЂ8BPC. -1($8?Mk#,E?.9GQG gQ3N~*Lb̈R(Y+*ŒIpYE hJ4UV%\9V,0,,/lqMP\-صtNw7( g!C! ҁJA~\1ɰ RQ\TEL[ JH"_(RR#JF#n3x 1{,B" 8MHOS <ݖmQ;Ҙg^L%mJh R#Zf%0v#! 2%Ith hDH"hZI(8Ï? &DBrY" HP",TR\iP ]F˥_dag[ua p]y~0_B%"iŁ1"{,zȐeƎJ "*"yH1eH=Zr$D`C"%&K/8E4m?S2-O xP!unMp6@ :~1 Ӆ\ ЯjCHgq"MTȋ#"H`8SGQG3 `I5<  {XANM XMQKVZ9;N3p8欃mFsY1 !k|""HhFAt׭":-Z@\l /@XR+p!`E "!԰l]BV; MD!|\-v9 q% #pr`:mW,1"2b1!.2D݄&l`W$E5Bq[Q^E gGZį+4tplA q4BR0x["+(H:f@sc}jAk 9N 15,=! {E0(`NGD!Uda'lŲE! Q%` @ 㳅R^y5c kPpHV^C" f OL M8 #*qLT:X`4X@,gD@,ѥ3Ñ ()Ep#X l~kH%58J!b@[8xѠ8N~1f$Yq7%P:$t܅9i]GA =7^\6L@hEPu @ J@ rCD D@p2pU!(L|E8E@C_@7i(q0&x_#E@B!BisL*( 65ajV ̶ àQѱiQL{Z $Z&piikBuL[t?7A̕w?D!|ݏ }Q*(F GN2+LTLQ(<.⾋3 ZL C nZ%!*P UGy#Mن?2ieZW]RR'N[]z/^zj tɨw/.K0)!t!bbm_b\B TZ4lC?^*Pр ),Wΐu +,%1kx'cwCtauH9;\{`cAPw<.}Z63ű'y`A;ʂ-갯Mb#AQFԞm G-! O1K(0 hwC>ywr cЅXޟߨ]XcZ Km_o]Z.!kA~(A TQguW? ie{rSp"|W|D`gpz&}g(BnrbRcr#4!!Xg\\'?F$0$&?Et`7 Pu)*Q)!!Gh2+p+3M2A FP^ 7A|'``U&kBC #0}4Us rbr9HPx<`fsGP~-VD*A p+6f 2y@J2 egF5 Vd2Mh;6:h l8ka kwq&4#&IQPv#7k cpng `#PoJB/TPEfE >L+S`9s S Q!AihiPqOv-q9tyXyPuZꑗ6d86rsgls~ѝpg 'g2MpiP]C@"cpQS`1W,5p v8Hy8}lnB1iQ(J0sƥ 'Y әb0C?Pl`9 2Ib ɤzt4:RcpypV_ }޲;C$DѺlgd<[Kqmy2)Y(bu 4QxY$8Kbqt1:A]<ZdoBInaP70pTsr)uimǚՓ J5f=zhsbi2y'$ᙨlClC0@tj 骣'sQK>R14Xv~QweZꡦs("wPs(6ڊh ٳhZ\֭ Z *bZD:@ѯ;J)=4E3^r+"2Fh -o7aRwhY[Fe_/;htrmk3)W\'T\+kQdʻpC Ek0{Ɓ볎QD"+yzX1H`"0p50V$//ևN`: [w DzMw' f\T ||2 +|kPiŢ̌VsHIS3ےi8Atܦ<!s"GQ՛]2 'W ȄpE2 bM%҄+LWDK۸Z[p'|.~Ks%r r댷 CԷ ՐmGpow&cz|u]zz)j]eڦ 2Io!$](c9>:25؃r׫tآe(QpcmKsFBsjS"z=;\h˧(I1!jsOY,% FSG4?!1k-;)@J%PJP˷dg3|\~;QPpv[}9I[ěclbO 2yNJ«}]FIY٥0q͚}߂hɽC[VO~% [|،~'4}@m-!&觺υl, VwQz-,9Lы?i4:[pGJ.aitQp}vUUOx`pfKJn)U\p#Əb1"P7nQ ]FQ I);+MQDq]g+XUG0Ҫgpء>]NDwfq*භVAٷ}7[|SvnNc6Koc@ aJY=Vo=3< SOK? cq};tON'z10f)mwRc -yHob㨭Чiԗͻnu lzGA7a1b ~7$ =BAx=&9ssl{,C i$%RJkܢNfOVKlIfk0\ǰflDL;稵V,SbpT$VXA}'$Ev $z$vMz\} y%$W'Up%UOcJB/` utQ5:!e2pHդNx+IXHUh%Wh[x|%tW,TQ'FR$c*I&py>t1$~QĤՙG}nfZu̦NZ3U1'r[3_Zu=[BuJWCɪO"BTrM<@<@$Pa_`1l+I. 1v1TE/QԞ7~EM8?N ISXY$_wbMf~ ئ;buble-0.19.3/package-lock.json000066400000000000000000001634541324054410700161260ustar00rootroot00000000000000{ "name": "buble", "version": "0.19.3", "lockfileVersion": 1, "requires": true, "dependencies": { "acorn": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", "integrity": "sha1-/cWNnRf0pOmNEC3tgmqbl1kSUQI=" }, "acorn-dynamic-import": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", "integrity": "sha1-kBzu5Mf6rvfgetKkfokGddpQong=", "requires": { "acorn": "5.4.1" } }, "acorn-jsx": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", "integrity": "sha1-6OQeSOov4MiWdAYQq2pP/YrdIl4=", "requires": { "acorn": "5.4.1" } }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { "co": "4.6.0", "fast-deep-equal": "1.0.0", "fast-json-stable-stringify": "2.0.0", "json-schema-traverse": "0.3.1" } }, "ajv-keywords": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", "dev": true }, "ansi-escapes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", "integrity": "sha1-7D6LTp+AZPwCw6ybZfHCdb2o75I=", "dev": true }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "requires": { "color-convert": "1.9.1" } }, "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.3" } }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { "arr-flatten": "1.1.0" } }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", "dev": true }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { "array-uniq": "1.0.3" } }, "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { "chalk": "1.1.3", "esutils": "2.0.2", "js-tokens": "3.0.2" }, "dependencies": { "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", "has-ansi": "2.0.0", "strip-ansi": "3.0.1", "supports-color": "2.0.0" } }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "2.1.1" } }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true } } }, "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.10", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.10.tgz", "integrity": "sha512-u0KjSZq9NOEh36yRmKT/pIYOu0rpGAyUTeUmJgNd1K2tpAaUomh092TZ0fqbBGQc4hz85BVngAiB2mqekvQvIw==", "dev": true, "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { "expand-range": "1.8.2", "preserve": "0.2.0", "repeat-element": "1.1.2" } }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, "buble": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/buble/-/buble-0.19.1.tgz", "integrity": "sha512-coEp3YIDTC2sInoPkY9ztJDr7oZVX/l5MUZ8ioGerlEXtUkacYd3qB6ln7pCUIaPhlJJZ3OeeVMd1GxxwaFiSg==", "dev": true, "requires": { "acorn": "5.4.1", "acorn-dynamic-import": "3.0.0", "acorn-jsx": "4.1.1", "chalk": "2.3.1", "magic-string": "0.22.4", "minimist": "1.2.0", "os-homedir": "1.0.2", "vlq": "1.0.0" } }, "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 }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { "callsites": "0.2.0" } }, "callsites": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, "chalk": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", "supports-color": "5.2.0" } }, "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", "dev": true }, "circular-json": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", "dev": true }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { "restore-cursor": "2.0.0" } }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "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=" }, "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", "integrity": "sha1-FXFS/R56bI2YpbcVzzdt+SgARWM=", "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 }, "concat-stream": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { "inherits": "2.0.3", "readable-stream": "2.3.4", "typedarray": "0.0.6" } }, "console-group": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/console-group/-/console-group-0.3.3.tgz", "integrity": "sha1-bY62uda3V6KJUoT2LQnHrUPyu84=", "dev": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { "lru-cache": "4.1.1", "shebang-command": "1.2.0", "which": "1.3.0" } }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "dev": true, "requires": { "ms": "2.0.0" } }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "del": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { "globby": "5.0.0", "is-path-cwd": "1.0.0", "is-path-in-cwd": "1.0.0", "object-assign": "4.1.1", "pify": "2.3.0", "pinkie-promise": "2.0.1", "rimraf": "2.6.2" } }, "diff": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", "integrity": "sha1-qoVnpu7QPFMfyJ0/cRzQ5SWd7HU=", "dev": true }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "2.0.2" } }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { "version": "4.17.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.17.0.tgz", "integrity": "sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA==", "dev": true, "requires": { "ajv": "5.5.2", "babel-code-frame": "6.26.0", "chalk": "2.3.1", "concat-stream": "1.6.0", "cross-spawn": "5.1.0", "debug": "3.1.0", "doctrine": "2.1.0", "eslint-scope": "3.7.1", "eslint-visitor-keys": "1.0.0", "espree": "3.5.3", "esquery": "1.0.0", "esutils": "2.0.2", "file-entry-cache": "2.0.0", "functional-red-black-tree": "1.0.1", "glob": "7.1.2", "globals": "11.3.0", "ignore": "3.3.7", "imurmurhash": "0.1.4", "inquirer": "3.3.0", "is-resolvable": "1.1.0", "js-yaml": "3.10.0", "json-stable-stringify-without-jsonify": "1.0.1", "levn": "0.3.0", "lodash": "4.17.5", "minimatch": "3.0.4", "mkdirp": "0.5.1", "natural-compare": "1.4.0", "optionator": "0.8.2", "path-is-inside": "1.0.2", "pluralize": "7.0.0", "progress": "2.0.0", "require-uncached": "1.0.3", "semver": "5.5.0", "strip-ansi": "4.0.0", "strip-json-comments": "2.0.1", "table": "4.0.2", "text-table": "0.2.0" } }, "eslint-scope": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { "esrecurse": "4.2.0", "estraverse": "4.2.0" } }, "eslint-visitor-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", "dev": true }, "espree": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.3.tgz", "integrity": "sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ==", "dev": true, "requires": { "acorn": "5.4.1", "acorn-jsx": "3.0.1" }, "dependencies": { "acorn-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { "acorn": "3.3.0" }, "dependencies": { "acorn": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", "dev": true } } } } }, "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", "dev": true }, "esquery": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", "dev": true, "requires": { "estraverse": "4.2.0" } }, "esrecurse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", "dev": true, "requires": { "estraverse": "4.2.0", "object-assign": "4.1.1" } }, "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, "estree-walker": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.3.1.tgz", "integrity": "sha1-5rGlHPcpJSTnI3wxLl/mZgwc4ao=", "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { "is-posix-bracket": "0.1.1" } }, "expand-range": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { "fill-range": "2.2.3" } }, "external-editor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", "dev": true, "requires": { "chardet": "0.4.2", "iconv-lite": "0.4.19", "tmp": "0.0.33" } }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { "is-extglob": "1.0.0" } }, "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { "escape-string-regexp": "1.0.5" } }, "file-entry-cache": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { "flat-cache": "1.3.0", "object-assign": "4.1.1" } }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, "fill-range": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { "is-number": "2.1.0", "isobject": "2.1.0", "randomatic": "1.1.7", "repeat-element": "1.1.2", "repeat-string": "1.6.1" } }, "flat-cache": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { "circular-json": "0.3.3", "del": "2.2.2", "graceful-fs": "4.1.11", "write": "0.2.1" } }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { "for-in": "1.0.2" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", "inherits": "2.0.3", "minimatch": "3.0.4", "once": "1.4.0", "path-is-absolute": "1.0.1" } }, "glob-base": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { "glob-parent": "2.0.0", "is-glob": "2.0.1" } }, "glob-parent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { "is-glob": "2.0.1" } }, "globals": { "version": "11.3.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", "dev": true }, "globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { "array-union": "1.0.2", "arrify": "1.0.1", "glob": "7.1.2", "object-assign": "4.1.1", "pify": "2.3.0", "pinkie-promise": "2.0.1" } }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", "integrity": "sha1-GSa6kM8+3+KttJJ/WIC8IsZseQ8=", "dev": true }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { "ansi-regex": "2.1.1" } }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", "dev": true }, "ignore": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", "integrity": "sha1-YSKJv7PCIOGGpYEYYY1b6MG6sCE=", "dev": true }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "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.4.0", "wrappy": "1.0.2" } }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "inquirer": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha1-ndLyrXZdyrH/BEO0kUQqILoifck=", "dev": true, "requires": { "ansi-escapes": "3.0.0", "chalk": "2.3.1", "cli-cursor": "2.1.0", "cli-width": "2.2.0", "external-editor": "2.1.0", "figures": "2.0.0", "lodash": "4.17.5", "mute-stream": "0.0.7", "run-async": "2.3.0", "rx-lite": "4.0.8", "rx-lite-aggregates": "4.0.8", "string-width": "2.1.1", "strip-ansi": "4.0.0", "through": "2.3.8" } }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", "dev": true }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", "dev": true }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { "is-primitive": "2.0.0" } }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "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-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { "is-extglob": "1.0.0" } }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", "dev": true }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { "kind-of": "3.2.2" } }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", "dev": true }, "is-path-in-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", "dev": true, "requires": { "is-path-inside": "1.0.1" } }, "is-path-inside": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { "path-is-inside": "1.0.2" } }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", "dev": true }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "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 }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, "requires": { "isarray": "1.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.10.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", "dev": true, "requires": { "argparse": "1.0.9", "esprima": "4.0.0" } }, "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "1.1.6" } }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { "prelude-ls": "1.1.2", "type-check": "0.3.2" } }, "lodash": { "version": "4.17.5", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", "dev": true }, "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", "dev": true, "requires": { "pseudomap": "1.0.2", "yallist": "2.1.2" } }, "magic-string": { "version": "0.22.4", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", "integrity": "sha1-MQObTkA2Y5VhjB1s+Bk8U5F0df8=", "requires": { "vlq": "0.2.3" }, "dependencies": { "vlq": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", "integrity": "sha1-jz5DKM9jsVQMDWfhsneDhviXWyY=" } } }, "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { "arr-diff": "2.0.0", "array-unique": "0.2.1", "braces": "1.8.5", "expand-brackets": "0.1.5", "extglob": "0.3.2", "filename-regex": "2.0.1", "is-extglob": "1.0.0", "is-glob": "2.0.1", "kind-of": "3.2.2", "normalize-path": "2.1.1", "object.omit": "2.0.1", "parse-glob": "3.0.4", "regex-cache": "0.4.4" } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "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.10" } }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "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" }, "dependencies": { "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, "mocha": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.0.tgz", "integrity": "sha1-zMrJiLC8VHcRnLoOQ9569tatj04=", "dev": true, "requires": { "browser-stdout": "1.3.0", "commander": "2.11.0", "debug": "3.1.0", "diff": "3.3.1", "escape-string-regexp": "1.0.5", "glob": "7.1.2", "growl": "1.10.3", "he": "1.1.1", "mkdirp": "0.5.1", "supports-color": "4.4.0" }, "dependencies": { "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha1-iD992rwWUUKyphQn8zUt7RldGj4=", "dev": true, "requires": { "has-flag": "2.0.0" } } } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { "remove-trailing-separator": "1.1.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.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { "for-own": "0.1.5", "is-extendable": "0.1.1" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1.0.2" } }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { "mimic-fn": "1.2.0" } }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { "deep-is": "0.1.3", "fast-levenshtein": "2.0.6", "levn": "0.3.0", "prelude-ls": "1.1.2", "type-check": "0.3.2", "wordwrap": "1.0.0" } }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { "glob-base": "0.3.0", "is-dotfile": "1.0.3", "is-extglob": "1.0.0", "is-glob": "2.0.1" } }, "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-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { "pinkie": "2.0.4" } }, "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", "integrity": "sha1-KYuJ34uTsCIdv0Ia0rGx6iP8Z3c=", "dev": true }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "progress": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", "dev": true, "requires": { "is-number": "3.0.0", "kind-of": "4.0.0" }, "dependencies": { "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { "kind-of": "3.2.2" }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { "is-buffer": "1.1.6" } } } }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { "is-buffer": "1.1.6" } } } }, "readable-stream": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", "isarray": "1.0.0", "process-nextick-args": "2.0.0", "safe-buffer": "5.1.1", "string_decoder": "1.0.3", "util-deprecate": "1.0.2" } }, "regenerate": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", "integrity": "sha1-DDNtOYBVPXVcObWGrjsgqknIK38=", "dev": true }, "regenerate-unicode-properties": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-5.1.3.tgz", "integrity": "sha1-VPWJFUNGjzbyJ0tnxrxMAzwnswg=", "dev": true, "requires": { "regenerate": "1.3.3" } }, "regex-cache": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", "dev": true, "requires": { "is-equal-shallow": "0.1.3" } }, "regexpu-core": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.1.3.tgz", "integrity": "sha1-+4FhbbvCqRenQZsz+DeRRPUeuNA=", "dev": true, "requires": { "regenerate": "1.3.3", "regenerate-unicode-properties": "5.1.3", "regjsgen": "0.3.0", "regjsparser": "0.2.1", "unicode-match-property-ecmascript": "1.0.3", "unicode-match-property-value-ecmascript": "1.0.1" } }, "regjsgen": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.3.0.tgz", "integrity": "sha1-DuSj6SdkMM2iXx54nqbBW4ewy0M=", "dev": true }, "regjsparser": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.2.1.tgz", "integrity": "sha1-w3h1U/rwTndcMCEC7zRtmVAA7Bw=", "dev": true, "requires": { "jsesc": "0.5.0" } }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { "caller-path": "0.1.0", "resolve-from": "1.0.1" } }, "resolve": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", "integrity": "sha1-HwmsznlsmnYlefMbLBzEw83fnzY=", "dev": true, "requires": { "path-parse": "1.0.5" } }, "resolve-from": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { "onetime": "2.0.1", "signal-exit": "3.0.2" } }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", "dev": true, "requires": { "glob": "7.1.2" } }, "rollup": { "version": "0.55.5", "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.55.5.tgz", "integrity": "sha512-2hke9NOy332kxvnmMQOgl7DHm94zihNyYJNd8ZLWo4U0EjFvjUkeWa0+ge+70bTg+mY0xJ7NUsf5kIhDtrGrtA==", "dev": true }, "rollup-plugin-buble": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/rollup-plugin-buble/-/rollup-plugin-buble-0.19.1.tgz", "integrity": "sha512-MhhyMysnHzuD0TMMC2M0Z/eHY37ZaCxB6iDqbDybBY3Ds/a8EJBiSJVUTIjOKZBkA6WucdfFPlWwRJIwrruxsA==", "dev": true, "requires": { "buble": "0.19.1", "rollup-pluginutils": "2.0.1" } }, "rollup-plugin-commonjs": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.3.0.tgz", "integrity": "sha512-PYs3OiYgENFYEmI3vOEm5nrp3eY90YZqd5vGmQqeXmhJsAWFIrFdROCvOasqJ1HgeTvqyYo9IGXnFDyoboNcgQ==", "dev": true, "requires": { "acorn": "5.4.1", "estree-walker": "0.5.1", "magic-string": "0.22.4", "resolve": "1.5.0", "rollup-pluginutils": "2.0.1" }, "dependencies": { "estree-walker": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.1.tgz", "integrity": "sha1-ZPw3UFOrxvV9c+m9LwBGRK08WFQ=", "dev": true } } }, "rollup-plugin-json": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-2.3.0.tgz", "integrity": "sha1-PAekUsG1ORvigAb7//NkQFbOCt0=", "dev": true, "requires": { "rollup-pluginutils": "2.0.1" } }, "rollup-plugin-node-resolve": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.2.tgz", "integrity": "sha1-OLq8Ev1ATMK6H/aGSP5D+j/+5rA=", "dev": true, "requires": { "builtin-modules": "1.1.1", "is-module": "1.0.0", "resolve": "1.5.0" } }, "rollup-pluginutils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz", "integrity": "sha1-fslbNXP2VDpGpkYb2afFRFJdD8A=", "dev": true, "requires": { "estree-walker": "0.3.1", "micromatch": "2.3.11" } }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { "is-promise": "2.1.0" } }, "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", "dev": true }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { "rx-lite": "4.0.8" } }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", "dev": true }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "slice-ansi": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", "integrity": "sha1-BE8aSdiEL/MHqta1Be0Xi9lQE00=", "dev": true, "requires": { "is-fullwidth-code-point": "2.0.0" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true }, "source-map-support": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.3.tgz", "integrity": "sha512-eKkTgWYeBOQqFGXRfKabMFdnWepo51vWqEdoeikaEPFiJC7MCU5j2h4+6Q8npkZTeLGbSyecZvRxiSoWl3rh+w==", "dev": true, "requires": { "source-map": "0.6.1" } }, "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_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", "dev": true, "requires": { "safe-buffer": "5.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" }, "dependencies": { "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "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": "5.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", "requires": { "has-flag": "3.0.0" }, "dependencies": { "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" } } }, "table": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", "integrity": "sha1-ozRHN1OR52atNNNIbm4q7chNLjY=", "dev": true, "requires": { "ajv": "5.5.2", "ajv-keywords": "2.1.1", "chalk": "2.3.1", "lodash": "4.17.5", "slice-ansi": "1.0.0", "string-width": "2.1.1" } }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", "dev": true, "requires": { "os-tmpdir": "1.0.2" } }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { "prelude-ls": "1.1.2" } }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.3.tgz", "integrity": "sha1-9hGfQXRnWTwAhjV8hVRratWrxYM=", "dev": true }, "unicode-match-property-ecmascript": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.3.tgz", "integrity": "sha1-25sctP/GfgxVg3gLG1k3Dky+l7k=", "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "1.0.3", "unicode-property-aliases-ecmascript": "1.0.3" } }, "unicode-match-property-value-ecmascript": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.1.tgz", "integrity": "sha1-/qBZEgoBb0A6/Tv1hhYrTbA+BgQ=", "dev": true }, "unicode-property-aliases-ecmascript": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.3.tgz", "integrity": "sha1-rDUiWDueYwWA+RZjUzPgDF6taQ0=", "dev": true }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "vlq": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.0.tgz", "integrity": "sha1-gQG+kIQ0IpVMKxPrJ/LzEivcyAY=" }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", "dev": true, "requires": { "isexe": "2.0.0" } }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { "mkdirp": "0.5.1" } }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true } } } buble-0.19.3/package.json000066400000000000000000000033221324054410700151630ustar00rootroot00000000000000{ "name": "buble", "version": "0.19.3", "description": "The blazing fast, batteries-included ES2015 compiler", "main": "dist/buble.cjs.js", "module": "dist/buble.es.js", "browser": { "dist/buble.cjs.js": "./dist/buble-browser.cjs.js", "dist/buble.es.js": "./dist/buble-browser.es.js" }, "unpkg": "dist/buble-browser-deps.umd.js", "files": [ "bin", "src", "dist", "register.js", "README.md" ], "scripts": { "build": "rollup -c", "test": "mocha test/test.js", "pretest": "npm run build", "prepublish": "npm test", "lint": "eslint src" }, "bin": { "buble": "./bin/buble" }, "repository": { "type": "git", "url": "git+https://github.com/Rich-Harris/buble.git" }, "keywords": [ "javascript", "transpilation", "compilation", "esnext", "es2015", "es2017", "es6", "es7" ], "author": "Rich Harris", "license": "MIT", "bugs": { "url": "https://github.com/Rich-Harris/buble/issues" }, "homepage": "https://github.com/Rich-Harris/buble#README", "devDependencies": { "console-group": "^0.3.3", "eslint": "^4.17.0", "glob": "^7.0.3", "mocha": "^5.0.0", "regexpu-core": "^4.1.3", "rimraf": "^2.5.2", "rollup": "^0.55.5", "rollup-plugin-buble": "^0.19.1", "rollup-plugin-commonjs": "^8.3.0", "rollup-plugin-json": "^2.3.0", "rollup-plugin-node-resolve": "^3.0.2", "source-map": "^0.6.1", "source-map-support": "^0.5.3" }, "dependencies": { "acorn": "^5.4.1", "acorn-dynamic-import": "^3.0.0", "acorn-jsx": "^4.1.1", "chalk": "^2.3.1", "magic-string": "^0.22.4", "minimist": "^1.2.0", "os-homedir": "^1.0.1", "vlq": "^1.0.0" } } buble-0.19.3/register.js000066400000000000000000000044661324054410700150710ustar00rootroot00000000000000var fs = require( 'fs' ); var path = require( 'path' ); var crypto = require( 'crypto' ); var homedir = require( 'os-homedir' ); var buble = require( './' ); var original = require.extensions[ '.js' ]; var nodeModulesPattern = path.sep === '/' ? /\/node_modules\// : /\\node_modules\\/; var nodeVersion = /(?:0\.)?\d+/.exec( process.version )[0]; var versions = [ '0.10', '0.12', '4', '5', '6' ]; if ( !~versions.indexOf( nodeVersion ) ) { if ( +nodeVersion > 6 ) { nodeVersion = '6'; } else { throw new Error( 'Unsupported version (' + nodeVersion + '). Please raise an issue at https://github.com/Rich-Harris/buble/issues' ); } } var options = { target: { node: nodeVersion } }; function mkdirp ( dir ) { var parent = path.dirname( dir ); if ( dir === parent ) return; mkdirp( parent ); try { fs.mkdirSync( dir ); } catch ( err ) { if ( err.code !== 'EEXIST' ) throw err; } } var home = homedir(); if ( home ) { var cachedir = path.join( home, '.buble-cache', String(nodeVersion) ); mkdirp( cachedir ); fs.writeFileSync( path.join( home, '.buble-cache/README.txt' ), 'These files enable a faster startup when using buble/register. You can safely delete this folder at any time. See https://buble.surge.sh/guide/ for more information.' ); } var optionsStringified = JSON.stringify( options ); require.extensions[ '.js' ] = function ( m, filename ) { if ( nodeModulesPattern.test( filename ) ) return original( m, filename ); var source = fs.readFileSync( filename, 'utf-8' ); var hash = crypto.createHash( 'sha256' ); hash.update( buble.VERSION ); hash.update( optionsStringified ); hash.update( source ); var key = hash.digest( 'hex' ) + '.json'; var cachepath = path.join( cachedir, key ); var compiled; if ( cachedir ) { try { compiled = JSON.parse( fs.readFileSync( cachepath, 'utf-8' ) ); } catch ( err ) { // noop } } if ( !compiled ) { try { compiled = buble.transform( source, options ); if ( cachedir ) { fs.writeFileSync( cachepath, JSON.stringify( compiled ) ); } } catch ( err ) { if ( err.snippet ) { console.log( 'Error compiling ' + filename + ':\n---' ); console.log( err.snippet ); console.log( err.message ); console.log( '' ) process.exit( 1 ); } throw err; } } m._compile( '"use strict";\n' + compiled.code, filename ); }; buble-0.19.3/rollup.config.js000066400000000000000000000030421324054410700160130ustar00rootroot00000000000000import buble from 'rollup-plugin-buble'; import json from 'rollup-plugin-json'; import resolve from 'rollup-plugin-node-resolve'; import commonjs from 'rollup-plugin-commonjs'; import pkg from './package.json'; const ensureArray = maybeArr => Array.isArray(maybeArr) ? maybeArr : [maybeArr]; const createConfig = (opts) => { opts = opts || {}; const browser = opts.browser || false; const external = opts.external || ['acorn', 'magic-string']; const output = ensureArray(opts.output); return { input: 'src/index.js', output: output.map(format => Object.assign({}, format, { name: 'buble', sourcemap: true })), external: external, plugins: [ json(), commonjs(), buble({ target: !browser ? { node: 4 } : null, include: [ 'src/**', 'node_modules/regexpu-core/**', 'node_modules/unicode-match-property-ecmascript/**', 'node_modules/unicode-match-property-value-ecmascript/**', ], transforms: { dangerousForOf: true } }), resolve() ], }; }; const configs = [ /* node ESM/CJS builds */ createConfig({ output: [ { format: 'es', file: pkg.module }, { format: 'cjs', file: pkg.main } ], }), /* browser ESM/CJS builds (for bundlers) */ createConfig({ browser: true, output: [ { format: 'es', file: pkg.browser[pkg.module] }, { format: 'cjs', file: pkg.browser[pkg.main] } ], }), /* UMD with bundled dependencies, ready for browsers */ createConfig({ browser: true, external: [], output: { format: 'umd', file: pkg.unpkg }, }), ]; export default configs; buble-0.19.3/src/000077500000000000000000000000001324054410700134645ustar00rootroot00000000000000buble-0.19.3/src/index.js000066400000000000000000000051311324054410700151310ustar00rootroot00000000000000import * as acorn from 'acorn'; import acornJsx from 'acorn-jsx/inject'; import acornDynamicImport from 'acorn-dynamic-import/lib/inject'; import Program from './program/Program.js'; import { features, matrix } from './support.js'; import getSnippet from './utils/getSnippet.js'; const { parse } = [acornJsx, acornDynamicImport].reduce( (final, plugin) => plugin(final), acorn ); const dangerousTransforms = ['dangerousTaggedTemplateString', 'dangerousForOf']; export function target(target) { const targets = Object.keys(target); let bitmask = targets.length ? 0b11111111111111111111 : 0b01000000000000000000; Object.keys(target).forEach(environment => { const versions = matrix[environment]; if (!versions) throw new Error( `Unknown environment '${environment}'. Please raise an issue at https://github.com/Rich-Harris/buble/issues` ); const targetVersion = target[environment]; if (!(targetVersion in versions)) throw new Error( `Support data exists for the following versions of ${environment}: ${Object.keys( versions ).join( ', ' )}. Please raise an issue at https://github.com/Rich-Harris/buble/issues` ); const support = versions[targetVersion]; bitmask &= support; }); let transforms = Object.create(null); features.forEach((name, i) => { transforms[name] = !(bitmask & (1 << i)); }); dangerousTransforms.forEach(name => { transforms[name] = false; }); return transforms; } export function transform(source, options = {}) { let ast; let jsx = null; try { ast = parse(source, { ecmaVersion: 9, preserveParens: true, sourceType: 'module', onComment: (block, text) => { if (!jsx) { let match = /@jsx\s+([^\s]+)/.exec(text); if (match) jsx = match[1]; } }, plugins: { jsx: true, dynamicImport: true } }); options.jsx = jsx || options.jsx; } catch (err) { err.snippet = getSnippet(source, err.loc); err.toString = () => `${err.name}: ${err.message}\n${err.snippet}`; throw err; } let transforms = target(options.target || {}); Object.keys(options.transforms || {}).forEach(name => { if (name === 'modules') { if (!('moduleImport' in options.transforms)) transforms.moduleImport = options.transforms.modules; if (!('moduleExport' in options.transforms)) transforms.moduleExport = options.transforms.modules; return; } if (!(name in transforms)) throw new Error(`Unknown transform '${name}'`); transforms[name] = options.transforms[name]; }); return new Program(source, ast, transforms, options).export(options); } export { version as VERSION } from '../package.json'; buble-0.19.3/src/program/000077500000000000000000000000001324054410700151335ustar00rootroot00000000000000buble-0.19.3/src/program/BlockStatement.js000066400000000000000000000232261324054410700204150ustar00rootroot00000000000000import Node from './Node.js'; import Scope from './Scope.js'; import destructure from '../utils/destructure.js'; function isUseStrict(node) { if (!node) return false; if (node.type !== 'ExpressionStatement') return false; if (node.expression.type !== 'Literal') return false; return node.expression.value === 'use strict'; } export default class BlockStatement extends Node { createScope() { this.parentIsFunction = /Function/.test(this.parent.type); this.isFunctionBlock = this.parentIsFunction || this.parent.type === 'Root'; this.scope = new Scope({ block: !this.isFunctionBlock, parent: this.parent.findScope(false), declare: id => this.createdDeclarations.push(id) }); if (this.parentIsFunction) { this.parent.params.forEach(node => { this.scope.addDeclaration(node, 'param'); }); } } initialise(transforms) { this.thisAlias = null; this.argumentsAlias = null; this.defaultParameters = []; this.createdDeclarations = []; // normally the scope gets created here, during initialisation, // but in some cases (e.g. `for` statements), we need to create // the scope early, as it pertains to both the init block and // the body of the statement if (!this.scope) this.createScope(); this.body.forEach(node => node.initialise(transforms)); this.scope.consolidate(); } findLexicalBoundary() { if (this.type === 'Program') return this; if (/^Function/.test(this.parent.type)) return this; return this.parent.findLexicalBoundary(); } findScope(functionScope) { if (functionScope && !this.isFunctionBlock) return this.parent.findScope(functionScope); return this.scope; } getArgumentsAlias() { if (!this.argumentsAlias) { this.argumentsAlias = this.scope.createIdentifier('arguments'); } return this.argumentsAlias; } getArgumentsArrayAlias() { if (!this.argumentsArrayAlias) { this.argumentsArrayAlias = this.scope.createIdentifier('argsArray'); } return this.argumentsArrayAlias; } getThisAlias() { if (!this.thisAlias) { this.thisAlias = this.scope.createIdentifier('this'); } return this.thisAlias; } getIndentation() { if (this.indentation === undefined) { const source = this.program.magicString.original; const useOuter = this.synthetic || !this.body.length; let c = useOuter ? this.start : this.body[0].start; while (c && source[c] !== '\n') c -= 1; this.indentation = ''; // eslint-disable-next-line no-constant-condition while (true) { c += 1; const char = source[c]; if (char !== ' ' && char !== '\t') break; this.indentation += char; } const indentString = this.program.magicString.getIndentString(); // account for dedented class constructors let parent = this.parent; while (parent) { if (parent.kind === 'constructor' && !parent.parent.parent.superClass) { this.indentation = this.indentation.replace(indentString, ''); } parent = parent.parent; } if (useOuter) this.indentation += indentString; } return this.indentation; } transpile(code, transforms) { const indentation = this.getIndentation(); let introStatementGenerators = []; if (this.argumentsAlias) { introStatementGenerators.push((start, prefix, suffix) => { const assignment = `${prefix}var ${this.argumentsAlias} = arguments${ suffix }`; code.appendLeft(start, assignment); }); } if (this.thisAlias) { introStatementGenerators.push((start, prefix, suffix) => { const assignment = `${prefix}var ${this.thisAlias} = this${suffix}`; code.appendLeft(start, assignment); }); } if (this.argumentsArrayAlias) { introStatementGenerators.push((start, prefix, suffix) => { const i = this.scope.createIdentifier('i'); const assignment = `${prefix}var ${i} = arguments.length, ${ this.argumentsArrayAlias } = Array(${i});\n${indentation}while ( ${i}-- ) ${ this.argumentsArrayAlias }[${i}] = arguments[${i}]${suffix}`; code.appendLeft(start, assignment); }); } if (/Function/.test(this.parent.type)) { this.transpileParameters( this.parent.params, code, transforms, indentation, introStatementGenerators ); } else if ('CatchClause' === this.parent.type) { this.transpileParameters( [this.parent.param], code, transforms, indentation, introStatementGenerators ); } if (transforms.letConst && this.isFunctionBlock) { this.transpileBlockScopedIdentifiers(code); } super.transpile(code, transforms); if (this.createdDeclarations.length) { introStatementGenerators.push((start, prefix, suffix) => { const assignment = `${prefix}var ${this.createdDeclarations.join(', ')}${suffix}`; code.appendLeft(start, assignment); }); } if (this.synthetic) { if (this.parent.type === 'ArrowFunctionExpression') { const expr = this.body[0]; if (introStatementGenerators.length) { code .appendLeft(this.start, `{`) .prependRight(this.end, `${this.parent.getIndentation()}}`); code.prependRight(expr.start, `\n${indentation}return `); code.appendLeft(expr.end, `;\n`); } else if (transforms.arrow) { code.prependRight(expr.start, `{ return `); code.appendLeft(expr.end, `; }`); } } else if (introStatementGenerators.length) { code.prependRight(this.start, `{`).appendLeft(this.end, `}`); } } let start; if (isUseStrict(this.body[0])) { start = this.body[0].end; } else if (this.synthetic || this.parent.type === 'Root') { start = this.start; } else { start = this.start + 1; } let prefix = `\n${indentation}`; let suffix = ';'; introStatementGenerators.forEach((fn, i) => { if (i === introStatementGenerators.length - 1) suffix = `;\n`; fn(start, prefix, suffix); }); } transpileParameters(params, code, transforms, indentation, introStatementGenerators) { params.forEach(param => { if ( param.type === 'AssignmentPattern' && param.left.type === 'Identifier' ) { if (transforms.defaultParameter) { introStatementGenerators.push((start, prefix, suffix) => { const lhs = `${prefix}if ( ${param.left.name} === void 0 ) ${ param.left.name }`; code .prependRight(param.left.end, lhs) .move(param.left.end, param.right.end, start) .appendLeft(param.right.end, suffix); }); } } else if (param.type === 'RestElement') { if (transforms.spreadRest) { introStatementGenerators.push((start, prefix, suffix) => { const penultimateParam = params[params.length - 2]; if (penultimateParam) { code.remove( penultimateParam ? penultimateParam.end : param.start, param.end ); } else { let start = param.start, end = param.end; // TODO https://gitlab.com/Rich-Harris/buble/issues/8 while (/\s/.test(code.original[start - 1])) start -= 1; while (/\s/.test(code.original[end])) end += 1; code.remove(start, end); } const name = param.argument.name; const len = this.scope.createIdentifier('len'); const count = params.length - 1; if (count) { code.prependRight( start, `${prefix}var ${name} = [], ${len} = arguments.length - ${ count };\n${indentation}while ( ${len}-- > 0 ) ${name}[ ${ len } ] = arguments[ ${len} + ${count} ]${suffix}` ); } else { code.prependRight( start, `${prefix}var ${name} = [], ${len} = arguments.length;\n${ indentation }while ( ${len}-- ) ${name}[ ${len} ] = arguments[ ${len} ]${ suffix }` ); } }); } } else if (param.type !== 'Identifier') { if (transforms.parameterDestructuring) { const ref = this.scope.createIdentifier('ref'); destructure( code, id => this.scope.createIdentifier(id), ({ name }) => this.scope.resolveName(name), param, ref, false, introStatementGenerators ); code.prependRight(param.start, ref); } } }); } transpileBlockScopedIdentifiers(code) { Object.keys(this.scope.blockScopedDeclarations).forEach(name => { const declarations = this.scope.blockScopedDeclarations[name]; for (let declaration of declarations) { let cont = false; // TODO implement proper continue... if (declaration.kind === 'for.let') { // special case const forStatement = declaration.node.findNearest('ForStatement'); if (forStatement.shouldRewriteAsFunction) { const outerAlias = this.scope.createIdentifier(name); const innerAlias = forStatement.reassigned[name] ? this.scope.createIdentifier(name) : name; declaration.name = outerAlias; code.overwrite( declaration.node.start, declaration.node.end, outerAlias, { storeName: true } ); forStatement.aliases[name] = { outer: outerAlias, inner: innerAlias }; for (const identifier of declaration.instances) { const alias = forStatement.body.contains(identifier) ? innerAlias : outerAlias; if (name !== alias) { code.overwrite(identifier.start, identifier.end, alias, { storeName: true }); } } cont = true; } } if (!cont) { const alias = this.scope.createIdentifier(name); if (name !== alias) { declaration.name = alias; code.overwrite( declaration.node.start, declaration.node.end, alias, { storeName: true } ); for (const identifier of declaration.instances) { identifier.rewritten = true; code.overwrite(identifier.start, identifier.end, alias, { storeName: true }); } } } } }); } } buble-0.19.3/src/program/Node.js000066400000000000000000000041441324054410700163610ustar00rootroot00000000000000// used for debugging, without the noise created by // circular references function toJSON(node) { var obj = {}; Object.keys(node).forEach(key => { if ( key === 'parent' || key === 'program' || key === 'keys' || key === '__wrapped' ) return; if (Array.isArray(node[key])) { obj[key] = node[key].map(toJSON); } else if (node[key] && node[key].toJSON) { obj[key] = node[key].toJSON(); } else { obj[key] = node[key]; } }); return obj; } export default class Node { ancestor(level) { let node = this; while (level--) { node = node.parent; if (!node) return null; } return node; } contains(node) { while (node) { if (node === this) return true; node = node.parent; } return false; } findLexicalBoundary() { return this.parent.findLexicalBoundary(); } findNearest(type) { if (typeof type === 'string') type = new RegExp(`^${type}$`); if (type.test(this.type)) return this; return this.parent.findNearest(type); } unparenthesizedParent() { let node = this.parent; while (node && node.type === 'ParenthesizedExpression') { node = node.parent; } return node; } unparenthesize() { let node = this; while (node.type === 'ParenthesizedExpression') { node = node.expression; } return node; } findScope(functionScope) { return this.parent.findScope(functionScope); } getIndentation() { return this.parent.getIndentation(); } initialise(transforms) { for (var key of this.keys) { const value = this[key]; if (Array.isArray(value)) { value.forEach(node => node && node.initialise(transforms)); } else if (value && typeof value === 'object') { value.initialise(transforms); } } } toJSON() { return toJSON(this); } toString() { return this.program.magicString.original.slice(this.start, this.end); } transpile(code, transforms) { for (const key of this.keys) { const value = this[key]; if (Array.isArray(value)) { value.forEach(node => node && node.transpile(code, transforms)); } else if (value && typeof value === 'object') { value.transpile(code, transforms); } } } } buble-0.19.3/src/program/Program.js000066400000000000000000000035671324054410700171130ustar00rootroot00000000000000import MagicString from 'magic-string'; import BlockStatement from './BlockStatement.js'; import wrap from './wrap.js'; export default function Program(source, ast, transforms, options) { this.type = 'Root'; // options this.jsx = options.jsx || 'React.createElement'; this.options = options; this.source = source; this.magicString = new MagicString(source); this.ast = ast; this.depth = 0; wrap((this.body = ast), this); this.body.__proto__ = BlockStatement.prototype; this.templateLiteralQuasis = Object.create(null); for (let i = 0; i < this.body.body.length; ++i) { if (!this.body.body[i].directive) { this.prependAt = this.body.body[i].start; break; } } this.objectWithoutPropertiesHelper = null; this.indentExclusionElements = []; this.body.initialise(transforms); this.indentExclusions = Object.create(null); for (const node of this.indentExclusionElements) { for (let i = node.start; i < node.end; i += 1) { this.indentExclusions[i] = true; } } this.body.transpile(this.magicString, transforms); } Program.prototype = { export(options = {}) { return { code: this.magicString.toString(), map: this.magicString.generateMap({ file: options.file, source: options.source, includeContent: options.includeContent !== false }) }; }, findNearest() { return null; }, findScope() { return null; }, getObjectWithoutPropertiesHelper(code) { if (!this.objectWithoutPropertiesHelper) { this.objectWithoutPropertiesHelper = this.body.scope.createIdentifier('objectWithoutProperties'); code.prependLeft(this.prependAt, `function ${this.objectWithoutPropertiesHelper} (obj, exclude) { ` + `var target = {}; for (var k in obj) ` + `if (Object.prototype.hasOwnProperty.call(obj, k) && exclude.indexOf(k) === -1) ` + `target[k] = obj[k]; return target; }\n` ); } return this.objectWithoutPropertiesHelper; } }; buble-0.19.3/src/program/Scope.js000066400000000000000000000055141324054410700165470ustar00rootroot00000000000000import extractNames from './extractNames.js'; import reserved from '../utils/reserved.js'; export default function Scope(options) { options = options || {}; this.parent = options.parent; this.isBlockScope = !!options.block; this.createDeclarationCallback = options.declare; let scope = this; while (scope.isBlockScope) scope = scope.parent; this.functionScope = scope; this.identifiers = []; this.declarations = Object.create(null); this.references = Object.create(null); this.blockScopedDeclarations = this.isBlockScope ? null : Object.create(null); this.aliases = Object.create(null); } Scope.prototype = { addDeclaration(node, kind) { for (const identifier of extractNames(node)) { const name = identifier.name; const declaration = { name, node: identifier, kind, instances: [] }; this.declarations[name] = declaration; if (this.isBlockScope) { if (!this.functionScope.blockScopedDeclarations[name]) this.functionScope.blockScopedDeclarations[name] = []; this.functionScope.blockScopedDeclarations[name].push(declaration); } } }, addReference(identifier) { if (this.consolidated) { this.consolidateReference(identifier); } else { this.identifiers.push(identifier); } }, consolidate() { for (let i = 0; i < this.identifiers.length; i += 1) { // we might push to the array during consolidation, so don't cache length const identifier = this.identifiers[i]; this.consolidateReference(identifier); } this.consolidated = true; // TODO understand why this is necessary... seems bad }, consolidateReference(identifier) { const declaration = this.declarations[identifier.name]; if (declaration) { declaration.instances.push(identifier); } else { this.references[identifier.name] = true; if (this.parent) this.parent.addReference(identifier); } }, contains(name) { return ( this.declarations[name] || (this.parent ? this.parent.contains(name) : false) ); }, createIdentifier(base) { if (typeof base === 'number') base = base.toString(); base = base .replace(/\s/g, '') .replace(/\[([^\]]+)\]/g, '_$1') .replace(/[^a-zA-Z0-9_$]/g, '_') .replace(/_{2,}/, '_'); let name = base; let counter = 1; while ( this.declarations[name] || this.references[name] || this.aliases[name] || name in reserved ) { name = `${base}$${counter++}`; } this.aliases[name] = true; return name; }, createDeclaration(base) { const id = this.createIdentifier(base); this.createDeclarationCallback(id); return id; }, findDeclaration(name) { return ( this.declarations[name] || (this.parent && this.parent.findDeclaration(name)) ); }, // Sometimes, block scope declarations change name during transpilation resolveName(name) { const declaration = this.findDeclaration(name); return declaration ? declaration.name : name; } }; buble-0.19.3/src/program/extractNames.js000066400000000000000000000013001324054410700201210ustar00rootroot00000000000000export default function extractNames(node) { const names = []; extractors[node.type](names, node); return names; } const extractors = { Identifier(names, node) { names.push(node); }, ObjectPattern(names, node) { for (const prop of node.properties) { extractors[prop.type](names, prop); } }, Property(names, node) { extractors[node.value.type](names, node.value); }, ArrayPattern(names, node) { for (const element of node.elements) { if (element) extractors[element.type](names, element); } }, RestElement(names, node) { extractors[node.argument.type](names, node.argument); }, AssignmentPattern(names, node) { extractors[node.left.type](names, node.left); } }; buble-0.19.3/src/program/keys.js000066400000000000000000000000651324054410700164450ustar00rootroot00000000000000export default { Program: ['body'], Literal: [] }; buble-0.19.3/src/program/types/000077500000000000000000000000001324054410700162775ustar00rootroot00000000000000buble-0.19.3/src/program/types/ArrayExpression.js000066400000000000000000000034461324054410700220020ustar00rootroot00000000000000import Node from '../Node.js'; import spread, { isArguments } from '../../utils/spread.js'; export default class ArrayExpression extends Node { initialise(transforms) { if (transforms.spreadRest && this.elements.length) { const lexicalBoundary = this.findLexicalBoundary(); let i = this.elements.length; while (i--) { const element = this.elements[i]; if ( element && element.type === 'SpreadElement' && isArguments(element.argument) ) { this.argumentsArrayAlias = lexicalBoundary.getArgumentsArrayAlias(); } } } super.initialise(transforms); } transpile(code, transforms) { super.transpile(code, transforms); if (transforms.spreadRest) { // erase trailing comma after last array element if not an array hole if (this.elements.length) { let lastElement = this.elements[this.elements.length - 1]; if ( lastElement && /\s*,/.test(code.original.slice(lastElement.end, this.end)) ) { code.overwrite(lastElement.end, this.end - 1, ' '); } } if (this.elements.length === 1) { const element = this.elements[0]; if (element && element.type === 'SpreadElement') { // special case – [ ...arguments ] if (isArguments(element.argument)) { code.overwrite( this.start, this.end, `[].concat( ${this.argumentsArrayAlias} )` ); // TODO if this is the only use of argsArray, don't bother concating } else { code.overwrite(this.start, element.argument.start, '[].concat( '); code.overwrite(element.end, this.end, ' )'); } } } else { const hasSpreadElements = spread( code, this.elements, this.start, this.argumentsArrayAlias ); if (hasSpreadElements) { code.overwrite(this.end - 1, this.end, ')'); } } } } } buble-0.19.3/src/program/types/ArrowFunctionExpression.js000066400000000000000000000026461324054410700235250ustar00rootroot00000000000000import Node from '../Node.js'; import removeTrailingComma from '../../utils/removeTrailingComma.js'; export default class ArrowFunctionExpression extends Node { initialise(transforms) { this.body.createScope(); super.initialise(transforms); } transpile(code, transforms) { const naked = this.params.length === 1 && this.start === this.params[0].start; if (transforms.arrow || this.needsArguments(transforms)) { // remove arrow let charIndex = this.body.start; while (code.original[charIndex] !== '=') { charIndex -= 1; } code.remove(charIndex, this.body.start); super.transpile(code, transforms); // wrap naked parameter if (naked) { code.prependRight(this.params[0].start, '('); code.appendLeft(this.params[0].end, ')'); } // add function if (this.parent && this.parent.type === 'ExpressionStatement') { // standalone expression statement code.prependRight(this.start, '!function'); } else { code.prependRight(this.start, 'function '); } } else { super.transpile(code, transforms); } if (transforms.trailingFunctionCommas && this.params.length && !naked) { removeTrailingComma(code, this.params[this.params.length - 1].end); } } // Returns whether any transforms that will happen use `arguments` needsArguments(transforms) { return ( transforms.spreadRest && this.params.filter(param => param.type === 'RestElement').length > 0 ); } } buble-0.19.3/src/program/types/AssignmentExpression.js000066400000000000000000000125601324054410700230310ustar00rootroot00000000000000import Node from '../Node.js'; import checkConst from '../../utils/checkConst.js'; import destructure from '../../utils/destructure.js'; export default class AssignmentExpression extends Node { initialise(transforms) { if (this.left.type === 'Identifier') { const declaration = this.findScope(false).findDeclaration(this.left.name); // special case – https://gitlab.com/Rich-Harris/buble/issues/11 const statement = declaration && declaration.node.ancestor(3); if ( statement && statement.type === 'ForStatement' && statement.body.contains(this) ) { statement.reassigned[this.left.name] = true; } } super.initialise(transforms); } transpile(code, transforms) { if (this.left.type === 'Identifier') { // Do this check after everything has been initialized to find // shadowing declarations after this expression checkConst(this.left, this.findScope(false)); } if (this.operator === '**=' && transforms.exponentiation) { this.transpileExponentiation(code, transforms); } else if (/Pattern/.test(this.left.type) && transforms.destructuring) { this.transpileDestructuring(code, transforms); } super.transpile(code, transforms); } transpileDestructuring(code) { const writeScope = this.findScope(true); const lookupScope = this.findScope(false); const assign = writeScope.createDeclaration('assign'); code.appendRight(this.left.end, `(${assign}`); code.appendLeft(this.right.end, ', '); const statementGenerators = []; destructure( code, id => writeScope.createDeclaration(id), node => { const name = lookupScope.resolveName(node.name); checkConst(node, lookupScope); return name; }, this.left, assign, true, statementGenerators ); let suffix = ', '; statementGenerators.forEach((fn, j) => { if (j === statementGenerators.length - 1) { suffix = ''; } fn(this.end, '', suffix); }); if (this.unparenthesizedParent().type === 'ExpressionStatement') { // no rvalue needed for expression statement code.appendRight(this.end, `)`); } else { // destructuring is part of an expression - need an rvalue code.appendRight(this.end, `, ${assign})`); } } transpileExponentiation(code) { const scope = this.findScope(false); // first, the easy part – `**=` -> `=` let charIndex = this.left.end; while (code.original[charIndex] !== '*') charIndex += 1; code.remove(charIndex, charIndex + 2); // how we do the next part depends on a number of factors – whether // this is a top-level statement, and whether we're updating a // simple or complex reference let base; const left = this.left.unparenthesize(); if (left.type === 'Identifier') { base = scope.resolveName(left.name); } else if (left.type === 'MemberExpression') { let object; let needsObjectVar = false; let property; let needsPropertyVar = false; const statement = this.findNearest(/(?:Statement|Declaration)$/); const i0 = statement.getIndentation(); if (left.property.type === 'Identifier') { property = left.computed ? scope.resolveName(left.property.name) : left.property.name; } else { property = scope.createDeclaration('property'); needsPropertyVar = true; } if (left.object.type === 'Identifier') { object = scope.resolveName(left.object.name); } else { object = scope.createDeclaration('object'); needsObjectVar = true; } if (left.start === statement.start) { if (needsObjectVar && needsPropertyVar) { code.prependRight(statement.start, `${object} = `); code.overwrite( left.object.end, left.property.start, `;\n${i0}${property} = ` ); code.overwrite( left.property.end, left.end, `;\n${i0}${object}[${property}]` ); } else if (needsObjectVar) { code.prependRight(statement.start, `${object} = `); code.appendLeft(left.object.end, `;\n${i0}`); code.appendLeft(left.object.end, object); } else if (needsPropertyVar) { code.prependRight(left.property.start, `${property} = `); code.appendLeft(left.property.end, `;\n${i0}`); code.move(left.property.start, left.property.end, this.start); code.appendLeft(left.object.end, `[${property}]`); code.remove(left.object.end, left.property.start); code.remove(left.property.end, left.end); } } else { if (needsObjectVar && needsPropertyVar) { code.prependRight(left.start, `( ${object} = `); code.overwrite( left.object.end, left.property.start, `, ${property} = ` ); code.overwrite( left.property.end, left.end, `, ${object}[${property}]` ); } else if (needsObjectVar) { code.prependRight(left.start, `( ${object} = `); code.appendLeft(left.object.end, `, ${object}`); } else if (needsPropertyVar) { code.prependRight(left.property.start, `( ${property} = `); code.appendLeft(left.property.end, `, `); code.move(left.property.start, left.property.end, left.start); code.overwrite(left.object.end, left.property.start, `[${property}]`); code.remove(left.property.end, left.end); } if (needsPropertyVar) { code.appendLeft(this.end, ` )`); } } base = object + (left.computed || needsPropertyVar ? `[${property}]` : `.${property}`); } code.prependRight(this.right.start, `Math.pow( ${base}, `); code.appendLeft(this.right.end, ` )`); } } buble-0.19.3/src/program/types/BinaryExpression.js000066400000000000000000000005551324054410700221460ustar00rootroot00000000000000import Node from '../Node.js'; export default class BinaryExpression extends Node { transpile(code, transforms) { if (this.operator === '**' && transforms.exponentiation) { code.prependRight(this.start, `Math.pow( `); code.overwrite(this.left.end, this.right.start, `, `); code.appendLeft(this.end, ` )`); } super.transpile(code, transforms); } } buble-0.19.3/src/program/types/BreakStatement.js000066400000000000000000000013301324054410700215430ustar00rootroot00000000000000import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; import { loopStatement } from '../../utils/patterns.js'; export default class BreakStatement extends Node { initialise() { const loop = this.findNearest(loopStatement); const switchCase = this.findNearest('SwitchCase'); if (loop && (!switchCase || loop.depth > switchCase.depth)) { loop.canBreak = true; this.loop = loop; } } transpile(code) { if (this.loop && this.loop.shouldRewriteAsFunction) { if (this.label) throw new CompileError( 'Labels are not currently supported in a loop with locally-scoped variables', this ); code.overwrite(this.start, this.start + 5, `return 'break'`); } } } buble-0.19.3/src/program/types/CallExpression.js000066400000000000000000000055671324054410700216050ustar00rootroot00000000000000import Node from '../Node.js'; import spread, { isArguments } from '../../utils/spread.js'; import removeTrailingComma from '../../utils/removeTrailingComma.js'; export default class CallExpression extends Node { initialise(transforms) { if (transforms.spreadRest && this.arguments.length > 1) { const lexicalBoundary = this.findLexicalBoundary(); let i = this.arguments.length; while (i--) { const arg = this.arguments[i]; if (arg.type === 'SpreadElement' && isArguments(arg.argument)) { this.argumentsArrayAlias = lexicalBoundary.getArgumentsArrayAlias(); } } } super.initialise(transforms); } transpile(code, transforms) { if (transforms.spreadRest && this.arguments.length) { let hasSpreadElements = false; let context; const firstArgument = this.arguments[0]; if (this.arguments.length === 1) { if (firstArgument.type === 'SpreadElement') { code.remove(firstArgument.start, firstArgument.argument.start); hasSpreadElements = true; } } else { hasSpreadElements = spread( code, this.arguments, firstArgument.start, this.argumentsArrayAlias ); } if (hasSpreadElements) { // we need to handle super() and super.method() differently // due to its instance let _super = null; if (this.callee.type === 'Super') { _super = this.callee; } else if ( this.callee.type === 'MemberExpression' && this.callee.object.type === 'Super' ) { _super = this.callee.object; } if (!_super && this.callee.type === 'MemberExpression') { if (this.callee.object.type === 'Identifier') { context = this.callee.object.name; } else { context = this.findScope(true).createDeclaration('ref'); const callExpression = this.callee.object; code.prependRight(callExpression.start, `(${context} = `); code.appendLeft(callExpression.end, `)`); } } else { context = 'void 0'; } code.appendLeft(this.callee.end, '.apply'); if (_super) { _super.noCall = true; // bit hacky... if (this.arguments.length > 1) { if (firstArgument.type !== 'SpreadElement') { code.prependRight(firstArgument.start, `[ `); } code.appendLeft( this.arguments[this.arguments.length - 1].end, ' )' ); } } else if (this.arguments.length === 1) { code.prependRight(firstArgument.start, `${context}, `); } else { if (firstArgument.type === 'SpreadElement') { code.appendLeft(firstArgument.start, `${context}, `); } else { code.appendLeft(firstArgument.start, `${context}, [ `); } code.appendLeft(this.arguments[this.arguments.length - 1].end, ' )'); } } } if (transforms.trailingFunctionCommas && this.arguments.length) { removeTrailingComma(code, this.arguments[this.arguments.length - 1].end); } super.transpile(code, transforms); } } buble-0.19.3/src/program/types/ClassBody.js000066400000000000000000000150431324054410700205230ustar00rootroot00000000000000import Node from '../Node.js'; import { findIndex } from '../../utils/array.js'; import reserved from '../../utils/reserved.js'; // TODO this code is pretty wild, tidy it up export default class ClassBody extends Node { transpile(code, transforms, inFunctionExpression, superName) { if (transforms.classes) { const name = this.parent.name; const indentStr = code.getIndentString(); const i0 = this.getIndentation() + (inFunctionExpression ? indentStr : ''); const i1 = i0 + indentStr; const constructorIndex = findIndex( this.body, node => node.kind === 'constructor' ); const constructor = this.body[constructorIndex]; let introBlock = ''; let outroBlock = ''; if (this.body.length) { code.remove(this.start, this.body[0].start); code.remove(this.body[this.body.length - 1].end, this.end); } else { code.remove(this.start, this.end); } if (constructor) { constructor.value.body.isConstructorBody = true; const previousMethod = this.body[constructorIndex - 1]; const nextMethod = this.body[constructorIndex + 1]; // ensure constructor is first if (constructorIndex > 0) { code.remove(previousMethod.end, constructor.start); code.move( constructor.start, nextMethod ? nextMethod.start : this.end - 1, this.body[0].start ); } if (!inFunctionExpression) code.appendLeft(constructor.end, ';'); } let namedFunctions = this.program.options.namedFunctionExpressions !== false; let namedConstructor = namedFunctions || this.parent.superClass || this.parent.type !== 'ClassDeclaration'; if (this.parent.superClass) { let inheritanceBlock = `if ( ${superName} ) ${name}.__proto__ = ${ superName };\n${i0}${name}.prototype = Object.create( ${superName} && ${ superName }.prototype );\n${i0}${name}.prototype.constructor = ${name};`; if (constructor) { introBlock += `\n\n${i0}` + inheritanceBlock; } else { const fn = `function ${name} () {` + (superName ? `\n${i1}${superName}.apply(this, arguments);\n${i0}}` : `}`) + (inFunctionExpression ? '' : ';') + (this.body.length ? `\n\n${i0}` : ''); inheritanceBlock = fn + inheritanceBlock; introBlock += inheritanceBlock + `\n\n${i0}`; } } else if (!constructor) { let fn = 'function ' + (namedConstructor ? name + ' ' : '') + '() {}'; if (this.parent.type === 'ClassDeclaration') fn += ';'; if (this.body.length) fn += `\n\n${i0}`; introBlock += fn; } const scope = this.findScope(false); let prototypeGettersAndSetters = []; let staticGettersAndSetters = []; let prototypeAccessors; let staticAccessors; this.body.forEach((method, i) => { if (method.kind === 'constructor') { let constructorName = namedConstructor ? ' ' + name : ''; code.overwrite( method.key.start, method.key.end, `function${constructorName}` ); return; } if (method.static) { const len = code.original[method.start + 6] == ' ' ? 7 : 6; code.remove(method.start, method.start + len); } const isAccessor = method.kind !== 'method'; let lhs; let methodName = method.key.name; if ( reserved[methodName] || method.value.body.scope.references[methodName] ) { methodName = scope.createIdentifier(methodName); } // when method name is a string or a number let's pretend it's a computed method let fake_computed = false; if (!method.computed && method.key.type === 'Literal') { fake_computed = true; method.computed = true; } if (isAccessor) { if (method.computed) { throw new Error( 'Computed accessor properties are not currently supported' ); } code.remove(method.start, method.key.start); if (method.static) { if (!~staticGettersAndSetters.indexOf(method.key.name)) staticGettersAndSetters.push(method.key.name); if (!staticAccessors) staticAccessors = scope.createIdentifier('staticAccessors'); lhs = `${staticAccessors}`; } else { if (!~prototypeGettersAndSetters.indexOf(method.key.name)) prototypeGettersAndSetters.push(method.key.name); if (!prototypeAccessors) prototypeAccessors = scope.createIdentifier('prototypeAccessors'); lhs = `${prototypeAccessors}`; } } else { lhs = method.static ? `${name}` : `${name}.prototype`; } if (!method.computed) lhs += '.'; const insertNewlines = (constructorIndex > 0 && i === constructorIndex + 1) || (i === 0 && constructorIndex === this.body.length - 1); if (insertNewlines) lhs = `\n\n${i0}${lhs}`; let c = method.key.end; if (method.computed) { if (fake_computed) { code.prependRight(method.key.start, '['); code.appendLeft(method.key.end, ']'); } else { while (code.original[c] !== ']') c += 1; c += 1; } } const funcName = method.computed || isAccessor || !namedFunctions ? '' : `${methodName} `; const rhs = (isAccessor ? `.${method.kind}` : '') + ` = function` + (method.value.generator ? '* ' : ' ') + funcName; code.remove(c, method.value.start); code.prependRight(method.value.start, rhs); code.appendLeft(method.end, ';'); if (method.value.generator) code.remove(method.start, method.key.start); code.prependRight(method.start, lhs); }); if (prototypeGettersAndSetters.length || staticGettersAndSetters.length) { let intro = []; let outro = []; if (prototypeGettersAndSetters.length) { intro.push( `var ${prototypeAccessors} = { ${prototypeGettersAndSetters .map(name => `${name}: { configurable: true }`) .join(',')} };` ); outro.push( `Object.defineProperties( ${name}.prototype, ${ prototypeAccessors } );` ); } if (staticGettersAndSetters.length) { intro.push( `var ${staticAccessors} = { ${staticGettersAndSetters .map(name => `${name}: { configurable: true }`) .join(',')} };` ); outro.push(`Object.defineProperties( ${name}, ${staticAccessors} );`); } if (constructor) introBlock += `\n\n${i0}`; introBlock += intro.join(`\n${i0}`); if (!constructor) introBlock += `\n\n${i0}`; outroBlock += `\n\n${i0}` + outro.join(`\n${i0}`); } if (constructor) { code.appendLeft(constructor.end, introBlock); } else { code.prependRight(this.start, introBlock); } code.appendLeft(this.end, outroBlock); } super.transpile(code, transforms); } } buble-0.19.3/src/program/types/ClassDeclaration.js000066400000000000000000000044011324054410700220470ustar00rootroot00000000000000import Node from '../Node.js'; import deindent from '../../utils/deindent.js'; export default class ClassDeclaration extends Node { initialise(transforms) { if (this.id) { this.name = this.id.name; this.findScope(true).addDeclaration(this.id, 'class'); } else { this.name = this.findScope(true).createIdentifier("defaultExport"); } super.initialise(transforms); } transpile(code, transforms) { if (transforms.classes) { if (!this.superClass) deindent(this.body, code); const superName = this.superClass && (this.superClass.name || 'superclass'); const i0 = this.getIndentation(); const i1 = i0 + code.getIndentString(); // if this is an export default statement, we have to move the export to // after the declaration, because `export default var Foo = ...` is illegal const isExportDefaultDeclaration = this.parent.type === 'ExportDefaultDeclaration'; if (isExportDefaultDeclaration) { code.remove(this.parent.start, this.start); } let c = this.start; if (this.id) { code.overwrite(c, this.id.start, 'var '); c = this.id.end; } else { code.prependLeft(c, `var ${this.name}`); } if (this.superClass) { if (this.superClass.end === this.body.start) { code.remove(c, this.superClass.start); code.appendLeft(c, ` = (function (${superName}) {\n${i1}`); } else { code.overwrite(c, this.superClass.start, ' = '); code.overwrite( this.superClass.end, this.body.start, `(function (${superName}) {\n${i1}` ); } } else { if (c === this.body.start) { code.appendLeft(c, ' = '); } else { code.overwrite(c, this.body.start, ' = '); } } this.body.transpile(code, transforms, !!this.superClass, superName); const syntheticDefaultExport = isExportDefaultDeclaration ? `\n\n${i0}export default ${this.name};` : ''; if (this.superClass) { code.appendLeft(this.end, `\n\n${i1}return ${this.name};\n${i0}}(`); code.move(this.superClass.start, this.superClass.end, this.end); code.prependRight(this.end, `));${syntheticDefaultExport}`); } else if (syntheticDefaultExport) { code.prependRight(this.end, syntheticDefaultExport); } } else { this.body.transpile(code, transforms, false, null); } } } buble-0.19.3/src/program/types/ClassExpression.js000066400000000000000000000030011324054410700217540ustar00rootroot00000000000000import Node from '../Node.js'; export default class ClassExpression extends Node { initialise(transforms) { this.name = ( this.id ? this.id.name : this.parent.type === 'VariableDeclarator' ? this.parent.id.name : this.parent.type !== 'AssignmentExpression' ? null : this.parent.left.type === 'Identifier' ? this.parent.left.name : this.parent.left.type === 'MemberExpression' ? this.parent.left.property.name : null ) || this.findScope(true).createIdentifier('anonymous'); super.initialise(transforms); } transpile(code, transforms) { if (transforms.classes) { const superName = this.superClass && (this.superClass.name || 'superclass'); const i0 = this.getIndentation(); const i1 = i0 + code.getIndentString(); if (this.superClass) { code.remove(this.start, this.superClass.start); code.remove(this.superClass.end, this.body.start); code.appendLeft(this.start, `(function (${superName}) {\n${i1}`); } else { code.overwrite(this.start, this.body.start, `(function () {\n${i1}`); } this.body.transpile(code, transforms, true, superName); const outro = `\n\n${i1}return ${this.name};\n${i0}}(`; if (this.superClass) { code.appendLeft(this.end, outro); code.move(this.superClass.start, this.superClass.end, this.end); code.prependRight(this.end, '))'); } else { code.appendLeft(this.end, `\n\n${i1}return ${this.name};\n${i0}}())`); } } else { this.body.transpile(code, transforms, false); } } } buble-0.19.3/src/program/types/ContinueStatement.js000066400000000000000000000010051324054410700223020ustar00rootroot00000000000000import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; import { loopStatement } from '../../utils/patterns.js'; export default class ContinueStatement extends Node { transpile(code) { const loop = this.findNearest(loopStatement); if (loop.shouldRewriteAsFunction) { if (this.label) throw new CompileError( 'Labels are not currently supported in a loop with locally-scoped variables', this ); code.overwrite(this.start, this.start + 8, 'return'); } } } buble-0.19.3/src/program/types/ExportDefaultDeclaration.js000066400000000000000000000004571324054410700235770ustar00rootroot00000000000000import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; export default class ExportDefaultDeclaration extends Node { initialise(transforms) { if (transforms.moduleExport) throw new CompileError('export is not supported', this); super.initialise(transforms); } } buble-0.19.3/src/program/types/ExportNamedDeclaration.js000066400000000000000000000004551324054410700232350ustar00rootroot00000000000000import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; export default class ExportNamedDeclaration extends Node { initialise(transforms) { if (transforms.moduleExport) throw new CompileError('export is not supported', this); super.initialise(transforms); } } buble-0.19.3/src/program/types/ForInStatement.js000066400000000000000000000037161324054410700215460ustar00rootroot00000000000000import LoopStatement from './shared/LoopStatement.js'; import destructure from '../../utils/destructure.js'; import extractNames from '../extractNames.js'; export default class ForInStatement extends LoopStatement { findScope(functionScope) { return functionScope || !this.createdScope ? this.parent.findScope(functionScope) : this.body.scope; } transpile(code, transforms) { const hasDeclaration = this.left.type === 'VariableDeclaration'; if (this.shouldRewriteAsFunction) { // which variables are declared in the init statement? const names = hasDeclaration ? [].concat.apply( [], this.left.declarations.map(declarator => extractNames(declarator.id) ) ) : []; this.args = names.map( name => (name in this.aliases ? this.aliases[name].outer : name) ); this.params = names.map( name => (name in this.aliases ? this.aliases[name].inner : name) ); } super.transpile(code, transforms); const maybePattern = hasDeclaration ? this.left.declarations[0].id : this.left; if (maybePattern.type !== 'Identifier') { this.destructurePattern(code, maybePattern, hasDeclaration); } } destructurePattern(code, pattern, isDeclaration) { const scope = this.findScope(true); const i0 = this.getIndentation(); const i1 = i0 + code.getIndentString(); const ref = scope.createIdentifier('ref'); const bodyStart = this.body.body.length ? this.body.body[0].start : this.body.start + 1; code.move(pattern.start, pattern.end, bodyStart); code.prependRight(pattern.end, isDeclaration ? ref : `var ${ref}`); let statementGenerators = []; destructure( code, id => scope.createIdentifier(id), ({ name }) => scope.resolveName(name), pattern, ref, false, statementGenerators ); let suffix = `;\n${i1}`; statementGenerators.forEach((fn, i) => { if (i === statementGenerators.length - 1) { suffix = `;\n\n${i1}`; } fn(bodyStart, '', suffix); }); } } buble-0.19.3/src/program/types/ForOfStatement.js000066400000000000000000000052041324054410700215360ustar00rootroot00000000000000import LoopStatement from './shared/LoopStatement.js'; import CompileError from '../../utils/CompileError.js'; import destructure from '../../utils/destructure.js'; export default class ForOfStatement extends LoopStatement { initialise(transforms) { if (transforms.forOf && !transforms.dangerousForOf) throw new CompileError( "for...of statements are not supported. Use `transforms: { forOf: false }` to skip transformation and disable this error, or `transforms: { dangerousForOf: true }` if you know what you're doing", this ); super.initialise(transforms); } transpile(code, transforms) { super.transpile(code, transforms); if (!transforms.dangerousForOf) return; // edge case (#80) if (!this.body.body[0]) { if ( this.left.type === 'VariableDeclaration' && this.left.kind === 'var' ) { code.remove(this.start, this.left.start); code.appendLeft(this.left.end, ';'); code.remove(this.left.end, this.end); } else { code.remove(this.start, this.end); } return; } const scope = this.findScope(true); const i0 = this.getIndentation(); const i1 = i0 + code.getIndentString(); const key = scope.createIdentifier('i'); const list = scope.createIdentifier('list'); if (this.body.synthetic) { code.prependRight(this.left.start, `{\n${i1}`); code.appendLeft(this.body.body[0].end, `\n${i0}}`); } const bodyStart = this.body.body[0].start; code.remove(this.left.end, this.right.start); code.move(this.left.start, this.left.end, bodyStart); code.prependRight(this.right.start, `var ${key} = 0, ${list} = `); code.appendLeft(this.right.end, `; ${key} < ${list}.length; ${key} += 1`); const isDeclaration = this.left.type === 'VariableDeclaration'; const maybeDestructuring = isDeclaration ? this.left.declarations[0].id : this.left; if (maybeDestructuring.type !== 'Identifier') { let statementGenerators = []; const ref = scope.createIdentifier('ref'); destructure( code, id => scope.createIdentifier(id), ({ name }) => scope.resolveName(name), maybeDestructuring, ref, !isDeclaration, statementGenerators ); let suffix = `;\n${i1}`; statementGenerators.forEach((fn, i) => { if (i === statementGenerators.length - 1) { suffix = `;\n\n${i1}`; } fn(bodyStart, '', suffix); }); if (isDeclaration) { code.appendLeft(this.left.start + this.left.kind.length + 1, ref); code.appendLeft(this.left.end, ` = ${list}[${key}];\n${i1}`); } else { code.appendLeft(this.left.end, `var ${ref} = ${list}[${key}];\n${i1}`); } } else { code.appendLeft(this.left.end, ` = ${list}[${key}];\n\n${i1}`); } } } buble-0.19.3/src/program/types/ForStatement.js000066400000000000000000000026261324054410700212560ustar00rootroot00000000000000import LoopStatement from './shared/LoopStatement.js'; import extractNames from '../extractNames.js'; export default class ForStatement extends LoopStatement { findScope(functionScope) { return functionScope || !this.createdScope ? this.parent.findScope(functionScope) : this.body.scope; } transpile(code, transforms) { const i1 = this.getIndentation() + code.getIndentString(); if (this.shouldRewriteAsFunction) { // which variables are declared in the init statement? const names = this.init.type === 'VariableDeclaration' ? [].concat.apply( [], this.init.declarations.map(declarator => extractNames(declarator.id) ) ) : []; const aliases = this.aliases; this.args = names.map( name => (name in this.aliases ? this.aliases[name].outer : name) ); this.params = names.map( name => (name in this.aliases ? this.aliases[name].inner : name) ); const updates = Object.keys(this.reassigned).map( name => `${aliases[name].outer} = ${aliases[name].inner};` ); if (updates.length) { if (this.body.synthetic) { code.appendLeft(this.body.body[0].end, `; ${updates.join(` `)}`); } else { const lastStatement = this.body.body[this.body.body.length - 1]; code.appendLeft( lastStatement.end, `\n\n${i1}${updates.join(`\n${i1}`)}` ); } } } super.transpile(code, transforms); } } buble-0.19.3/src/program/types/FunctionDeclaration.js000066400000000000000000000013151324054410700225700ustar00rootroot00000000000000import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; import removeTrailingComma from '../../utils/removeTrailingComma.js'; export default class FunctionDeclaration extends Node { initialise(transforms) { if (this.generator && transforms.generator) { throw new CompileError('Generators are not supported', this); } this.body.createScope(); if (this.id) { this.findScope(true).addDeclaration(this.id, 'function'); } super.initialise(transforms); } transpile(code, transforms) { super.transpile(code, transforms); if (transforms.trailingFunctionCommas && this.params.length) { removeTrailingComma(code, this.params[this.params.length - 1].end); } } } buble-0.19.3/src/program/types/FunctionExpression.js000066400000000000000000000037221324054410700225060ustar00rootroot00000000000000import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; import removeTrailingComma from '../../utils/removeTrailingComma.js'; export default class FunctionExpression extends Node { initialise(transforms) { if (this.generator && transforms.generator) { throw new CompileError('Generators are not supported', this); } this.body.createScope(); if (this.id) { // function expression IDs belong to the child scope... this.body.scope.addDeclaration(this.id, 'function'); } super.initialise(transforms); const parent = this.parent; let methodName; if ( transforms.conciseMethodProperty && parent.type === 'Property' && parent.kind === 'init' && parent.method && parent.key.type === 'Identifier' ) { // object literal concise method methodName = parent.key.name; } else if ( transforms.classes && parent.type === 'MethodDefinition' && parent.kind === 'method' && parent.key.type === 'Identifier' ) { // method definition in a class methodName = parent.key.name; } else if (this.id && this.id.type === 'Identifier') { // naked function expression methodName = this.id.alias || this.id.name; } if (methodName) { for (const param of this.params) { if (param.type === 'Identifier' && methodName === param.name) { // workaround for Safari 9/WebKit bug: // https://gitlab.com/Rich-Harris/buble/issues/154 // change parameter name when same as method name const scope = this.body.scope; const declaration = scope.declarations[methodName]; const alias = scope.createIdentifier(methodName); param.alias = alias; for (const identifier of declaration.instances) { identifier.alias = alias; } break; } } } } transpile(code, transforms) { super.transpile(code, transforms); if (transforms.trailingFunctionCommas && this.params.length) { removeTrailingComma(code, this.params[this.params.length - 1].end); } } } buble-0.19.3/src/program/types/Identifier.js000066400000000000000000000025221324054410700207200ustar00rootroot00000000000000import Node from '../Node.js'; import isReference from '../../utils/isReference.js'; import { loopStatement } from '../../utils/patterns.js'; export default class Identifier extends Node { findScope(functionScope) { if (this.parent.params && ~this.parent.params.indexOf(this)) { return this.parent.body.scope; } if (this.parent.type === 'FunctionExpression' && this === this.parent.id) { return this.parent.body.scope; } return this.parent.findScope(functionScope); } initialise(transforms) { if (isReference(this, this.parent)) { if ( transforms.arrow && this.name === 'arguments' && !this.findScope(false).contains(this.name) ) { const lexicalBoundary = this.findLexicalBoundary(); const arrowFunction = this.findNearest('ArrowFunctionExpression'); const loop = this.findNearest(loopStatement); if (arrowFunction && arrowFunction.depth > lexicalBoundary.depth) { this.alias = lexicalBoundary.getArgumentsAlias(); } if ( loop && loop.body.contains(this) && loop.depth > lexicalBoundary.depth ) { this.alias = lexicalBoundary.getArgumentsAlias(); } } this.findScope(false).addReference(this); } } transpile(code) { if (this.alias) { code.overwrite(this.start, this.end, this.alias, { storeName: true, contentOnly: true }); } } } buble-0.19.3/src/program/types/IfStatement.js000066400000000000000000000013661324054410700210660ustar00rootroot00000000000000import Node from '../Node.js'; export default class IfStatement extends Node { initialise(transforms) { super.initialise(transforms); } transpile(code, transforms) { if ( this.consequent.type !== 'BlockStatement' || (this.consequent.type === 'BlockStatement' && this.consequent.synthetic) ) { code.appendLeft(this.consequent.start, '{ '); code.prependRight(this.consequent.end, ' }'); } if ( this.alternate && this.alternate.type !== 'IfStatement' && (this.alternate.type !== 'BlockStatement' || (this.alternate.type === 'BlockStatement' && this.alternate.synthetic)) ) { code.appendLeft(this.alternate.start, '{ '); code.prependRight(this.alternate.end, ' }'); } super.transpile(code, transforms); } } buble-0.19.3/src/program/types/ImportDeclaration.js000066400000000000000000000004501324054410700222540ustar00rootroot00000000000000import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; export default class ImportDeclaration extends Node { initialise(transforms) { if (transforms.moduleImport) throw new CompileError('import is not supported', this); super.initialise(transforms); } } buble-0.19.3/src/program/types/ImportDefaultSpecifier.js000066400000000000000000000003271324054410700232500ustar00rootroot00000000000000import Node from '../Node.js'; export default class ImportDefaultSpecifier extends Node { initialise(transforms) { this.findScope(true).addDeclaration(this.local, 'import'); super.initialise(transforms); } } buble-0.19.3/src/program/types/ImportSpecifier.js000066400000000000000000000003201324054410700217340ustar00rootroot00000000000000import Node from '../Node.js'; export default class ImportSpecifier extends Node { initialise(transforms) { this.findScope(true).addDeclaration(this.local, 'import'); super.initialise(transforms); } } buble-0.19.3/src/program/types/JSXAttribute.js000066400000000000000000000010241324054410700211620ustar00rootroot00000000000000import Node from '../Node.js'; const hasDashes = val => /-/.test(val); const formatKey = key => (hasDashes(key) ? `'${key}'` : key); const formatVal = val => (val ? '' : 'true'); export default class JSXAttribute extends Node { transpile(code, transforms) { const { start, name } = this.name; // Overwrite equals sign if value is present. const end = this.value ? this.value.start : this.name.end; code.overwrite(start, end, `${formatKey(name)}: ${formatVal(this.value)}`); super.transpile(code, transforms); } } buble-0.19.3/src/program/types/JSXClosingElement.js000066400000000000000000000012711324054410700221330ustar00rootroot00000000000000import Node from '../Node.js'; function containsNewLine(node) { return ( node.type === 'JSXText' && !/\S/.test(node.value) && /\n/.test(node.value) ); } export default class JSXClosingElement extends Node { transpile(code) { let spaceBeforeParen = true; const lastChild = this.parent.children[this.parent.children.length - 1]; // omit space before closing paren if // a) this is on a separate line, or // b) there are no children but there are attributes if ( (lastChild && containsNewLine(lastChild)) || this.parent.openingElement.attributes.length ) { spaceBeforeParen = false; } code.overwrite(this.start, this.end, spaceBeforeParen ? ' )' : ')'); } } buble-0.19.3/src/program/types/JSXClosingFragment.js000066400000000000000000000010671324054410700223100ustar00rootroot00000000000000import Node from '../Node.js'; function containsNewLine(node) { return ( node.type === 'JSXText' && !/\S/.test(node.value) && /\n/.test(node.value) ); } export default class JSXClosingFragment extends Node { transpile(code) { let spaceBeforeParen = true; const lastChild = this.parent.children[this.parent.children.length - 1]; // omit space before closing paren if this is on a separate line if (lastChild && containsNewLine(lastChild)) { spaceBeforeParen = false; } code.overwrite(this.start, this.end, spaceBeforeParen ? ' )' : ')'); } } buble-0.19.3/src/program/types/JSXElement.js000066400000000000000000000025661324054410700206240ustar00rootroot00000000000000import Node from '../Node.js'; function normalise(str, removeTrailingWhitespace) { str = str.replace(/\u00a0/g, ' '); if (removeTrailingWhitespace && /\n/.test(str)) { str = str.replace(/\s+$/, ''); } str = str .replace(/^\n\r?\s+/, '') // remove leading newline + space .replace(/\s*\n\r?\s*/gm, ' '); // replace newlines with spaces // TODO prefer single quotes? return JSON.stringify(str); } export default class JSXElement extends Node { transpile(code, transforms) { super.transpile(code, transforms); const children = this.children.filter(child => { if (child.type !== 'JSXText') return true; // remove whitespace-only literals, unless on a single line return /\S/.test(child.raw) || !/\n/.test(child.raw); }); if (children.length) { let c = this.openingElement.end; let i; for (i = 0; i < children.length; i += 1) { const child = children[i]; if ( child.type === 'JSXExpressionContainer' && child.expression.type === 'JSXEmptyExpression' ) { // empty block is a no op } else { const tail = code.original[c] === '\n' && child.type !== 'JSXText' ? '' : ' '; code.appendLeft(c, `,${tail}`); } if (child.type === 'JSXText') { const str = normalise(child.value, i === children.length - 1); code.overwrite(child.start, child.end, str); } c = child.end; } } } } buble-0.19.3/src/program/types/JSXExpressionContainer.js000066400000000000000000000004051324054410700232230ustar00rootroot00000000000000import Node from '../Node.js'; export default class JSXExpressionContainer extends Node { transpile(code, transforms) { code.remove(this.start, this.expression.start); code.remove(this.expression.end, this.end); super.transpile(code, transforms); } } buble-0.19.3/src/program/types/JSXFragment.js000066400000000000000000000001431324054410700207630ustar00rootroot00000000000000import JSXElement from './JSXElement.js'; export default class JSXFragment extends JSXElement { } buble-0.19.3/src/program/types/JSXOpeningElement.js000066400000000000000000000043601324054410700221360ustar00rootroot00000000000000import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; export default class JSXOpeningElement extends Node { transpile(code, transforms) { super.transpile(code, transforms); code.overwrite(this.start, this.name.start, `${this.program.jsx}( `); const html = this.name.type === 'JSXIdentifier' && this.name.name[0] === this.name.name[0].toLowerCase(); if (html) code.prependRight(this.name.start, `'`); const len = this.attributes.length; let c = this.name.end; if (len) { let i; let hasSpread = false; for (i = 0; i < len; i += 1) { if (this.attributes[i].type === 'JSXSpreadAttribute') { hasSpread = true; break; } } c = this.attributes[0].end; for (i = 0; i < len; i += 1) { const attr = this.attributes[i]; if (i > 0) { if (attr.start === c) code.prependRight(c, ', '); else code.overwrite(c, attr.start, ', '); } if (hasSpread && attr.type !== 'JSXSpreadAttribute') { const lastAttr = this.attributes[i - 1]; const nextAttr = this.attributes[i + 1]; if (!lastAttr || lastAttr.type === 'JSXSpreadAttribute') { code.prependRight(attr.start, '{ '); } if (!nextAttr || nextAttr.type === 'JSXSpreadAttribute') { code.appendLeft(attr.end, ' }'); } } c = attr.end; } let after; let before; if (hasSpread) { if (len === 1) { before = html ? `',` : ','; } else { if (!this.program.options.objectAssign) { throw new CompileError( "Mixed JSX attributes ending in spread requires specified objectAssign option with 'Object.assign' or polyfill helper.", this ); } before = html ? `', ${this.program.options.objectAssign}({},` : `, ${this.program.options.objectAssign}({},`; after = ')'; } } else { before = html ? `', {` : ', {'; after = ' }'; } code.prependRight(this.name.end, before); if (after) { code.appendLeft(this.attributes[len - 1].end, after); } } else { code.appendLeft(this.name.end, html ? `', null` : `, null`); c = this.name.end; } if (this.selfClosing) { code.overwrite(c, this.end, this.attributes.length ? `)` : ` )`); } else { code.remove(c, this.end); } } } buble-0.19.3/src/program/types/JSXOpeningFragment.js000066400000000000000000000003201324054410700223000ustar00rootroot00000000000000import Node from '../Node.js'; export default class JSXOpeningFragment extends Node { transpile(code, transforms) { code.overwrite(this.start, this.end, `${this.program.jsx}( React.Fragment, null`); } } buble-0.19.3/src/program/types/JSXSpreadAttribute.js000066400000000000000000000003751324054410700223310ustar00rootroot00000000000000import Node from '../Node.js'; export default class JSXSpreadAttribute extends Node { transpile(code, transforms) { code.remove(this.start, this.argument.start); code.remove(this.argument.end, this.end); super.transpile(code, transforms); } } buble-0.19.3/src/program/types/Literal.js000066400000000000000000000017741324054410700202420ustar00rootroot00000000000000import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; import rewritePattern from 'regexpu-core'; export default class Literal extends Node { initialise() { if (typeof this.value === 'string') { this.program.indentExclusionElements.push(this); } } transpile(code, transforms) { if (transforms.numericLiteral) { const leading = this.raw.slice(0, 2); if (leading === '0b' || leading === '0o') { code.overwrite(this.start, this.end, String(this.value), { storeName: true, contentOnly: true }); } } if (this.regex) { const { pattern, flags } = this.regex; if (transforms.stickyRegExp && /y/.test(flags)) throw new CompileError( 'Regular expression sticky flag is not supported', this ); if (transforms.unicodeRegExp && /u/.test(flags)) { code.overwrite( this.start, this.end, `/${rewritePattern(pattern, flags)}/${flags.replace('u', '')}`, { contentOnly: true } ); } } } } buble-0.19.3/src/program/types/MemberExpression.js000066400000000000000000000006061324054410700221260ustar00rootroot00000000000000import Node from '../Node.js'; import reserved from '../../utils/reserved.js'; export default class MemberExpression extends Node { transpile(code, transforms) { if (transforms.reservedProperties && reserved[this.property.name]) { code.overwrite(this.object.end, this.property.start, `['`); code.appendLeft(this.property.end, `']`); } super.transpile(code, transforms); } } buble-0.19.3/src/program/types/NewExpression.js000066400000000000000000000025321324054410700214500ustar00rootroot00000000000000import Node from '../Node.js'; import spread, { isArguments } from '../../utils/spread.js'; import removeTrailingComma from '../../utils/removeTrailingComma.js'; export default class NewExpression extends Node { initialise(transforms) { if (transforms.spreadRest && this.arguments.length) { const lexicalBoundary = this.findLexicalBoundary(); let i = this.arguments.length; while (i--) { const arg = this.arguments[i]; if (arg.type === 'SpreadElement' && isArguments(arg.argument)) { this.argumentsArrayAlias = lexicalBoundary.getArgumentsArrayAlias(); break; } } } super.initialise(transforms); } transpile(code, transforms) { super.transpile(code, transforms); if (transforms.spreadRest && this.arguments.length) { const firstArgument = this.arguments[0]; const isNew = true; let hasSpreadElements = spread( code, this.arguments, firstArgument.start, this.argumentsArrayAlias, isNew ); if (hasSpreadElements) { code.prependRight( this.start + 'new'.length, ' (Function.prototype.bind.apply(' ); code.overwrite( this.callee.end, firstArgument.start, ', [ null ].concat( ' ); code.appendLeft(this.end, ' ))'); } } if (this.arguments.length) { removeTrailingComma(code, this.arguments[this.arguments.length - 1].end); } } } buble-0.19.3/src/program/types/ObjectExpression.js000066400000000000000000000167431324054410700221360ustar00rootroot00000000000000import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; export default class ObjectExpression extends Node { transpile(code, transforms) { super.transpile(code, transforms); let firstPropertyStart = this.start + 1; let regularPropertyCount = 0; let spreadPropertyCount = 0; let computedPropertyCount = 0; let firstSpreadProperty = null; let firstComputedProperty = null; for (let i = 0; i < this.properties.length; ++i) { const prop = this.properties[i]; if (prop.type === 'SpreadElement') { spreadPropertyCount += 1; if (firstSpreadProperty === null) firstSpreadProperty = i; } else if (prop.computed) { computedPropertyCount += 1; if (firstComputedProperty === null) firstComputedProperty = i; } else if (prop.type === 'Property') { regularPropertyCount += 1; } } if (spreadPropertyCount) { if (!this.program.options.objectAssign) { throw new CompileError( "Object spread operator requires specified objectAssign option with 'Object.assign' or polyfill helper.", this ); } // enclose run of non-spread properties in curlies let i = this.properties.length; if (regularPropertyCount && !computedPropertyCount) { while (i--) { const prop = this.properties[i]; if (prop.type === 'Property' && !prop.computed) { const lastProp = this.properties[i - 1]; const nextProp = this.properties[i + 1]; if ( !lastProp || lastProp.type !== 'Property' || lastProp.computed ) { code.prependRight(prop.start, '{'); } if ( !nextProp || nextProp.type !== 'Property' || nextProp.computed ) { code.appendLeft(prop.end, '}'); } } } } // wrap the whole thing in Object.assign firstPropertyStart = this.properties[0].start; if (!computedPropertyCount) { code.overwrite( this.start, firstPropertyStart, `${this.program.options.objectAssign}({}, ` ); code.overwrite( this.properties[this.properties.length - 1].end, this.end, ')' ); } else if (this.properties[0].type === 'SpreadElement') { code.overwrite( this.start, firstPropertyStart, `${this.program.options.objectAssign}({}, ` ); code.remove(this.end - 1, this.end); code.appendRight(this.end, ')'); } else { code.prependLeft(this.start, `${this.program.options.objectAssign}(`); code.appendRight(this.end, ')'); } } if (computedPropertyCount && transforms.computedProperty) { const i0 = this.getIndentation(); let isSimpleAssignment; let name; if ( this.parent.type === 'VariableDeclarator' && this.parent.parent.declarations.length === 1 && this.parent.id.type === 'Identifier' ) { isSimpleAssignment = true; name = this.parent.id.alias || this.parent.id.name; // TODO is this right? } else if ( this.parent.type === 'AssignmentExpression' && this.parent.parent.type === 'ExpressionStatement' && this.parent.left.type === 'Identifier' ) { isSimpleAssignment = true; name = this.parent.left.alias || this.parent.left.name; // TODO is this right? } else if ( this.parent.type === 'AssignmentPattern' && this.parent.left.type === 'Identifier' ) { isSimpleAssignment = true; name = this.parent.left.alias || this.parent.left.name; // TODO is this right? } if (spreadPropertyCount) isSimpleAssignment = false; // handle block scoping name = this.findScope(false).resolveName(name); const start = firstPropertyStart; const end = this.end; if (isSimpleAssignment) { // ??? } else { if ( firstSpreadProperty === null || firstComputedProperty < firstSpreadProperty ) { name = this.findScope(true).createDeclaration('obj'); code.prependRight(this.start, `( ${name} = `); } else name = null; // We don't actually need this variable } const len = this.properties.length; let lastComputedProp; let sawNonComputedProperty = false; let isFirst = true; for (let i = 0; i < len; i += 1) { const prop = this.properties[i]; let moveStart = i > 0 ? this.properties[i - 1].end : start; if ( prop.type === 'Property' && (prop.computed || (lastComputedProp && !spreadPropertyCount)) ) { if (i === 0) moveStart = this.start + 1; // Trim leading whitespace lastComputedProp = prop; if (!name) { name = this.findScope(true).createDeclaration('obj'); const propId = name + (prop.computed ? '' : '.'); code.appendRight(prop.start, `( ${name} = {}, ${propId}`); } else { const propId = (isSimpleAssignment ? `;\n${i0}${name}` : `, ${name}`) + (prop.key.type === 'Literal' || prop.computed ? '' : '.'); if (moveStart < prop.start) { code.overwrite(moveStart, prop.start, propId); } else { code.prependRight(prop.start, propId); } } let c = prop.key.end; if (prop.computed) { while (code.original[c] !== ']') c += 1; c += 1; } if (prop.key.type === 'Literal' && !prop.computed) { code.overwrite( prop.start, prop.key.end + 1, '[' + code.slice(prop.start, prop.key.end) + '] = ' ); } else if (prop.shorthand || (prop.method && !prop.computed && transforms.conciseMethodProperty)) { // Replace : with = if Property::transpile inserted the : code.overwrite( prop.key.start, prop.key.end, code.slice(prop.key.start, prop.key.end).replace(/:/, ' =') ); } else { if (prop.value.start > c) code.remove(c, prop.value.start); code.prependLeft(c, ' = '); } // This duplicates behavior from Property::transpile which is disabled // for computed properties or if conciseMethodProperty is false if (prop.method && (prop.computed || !transforms.conciseMethodProperty)) { if (prop.value.generator) code.remove(prop.start, prop.key.start); code.prependRight(prop.value.start, `function${prop.value.generator ? '*' : ''} `); } } else if (prop.type === 'SpreadElement') { if (name && i > 0) { if (!lastComputedProp) { lastComputedProp = this.properties[i - 1]; } code.appendLeft(lastComputedProp.end, `, ${name} )`); lastComputedProp = null; name = null; } } else { if (!isFirst && spreadPropertyCount) { // We are in an Object.assign context, so we need to wrap regular properties code.prependRight(prop.start, '{'); code.appendLeft(prop.end, '}'); } sawNonComputedProperty = true; } if (isFirst && (prop.type === 'SpreadElement' || prop.computed)) { let beginEnd = sawNonComputedProperty ? this.properties[this.properties.length - 1].end : this.end - 1; // Trim trailing comma because it can easily become a leading comma which is illegal if (code.original[beginEnd] == ',') ++beginEnd; const closing = code.slice(beginEnd, end); code.prependLeft(moveStart, closing); code.remove(beginEnd, end); isFirst = false; } // Clean up some extranous whitespace let c = prop.end; if (i < len - 1 && !sawNonComputedProperty) { while (code.original[c] !== ',') c += 1; } else if (i == len - 1) c = this.end; code.remove(prop.end, c); } // special case if (computedPropertyCount === len) { code.remove(this.properties[len - 1].end, this.end - 1); } if (!isSimpleAssignment && name) { code.appendLeft(lastComputedProp.end, `, ${name} )`); } } } } buble-0.19.3/src/program/types/Property.js000066400000000000000000000026111324054410700204610ustar00rootroot00000000000000import Node from '../Node.js'; import reserved from '../../utils/reserved.js'; export default class Property extends Node { transpile(code, transforms) { super.transpile(code, transforms); if ( transforms.conciseMethodProperty && !this.computed && this.parent.type !== 'ObjectPattern' ) { if (this.shorthand) { code.prependRight(this.start, `${this.key.name}: `); } else if (this.method) { let name = ''; if (this.program.options.namedFunctionExpressions !== false) { if ( this.key.type === 'Literal' && typeof this.key.value === 'number' ) { name = ''; } else if (this.key.type === 'Identifier') { if ( reserved[this.key.name] || !/^[a-z_$][a-z0-9_$]*$/i.test(this.key.name) || this.value.body.scope.references[this.key.name] ) { name = this.findScope(true).createIdentifier(this.key.name); } else { name = this.key.name; } } else { name = this.findScope(true).createIdentifier(this.key.value); } name = ' ' + name; } if (this.value.generator) code.remove(this.start, this.key.start); code.appendLeft( this.key.end, `: function${this.value.generator ? '*' : ''}${name}` ); } } if (transforms.reservedProperties && reserved[this.key.name]) { code.prependRight(this.key.start, `'`); code.appendLeft(this.key.end, `'`); } } } buble-0.19.3/src/program/types/ReturnStatement.js000066400000000000000000000016041324054410700220020ustar00rootroot00000000000000import Node from '../Node.js'; import { loopStatement } from '../../utils/patterns.js'; export default class ReturnStatement extends Node { initialise(transforms) { this.loop = this.findNearest(loopStatement); this.nearestFunction = this.findNearest(/Function/); if ( this.loop && (!this.nearestFunction || this.loop.depth > this.nearestFunction.depth) ) { this.loop.canReturn = true; this.shouldWrap = true; } if (this.argument) this.argument.initialise(transforms); } transpile(code, transforms) { const shouldWrap = this.shouldWrap && this.loop && this.loop.shouldRewriteAsFunction; if (this.argument) { if (shouldWrap) code.prependRight(this.argument.start, `{ v: `); this.argument.transpile(code, transforms); if (shouldWrap) code.appendLeft(this.argument.end, ` }`); } else if (shouldWrap) { code.appendLeft(this.start + 6, ' {}'); } } } buble-0.19.3/src/program/types/SpreadElement.js000066400000000000000000000004561324054410700213720ustar00rootroot00000000000000import Node from '../Node.js'; export default class SpreadElement extends Node { transpile(code, transforms) { if (this.parent.type == 'ObjectExpression') { code.remove(this.start, this.argument.start); code.remove(this.argument.end, this.end); } super.transpile(code, transforms); } } buble-0.19.3/src/program/types/Super.js000066400000000000000000000046451324054410700177440ustar00rootroot00000000000000import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; import { loopStatement } from '../../utils/patterns.js'; export default class Super extends Node { initialise(transforms) { if (transforms.classes) { this.method = this.findNearest('MethodDefinition'); if (!this.method) throw new CompileError('use of super outside class method', this); const parentClass = this.findNearest('ClassBody').parent; this.superClassName = parentClass.superClass && (parentClass.superClass.name || 'superclass'); if (!this.superClassName) throw new CompileError('super used in base class', this); this.isCalled = this.parent.type === 'CallExpression' && this === this.parent.callee; if (this.method.kind !== 'constructor' && this.isCalled) { throw new CompileError( 'super() not allowed outside class constructor', this ); } this.isMember = this.parent.type === 'MemberExpression'; if (!this.isCalled && !this.isMember) { throw new CompileError( 'Unexpected use of `super` (expected `super(...)` or `super.*`)', this ); } } if (transforms.arrow) { const lexicalBoundary = this.findLexicalBoundary(); const arrowFunction = this.findNearest('ArrowFunctionExpression'); const loop = this.findNearest(loopStatement); if (arrowFunction && arrowFunction.depth > lexicalBoundary.depth) { this.thisAlias = lexicalBoundary.getThisAlias(); } if ( loop && loop.body.contains(this) && loop.depth > lexicalBoundary.depth ) { this.thisAlias = lexicalBoundary.getThisAlias(); } } } transpile(code, transforms) { if (transforms.classes) { const expression = this.isCalled || this.method.static ? this.superClassName : `${this.superClassName}.prototype`; code.overwrite(this.start, this.end, expression, { storeName: true, contentOnly: true }); const callExpression = this.isCalled ? this.parent : this.parent.parent; if (callExpression && callExpression.type === 'CallExpression') { if (!this.noCall) { // special case – `super( ...args )` code.appendLeft(callExpression.callee.end, '.call'); } const thisAlias = this.thisAlias || 'this'; if (callExpression.arguments.length) { code.appendLeft(callExpression.arguments[0].start, `${thisAlias}, `); } else { code.appendLeft(callExpression.end - 1, `${thisAlias}`); } } } } } buble-0.19.3/src/program/types/TaggedTemplateExpression.js000066400000000000000000000034331324054410700236070ustar00rootroot00000000000000import Node from '../Node.js'; import CompileError from '../../utils/CompileError.js'; export default class TaggedTemplateExpression extends Node { initialise(transforms) { if ( transforms.templateString && !transforms.dangerousTaggedTemplateString ) { throw new CompileError( "Tagged template strings are not supported. Use `transforms: { templateString: false }` to skip transformation and disable this error, or `transforms: { dangerousTaggedTemplateString: true }` if you know what you're doing", this ); } super.initialise(transforms); } transpile(code, transforms) { if (transforms.templateString && transforms.dangerousTaggedTemplateString) { const ordered = this.quasi.expressions .concat(this.quasi.quasis) .sort((a, b) => a.start - b.start); const program = this.program; const rootScope = program.body.scope; // insert strings at start const templateStrings = this.quasi.quasis.map(quasi => JSON.stringify(quasi.value.cooked) ).join(', '); let templateObject = this.program.templateLiteralQuasis[templateStrings]; if (!templateObject) { templateObject = rootScope.createIdentifier('templateObject'); code.prependRight(this.program.prependAt, `var ${templateObject} = Object.freeze([${templateStrings}]);\n`); this.program.templateLiteralQuasis[templateStrings] = templateObject; } code.overwrite( this.tag.end, ordered[0].start, `(${templateObject}` ); let lastIndex = ordered[0].start; ordered.forEach(node => { if (node.type === 'TemplateElement') { code.remove(lastIndex, node.end); } else { code.overwrite(lastIndex, node.start, ', '); } lastIndex = node.end; }); code.overwrite(lastIndex, this.end, ')'); } super.transpile(code, transforms); } } buble-0.19.3/src/program/types/TemplateElement.js000066400000000000000000000002341324054410700217210ustar00rootroot00000000000000import Node from '../Node.js'; export default class TemplateElement extends Node { initialise() { this.program.indentExclusionElements.push(this); } } buble-0.19.3/src/program/types/TemplateLiteral.js000066400000000000000000000043371324054410700217340ustar00rootroot00000000000000import Node from '../Node.js'; export default class TemplateLiteral extends Node { transpile(code, transforms) { super.transpile(code, transforms); if ( transforms.templateString && this.parent.type !== 'TaggedTemplateExpression' ) { let ordered = this.expressions .concat(this.quasis) .sort((a, b) => a.start - b.start || a.end - b.end) .filter((node, i) => { // include all expressions if (node.type !== 'TemplateElement') return true; // include all non-empty strings if (node.value.raw) return true; // exclude all empty strings not at the head return !i; }); // special case – we may be able to skip the first element, // if it's the empty string, but only if the second and // third elements aren't both expressions (since they maybe // be numeric, and `1 + 2 + '3' === '33'`) if (ordered.length >= 3) { const [first, , third] = ordered; if ( first.type === 'TemplateElement' && first.value.raw === '' && third.type === 'TemplateElement' ) { ordered.shift(); } } const parenthesise = (this.quasis.length !== 1 || this.expressions.length !== 0) && this.parent.type !== 'TemplateLiteral' && this.parent.type !== 'AssignmentExpression' && this.parent.type !== 'AssignmentPattern' && this.parent.type !== 'VariableDeclarator' && (this.parent.type !== 'BinaryExpression' || this.parent.operator !== '+'); if (parenthesise) code.appendRight(this.start, '('); let lastIndex = this.start; ordered.forEach((node, i) => { let prefix = i === 0 ? (parenthesise ? '(' : '') : ' + '; if (node.type === 'TemplateElement') { code.overwrite( lastIndex, node.end, prefix + JSON.stringify(node.value.cooked) ); } else { const parenthesise = node.type !== 'Identifier'; // TODO other cases where it's safe if (parenthesise) prefix += '('; code.remove(lastIndex, node.start); if (prefix) code.prependRight(node.start, prefix); if (parenthesise) code.appendLeft(node.end, ')'); } lastIndex = node.end; }); if (parenthesise) code.appendLeft(lastIndex, ')'); code.overwrite(lastIndex, this.end, "", { contentOnly: true } ); } } } buble-0.19.3/src/program/types/ThisExpression.js000066400000000000000000000014521324054410700216260ustar00rootroot00000000000000import Node from '../Node.js'; import { loopStatement } from '../../utils/patterns.js'; export default class ThisExpression extends Node { initialise(transforms) { if (transforms.arrow) { const lexicalBoundary = this.findLexicalBoundary(); const arrowFunction = this.findNearest('ArrowFunctionExpression'); const loop = this.findNearest(loopStatement); if ( (arrowFunction && arrowFunction.depth > lexicalBoundary.depth) || (loop && loop.body.contains(this) && loop.depth > lexicalBoundary.depth) || (loop && loop.right && loop.right.contains(this)) ) { this.alias = lexicalBoundary.getThisAlias(); } } } transpile(code) { if (this.alias) { code.overwrite(this.start, this.end, this.alias, { storeName: true, contentOnly: true }); } } } buble-0.19.3/src/program/types/UpdateExpression.js000066400000000000000000000016461324054410700221460ustar00rootroot00000000000000import Node from '../Node.js'; import checkConst from '../../utils/checkConst.js'; export default class UpdateExpression extends Node { initialise(transforms) { if (this.argument.type === 'Identifier') { const declaration = this.findScope(false).findDeclaration( this.argument.name ); // special case – https://gitlab.com/Rich-Harris/buble/issues/150 const statement = declaration && declaration.node.ancestor(3); if ( statement && statement.type === 'ForStatement' && statement.body.contains(this) ) { statement.reassigned[this.argument.name] = true; } } super.initialise(transforms); } transpile(code, transforms) { if (this.argument.type === 'Identifier') { // Do this check after everything has been initialized to find // shadowing declarations after this expression checkConst(this.argument, this.findScope(false)); } super.transpile(code, transforms); } } buble-0.19.3/src/program/types/VariableDeclaration.js000066400000000000000000000054521324054410700225360ustar00rootroot00000000000000import Node from '../Node.js'; import destructure from '../../utils/destructure.js'; import { loopStatement } from '../../utils/patterns.js'; export default class VariableDeclaration extends Node { initialise(transforms) { this.scope = this.findScope(this.kind === 'var'); this.declarations.forEach(declarator => declarator.initialise(transforms)); } transpile(code, transforms) { const i0 = this.getIndentation(); let kind = this.kind; if (transforms.letConst && kind !== 'var') { kind = 'var'; code.overwrite(this.start, this.start + this.kind.length, kind, { storeName: true }); } if (transforms.destructuring && this.parent.type !== 'ForOfStatement' && this.parent.type !== 'ForInStatement') { let c = this.start; let lastDeclaratorIsPattern; this.declarations.forEach((declarator, i) => { declarator.transpile(code, transforms); if (declarator.id.type === 'Identifier') { if (i > 0 && this.declarations[i - 1].id.type !== 'Identifier') { code.overwrite(c, declarator.id.start, `var `); } } else { const inline = loopStatement.test(this.parent.type); if (i === 0) { code.remove(c, declarator.id.start); } else { code.overwrite(c, declarator.id.start, `;\n${i0}`); } const simple = declarator.init.type === 'Identifier' && !declarator.init.rewritten; const name = simple ? (declarator.init.alias || declarator.init.name) : declarator.findScope(true).createIdentifier('ref'); c = declarator.start; let statementGenerators = []; if (simple) { code.remove(declarator.id.end, declarator.end); } else { statementGenerators.push((start, prefix, suffix) => { code.prependRight(declarator.id.end, `var ${name}`); code.appendLeft(declarator.init.end, `${suffix}`); code.move(declarator.id.end, declarator.end, start); }); } const scope = declarator.findScope(false); destructure( code, id => scope.createIdentifier(id), ({ name }) => scope.resolveName(name), declarator.id, name, inline, statementGenerators ); let prefix = inline ? 'var ' : ''; let suffix = inline ? `, ` : `;\n${i0}`; statementGenerators.forEach((fn, j) => { if ( i === this.declarations.length - 1 && j === statementGenerators.length - 1 ) { suffix = inline ? '' : ';'; } fn(declarator.start, j === 0 ? prefix : '', suffix); }); } c = declarator.end; lastDeclaratorIsPattern = declarator.id.type !== 'Identifier'; }); if (lastDeclaratorIsPattern && this.end > c) { code.overwrite(c, this.end, '', { contentOnly: true }); } } else { this.declarations.forEach(declarator => { declarator.transpile(code, transforms); }); } } } buble-0.19.3/src/program/types/VariableDeclarator.js000066400000000000000000000021761324054410700223710ustar00rootroot00000000000000import Node from '../Node.js'; export default class VariableDeclarator extends Node { initialise(transforms) { let kind = this.parent.kind; if (kind === 'let' && this.parent.parent.type === 'ForStatement') { kind = 'for.let'; // special case... } this.parent.scope.addDeclaration(this.id, kind); super.initialise(transforms); } transpile(code, transforms) { if (!this.init && transforms.letConst && this.parent.kind !== 'var') { let inLoop = this.findNearest( /Function|^For(In|Of)?Statement|^(?:Do)?WhileStatement/ ); if ( inLoop && !/Function/.test(inLoop.type) && !this.isLeftDeclaratorOfLoop() ) { code.appendLeft(this.id.end, ' = (void 0)'); } } if (this.id) this.id.transpile(code, transforms); if (this.init) this.init.transpile(code, transforms); } isLeftDeclaratorOfLoop() { return ( this.parent && this.parent.type === 'VariableDeclaration' && this.parent.parent && (this.parent.parent.type === 'ForInStatement' || this.parent.parent.type === 'ForOfStatement') && this.parent.parent.left && this.parent.parent.left.declarations[0] === this ); } } buble-0.19.3/src/program/types/index.js000066400000000000000000000065511324054410700177530ustar00rootroot00000000000000import ArrayExpression from './ArrayExpression.js'; import ArrowFunctionExpression from './ArrowFunctionExpression.js'; import AssignmentExpression from './AssignmentExpression.js'; import BinaryExpression from './BinaryExpression.js'; import BreakStatement from './BreakStatement.js'; import CallExpression from './CallExpression.js'; import ClassBody from './ClassBody.js'; import ClassDeclaration from './ClassDeclaration.js'; import ClassExpression from './ClassExpression.js'; import ContinueStatement from './ContinueStatement.js'; import ExportDefaultDeclaration from './ExportDefaultDeclaration.js'; import ExportNamedDeclaration from './ExportNamedDeclaration.js'; import ForStatement from './ForStatement.js'; import ForInStatement from './ForInStatement.js'; import ForOfStatement from './ForOfStatement.js'; import FunctionDeclaration from './FunctionDeclaration.js'; import FunctionExpression from './FunctionExpression.js'; import Identifier from './Identifier.js'; import IfStatement from './IfStatement.js'; import ImportDeclaration from './ImportDeclaration.js'; import ImportDefaultSpecifier from './ImportDefaultSpecifier.js'; import ImportSpecifier from './ImportSpecifier.js'; import JSXAttribute from './JSXAttribute.js'; import JSXClosingElement from './JSXClosingElement.js'; import JSXClosingFragment from './JSXClosingFragment.js'; import JSXElement from './JSXElement.js'; import JSXExpressionContainer from './JSXExpressionContainer.js'; import JSXFragment from './JSXFragment.js'; import JSXOpeningElement from './JSXOpeningElement.js'; import JSXOpeningFragment from './JSXOpeningFragment.js'; import JSXSpreadAttribute from './JSXSpreadAttribute.js'; import Literal from './Literal.js'; import LoopStatement from './shared/LoopStatement.js'; import MemberExpression from './MemberExpression.js'; import NewExpression from './NewExpression.js'; import ObjectExpression from './ObjectExpression.js'; import Property from './Property.js'; import ReturnStatement from './ReturnStatement.js'; import SpreadElement from './SpreadElement.js'; import Super from './Super.js'; import TaggedTemplateExpression from './TaggedTemplateExpression.js'; import TemplateElement from './TemplateElement.js'; import TemplateLiteral from './TemplateLiteral.js'; import ThisExpression from './ThisExpression.js'; import UpdateExpression from './UpdateExpression.js'; import VariableDeclaration from './VariableDeclaration.js'; import VariableDeclarator from './VariableDeclarator.js'; export default { ArrayExpression, ArrowFunctionExpression, AssignmentExpression, BinaryExpression, BreakStatement, CallExpression, ClassBody, ClassDeclaration, ClassExpression, ContinueStatement, DoWhileStatement: LoopStatement, ExportNamedDeclaration, ExportDefaultDeclaration, ForStatement, ForInStatement, ForOfStatement, FunctionDeclaration, FunctionExpression, Identifier, IfStatement, ImportDeclaration, ImportDefaultSpecifier, ImportSpecifier, JSXAttribute, JSXClosingElement, JSXClosingFragment, JSXElement, JSXExpressionContainer, JSXFragment, JSXOpeningElement, JSXOpeningFragment, JSXSpreadAttribute, Literal, MemberExpression, NewExpression, ObjectExpression, Property, ReturnStatement, SpreadElement, Super, TaggedTemplateExpression, TemplateElement, TemplateLiteral, ThisExpression, UpdateExpression, VariableDeclaration, VariableDeclarator, WhileStatement: LoopStatement }; buble-0.19.3/src/program/types/shared/000077500000000000000000000000001324054410700175455ustar00rootroot00000000000000buble-0.19.3/src/program/types/shared/LoopStatement.js000066400000000000000000000057111324054410700227050ustar00rootroot00000000000000import Node from '../../Node.js'; export default class LoopStatement extends Node { findScope(functionScope) { return functionScope || !this.createdScope ? this.parent.findScope(functionScope) : this.body.scope; } initialise(transforms) { this.body.createScope(); this.createdScope = true; // this is populated as and when reassignments occur this.reassigned = Object.create(null); this.aliases = Object.create(null); super.initialise(transforms); if (transforms.letConst) { // see if any block-scoped declarations are referenced // inside function expressions const names = Object.keys(this.body.scope.declarations); let i = names.length; while (i--) { const name = names[i]; const declaration = this.body.scope.declarations[name]; let j = declaration.instances.length; while (j--) { const instance = declaration.instances[j]; const nearestFunctionExpression = instance.findNearest(/Function/); if ( nearestFunctionExpression && nearestFunctionExpression.depth > this.depth ) { this.shouldRewriteAsFunction = true; break; } } if (this.shouldRewriteAsFunction) break; } } } transpile(code, transforms) { const needsBlock = this.type != 'ForOfStatement' && (this.body.type !== 'BlockStatement' || (this.body.type === 'BlockStatement' && this.body.synthetic)); if (this.shouldRewriteAsFunction) { const i0 = this.getIndentation(); const i1 = i0 + code.getIndentString(); const argString = this.args ? ` ${this.args.join(', ')} ` : ''; const paramString = this.params ? ` ${this.params.join(', ')} ` : ''; const functionScope = this.findScope(true); const loop = functionScope.createIdentifier('loop'); const before = `var ${loop} = function (${paramString}) ` + (this.body.synthetic ? `{\n${i0}${code.getIndentString()}` : ''); const after = (this.body.synthetic ? `\n${i0}}` : '') + `;\n\n${i0}`; code.prependRight(this.body.start, before); code.appendLeft(this.body.end, after); code.move(this.start, this.body.start, this.body.end); if (this.canBreak || this.canReturn) { const returned = functionScope.createIdentifier('returned'); let insert = `{\n${i1}var ${returned} = ${loop}(${argString});\n`; if (this.canBreak) insert += `\n${i1}if ( ${returned} === 'break' ) break;`; if (this.canReturn) insert += `\n${i1}if ( ${returned} ) return ${returned}.v;`; insert += `\n${i0}}`; code.prependRight(this.body.end, insert); } else { const callExpression = `${loop}(${argString});`; if (this.type === 'DoWhileStatement') { code.overwrite( this.start, this.body.start, `do {\n${i1}${callExpression}\n${i0}}` ); } else { code.prependRight(this.body.end, callExpression); } } } else if (needsBlock) { code.appendLeft(this.body.start, '{ '); code.prependRight(this.body.end, ' }'); } super.transpile(code, transforms); } } buble-0.19.3/src/program/types/shared/ModuleDeclaration.js000066400000000000000000000004601324054410700234760ustar00rootroot00000000000000import Node from '../../Node.js'; import CompileError from '../../../utils/CompileError.js'; export default class ModuleDeclaration extends Node { initialise(transforms) { if (transforms.moduleImport) throw new CompileError('Modules are not supported', this); super.initialise(transforms); } } buble-0.19.3/src/program/wrap.js000066400000000000000000000033171324054410700164460ustar00rootroot00000000000000import types from './types/index.js'; import BlockStatement from './BlockStatement.js'; import Node from './Node.js'; import keys from './keys.js'; const statementsWithBlocks = { IfStatement: 'consequent', ForStatement: 'body', ForInStatement: 'body', ForOfStatement: 'body', WhileStatement: 'body', DoWhileStatement: 'body', ArrowFunctionExpression: 'body' }; export default function wrap(raw, parent) { if (!raw) return; if ('length' in raw) { let i = raw.length; while (i--) wrap(raw[i], parent); return; } // with e.g. shorthand properties, key and value are // the same node. We don't want to wrap an object twice if (raw.__wrapped) return; raw.__wrapped = true; if (!keys[raw.type]) { keys[raw.type] = Object.keys(raw).filter( key => typeof raw[key] === 'object' ); } // special case – body-less if/for/while statements. TODO others? const bodyType = statementsWithBlocks[raw.type]; if (bodyType && raw[bodyType].type !== 'BlockStatement') { const expression = raw[bodyType]; // create a synthetic block statement, otherwise all hell // breaks loose when it comes to block scoping raw[bodyType] = { start: expression.start, end: expression.end, type: 'BlockStatement', body: [expression], synthetic: true }; } raw.parent = parent; raw.program = parent.program || parent; raw.depth = parent.depth + 1; raw.keys = keys[raw.type]; raw.indentation = undefined; for (const key of keys[raw.type]) { wrap(raw[key], raw); } raw.program.magicString.addSourcemapLocation(raw.start); raw.program.magicString.addSourcemapLocation(raw.end); const type = (raw.type === 'BlockStatement' ? BlockStatement : types[raw.type]) || Node; raw.__proto__ = type.prototype; } buble-0.19.3/src/support.js000066400000000000000000000045511324054410700155430ustar00rootroot00000000000000export const matrix = { chrome: { 48: 0b01001010100011001101, 49: 0b01001111100111111111, 50: 0b01011111100111111111, 51: 0b01011111100111111111, 52: 0b01111111100111111111, 53: 0b01111111100111111111, 54: 0b01111111100111111111, 55: 0b01111111100111111111, 56: 0b01111111100111111111, 57: 0b01111111100111111111, 58: 0b11111111100111111111, 59: 0b11111111100111111111, 60: 0b11111111100111111111, 61: 0b11111111100111111111, 62: 0b11111111100111111111, 63: 0b11111111100111111111 }, firefox: { 43: 0b01001111100011011101, 44: 0b01001111100111011101, 45: 0b01001111100111011111, 46: 0b01011111100111011111, 47: 0b01011111100111111111, 48: 0b01011111100111111111, 49: 0b01011110100111111111, 50: 0b01011110100111111111, 51: 0b01011110100111111111, 52: 0b11111111100111111111, 53: 0b11111111100111111111, 54: 0b11111111100111111111, 55: 0b11111111100111111111, 56: 0b11111111100111111111, 57: 0b11111111100111111111, 58: 0b11111111100111111111 }, safari: { 8: 0b01000000000000000100, 9: 0b01001001100001101110, 10: 0b11011111100111111111, '10.1': 0b11111111100111111111, 11: 0b11111111100111111111 }, ie: { 8: 0b00000000000000000000, 9: 0b01000000000000000000, 10: 0b01000000000000000000, 11: 0b01000000000100000000 }, edge: { 12: 0b01001010100101001101, 13: 0b01011110100111001111, 14: 0b11111110100111111111, 15: 0b11111110100111111111, 16: 0b11111110100111111111 }, node: { '0.10': 0b01000000000000000000, '0.12': 0b01000000000001000000, 4: 0b01001000100011001111, 5: 0b01001000100011001111, 6: 0b01011111100111111111, 8: 0b11111111100111111111, '8.3': 0b11111111100111111111, '8.7': 0b11111111100111111111 } }; export const features = [ 'arrow', 'classes', 'computedProperty', 'conciseMethodProperty', 'defaultParameter', 'destructuring', 'forOf', 'generator', 'letConst', 'moduleExport', 'moduleImport', 'numericLiteral', 'parameterDestructuring', 'spreadRest', 'stickyRegExp', 'templateString', 'unicodeRegExp', // ES2016 'exponentiation', // additional transforms, not from // https://featuretests.io 'reservedProperties', 'trailingFunctionCommas' ]; buble-0.19.3/src/utils/000077500000000000000000000000001324054410700146245ustar00rootroot00000000000000buble-0.19.3/src/utils/CompileError.js000066400000000000000000000012221324054410700175610ustar00rootroot00000000000000import locate from './locate.js'; import getSnippet from './getSnippet.js'; export default class CompileError extends Error { constructor(message, node) { super(message); this.name = 'CompileError'; if (!node) { return; } const source = node.program.magicString.original; const loc = locate(source, node.start); this.message = message + ` (${loc.line}:${loc.column})`; this.stack = new Error().stack.replace( new RegExp(`.+new ${this.name}.+\\n`, 'm'), '' ); this.loc = loc; this.snippet = getSnippet(source, loc, node.end - node.start); } toString() { return `${this.name}: ${this.message}\n${this.snippet}`; } } buble-0.19.3/src/utils/array.js000066400000000000000000000003211324054410700162740ustar00rootroot00000000000000export function findIndex(array, fn) { for (let i = 0; i < array.length; i += 1) { if (fn(array[i], i)) return i; } return -1; } export function find(array, fn) { return array[findIndex(array, fn)]; } buble-0.19.3/src/utils/checkConst.js000066400000000000000000000004461324054410700172520ustar00rootroot00000000000000import CompileError from './CompileError.js'; export default function checkConst(identifier, scope) { const declaration = scope.findDeclaration(identifier.name); if (declaration && declaration.kind === 'const') { throw new CompileError(`${identifier.name} is read-only`, identifier); } } buble-0.19.3/src/utils/deindent.js000066400000000000000000000016061324054410700167570ustar00rootroot00000000000000// TODO this function is slightly flawed – it works on the original string, // not its current edited state. // That's not a problem for the way that it's currently used, but it could // be in future... export default function deindent(node, code) { const start = node.start; const end = node.end; const indentStr = code.getIndentString(); const indentStrLen = indentStr.length; const indentStart = start - indentStrLen; if ( !node.program.indentExclusions[indentStart] && code.original.slice(indentStart, start) === indentStr ) { code.remove(indentStart, start); } const pattern = new RegExp(indentStr + '\\S', 'g'); const slice = code.original.slice(start, end); let match; while ((match = pattern.exec(slice))) { const removeStart = start + match.index; if (!node.program.indentExclusions[removeStart]) { code.remove(removeStart, removeStart + indentStrLen); } } } buble-0.19.3/src/utils/destructure.js000066400000000000000000000175011324054410700175370ustar00rootroot00000000000000import CompileError from '../utils/CompileError.js'; import { findIndex } from './array.js'; const handlers = { Identifier: destructureIdentifier, AssignmentPattern: destructureAssignmentPattern, ArrayPattern: destructureArrayPattern, ObjectPattern: destructureObjectPattern }; export default function destructure( code, createIdentifier, resolveName, node, ref, inline, statementGenerators ) { handlers[node.type](code, createIdentifier, resolveName, node, ref, inline, statementGenerators); } function destructureIdentifier( code, createIdentifier, resolveName, node, ref, inline, statementGenerators ) { statementGenerators.push((start, prefix, suffix) => { code.overwrite(node.start, node.end, (inline ? prefix : `${prefix}var `) + resolveName(node) + ` = ${ref}${suffix}`); code.move(node.start, node.end, start); }); } function destructureMemberExpression( code, createIdentifier, resolveName, node, ref, inline, statementGenerators ) { statementGenerators.push((start, prefix, suffix) => { code.prependRight(node.start, inline ? prefix : `${prefix}var `); code.appendLeft(node.end, ` = ${ref}${suffix}`); code.move(node.start, node.end, start); }); } function destructureAssignmentPattern( code, createIdentifier, resolveName, node, ref, inline, statementGenerators ) { const isIdentifier = node.left.type === 'Identifier'; const name = isIdentifier ? node.left.name : ref; if (!inline) { statementGenerators.push((start, prefix, suffix) => { code.prependRight( node.left.end, `${prefix}if ( ${name} === void 0 ) ${name}` ); code.move(node.left.end, node.right.end, start); code.appendLeft(node.right.end, suffix); }); } if (!isIdentifier) { destructure(code, createIdentifier, resolveName, node.left, ref, inline, statementGenerators); } } function destructureArrayPattern( code, createIdentifier, resolveName, node, ref, inline, statementGenerators ) { let c = node.start; node.elements.forEach((element, i) => { if (!element) return; if (element.type === 'RestElement') { handleProperty( code, createIdentifier, resolveName, c, element.argument, `${ref}.slice(${i})`, inline, statementGenerators ); } else { handleProperty( code, createIdentifier, resolveName, c, element, `${ref}[${i}]`, inline, statementGenerators ); } c = element.end; }); code.remove(c, node.end); } function destructureObjectPattern( code, createIdentifier, resolveName, node, ref, inline, statementGenerators ) { let c = node.start; const nonRestKeys = []; node.properties.forEach(prop => { let value; let content; if (prop.type === 'Property') { const isComputedKey = prop.computed || prop.key.type !== 'Identifier'; const key = isComputedKey ? code.slice(prop.key.start, prop.key.end) : prop.key.name; value = isComputedKey ? `${ref}[${key}]` : `${ref}.${key}`; content = prop.value; nonRestKeys.push(isComputedKey ? key : '"' + key + '"'); } else if (prop.type === 'RestElement') { content = prop.argument; value = createIdentifier('rest'); statementGenerators.push((start, prefix, suffix) => { const helper = prop.program.getObjectWithoutPropertiesHelper(code); code.overwrite( prop.start, (c = prop.argument.start), (inline ? prefix : `${prefix}var `) + `${value} = ${helper}( ${ref}, [${nonRestKeys.join(', ')}] )${suffix}` ); code.move(prop.start, c, start); }); } else { throw new CompileError( this, `Unexpected node of type ${prop.type} in object pattern` ); } handleProperty(code, createIdentifier, resolveName, c, content, value, inline, statementGenerators); c = prop.end; }); code.remove(c, node.end); } function handleProperty( code, createIdentifier, resolveName, c, node, value, inline, statementGenerators ) { switch (node.type) { case 'Identifier': { code.remove(c, node.start); destructureIdentifier( code, createIdentifier, resolveName, node, value, inline, statementGenerators ); break; } case 'MemberExpression': code.remove(c, node.start); destructureMemberExpression( code, createIdentifier, resolveName, node, value, true, statementGenerators ); break; case 'AssignmentPattern': { let name; const isIdentifier = node.left.type === 'Identifier'; if (isIdentifier) { name = resolveName(node.left); } else { name = createIdentifier(value); } statementGenerators.push((start, prefix, suffix) => { if (inline) { code.prependRight( node.right.start, `${name} = ${value}, ${name} = ${name} === void 0 ? ` ); code.appendLeft(node.right.end, ` : ${name}${suffix}`); } else { code.prependRight( node.right.start, `${prefix}var ${name} = ${value}; if ( ${name} === void 0 ) ${name} = ` ); code.appendLeft(node.right.end, suffix); } code.move(node.right.start, node.right.end, start); }); if (isIdentifier) { code.remove(c, node.right.start); } else { code.remove(c, node.left.start); code.remove(node.left.end, node.right.start); handleProperty( code, createIdentifier, resolveName, c, node.left, name, inline, statementGenerators ); } break; } case 'ObjectPattern': { code.remove(c, (c = node.start)); let ref = value; if (node.properties.length > 1) { ref = createIdentifier(value); statementGenerators.push((start, prefix, suffix) => { // this feels a tiny bit hacky, but we can't do a // straightforward appendLeft and keep correct order... code.prependRight(node.start, (inline ? '' : `${prefix}var `) + `${ref} = `); code.overwrite(node.start, (c = node.start + 1), value); code.appendLeft(c, suffix); code.overwrite( node.start, (c = node.start + 1), (inline ? '' : `${prefix}var `) + `${ref} = ${value}${suffix}` ); code.move(node.start, c, start); }); } destructureObjectPattern( code, createIdentifier, resolveName, node, ref, inline, statementGenerators ); break; } case 'ArrayPattern': { code.remove(c, (c = node.start)); if (node.elements.filter(Boolean).length > 1) { const ref = createIdentifier(value); statementGenerators.push((start, prefix, suffix) => { code.prependRight(node.start, (inline ? '' : `${prefix}var `) + `${ref} = `); code.overwrite(node.start, (c = node.start + 1), value, { contentOnly: true }); code.appendLeft(c, suffix); code.move(node.start, c, start); }); node.elements.forEach((element, i) => { if (!element) return; if (element.type === 'RestElement') { handleProperty( code, createIdentifier, resolveName, c, element.argument, `${ref}.slice(${i})`, inline, statementGenerators ); } else { handleProperty( code, createIdentifier, resolveName, c, element, `${ref}[${i}]`, inline, statementGenerators ); } c = element.end; }); } else { const index = findIndex(node.elements, Boolean); const element = node.elements[index]; if (element.type === 'RestElement') { handleProperty( code, createIdentifier, resolveName, c, element.argument, `${value}.slice(${index})`, inline, statementGenerators ); } else { handleProperty( code, createIdentifier, resolveName, c, element, `${value}[${index}]`, inline, statementGenerators ); } c = element.end; } code.remove(c, node.end); break; } default: { throw new Error(`Unexpected node type in destructuring (${node.type})`); } } } buble-0.19.3/src/utils/getSnippet.js000066400000000000000000000014031324054410700173020ustar00rootroot00000000000000function pad(num, len) { let result = String(num); return result + repeat(' ', len - result.length); } function repeat(str, times) { let result = ''; while (times--) result += str; return result; } export default function getSnippet(source, loc, length = 1) { const first = Math.max(loc.line - 5, 0); const last = loc.line; const numDigits = String(last).length; const lines = source.split('\n').slice(first, last); const lastLine = lines[lines.length - 1]; const offset = lastLine.slice(0, loc.column).replace(/\t/g, ' ').length; let snippet = lines .map((line, i) => `${pad(i + first + 1, numDigits)} : ${line.replace(/\t/g, ' ')}`) .join('\n'); snippet += '\n' + repeat(' ', numDigits + 3 + offset) + repeat('^', length); return snippet; } buble-0.19.3/src/utils/isReference.js000066400000000000000000000024111324054410700174120ustar00rootroot00000000000000export default function isReference(node, parent) { if (node.type === 'MemberExpression') { return !node.computed && isReference(node.object, node); } if (node.type === 'Identifier') { // the only time we could have an identifier node without a parent is // if it's the entire body of a function without a block statement – // i.e. an arrow function expression like `a => a` if (!parent) return true; if (/(Function|Class)Expression/.test(parent.type)) return false; if (parent.type === 'VariableDeclarator') return node === parent.init; // TODO is this right? if ( parent.type === 'MemberExpression' || parent.type === 'MethodDefinition' ) { return parent.computed || node === parent.object; } if (parent.type === 'ArrayPattern') return false; // disregard the `bar` in `{ bar: foo }`, but keep it in `{ [bar]: foo }` if (parent.type === 'Property') { if (parent.parent.type === 'ObjectPattern') return false; return parent.computed || node === parent.value; } // disregard the `bar` in `class Foo { bar () {...} }` if (parent.type === 'MethodDefinition') return false; // disregard the `bar` in `export { foo as bar }` if (parent.type === 'ExportSpecifier' && node !== parent.local) return false; return true; } } buble-0.19.3/src/utils/locate.js000066400000000000000000000006701324054410700164340ustar00rootroot00000000000000export default function locate(source, index) { var lines = source.split('\n'); var len = lines.length; var lineStart = 0; var i; for (i = 0; i < len; i += 1) { var line = lines[i]; var lineEnd = lineStart + line.length + 1; // +1 for newline if (lineEnd > index) { return { line: i + 1, column: index - lineStart, char: i }; } lineStart = lineEnd; } throw new Error('Could not determine location of character'); } buble-0.19.3/src/utils/patterns.js000066400000000000000000000001011324054410700170120ustar00rootroot00000000000000export const loopStatement = /(?:For(?:In|Of)?|While)Statement/; buble-0.19.3/src/utils/removeTrailingComma.js000066400000000000000000000004551324054410700211320ustar00rootroot00000000000000export default function removeTrailingComma(code, c) { while (code.original[c] !== ')') { if (code.original[c] === ',') { code.remove(c, c + 1); return; } if (code.original[c] === '/') { c = code.original.indexOf(code.original[c + 1] === '/' ? '\n' : '*/', c) + 1; } c += 1; } } buble-0.19.3/src/utils/reserved.js000066400000000000000000000006561324054410700170100ustar00rootroot00000000000000let reserved = Object.create(null); 'do if in for let new try var case else enum eval null this true void with await break catch class const false super throw while yield delete export import public return static switch typeof default extends finally package private continue debugger function arguments interface protected implements instanceof' .split(' ') .forEach(word => (reserved[word] = true)); export default reserved; buble-0.19.3/src/utils/spread.js000066400000000000000000000031511324054410700164400ustar00rootroot00000000000000export function isArguments(node) { return node.type === 'Identifier' && node.name === 'arguments'; } export default function spread( code, elements, start, argumentsArrayAlias, isNew ) { let i = elements.length; let firstSpreadIndex = -1; while (i--) { const element = elements[i]; if (element && element.type === 'SpreadElement') { if (isArguments(element.argument)) { code.overwrite( element.argument.start, element.argument.end, argumentsArrayAlias ); } firstSpreadIndex = i; } } if (firstSpreadIndex === -1) return false; // false indicates no spread elements if (isNew) { for (i = 0; i < elements.length; i += 1) { let element = elements[i]; if (element.type === 'SpreadElement') { code.remove(element.start, element.argument.start); } else { code.prependRight(element.start, '['); code.prependRight(element.end, ']'); } } return true; // true indicates some spread elements } let element = elements[firstSpreadIndex]; const previousElement = elements[firstSpreadIndex - 1]; if (!previousElement) { code.remove(start, element.start); code.overwrite(element.end, elements[1].start, '.concat( '); } else { code.overwrite(previousElement.end, element.start, ' ].concat( '); } for (i = firstSpreadIndex; i < elements.length; i += 1) { element = elements[i]; if (element) { if (element.type === 'SpreadElement') { code.remove(element.start, element.argument.start); } else { code.appendLeft(element.start, '['); code.appendLeft(element.end, ']'); } } } return true; // true indicates some spread elements } buble-0.19.3/test/000077500000000000000000000000001324054410700136545ustar00rootroot00000000000000buble-0.19.3/test/cli/000077500000000000000000000000001324054410700144235ustar00rootroot00000000000000buble-0.19.3/test/cli/basic/000077500000000000000000000000001324054410700155045ustar00rootroot00000000000000buble-0.19.3/test/cli/basic/command.sh000077500000000000000000000000431324054410700174560ustar00rootroot00000000000000buble input.js -o actual/output.js buble-0.19.3/test/cli/basic/expected/000077500000000000000000000000001324054410700173055ustar00rootroot00000000000000buble-0.19.3/test/cli/basic/expected/output.js000066400000000000000000000000511324054410700211770ustar00rootroot00000000000000var answer = function () { return 42; }; buble-0.19.3/test/cli/basic/input.js000066400000000000000000000000311324054410700171730ustar00rootroot00000000000000const answer = () => 42; buble-0.19.3/test/cli/compiles-directory/000077500000000000000000000000001324054410700202405ustar00rootroot00000000000000buble-0.19.3/test/cli/compiles-directory/command.sh000077500000000000000000000000271324054410700222140ustar00rootroot00000000000000buble src -o actual -m buble-0.19.3/test/cli/compiles-directory/expected/000077500000000000000000000000001324054410700220415ustar00rootroot00000000000000buble-0.19.3/test/cli/compiles-directory/expected/bar.js000066400000000000000000000000651324054410700231440ustar00rootroot00000000000000console.log( 'bar' ); //# sourceMappingURL=bar.js.mapbuble-0.19.3/test/cli/compiles-directory/expected/bar.js.map000066400000000000000000000002411324054410700237140ustar00rootroot00000000000000{"version":3,"file":"bar.js","sources":["../src/bar.jsm"],"sourcesContent":["console.log( 'bar' );"],"names":[],"mappings":"AAAA,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE"} buble-0.19.3/test/cli/compiles-directory/expected/baz.js000066400000000000000000000000651324054410700231540ustar00rootroot00000000000000console.log( 'baz' ); //# sourceMappingURL=baz.js.mapbuble-0.19.3/test/cli/compiles-directory/expected/baz.js.map000066400000000000000000000002401324054410700237230ustar00rootroot00000000000000{"version":3,"file":"baz.js","sources":["../src/baz.es6"],"sourcesContent":["console.log( 'baz' );"],"names":[],"mappings":"AAAA,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE"}buble-0.19.3/test/cli/compiles-directory/expected/foo.js000066400000000000000000000000641324054410700231620ustar00rootroot00000000000000console.log('foo'); //# sourceMappingURL=foo.js.mapbuble-0.19.3/test/cli/compiles-directory/expected/foo.js.map000066400000000000000000000002451324054410700237370ustar00rootroot00000000000000{"version":3,"file":"foo.js","sources":["../src/foo.js"],"sourcesContent":["console.log('foo');\n"],"names":[],"mappings":"AAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;"}buble-0.19.3/test/cli/compiles-directory/src/000077500000000000000000000000001324054410700210275ustar00rootroot00000000000000buble-0.19.3/test/cli/compiles-directory/src/bar.jsm000066400000000000000000000000251324054410700223030ustar00rootroot00000000000000console.log( 'bar' );buble-0.19.3/test/cli/compiles-directory/src/baz.es6000066400000000000000000000000251324054410700222170ustar00rootroot00000000000000console.log( 'baz' );buble-0.19.3/test/cli/compiles-directory/src/foo.js000066400000000000000000000000241324054410700221440ustar00rootroot00000000000000console.log('foo'); buble-0.19.3/test/cli/compiles-directory/src/nope.txt000066400000000000000000000000051324054410700225240ustar00rootroot00000000000000nope buble-0.19.3/test/cli/creates-inline-sourcemap/000077500000000000000000000000001324054410700213215ustar00rootroot00000000000000buble-0.19.3/test/cli/creates-inline-sourcemap/command.sh000077500000000000000000000000551324054410700232760ustar00rootroot00000000000000buble input.js -o actual/output.js -m inline buble-0.19.3/test/cli/creates-inline-sourcemap/expected/000077500000000000000000000000001324054410700231225ustar00rootroot00000000000000buble-0.19.3/test/cli/creates-inline-sourcemap/expected/output.js000066400000000000000000000005421324054410700250210ustar00rootroot00000000000000var answer = function () { return 42; }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlcyI6WyIuLi9pbnB1dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBhbnN3ZXIgPSAoKSA9PiA0MjtcbiJdLCJuYW1lcyI6WyJjb25zdCJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxNQUFNLFlBQUcsR0FBRyxTQUFHLEtBQUUsQ0FBQzsifQ==buble-0.19.3/test/cli/creates-inline-sourcemap/input.js000066400000000000000000000000311324054410700230100ustar00rootroot00000000000000const answer = () => 42; buble-0.19.3/test/cli/creates-sourcemap/000077500000000000000000000000001324054410700200455ustar00rootroot00000000000000buble-0.19.3/test/cli/creates-sourcemap/command.sh000077500000000000000000000000461324054410700220220ustar00rootroot00000000000000buble input.js -o actual/output.js -m buble-0.19.3/test/cli/creates-sourcemap/expected/000077500000000000000000000000001324054410700216465ustar00rootroot00000000000000buble-0.19.3/test/cli/creates-sourcemap/expected/output.js000066400000000000000000000001141324054410700235400ustar00rootroot00000000000000var answer = function () { return 42; }; //# sourceMappingURL=output.js.mapbuble-0.19.3/test/cli/creates-sourcemap/expected/output.js.map000066400000000000000000000002701324054410700243170ustar00rootroot00000000000000{"version":3,"file":"output.js","sources":["../input.js"],"sourcesContent":["const answer = () => 42;\n"],"names":["const"],"mappings":"AAAAA,GAAK,CAAC,MAAM,YAAG,GAAG,SAAG,KAAE,CAAC;"}buble-0.19.3/test/cli/creates-sourcemap/input.js000066400000000000000000000000311324054410700215340ustar00rootroot00000000000000const answer = () => 42; buble-0.19.3/test/cli/supports-jsx-pragma-comment/000077500000000000000000000000001324054410700220315ustar00rootroot00000000000000buble-0.19.3/test/cli/supports-jsx-pragma-comment/command.sh000066400000000000000000000001001324054410700237720ustar00rootroot00000000000000buble input.js -o actual/output.js --jsx NotReact.createElement buble-0.19.3/test/cli/supports-jsx-pragma-comment/expected/000077500000000000000000000000001324054410700236325ustar00rootroot00000000000000buble-0.19.3/test/cli/supports-jsx-pragma-comment/expected/output.js000066400000000000000000000001101324054410700255200ustar00rootroot00000000000000/* @jsx customPragma */ var div = customPragma( 'div', null, "Hello" ); buble-0.19.3/test/cli/supports-jsx-pragma-comment/input.js000066400000000000000000000000641324054410700235260ustar00rootroot00000000000000/* @jsx customPragma */ var div =
Hello
; buble-0.19.3/test/cli/supports-jsx-pragma/000077500000000000000000000000001324054410700203715ustar00rootroot00000000000000buble-0.19.3/test/cli/supports-jsx-pragma/command.sh000066400000000000000000000001001324054410700223320ustar00rootroot00000000000000buble input.js -o actual/output.js --jsx NotReact.createElement buble-0.19.3/test/cli/supports-jsx-pragma/expected/000077500000000000000000000000001324054410700221725ustar00rootroot00000000000000buble-0.19.3/test/cli/supports-jsx-pragma/expected/output.js000066400000000000000000000000761324054410700240730ustar00rootroot00000000000000var img = NotReact.createElement( 'img', { src: "foo.gif" }); buble-0.19.3/test/cli/supports-jsx-pragma/input.js000066400000000000000000000000411324054410700220610ustar00rootroot00000000000000var img = ; buble-0.19.3/test/cli/supports-jsx/000077500000000000000000000000001324054410700171245ustar00rootroot00000000000000buble-0.19.3/test/cli/supports-jsx/command.sh000066400000000000000000000000441324054410700210740ustar00rootroot00000000000000buble input.jsx -o actual/output.js buble-0.19.3/test/cli/supports-jsx/expected/000077500000000000000000000000001324054410700207255ustar00rootroot00000000000000buble-0.19.3/test/cli/supports-jsx/expected/output.js000066400000000000000000000000731324054410700226230ustar00rootroot00000000000000var img = React.createElement( 'img', { src: 'foo.gif' }); buble-0.19.3/test/cli/supports-jsx/input.jsx000066400000000000000000000000401324054410700210030ustar00rootroot00000000000000var img = ; buble-0.19.3/test/cli/uses-overrides/000077500000000000000000000000001324054410700174025ustar00rootroot00000000000000buble-0.19.3/test/cli/uses-overrides/command.sh000077500000000000000000000000571324054410700213610ustar00rootroot00000000000000buble input.js -o actual/output.js -n letConst buble-0.19.3/test/cli/uses-overrides/expected/000077500000000000000000000000001324054410700212035ustar00rootroot00000000000000buble-0.19.3/test/cli/uses-overrides/expected/output.js000066400000000000000000000000531324054410700230770ustar00rootroot00000000000000const answer = function () { return 42; }; buble-0.19.3/test/cli/uses-overrides/input.js000066400000000000000000000000311324054410700210710ustar00rootroot00000000000000const answer = () => 42; buble-0.19.3/test/cli/uses-targets/000077500000000000000000000000001324054410700170515ustar00rootroot00000000000000buble-0.19.3/test/cli/uses-targets/command.sh000077500000000000000000000000611324054410700210230ustar00rootroot00000000000000buble input.js -o actual/output.js -t firefox:43 buble-0.19.3/test/cli/uses-targets/expected/000077500000000000000000000000001324054410700206525ustar00rootroot00000000000000buble-0.19.3/test/cli/uses-targets/expected/output.js000066400000000000000000000000271324054410700225470ustar00rootroot00000000000000var answer = () => 42; buble-0.19.3/test/cli/uses-targets/input.js000066400000000000000000000000311324054410700205400ustar00rootroot00000000000000const answer = () => 42; buble-0.19.3/test/cli/writes-to-stdout/000077500000000000000000000000001324054410700177005ustar00rootroot00000000000000buble-0.19.3/test/cli/writes-to-stdout/command.sh000077500000000000000000000000421324054410700216510ustar00rootroot00000000000000buble input.js > actual/output.js buble-0.19.3/test/cli/writes-to-stdout/expected/000077500000000000000000000000001324054410700215015ustar00rootroot00000000000000buble-0.19.3/test/cli/writes-to-stdout/expected/output.js000066400000000000000000000000521324054410700233740ustar00rootroot00000000000000var answer = function () { return 42; }; buble-0.19.3/test/cli/writes-to-stdout/input.js000066400000000000000000000000311324054410700213670ustar00rootroot00000000000000const answer = () => 42; buble-0.19.3/test/samples/000077500000000000000000000000001324054410700153205ustar00rootroot00000000000000buble-0.19.3/test/samples/arrow-functions.js000066400000000000000000000104511324054410700210170ustar00rootroot00000000000000module.exports = [ { description: 'transpiles an arrow function', input: `var answer = () => 42`, output: `var answer = function () { return 42; }` }, { description: 'transpiles an arrow function with a naked parameter', input: `var double = x => x * 2`, output: `var double = function (x) { return x * 2; }` }, { description: 'transpiles an arrow function with single wrapped parameter', input: `var double = (x) => x * 2`, output: `var double = function (x) { return x * 2; }` }, { description: 'transpiles an arrow function with parenthesised parameters', input: `var add = ( a, b ) => a + b`, output: `var add = function ( a, b ) { return a + b; }` }, { description: 'transpiles an arrow function with a body', input: ` var add = ( a, b ) => { return a + b; };`, output: ` var add = function ( a, b ) { return a + b; };` }, { description: 'replaces `this` inside an arrow function', input: ` this.foo = 'bar'; var lexicallyScoped = () => this.foo;`, output: ` var this$1 = this; this.foo = 'bar'; var lexicallyScoped = function () { return this$1.foo; };` }, { description: 'replaces `arguments` inside an arrow function', input: ` function firstArgument () { return () => arguments[0]; } equal( firstArgument( 1, 2, 3 )(), 1 )`, output: ` function firstArgument () { var arguments$1 = arguments; return function () { return arguments$1[0]; }; } equal( firstArgument( 1, 2, 3 )(), 1 )` }, { description: 'only adds one `this` or `arguments` per context', input: ` function multiply () { return () => { return () => this * arguments[0]; }; } equal( multiply.call( 2, 3 )()(), 6 )`, output: ` function multiply () { var arguments$1 = arguments; var this$1 = this; return function () { return function () { return this$1 * arguments$1[0]; }; }; } equal( multiply.call( 2, 3 )()(), 6 )` }, { description: 'transpiles a body-less arrow function with rest params', input: ` const sum = ( ...nums ) => nums.reduce( ( t, n ) => t + n, 0 );`, output: ` var sum = function () { var nums = [], len = arguments.length; while ( len-- ) nums[ len ] = arguments[ len ]; return nums.reduce( function ( t, n ) { return t + n; }, 0 ); };` }, { description: 'handles combination of destructuring and template strings', input: ` var shoutHello = ({ name }) => \`\${name}! Hello \${name}!\`.toUpperCase();`, output: ` var shoutHello = function (ref) { var name = ref.name; return (name + "! Hello " + name + "!").toUpperCase(); };` }, { description: 'can be disabled with `transforms.arrow: false`', options: { transforms: { arrow: false } }, input: ` var add = ( a, b ) => { console.log( 'this, arguments', this, arguments ) a = b; }`, output: ` var add = ( a, b ) => { console.log( 'this, arguments', this, arguments ) a = b; }` }, { description: 'inserts statements after use strict pragma (#72)', input: ` 'use strict'; setTimeout( () => console.log( this ) ); function foo () { 'use strict'; setTimeout( () => console.log( this ) ); }`, output: ` 'use strict'; var this$1 = this; setTimeout( function () { return console.log( this$1 ); } ); function foo () { 'use strict'; var this$1 = this; setTimeout( function () { return console.log( this$1 ); } ); }` }, { description: 'handles standalone arrow function expression statement', input: ` () => console.log( 'not printed' );`, output: ` !function() { return console.log( 'not printed' ); };` }, { description: 'handles standalone arrow function expression statement within a function', input: ` function no_op () { () => console.log( 'not printed' ); }`, output: ` function no_op () { !function() { return console.log( 'not printed' ); }; }` }, { description: 'are transformed even if disabled if they have a transpiled spread parameter', options: { transforms: { arrow: false, spreadRest: true } }, input: ` (...args) => console.log( args );`, output: ` !function() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; return console.log( args ); };` } ]; buble-0.19.3/test/samples/async.js000066400000000000000000000002321324054410700167700ustar00rootroot00000000000000module.exports = [ { description: 'supports async as property name', input: ` ({async, foo})`, output: ` ({async: async, foo: foo})` } ]; buble-0.19.3/test/samples/binary-and-octal.js000066400000000000000000000010411324054410700207760ustar00rootroot00000000000000module.exports = [ { description: 'transpiles binary numbers', input: ` var num = 0b111110111; var str = '0b111110111';`, output: ` var num = 503; var str = '0b111110111';` }, { description: 'transpiles octal numbers', input: ` var num = 0o767; var str = '0o767';`, output: ` var num = 503; var str = '0o767';` }, { description: 'can be disabled with `transforms.numericLiteral: false`', options: { transforms: { numericLiteral: false } }, input: '0b111110111', output: '0b111110111' } ]; buble-0.19.3/test/samples/block-scoping.js000066400000000000000000000177461324054410700204270ustar00rootroot00000000000000module.exports = [ { description: 'transpiles let', input: `let x = 'y';`, output: `var x = 'y';` }, { description: 'deconflicts blocks in top-level scope', input: ` if ( a ) { let x = 1; console.log( x ); } else if ( b ) { let x = 2; console.log( x ); } else { let x = 3; console.log( x ); }`, output: ` if ( a ) { var x = 1; console.log( x ); } else if ( b ) { var x$1 = 2; console.log( x$1 ); } else { var x$2 = 3; console.log( x$2 ); }` }, { description: 'deconflicts blocks in same function scope', input: ` var x = 'y'; function foo () { if ( a ) { let x = 1; console.log( x ); } else if ( b ) { let x = 2; console.log( x ); } else { let x = 3; console.log( x ); } }`, output: ` var x = 'y'; function foo () { if ( a ) { var x = 1; console.log( x ); } else if ( b ) { var x$1 = 2; console.log( x$1 ); } else { var x$2 = 3; console.log( x$2 ); } }` }, { description: 'disallows duplicate declarations', input: ` let x = 1; let x = 2; `, error: /Identifier 'x' has already been declared/ }, { description: 'disallows reassignment to constants', input: ` const x = 1; x = 2; `, error: /x is read-only/ }, { description: 'disallows destructured reassignment to constants, short-hand property', input: ` const x = 1; ({ x } = {}); `, error: /x is read-only/ }, { description: 'disallows destructured reassignment to constants, rest property', input: ` const x = 1; ({ ...x } = {}); `, error: /x is read-only/ }, { description: 'disallows destructured reassignment to constants, renamed property', input: ` const x = 1; ({ y: x } = {}); `, error: /x is read-only/ }, { description: 'disallows destructured reassignment to constants, array', input: ` const x = 1; ([ x ] = []); `, error: /x is read-only/ }, { description: 'disallows destructured reassignment to constants, rest element', input: ` const x = 1; ([ ...x ] = []); `, error: /x is read-only/ }, { description: 'disallows updates to constants', input: ` const x = 1; x++; `, error: /x is read-only/ }, { description: 'does not rewrite properties', input: ` var foo = 'x'; if ( true ) { let foo = 'y'; this.foo = 'z'; this[ foo ] = 'q'; }`, output: ` var foo = 'x'; if ( true ) { var foo$1 = 'y'; this.foo = 'z'; this[ foo$1 ] = 'q'; }` }, { description: 'deconflicts with default imports', options: { transforms: { moduleImport: false } }, input: ` import foo from './foo.js'; if ( x ) { let foo = 'y'; console.log( foo ); }`, output: ` import foo from './foo.js'; if ( x ) { var foo$1 = 'y'; console.log( foo$1 ); }` }, { description: 'deconflicts with named imports', options: { transforms: { moduleImport: false } }, input: ` import { foo } from './foo.js'; if ( x ) { let foo = 'y'; console.log( foo ); }`, output: ` import { foo } from './foo.js'; if ( x ) { var foo$1 = 'y'; console.log( foo$1 ); }` }, { description: 'deconflicts with function declarations', input: ` function foo () {} if ( x ) { let foo = 'y'; console.log( foo ); }`, output: ` function foo () {} if ( x ) { var foo$1 = 'y'; console.log( foo$1 ); }` }, { description: 'does not deconflict with function expressions', input: ` var bar = function foo () {}; if ( x ) { let foo = 'y'; console.log( foo ); }`, output: ` var bar = function foo () {}; if ( x ) { var foo = 'y'; console.log( foo ); }` }, { description: 'deconflicts with function expression inside function body', input: ` var bar = function foo () { if ( x ) { let foo = 'y'; console.log( foo ); } };`, output: ` var bar = function foo () { if ( x ) { var foo$1 = 'y'; console.log( foo$1 ); } };` }, { description: 'deconflicts with parameters', input: ` function bar ( foo ) { if ( x ) { let foo = 'y'; console.log( foo ); } }`, output: ` function bar ( foo ) { if ( x ) { var foo$1 = 'y'; console.log( foo$1 ); } }` }, { description: 'deconflicts with class declarations', input: ` class foo {} if ( x ) { let foo = 'y'; console.log( foo ); }`, output: ` var foo = function foo () {}; if ( x ) { var foo$1 = 'y'; console.log( foo$1 ); }` }, { description: 'does not deconflict with class expressions', input: ` var bar = class foo {}; if ( x ) { let foo = 'y'; console.log( foo ); }`, output: ` var bar = (function () { function foo () {} return foo; }()); if ( x ) { var foo = 'y'; console.log( foo ); }` }, { description: 'deconflicts across multiple function boundaries', input: ` function foo ( x ) { return function () { if ( true ) { const x = 'y'; console.log( x ); } console.log( x ); }; }`, output: ` function foo ( x ) { return function () { if ( true ) { var x$1 = 'y'; console.log( x$1 ); } console.log( x ); }; }` }, { description: 'does not deconflict unnecessarily', input: ` function foo ( x ) { return function () { if ( true ) { const x = 'y'; console.log( x ); } }; }`, output: ` function foo ( x ) { return function () { if ( true ) { var x = 'y'; console.log( x ); } }; }` }, { description: 'deconflicts object pattern declarations', input: ` let x; if ( true ) { let { x, y } = point; console.log( x ); }`, output: ` var x; if ( true ) { var x$1 = point.x; var y = point.y; console.log( x$1 ); }` }, { description: 'deconflicts array pattern declarations', input: ` let x; if ( true ) { let [ x, y ] = point; console.log( x ); }`, output: ` var x; if ( true ) { var x$1 = point[0]; var y = point[1]; console.log( x$1 ); }` }, { description: 'deconflicts rest element declarations', input: ` let x; if ( true ) { let [ first, second, ...x ] = y; console.log( x ); }`, output: ` var x; if ( true ) { var first = y[0]; var second = y[1]; var x$1 = y.slice(2); console.log( x$1 ); }` }, { description: 'can be disabled with `transforms.letConst: false`', options: { transforms: { letConst: false } }, input: ` let a = 1; if ( x ) { let a = 2; console.log( a ); } console.log( a );`, output: ` let a = 1; if ( x ) { let a = 2; console.log( a ); } console.log( a );` }, { description: 'reference preceding declaration (#87)', input: ` if ( x ) { let a = function () { b(); }; let b = function () { alert( 'hello' ); }; a(); b(); }`, output: ` if ( x ) { var a = function () { b(); }; var b = function () { alert( 'hello' ); }; a(); b(); }` }, { description: 'correctly recognizes shadowing of const variables by mutable variables declared after mutation', input: ` const bar = "FAIL"; (function() { function foo() { --bar; bar = ["fail", "PASS", "Fail"][bar]; } let bar = 2; foo(); console.log(bar); }()); `, output: ` var bar = "FAIL"; (function() { function foo() { --bar; bar = ["fail", "PASS", "Fail"][bar]; } var bar = 2; foo(); console.log(bar); }()); ` }, { description: 'correctly transpiles if arrow functions are not transpiled', options: { transforms: { arrow: false } }, input: ` var c; if (true) { let c = prop.end; console.log(c); }`, output: ` var c; if (true) { var c$1 = prop.end; console.log(c$1); }`, } ]; buble-0.19.3/test/samples/classes-no-named-function-expressions.js000066400000000000000000000561751324054410700252300ustar00rootroot00000000000000module.exports = [ { description: 'transpiles a class declaration', options: { namedFunctionExpressions: false }, input: ` class Foo { constructor ( answer ) { this.answer = answer; } }`, output: ` var Foo = function ( answer ) { this.answer = answer; };` }, { description: 'transpiles a class declaration with a non-constructor method', options: { namedFunctionExpressions: false }, input: ` class Foo { constructor ( answer ) { this.answer = answer; } bar ( str ) { return str + 'bar'; } }`, output: ` var Foo = function ( answer ) { this.answer = answer; }; Foo.prototype.bar = function ( str ) { return str + 'bar'; };` }, { description: 'transpiles a class declaration without a constructor function', options: { namedFunctionExpressions: false }, input: ` class Foo { bar ( str ) { return str + 'bar'; } }`, output: ` var Foo = function () {}; Foo.prototype.bar = function ( str ) { return str + 'bar'; };` }, { description: 'no unnecessary deshadowing of method names', options: { namedFunctionExpressions: false }, input: ` var bar = 'x'; class Foo { bar ( str ) { return str + 'bar'; } }`, output: ` var bar = 'x'; var Foo = function () {}; Foo.prototype.bar = function ( str ) { return str + 'bar'; };` }, { description: 'transpiles a class declaration with a static method', options: { namedFunctionExpressions: false }, input: ` class Foo { bar ( str ) { return str + 'bar'; } static baz ( str ) { return str + 'baz'; } }`, output: ` var Foo = function () {}; Foo.prototype.bar = function ( str ) { return str + 'bar'; }; Foo.baz = function ( str ) { return str + 'baz'; };` }, { description: 'transpiles a subclass', options: { namedFunctionExpressions: false }, input: ` class Foo extends Bar { baz ( str ) { return str + 'baz'; } }`, output: ` var Foo = (function (Bar) { function Foo () { Bar.apply(this, arguments); } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.prototype.baz = function ( str ) { return str + 'baz'; }; return Foo; }(Bar));` }, { description: 'transpiles a subclass with super calls', options: { namedFunctionExpressions: false }, input: ` class Foo extends Bar { constructor ( x ) { super( x ); this.y = 'z'; } baz ( a, b, c ) { super.baz( a, b, c ); } }`, output: ` var Foo = (function (Bar) { function Foo ( x ) { Bar.call( this, x ); this.y = 'z'; } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.prototype.baz = function ( a, b, c ) { Bar.prototype.baz.call( this, a, b, c ); }; return Foo; }(Bar));` }, { description: 'transpiles a subclass with super calls with spread arguments', options: { namedFunctionExpressions: false }, input: ` class Foo extends Bar { baz ( ...args ) { super.baz(...args); } boz ( x, y, ...z ) { super.boz(x, y, ...z); } fab ( x, ...y ) { super.qux(...x, ...y); } fob ( x, y, ...z ) { ((x, y, z) => super.qux(x, ...y, ...z))(x, y, z); } }`, output: ` var Foo = (function (Bar) { function Foo () { Bar.apply(this, arguments); } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.prototype.baz = function () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; Bar.prototype.baz.apply(this, args); }; Foo.prototype.boz = function ( x, y ) { var z = [], len = arguments.length - 2; while ( len-- > 0 ) z[ len ] = arguments[ len + 2 ]; Bar.prototype.boz.apply(this, [ x, y ].concat( z )); }; Foo.prototype.fab = function ( x ) { var y = [], len = arguments.length - 1; while ( len-- > 0 ) y[ len ] = arguments[ len + 1 ]; Bar.prototype.qux.apply(this, x.concat( y )); }; Foo.prototype.fob = function ( x, y ) { var this$1 = this; var z = [], len = arguments.length - 2; while ( len-- > 0 ) z[ len ] = arguments[ len + 2 ]; (function (x, y, z) { return Bar.prototype.qux.apply(this$1, [ x ].concat( y, z )); })(x, y, z); }; return Foo; }(Bar));` }, { description: 'transpiles export default class', options: { transforms: { moduleExport: false }, namedFunctionExpressions: false }, input: ` export default class Foo { bar () {} }`, output: ` var Foo = function () {}; Foo.prototype.bar = function () {}; export default Foo;` }, { description: 'transpiles export default subclass', options: { transforms: { moduleExport: false }, namedFunctionExpressions: false }, input: ` export default class Foo extends Bar { bar () {} }`, output: ` var Foo = (function (Bar) { function Foo () { Bar.apply(this, arguments); } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.prototype.bar = function () {}; return Foo; }(Bar)); export default Foo;` }, { description: 'transpiles export default subclass with subsequent statement', options: { transforms: { moduleExport: false }, namedFunctionExpressions: false }, input: ` export default class Foo extends Bar { bar () {} } new Foo().bar();`, output: ` var Foo = (function (Bar) { function Foo () { Bar.apply(this, arguments); } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.prototype.bar = function () {}; return Foo; }(Bar)); export default Foo; new Foo().bar();` }, { description: 'transpiles empty class', options: { namedFunctionExpressions: false }, input: `class Foo {}`, output: `var Foo = function () {};` }, { description: 'transpiles an anonymous empty class expression', options: { namedFunctionExpressions: false }, input: ` var Foo = class {};`, output: ` var Foo = (function () { function Foo () {} return Foo; }());` }, { description: 'transpiles an anonymous class expression with a constructor', options: { namedFunctionExpressions: false }, input: ` var Foo = class { constructor ( x ) { this.x = x; } };`, output: ` var Foo = (function () { function Foo ( x ) { this.x = x; } return Foo; }());` }, { description: 'transpiles an anonymous class expression with a non-constructor method', options: { namedFunctionExpressions: false }, input: ` var Foo = class { bar ( x ) { console.log( x ); } };`, output: ` var Foo = (function () { function Foo () {} Foo.prototype.bar = function ( x ) { console.log( x ); }; return Foo; }());` }, { description: 'allows constructor to be in middle of body', options: { namedFunctionExpressions: false }, input: ` class Foo { before () { // code goes here } constructor () { // constructor goes here } after () { // code goes here } }`, output: ` var Foo = function () { // constructor goes here }; Foo.prototype.before = function () { // code goes here }; Foo.prototype.after = function () { // code goes here };` }, { description: 'allows constructor to be at end of body', options: { namedFunctionExpressions: false }, input: ` class Foo { before () { // code goes here } constructor () { // constructor goes here } }`, output: ` var Foo = function () { // constructor goes here }; Foo.prototype.before = function () { // code goes here };` }, { description: 'transpiles getters and setters', options: { namedFunctionExpressions: false }, input: ` class Circle { constructor ( radius ) { this.radius = radius; } get area () { return Math.PI * Math.pow( this.radius, 2 ); } set area ( area ) { this.radius = Math.sqrt( area / Math.PI ); } static get description () { return 'round'; } }`, output: ` var Circle = function ( radius ) { this.radius = radius; }; var prototypeAccessors = { area: { configurable: true } }; var staticAccessors = { description: { configurable: true } }; prototypeAccessors.area.get = function () { return Math.PI * Math.pow( this.radius, 2 ); }; prototypeAccessors.area.set = function ( area ) { this.radius = Math.sqrt( area / Math.PI ); }; staticAccessors.description.get = function () { return 'round'; }; Object.defineProperties( Circle.prototype, prototypeAccessors ); Object.defineProperties( Circle, staticAccessors );` }, { description: 'transpiles getters and setters in subclass', options: { namedFunctionExpressions: false }, input: ` class Circle extends Shape { constructor ( radius ) { super(); this.radius = radius; } get area () { return Math.PI * Math.pow( this.radius, 2 ); } set area ( area ) { this.radius = Math.sqrt( area / Math.PI ); } static get description () { return 'round'; } }`, output: ` var Circle = (function (Shape) { function Circle ( radius ) { Shape.call(this); this.radius = radius; } if ( Shape ) Circle.__proto__ = Shape; Circle.prototype = Object.create( Shape && Shape.prototype ); Circle.prototype.constructor = Circle; var prototypeAccessors = { area: { configurable: true } }; var staticAccessors = { description: { configurable: true } }; prototypeAccessors.area.get = function () { return Math.PI * Math.pow( this.radius, 2 ); }; prototypeAccessors.area.set = function ( area ) { this.radius = Math.sqrt( area / Math.PI ); }; staticAccessors.description.get = function () { return 'round'; }; Object.defineProperties( Circle.prototype, prototypeAccessors ); Object.defineProperties( Circle, staticAccessors ); return Circle; }(Shape));` }, { description: 'can be disabled with `transforms.classes: false`', options: { namedFunctionExpressions: false, transforms: { classes: false } }, input: ` class Foo extends Bar { constructor ( answer ) { super(); this.answer = answer; } }`, output: ` class Foo extends Bar { constructor ( answer ) { super(); this.answer = answer; } }` }, { description: 'declaration extends from an expression (#15)', options: { namedFunctionExpressions: false }, input: ` const q = {a: class {}}; class b extends q.a { c () {} }`, output: ` var q = {a: (function () { function anonymous () {} return anonymous; }())}; var b = (function (superclass) { function b () { superclass.apply(this, arguments); } if ( superclass ) b.__proto__ = superclass; b.prototype = Object.create( superclass && superclass.prototype ); b.prototype.constructor = b; b.prototype.c = function () {}; return b; }(q.a));` }, { description: 'expression extends from an expression (#15)', options: { namedFunctionExpressions: false }, input: ` const q = {a: class {}}; const b = class b extends q.a { c () {} };`, output: ` var q = {a: (function () { function anonymous () {} return anonymous; }())}; var b = (function (superclass) { function b () { superclass.apply(this, arguments); } if ( superclass ) b.__proto__ = superclass; b.prototype = Object.create( superclass && superclass.prototype ); b.prototype.constructor = b; b.prototype.c = function () {}; return b; }(q.a));` }, { description: 'expression extends from an expression with super calls (#31)', options: { namedFunctionExpressions: false }, input: ` class b extends x.y.z { constructor() { super(); } }`, output: ` var b = (function (superclass) { function b() { superclass.call(this); } if ( superclass ) b.__proto__ = superclass; b.prototype = Object.create( superclass && superclass.prototype ); b.prototype.constructor = b; return b; }(x.y.z));` }, { description: 'anonymous expression extends named class (#31)', options: { namedFunctionExpressions: false }, input: ` SubClass = class extends SuperClass { constructor() { super(); } };`, output: ` SubClass = (function (SuperClass) { function SubClass() { SuperClass.call(this); } if ( SuperClass ) SubClass.__proto__ = SuperClass; SubClass.prototype = Object.create( SuperClass && SuperClass.prototype ); SubClass.prototype.constructor = SubClass; return SubClass; }(SuperClass));` }, { description: 'verify deindent() does not corrupt string literals in class methods (#159)', options: { namedFunctionExpressions: false }, input: ` class Foo { bar() { var s = "0\t1\t\t2\t\t\t3\t\t\t\t4\t\t\t\t\t5"; return s + '\t'; } baz() { return \`\t\`; } } `, output: ` var Foo = function () {}; Foo.prototype.bar = function () { var s = "0\t1\t\t2\t\t\t3\t\t\t\t4\t\t\t\t\t5"; return s + '\t'; }; Foo.prototype.baz = function () { return "\\t"; }; ` }, { description: 'deindents a function body with destructuring (#22)', options: { namedFunctionExpressions: false }, input: ` class Foo { constructor ( options ) { const { a, b } = options; } }`, output: ` var Foo = function ( options ) { var a = options.a; var b = options.b; };` }, { description: 'allows super in static methods', options: { namedFunctionExpressions: false }, input: ` class Foo extends Bar { static baz () { super.baz(); } }`, output: ` var Foo = (function (Bar) { function Foo () { Bar.apply(this, arguments); } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.baz = function () { Bar.baz.call(this); }; return Foo; }(Bar));` }, { description: 'allows zero space between class id and body (#46)', options: { namedFunctionExpressions: false }, input: ` class A{ x(){} } var B = class B{ x(){} }; class C extends D{ x(){} } var E = class E extends F{ x(){} }`, output: ` var A = function () {}; A.prototype.x = function (){}; var B = (function () { function B () {} B.prototype.x = function (){}; return B; }()); var C = (function (D) { function C () { D.apply(this, arguments); } if ( D ) C.__proto__ = D; C.prototype = Object.create( D && D.prototype ); C.prototype.constructor = C; C.prototype.x = function (){}; return C; }(D)); var E = (function (F) { function E () { F.apply(this, arguments); } if ( F ) E.__proto__ = F; E.prototype = Object.create( F && F.prototype ); E.prototype.constructor = E; E.prototype.x = function (){}; return E; }(F))` }, { description: 'transpiles a class with an accessor and no constructor (#48)', options: { namedFunctionExpressions: false }, input: ` class Foo { static get bar() { return 'baz' } }`, output: ` var Foo = function () {}; var staticAccessors = { bar: { configurable: true } }; staticAccessors.bar.get = function () { return 'baz' }; Object.defineProperties( Foo, staticAccessors );` }, { description: 'uses correct indentation for inserted statements in constructor (#39)', options: { namedFunctionExpressions: false }, input: ` class Foo { constructor ( options, { a2, b2 } ) { const { a, b } = options; const render = () => { requestAnimationFrame( render ); this.render(); }; render(); } render () { // code goes here... } }`, output: ` var Foo = function ( options, ref ) { var this$1 = this; var a2 = ref.a2; var b2 = ref.b2; var a = options.a; var b = options.b; var render = function () { requestAnimationFrame( render ); this$1.render(); }; render(); }; Foo.prototype.render = function () { // code goes here... };` }, { description: 'uses correct indentation for inserted statements in subclass constructor (#39)', options: { namedFunctionExpressions: false }, input: ` class Foo extends Bar { constructor ( options, { a2, b2 } ) { super(); const { a, b } = options; const render = () => { requestAnimationFrame( render ); this.render(); }; render(); } render () { // code goes here... } }`, output: ` var Foo = (function (Bar) { function Foo ( options, ref ) { var this$1 = this; var a2 = ref.a2; var b2 = ref.b2; Bar.call(this); var a = options.a; var b = options.b; var render = function () { requestAnimationFrame( render ); this$1.render(); }; render(); } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.prototype.render = function () { // code goes here... }; return Foo; }(Bar));` }, { description: 'allows subclass to use rest parameters', options: { namedFunctionExpressions: false }, input: ` class SubClass extends SuperClass { constructor( ...args ) { super( ...args ); } }`, output: ` var SubClass = (function (SuperClass) { function SubClass() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; SuperClass.apply( this, args ); } if ( SuperClass ) SubClass.__proto__ = SuperClass; SubClass.prototype = Object.create( SuperClass && SuperClass.prototype ); SubClass.prototype.constructor = SubClass; return SubClass; }(SuperClass));` }, { description: 'allows subclass to use rest parameters with other arguments', options: { namedFunctionExpressions: false }, input: ` class SubClass extends SuperClass { constructor( ...args ) { super( 1, ...args, 2 ); } }`, output: ` var SubClass = (function (SuperClass) { function SubClass() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; SuperClass.apply( this, [ 1 ].concat( args, [2] ) ); } if ( SuperClass ) SubClass.__proto__ = SuperClass; SubClass.prototype = Object.create( SuperClass && SuperClass.prototype ); SubClass.prototype.constructor = SubClass; return SubClass; }(SuperClass));` }, { description: 'transpiles computed class properties', options: { namedFunctionExpressions: false }, input: ` class Foo { [a.b.c] () { // code goes here } }`, output: ` var Foo = function () {}; Foo.prototype[a.b.c] = function () { // code goes here };` }, { description: 'transpiles static computed class properties', options: { namedFunctionExpressions: false }, input: ` class Foo { static [a.b.c] () { // code goes here } }`, output: ` var Foo = function () {}; Foo[a.b.c] = function () { // code goes here };` }, { skip: true, description: 'transpiles computed class accessors', options: { namedFunctionExpressions: false }, input: ` class Foo { get [a.b.c] () { // code goes here } }`, output: ` var Foo = function () {}; var prototypeAccessors = {}; var ref = a.b.c; prototypeAccessors[ref] = {}; prototypeAccessors[ref].get = function () { // code goes here }; Object.defineProperties( Foo.prototype, prototypeAccessors );` }, { description: 'transpiles reserved class properties (!68)', options: { namedFunctionExpressions: false }, input: ` class Foo { catch () { // code goes here } }`, output: ` var Foo = function () {}; Foo.prototype.catch = function () { // code goes here };` }, { description: 'transpiles static reserved class properties (!68)', options: { namedFunctionExpressions: false }, input: ` class Foo { static catch () { // code goes here } }`, output: ` var Foo = function () {}; Foo.catch = function () { // code goes here };` }, { description: 'uses correct `this` when transpiling `super` (#89)', options: { namedFunctionExpressions: false }, input: ` class A extends B { constructor () { super(); this.doSomething(() => { super.doSomething(); }); } }`, output: ` var A = (function (B) { function A () { var this$1 = this; B.call(this); this.doSomething(function () { B.prototype.doSomething.call(this$1); }); } if ( B ) A.__proto__ = B; A.prototype = Object.create( B && B.prototype ); A.prototype.constructor = A; return A; }(B));` }, { description: 'methods with computed names', options: { namedFunctionExpressions: false }, input: ` class A { [x](){} [0](){} [1 + 2](){} [normal + " Method"](){} } `, output: ` var A = function () {}; A.prototype[x] = function (){}; A.prototype[0] = function (){}; A.prototype[1 + 2] = function (){}; A.prototype[normal + " Method"] = function (){}; ` }, { description: 'static methods with computed names with varied spacing (#139)', options: { namedFunctionExpressions: false }, input: ` class B { static[.000004](){} static [x](){} static [x-y](){} static[\`Static computed \${name}\`](){} } `, output: ` var B = function () {}; B[.000004] = function (){}; B[x] = function (){}; B [x-y] = function (){}; B[("Static computed " + name)] = function (){}; ` }, { description: 'methods with numeric or string names (#139)', options: { namedFunctionExpressions: false }, input: ` class C { 0(){} 0b101(){} 80(){} .12e3(){} 0o753(){} 12e34(){} 0xFFFF(){} "var"(){} } `, output: ` var C = function () {}; C.prototype[0] = function (){}; C.prototype[5] = function (){}; C.prototype[80] = function (){}; C.prototype[.12e3] = function (){}; C.prototype[491] = function (){}; C.prototype[12e34] = function (){}; C.prototype[0xFFFF] = function (){}; C.prototype["var"] = function (){}; ` }, { description: 'static methods with numeric or string names with varied spacing (#139)', options: { namedFunctionExpressions: false }, input: ` class D { static .75(){} static"Static Method"(){} static "foo"(){} } `, output: ` var D = function () {}; D[.75] = function (){}; D["Static Method"] = function (){}; D["foo"] = function (){}; ` } // TODO more tests. e.g. getters and setters. // 'super.*' is not allowed before super() ]; buble-0.19.3/test/samples/classes.js000066400000000000000000000536751324054410700173330ustar00rootroot00000000000000module.exports = [ { description: 'transpiles a class declaration', input: ` class Foo { constructor ( answer ) { this.answer = answer; } }`, output: ` var Foo = function Foo ( answer ) { this.answer = answer; };` }, { description: 'transpiles a class declaration with a non-constructor method', input: ` class Foo { constructor ( answer ) { this.answer = answer; } bar ( str ) { return str + 'bar'; } }`, output: ` var Foo = function Foo ( answer ) { this.answer = answer; }; Foo.prototype.bar = function bar ( str ) { return str + 'bar'; };` }, { description: 'transpiles a class declaration without a constructor function', input: ` class Foo { bar ( str ) { return str + 'bar'; } }`, output: ` var Foo = function Foo () {}; Foo.prototype.bar = function bar ( str ) { return str + 'bar'; };` }, { description: 'no unnecessary deshadowing of method names', input: ` var bar = 'x'; class Foo { bar ( str ) { return str + 'bar'; } }`, output: ` var bar = 'x'; var Foo = function Foo () {}; Foo.prototype.bar = function bar ( str ) { return str + 'bar'; };` }, { description: 'transpiles a class declaration with a static method', input: ` class Foo { bar ( str ) { return str + 'bar'; } static baz ( str ) { return str + 'baz'; } }`, output: ` var Foo = function Foo () {}; Foo.prototype.bar = function bar ( str ) { return str + 'bar'; }; Foo.baz = function baz ( str ) { return str + 'baz'; };` }, { description: 'transpiles a subclass', input: ` class Foo extends Bar { baz ( str ) { return str + 'baz'; } }`, output: ` var Foo = (function (Bar) { function Foo () { Bar.apply(this, arguments); } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.prototype.baz = function baz ( str ) { return str + 'baz'; }; return Foo; }(Bar));` }, { description: 'transpiles a subclass with super calls', input: ` class Foo extends Bar { constructor ( x ) { super( x ); this.y = 'z'; } baz ( a, b, c ) { super.baz( a, b, c ); } }`, output: ` var Foo = (function (Bar) { function Foo ( x ) { Bar.call( this, x ); this.y = 'z'; } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.prototype.baz = function baz ( a, b, c ) { Bar.prototype.baz.call( this, a, b, c ); }; return Foo; }(Bar));` }, { description: 'transpiles a subclass with super calls with spread arguments', input: ` class Foo extends Bar { baz ( ...args ) { super.baz(...args); } boz ( x, y, ...z ) { super.boz(x, y, ...z); } fab ( x, ...y ) { super.qux(...x, ...y); } fob ( x, y, ...z ) { ((x, y, z) => super.qux(x, ...y, ...z))(x, y, z); } }`, output: ` var Foo = (function (Bar) { function Foo () { Bar.apply(this, arguments); } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.prototype.baz = function baz () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; Bar.prototype.baz.apply(this, args); }; Foo.prototype.boz = function boz ( x, y ) { var z = [], len = arguments.length - 2; while ( len-- > 0 ) z[ len ] = arguments[ len + 2 ]; Bar.prototype.boz.apply(this, [ x, y ].concat( z )); }; Foo.prototype.fab = function fab ( x ) { var y = [], len = arguments.length - 1; while ( len-- > 0 ) y[ len ] = arguments[ len + 1 ]; Bar.prototype.qux.apply(this, x.concat( y )); }; Foo.prototype.fob = function fob ( x, y ) { var this$1 = this; var z = [], len = arguments.length - 2; while ( len-- > 0 ) z[ len ] = arguments[ len + 2 ]; (function (x, y, z) { return Bar.prototype.qux.apply(this$1, [ x ].concat( y, z )); })(x, y, z); }; return Foo; }(Bar));` }, { description: 'transpiles export default class', options: { transforms: { moduleExport: false } }, input: ` export default class Foo { bar () {} }`, output: ` var Foo = function Foo () {}; Foo.prototype.bar = function bar () {}; export default Foo;` }, { description: 'transpiles export default subclass', options: { transforms: { moduleExport: false } }, input: ` export default class Foo extends Bar { bar () {} }`, output: ` var Foo = (function (Bar) { function Foo () { Bar.apply(this, arguments); } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.prototype.bar = function bar () {}; return Foo; }(Bar)); export default Foo;` }, { description: 'transpiles export default subclass with subsequent statement', options: { transforms: { moduleExport: false } }, input: ` export default class Foo extends Bar { bar () {} } new Foo().bar();`, output: ` var Foo = (function (Bar) { function Foo () { Bar.apply(this, arguments); } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.prototype.bar = function bar () {}; return Foo; }(Bar)); export default Foo; new Foo().bar();` }, { description: 'transpiles empty class', input: `class Foo {}`, output: `var Foo = function Foo () {};` }, { description: 'transpiles an anonymous empty class expression', input: ` var Foo = class {};`, output: ` var Foo = (function () { function Foo () {} return Foo; }());` }, { description: 'transpiles an anonymous class expression with a constructor', input: ` var Foo = class { constructor ( x ) { this.x = x; } };`, output: ` var Foo = (function () { function Foo ( x ) { this.x = x; } return Foo; }());` }, { description: 'transpiles an anonymous class expression with a non-constructor method', input: ` var Foo = class { bar ( x ) { console.log( x ); } };`, output: ` var Foo = (function () { function Foo () {} Foo.prototype.bar = function bar ( x ) { console.log( x ); }; return Foo; }());` }, { description: 'transpiles an anonymous class expression that is assigned to a property', input: ` const q = {}; q.a = class { c () {} };`, output: ` var q = {}; q.a = (function () { function a () {} a.prototype.c = function c () {}; return a; }());` }, { description: 'allows constructor to be in middle of body', input: ` class Foo { before () { // code goes here } constructor () { // constructor goes here } after () { // code goes here } }`, output: ` var Foo = function Foo () { // constructor goes here }; Foo.prototype.before = function before () { // code goes here }; Foo.prototype.after = function after () { // code goes here };` }, { description: 'allows constructor to be at end of body', input: ` class Foo { before () { // code goes here } constructor () { // constructor goes here } }`, output: ` var Foo = function Foo () { // constructor goes here }; Foo.prototype.before = function before () { // code goes here };` }, { description: 'transpiles getters and setters', input: ` class Circle { constructor ( radius ) { this.radius = radius; } get area () { return Math.PI * Math.pow( this.radius, 2 ); } set area ( area ) { this.radius = Math.sqrt( area / Math.PI ); } static get description () { return 'round'; } }`, output: ` var Circle = function Circle ( radius ) { this.radius = radius; }; var prototypeAccessors = { area: { configurable: true } }; var staticAccessors = { description: { configurable: true } }; prototypeAccessors.area.get = function () { return Math.PI * Math.pow( this.radius, 2 ); }; prototypeAccessors.area.set = function ( area ) { this.radius = Math.sqrt( area / Math.PI ); }; staticAccessors.description.get = function () { return 'round'; }; Object.defineProperties( Circle.prototype, prototypeAccessors ); Object.defineProperties( Circle, staticAccessors );` }, { description: 'transpiles getters and setters in subclass', input: ` class Circle extends Shape { constructor ( radius ) { super(); this.radius = radius; } get area () { return Math.PI * Math.pow( this.radius, 2 ); } set area ( area ) { this.radius = Math.sqrt( area / Math.PI ); } static get description () { return 'round'; } }`, output: ` var Circle = (function (Shape) { function Circle ( radius ) { Shape.call(this); this.radius = radius; } if ( Shape ) Circle.__proto__ = Shape; Circle.prototype = Object.create( Shape && Shape.prototype ); Circle.prototype.constructor = Circle; var prototypeAccessors = { area: { configurable: true } }; var staticAccessors = { description: { configurable: true } }; prototypeAccessors.area.get = function () { return Math.PI * Math.pow( this.radius, 2 ); }; prototypeAccessors.area.set = function ( area ) { this.radius = Math.sqrt( area / Math.PI ); }; staticAccessors.description.get = function () { return 'round'; }; Object.defineProperties( Circle.prototype, prototypeAccessors ); Object.defineProperties( Circle, staticAccessors ); return Circle; }(Shape));` }, { description: 'can be disabled with `transforms.classes: false`', options: { transforms: { classes: false } }, input: ` class Foo extends Bar { constructor ( answer ) { super(); this.answer = answer; } }`, output: ` class Foo extends Bar { constructor ( answer ) { super(); this.answer = answer; } }` }, { description: 'declaration extends from an expression (#15)', input: ` const q = {a: class {}}; class b extends q.a { c () {} }`, output: ` var q = {a: (function () { function anonymous () {} return anonymous; }())}; var b = (function (superclass) { function b () { superclass.apply(this, arguments); } if ( superclass ) b.__proto__ = superclass; b.prototype = Object.create( superclass && superclass.prototype ); b.prototype.constructor = b; b.prototype.c = function c () {}; return b; }(q.a));` }, { description: 'expression extends from an expression (#15)', input: ` const q = {a: class {}}; const b = class b extends q.a { c () {} };`, output: ` var q = {a: (function () { function anonymous () {} return anonymous; }())}; var b = (function (superclass) { function b () { superclass.apply(this, arguments); } if ( superclass ) b.__proto__ = superclass; b.prototype = Object.create( superclass && superclass.prototype ); b.prototype.constructor = b; b.prototype.c = function c () {}; return b; }(q.a));` }, { description: 'expression extends from an expression with super calls (#31)', input: ` class b extends x.y.z { constructor() { super(); } }`, output: ` var b = (function (superclass) { function b() { superclass.call(this); } if ( superclass ) b.__proto__ = superclass; b.prototype = Object.create( superclass && superclass.prototype ); b.prototype.constructor = b; return b; }(x.y.z));` }, { description: 'anonymous expression extends named class (#31)', input: ` SubClass = class extends SuperClass { constructor() { super(); } };`, output: ` SubClass = (function (SuperClass) { function SubClass() { SuperClass.call(this); } if ( SuperClass ) SubClass.__proto__ = SuperClass; SubClass.prototype = Object.create( SuperClass && SuperClass.prototype ); SubClass.prototype.constructor = SubClass; return SubClass; }(SuperClass));` }, { description: 'verify deindent() does not corrupt string literals in class methods (#159)', input: ` class Foo { bar() { var s = "0\t1\t\t2\t\t\t3\t\t\t\t4\t\t\t\t\t5"; return s + '\t'; } baz() { return \`\t\`; } } `, output: ` var Foo = function Foo () {}; Foo.prototype.bar = function bar () { var s = "0\t1\t\t2\t\t\t3\t\t\t\t4\t\t\t\t\t5"; return s + '\t'; }; Foo.prototype.baz = function baz () { return "\\t"; }; ` }, { description: 'deindents a function body with destructuring (#22)', input: ` class Foo { constructor ( options ) { const { a, b } = options; } }`, output: ` var Foo = function Foo ( options ) { var a = options.a; var b = options.b; };` }, { description: 'allows super in static methods', input: ` class Foo extends Bar { static baz () { super.baz(); } }`, output: ` var Foo = (function (Bar) { function Foo () { Bar.apply(this, arguments); } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.baz = function baz () { Bar.baz.call(this); }; return Foo; }(Bar));` }, { description: 'allows zero space between class id and body (#46)', input: ` class A{ x(){} } var B = class B{ x(){} }; class C extends D{ x(){} } var E = class E extends F{ x(){} }`, output: ` var A = function A () {}; A.prototype.x = function x (){}; var B = (function () { function B () {} B.prototype.x = function x (){}; return B; }()); var C = (function (D) { function C () { D.apply(this, arguments); } if ( D ) C.__proto__ = D; C.prototype = Object.create( D && D.prototype ); C.prototype.constructor = C; C.prototype.x = function x (){}; return C; }(D)); var E = (function (F) { function E () { F.apply(this, arguments); } if ( F ) E.__proto__ = F; E.prototype = Object.create( F && F.prototype ); E.prototype.constructor = E; E.prototype.x = function x (){}; return E; }(F))` }, { description: 'transpiles a class with an accessor and no constructor (#48)', input: ` class Foo { static get bar() { return 'baz' } }`, output: ` var Foo = function Foo () {}; var staticAccessors = { bar: { configurable: true } }; staticAccessors.bar.get = function () { return 'baz' }; Object.defineProperties( Foo, staticAccessors );` }, { description: 'uses correct indentation for inserted statements in constructor (#39)', input: ` class Foo { constructor ( options, { a2, b2 } ) { const { a, b } = options; const render = () => { requestAnimationFrame( render ); this.render(); }; render(); } render () { // code goes here... } }`, output: ` var Foo = function Foo ( options, ref ) { var this$1 = this; var a2 = ref.a2; var b2 = ref.b2; var a = options.a; var b = options.b; var render = function () { requestAnimationFrame( render ); this$1.render(); }; render(); }; Foo.prototype.render = function render () { // code goes here... };` }, { description: 'uses correct indentation for inserted statements in subclass constructor (#39)', input: ` class Foo extends Bar { constructor ( options, { a2, b2 } ) { super(); const { a, b } = options; const render = () => { requestAnimationFrame( render ); this.render(); }; render(); } render () { // code goes here... } }`, output: ` var Foo = (function (Bar) { function Foo ( options, ref ) { var this$1 = this; var a2 = ref.a2; var b2 = ref.b2; Bar.call(this); var a = options.a; var b = options.b; var render = function () { requestAnimationFrame( render ); this$1.render(); }; render(); } if ( Bar ) Foo.__proto__ = Bar; Foo.prototype = Object.create( Bar && Bar.prototype ); Foo.prototype.constructor = Foo; Foo.prototype.render = function render () { // code goes here... }; return Foo; }(Bar));` }, { description: 'allows subclass to use rest parameters', input: ` class SubClass extends SuperClass { constructor( ...args ) { super( ...args ); } }`, output: ` var SubClass = (function (SuperClass) { function SubClass() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; SuperClass.apply( this, args ); } if ( SuperClass ) SubClass.__proto__ = SuperClass; SubClass.prototype = Object.create( SuperClass && SuperClass.prototype ); SubClass.prototype.constructor = SubClass; return SubClass; }(SuperClass));` }, { description: 'allows subclass to use rest parameters with other arguments', input: ` class SubClass extends SuperClass { constructor( ...args ) { super( 1, ...args, 2 ); } }`, output: ` var SubClass = (function (SuperClass) { function SubClass() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; SuperClass.apply( this, [ 1 ].concat( args, [2] ) ); } if ( SuperClass ) SubClass.__proto__ = SuperClass; SubClass.prototype = Object.create( SuperClass && SuperClass.prototype ); SubClass.prototype.constructor = SubClass; return SubClass; }(SuperClass));` }, { description: 'transpiles computed class properties', input: ` class Foo { [a.b.c] () { // code goes here } }`, output: ` var Foo = function Foo () {}; Foo.prototype[a.b.c] = function () { // code goes here };` }, { description: 'transpiles static computed class properties', input: ` class Foo { static [a.b.c] () { // code goes here } }`, output: ` var Foo = function Foo () {}; Foo[a.b.c] = function () { // code goes here };` }, { skip: true, description: 'transpiles computed class accessors', input: ` class Foo { get [a.b.c] () { // code goes here } }`, output: ` var Foo = function Foo () {}; var prototypeAccessors = {}; var ref = a.b.c; prototypeAccessors[ref] = {}; prototypeAccessors[ref].get = function () { // code goes here }; Object.defineProperties( Foo.prototype, prototypeAccessors );` }, { description: 'transpiles reserved class properties (!68)', input: ` class Foo { catch () { // code goes here } }`, output: ` var Foo = function Foo () {}; Foo.prototype.catch = function catch$1 () { // code goes here };` }, { description: 'transpiles static reserved class properties (!68)', input: ` class Foo { static catch () { // code goes here } }`, output: ` var Foo = function Foo () {}; Foo.catch = function catch$1 () { // code goes here };` }, { description: 'uses correct `this` when transpiling `super` (#89)', input: ` class A extends B { constructor () { super(); this.doSomething(() => { super.doSomething(); }); } }`, output: ` var A = (function (B) { function A () { var this$1 = this; B.call(this); this.doSomething(function () { B.prototype.doSomething.call(this$1); }); } if ( B ) A.__proto__ = B; A.prototype = Object.create( B && B.prototype ); A.prototype.constructor = A; return A; }(B));` }, { description: 'methods with computed names', input: ` class A { [x](){} [0](){} [1 + 2](){} [normal + " Method"](){} } `, output: ` var A = function A () {}; A.prototype[x] = function (){}; A.prototype[0] = function (){}; A.prototype[1 + 2] = function (){}; A.prototype[normal + " Method"] = function (){}; ` }, { description: 'static methods with computed names with varied spacing (#139)', input: ` class B { static[.000004](){} static [x](){} static [x-y](){} static[\`Static computed \${name}\`](){} } `, output: ` var B = function B () {}; B[.000004] = function (){}; B[x] = function (){}; B [x-y] = function (){}; B[("Static computed " + name)] = function (){}; ` }, { description: 'methods with numeric or string names (#139)', input: ` class C { 0(){} 0b101(){} 80(){} .12e3(){} 0o753(){} 12e34(){} 0xFFFF(){} "var"(){} } `, output: ` var C = function C () {}; C.prototype[0] = function (){}; C.prototype[5] = function (){}; C.prototype[80] = function (){}; C.prototype[.12e3] = function (){}; C.prototype[491] = function (){}; C.prototype[12e34] = function (){}; C.prototype[0xFFFF] = function (){}; C.prototype["var"] = function (){}; ` }, { description: 'static methods with numeric or string names with varied spacing (#139)', input: ` class D { static .75(){} static"Static Method"(){} static "foo"(){} } `, output: ` var D = function D () {}; D[.75] = function (){}; D["Static Method"] = function (){}; D["foo"] = function (){}; ` }, { description: "don't shadow variables with function names (#166)", input: ` class X { foo() { return foo } bar() {} } `, output: ` var X = function X () {}; X.prototype.foo = function foo$1 () { return foo }; X.prototype.bar = function bar () {}; ` } // TODO more tests. e.g. getters and setters. // 'super.*' is not allowed before super() ]; buble-0.19.3/test/samples/computed-properties.js000066400000000000000000000104731324054410700216750ustar00rootroot00000000000000module.exports = [ { description: 'creates a computed property', input: ` var obj = { [a]: 1 };`, output: ` var obj = {}; obj[a] = 1;` }, { description: 'creates a computed property with a non-identifier expression', input: ` var obj = { [a()]: 1 };`, output: ` var obj = {}; obj[a()] = 1;` }, { description: 'creates a computed property at start of literal', input: ` var obj = { [a]: 1, b: 2 };`, output: ` var obj = {}; obj[a] = 1; obj.b = 2;` }, { description: 'creates a computed property at start of literal with method afterwards', input: ` var obj = { [a]: 1, b() {} };`, output: ` var obj = {}; obj[a] = 1; obj.b = function b() {};` }, { description: 'creates a computed property at start of literal with generator method afterwards when transpiling methods is disabled', options: { transforms: { conciseMethodProperty: false, generator: false } }, input: ` var obj = { [a]: 1, *b() {} };`, output: ` var obj = {}; obj[a] = 1; obj.b = function* () {};` }, { description: 'creates a computed property at end of literal', input: ` var obj = { a: 1, [b]: 2 };`, output: ` var obj = { a: 1 }; obj[b] = 2;` }, { description: 'creates a computed property in middle of literal', input: ` var obj = { a: 1, [b]: 2, c: 3 };`, output: ` var obj = { a: 1 }; obj[b] = 2; obj.c = 3;` }, { description: 'creates multiple computed properties', input: ` var obj = { [a]: 1, b: 2, [c]: 3, [d]: 4, e: 5, [f]: 6 };`, output: ` var obj = {}; obj[a] = 1; obj.b = 2; obj[c] = 3; obj[d] = 4; obj.e = 5; obj[f] = 6;` }, { description: 'creates computed property in complex expression', input: ` var a = 'foo', obj = { [a]: 'bar', x: 42 }, bar = obj.foo;`, output: ` var obj$1; var a = 'foo', obj = ( obj$1 = {}, obj$1[a] = 'bar', obj$1.x = 42, obj$1 ), bar = obj.foo;` }, { description: 'creates computed property in block with conflicts', input: ` var x; if ( true ) { let x = { [a]: 1 }; }`, output: ` var x; if ( true ) { var x$1 = {}; x$1[a] = 1; }` }, { description: 'closing parenthesis put in correct place (#73)', input: ` call({ [a]: 5 });`, output: ` var obj; call(( obj = {}, obj[a] = 5, obj ));` }, { description: 'creates a computed method (#78)', input: ` var obj = { [a] () { // code goes here } };`, output: ` var obj = {}; obj[a] = function () { // code goes here };` }, { description: 'creates a computed method with a non-identifier expression (#78)', input: ` var obj = { [a()] () { // code goes here } };`, output: ` var obj = {}; obj[a()] = function () { // code goes here };` }, { description: 'does not require space before parens of computed method (#82)', input: ` var obj = { [a]() { // code goes here } };`, output: ` var obj = {}; obj[a] = function () { // code goes here };` }, { description: 'supports computed shorthand function with object spread in body (#135)', options: { objectAssign: 'Object.assign' }, input: ` let a = { [foo] (x, y) { return { ...{abc: '123'} }; }, }; `, output: ` var a = {}; a[foo] = function (x, y) { return Object.assign({}, {abc: '123'}); }; ` }, { description: 'object literal with computed property within arrow expression (#126)', input: ` foo => bar({[x - y]: obj}); `, output: ` !function(foo) { var obj$1; return bar(( obj$1 = {}, obj$1[x - y] = obj, obj$1 )); }; ` }, { description: 'Supports nested computed properties (#51)', input: ` (function () { return { [key]: { [key]: val } } }) `, output: ` (function () { var obj, obj$1; return ( obj$1 = {}, obj$1[key] = ( obj = {}, obj[key] = val, obj ), obj$1 ) }) ` }, { description: 'Puts helper variables in correct scope', input: ` ((x) => {var obj = 2; console.log([{[x]: 1}, obj]);})(3); `, output: ` (function (x) { var obj$1; var obj = 2; console.log([( obj$1 = {}, obj$1[x] = 1, obj$1 ), obj]);})(3); ` } ]; buble-0.19.3/test/samples/default-parameters.js000066400000000000000000000044421324054410700214470ustar00rootroot00000000000000module.exports = [ { description: 'transpiles default parameters', input: ` function foo ( a = 1, b = 2 ) { console.log( a, b ); } var bar = function ( a = 1, b = 2 ) { console.log( a, b ); };`, output: ` function foo ( a, b ) { if ( a === void 0 ) a = 1; if ( b === void 0 ) b = 2; console.log( a, b ); } var bar = function ( a, b ) { if ( a === void 0 ) a = 1; if ( b === void 0 ) b = 2; console.log( a, b ); };` }, { description: 'transpiles default parameters in object pattern (#23)', input: ` function foo ({ a = 1 }) { console.log( a ); }`, output: ` function foo (ref) { var a = ref.a; if ( a === void 0 ) a = 1; console.log( a ); }` }, { description: 'transpiles multiple default parameters in object pattern', input: ` function foo ({ a = 1 }, { b = 2 }) { console.log( a, b ); } var bar = function ({ a = 1 }, { b = 2 }) { console.log( a, b ); };`, output: ` function foo (ref, ref$1) { var a = ref.a; if ( a === void 0 ) a = 1; var b = ref$1.b; if ( b === void 0 ) b = 2; console.log( a, b ); } var bar = function (ref, ref$1) { var a = ref.a; if ( a === void 0 ) a = 1; var b = ref$1.b; if ( b === void 0 ) b = 2; console.log( a, b ); };` }, { description: 'can be disabled with `transforms.defaultParameter: false`', options: { transforms: { defaultParameter: false } }, input: ` function foo ( a = 1, b = 2 ) { console.log( a, b ); } var bar = function ( a = 1, b = 2 ) { console.log( a, b ); };`, output: ` function foo ( a = 1, b = 2 ) { console.log( a, b ); } var bar = function ( a = 1, b = 2 ) { console.log( a, b ); };` }, { description: 'transpiles default arrow function parameters', input: ` function a(x, f = () => x) { console.log( f() ); }`, output: ` function a(x, f) { if ( f === void 0 ) f = function () { return x; }; console.log( f() ); }` }, { description: 'transpiles destructured default parameters (#43)', input: ` function a({ x = 1 } = {}) { console.log( x ); }`, output: ` function a(ref) { if ( ref === void 0 ) ref = {}; var x = ref.x; if ( x === void 0 ) x = 1; console.log( x ); }` } ]; buble-0.19.3/test/samples/destructuring.js000066400000000000000000000437651324054410700205770ustar00rootroot00000000000000module.exports = [ { description: 'destructures an identifier with an object pattern', input: ` var { x, y } = point;`, output: ` var x = point.x; var y = point.y;` }, { description: 'destructures a non-identifier with an object pattern', input: ` var { x, y } = getPoint();`, output: ` var ref = getPoint(); var x = ref.x; var y = ref.y;` }, { description: 'destructures a parameter with an object pattern', input: ` function pythag ( { x, y: z = 1 } ) { return Math.sqrt( x * x + z * z ); }`, output: ` function pythag ( ref ) { var x = ref.x; var z = ref.y; if ( z === void 0 ) z = 1; return Math.sqrt( x * x + z * z ); }` }, { description: 'uses different name than the property in a declaration', input: `var { foo: bar } = obj;`, output: `var bar = obj.foo;` }, { description: 'destructures an identifier with an array pattern', input: ` var [ x, y ] = point;`, output: ` var x = point[0]; var y = point[1];` }, { description: 'destructures an identifier with a sparse array pattern', input: ` var [ x, , z ] = point;`, output: ` var x = point[0]; var z = point[2];` }, { description: 'destructures a non-identifier with an array pattern', input: ` var [ x, y ] = getPoint();`, output: ` var ref = getPoint(); var x = ref[0]; var y = ref[1];` }, { description: 'destructures a parameter with an array pattern', input: ` function pythag ( [ x, z = 1 ] ) { return Math.sqrt( x * x + z * z ); }`, output: ` function pythag ( ref ) { var x = ref[0]; var z = ref[1]; if ( z === void 0 ) z = 1; return Math.sqrt( x * x + z * z ); }` }, { description: 'can be disabled in declarations with `transforms.destructuring === false`', options: { transforms: { destructuring: false } }, input: `var { x, y } = point;`, output: `var { x, y } = point;` }, { description: 'can be disabled in function parameters with `transforms.parameterDestructuring === false`', options: { transforms: { parameterDestructuring: false } }, input: `function foo ({ x, y }) {}`, output: `function foo ({ x, y }) {}` }, { description: 'does not destructure parameters intelligently (#53)', input: ` function drawRect ( { ctx, x1, y1, x2, y2 } ) { ctx.fillRect( x1, y1, x2 - x1, y2 - y1 ); } function scale ([ d0, d1 ], [ r0, r1 ]) { const m = ( r1 - r0 ) / ( d1 - d0 ); return function ( num ) { return r0 + ( num - d0 ) * m; } }`, output: ` function drawRect ( ref ) { var ctx = ref.ctx; var x1 = ref.x1; var y1 = ref.y1; var x2 = ref.x2; var y2 = ref.y2; ctx.fillRect( x1, y1, x2 - x1, y2 - y1 ); } function scale (ref, ref$1) { var d0 = ref[0]; var d1 = ref[1]; var r0 = ref$1[0]; var r1 = ref$1[1]; var m = ( r1 - r0 ) / ( d1 - d0 ); return function ( num ) { return r0 + ( num - d0 ) * m; } }` }, { description: 'does not destructure variable declarations intelligently (#53)', input: ` var { foo: bar, baz } = obj; console.log( bar ); console.log( baz ); console.log( baz );`, output: ` var bar = obj.foo; var baz = obj.baz; console.log( bar ); console.log( baz ); console.log( baz );` }, { description: 'destructures variables in the middle of a declaration', input: ` var a, { x, y } = getPoint(), b = x; console.log( x, y );`, output: ` var a; var ref = getPoint(); var x = ref.x; var y = ref.y; var b = x; console.log( x, y );` }, { description: 'destructuring a destructured parameter', input: ` function test ( { foo, bar } ) { const { x, y } = foo; }`, output: ` function test ( ref ) { var foo = ref.foo; var bar = ref.bar; var x = foo.x; var y = foo.y; }` }, { description: 'default value in destructured variable declaration (#37)', input: ` var { name: value, description = null } = obj; console.log( value, description );`, output: ` var value = obj.name; var description = obj.description; if ( description === void 0 ) description = null; console.log( value, description );` }, { description: 'default values in destructured object parameter with a default value (#37)', input: ` function foo ({ arg1 = 123, arg2 = 456 } = {}) { console.log( arg1, arg2 ); }`, output: ` function foo (ref) { if ( ref === void 0 ) ref = {}; var arg1 = ref.arg1; if ( arg1 === void 0 ) arg1 = 123; var arg2 = ref.arg2; if ( arg2 === void 0 ) arg2 = 456; console.log( arg1, arg2 ); }` }, { description: 'destructures not replacing reference from parent scope', input: ` function controller([element]) { const mapState = function ({ filter }) { console.log(element); }; }`, output: ` function controller(ref) { var element = ref[0]; var mapState = function (ref) { var filter = ref.filter; console.log(element); }; }` }, { description: 'deep matching with object patterns', input: ` var { a: { b: c }, d: { e: f, g: h = 1 } } = x;`, output: ` var c = x.a.b; var x_d = x.d; var f = x_d.e; var h = x_d.g; if ( h === void 0 ) h = 1;` }, { description: 'deep matching with string literals in object patterns', input: ` var { a, 'b-1': c } = x;`, output: ` var a = x.a; var c = x['b-1'];` }, { description: 'deep matching with object patterns and reference', input: ` var { a: { b: c }, d: { e: f, g: h } } = x();`, output: ` var ref = x(); var c = ref.a.b; var ref_d = ref.d; var f = ref_d.e; var h = ref_d.g;` }, { description: 'deep matching with array patterns', input: ` var [[[a]], [[b, c = 1]]] = x;`, output: ` var a = x[0][0][0]; var x_1_0 = x[1][0]; var b = x_1_0[0]; var c = x_1_0[1]; if ( c === void 0 ) c = 1;` }, { description: 'deep matching with sparse array', input: ` function foo ( [[[,x = 3] = []] = []] = [] ) { console.log( x ); }`, output: ` function foo ( ref ) { if ( ref === void 0 ) ref = []; var ref_0 = ref[0]; if ( ref_0 === void 0 ) ref_0 = []; var ref_0_0 = ref_0[0]; if ( ref_0_0 === void 0 ) ref_0_0 = []; var x = ref_0_0[1]; if ( x === void 0 ) x = 3; console.log( x ); }` }, { description: 'deep matching in parameters', input: ` function foo ({ a: { b: c }, d: { e: f, g: h } }) { console.log( c, f, h ); }`, output: ` function foo (ref) { var c = ref.a.b; var ref_d = ref.d; var f = ref_d.e; var h = ref_d.g; console.log( c, f, h ); }` }, { description: 'destructured object assignment with computed properties', input: ` let one, two, three, four; ({ [FirstProp]: one, [SecondProp]: two = 'Too', 3: three, Fore: four } = x); `, output: ` var assign; var one, two, three, four; ((assign = x, one = assign[FirstProp], two = assign[SecondProp], two = two === void 0 ? 'Too' : two, three = assign[3], four = assign.Fore)); ` }, { description: 'destructured object declaration with computed properties', input: ` var { [FirstProp]: one, [SecondProp]: two = 'Too', 3: three, Fore: four } = x; `, output: ` var one = x[FirstProp]; var two = x[SecondProp]; if ( two === void 0 ) two = 'Too'; var three = x[3]; var four = x.Fore; ` }, { description: 'destructured object with computed properties in parameters', input: ` function foo({ [FirstProp]: one, [SecondProp]: two = 'Too', 3: three, Fore: four } = x) { console.log(one, two, three, four); } `, output: ` function foo(ref) { if ( ref === void 0 ) ref = x; var one = ref[FirstProp]; var two = ref[SecondProp]; if ( two === void 0 ) two = 'Too'; var three = ref[3]; var four = ref.Fore; console.log(one, two, three, four); } ` }, { description: 'deep matching in parameters with computed properties', input: ` function foo ({ [a]: { [b]: c }, d: { 'e': f, [g]: h }, [i + j]: { [k + l]: m, n: o } }) { console.log( c, f, h, m, o ); }`, output: ` function foo (ref) { var c = ref[a][b]; var ref_d = ref.d; var f = ref_d['e']; var h = ref_d[g]; var ref_i_j = ref[i + j]; var m = ref_i_j[k + l]; var o = ref_i_j.n; console.log( c, f, h, m, o ); }` }, { description: 'array destructuring declaration with rest element', input: ` const [a, ...b] = [1, 2, 3, 4]; console.log(a, b); `, output: ` var ref = [1, 2, 3, 4]; var a = ref[0]; var b = ref.slice(1); console.log(a, b); ` }, { description: 'array destructuring declaration with complex rest element', input: ` const x = [1, 2, {r: 9}, 3], [a, ...[, {r: b, s: c = 4} ]] = x; console.log(a, b, c); `, output: ` var x = [1, 2, {r: 9}, 3]; var a = x[0]; var x_slice_1_1 = x.slice(1)[1]; var b = x_slice_1_1.r; var c = x_slice_1_1.s; if ( c === void 0 ) c = 4; console.log(a, b, c); ` }, { description: 'destructuring function parameters with array rest element', input: ` function foo([a, ...[, {r: b, s: c = 4} ]]) { console.log(a, b, c); } foo( [1, 2, {r: 9}, 3] ); `, output: ` function foo(ref) { var a = ref[0]; var ref_slice_1_1 = ref.slice(1)[1]; var b = ref_slice_1_1.r; var c = ref_slice_1_1.s; if ( c === void 0 ) c = 4; console.log(a, b, c); } foo( [1, 2, {r: 9}, 3] ); ` }, { description: 'destructuring array assignment with complex rest element', input: ` let x = [1, 2, {r: 9}, {s: ["table"]} ]; let a, b, c, d; ([a, ...[ , {r: b}, {r: c = "nothing", s: [d] = "nope"} ]] = x); console.log(a, b, c, d); `, output: ` var assign, assign_slice_1_, assign_slice_1_2, assign_slice_1_2_s; var x = [1, 2, {r: 9}, {s: ["table"]} ]; var a, b, c, d; ((assign = x, a = assign[0], assign_slice_1_ = assign.slice(1), b = assign_slice_1_[1].r, assign_slice_1_2 = assign_slice_1_[2], c = assign_slice_1_2.r, c = c === void 0 ? "nothing" : c, assign_slice_1_2_s = assign_slice_1_2.s, assign_slice_1_2_s = assign_slice_1_2_s === void 0 ? "nope" : assign_slice_1_2_s, d = assign_slice_1_2_s[0])); console.log(a, b, c, d); ` }, { description: 'destructuring array rest element within an object property', input: ` let foo = ({p: [x, ...y] = [6, 7], q: [...z] = [8]} = {}) => { console.log(x, y, z); }; foo({p: [1, 2, 3], q: [4, 5]}); foo({q: []} ); foo(); `, output: ` var foo = function (ref) { if ( ref === void 0 ) ref = {}; var ref_p = ref.p; if ( ref_p === void 0 ) ref_p = [6, 7]; var ref_p$1 = ref_p; var x = ref_p$1[0]; var y = ref_p$1.slice(1); var ref_q = ref.q; if ( ref_q === void 0 ) ref_q = [8]; var z = ref_q.slice(0); console.log(x, y, z); }; foo({p: [1, 2, 3], q: [4, 5]}); foo({q: []} ); foo(); ` }, { description: 'transpiles destructuring assignment of an array', input: ` [x, y] = [1, 2];`, output: ` var assign; (assign = [1, 2], x = assign[0], y = assign[1]);` }, { description: 'transpiles destructuring assignment of an array with a default value', input: ` [x = 4, y] = [1, 2];`, output: ` var assign; (assign = [1, 2], x = assign[0], x = x === void 0 ? 4 : x, y = assign[1]);` }, { description: 'transpiles nested destructuring assignment of an array', input: ` [[x], y] = [1, 2];`, output: ` var assign; (assign = [1, 2], x = assign[0][0], y = assign[1]);` }, { description: 'transpiles nested destructuring assignment of an array without evaluating a memberexpr twice', input: ` [[x, z], y] = [1, 2];`, output: ` var assign, assign_0; (assign = [1, 2], assign_0 = assign[0], x = assign_0[0], z = assign_0[1], y = assign[1]);` }, { description: 'transpiles nested destructuring assignment of an array with a default', input: ` [[x] = [], y] = [1, 2];`, output: ` var assign, assign_0; (assign = [1, 2], assign_0 = assign[0], assign_0 = assign_0 === void 0 ? [] : assign_0, x = assign_0[0], y = assign[1]);` }, { description: 'leaves member expression patterns intact', input: ` [x, y.z] = [1, 2];`, output: ` var assign; (assign = [1, 2], x = assign[0], y.z = assign[1]);` }, { description: 'only assigns to member expressions once', input: ` [x, y.z = 3] = [1, 2];`, output: ` var assign, assign_1; (assign = [1, 2], x = assign[0], assign_1 = assign[1], assign_1 = assign_1 === void 0 ? 3 : assign_1, y.z = assign_1);` }, { description: 'transpiles destructuring assignment of an object', input: ` ({x, y} = {x: 1});`, output: ` var assign; ((assign = {x: 1}, x = assign.x, y = assign.y));` }, { description: 'transpiles destructuring assignment of an object where key and pattern names differ', input: ` ({x, y: z} = {x: 1});`, output: ` var assign; ((assign = {x: 1}, x = assign.x, z = assign.y));` }, { description: 'transpiles nested destructuring assignment of an object', input: ` ({x, y: {z}} = {x: 1});`, output: ` var assign; ((assign = {x: 1}, x = assign.x, z = assign.y.z));` }, { description: 'transpiles destructuring assignment of an object with a default value', input: ` ({x, y = 4} = {x: 1});`, output: ` var assign; ((assign = {x: 1}, x = assign.x, y = assign.y, y = y === void 0 ? 4 : y));` }, { description: 'only evaluates a sub-object once', input: ` ({x, y: {z, q}} = {x: 1});`, output: ` var assign, assign_y; ((assign = {x: 1}, x = assign.x, assign_y = assign.y, z = assign_y.z, q = assign_y.q));` }, { description: "doesn't create an object temporary unless necessary", input: ` ({x, y: {z}} = {x: 1});`, output: ` var assign; ((assign = {x: 1}, x = assign.x, z = assign.y.z));` }, { description: 'lifts its variable declarations out of the expression', input: ` foo(); if ( bar([x, y] = [1, 2]) ) { baz(); }`, output: ` var assign; foo(); if ( bar((assign = [1, 2], x = assign[0], y = assign[1], assign)) ) { baz(); }` }, { description: 'puts its scratch variables in the parent scope', input: ` function foo() { [x, y] = [1, 2]; }`, output: ` function foo() { var assign; (assign = [1, 2], x = assign[0], y = assign[1]); }` }, { description: 'array destructuring default with template string (#145)', input: 'const [ foo = `${baz() - 4}` ] = bar;', output: `var foo = bar[0]; if ( foo === void 0 ) foo = "" + (baz() - 4);` }, { description: 'object destructuring default with template string (#145)', input: 'const { foo = `${baz() - 4}` } = bar;', output: `var foo = bar.foo; if ( foo === void 0 ) foo = "" + (baz() - 4);` }, { description: 'array destructuring with multiple defaults with hole', // FIXME: unnecessary parens needed around complex defaults due to buble bugs input: ` let [ a = \`A\${baz() - 4}\`, , /* hole */ c = (x => -x), d = ({ r: 5, [h()]: i }), ] = [ "ok" ]; `, output: ` var obj; var ref = [ "ok" ]; var a = ref[0]; if ( a === void 0 ) a = "A" + (baz() - 4); var c = ref[2]; if ( c === void 0 ) c = (function (x) { return -x; }); var d = ref[3]; if ( d === void 0 ) d = (( obj = { r: 5 }, obj[h()] = i, obj )); ` }, { description: 'object destructuring with multiple defaults', // FIXME: unnecessary parens needed around complex defaults due to buble bugs input: ` let { a = \`A\${baz() - 4}\`, c = (x => -x), d = ({ r: 5, [1 + 1]: 2, [h()]: i }), } = { b: 3 }; `, output: ` var obj; var ref = { b: 3 }; var a = ref.a; if ( a === void 0 ) a = "A" + (baz() - 4); var c = ref.c; if ( c === void 0 ) c = (function (x) { return -x; }); var d = ref.d; if ( d === void 0 ) d = (( obj = { r: 5 }, obj[1 + 1] = 2, obj[h()] = i, obj )); ` }, { description: 'destrucuring assignments requiring rvalues', input: ` class Point { set ( array ) { return [ this.x, this.y ] = array; } } let a, b, c = [ 1, 2, 3 ]; console.log( [ a, b ] = c ); `, output: ` var assign; var Point = function Point () {}; Point.prototype.set = function set ( array ) { var assign; return (assign = array, this.x = assign[0], this.y = assign[1], assign); }; var a, b, c = [ 1, 2, 3 ]; console.log( (assign = c, a = assign[0], b = assign[1], assign) ); ` }, { description: 'destrucuring assignments not requiring rvalues', input: ` class Point { set ( array ) { [ this.x, this.y ] = array; } } let a, b, c = [ 1, 2, 3 ]; [ a, b ] = c; `, output: ` var assign; var Point = function Point () {}; Point.prototype.set = function set ( array ) { var assign; (assign = array, this.x = assign[0], this.y = assign[1]); }; var a, b, c = [ 1, 2, 3 ]; (assign = c, a = assign[0], b = assign[1]); ` }, { description: 'destructures with computed property', input: ` const { a, b } = { ['a']: 1 }; `, output: ` var obj; var ref = ( obj = {}, obj['a'] = 1, obj ); var a = ref.a; var b = ref.b; ` }, { description: 'destructures within block scope', input: ` if (true) { let [[a, b]] = [[1, 2]]; } `, output: ` if (true) { var ref = [[1, 2]]; var ref_0 = ref[0]; var a = ref_0[0]; var b = ref_0[1]; } ` }, { description: 'destructures rewritten block scope variables', input: ` let x; if (maybe) { let x; ({ x } = { x: 3 }); [ x ] = [ 3 ]; }`, output: ` var assign, assign$1; var x; if (maybe) { var x$1; ((assign = { x: 3 }, x$1 = assign.x)); (assign$1 = [ 3 ], x$1 = assign$1[0]); }` }, { description: 'destructures try catch parameters', input: ` try {} catch ({message}) { }`, output: ` try {} catch (ref) { var message = ref.message; }` }, { description: 'destructures parameters with same name as function', input: ` const a = { options (options) { const { input } = options; } }`, output: ` var a = { options: function options (options$1) { var input = options$1.input; } }` } ]; buble-0.19.3/test/samples/dynamic-import.js000066400000000000000000000002121324054410700206050ustar00rootroot00000000000000module.exports = [ { description: 'support dynamic import', input: `import('./module.js')`, output: `import('./module.js')` } ]; buble-0.19.3/test/samples/exponentiation-operator.js000066400000000000000000000072111324054410700225540ustar00rootroot00000000000000module.exports = [ { description: 'transpiles an exponentiation operator', input: `x ** y`, output: `Math.pow( x, y )` }, { description: 'transpiles an exponentiation assignment to a simple reference', input: `x **= y`, output: `x = Math.pow( x, y )` }, { description: 'transpiles an exponentiation assignment to a simple parenthesized reference', input: `( x ) **= y`, output: `( x ) = Math.pow( x, y )` }, { description: 'transpiles an exponentiation assignment to a rewritten simple reference', input: ` let x = 1; if ( maybe ) { let x = 2; x **= y; }`, output: ` var x = 1; if ( maybe ) { var x$1 = 2; x$1 = Math.pow( x$1, y ); }` }, { description: 'transpiles an exponentiation assignment to a simple member expression', input: ` foo.bar **= y;`, output: ` foo.bar = Math.pow( foo.bar, y );` }, { description: 'transpiles an exponentiation assignment to a simple deep member expression', input: ` foo.bar.baz **= y;`, output: ` var object; object = foo.bar; object.baz = Math.pow( object.baz, y );` }, { description: 'transpiles an exponentiation assignment to a simple computed member expression', input: ` foo[ bar ] **= y;`, output: ` foo[ bar ] = Math.pow( foo[bar], y );` }, { description: 'transpiles an exponentiation assignment to a complex reference', input: ` foo[ bar() ] **= y;`, output: ` var property; property = bar(); foo[property] = Math.pow( foo[property], y );` }, { description: 'transpiles an exponentiation assignment to a contrivedly complex reference', input: ` foo[ bar() ][ baz() ] **= y;`, output: ` var property, object; object = foo[ bar() ]; property = baz(); object[property] = Math.pow( object[property], y );` }, { description: 'transpiles an exponentiation assignment to a contrivedly complex reference (that is not a top-level statement)', input: ` var baz = 1, lolwut = foo[ bar() ][ baz * 2 ] **= y;`, output: ` var property, object; var baz = 1, lolwut = ( object = foo[ bar() ], property = baz * 2, object[property] = Math.pow( object[property], y ) );` }, { description: 'transpiles an exponentiation assignment to a contrivedly complex reference with simple object (that is not a top-level statement)', input: ` var baz = 1, lolwut = foo[ bar() ] **= y;`, output: ` var property; var baz = 1, lolwut = ( property = bar(), foo[property] = Math.pow( foo[property], y ) );` }, { description: 'handles pathological bastard case', input: ` let i; if ( maybe ) { for ( let i = 1.1; i < 1e6; i **= i ) { setTimeout( function () { console.log( i ); }, i ); } }`, output: ` var i; if ( maybe ) { var loop = function ( i ) { setTimeout( function () { console.log( i ); }, i ); }; for ( var i$1 = 1.1; i$1 < 1e6; i$1 = Math.pow( i$1, i$1 ) ) loop( i$1 ); }` }, { description: 'handles assignment of exponentiation assignment to property', input: ` x=a.b**=2; `, output: ` x=a.b=Math.pow( a.b, 2 ); ` }, { description: 'handles assignment of exponentiation assignment to property with side effect', input: ` x=a[bar()]**=2; `, output: ` var property; x=( property = bar(), a[property]=Math.pow( a[property], 2 ) ); ` } /* TODO: Test currently errors out with: TypeError: Cannot read property 'property' of null { description: 'handles assignment of exponentiation assignment to property with side effect within a block-less if', input: ` if(y)x=a[foo()]**=2; `, output: ` ` }, */ ]; buble-0.19.3/test/samples/for-of.js000066400000000000000000000121571324054410700170540ustar00rootroot00000000000000module.exports = [ { description: 'disallows for-of statements', input: `for ( x of y ) {}`, error: /for\.\.\.of statements are not supported/ }, { description: 'ignores for-of with `transforms.forOf === false`', options: { transforms: { forOf: false } }, input: `for ( x of y ) {}`, output: `for ( x of y ) {}` }, { description: 'transpiles for-of with array assumption with `transforms.dangerousForOf`', options: { transforms: { dangerousForOf: true } }, input: ` for ( let member of array ) { doSomething( member ); }`, output: ` for ( var i = 0, list = array; i < list.length; i += 1 ) { var member = list[i]; doSomething( member ); }` }, { description: 'transpiles for-of with expression', options: { transforms: { dangerousForOf: true } }, input: ` for ( let member of [ 'a', 'b', 'c' ] ) { doSomething( member ); }`, output: ` for ( var i = 0, list = [ 'a', 'b', 'c' ]; i < list.length; i += 1 ) { var member = list[i]; doSomething( member ); }` }, { description: 'transpiles for-of that needs to be rewritten as function', options: { transforms: { dangerousForOf: true } }, input: ` for ( let member of [ 'a', 'b', 'c' ] ) { setTimeout( function () { doSomething( member ); }); }`, output: ` var loop = function () { var member = list[i]; setTimeout( function () { doSomething( member ); }); }; for ( var i = 0, list = [ 'a', 'b', 'c' ]; i < list.length; i += 1 ) loop();` }, { description: 'transpiles body-less for-of', options: { transforms: { dangerousForOf: true } }, input: ` for ( let member of array ) console.log( member );`, output: ` for ( var i = 0, list = array; i < list.length; i += 1 ) { var member = list[i]; console.log( member ); }` }, { description: 'transpiles space-less for-of', options: { transforms: { dangerousForOf: true } }, input: ` for (const key of this.keys) { console.log(key); }`, output: ` var this$1 = this; for (var i = 0, list = this$1.keys; i < list.length; i += 1) { var key = list[i]; console.log(key); }` }, { description: 'handles continue in for-of', options: { transforms: { dangerousForOf: true } }, input: ` for ( let item of items ) { if ( item.foo ) continue; }`, output: ` for ( var i = 0, list = items; i < list.length; i += 1 ) { var item = list[i]; if ( item.foo ) { continue; } }` }, { description: 'handles this and arguments in for-of', options: { transforms: { dangerousForOf: true } }, input: ` for ( let item of items ) { console.log( this, arguments, item ); setTimeout( () => { console.log( item ); }); }`, output: ` var arguments$1 = arguments; var this$1 = this; var loop = function () { var item = list[i]; console.log( this$1, arguments$1, item ); setTimeout( function () { console.log( item ); }); }; for ( var i = 0, list = items; i < list.length; i += 1 ) loop();` }, { description: 'for-of with empty block (#80)', options: { transforms: { dangerousForOf: true } }, input: ` for ( let x of y ) {}`, output: ` ` }, { description: 'for-of with empty block and var (#80)', options: { transforms: { dangerousForOf: true } }, input: ` for ( var x of y ) {}`, output: ` var x;` }, { description: 'return from for-of loop rewritten as function', options: { transforms: { dangerousForOf: true } }, input: ` function foo () { for ( let x of y ) { setTimeout( function () { console.log( x ); }); if ( x > 10 ) return; } }`, output: ` function foo () { var loop = function () { var x = list[i]; setTimeout( function () { console.log( x ); }); if ( x > 10 ) { return {}; } }; for ( var i = 0, list = y; i < list.length; i += 1 ) { var returned = loop(); if ( returned ) return returned.v; } }` }, { description: 'allows destructured variable declaration (#95)', options: { transforms: { dangerousForOf: true } }, input: ` for (var {x, y} of [{x: 1, y: 2}]) { console.log(x, y); }`, output: ` for (var i = 0, list = [{x: 1, y: 2}]; i < list.length; i += 1) { var ref = list[i]; var x = ref.x; var y = ref.y; console.log(x, y); }` }, { description: 'destructures assignment in forOf loop', options: { transforms: { dangerousForOf: true } }, input: ` var x, y; for ({x, y} of [{x: 1, y: 2}]) { console.log(x, y); } `, output: ` var x, y; for (var i = 0, list = [{x: 1, y: 2}]; i < list.length; i += 1) { var ref = list[i]; x = ref.x; y = ref.y; console.log(x, y); } ` }, { description: 'destructures assignment in forOf loop with array pattern', options: { transforms: { dangerousForOf: true } }, input: ` var x, y; for ([x, y] of [[1, 2]]) { console.log(x, y); } `, output: ` var x, y; for (var i = 0, list = [[1, 2]]; i < list.length; i += 1) { var ref = list[i]; x = ref[0]; y = ref[1]; console.log(x, y); } ` } ]; buble-0.19.3/test/samples/generators.js000066400000000000000000000032631324054410700200330ustar00rootroot00000000000000module.exports = [ { description: 'disallows generator function declarations', input: ` function* foo () { }`, error: /Generators are not supported/ }, { description: 'disallows generator function expressions', input: ` var fn = function* foo () { }`, error: /Generators are not supported/ }, { description: 'disallows generator functions as object literal methods', input: ` var obj = { *foo () { } };`, error: /Generators are not supported/ }, { description: 'disallows generator functions as class methods', input: ` class Foo { *foo () { } }`, error: /Generators are not supported/ }, { description: 'ignores generator function declarations with `transforms.generator: false`', options: { transforms: { generator: false } }, input: `function* foo () {}`, output: `function* foo () {}` }, { description: 'ignores generator function expressions with `transforms.generator: false`', options: { transforms: { generator: false } }, input: `var foo = function* foo () {}`, output: `var foo = function* foo () {}` }, { description: 'ignores generator function methods with `transforms.generator: false`', options: { transforms: { generator: false } }, input: `var obj = { *foo () {} }`, output: `var obj = { foo: function* foo () {} }` }, { description: 'ignores generator function class methods with `transforms.generator: false`', options: { transforms: { generator: false } }, input: ` class Foo { *foo () { // code goes here } }`, output: ` var Foo = function Foo () {}; Foo.prototype.foo = function* foo () { // code goes here };` } ]; buble-0.19.3/test/samples/jsx.js000066400000000000000000000172231324054410700164670ustar00rootroot00000000000000module.exports = [ { description: 'transpiles self-closing JSX tag', input: `var img = ;`, output: `var img = React.createElement( 'img', { src: 'foo.gif' });` }, { description: 'transpiles non-self-closing JSX tag', input: `var div =
;`, output: `var div = React.createElement( 'div', { className: 'foo' });` }, { description: 'transpiles non-self-closing JSX tag without attributes', input: `var div =
;`, output: `var div = React.createElement( 'div', null );` }, { description: 'transpiles nested JSX tags', input: ` var div = (
);`, output: ` var div = ( React.createElement( 'div', { className: 'foo' }, React.createElement( 'img', { src: 'foo.gif' }), React.createElement( 'img', { src: 'bar.gif' }) ) );` }, { description: 'transpiles JSX tag with expression attributes', input: `var img = ;`, output: `var img = React.createElement( 'img', { src: src });` }, { description: 'transpiles JSX tag with expression children', input: ` var div = (
{ images.map( src => ) }
);`, output: ` var div = ( React.createElement( 'div', null, images.map( function (src) { return React.createElement( 'img', { src: src }); } ) ) );` }, { description: 'transpiles JSX component', input: `var element = ;`, output: `var element = React.createElement( Hello, { name: name });` }, { description: 'transpiles empty JSX expression block', input: `var element = {};`, output: `var element = React.createElement( Foo, null );` }, { description: 'transpiles empty JSX expression block with comment', input: `var element = {/* comment */};`, output: `var element = React.createElement( Foo, null/* comment */ );` }, { description: 'transpiles JSX component without attributes', input: `var element = ;`, output: `var element = React.createElement( Hello, null );` }, { description: 'transpiles JSX component without attributes with children', input: `var element = hello;`, output: `var element = React.createElement( Hello, null, "hello" );` }, { description: 'transpiles namespaced JSX component', input: `var element = ;`, output: `var element = React.createElement( Foo.Bar, { name: name });` }, { description: 'supports pragmas', options: { jsx: 'NotReact.createElement' }, input: `var img = ;`, output: `var img = NotReact.createElement( 'img', { src: 'foo.gif' });` }, { description: 'stringifies text children', input: `

Hello {name}!

`, output: `React.createElement( 'h1', null, "Hello ", name, "!" )` }, { description: 'handles whitespace and quotes appropriately', input: `

Hello {name} !

`, output: ` React.createElement( 'h1', null, "Hello ", name, "!" )` }, { description: 'handles single-line whitespace and quotes appropriately', input: `

Hello {name} – and goodbye!

`, output: ` React.createElement( 'h1', null, "Hello ", name, " – and goodbye!" )` }, { description: 'handles single quotes in text children', input: `

Hello {name} !${' '} It's nice to meet you

`, output: ` React.createElement( 'h1', null, "Hello ", name, "! It's nice to meet you" )` }, { description: 'transpiles tag with data attribute', input: `var element =
;`, output: `var element = React.createElement( 'div', { 'data-name': name });` }, { description: 'transpiles JSX tag without value', input: `var div =
;`, output: `var div = React.createElement( 'div', { contentEditable: true });` }, { description: 'transpiles JSX fragments', input: `var divs = <>
;`, output: `var divs = React.createElement( React.Fragment, null, React.createElement( 'div', { contentEditable: true }), React.createElement( 'div', null ) );` }, { description: 'transpiles one JSX spread attributes', input: `var element =
;`, output: `var element = React.createElement( 'div', props);` }, { description: 'disallow mixed JSX spread attributes ending in spread', input: `var element =
;`, error: /Mixed JSX attributes ending in spread requires specified objectAssign option with 'Object\.assign' or polyfill helper\./ }, { description: 'transpiles mixed JSX spread attributes ending in spread', options: { objectAssign: 'Object.assign' }, input: `var element =
;`, output: `var element = React.createElement( 'div', Object.assign({}, { a: 1 }, props, stuff));` }, { description: 'transpiles mixed JSX spread attributes ending in spread with custom Object.assign', options: { objectAssign: 'angular.extend' }, input: `var element =
;`, output: `var element = React.createElement( 'div', angular.extend({}, { a: 1 }, props, stuff));` }, { description: 'transpiles mixed JSX spread attributes ending in other values', options: { objectAssign: 'Object.assign' }, input: `var element =
;`, output: `var element = React.createElement( 'div', Object.assign({}, { a: 1 }, props, { b: 2, c: 3 }, stuff, { more: things }));` }, { description: 'transpiles spread expressions (#64)', input: `
`, output: `React.createElement( 'div', this.props)` }, { description: 'handles whitespace between elements on same line (#65)', input: `

Hello {name}!

`, output: ` React.createElement( Foo, null, " ", React.createElement( 'h1', null, "Hello ", name, "!" ), " " )` }, { description: 'fix Object.assign regression in JSXOpeningElement (#163)', options: { objectAssign: 'Object.assign' }, input: ` `, output: ` React.createElement( Thing, Object.assign({}, { two: "This no longer fails" }, props)) ` }, { description: 'fix no space between JSXOpeningElement attributes (#178)', input: `
`, output: ` React.createElement( 'div', { style: {color:'#000000'}, className: 'content' }) ` }, { description: 'supports /* @jsx customPragma */ directives (#195)', input: ` /* @jsx customPragma */ var div =
Hello
`, output: ` /* @jsx customPragma */ var div = customPragma( 'div', null, "Hello" ) ` }, { description: 'ignores subsequent /* @jsx customPragma */ directives (#195)', input: ` /* @jsx customPragma */ /* @jsx customPragmaWannabe */ var div =
Hello
`, output: ` /* @jsx customPragma */ /* @jsx customPragmaWannabe */ var div = customPragma( 'div', null, "Hello" ) ` }, { description: 'handles dash-cased value-less props', input: ` `, output: ` React.createElement( Thing, { 'data-foo': true }) ` }, { description: 'handles non-breaking white-space entities', input: `
1   
`, output: ` React.createElement( 'div', null, React.createElement( 'a', null, "1" ), "   ") ` }, { description: 'transpiles entities', input: `
1< 
`, output: ` React.createElement( 'div', null, React.createElement( 'a', null, "1<" ), " ") ` } ]; buble-0.19.3/test/samples/loops.js000066400000000000000000000407021324054410700170150ustar00rootroot00000000000000module.exports = [ { description: 'transpiles block scoping inside loops with function bodies', input: ` function log ( square ) { console.log( square ); } for ( let i = 0; i < 10; i += 1 ) { const square = i * i; setTimeout( function () { log( square ); }, i * 100 ); }`, output: ` function log ( square ) { console.log( square ); } var loop = function ( i ) { var square = i * i; setTimeout( function () { log( square ); }, i * 100 ); }; for ( var i = 0; i < 10; i += 1 ) loop( i );` }, { description: 'transpiles block scoping inside while loops with function bodies', input: ` function log ( square ) { console.log( square ); } while ( i-- ) { const square = i * i; setTimeout( function () { log( square ); }, i * 100 ); }`, output: ` function log ( square ) { console.log( square ); } var loop = function () { var square = i * i; setTimeout( function () { log( square ); }, i * 100 ); }; while ( i-- ) loop();` }, { description: 'transpiles block scoping inside do-while loops with function bodies', input: ` function log ( square ) { console.log( square ); } do { const square = i * i; setTimeout( function () { log( square ); }, i * 100 ); } while ( i-- );`, output: ` function log ( square ) { console.log( square ); } var loop = function () { var square = i * i; setTimeout( function () { log( square ); }, i * 100 ); }; do { loop(); } while ( i-- );` }, { description: 'transpiles block-less for loops with block-scoped declarations inside function body', input: ` for ( let i = 0; i < 10; i += 1 ) setTimeout( () => console.log( i ), i * 100 );`, output: ` var loop = function ( i ) { setTimeout( function () { return console.log( i ); }, i * 100 ); }; for ( var i = 0; i < 10; i += 1 ) loop( i );` }, { description: 'transpiles block scoping inside loops without function bodies', input: ` for ( let i = 0; i < 10; i += 1 ) { const square = i * i; console.log( square ); }`, output: ` for ( var i = 0; i < 10; i += 1 ) { var square = i * i; console.log( square ); }` }, { description: 'transpiles block-less for loops without block-scoped declarations inside function body', input: ` for ( let i = 0; i < 10; i += 1 ) console.log( i );`, output: ` for ( var i = 0; i < 10; i += 1 ) { console.log( i ); }` }, { description: 'preserves correct `this` and `arguments` inside block scoped loop (#10)', input: ` for ( let i = 0; i < 10; i += 1 ) { console.log( this, arguments, i ); setTimeout( function () { console.log( this, arguments, i ); }, i * 100 ); }`, output: ` var arguments$1 = arguments; var this$1 = this; var loop = function ( i ) { console.log( this$1, arguments$1, i ); setTimeout( function () { console.log( this, arguments, i ); }, i * 100 ); }; for ( var i = 0; i < 10; i += 1 ) loop( i );` }, { description: 'maintains value of for loop variables between iterations (#11)', input: ` var fns = []; for ( let i = 0; i < 10; i += 1 ) { fns.push(function () { return i; }); i += 1; }`, output: ` var fns = []; var loop = function ( i$1 ) { fns.push(function () { return i$1; }); i$1 += 1; i = i$1; }; for ( var i = 0; i < 10; i += 1 ) loop( i );` }, { description: 'maintains value of for loop variables between iterations, with conflict (#11)', input: ` var i = 'conflicting'; var fns = []; for ( let i = 0; i < 10; i += 1 ) { fns.push(function () { return i; }); i += 1; }`, output: ` var i = 'conflicting'; var fns = []; var loop = function ( i$2 ) { fns.push(function () { return i$2; }); i$2 += 1; i$1 = i$2; }; for ( var i$1 = 0; i$1 < 10; i$1 += 1 ) loop( i$1 );` }, { description: 'loop variables with UpdateExpresssions between iterations (#150)', input: ` var fns = []; for ( let i = 0, j = 3; i < 10; i += 1 ) { fns.push(function () { return i; }); ++i; j--; }`, output: ` var fns = []; var loop = function ( i$1, j$1 ) { fns.push(function () { return i$1; }); ++i$1; j$1--; i = i$1; j = j$1; }; for ( var i = 0, j = 3; i < 10; i += 1 ) loop( i, j );` }, { description: 'loop variables with UpdateExpresssions between iterations, with conflict (#150)', input: ` var i = 'conflicting'; var fns = []; for ( let i = 0; i < 10; i += 1 ) { fns.push(function () { return i; }); i++; }`, output: ` var i = 'conflicting'; var fns = []; var loop = function ( i$2 ) { fns.push(function () { return i$2; }); i$2++; i$1 = i$2; }; for ( var i$1 = 0; i$1 < 10; i$1 += 1 ) loop( i$1 );` }, { description: 'handles break and continue inside block-scoped loops (#12)', input: ` function foo () { for ( let i = 0; i < 10; i += 1 ) { if ( i % 2 ) continue; if ( i > 5 ) break; if ( i === 'potato' ) return 'huh?'; setTimeout( () => console.log( i ) ); } }`, output: ` function foo () { var loop = function ( i ) { if ( i % 2 ) { return; } if ( i > 5 ) { return 'break'; } if ( i === 'potato' ) { return { v: 'huh?' }; } setTimeout( function () { return console.log( i ); } ); }; for ( var i = 0; i < 10; i += 1 ) { var returned = loop( i ); if ( returned === 'break' ) break; if ( returned ) return returned.v; } }` }, { description: 'rewrites for-in loops as functions as necessary', input: ` for ( let foo in bar ) { setTimeout( function () { console.log( bar[ foo ] ) } ); }`, output: ` var loop = function ( foo ) { setTimeout( function () { console.log( bar[ foo ] ) } ); }; for ( var foo in bar ) loop( foo );` }, { description: 'allows breaking from for-in loops', input: ` for ( let foo in bar ) { if ( foo === 'baz' ) break; setTimeout( function () { console.log( bar[ foo ] ) } ); }`, output: ` var loop = function ( foo ) { if ( foo === 'baz' ) { return 'break'; } setTimeout( function () { console.log( bar[ foo ] ) } ); }; for ( var foo in bar ) { var returned = loop( foo ); if ( returned === 'break' ) break; }` }, { description: 'transpiles block-less for-in statements', input: `for ( let foo in bar ) baz( foo );`, output: `for ( var foo in bar ) { baz( foo ); }` }, { description: 'transpiles block-less for-in statements as functions', input: ` for ( let foo in bar ) setTimeout( function () { log( foo ) } );`, output: ` var loop = function ( foo ) { setTimeout( function () { log( foo ) } ); }; for ( var foo in bar ) loop( foo );` }, { description: 'does not incorrectly rename variables declared in for loop head', input: ` for ( let foo = 0; foo < 10; foo += 1 ) { foo += 1; console.log( foo ); }`, output: ` for ( var foo = 0; foo < 10; foo += 1 ) { foo += 1; console.log( foo ); }` }, { description: 'does not rewrite as function if `transforms.letConst === false`', options: { transforms: { letConst: false } }, input: ` for ( let i = 0; i < 10; i += 1 ) { setTimeout( function () { log( i ); }, i * 100 ); }`, output: ` for ( let i = 0; i < 10; i += 1 ) { setTimeout( function () { log( i ); }, i * 100 ); }` }, { description: 'calls synthetic loop function with correct argument', input: ` let i = 999; for ( let i = 0; i < 10; i += 1 ) { setTimeout( () => console.log( i ) ); }`, output: ` var i = 999; var loop = function ( i ) { setTimeout( function () { return console.log( i ); } ); }; for ( var i$1 = 0; i$1 < 10; i$1 += 1 ) loop( i$1 );` }, { description: 'handles body-less do-while loops (#27)', input: `do foo(); while (bar)`, output: `do { foo(); } while (bar)` }, { description: 'returns without a value from loop', input: ` function foo ( x ) { for ( let i = 0; i < x; i += 1 ) { setTimeout( () => { console.log( i ); }); if ( x > 5 ) return; } }`, output: ` function foo ( x ) { var loop = function ( i ) { setTimeout( function () { console.log( i ); }); if ( x > 5 ) { return {}; } }; for ( var i = 0; i < x; i += 1 ) { var returned = loop( i ); if ( returned ) return returned.v; } }` }, { description: 'supports two compiled loops in one function', input: ` function foo ( x ) { for ( let i = 0; i < x; i += 1 ) { setTimeout( () => { console.log( i ); }); if ( x > 5 ) return; } for ( let i = 0; i < x; i += 1 ) { setTimeout( () => { console.log( i ); }); if ( x > 5 ) return; } }`, output: ` function foo ( x ) { var loop = function ( i ) { setTimeout( function () { console.log( i ); }); if ( x > 5 ) { return {}; } }; for ( var i = 0; i < x; i += 1 ) { var returned = loop( i ); if ( returned ) return returned.v; } var loop$1 = function ( i ) { setTimeout( function () { console.log( i ); }); if ( x > 5 ) { return {}; } }; for ( var i$1 = 0; i$1 < x; i$1 += 1 ) { var returned$1 = loop$1( i$1 ); if ( returned$1 ) return returned$1.v; } }` }, { description: 'destructures variable declaration in for loop head', input: ` var range = { start: 10, end: 20 }; for ( var { start: i, end } = range; i < end; i += 1 ) { console.log( i ); }`, output: ` var range = { start: 10, end: 20 }; for ( var i = range.start, end = range.end; i < end; i += 1 ) { console.log( i ); }` }, { description: 'complex destructuring in variable declaration in for loop head', input: ` var range = function () { return { start: 10, end: 20 }; } for ( var { start: i, end = 100 } = range(); i < end; i += 1 ) { console.log( i ); }`, output: ` var range = function () { return { start: 10, end: 20 }; } for ( var ref = range(), i = ref.start, end = ref.end, end = end === void 0 ? 100 : end; i < end; i += 1 ) { console.log( i ); }` }, { description: 'nested destructuring in variable declaration in for loop head', input: ` for ( var { start: { a, b } } = range(); i < end; i += 1 ) { console.log( i ); }`, output: ` for ( var ref = range(), ref_start = ref.start, a = ref_start.a, b = ref_start.b; i < end; i += 1 ) { console.log( i ); }` }, { description: 'nested array destructuring in variable declaration in for loop head', input: ` for ( var [[x, z], y] = [1, 2]; i < end; i += 1 ) { console.log( i ); }`, output: ` for ( var ref = [1, 2], ref_0 = ref[0], x = ref_0[0], z = ref_0[1], y = ref[1]; i < end; i += 1 ) { console.log( i ); }` }, { description: 'array destructuring with default value in variable declaration in for loop head', input: ` for ( var [x, y = 4, z] = [1, 2, 3]; i < end; i += 1 ) { console.log( i ); }`, output: ` for ( var ref = [1, 2, 3], x = ref[0], y = ref[1], y = y === void 0 ? 4 : y, z = ref[2]; i < end; i += 1 ) { console.log( i ); }` }, { description: 'object destructuring with default value in variable declaration in for loop head', input: ` for ( var {x, y = 4, z} = {}; i < end; i += 1 ) { console.log( i ); }`, output: ` for ( var ref = {}, x = ref.x, y = ref.y, y = y === void 0 ? 4 : y, z = ref.z; i < end; i += 1 ) { console.log( i ); }` }, { description: 'arrow functions in block-less for loops in a block-less if/else chain (#110)', input: ` if (x) for (let i = 0; i < a.length; ++i) (() => { console.log(a[i]); })(); else if (y) for (let i = 0; i < b.length; ++i) (() => { console.log(b[i]); })(); else for (let i = 0; i < c.length; ++i) (() => { console.log(c[i]); })(); `, // the indentation is not ideal, but the code is correct... output: ` if (x) { var loop = function ( i ) { (function () { console.log(a[i]); })(); }; for (var i = 0; i < a.length; ++i) loop( i ); } else if (y) { var loop$1 = function ( i ) { (function () { console.log(b[i]); })(); }; for (var i$1 = 0; i$1 < b.length; ++i$1) loop$1( i$1 ); } else { var loop$2 = function ( i ) { (function () { console.log(c[i]); })(); }; for (var i$2 = 0; i$2 < c.length; ++i$2) loop$2( i$2 ); } ` }, { description: 'always initialises block-scoped variable in loop (#124)', input: ` for (let i = 0; i < 10; i++) { let something; if (i % 2) something = true; console.log(something); }`, output: ` for (var i = 0; i < 10; i++) { var something = (void 0); if (i % 2) { something = true; } console.log(something); }` }, { description: 'always initialises block-scoped variable in for-of loop (#125)', options: { transforms: { dangerousForOf: true } }, input: ` for (let a = 0; a < 10; a++) { let j = 1, k; for (let b of c) { let x, y = 2 f(b, j, k, x, y) } } `, output: ` for (var a = 0; a < 10; a++) { var j = 1, k = (void 0); for (var i = 0, list = c; i < list.length; i += 1) { var b = list[i]; var x = (void 0), y = 2 f(b, j, k, x, y) } } ` }, { description: 'always initialises block-scoped variable in simple for-of loop (#125)', options: { transforms: { dangerousForOf: true } }, input: ` for (let b of c) { let x, y = 2, z; f(b, x++, y++, z++) } `, output: ` for (var i = 0, list = c; i < list.length; i += 1) { var b = list[i]; var x = (void 0), y = 2, z = (void 0); f(b, x++, y++, z++) } ` }, { description: 'always initialises block-scoped variable in for-in loop', input: ` for (let k in obj) { var r = 1, s, t; let x, y = 2, z; f(k, r++, s++, t++, x++, y++, z++) } `, output: ` for (var k in obj) { var r = 1, s, t; var x = (void 0), y = 2, z = (void 0); f(k, r++, s++, t++, x++, y++, z++) } ` }, { description: 'use alias for this in right side of nested for-in loop declaration (#142)', input: ` let arr = []; class Foo { constructor () { this.foo = { a: 1, b: 2 }; } do() { for ( let move = 0; move < 5; ++move ) { for ( let id in this.foo ) arr.push( id ); ( () => { arr.push( move ); } )( move ); } console.log( arr.join( ' ' ) ); } } new Foo().do(); `, output: ` var arr = []; var Foo = function Foo () { this.foo = { a: 1, b: 2 }; }; Foo.prototype.do = function do$1 () { var this$1 = this; var loop = function ( move ) { for ( var id in this$1.foo ) { arr.push( id ); } ( function () { arr.push( move ); } )( move ); }; for ( var move = 0; move < 5; ++move ) loop( move ); console.log( arr.join( ' ' ) ); }; new Foo().do(); ` }, { description: 'use alias for this in right side of nested for-of loop declaration (#142)', options: { transforms: { dangerousForOf: true } }, input: ` let arr = []; class Foo { constructor () { this.foo = [ 9, 7 ]; } do() { for ( let move = 0; move < 5; ++move ) { for ( let id of this.foo ) arr.push( id ); ( () => { arr.push( move ); } )( move ); } console.log( arr.join( ' ' ) ); } } new Foo().do(); `, output: ` var arr = []; var Foo = function Foo () { this.foo = [ 9, 7 ]; }; Foo.prototype.do = function do$1 () { var this$1 = this; var loop = function ( move ) { for ( var i = 0, list = this$1.foo; i < list.length; i += 1 ) { var id = list[i]; arr.push( id ); } ( function () { arr.push( move ); } )( move ); }; for ( var move = 0; move < 5; ++move ) loop( move ); console.log( arr.join( ' ' ) ); }; new Foo().do(); ` }, { description: 'transpiles destructuring in for-in loop heads', input: `for (var [a, b] in []) {}`, output: `for (var ref in []) {var a = ref[0]; var b = ref[1]; }` }, { description: 'transpiles destructuring in for-in loop heads', input: ` for ([a, b = "_"] in []) f(a, b)`, output: ` for (var ref in []) { var a = ref[0]; var b = ref[1]; if ( b === void 0 ) b = "_"; f(a, b) }` } ]; buble-0.19.3/test/samples/misc.js000066400000000000000000000057741324054410700166260ustar00rootroot00000000000000module.exports = [ { description: 'handles empty return', input: ` function foo () { return; }`, output: ` function foo () { return; }` }, { description: 'allows break statement inside switch', input: ` switch ( foo ) { case bar: console.log( 'bar' ); break; default: console.log( 'default' ); }`, output: ` switch ( foo ) { case bar: console.log( 'bar' ); break; default: console.log( 'default' ); }` }, { description: 'double var is okay', input: ` function foo () { var x = 1; var x = 2; }`, output: ` function foo () { var x = 1; var x = 2; }` }, { description: 'var followed by let is not okay', input: ` function foo () { var x = 1; let x = 2; }`, error: /Identifier 'x' has already been declared/ }, { description: 'let followed by var is not okay', input: ` function foo () { let x = 1; var x = 2; }`, error: /Identifier 'x' has already been declared/ }, { description: 'does not get confused about keys of Literal node', input: ` console.log( null ); console.log( 'some string' ); console.log( null );`, output: ` console.log( null ); console.log( 'some string' ); console.log( null );` }, { description: 'handles sparse arrays (#62)', input: `var a = [ , 1 ], b = [ 1, ], c = [ 1, , 2 ], d = [ 1, , , ];`, output: `var a = [ , 1 ], b = [ 1 ], c = [ 1, , 2 ], d = [ 1, , , ];` }, { description: 'Safari/WebKit bug workaround: parameter shadowing function expression name (#154)', input: ` "use strict"; // necessary to trigger WebKit bug class Foo { bar (bar) { return bar; } static baz (foo, bar, baz) { return foo * baz - baz * bar; } } var a = class Bar { b (a, b, c) { return a * b - c * b + b$1 - b$2; } }; var b = class { b (a, b, c) { return a * b - c * b; } }; var c = { b (a, b, c) { return a * b - c * b; } }; var d = function foo(foo) { return foo; }; // FunctionDeclaration is not subject to the WebKit bug function bar(bar) { return bar; } `, output: ` "use strict"; // necessary to trigger WebKit bug var Foo = function Foo () {}; Foo.prototype.bar = function bar (bar$1) { return bar$1; }; Foo.baz = function baz (foo, bar, baz$1) { return foo * baz$1 - baz$1 * bar; }; var a = (function () { function Bar () {} Bar.prototype.b = function b (a, b$3, c) { return a * b$3 - c * b$3 + b$1 - b$2; }; return Bar; }()); var b = (function () { function b () {} b.prototype.b = function b (a, b$1, c) { return a * b$1 - c * b$1; }; return b; }()); var c = { b: function b (a, b$1, c) { return a * b$1 - c * b$1; } }; var d = function foo(foo$1) { return foo$1; }; // FunctionDeclaration is not subject to the WebKit bug function bar(bar) { return bar; } ` } ]; buble-0.19.3/test/samples/modules.js000066400000000000000000000027201324054410700173270ustar00rootroot00000000000000module.exports = [ { description: 'disallows import statement', input: `import 'foo';`, error: /import is not supported/ }, { description: 'disallows export statement', input: `export { foo };`, error: /export is not supported/ }, { description: 'imports are ignored with `transforms.moduleImport === false`', options: { transforms: { moduleImport: false } }, input: `import 'foo';`, output: `import 'foo';` }, { description: 'exports are ignored with `transforms.moduleExport === false`', options: { transforms: { moduleExport: false } }, input: `export { foo };`, output: `export { foo };` }, { description: 'imports and exports are ignored with `transforms.modules === false`', options: { transforms: { modules: false } }, input: `import 'foo'; export { foo };`, output: `import 'foo'; export { foo };` }, { description: 'Supports anonymous functions as default export', options: { transforms: { modules: false } }, input: `export default function () {}`, output: `export default function () {}` }, { description: 'Supports anonymous classes as default export', options: { transforms: { modules: false } }, input: ` export default class { constructor() { foo() } a() { bar() } } `, output: ` var defaultExport = function defaultExport() { foo() }; defaultExport.prototype.a = function a () { bar() }; export default defaultExport; ` } ]; buble-0.19.3/test/samples/object-properties-no-named-function-expressions.js000066400000000000000000000050171324054410700272200ustar00rootroot00000000000000module.exports = [ { description: 'transpiles shorthand properties', options: { namedFunctionExpressions: false }, input: `obj = { x, y }`, output: `obj = { x: x, y: y }` }, { description: 'transpiles shorthand methods', options: { namedFunctionExpressions: false }, input: ` obj = { foo () { return 42; } }`, output: ` obj = { foo: function () { return 42; } }` }, { description: 'transpiles shorthand methods with quoted names (#82)', options: { namedFunctionExpressions: false }, input: ` obj = { 'foo-bar' () { return 42; } }`, output: ` obj = { 'foo-bar': function () { return 42; } }` }, { description: 'transpiles shorthand methods with reserved names (!68)', options: { namedFunctionExpressions: false }, input: ` obj = { catch () { return 42; } }`, output: ` obj = { catch: function () { return 42; } }` }, { description: 'transpiles shorthand methods with numeric or string names (#139)', options: { namedFunctionExpressions: false }, input: ` obj = { 0() {}, 0b101() {}, 80() {}, .12e3() {}, 0o753() {}, 12e34() {}, 0xFFFF() {}, "a string"() {}, "var"() {}, }`, output: ` obj = { 0: function() {}, 5: function() {}, 80: function() {}, .12e3: function() {}, 491: function() {}, 12e34: function() {}, 0xFFFF: function() {}, "a string": function() {}, "var": function() {}, }` }, { description: 'shorthand properties can be disabled with `transforms.conciseMethodProperty === false`', options: { namedFunctionExpressions: false, transforms: { conciseMethodProperty: false } }, input: `var obj = { x, y, z () {} }`, output: `var obj = { x, y, z () {} }` }, { description: 'computed properties can be disabled with `transforms.computedProperty === false`', options: { namedFunctionExpressions: false, transforms: { computedProperty: false } }, input: `var obj = { [x]: 'x' }`, output: `var obj = { [x]: 'x' }` }, { description: 'transpiles computed properties without spacing (#117)', options: { namedFunctionExpressions: false }, input: ` if (1) console.log(JSON.stringify({['com'+'puted']:1,['foo']:2})); else console.log(JSON.stringify({['bar']:3})); `, output: ` var obj, obj$1; if (1) { console.log(JSON.stringify(( obj = {}, obj['com'+'puted'] = 1, obj['foo'] = 2, obj ))); } else { console.log(JSON.stringify(( obj$1 = {}, obj$1['bar'] = 3, obj$1 ))); } ` } ]; buble-0.19.3/test/samples/object-properties.js000066400000000000000000000053121324054410700213170ustar00rootroot00000000000000module.exports = [ { description: 'transpiles shorthand properties', input: `obj = { x, y }`, output: `obj = { x: x, y: y }` }, { description: 'transpiles shorthand methods', input: ` obj = { foo () { return 42; } }`, output: ` obj = { foo: function foo () { return 42; } }` }, { description: 'transpiles shorthand methods with quoted names (#82)', input: ` obj = { 'foo-bar' () { return 42; } }`, output: ` obj = { 'foo-bar': function foo_bar () { return 42; } }` }, { description: 'transpiles shorthand methods with reserved names (!68)', input: ` obj = { catch () { return 42; } }`, output: ` obj = { catch: function catch$1 () { return 42; } }` }, { description: 'transpiles shorthand methods with numeric or string names (#139)', input: ` obj = { 0() {}, 0b101() {}, 80() {}, .12e3() {}, 0o753() {}, 12e34() {}, 0xFFFF() {}, "a string"() {}, "var"() {}, }`, output: ` obj = { 0: function () {}, 5: function () {}, 80: function () {}, .12e3: function () {}, 491: function () {}, 12e34: function () {}, 0xFFFF: function () {}, "a string": function astring() {}, "var": function var$1() {}, }` }, { description: 'shorthand properties can be disabled with `transforms.conciseMethodProperty === false`', options: { transforms: { conciseMethodProperty: false } }, input: `var obj = { x, y, z () {} }`, output: `var obj = { x, y, z () {} }` }, { description: 'computed properties can be disabled with `transforms.computedProperty === false`', options: { transforms: { computedProperty: false } }, input: `var obj = { [x]: 'x' }`, output: `var obj = { [x]: 'x' }` }, { description: 'transpiles computed properties without spacing (#117)', input: ` if (1) console.log(JSON.stringify({['com'+'puted']:1,['foo']:2})); else console.log(JSON.stringify({['bar']:3})); `, output: ` var obj, obj$1; if (1) { console.log(JSON.stringify(( obj = {}, obj['com'+'puted'] = 1, obj['foo'] = 2, obj ))); } else { console.log(JSON.stringify(( obj$1 = {}, obj$1['bar'] = 3, obj$1 ))); } ` }, { description: 'transpiles string-keyed properties after computed properties', input: ` fn({['computed']:1, 'some-var':2, a: 3}); `, output: ` var obj; fn(( obj = {}, obj['computed'] = 1, obj['some-var'] = 2, obj.a = 3, obj )); ` }, { description: 'avoids shadowing free variables with method names (#166)', input: ` let x = { foo() { return foo }, bar() {} } `, output: ` var x = { foo: function foo$1() { return foo }, bar: function bar() {} } ` } ]; buble-0.19.3/test/samples/object-rest-spread.js000066400000000000000000000176721324054410700213700ustar00rootroot00000000000000module.exports = [ { description: 'disallows object spread operator', input: 'var obj = {...a};', error: /Object spread operator requires specified objectAssign option with 'Object\.assign' or polyfill helper\./ }, { description: 'transpiles object spread with one object', options: { objectAssign: 'Object.assign' }, input: `var obj = {...a};`, output: `var obj = Object.assign({}, a);` }, { description: 'transpiles object spread with two objects', options: { objectAssign: 'Object.assign' }, input: `var obj = {...a, ...b};`, output: `var obj = Object.assign({}, a, b);` }, { description: 'transpiles object spread with regular keys in between', options: { objectAssign: 'Object.assign' }, input: `var obj = { ...a, b: 1, c: 2 };`, output: `var obj = Object.assign({}, a, {b: 1, c: 2});` }, { description: 'transpiles object spread mixed', options: { objectAssign: 'Object.assign' }, input: `var obj = { ...a, b: 1, ...d, e};`, output: `var obj = Object.assign({}, a, {b: 1}, d, {e: e});` }, { description: 'transpiles objects with spread with computed property (#144)', options: { objectAssign: 'Object.assign' }, input: ` var a0 = { [ x ] : true , ... y }; var a1 = { [ w ] : 0 , [ x ] : true , ... y }; var a2 = { v, [ w ] : 0, [ x ] : true, ... y }; var a3 = { [ w ] : 0, [ x ] : true }; var a4 = { [ w ] : 0 , [ x ] : true , y }; var a5 = { k : 9 , [ x ] : true, ... y }; var a6 = { ... y, [ x ] : true }; var a7 = { ... y, [ w ] : 0, [ x ] : true }; var a8 = { k : 9, ... y, [ x ] : true }; var a9 = { [ x ] : true , [ y ] : false , [ z ] : 9 }; var a10 = { [ x ] : true, ...y, p, ...q }; var a11 = { x, [c] : 9 , y }; var a12 = { ...b, [c]:3, d:4 }; `, output: ` var obj, obj$1, obj$2, obj$3, obj$4, obj$5, obj$6, obj$7, obj$8; var a0 = Object.assign(( obj = {}, obj[ x ] = true, obj ), y); var a1 = Object.assign(( obj$1 = {}, obj$1[ w ] = 0, obj$1[ x ] = true, obj$1 ), y); var a2 = Object.assign(( obj$2 = { v: v }, obj$2[ w ] = 0, obj$2[ x ] = true, obj$2 ), y); var a3 = {}; a3[ w ] = 0; a3[ x ] = true; var a4 = {}; a4[ w ] = 0; a4[ x ] = true; a4.y = y; var a5 = Object.assign(( obj$3 = { k : 9 }, obj$3[ x ] = true, obj$3 ), y); var a6 = Object.assign({}, y, ( obj$4 = {}, obj$4[ x ] = true, obj$4 )); var a7 = Object.assign({}, y, ( obj$5 = {}, obj$5[ w ] = 0, obj$5[ x ] = true, obj$5 )); var a8 = Object.assign({ k : 9 }, y, ( obj$6 = {}, obj$6[ x ] = true, obj$6 )); var a9 = {}; a9[ x ] = true; a9[ y ] = false; a9[ z ] = 9; var a10 = Object.assign(( obj$7 = {}, obj$7[ x ] = true, obj$7 ), y, {p: p}, q); var a11 = { x: x }; a11[c] = 9; a11.y = y; var a12 = Object.assign({}, b, ( obj$8 = {}, obj$8[c] = 3, obj$8 ), {d:4}); ` }, { description: 'transpiles inline objects with spread with computed property (#144)', options: { objectAssign: 'Object.assign' }, input: ` f0( { [ x ] : true , ... y } ); f1( { [ w ] : 0 , [ x ] : true , ... y } ); f2( { v, [ w ] : 0, [ x ] : true, ... y } ); f3( { [ w ] : 0, [ x ] : true } ); f4( { [ w ] : 0 , [ x ] : true , y } ); f5( { k : 9 , [ x ] : true, ... y } ); f6( { ... y, [ x ] : true } ); f7( { ... y, [ w ] : 0, [ x ] : true } ); f8( { k : 9, ... y, [ x ] : true } ); f9( { [ x ] : true , [ y ] : false , [ z ] : 9 } ); f10( { [ x ] : true, ...y, p, ...q } ); f11( { x, [c] : 9 , y } ); f12({ ...b, [c]:3, d:4 }); `, output: ` var obj, obj$1, obj$2, obj$3, obj$4, obj$5, obj$6, obj$7, obj$8, obj$9, obj$10, obj$11, obj$12; f0( Object.assign(( obj = {}, obj[ x ] = true, obj ), y) ); f1( Object.assign(( obj$1 = {}, obj$1[ w ] = 0, obj$1[ x ] = true, obj$1 ), y) ); f2( Object.assign(( obj$2 = { v: v }, obj$2[ w ] = 0, obj$2[ x ] = true, obj$2 ), y) ); f3( ( obj$3 = {}, obj$3[ w ] = 0, obj$3[ x ] = true, obj$3 ) ); f4( ( obj$4 = {}, obj$4[ w ] = 0, obj$4[ x ] = true, obj$4.y = y, obj$4 ) ); f5( Object.assign(( obj$5 = { k : 9 }, obj$5[ x ] = true, obj$5 ), y) ); f6( Object.assign({}, y, ( obj$6 = {}, obj$6[ x ] = true, obj$6 )) ); f7( Object.assign({}, y, ( obj$7 = {}, obj$7[ w ] = 0, obj$7[ x ] = true, obj$7 )) ); f8( Object.assign({ k : 9 }, y, ( obj$8 = {}, obj$8[ x ] = true, obj$8 )) ); f9( ( obj$9 = {}, obj$9[ x ] = true, obj$9[ y ] = false, obj$9[ z ] = 9, obj$9 ) ); f10( Object.assign(( obj$10 = {}, obj$10[ x ] = true, obj$10 ), y, {p: p}, q) ); f11( ( obj$11 = { x: x }, obj$11[c] = 9, obj$11.y = y, obj$11 ) ); f12(Object.assign({}, b, ( obj$12 = {}, obj$12[c] = 3, obj$12 ), {d:4})); ` }, { description: 'transpiles object spread nested', options: { objectAssign: 'Object.assign' }, input: `var obj = { ...a, b: 1, dd: {...d, f: 1}, e};`, output: `var obj = Object.assign({}, a, {b: 1, dd: Object.assign({}, d, {f: 1}), e: e});` }, { description: 'transpiles object spread deeply nested', options: { objectAssign: 'Object.assign' }, input: `const c = { ...a, b: 1, dd: {...d, f: 1, gg: {h, ...g, ii: {...i}}}, e};`, output: `var c = Object.assign({}, a, {b: 1, dd: Object.assign({}, d, {f: 1, gg: Object.assign({}, {h: h}, g, {ii: Object.assign({}, i)})}), e: e});` }, { description: 'transpiles object spread with custom Object.assign', options: { objectAssign: 'angular.extend' }, input: `var obj = { ...a, b: 1, dd: {...d, f: 1}, e};`, output: `var obj = angular.extend({}, a, {b: 1, dd: angular.extend({}, d, {f: 1}), e: e});` }, { description: 'transpiles rest properties', input: `var {a, ...b} = c`, output: `function objectWithoutProperties (obj, exclude) { var target = {}; for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k) && exclude.indexOf(k) === -1) target[k] = obj[k]; return target; } var a = c.a; var rest = objectWithoutProperties( c, ["a"] ); var b = rest;` }, { description: 'transpiles rest properties in assignments', input: `({a, ...b} = c);`, output: `function objectWithoutProperties (obj, exclude) { var target = {}; for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k) && exclude.indexOf(k) === -1) target[k] = obj[k]; return target; } var assign, rest; ((assign = c, a = assign.a, rest = objectWithoutProperties( assign, ["a"] ), b = rest));` }, { description: 'transpiles rest properties in arguments', input: ` "use strict"; function objectWithoutProperties({x, ...y}) {}`, output: ` "use strict"; function objectWithoutProperties$1 (obj, exclude) { var target = {}; for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k) && exclude.indexOf(k) === -1) target[k] = obj[k]; return target; } function objectWithoutProperties(ref) { var x = ref.x; var rest = objectWithoutProperties$1( ref, ["x"] ); var y = rest; }` }, { description: 'transpiles rest properties in arrow function arguments', input: `(({x, ...y}) => {})`, output: `function objectWithoutProperties (obj, exclude) { var target = {}; for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k) && exclude.indexOf(k) === -1) target[k] = obj[k]; return target; } (function (ref) { var x = ref.x; var rest = objectWithoutProperties( ref, ["x"] ); var y = rest; })` }, { description: 'transpiles rest properties in for loop heads', input: `for( var {a, ...b} = c;; ) {}`, output: `function objectWithoutProperties (obj, exclude) { var target = {}; for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k) && exclude.indexOf(k) === -1) target[k] = obj[k]; return target; } for( var a = c.a, rest = objectWithoutProperties( c, ["a"] ), b = rest;; ) {}` }, { description: 'transpiles trivial rest properties in for loop heads', input: `for( var {...b} = c;; ) {}`, output: `function objectWithoutProperties (obj, exclude) { var target = {}; for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k) && exclude.indexOf(k) === -1) target[k] = obj[k]; return target; } for( var rest = objectWithoutProperties( c, [] ), b = rest;; ) {}` } ]; buble-0.19.3/test/samples/regex.js000066400000000000000000000015621324054410700167740ustar00rootroot00000000000000module.exports = [ { description: 'transpiles regex with unicode flag', input: `var regex = /foo.bar/u;`, output: `var regex = /foo(?:[\\0-\\t\\x0B\\f\\x0E-\\u2027\\u202A-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])bar/;` }, { description: 'disallows sticky flag in regex literals', input: `var regex = /x/y;`, error: /Regular expression sticky flag is not supported/ }, { description: 'u flag is ignored with `transforms.unicodeRegExp === false`', options: { transforms: { unicodeRegExp: false } }, input: `var regex = /x/u;`, output: `var regex = /x/u;` }, { description: 'y flag is ignored with `transforms.stickyRegExp === false`', options: { transforms: { stickyRegExp: false } }, input: `var regex = /x/y;`, output: `var regex = /x/y;` } ]; buble-0.19.3/test/samples/reserved-properties.js000066400000000000000000000013531324054410700216710ustar00rootroot00000000000000module.exports = [ { description: 'rewrites member expressions that are reserved words', options: { transforms: { reservedProperties: true } }, input: `foo.then + foo.catch`, output: `foo.then + foo['catch']` }, { description: 'rewrites object literal properties that are reserved words', options: { transforms: { reservedProperties: true } }, input: `obj = { then: 1, catch: 2 }`, output: `obj = { then: 1, 'catch': 2 }` }, { description: 'does not rewrite member expressions by default', input: `foo.then + foo.catch`, output: `foo.then + foo.catch` }, { description: 'does not rewrite object literal properties by default', input: `obj = { then: 1, catch: 2 }`, output: `obj = { then: 1, catch: 2 }` } ]; buble-0.19.3/test/samples/rest-parameters.js000066400000000000000000000017011324054410700207730ustar00rootroot00000000000000module.exports = [ { description: 'transpiles solo rest parameters', input: ` function foo ( ...theRest ) { console.log( theRest ); }`, output: ` function foo () { var theRest = [], len = arguments.length; while ( len-- ) theRest[ len ] = arguments[ len ]; console.log( theRest ); }` }, { description: 'transpiles rest parameters following other parameters', input: ` function foo ( a, b, c, ...theRest ) { console.log( theRest ); }`, output: ` function foo ( a, b, c ) { var theRest = [], len = arguments.length - 3; while ( len-- > 0 ) theRest[ len ] = arguments[ len + 3 ]; console.log( theRest ); }` }, { description: 'can be disabled with `transforms.spreadRest === false`', options: { transforms: { spreadRest: false } }, input: ` function foo ( ...list ) { // code goes here }`, output: ` function foo ( ...list ) { // code goes here }` } ]; buble-0.19.3/test/samples/spread-operator.js000066400000000000000000000362331324054410700207740ustar00rootroot00000000000000module.exports = [ { description: 'transpiles a lone spread operator', input: `var clone = [ ...arr ]`, output: `var clone = [].concat( arr )` }, { description: 'transpiles a spread element in array with trailing comma', input: `var clone = [ ...arr, ];`, output: `var clone = [].concat( arr );` }, { description: 'transpiles a spread operator with other values', input: `var list = [ a, b, ...remainder ]`, output: `var list = [ a, b ].concat( remainder )` // TODO preserve whitespace conventions }, { description: 'transpiles a lone spread operator in a method call', input: `var max = Math.max( ...values );`, output: `var max = Math.max.apply( Math, values );` }, { description: 'transpiles a spread operator in a method call with other arguments', input: `var max = Math.max( 0, ...values );`, output: `var max = Math.max.apply( Math, [ 0 ].concat( values ) );` }, { description: 'transpiles a spread operator in a method call of an expression', input: ` ( foo || bar ).baz( ...values );`, output: ` var ref; (ref = ( foo || bar )).baz.apply( ref, values );` }, { description: 'transpiles a spread operator in a method call of this (#100)', input: ` function a( args ) { return this.go( ...args ); }`, output: ` function a( args ) { var ref; return (ref = this).go.apply( ref, args ); }` }, { description: 'transpiles a spread operator in a call in an arrow function using this (#115)', input: ` function foo(...args) { return Domain.run(() => { return this.go(...args); }); } function bar(args) { return Domain.run(() => { return this.go(...args); }); } function baz() { return Domain.run(() => { return this.go(...arguments); }); } `, output: ` function foo() { var this$1 = this; var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; return Domain.run(function () { var ref; return (ref = this$1).go.apply(ref, args); }); } function bar(args) { var this$1 = this; return Domain.run(function () { var ref; return (ref = this$1).go.apply(ref, args); }); } function baz() { var arguments$1 = arguments; var this$1 = this; return Domain.run(function () { var ref; return (ref = this$1).go.apply(ref, arguments$1); }); } ` }, { description: 'transpiles a spread operator in a new call in an arrow function using this', input: ` function foo(...args) { return Domain.run(() => { return new this.Test(...args); }); } function bar(args) { return Domain.run(() => { return new this.Test(...args); }); } function baz() { return Domain.run(() => { return new this.Test(...arguments); }); } `, output: ` function foo() { var this$1 = this; var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; return Domain.run(function () { return new (Function.prototype.bind.apply( this$1.Test, [ null ].concat( args) )); }); } function bar(args) { var this$1 = this; return Domain.run(function () { return new (Function.prototype.bind.apply( this$1.Test, [ null ].concat( args) )); }); } function baz() { var arguments$1 = arguments; var this$1 = this; var i = arguments.length, argsArray = Array(i); while ( i-- ) argsArray[i] = arguments[i]; return Domain.run(function () { return new (Function.prototype.bind.apply( this$1.Test, [ null ].concat( argsArray) )); }); } ` }, { description: 'transpiles a spread operator in an expression method call within an if', input: ` var result; if ( ref ) result = expr().baz( ...values ); process( result );`, output: ` var ref$1; var result; if ( ref ) { result = (ref$1 = expr()).baz.apply( ref$1, values ); } process( result );` }, { description: 'transpiles spread operators in expression method calls within a function', input: ` function foo() { stuff(); if ( ref ) return expr().baz( ...values ); return (up || down).bar( ...values ); }`, output: ` function foo() { var ref$1, ref$2; stuff(); if ( ref ) { return (ref$1 = expr()).baz.apply( ref$1, values ); } return (ref$2 = (up || down)).bar.apply( ref$2, values ); }` }, { description: 'transpiles spread operators in a complex nested scenario', input: ` function ref() { stuff(); if ( ref$1 ) return expr().baz( a, ...values, (up || down).bar( c, ...values, d ) ); return other(); }`, output: ` function ref() { var ref, ref$2; stuff(); if ( ref$1 ) { return (ref = expr()).baz.apply( ref, [ a ].concat( values, [(ref$2 = (up || down)).bar.apply( ref$2, [ c ].concat( values, [d] ) )] ) ); } return other(); }` }, { description: 'transpiles spread operators in issue #92', input: ` var adder = { add(...numbers) { return numbers.reduce((a, b) => a + b, 0) }, prepare() { return this.add.bind(this, ...arguments) } }`, output: ` var adder = { add: function add() { var numbers = [], len = arguments.length; while ( len-- ) numbers[ len ] = arguments[ len ]; return numbers.reduce(function (a, b) { return a + b; }, 0) }, prepare: function prepare() { var i = arguments.length, argsArray = Array(i); while ( i-- ) argsArray[i] = arguments[i]; var ref; return (ref = this.add).bind.apply(ref, [ this ].concat( argsArray )) } }` }, { description: 'transpiles spread operators with template literals (issue #99)', input: 'console.log( `%s ${label}:`, `${color}`, ...args );', output: 'console.log.apply( console, [ ("%s " + label + ":"), ("" + color) ].concat( args ) );' }, { description: 'transpiles a lone spread operator in a function call', input: `log( ...values );`, output: `log.apply( void 0, values );` }, { description: 'transpiles a spread operator in a function call with other arguments', input: `sprintf( str, ...values );`, output: `sprintf.apply( void 0, [ str ].concat( values ) );` }, { description: 'transpiles a spread operator in an expression call', input: `( foo || bar )( ...values );`, output: `( foo || bar ).apply( void 0, values );` }, { description: 'can be disabled in array expressions `transforms.spreadRest: false`', options: { transforms: { spreadRest: false } }, input: `var chars = [ ...string ]`, output: `var chars = [ ...string ]` }, { description: 'can be disabled in call expressions with `transforms.spreadRest: false`', options: { transforms: { spreadRest: false } }, input: `var max = Math.max( ...values );`, output: `var max = Math.max( ...values );` }, { description: 'transpiles multiple spread operators in an array', input: `var arr = [ ...a, ...b, ...c ];`, output: `var arr = a.concat( b, c );` }, { description: 'transpiles multiple spread operators in an array with trailing comma', input: `var arr = [ ...a, ...b, ...c, ];`, output: `var arr = a.concat( b, c );` }, { description: 'transpiles mixture of spread and non-spread elements', input: `var arr = [ ...a, b, ...c, d ];`, output: `var arr = a.concat( [b], c, [d] );` }, { description: 'transpiles mixture of spread and non-spread elements in array with trailing comma', input: `var arr = [ ...a, b, ...c, d, ];`, output: `var arr = a.concat( [b], c, [d] );` }, { description: 'transpiles ...arguments', input: ` function foo () { var args = [ ...arguments ]; return args; }`, output: ` function foo () { var i = arguments.length, argsArray = Array(i); while ( i-- ) argsArray[i] = arguments[i]; var args = [].concat( argsArray ); return args; }` // TODO if this is the only use of argsArray, don't bother concating }, { description: 'transpiles ...arguments in array with trailing comma', input: ` function foo () { var args = [ ...arguments, ]; return args; }`, output: ` function foo () { var i = arguments.length, argsArray = Array(i); while ( i-- ) argsArray[i] = arguments[i]; var args = [].concat( argsArray ); return args; }` // TODO if this is the only use of argsArray, don't bother concating }, { description: 'transpiles ...arguments in middle of array', input: ` function foo () { var arr = [ a, ...arguments, b ]; return arr; }`, output: ` function foo () { var i = arguments.length, argsArray = Array(i); while ( i-- ) argsArray[i] = arguments[i]; var arr = [ a ].concat( argsArray, [b] ); return arr; }` }, { description: 'transpiles multiple spread operators in function call', input: `var max = Math.max( ...theseValues, ...thoseValues );`, output: `var max = Math.max.apply( Math, theseValues.concat( thoseValues ) );` }, { description: 'transpiles mixture of spread and non-spread operators in function call', input: `var max = Math.max( ...a, b, ...c, d );`, output: `var max = Math.max.apply( Math, a.concat( [b], c, [d] ) );` }, { description: 'transpiles ...arguments in function call', input: ` function foo () { return Math.max( ...arguments ); }`, output: ` function foo () { return Math.max.apply( Math, arguments ); }` }, { description: 'transpiles ...arguments in middle of function call', input: ` function foo () { return Math.max( a, ...arguments, b ); }`, output: ` function foo () { var i = arguments.length, argsArray = Array(i); while ( i-- ) argsArray[i] = arguments[i]; return Math.max.apply( Math, [ a ].concat( argsArray, [b] ) ); }` }, { description: 'transpiles new with spread args', input: ` function Test() { this.a = [...arguments]; console.log(JSON.stringify(this.a)); } var obj = { Test }; new Test(...[1, 2]); new obj.Test(...[1, 2]); new (null || obj).Test(...[1, 2]); new Test(0, ...[1, 2]); new obj.Test(0, ...[1, 2]); new (null || obj).Test(0, ...[1, 2]); new Test(...[1, 2], ...[3, 4], 5); new obj.Test(...[1, 2], ...[3, 4], 5); new (null || obj).Test(...[1, 2], ...[3, 4], 5); new Test(...[1, 2], new Test(...[7, 8]), ...[3, 4], 5); new obj.Test(...[1, 2], new Test(...[7, 8]), ...[3, 4], 5); new (null || obj).Test(...[1, 2], new Test(...[7, 8]), ...[3, 4], 5); (function () { new Test(...arguments); new obj.Test(...arguments); new (null || obj).Test(...arguments); new Test(1, ...arguments); new obj.Test(1, ...arguments); new (null || obj).Test(1, ...arguments); })(7, 8, 9); `, output: ` function Test() { var i = arguments.length, argsArray = Array(i); while ( i-- ) argsArray[i] = arguments[i]; this.a = [].concat( argsArray ); console.log(JSON.stringify(this.a)); } var obj = { Test: Test }; new (Function.prototype.bind.apply( Test, [ null ].concat( [1, 2]) )); new (Function.prototype.bind.apply( obj.Test, [ null ].concat( [1, 2]) )); new (Function.prototype.bind.apply( (null || obj).Test, [ null ].concat( [1, 2]) )); new (Function.prototype.bind.apply( Test, [ null ].concat( [0], [1, 2]) )); new (Function.prototype.bind.apply( obj.Test, [ null ].concat( [0], [1, 2]) )); new (Function.prototype.bind.apply( (null || obj).Test, [ null ].concat( [0], [1, 2]) )); new (Function.prototype.bind.apply( Test, [ null ].concat( [1, 2], [3, 4], [5]) )); new (Function.prototype.bind.apply( obj.Test, [ null ].concat( [1, 2], [3, 4], [5]) )); new (Function.prototype.bind.apply( (null || obj).Test, [ null ].concat( [1, 2], [3, 4], [5]) )); new (Function.prototype.bind.apply( Test, [ null ].concat( [1, 2], [new (Function.prototype.bind.apply( Test, [ null ].concat( [7, 8]) ))], [3, 4], [5]) )); new (Function.prototype.bind.apply( obj.Test, [ null ].concat( [1, 2], [new (Function.prototype.bind.apply( Test, [ null ].concat( [7, 8]) ))], [3, 4], [5]) )); new (Function.prototype.bind.apply( (null || obj).Test, [ null ].concat( [1, 2], [new (Function.prototype.bind.apply( Test, [ null ].concat( [7, 8]) ))], [3, 4], [5]) )); (function () { var i = arguments.length, argsArray = Array(i); while ( i-- ) argsArray[i] = arguments[i]; new (Function.prototype.bind.apply( Test, [ null ].concat( argsArray) )); new (Function.prototype.bind.apply( obj.Test, [ null ].concat( argsArray) )); new (Function.prototype.bind.apply( (null || obj).Test, [ null ].concat( argsArray) )); new (Function.prototype.bind.apply( Test, [ null ].concat( [1], argsArray) )); new (Function.prototype.bind.apply( obj.Test, [ null ].concat( [1], argsArray) )); new (Function.prototype.bind.apply( (null || obj).Test, [ null ].concat( [1], argsArray) )); })(7, 8, 9); ` }, { description: 'transpiles `new` with spread parameter in an arrow function', input: ` function foo (x) { if ( x ) return ref => new (bar || baz).Test( ref, ...x ); } `, output: ` function foo (x) { if ( x ) { return function (ref) { return new (Function.prototype.bind.apply( (bar || baz).Test, [ null ].concat( [ref], x ) )); }; } } ` }, { description: 'transpiles a call with spread parameter in an arrow function', input: ` function foo (x) { if ( x ) return ref => (bar || baz).Test( ref, ...x ); } `, output: ` function foo (x) { if ( x ) { return function (ref) { var ref$1; return (ref$1 = (bar || baz)).Test.apply( ref$1, [ ref ].concat( x ) ); }; } } ` }, { description: 'transpiles `new` with ...arguments in an arrow function', input: ` function foo (x) { if ( x ) return ref => new (bar || baz).Test( ref, ...arguments ); } `, output: ` function foo (x) { var arguments$1 = arguments; var i = arguments.length, argsArray = Array(i); while ( i-- ) argsArray[i] = arguments[i]; if ( x ) { return function (ref) { return new (Function.prototype.bind.apply( (bar || baz).Test, [ null ].concat( [ref], argsArray ) )); }; } } ` }, { description: 'transpiles a call with ...arguments in an arrow function', input: ` function foo (x) { if ( x ) return ref => (bar || baz).Test( ref, ...arguments ); } `, output: ` function foo (x) { var arguments$1 = arguments; var i = arguments.length, argsArray = Array(i); while ( i-- ) argsArray[i] = arguments[i]; if ( x ) { return function (ref) { var ref$1; return (ref$1 = (bar || baz)).Test.apply( ref$1, [ ref ].concat( arguments$1 ) ); }; } } ` }, { description: 'transpiles spread with template literal afterwards', input: ` [...f(b), "n"]; [...f(b), 'n']; [...f(b), \`n\`]; `, output: ` f(b).concat( ["n"]); f(b).concat( ['n']); f(b).concat( ["n"]); ` }, { description: 'transpiles spread with arrow function afterwards', input: `[...A, () => 'B']`, output: `A.concat( [function () { return 'B'; }])` }, { description: 'transpiles spread in new with arrow function afterwards', input: `new X(...A, () => 'B')`, output: `new (Function.prototype.bind.apply( X, [ null ].concat( A, [function () { return 'B'; }]) ))` } ]; buble-0.19.3/test/samples/template-strings.js000066400000000000000000000077021324054410700211660ustar00rootroot00000000000000module.exports = [ { description: 'transpiles an untagged template literal', input: 'var str = `foo${bar}baz`;', output: `var str = "foo" + bar + "baz";` }, { description: 'handles arbitrary whitespace inside template elements', input: 'var str = `foo${ bar }baz`;', output: `var str = "foo" + bar + "baz";` }, { description: 'transpiles an untagged template literal containing complex expressions', input: 'var str = `foo${bar + baz}qux`;', output: `var str = "foo" + (bar + baz) + "qux";` }, { description: 'transpiles a template literal containing single quotes', input: "var singleQuote = `'`;", output: `var singleQuote = "'";` }, { description: 'transpiles a template literal containing double quotes', input: 'var doubleQuote = `"`;', output: `var doubleQuote = "\\"";` }, { description: 'does not transpile tagged template literals', input: 'var str = x`y`', error: /Tagged template strings are not supported/ }, { description: 'transpiles tagged template literals with `transforms.dangerousTaggedTemplateString = true`', options: { transforms: { dangerousTaggedTemplateString: true } }, input: 'var str = x`y${(() => 42)()}`;', output: `var templateObject = Object.freeze(["y", ""]);\nvar str = x(templateObject, (function () { return 42; })());` }, { description: 'transpiles tagged template literals with `transforms.dangerousTaggedTemplateString = true`', options: { transforms: { dangerousTaggedTemplateString: true } }, input: 'var str = x`${(() => 42)()}y`;', output: `var templateObject = Object.freeze(["", "y"]);\nvar str = x(templateObject, (function () { return 42; })());` }, { description: 'reuses quasi array for identical tagged template strings', options: { transforms: { dangerousTaggedTemplateString: true } }, input: 'x`a${a}b`, x`a${b}b`, x`b${c}a`', output: `var templateObject$1 = Object.freeze(["b", "a"]);\nvar templateObject = Object.freeze(["a", "b"]);\nx(templateObject, a), x(templateObject, b), x(templateObject$1, c)` }, { description: 'reuses quasi array for identical tagged template strings in strict mode', options: { transforms: { dangerousTaggedTemplateString: true } }, input: '"use strict";\nx`a${a}b`, x`a${b}b`, x`b${c}a`', output: `"use strict";\nvar templateObject$1 = Object.freeze(["b", "a"]);\nvar templateObject = Object.freeze(["a", "b"]);\nx(templateObject, a), x(templateObject, b), x(templateObject$1, c)` }, { description: 'parenthesises template strings as necessary', input: 'var str = `x${y}`.toUpperCase();', output: 'var str = ("x" + y).toUpperCase();' }, { description: 'does not parenthesise plain template strings', input: 'var str = `x`.toUpperCase();', output: 'var str = "x".toUpperCase();' }, { description: 'does not parenthesise template strings in arithmetic expressions', input: 'var str = `x${y}` + z; var str2 = `x${y}` * z;', output: 'var str = "x" + y + z; var str2 = ("x" + y) * z;' }, { description: 'can be disabled with `transforms.templateString === false`', options: { transforms: { templateString: false } }, input: 'var a = `a`, b = c`b`;', output: 'var a = `a`, b = c`b`;' }, { description: 'skips leading empty string if possible', input: 'var str = `${a} ${b}`', output: 'var str = a + " " + b' }, { description: 'includes leading empty string if necessary', input: 'var str = `${a}${b}`', output: 'var str = "" + a + b' }, { description: 'closes parens if final empty string is omitted', input: 'var str = `1 + 1 = ${1 + 1}`;', output: 'var str = "1 + 1 = " + (1 + 1);' }, { description: 'allows empty template string', input: 'var str = ``;', output: 'var str = "";' }, { description: 'concats expression with variable', input: 'var str = `${a + b}${c}`;', output: 'var str = "" + (a + b) + c;' }, { description: 'interpolations inside interpolations', input: 'var string = `foo${`${bar}`}`', output: `var string = "foo" + ("" + bar)` } ]; buble-0.19.3/test/samples/trailing-function-commas.js000066400000000000000000000030061324054410700225660ustar00rootroot00000000000000module.exports = [ { description: 'strips trailing commas in call arguments', input: ` f(a,)`, output: ` f(a)` }, { description: 'strips trailing commas in function expression arguments', input: ` let f = function (a,) {}`, output: ` var f = function (a) {}` }, { description: 'strips trailing commas in normal function declaration arguments', input: ` function f(a,) {}`, output: ` function f(a) {}` }, { description: 'strips trailing commas in method arguments', input: ` class A { f(a,) {} }`, output: ` var A = function A () {}; A.prototype.f = function f (a) {};` }, { description: 'strips trailing commas in arrow function declaration arguments', input: ` ((a,) => {})`, output: ` (function (a) {})` }, { description: 'strips trailing commas after destructured argument in arrow function declaration arguments', input: ` ((a,[b],{c},) => {})`, output: ` (function (a,ref,ref$1) { var b = ref[0]; var c = ref$1.c; })` }, { description: 'strips trailing commas in new expression arguments', input: ` new f(a,)`, output: ` new f(a)` }, { description: 'keeps commas in trailing comments in normal function declaration arguments', input: ` function f(a/*,*/) {}`, output: ` function f(a/*,*/) {}` }, { description: 'strips trailing commas after comments in normal function declaration arguments', input: ` function f(a/*a*/,) {}`, output: ` function f(a/*a*/) {}` }, ]; buble-0.19.3/test/test.js000066400000000000000000000204061324054410700151730ustar00rootroot00000000000000var path = require('path'); var fs = require('fs'); var rimraf = require('rimraf'); var child_process = require('child_process'); var assert = require('assert'); var glob = require('glob'); var SourceMapConsumer = require('source-map').SourceMapConsumer; var getLocation = require('./utils/getLocation.js'); var buble = require('..'); require('source-map-support').install(); require('console-group').install(); function equal(a, b) { assert.equal(showInvisibles(a), showInvisibles(b)); } function showInvisibles(str) { return str .replace(/^ +/gm, spaces => repeat('•', spaces.length)) .replace(/ +$/gm, spaces => repeat('•', spaces.length)) .replace(/^\t+/gm, tabs => repeat('› ', tabs.length)) .replace(/\t+$/gm, tabs => repeat('› ', tabs.length)); } function repeat(str, times) { var result = ''; while (times--) result += str; return result; } const subsetIndex = process.argv.indexOf('--subset'); const subset = ~subsetIndex ? process.argv[subsetIndex + 1].split(',').map(file => `${file}.js`) : null; const subsetFilter = subset ? file => ~subset.indexOf(file) : () => true; describe('buble', () => { fs .readdirSync('test/samples') .filter(subsetFilter) .forEach(file => { if (!/\.js$/.test(file)) return; // avoid vim .js.swp files var samples = require('./samples/' + file); describe(path.basename(file), () => { samples.forEach(sample => { (sample.solo ? it.only : sample.skip ? it.skip : it)( sample.description, () => { if (sample.error) { assert.throws(() => { buble.transform(sample.input, sample.options); }, sample.error); } else { equal( buble.transform(sample.input, sample.options).code, sample.output ); } } ); }); }); }); if (subset) return; describe('cli', () => { fs.readdirSync('test/cli').forEach(dir => { if (dir[0] === '.') return; // .DS_Store it(dir, done => { dir = path.resolve('test/cli', dir); rimraf.sync(path.resolve(dir, 'actual')); fs.mkdirSync(path.resolve(dir, 'actual')); var binFile = path.resolve(__dirname, '../bin/buble'); var commandFile = path.resolve(dir, 'command.sh'); var command = fs .readFileSync(commandFile, 'utf-8') .replace('buble', 'node "' + binFile + '"'); child_process.exec( command, { cwd: dir }, (err, stdout, stderr) => { if (err) return done(err); if (stdout) console.log(stdout); if (stderr) console.error(stderr); function catalogue(subdir) { subdir = path.resolve(dir, subdir); return glob .sync('**/*.js?(.map)', { cwd: subdir }) .sort() .map(name => { var contents = fs .readFileSync(path.resolve(subdir, name), 'utf-8') .replace(/\r\n/g, '\n') .trim(); if (path.extname(name) === '.map') { contents = JSON.parse(contents); } return { name, contents }; }); } var expected = catalogue('expected'); var actual = catalogue('actual'); try { assert.deepEqual(actual, expected); done(); } catch (err) { done(err); } } ); }); }); }); describe('errors', () => { it('reports the location of a syntax error', () => { var source = `var 42 = nope;`; try { buble.transform(source); } catch (err) { assert.equal(err.name, 'SyntaxError'); assert.deepEqual(err.loc, { line: 1, column: 4 }); assert.equal(err.message, 'Unexpected token (1:4)'); assert.equal(err.snippet, `1 : var 42 = nope;\n ^`); assert.equal( err.toString(), `SyntaxError: Unexpected token (1:4)\n1 : var 42 = nope;\n ^` ); } }); it('reports the location of a compile error', () => { var source = `const x = 1; x++;`; try { buble.transform(source); } catch (err) { assert.equal(err.name, 'CompileError'); assert.equal(err.loc.line, 1); assert.equal(err.loc.column, 13); assert.equal(err.message, 'x is read-only (1:13)'); assert.equal( err.snippet, `1 : const x = 1; x++;\n ^` ); assert.equal( err.toString(), `CompileError: x is read-only (1:13)\n1 : const x = 1; x++;\n ^` ); } }); }); describe('target', () => { it('determines necessary transforms for a target environment', () => { var transforms = buble.target({ chrome: 49 }); assert.ok(transforms.moduleImport); assert.ok(!transforms.arrow); }); it('returns lowest common denominator support info', () => { var transforms = buble.target({ chrome: 49, node: 5 }); assert.ok(transforms.defaultParameter); assert.ok(!transforms.arrow); }); it('only applies necessary transforms', () => { var source = ` const power = ( base, exponent = 2 ) => Math.pow( base, exponent );`; var result = buble.transform(source, { target: { chrome: 49, node: 5 } }).code; assert.equal( result, ` var power = ( base, exponent ) => { if ( exponent === void 0 ) exponent = 2; return Math.pow( base, exponent ); };` ); }); }); describe('sourcemaps', () => { it('generates a valid sourcemap', () => { var map = buble.transform('').map; assert.equal(map.version, 3); }); it('uses provided file and source', () => { var map = buble.transform('', { file: 'output.js', source: 'input.js' }).map; assert.equal(map.file, 'output.js'); assert.deepEqual(map.sources, ['input.js']); }); it('includes content by default', () => { var source = `let { x, y } = foo();`; var map = buble.transform(source).map; assert.deepEqual(map.sourcesContent, [source]); }); it('excludes content if requested', () => { var source = `let { x, y } = foo();`; var map = buble.transform(source, { includeContent: false }).map; assert.deepEqual(map.sourcesContent, [null]); }); it('locates original content', () => { var source = `const add = ( a, b ) => a + b;`; var result = buble.transform(source, { file: 'output.js', source: 'input.js' }); var smc = new SourceMapConsumer(result.map); var location = getLocation(result.code, 'add'); var expected = getLocation(source, 'add'); var actual = smc.originalPositionFor(location); assert.deepEqual(actual, { line: expected.line, column: expected.column, source: 'input.js', name: null }); location = getLocation(result.code, 'a +'); expected = getLocation(source, 'a +'); actual = smc.originalPositionFor(location); assert.deepEqual(actual, { line: expected.line, column: expected.column, source: 'input.js', name: null }); }); it('recovers names', () => { var source = ` const foo = 1; if ( x ) { const foo = 2; }`; var result = buble.transform(source, { file: 'output.js', source: 'input.js' }); var smc = new SourceMapConsumer(result.map); var location = getLocation(result.code, 'var'); var actual = smc.originalPositionFor(location); assert.equal(actual.name, 'const'); location = getLocation(result.code, 'var', location.char + 1); actual = smc.originalPositionFor(location); assert.equal(actual.name, 'const'); location = getLocation(result.code, 'foo$1', location.char + 1); actual = smc.originalPositionFor(location); assert.equal(actual.name, 'foo'); }); it('handles moved content', () => { var source = ` for ( let i = 0; i < 10; i += 1 ) { const square = i * i; setTimeout( function () { log( square ); }, i * 100 ); }`; var result = buble.transform(source, { file: 'output.js', source: 'input.js' }); var smc = new SourceMapConsumer(result.map); var location = getLocation(result.code, 'i < 10'); var expected = getLocation(source, 'i < 10'); var actual = smc.originalPositionFor(location); assert.deepEqual(actual, { line: expected.line, column: expected.column, source: 'input.js', name: null }); location = getLocation(result.code, 'setTimeout'); expected = getLocation(source, 'setTimeout'); actual = smc.originalPositionFor(location); assert.deepEqual(actual, { line: expected.line, column: expected.column, source: 'input.js', name: null }); }); }); }); buble-0.19.3/test/utils/000077500000000000000000000000001324054410700150145ustar00rootroot00000000000000buble-0.19.3/test/utils/getLocation.js000066400000000000000000000010331324054410700176170ustar00rootroot00000000000000module.exports = function getLocation(source, search, start) { if (typeof search === 'string') { search = source.indexOf(search, start); } var lines = source.split('\n'); var len = lines.length; var lineStart = 0; var i; for (i = 0; i < len; i += 1) { var line = lines[i]; var lineEnd = lineStart + line.length + 1; // +1 for newline if (lineEnd > search) { return { line: i + 1, column: search - lineStart, char: i }; } lineStart = lineEnd; } throw new Error('Could not determine location of character'); };