From 172dff9ef3ac85965e2383c3ee2d31a597d4ed11 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 05:24:45 +0530 Subject: [PATCH 01/81] Initial commit --- README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..d3e3430 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# getstorybook +Easiest way to add Storybook support to your project From c93967b6fa0c3e3cced4ca25466499866dbf2723 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 07:53:59 +0530 Subject: [PATCH 02/81] Add initial working version. --- README.md | 3 +- bin/generate.js | 27 ++++++++++++++ generators/REACT_SCRIPTS/index.js | 14 +++++++ .../template/.storybook/config.js | 8 ++++ .../template/src/stories/index.js | 8 ++++ index.js | 0 lib/detect.js | 37 +++++++++++++++++++ lib/helpers.js | 19 ++++++++++ lib/project_types.js | 9 +++++ package.json | 27 ++++++++++++++ 10 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 bin/generate.js create mode 100644 generators/REACT_SCRIPTS/index.js create mode 100644 generators/REACT_SCRIPTS/template/.storybook/config.js create mode 100644 generators/REACT_SCRIPTS/template/src/stories/index.js create mode 100644 index.js create mode 100644 lib/detect.js create mode 100644 lib/helpers.js create mode 100644 lib/project_types.js create mode 100644 package.json diff --git a/README.md b/README.md index d3e3430..e493ec4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # getstorybook -Easiest way to add Storybook support to your project + +Easiest way to add Storybook support to your project. diff --git a/bin/generate.js b/bin/generate.js new file mode 100644 index 0000000..75c782d --- /dev/null +++ b/bin/generate.js @@ -0,0 +1,27 @@ +var detect = require('../lib/detect'); +var types = require('../lib/project_types'); +var sh = require('shelljs'); + +// Add a new line for the clear visibility. +console.log(); + +const projectType = detect(); +switch (projectType) { + case types.REACT_SCRIPTS: + // TODO: Add colors. + // TODO: Add done symbol to the end. + console.log('Adding storybook support to your "Create React App" based project.'); + require('../generators/REACT_SCRIPTS'); + console.log('Installing NPM dependencies.'); + sh.exec('npm install', { silent: true }); + console.log('\nTo run your storybook, type:\n') + console.log(' npm run storybook'); + console.log('\nFor more information visit: https://getstorybook.io') + break; + default: + console.log('Unsupported Project type. (code: %s)', projectType); + console.log('Visit https://getstorybook.io for more information.'); +} + +// Add a new line for the clear visibility. +console.log(); diff --git a/generators/REACT_SCRIPTS/index.js b/generators/REACT_SCRIPTS/index.js new file mode 100644 index 0000000..7261cf9 --- /dev/null +++ b/generators/REACT_SCRIPTS/index.js @@ -0,0 +1,14 @@ +var mergeDirs = require('merge-dirs').default; +var helpers = require('../../lib/helpers'); +var path = require('path'); + +mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite'); + +var packageJson = helpers.getPackageJson(); + +// TODO: Get the latest version of storybook here. +packageJson.devDependencies['@kadira/storybook'] = '^2.0.0'; +packageJson.scripts['storybook'] = 'start-storybook -p 9009'; +packageJson.scripts['build-storybook'] = 'build-storybook'; + +helpers.writePackageJson(packageJson); diff --git a/generators/REACT_SCRIPTS/template/.storybook/config.js b/generators/REACT_SCRIPTS/template/.storybook/config.js new file mode 100644 index 0000000..301e6f5 --- /dev/null +++ b/generators/REACT_SCRIPTS/template/.storybook/config.js @@ -0,0 +1,8 @@ +import { configure } from '@kadira/storybook'; +import '../src/index.css'; + +function loadStories() { + require('../src/stories'); +} + +configure(loadStories, module); diff --git a/generators/REACT_SCRIPTS/template/src/stories/index.js b/generators/REACT_SCRIPTS/template/src/stories/index.js new file mode 100644 index 0000000..e1328b2 --- /dev/null +++ b/generators/REACT_SCRIPTS/template/src/stories/index.js @@ -0,0 +1,8 @@ +import React from 'react'; +import { storiesOf, action } from '@kadira/storybook'; +import App from '../App'; + +storiesOf('App', module) + .add('Default View', () => ( + + )); diff --git a/index.js b/index.js new file mode 100644 index 0000000..e69de29 diff --git a/lib/detect.js b/lib/detect.js new file mode 100644 index 0000000..348ebbf --- /dev/null +++ b/lib/detect.js @@ -0,0 +1,37 @@ +var types = require('./project_types.js'); +var helpers = require('./helpers'); + +module.exports = function() { + var packageJson = helpers.getPackageJson(); + if (!packageJson) { + return types.UNDETECTED; + } + + if( + packageJson.devDependencies && + packageJson.devDependencies['react-scripts'] + ) { + return types.REACT_SCRIPTS; + } + + if( + packageJson.peerDependencies && + packageJson.peerDependencies['react'] + ) { + return types.REACT_PROJECT; + } + + if( + packageJson.dependencies && + packageJson.dependencies['react-native'] + ) { + return types.REACT_NATIVE; + } + + if( + packageJson.dependencies && + packageJson.dependencies['react'] + ) { + return types.REACT; + } +}; diff --git a/lib/helpers.js b/lib/helpers.js new file mode 100644 index 0000000..c92a2eb --- /dev/null +++ b/lib/helpers.js @@ -0,0 +1,19 @@ +var path = require('path'); +var fs = require('fs'); + +exports.getPackageJson = function() { + var packageJsonPath = path.resolve('package.json'); + if(!fs.existsSync(packageJsonPath)) { + return false; + } + + const jsonContent = fs.readFileSync(packageJsonPath, 'utf8'); + return JSON.parse(jsonContent); +}; + +exports.writePackageJson = function(packageJson) { + var content = JSON.stringify(packageJson, null, 2) + '\n'; + var packageJsonPath = path.resolve('package.json'); + + fs.writeFileSync(packageJsonPath, content, 'utf8'); +}; diff --git a/lib/project_types.js b/lib/project_types.js new file mode 100644 index 0000000..98f278f --- /dev/null +++ b/lib/project_types.js @@ -0,0 +1,9 @@ +module.exports = { + UNDETECTED: 'UNDETECTED', + REACT_SCRIPTS: 'REACT_SCRIPTS', + METEOR: 'METEOR', + REACT: 'REACT', + REACT_NATIVE: 'REACT_NATIVE', + REACT_PROJECT: 'REACT_PROJECT', + WEBPACK_REACT: 'WEBPACK_REACT', +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..877c5b2 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "getstorybook", + "version": "0.0.0", + "description": "Easiest way to add Storybook support to your project.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/kadirahq/getstorybook.git" + }, + "keywords": [ + "storybook", + "generator" + ], + "author": "", + "license": "MIT", + "bugs": { + "url": "https://github.com/kadirahq/getstorybook/issues" + }, + "homepage": "https://github.com/kadirahq/getstorybook#readme", + "dependencies": { + "merge-dirs": "^0.2.1", + "shelljs": "^0.7.3" + } +} From 931e024b3d729a3c0f14d692e749447dbab901cb Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 11:04:13 +0530 Subject: [PATCH 03/81] Add the command line tool. --- bin/generate.js | 37 +++++++++++++++++++------- lib/helpers.js | 71 +++++++++++++++++++++++++++++++++++++++++++++++-- package.json | 5 +++- 3 files changed, 100 insertions(+), 13 deletions(-) mode change 100644 => 100755 bin/generate.js diff --git a/bin/generate.js b/bin/generate.js old mode 100644 new mode 100755 index 75c782d..e87a5cb --- a/bin/generate.js +++ b/bin/generate.js @@ -1,22 +1,39 @@ +#!/usr/bin/env node + var detect = require('../lib/detect'); var types = require('../lib/project_types'); var sh = require('shelljs'); +var commandLog = require('../lib/helpers').commandLog; +var codeLog = require('../lib/helpers').codeLog; +var installNpmDeps = require('../lib/helpers').installNpmDeps; +var chalk = require('chalk'); -// Add a new line for the clear visibility. -console.log(); +console.log(chalk.inverse('\n getstorybook - the simplest way to add a storybook to your project. \n')); + +var projectType; + +var done = commandLog('Detecting project type'); +try { + projectType = detect(); +} catch(ex) { + done(ex.message); + process.exit(1); +} +done(); -const projectType = detect(); switch (projectType) { case types.REACT_SCRIPTS: - // TODO: Add colors. - // TODO: Add done symbol to the end. - console.log('Adding storybook support to your "Create React App" based project.'); + done = commandLog('Adding storybook support to your "Create React App" based project'); require('../generators/REACT_SCRIPTS'); - console.log('Installing NPM dependencies.'); - sh.exec('npm install', { silent: true }); + done(); + + installNpmDeps(); + console.log('\nTo run your storybook, type:\n') - console.log(' npm run storybook'); - console.log('\nFor more information visit: https://getstorybook.io') + codeLog([ + 'npm run storybook', + ]); + console.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')) break; default: console.log('Unsupported Project type. (code: %s)', projectType); diff --git a/lib/helpers.js b/lib/helpers.js index c92a2eb..03883ae 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -1,7 +1,9 @@ var path = require('path'); var fs = require('fs'); +var chalk = require('chalk'); +var sh = require('shelljs'); -exports.getPackageJson = function() { +exports.getPackageJson = function getPackageJson() { var packageJsonPath = path.resolve('package.json'); if(!fs.existsSync(packageJsonPath)) { return false; @@ -11,9 +13,74 @@ exports.getPackageJson = function() { return JSON.parse(jsonContent); }; -exports.writePackageJson = function(packageJson) { +exports.writePackageJson = function writePackageJson(packageJson) { var content = JSON.stringify(packageJson, null, 2) + '\n'; var packageJsonPath = path.resolve('package.json'); fs.writeFileSync(packageJsonPath, content, 'utf8'); }; + +exports.commandLog = function commandLog(message) { + process.stdout.write(chalk.cyan(' • ') + message); + var done = function(errorMessage, errorInfo) { + if (errorMessage) { + process.stdout.write('. ' + chalk.red('✖') + '\n'); + console.error('\n ' + chalk.red(errorMessage)); + + if (!errorInfo) return; + + errorInfo = errorInfo + .split('\n') + .map(function(line) { + return ' ' + chalk.dim(line); + }) + .join('\n'); + console.error(errorInfo + '\n'); + return; + } + + process.stdout.write('. ' + chalk.green('✓') + '\n'); + }; + + return done; +}; + +exports.getChars = function getChars(char, amount) { + var line = ''; + for(var lc=0; lc maxLength)? line.length : maxLength; + return line; + }); + + var finalResult = newLines + .map(function(line) { + var rightPadAmount = maxLength - line.length; + line = line + exports.getChars(' ', rightPadAmount); + line = exports.getChars(' ', leftPadAmount) + chalk.inverse(' ' + line + ' '); + return line; + }) + .join('\n'); + + console.log(finalResult); +}; + +exports.installNpmDeps = function() { + var done = exports.commandLog('Installing NPM dependencies'); + var result = sh.exec('npm install', { silent: true }); + if (result.code !== 0) { + done('An error occured while running `npm install`.', result.stderr); + process.exit(1); + } + done(); +}; diff --git a/package.json b/package.json index 877c5b2..fb1625d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,9 @@ "name": "getstorybook", "version": "0.0.0", "description": "Easiest way to add Storybook support to your project.", - "main": "index.js", + "bin": { + "getstorybook": "./bin/generate.js" + }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, @@ -21,6 +23,7 @@ }, "homepage": "https://github.com/kadirahq/getstorybook#readme", "dependencies": { + "chalk": "^1.1.3", "merge-dirs": "^0.2.1", "shelljs": "^0.7.3" } From dd8d0ff813f827415a924750661e38c701942370 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 11:44:25 +0530 Subject: [PATCH 04/81] Add support for REACT and REACT_PROJECT types. --- bin/generate.js | 34 +++++++++++++++++-- generators/REACT/index.js | 17 ++++++++++ .../REACT/template/.storybook/config.js | 7 ++++ generators/REACT/template/stories/index.js | 10 ++++++ lib/helpers.js | 13 ++++++- 5 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 generators/REACT/index.js create mode 100644 generators/REACT/template/.storybook/config.js create mode 100644 generators/REACT/template/stories/index.js diff --git a/bin/generate.js b/bin/generate.js index e87a5cb..e84fce5 100755 --- a/bin/generate.js +++ b/bin/generate.js @@ -5,6 +5,7 @@ var types = require('../lib/project_types'); var sh = require('shelljs'); var commandLog = require('../lib/helpers').commandLog; var codeLog = require('../lib/helpers').codeLog; +var paddedLog = require('../lib/helpers').paddedLog; var installNpmDeps = require('../lib/helpers').installNpmDeps; var chalk = require('chalk'); @@ -35,9 +36,38 @@ switch (projectType) { ]); console.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')) break; + + case types.REACT: + done = commandLog('Adding storybook support to your "React" app'); + require('../generators/REACT'); + done(); + + installNpmDeps(); + + console.log('\nTo run your storybook, type:\n') + codeLog([ + 'npm run storybook', + ]); + console.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')) + break; + + case types.REACT_PROJECT: + done = commandLog('Adding storybook support to your "React" library.'); + require('../generators/REACT'); + done(); + + installNpmDeps(); + + console.log('\nTo run your storybook, type:\n') + codeLog([ + 'npm run storybook', + ]); + console.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')) + break; + default: - console.log('Unsupported Project type. (code: %s)', projectType); - console.log('Visit https://getstorybook.io for more information.'); + paddedLog('Unsupported Project type. (code: ' + projectType + ')'); + paddedLog('Visit https://getstorybook.io for more information.'); } // Add a new line for the clear visibility. diff --git a/generators/REACT/index.js b/generators/REACT/index.js new file mode 100644 index 0000000..7ff4306 --- /dev/null +++ b/generators/REACT/index.js @@ -0,0 +1,17 @@ +var mergeDirs = require('merge-dirs').default; +var helpers = require('../../lib/helpers'); +var path = require('path'); + +mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite'); + +var packageJson = helpers.getPackageJson(); + +// TODO: Get the latest version of storybook here. +packageJson.devDependencies = packageJson.devDependencies || {}; +packageJson.devDependencies['@kadira/storybook'] = '^2.0.0'; + +packageJson.scripts = packageJson.scripts || {}; +packageJson.scripts['storybook'] = 'start-storybook -p 6006'; +packageJson.scripts['build-storybook'] = 'build-storybook'; + +helpers.writePackageJson(packageJson); diff --git a/generators/REACT/template/.storybook/config.js b/generators/REACT/template/.storybook/config.js new file mode 100644 index 0000000..8e314a8 --- /dev/null +++ b/generators/REACT/template/.storybook/config.js @@ -0,0 +1,7 @@ +import { configure } from '@kadira/storybook'; + +function loadStories() { + require('../stories'); +} + +configure(loadStories, module); diff --git a/generators/REACT/template/stories/index.js b/generators/REACT/template/stories/index.js new file mode 100644 index 0000000..9ab169d --- /dev/null +++ b/generators/REACT/template/stories/index.js @@ -0,0 +1,10 @@ +import React from 'react'; +import { storiesOf, action } from '@kadira/storybook'; + +storiesOf('Button', module) + .add('with text', () => ( + + )) + .add('with no text', () => ( + + )); diff --git a/lib/helpers.js b/lib/helpers.js index 03883ae..f9be5da 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -45,6 +45,17 @@ exports.commandLog = function commandLog(message) { return done; }; +exports.paddedLog = function (message) { + message = message + .split('\n') + .map(function(line) { + return ' ' + line; + }) + .join('\n'); + + console.log(message); +}; + exports.getChars = function getChars(char, amount) { var line = ''; for(var lc=0; lc Date: Tue, 2 Aug 2016 11:57:58 +0530 Subject: [PATCH 05/81] Add update-notifier. --- bin/generate.js | 10 +++++++++- package.json | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/bin/generate.js b/bin/generate.js index e84fce5..834cb8f 100755 --- a/bin/generate.js +++ b/bin/generate.js @@ -1,5 +1,6 @@ #!/usr/bin/env node +var updateNotifier = require('update-notifier'); var detect = require('../lib/detect'); var types = require('../lib/project_types'); var sh = require('shelljs'); @@ -11,6 +12,13 @@ var chalk = require('chalk'); console.log(chalk.inverse('\n getstorybook - the simplest way to add a storybook to your project. \n')); +// Update notify code. +var pkg = require('../package.json'); +updateNotifier({ + pkg: pkg, + updateCheckInterval: 1000 * 60 * 60, // every hour (we could increase this later on.) +}).notify(); + var projectType; var done = commandLog('Detecting project type'); @@ -52,7 +60,7 @@ switch (projectType) { break; case types.REACT_PROJECT: - done = commandLog('Adding storybook support to your "React" library.'); + done = commandLog('Adding storybook support to your "React" library'); require('../generators/REACT'); done(); diff --git a/package.json b/package.json index fb1625d..b997a17 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "dependencies": { "chalk": "^1.1.3", "merge-dirs": "^0.2.1", - "shelljs": "^0.7.3" + "shelljs": "^0.7.3", + "update-notifier": "^1.0.2" } } From ce0b77e487ba598ef0049307085764abe916fd26 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 13:11:40 +0530 Subject: [PATCH 06/81] Detect existing storybook projects and allow to force update it. --- bin/generate.js | 17 ++++++++++++++++- lib/detect.js | 10 ++++++++++ lib/project_types.js | 1 + package.json | 1 + 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/bin/generate.js b/bin/generate.js index 834cb8f..9dd2771 100755 --- a/bin/generate.js +++ b/bin/generate.js @@ -1,6 +1,7 @@ #!/usr/bin/env node var updateNotifier = require('update-notifier'); +var program = require('commander'); var detect = require('../lib/detect'); var types = require('../lib/project_types'); var sh = require('shelljs'); @@ -10,10 +11,16 @@ var paddedLog = require('../lib/helpers').paddedLog; var installNpmDeps = require('../lib/helpers').installNpmDeps; var chalk = require('chalk'); +var pkg = require('../package.json'); + +program + .version(pkg.version) + .option('-f --force', 'Forcely add storybook') + .parse(process.argv); + console.log(chalk.inverse('\n getstorybook - the simplest way to add a storybook to your project. \n')); // Update notify code. -var pkg = require('../package.json'); updateNotifier({ pkg: pkg, updateCheckInterval: 1000 * 60 * 60, // every hour (we could increase this later on.) @@ -31,6 +38,14 @@ try { done(); switch (projectType) { + case types.ALREADY_HAS_STORYBOOK: + if (!program.force) { + console.log(); + paddedLog('There seems to be a storybook already available in this project.'); + paddedLog('Apply following command to force:\n'); + codeLog(['getstorybook -f']); + break; + } case types.REACT_SCRIPTS: done = commandLog('Adding storybook support to your "Create React App" based project'); require('../generators/REACT_SCRIPTS'); diff --git a/lib/detect.js b/lib/detect.js index 348ebbf..494167e 100644 --- a/lib/detect.js +++ b/lib/detect.js @@ -7,6 +7,16 @@ module.exports = function() { return types.UNDETECTED; } + if( + packageJson.devDependencies && + ( + packageJson.devDependencies['@kadira/storybook'] || + packageJson.devDependencies['@kadira/react-native-storybook'] + ) + ) { + return types.ALREADY_HAS_STORYBOOK; + } + if( packageJson.devDependencies && packageJson.devDependencies['react-scripts'] diff --git a/lib/project_types.js b/lib/project_types.js index 98f278f..1c3bbe5 100644 --- a/lib/project_types.js +++ b/lib/project_types.js @@ -6,4 +6,5 @@ module.exports = { REACT_NATIVE: 'REACT_NATIVE', REACT_PROJECT: 'REACT_PROJECT', WEBPACK_REACT: 'WEBPACK_REACT', + ALREADY_HAS_STORYBOOK: 'ALREADY_HAS_STORYBOOK', }; diff --git a/package.json b/package.json index b997a17..47a12f1 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "homepage": "https://github.com/kadirahq/getstorybook#readme", "dependencies": { "chalk": "^1.1.3", + "commander": "^2.9.0", "merge-dirs": "^0.2.1", "shelljs": "^0.7.3", "update-notifier": "^1.0.2" From fdfc649cc695470a82488008ceab6d5e5b84d324 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 13:30:21 +0530 Subject: [PATCH 07/81] Add license. --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..12b1398 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Kadira Inc. + +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. From 1e12986543520bb5f2fe864ecc0ac1537cef3fe2 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 13:30:47 +0530 Subject: [PATCH 08/81] Add eslint support. --- .eslintrc | 7 +++++++ bin/generate.js | 38 ++++++++++++++++++++++---------------- index.js | 0 lib/detect.js | 18 ++++++++++-------- lib/helpers.js | 40 ++++++++++++++++++++-------------------- lib/project_types.js | 2 +- package.json | 9 ++++++++- 7 files changed, 68 insertions(+), 46 deletions(-) create mode 100644 .eslintrc delete mode 100644 index.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..edac975 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,7 @@ +{ + "extends": "airbnb-base/legacy", + "rules": { + "vars-on-top": 0, + "func-names": 0 + } +} diff --git a/bin/generate.js b/bin/generate.js index 9dd2771..319305b 100755 --- a/bin/generate.js +++ b/bin/generate.js @@ -1,15 +1,17 @@ #!/usr/bin/env node +/* eslint global-require: 0 */ + var updateNotifier = require('update-notifier'); var program = require('commander'); var detect = require('../lib/detect'); var types = require('../lib/project_types'); -var sh = require('shelljs'); var commandLog = require('../lib/helpers').commandLog; var codeLog = require('../lib/helpers').codeLog; var paddedLog = require('../lib/helpers').paddedLog; var installNpmDeps = require('../lib/helpers').installNpmDeps; var chalk = require('chalk'); +var logger = console; var pkg = require('../package.json'); @@ -18,12 +20,14 @@ program .option('-f --force', 'Forcely add storybook') .parse(process.argv); -console.log(chalk.inverse('\n getstorybook - the simplest way to add a storybook to your project. \n')); +var welcomeMessage = + 'getstorybook - the simplest way to add a storybook to your project.'; +logger.log(chalk.inverse('\n ' + welcomeMessage + ' \n')); // Update notify code. updateNotifier({ pkg: pkg, - updateCheckInterval: 1000 * 60 * 60, // every hour (we could increase this later on.) + updateCheckInterval: 1000 * 60 * 60 // every hour (we could increase this later on.) }).notify(); var projectType; @@ -31,21 +35,23 @@ var projectType; var done = commandLog('Detecting project type'); try { projectType = detect(); -} catch(ex) { +} catch (ex) { done(ex.message); process.exit(1); } done(); switch (projectType) { + /* eslint-disable no-fallthrough */ case types.ALREADY_HAS_STORYBOOK: if (!program.force) { - console.log(); + logger.log(); paddedLog('There seems to be a storybook already available in this project.'); paddedLog('Apply following command to force:\n'); codeLog(['getstorybook -f']); break; } + /* eslint-enable no-fallthrough */ case types.REACT_SCRIPTS: done = commandLog('Adding storybook support to your "Create React App" based project'); require('../generators/REACT_SCRIPTS'); @@ -53,11 +59,11 @@ switch (projectType) { installNpmDeps(); - console.log('\nTo run your storybook, type:\n') + logger.log('\nTo run your storybook, type:\n'); codeLog([ - 'npm run storybook', + 'npm run storybook' ]); - console.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')) + logger.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')); break; case types.REACT: @@ -67,11 +73,11 @@ switch (projectType) { installNpmDeps(); - console.log('\nTo run your storybook, type:\n') + logger.log('\nTo run your storybook, type:\n'); codeLog([ - 'npm run storybook', + 'npm run storybook' ]); - console.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')) + logger.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')); break; case types.REACT_PROJECT: @@ -81,17 +87,17 @@ switch (projectType) { installNpmDeps(); - console.log('\nTo run your storybook, type:\n') + logger.log('\nTo run your storybook, type:\n'); codeLog([ - 'npm run storybook', + 'npm run storybook' ]); - console.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')) + logger.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')); break; default: - paddedLog('Unsupported Project type. (code: ' + projectType + ')'); + paddedLog('Unsupported Project type. (code: ' + projectType + ')'); paddedLog('Visit https://getstorybook.io for more information.'); } // Add a new line for the clear visibility. -console.log(); +logger.log(); diff --git a/index.js b/index.js deleted file mode 100644 index e69de29..0000000 diff --git a/lib/detect.js b/lib/detect.js index 494167e..74af707 100644 --- a/lib/detect.js +++ b/lib/detect.js @@ -1,13 +1,13 @@ var types = require('./project_types.js'); var helpers = require('./helpers'); -module.exports = function() { +module.exports = function detect() { var packageJson = helpers.getPackageJson(); if (!packageJson) { return types.UNDETECTED; } - if( + if ( packageJson.devDependencies && ( packageJson.devDependencies['@kadira/storybook'] || @@ -17,31 +17,33 @@ module.exports = function() { return types.ALREADY_HAS_STORYBOOK; } - if( + if ( packageJson.devDependencies && packageJson.devDependencies['react-scripts'] ) { return types.REACT_SCRIPTS; } - if( + if ( packageJson.peerDependencies && - packageJson.peerDependencies['react'] + packageJson.peerDependencies.react ) { return types.REACT_PROJECT; } - if( + if ( packageJson.dependencies && packageJson.dependencies['react-native'] ) { return types.REACT_NATIVE; } - if( + if ( packageJson.dependencies && - packageJson.dependencies['react'] + packageJson.dependencies.react ) { return types.REACT; } + + return types.UNDETECTED; }; diff --git a/lib/helpers.js b/lib/helpers.js index f9be5da..4ce0b13 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -2,14 +2,15 @@ var path = require('path'); var fs = require('fs'); var chalk = require('chalk'); var sh = require('shelljs'); +var logger = console; exports.getPackageJson = function getPackageJson() { var packageJsonPath = path.resolve('package.json'); - if(!fs.existsSync(packageJsonPath)) { + if (!fs.existsSync(packageJsonPath)) { return false; } - const jsonContent = fs.readFileSync(packageJsonPath, 'utf8'); + var jsonContent = fs.readFileSync(packageJsonPath, 'utf8'); return JSON.parse(jsonContent); }; @@ -22,20 +23,20 @@ exports.writePackageJson = function writePackageJson(packageJson) { exports.commandLog = function commandLog(message) { process.stdout.write(chalk.cyan(' • ') + message); - var done = function(errorMessage, errorInfo) { + var done = function (errorMessage, errorInfo) { if (errorMessage) { process.stdout.write('. ' + chalk.red('✖') + '\n'); - console.error('\n ' + chalk.red(errorMessage)); + logger.error('\n ' + chalk.red(errorMessage)); if (!errorInfo) return; - errorInfo = errorInfo + var newErrorInfo = errorInfo .split('\n') - .map(function(line) { + .map(function (line) { return ' ' + chalk.dim(line); }) .join('\n'); - console.error(errorInfo + '\n'); + logger.error(newErrorInfo + '\n'); return; } @@ -46,19 +47,19 @@ exports.commandLog = function commandLog(message) { }; exports.paddedLog = function (message) { - message = message + var newMessage = message .split('\n') - .map(function(line) { + .map(function (line) { return ' ' + line; }) .join('\n'); - console.log(message); + logger.log(newMessage); }; exports.getChars = function getChars(char, amount) { var line = ''; - for(var lc=0; lc maxLength)? line.length : maxLength; + .map(function (line) { + maxLength = (line.length > maxLength) ? line.length : maxLength; return line; }); var finalResult = newLines - .map(function(line) { + .map(function (line) { var rightPadAmount = maxLength - line.length; - line = line + exports.getChars(' ', rightPadAmount); - line = exports.getChars(' ', leftPadAmount) + chalk.inverse(' ' + line + ' '); - return line; + var newLine = line + exports.getChars(' ', rightPadAmount); + newLine = exports.getChars(' ', leftPadAmount || 2) + chalk.inverse(' ' + newLine + ' '); + return newLine; }) .join('\n'); - console.log(finalResult); + logger.log(finalResult); }; -exports.installNpmDeps = function() { +exports.installNpmDeps = function () { var done = exports.commandLog('Installing NPM dependencies'); var result = sh.exec('npm install', { silent: true }); if (result.code !== 0) { diff --git a/lib/project_types.js b/lib/project_types.js index 1c3bbe5..c70204d 100644 --- a/lib/project_types.js +++ b/lib/project_types.js @@ -6,5 +6,5 @@ module.exports = { REACT_NATIVE: 'REACT_NATIVE', REACT_PROJECT: 'REACT_PROJECT', WEBPACK_REACT: 'WEBPACK_REACT', - ALREADY_HAS_STORYBOOK: 'ALREADY_HAS_STORYBOOK', + ALREADY_HAS_STORYBOOK: 'ALREADY_HAS_STORYBOOK' }; diff --git a/package.json b/package.json index 47a12f1..3892ea1 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,9 @@ "getstorybook": "./bin/generate.js" }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "npm run lint", + "lint": "eslint lib bin", + "lintfix": "eslint lib bin --fix" }, "repository": { "type": "git", @@ -28,5 +30,10 @@ "merge-dirs": "^0.2.1", "shelljs": "^0.7.3", "update-notifier": "^1.0.2" + }, + "devDependencies": { + "eslint": "^3.2.2", + "eslint-config-airbnb-base": "^5.0.1", + "eslint-plugin-import": "^1.12.0" } } From 314b1a2f5c6450883e34535316393fba51e016b2 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 13:30:59 +0530 Subject: [PATCH 09/81] Add .gitignore. --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..170c74b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules +*.log +.idea +npm-shrinkwrap.json \ No newline at end of file From 6b101f5fb0764f75fc27bccfc17bca6ae3b46a41 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 13:35:28 +0530 Subject: [PATCH 10/81] Update domain to http://getstorybook.io --- bin/generate.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/generate.js b/bin/generate.js index 319305b..806128c 100755 --- a/bin/generate.js +++ b/bin/generate.js @@ -63,7 +63,7 @@ switch (projectType) { codeLog([ 'npm run storybook' ]); - logger.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')); + logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; case types.REACT: @@ -77,7 +77,7 @@ switch (projectType) { codeLog([ 'npm run storybook' ]); - logger.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')); + logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; case types.REACT_PROJECT: @@ -91,12 +91,12 @@ switch (projectType) { codeLog([ 'npm run storybook' ]); - logger.log('\nFor more information visit:', chalk.cyan('https://getstorybook.io')); + logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; default: paddedLog('Unsupported Project type. (code: ' + projectType + ')'); - paddedLog('Visit https://getstorybook.io for more information.'); + paddedLog('Visit http://getstorybook.io for more information.'); } // Add a new line for the clear visibility. From 45fb7423612cb2d9d488fce31e4e9261e09818c1 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 14:04:24 +0530 Subject: [PATCH 11/81] Update README.md --- README.md | 27 ++++++++++++++++++++++++++- docs/getstorybook.png | Bin 0 -> 242916 bytes 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 docs/getstorybook.png diff --git a/README.md b/README.md index e493ec4..a50fc78 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,28 @@ # getstorybook -Easiest way to add Storybook support to your project. +Easiest way to add [Storybook](https://github.com/kadirahq/react-storybook) support to your project. + +With Storybook, you'll get a visual development environment to development your UI React components.
+It comes with [many features](https://github.com/kadirahq/react-storybook#features) and [customizable](https://github.com/kadirahq/react-storybook#learn-more) as you need. + +![](https://raw.githubusercontent.com/kadirahq/react-storybook/master/docs/react_storybook_demo.gif) + +--- + +### Adding storybook into your app/project + +First install the storybook generator globally. + +``` +npm i -g getstorybook +``` + +Then go to your project and run: + +``` +getstorybook +``` + +![](docs/getstorybook.png) + +That's all you've to do. diff --git a/docs/getstorybook.png b/docs/getstorybook.png new file mode 100644 index 0000000000000000000000000000000000000000..8420fb0a29c5d172244406c502dbc5665fba366f GIT binary patch literal 242916 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 nfS0B@00r*FH44+PZ@ZWS84&br~X@86d=MOh zl#lT&F!T2J$}gsR@g=ItgRrHHO=si_;O}ltvip8MePYx*M-SbHWc+E5Ou!y^z<&UH zBm(_kvWhc%-*tnk0#;UHAIpR})~S9gK`!-;_Mo9Gmfc9+Lk13D=hi+ zbvthsqc0T(fVHyoFmH8k{BlZGJ<*CEK|>Z{O=}BSCR4RKgj|Cvqyd6@jdmuP#~?H> zOcrzM`{|5XZ2!L9mMSY#NnamfZi~By!A;VD!&n3AP}OmhAZ!63brKB^MqJQ9gbm)Int(6_z39i>pbSz{qy{nQow$@^rs5KJ{C??O-^4LX_4FwV{l0}2> zf0;Q*RHvV^c&QDy(P`&LI1!yh2Huppe|K@R@B>@1u3?E8O69L7{=Y3DQqH#p%a>8=;^Kvwc*I z0ficHc4Kq47TFkpACO4}x*xuR2&!u33B+1cQd~WKe@owq-?#;13*|bQ*UDb$-14NK zrzP1M0}@D^BgvMP!37q9K+O;`LfD;xMPVb-{^M%$gRi_B7S=wAF7eBvy*9aT^LZtR z324W)$G4O?`pAREM#*ib;5V}`Im*&CT4;R+wvKaM@|)4T={a3gz;k*_vnRWb1BL{s zWexcbPIN|suz4S7zW6 zR!KSc8+HTNHg@f#`OXl}3y(jYJx(H&J-uaS{FqR(XVMfTR%csSv7f+GapQ2Pk)GcC z&hE0eMjz>qK-9fQAYrFQAwWze1lBX@V z%zW#3yel28sI@mSr_q^dmzU;%jCLj^9Z1sR=vQKTWhD&ao!3aDQHOr(nsY7u<50}( zM=7{CV{*);Btc6S&4HQxQXZoy9Mm7!2Cc@dW|z=jlj_#L=3OEh6$qctA9;?9iW~}0 z8mxomK>}*)b4(3q`x1KY%TsI3>jOtQ1BU9dMtRcLS=X9N?IlF?HIY z!`=4}yx-xZS3`)uiBox|bIu=^3+m^)NRpJ3ySsnq$sIra$$zqg3;ZoE>S_=-X7bn0 zjyhGg8V3OjL6{^ZkZ7lbb9oC)_tTa6m;u_|k);~-eQ!)oB%6ihol#%^QQeLY)U$m^W?}u{fo~~oUu!{Ed-mxLK5u5&RJ=V zMGPMnkQ4G`tqfb#>37v$B#uI^M|FopSgx|vt+SNwQcgK`EWP(2Uf-Bx*dJS*^|*Gg zN-WlzRDEyuW0+_v>+_OSY>dS*F8OzE*qkA;8G?dJud;qsO%}5T)9*VwKze_VRk?O- zA?}RI#oEJ(+gJejResV#a7AQ?jdfP9Ll5u5i>GR-%_(gfjWX&65%yvCDG~8%)VuZ0 zV=rN{+=N6zYeJhgqXq4TwTncZ{llRuI29|6he5RkLSekxN(e5;yCUg>AdD9GOv32| zTd%p7+R_Eudc^m`grQ#h`=em1If2^DdwKWjKROO^F+P5iSYgr2d3^9uNoLp!FCZ#W zTEf(1!LN5w~B!nC=to!4jT;c8eNT7 zx+_S>d>aXITGzIQ(Ps}$cIBat6=F2Y;j~X&3MI0)4(<5m=Rc1Kx?g{x2zFi&LMF$9 z-%iRTsIF-`CCwj(O+X7YTG20yBp{vcn2xSdlk}d|(acDB!W_5UXi8X6X%^j67=o|$ zoIymRqbKkE!yKuIO>?ApEOySBtF^c~5hhJ#TUL}Du}Xv%)0uQ%1hdE@Nn+Q!ID+ve6lwW%?B6vI|} zUS#Bu@sbugA6r6@iGHctD$JvP)l((eF>Bf80t9Mh0+~6MY3bww>6|p3@fcff$4FCY zN|yDJ6id@Yd}!+M-ukecUy?)nmFMabM(WnraMJ-xz^yHf6pN|?@;AsjJpKLnyMg=a zg%DcfN2jpF;t#W2t{&dAovTVO_8;`l0u?Y@+vu72IEV5oF{3)a)%9AdR;0)iL&LZY z^!;xu2;{AZ2SH}$VXx<+CtiKhE~J5zt#nO!w-2DkW4}m}9;Xbe1#$7&9Mo8N>BJH$ zRUDP6W?QzE#@I-lrO4focW{%hew!ro+cQ}QyG}@iV4Vcfvct&UTvu2(EBMb$(rijz zT(!mc-HxH%6s1EkrZbR5>Vl${O+BV0&i*3lxqqelyjSVeVCSRhWN$CgHnU{2d;Bze z9DD7$355_npp%KZU&%N2^_;F9X5Awd?~qbs{RQjxvH~nR?yspkPP*p#EBKVgP4}M_ zg3W*bFt2k3L~7b`|H(^F);I`XS|)Qz+7XS5lqn)7o#x9(6FhrMdvs@^@Sht|`Ew&# zI{&&6wCfmMUl*O18DuZH7n4a4wU@$3XLIoZ!5@|~ESu)>ZO_KN`s`B0dJL7;h|<%f zggI5qSUX=Lsa?jURL#s4Q>cURvC(1?#p}yt?})$@x<5igRbe^3VaBi+#QdWL&vw>+ z9Wcz^gWLJ*ivFS3H2?i9F0g-WVk(*p5n5}Iwk{b$x@RKC%1;Vd*o=Zmek}Tmr?=X zoyP~=At|o1)17*LLlZ;!kZjpr^rF!3A=is)%PPURaEy#VZ5?<6smbqf7hGW=$fK-& z0xZOdgsH{*JYN=@=#hnX=$GbzCTp7rWav1??q8YVtVZ32Hnj zB5^(?t5$iT(|t%&f|5i_4Q3ccwk7`q3PhJ0>kK`!Pq=O>N`!S^g{LrX3}{80;$K1+ zTbkUfm_%HuC<98Y9V4ysW%ct$rLYV5W%dMOS=Q^%p8Upmz0_Yy?%)W#Jo(WSKNULp zr5i4xI7s8+Lk@Q=1>U1V>!8-5YrN9$lt2Pwd?9QK}0U*k)b^vX8WQd()rxx(U34n9vUo6tK zq-tgjAu3uKGG6VBh2dDdIaUh_RQyRl;q-i+0uP9!ucVU8@*FmEC{z8CS?uIkoh@Npori3=mLRm8%@p z*5WKc>&eu#yhr)8l>F`fv}f4`2D42M1opMT9F+A3tk>yx+;s9&?2USujkl2A856|2 zK0}Lyrr9KQnDm7_12;@U#mtL6v-XQmT$fIXg+6FL8k>uu%xehO(C>po_P&f_Q$p+4xXUiN&b#?_Ip9%7z+MOulIGbq z$tv`?w-&(b$hxz~U6tJ2;|(T$Bf7e&lzUKZeTj3irpCBH^r-F{1)k|qSRr)37-RbW zgyL|@1g>rfdDb-E;Z1PzIOn1R>{@VM1F|nB7ot4$DJ)&QDpkBuDX8%}y{#p+0cI=Y zIic#}Sx{EhH0xBga;9`5vgj8P`SJ;uwf248?S~Xz$7Xu|QNdS_e_p^o9p) zvtu%gYXb&vZkHTHG+2QyDqZJ-Te=-`Tv{yrh3(pzuEB>tUj6tkT$jsI@|m*phW?2L0xbZQ3Y^ zhrR-oD588TH_`gW!@58$)MfaXeu!LhAj?kQajRizOZjJ(^1cmD zgy4?a>XJVPIju_4$GCHBpS*;X7|qVVT=RNOhDPv;2LzcxgUse-u=xkn`D$bDWkN*j z^&`xOczKMdM%#q|5ccSPjR$Q|Nhfho`&t zjb?v1pQl2zeK%hZv#-odg1H(Fyh@l*rxpT%H6_eUpF*|^%#@O&XWkGpySfg%D9){;)-Hs*b5PX$}DP*bOAFe$joze z1c&8@z%q+VhaJEb+K`mxEFO#c28&}CW+M3%9$Xw@SS!awAITZ2mcL{_sL2%ASI^)w zo&Q~Cx>NHTmY>8pTB|5lwT5Dd3j|DxIQrYxH%yki=w@l!FJE4mgN)^&T%>AmgcK7m z%vg%${yIuaD(JXir|Al_i~So(}P| zx46B21%EuK?&D_1=yo)A>86*AnDX1$zd$+T@GfM-bvhfR*O6I+Bruoi7lf6JoJ*wz z^~^D*-|m*D-DtknXNT+8bx~BQr!-v(WLe)hZ#A8C?d z!Ukc>UH0bX4~NyPo`nBSUohb;T^&r=Rmn;IGLb9iF=ZSG^I3w$x2>fwD3*}fc$7b8 z83G-(KPBBF%m|m4#5>#lz`t^JSk!(Ec-_tJZtRm(yyTc#HEh_O!|N zg{~rjmY5yw-Vh#jZlO3}b#y&jMhOWPm=ps+dNUoyBXhY2hEnDwLa0L=mWIEQ@#^_?8FA+=ZN)X3P6 zREi$29-3ln4#LgbS7aWzlDUL5&f+jrFbsTWE_Hr5G-{J6_-LHs8qjg60o-#qpqwn4 zpuz*bbquL)#LOLXM2E<#Ghi|sXWnhM*&Vx0pI?y=;;G35zn_$0RRz4}oX$t#VMVgz zUFlD1p1nC+8h}<#PdqqS_qSSH{X;Eg8&_O@v6wu*6+;W5%fs?oi;~@1u)?_0Twqo* zu?`>X&>^U-!E&H^1kgPtC%J z*{!Hw#_ZotO4Vf1Cu@_08f2hWgsdc}*ZYuTM>7dqvHy_)GQ@1GVKO?6M2Hn~3Gxa2 zWw4d+IPFam6jLX2p?9Py`!jF zx`$5gOs#xnTODOv2K>lO|^szl`~dZ@%His-qk}vRF!1otuNK}kWhKO8rHL@$ff!Lcj3eHz+l^{>Vg18Kuz_cU z=_Tu?59XB6FG-ZA@K!&a6L1Y>Q^c?lud$Q&SE<%pUG)-!0iBbpbgbbYHcv4=FW+bH z3VTl@uV30=1Dc}GNgK6>aVl1q{FrUIZ^|qEhG{?x@UFnCwD((cJwbzDmpOA@<%FspNzL5XLsb6Z)(Y_#Tf>pcl7bXDSIZJ?|H$W!$FCS3CF9LuImaE2cOj zks{%jGmS?VKE(7Dx{%of!RDT?YR>?kQW7poQp;^L0v;7+VC!Z~mai%OfO^dA(Q*h7G3!Jen`A}!v#6m&OQJbWkBDT}W0{Kzon7b_BJ~|fQ#)QS^7y@n~ z3w~f45fy2b+y~62?$aLq%Bnl;A1)SaVHH^o>vS#sCS_6el`hV?Xf)t>4^GFz`&9;t z81-SP1Rs9?fZ;c9@7~MsvB%6zgcLrmr<|`^VkPEK%&X_mD#c+b3)Z{0#UQUv0sUr2 z9Yix)o9q&l098ysAsuhJHc>=?z{Q=hQX!uCRs}d9Cn}?e!=Pwq7jMrn#J?8a6dh^D z91(^&E%F3a31ymSuRq!?5|*T=Bk{fT5~N5y?hpc6UDEGj$L;vb?iV9(+LbrsFc^I~ z#g{X8OCeLw&zWWJyIxGNt&rPGZ0R3iai_MDlb+kS-k%**f-M^nW>BuTo0o1VEmR#F zlU9nru1=X4j>Bf;+?ZL}E1GMc?}3yMkXH0S5{;rC-26~W`<$p=#O0uV$6)REWU1Nn zQKZ+e{Rpo;SM$o7b*qis^@bdDXAN^S?l)E`*oVD-Z&;wK9r@_z6AA#^mU!;8sc?0- z1f~>@uba(5_0@KkaJUkWc9!z;uY44J2}V+Ih-cV$d#M;0bTd&yTIXH2ESB(hsPZ?9 zf3vOlqA6}Psvhriq9@zzUUu~f3n6>O)6LY+B5v!;jUb)M zs@`M9Vm|EUmF#R;$x1#?mX8^pTR3<8-S_}L>NWW8(H?M>z7h!SHJv=N6h70Wtv}T3YI4TXUrlS}hSy3tTj{Jt*QGj({xa9% zqV!(54u{bjzJ)CU=Bjh|Vo|$MKsIv2>zUFjBB=hB?h7hE0#BOh2tl6~x9fPp_34 z)X2{+;dZ44QVMl7%X;VT91BgduNWvq3N1HS{)dL~>BH1vHM>JKUPmyNr>t z*_`N+nw|udW?hk6e??gKKO?Mo-o4G~#0gKfjrfOGXr~Sl z+y&F0TUy$2<5<$yuTn1)838i5PuI~6Te#$EDv>saXqNfTf$V7cCkOKVa4(E!$tUwW z_MRMNY5gBRxxMcI=yZJpk9v)WGZv`x-#>8JK5iA0Xar)Fb~np_v3sNXe~tVR(q&wLW7?waEw9vBbhUwz@V21Cc`z7z z1oub9VfOzp&^S3ae(I}jMF&Wl%NDAO@-7Z@l3=e1E-0VWV5i)BYd*S(*eB3j!S6S&kUO;P{9$th5&smB zj5VEzCckd$JpoJ?G4fpA>}k=E1jHuA`a_;qF8^oLM*oj2ziEL|;|Mx$$hq;(v!e<8 z-eHzBMthRwMH27-;v}wp4V5PSnjlToLTjWi{}`CeHpw~@JTe;`{&|nL)&7~v{c-}FbL0$0A|d)3ss>t((7;J?ZR2X2hQ9Z9vr(Ep2YiMk>&tzm zZF3+{(v^2!1PJKsiB^&#&n#i|2cYN_d&w<-vftJ0`t;^MSakqu<3sc{(K$=h!a?C% z3vC$ylH>?7doFM;Zo6R?;7nIUMPB6q!?{R*TWF}pC!u9))muwH#?hR;b8g}W9ifr= zpG@fbRvM=T#hWkvQSodg^8UX6v^~$w?TOs{zi&^ATCxi@-Afdbpm5Z`=Vihgsp zn^N=mbVt`VA7A|F-_=&q9T@$t+YxPH?tCfwW?{VtSh(;%TUdW*<*?e`SK!3SQVmt5 zI%V9G)AzR9{I;LoD~&JBsvR6n{N9;ApgbF$efgmjpp(#VeDkVu?^fF0?0snwXm2H8 z#kpPh)V|yuK=IF^W08G+g@p}~VG=c2wK)_bV4SzbG6z79|A4%IWRp(s{GXL$y4$)& z+Xk;iOk4wc(ie?g?u-bNh;q4&7$3f922mhMhTPZEZCMvCQ7vFBBv{8MR};8=m%{W9 zHYm*Yw#hxNrxA9Q zgf1e?+(0qw-$-J3M}qNDnj?bQ*9!zxs%geA`Z&o@7hVk`5oPH3vOrkE(jUpe88`X? z-uMVBdp6auy{>WJv+1Hc;T{VBHU<^=FCFQ}-O=|kw3&EQE0-NmTwylLv|-$wUP}D7 zEbBH@;|r+|qSL6xZDvu-4=ZX8kGDl0K(Fy%MQ)K}ma{gzrcvgLwNu6X1$Jw8o`X6J zY!63V@XBz>Skyhxg=X|P>FwoNE)C%$bZq49OR)${W+SVxX3h7xmlJ{bqKBLb=+lQ^@|p4o zZJUy=&_s6BU+@kGzJ2AtJiVvG!U1{pV5lr54sst(D6lk`kLR>hp6l}Th;CiE>D?-G zME(HJ?RG@G3)E)~#)&Z<{NSyrF1v##S9aQjQRn7g`)%CN`yN&#NPt2gAH zY0oC#cEfO00)xw-joUG8w>9l!4gfd9Pg%3euq_Mq3HOuL`gn7Z^6$%)QMK>@AI57b zTyNRbf|U9|MNMWM$I`BC&@8}hQ+NMSk$FgSL6e-(?u_D}wd-8aQZw6xT3Im#5TOwBFV}Ti` zFd1t1TAK$Xv7yOkDhG|6yOQ<<;2c7cuz2jOp1J!wshWG^R(1sv$z|8825bx0Fs;kW zEK^H(m74Zys;F>89XfaMxqZc#?&tedLJpoI9j%%ntkSsxe{uP_cx|)qnY(f1;c(n( z@qbgK|CgEWK)F|7-WPm#5loY<%$LxSe-U65pZVpbDuGtk?32xOeVnW58IwM*o@6T~ z$S@k=I_apy|4vo1Bgl+;;MV`g8C)0;aQ@y!H<(G49j|wNx-f;N9aMo8%nYb2E5kmi zc7JnbE#y)9wYdAx0(2i>rNe9nDau#m4uIZnPi)uT*>n+|Z0R~1o!@GfsPkZ9C7eyk zb|C*>Qgs3k7+Z|VvXDPN%fqVjp6L=+h{wWDN8Th5jfm5|g=lj9GI2W4yLlITE4#0g zO?~i7q$4)=eyigpzHLL3gOKpvG!jliN++HI&Sf_pk4LCEk?yZ z)E*^~L-#5%rzU&nB8^|LC?plK)#Z2ZBOL22ocURE!O{GAGML)emgWP?pGIqHJJQmQ z)C>_+v;#L9%f(f)aPmBg<6IP<$eKhjrwNN(d#N79ybju-n|x7aZK7g58+0l64riu<9{T>J^*havzHxIktT!f9NRyLn_xo*9z@7nN@`d@yiFp0*%K@ut*kdc5|?HRlD0f&SG@ktA&Js_ z!8=97xV>Ukxzv9R?VMc|zpuqt%m`vtfg--CS4-1pbZxYuJqPSn)-19^*VJI2+@tee zZP%86@X+22 zO{mJ~bv>xj6lCTz&5#L%mOIe=o>V1W3u2U&r}kf_7gag0+{#B%>PYhRij^4$zBe`j(d@hP=j(>1h2+BU}#=ae$ zdqESh%!~gzh0x}L%$g6-J6}dUa!r;vfrQO|h_&DFs;3?jNoFt4LYhvFPW?lX;Xo!i z(8pSu=as|J*JnW(Kb6sE=BJdOI5xjW#Ep?W!FnWVh5wx%qx+HB7m?h?*}9dC=!NL% zOxa36H26`lp#MB<+eEQrcev&zOv={&zcx63!6feo_4zB@6r-T@gF`LvJJGTCavJjw zumbmODl5wWy|Q9Ri5Y`(*X-hRxt$y4WYwPO+ISG1e9(%UP%-}qgL18+e@dOboY;`M z$`f6nY|{~ zV3hQRPa+Q(pG2vdR3pCkFuoBAvuQlY|8iyhHOKhabt(v@)0VIt<#Q}~HF*GBeOn7!n8(~ossVc}-`CLo zB5Ecsil_{Aqcp>>Z%-+YKHhPlyvs2v;8B}K8qrc|5R*aqf9$PHJX26xK}Ay@dGf0)y+i(*(b~yXqpn8 zlOx75gE_N7AGhN?HyS$6O}N4eU3v%}CO&hkoQ}zc01Mfov5Sge^^d@Xrzpj(}46GY>(X%rwuY_7;4Y!2d69Idce8IS1CHs)?PGm*)`Y?ZU~rigrh7|6Lqubt1$f8mrvwU_cQjGw z{d2?BWH>~`K&r&WrABw64+`w-nShl-$^)|pX%Leul>*c7%hC8iQjYV-^2m!fMji`H z7l;brL?^z(ICK{M(-;QOaJmW}d_a+-hgjhsDy zj$|?~{6AeR>h)Nx#9ou7u3WRpjhfZhqsCQYm&I-(|0%x|+j&zo=DK?s%yr~`_TGHV z9EGCo18~RPjnvR_*%KZT-fS&t7m#QkJOdOOzRzn#wy)sQ&SlnLM#8eDIEERQi0snG zAN=4G4z{W3fj7;62A=&R`L1gSVzI6OKo-n{*vNe3R1>x9vJ=ZTkL&}~ zTBK~7La!ZhWjZG~BmM~Ql0wVj$B@_V#1qa_Ch;ZSl6`)R-Vrpnw(C8^eM6|;3MfC= z^F)5o-F5%fzW<$PP&4i~+--=0SCTL*?N5fdnlJ0AV^UhWRm1jMlaK7O0^Qa#J4}a{ zbD#GGGQ(!4bDGSkrwh1YL?h_tZhm!&&un8!l@;PP9tqnUSFhV~L=iI>PkcXLIv;H4 zyp|%h%+HmCXDNfYO*iE=Y~Zp3!%PeibnSFrGLNbE8(7h_7G2yPi_3cB`K&ctU*=a2 zfU)hn4;#aj&$i-^Gf3x6oTQx5BDw+60(!N;Cw6a+x|)!*@!$bWr*(n?CuN$#9ucD$ z94p^yf%^=7yNi&xm=Y zM78(_J+Eqf;vXa{RILgFgJWCAyxcH3$>s_wL)@xY6Uz7-+660gMlTWvHjPAQ8rkh= zeKrU~)u>{KpM$?rxxjopKJRMQoR?dNb!QGY-nG+fLQJa3w43v6_1qA}rnNL}1d5YT zIc{OAq#xwnD2P=9+CLRRctIB~nifIJtd zZSd*uA*Z)r#~dIU5_h_HBgMJaC>%<4{F-D`*H_gM!#yyotl8f!RtMtC6t#aaJfab* z!p3$Kw@|(e19&+yq;In;gXuVFPG^uypuc0mSAk-$Qy<+W!X1;`JW6=-^@vx%?hI#D zfIf@Ii99(ErZsu*w^e5`g!CDA;^sylbos2qw2N%Jo)>d%Fn#HN9JMK8J6EG|BOZHupdYYwX}cNnp}839rIl9Msgd_z_Zn%cZBDPs^!ek_*Z zM=6u`AY~5zbjn19j$ItLFjri-`mS@l?Vl*1yDzuz$?sp7r+=ql*YBf#c2&a>J+O@&y)Ur&|_vIzOoqOE$^=ra^HdWajP+M<*Ol`e72!xi1U)nM{epkzu7oBlXNIZ_t08 ztAPCXxeA>O{}Xc+zSb{4%@PA#8z=(dfe?3=H0gI>dP{~ok3$$#n^>=s|8#h|LP3s@X=y~9U7vPHJml}$@!YTBx7Ou9+7 zDa7!3EY3-*;3NZOg5^+&-{6AQ7MfrkJSFccas=Et0tZX(7oV_8N9&tNYP8qc*cXtQ zSdtUg%UH_2=E@z7Z%N-}v=t|V5>3D+HQ=H2rgRiAz`kpWTQ>!qE%tFjzH%c=_p;N0(P zs6FcO;p{bZeV$)!_GAonf#O{3zRZ5))LFj|dNS?rp+V&><&_blf%7?M7xOxijtB%U z1$IGvBo+#re#?MDt!=!Aeg8sJNTyU87tDU)tJeUw*vg8fBm0S5+SYRyW-eBXmA>J zzN2I&AGo_%S>*xP+FYcf)@~~xb(W+!3fnxMf%T5m+LE3FRJ^tiO;KhD9R98_Z}Y+V zgT6HRrx((&`QN7lxDjZ-GabOfNYyp}f?)?JiPFzXr6~g&eJ;A$Ge})P4rvz=`{byJ z=$?)K;F`_rmnwKu+ZG^J4-D?SsAlH@zur)n<@=OJLFVIzB zYoyVO$eCf*=n&#su!Eu979(+Abh!Kgg5htC2jx3OmHzkWzn?8HI|lz{0>J-9PMEUI zPkI03E{^(tIY0jld=REQ{%kBV<=gc?$XEcw)kM{7vg zKbuzL{fNRbndc)h9dzJ~Q@R(=5F`3x+#)O-Qf+nJEm`VZnU}gs%m3+kLv&H=>@$kG z*H}bWP0ts9#cVmCspCz2GHu|;H4i>o?P+w~>Wng+msHPx?Ys)L-CA=UQ1cL=jV9{l zPNSVn3+@Dl-OV6n@5j4NRdvGFs?`qUUldV~{7+6n zIvdu(D9$^jCEY1?RUW`TQiN*4OMp2qUm}e|!kQ3ig%W4uV*n485eIhXaH)ASX9zAQ zaTlFOMmimmyoYciz8U>}tEPm_D6*HS4b~J()3piX`^5O)G3(c59vkKM=i|t+)*;^< z<>85tN&Hi{zIRW6?c*0rA6p-YQ$(z{&gh-|-gTK5afc2Qh(@VzWITA~vR)-5l&{?m z@t#^K3->J|&vSTPR%@<^N5QLg&%{&DQ?T&Un$j#~h(2DQ#e8+}tE|N2+}lUL+fUy* zdjJ|Gv;A~oFm^_4CZye9+Y0{X*qN|S;j|H60Xl)7Vbu>wSB}`;r;+9wiR^vQ_5+HNz zUe?qE=t)!NSmV6`XdHFjTGUN+akX(px*o314FVUY1}SuGw~9_A#@zD3jT4$86M}Wi zjdVoa>G2&=J1@Rp6=4plhwL7m^JW4VpCpu^dFm|{=%Wq`0$|e|C=?Cxv2NkhkpQkxEsZfRki$_Qj(kT z)wb=9AW6q=^RkPlgrgh#a@pbT3>0zXry~gHMVc&4Z)d7%Ry30C2F(XRsL^24< zWcz(^&|K{RHo5TAut~>9Cp*cOrujJ6tZ9VQY@>9gLeiRqcIEO?CwXBS$%9y_FbY0{ z(8C>{skAqTrnFtOuTX`K$2^UInoC8s+#7!Z9~ZsS`{uD4@0gM5hEykV&Zx-R<(~$3 zs=pcBCFuhhRZI(Wlx>K59tP-{B?YFErS}Oh4J+GT`K6l8#qRW<%}rRN3`tule6t%A zObo39j>(j_Qjyu$wAzZxNkUZ`(II7(dnC5a%ty#n_-7@8B`Vk;} zy^eZGd*YP?JKw|dE|ZU@4klF&AD#(AqE+G%>urDyP#Elzl7r?dCd^>xoyM+7n4>@F z`=^;t@qk{*{F84~%lwxqT;C9Zg6|xt;zHW;gF|Z{dd}Rbt#)%10zcOIrzFdfBxBw% zvnh;yaQyXyoj#tPz`W!fkQV?Y>3?;b4UQ@`}sgi2J6&(~r659Tfz!K$U{ybcF3dgVVZPk%JM0Zug89c%K zB0s^YdG6?qYSO+fKWN69L3cII_Wdmg>6BO8S%T9^2mQZySlM>(my8>PEi1xw)axL9 ze-zw0j(C8`u9SflLrj#>*GPxIepz_I%WPbj0B_V~QN<@DNOYLS3$}aCh+~YdJ0t3AfT07k_L=kK zFAYFvOgDIUdH@idI58uAH#ZuipcbT3w_88TDK_e&k&VqkkwT@3!K!zf2(Dn^hiLfE@I`8u^*&qoA_ofG!&`#mz8p zS7m_Tv$pM6t+oe6$yDo#C#jFSJ-o)U3X(nxzHjNkp$=?}fp#Wd?L%qx;1gGcS8SMyo^KGrm@ z(>w7Wev&nlm;^RRO|@(P3o65@?cNKQzsHOnIJ6EF$4`Hnv!bXd#wil&WlE2Hda)<3 zP}3wgd0^`R8AQ}<;Q{zta|A10qoPp}?7S%BD+p=u%&4wb#>XtZ*RdYzVi%FsDb+o- z8L1oddpTx(sb?%T3Bb>JT^xVI5{_T2SW;TYPIi}h1djl#Sj7~f)+oye&*jU4WAt5P zc;;TThX!UB;xJO)-WqN-BbydRk88R@V$RhwMX$HVbm}JNFP3;3-upfaWpLu4)LOmz zC!Obi3r(avjMcxmdok{9v9KCE1zT&UlNIh&R6aD+wY^>2!slmf>@icru7Hg#8XE4` zy8zeG?AZ5K+f65UB@dUiwX_6TS&Ab{Ao~P=KmoMYc8oHe2nrQ~6J=3pNfLx=&I>uo z^L<_@KjzI{ARKB?-2OZ(M{iQHVJY00uTtzsDU;(MWfuN)$^>7gaIY=Rk^Oi6Ks3eu zVT!MgRThrnbL0^Z#6@^A~6S7ia!|nb3ry z4VoN2hO9FB1nf7~=EVu6+c)P6^msIQd{49Sq)zjzF65{6*6V^|Sh9KlghK}?!x%G3 zUO!u%!JINt(sa{X!-l#~d3LFDFA{%_VdfvGlo9A%7$v$Pk(ch~wxK*mCg&uC7>-EYV3 z;A6>gAVl=Yo2ECa^H#z3=3iErGI-GO#jSRTliS#6h)Wz~NMWCU|4aWm_k0%J{)5t4 zjC-B^NKwA;Q1>xQQ?hr@elz046L{0JUNRYIiVB^3|lS1vkZ+=Z{L1 zC&U?N8u*oFKR9Fi#B-}HVhNs2*P8?HsZONFe3Q7(Yhgt2QLZV}o%SJUjYD%>|Gn$H=TEgc`Z!#$J^9QuG)R#X(m z4Ok2~q_d7?s`e5#)LUR*)yk^hL)1ZdpqE5j`Q$nc^{8m!osICyyzHR_t_Hsv z&)zkc?goCY-}KO~?WC=JA}A5PwLoY&$x2J!jUR>0eVgh@m&b$lh zt`^aca-NZ)Z9D8v)*XJOV|=nmK?N`hC4aG{yyVH-vR)tMg@)R~!~Yw2^&FO37y zDdL$PBj&vXD+jVmTaXkH``Ush-XAl-#n=UJI!YyWH`0uq2FxXTb@uEx;`jFa`P=pF z%(N-H%}Qju~mbK63RfV7ArSg`sD zu(P+jnMN6-BEka_;X&LhU|LO1qjS)k<~eLw?^cgaocBP#$rNc57Yj)%*;alRSbmrgKu#19Y zEdu;J)W#mg8aJareaqcQfTMX!^zGu)(nkvfvAZhnRbdN37CGvflV~N;IW^H0ih93W zWkY1hondZ_4Le!g{@mE-&Jrz<5q2*vDc8Vuku~C;oc=N)aw&0uj?c8_VdnrKln(*+ ze89>smQxdw{aHz{$`O9ti_evzUlAXtQR=>)Ux4?q8A;2B>#PYb?B1MP_Z*J%*d5a= zODluG>S~GlV!48g35XBq5y{>6Ne$`_2G{Tt7te!2tG&lwQ-$z&7N)S`3*2XH0wFJk zb?Q)PLxi8bw$L&?*Gs3iIAYp@*D#ehUqXL-%Y`X3BB9o@+5^msFRi^vv*a;13?+sp z=n+~a>Iyt(i<#YlD5+A7@T3s#juh2450%8-$#PD->G&L*wIEf3(E3pOrF5e#x=!VtcB^h-oKL=OdQ< zBPwY?7wi3~dREbLLtVJl9IoT8Rxw3)n#P}>@&dI+yQ}MhRdg0nuf%h~kkxTiaLB#; z({umjH`iItS^MB=n4;#LOK|Yqxa@MC_nA;v;@fUn^T!+KzmbCfxP6B6kAOs}cf05t zKO1^$@2F4<2q+4SpiL;#e1etE#4vLEDRF#>F++v!6plVKPAC;=8j+ZZnVLBZdo!rz z@zCCDd`{ie&fUy^Mc&qjLHY{1Vne0}xo&JtiB5I^{SY^);sXx9R5cmOpgXtqEbWAv zieH9bpqilkv+)H5Z{CVMXc2sqv#PQVG&H?l1$1b{`;^-EUFB=-wK24z<6)sjxV5mX zP5@UMr6vG&PF5I>yyWTe{>mtwBp;lxoZ4~=STKSLRWJ#}623$<{qAja-&E_eyx+;^ z=x8rPq8jEc=5+$7y74JIMc=nw25_rmir_*w-+;$4q_9I%)^8M z3QWwpbAiC}s2102N{w{@argIpF621}x4rFU{LPAVb1OT`{YTiCm>>%vmnA}MrRjy@ z#>~Z1yH5|`*Bbek_X5UFIbIUu@+p7_TeWYSNoJ1>oNn5zgDX^%Plawal#L8Hx)+TEP9m>-oDRaK^j zx@1ir#PJV)iqLT#)t1;P;DDoP`R7gNg+x6pX zGVq+fBAF7_c`a~(XIFY(7PY4pC!RCGA3H5K`eg{G?2QMeX>FYGHVVKY+AzLaJHz>5 z@Ko4EM}#NKbE;12fGDjAN!1`JAU(8WjlzJC?X`;th-sIisu?hN3J3DyTE z5)pp{=$@Lc-qPVP(pS+3_Pqy|ir4GW&08T|UdVLV-FvoSpD7*RMjlVr_m?PtSv0O2 zIjoo+8VT4K^_&OA8rMgDp06pgQy)$lUU!+-#0My^+~k!WYb@GmpL@kyVfUaPI#Ujm zD0e(x^sl3)%~N%H-OSH;j}fW!&@+&n7RD_?5YRLrJ%sfs1hsh*Z?Y_25c zS4>o4LLO)IzYIc%)x4EiVoi+-m7)=xO?S1$yMLZtGu+4K*mx_Z8}Tt@$Bm?Ryg4Jp zqx&%C1G%RIqvKQm5)y>k1N&vJ2g(m7J{n(O4rg^UP&Ed z2)`~_WL$1Eq{E`)yS&}4{Ji!)&647Kr{&ST8NF30V~)LQTgCmt%>X(Dsqhs`FB2*G zWZg3ui_RTWEz7VycxP^j*xSI~u?6PCZ= zrqdER$Q^}@)gE$c5gfytiPkpyx*@|LvC;Paj)|p*z@027O{aqML3;^w+K{k3C#39EC0*ZQQnWJjbvEM|HfdplXA;kRx%FG`v zQ}KikGn6}CLDYrs>gK)A646CQOl8TYa5{=5ahjKH0={7l{QUZBy>QI)Pa0R3HLJ3W zE!rP8ZInHqYLms#M$cZ4h6^o@eYq~P(Q;dCrln1s>mmMyj@Swy5{|f8*A~KZjK}7g zVS2ijbPk_FZ>NJ%)+2v|unRY~7mda2CS>SGt19PN&$gKR#T;8%eo1Wz55(5aF7;WT zzQnZgs!`Su{ixSYdn#=e`fSi-Xu!TPkz5$PNqZu<)S;YAxzX`Fi!D?{|x4CYc5IrU|QohExfgFXZ{s zC!S(RBLMU~x8276Wc6Nt-U=Ax1N0itwkaszGPY!a%mwh!n+SrPvB6r>RyoF2W2h1S zCFfNM^sDi1YbyJQsYQ#0kD9DZ z>txS{dI~o{*lyb;)YSQwF**v)TzTapqHw&C^lXVinZjhx?4O!`fc1&W5rMm%7MrxfA^~yw_aMFIOm4 zw_QO#)OMg>p=;$v%!djS4xz}FmRqtLk2~l)RhW9lQ8C1b)tch=OSQL~y*~xZ@yj9W z4E&4{!1DQ^3pvy#)0CbT-OmD&@W4j0+bV-6I&?3_yclXwPX+~8PmD_>a02=^I%m_i zg<5r60~|n@fIKNq%la_($K&;t*B>#`OV;4YM#6+PZ(aB7KAk2Z5INFOjv2J!_j2!Z zyy|Ln-&%h4X26L2a;A~$Ee>f}t?FI!OmU}ePa(vDSp32D2yrA2z~INU?%eS?iaLlL z&d5yd6X?rpDX>L9Rs)W}5S;-%U$B-}+$M1>gv( zHDCmvvX@SX;k;=}kA&CyEXUe<24)2D*?)_1<5E6=mmYhf|M)j}saR?I=$>cT*tB&{ zkAsmqnX#Ip_t&KcRoXoB#lAT=GNWeT40*Tl;k;k1n2pPN_rpqWuCC3wCCRxJ zV;6whrk!;et(v(F#+hN`&Umf<9uK~Y?mRm%q#R>1YKbb(IIV%agOe{(kkNs{6PK(( zG#XN)z3TORp%W~jHj3QF)vs%x7P$LIqq(M9vb)BXo>@{dZ{kh>7}O!i7vTsXRKQc#)Yqj%m^$y zZzVaYr{q9I519%j6;hV%tJGHB}mpbJmgnONF37oHfq{q3=M zatB+*{N?AdkF|$XsM)JCAv?`D4Pq~UU|ATu@aBiO7xi?m1LV~w*PcZ&#VU8Te+iAW zT&cB>tFDP_N1tDcPOmiY)^*WVk#7qQF8!S-S7XFa%CNSUowTjeWYq0xLfx=Yz;EXG za_a5O0^cWXo7>ViitdKR3q6TEulm{^u@kIPUVHxnTZ*mnE-NxC-_IL1lkDH=;C{1- z*Yu{%I^cw4RBsx0cAlO7mlwYKc&@IEeanj-(QtM~gQ=nbh)8B^r|R~KM&ugnsZhK%Rjoefw{#|bu-kA|Kbz0aT^kkbN)-;| zMR5GP#Ib~TA#mn`WrZj6Jcd5uNd^lYJuXw#ty*;jv3nG;+lOh{`qk&>NVekF`c*EI zCz{eSVIgo*e1gadCp&Ar(7fuBX5CnB=dP|i{jD(fxLSlt#53bsi$QBq2nLvvJv zS)~F37{c71RJivxiD&JWo3C<|3C~B0=n&4I$_m|Dp4R}#JG!k(ROu(*va!U!P+M$6 z71m9n$MYP)9d$0E$7yWP${PicxkU$^a8}L zck;Q~$C?6{4PFkIZbg&BC%p4}naw3QPK_gh(yVWe2WG}CS5#r$XBXnl zy-`vew$?;yR**E^T(ymz2khx`O zMlIE}=8pO;KHd#(I;ccB``vx;jq|7hk7^X5KbzLuts@UxFrMMK@4HQx#x$y_XF2oe zTkj>_@}#;tW(Aj0hdJwe%~D|U)cD=(@Hmq_PX=WjMZ{~s57Dh_9N5LNPNJ*k@YD># z`CeRqSR#f-EJv*tY4_{g-H#5^}fgSbYoiv@hP)XJjqjDF{hTZ0us+{tr%OY%i-P2>qtC=u4h3s;CwiuG%Cf0Zh^&Iy~?R8;B}#; zPl)1mDzR#r7Djpq&;H&RTw;>QKT%YPUC-yzH}8;=tg083;lRTD#$HtPX^nAU13nX_ zkuQVNqqJDE_m$^_Pe6k6i$^#BhF;;zMKPqJxJ{!^x;6Z?6AqSUl6m9S;tFKj_K2^` zD|(TH*2h@vXZ6%EdYW-6u?Ln_#lWS$i6dN5ILJ!(eu1CZhACF)nTV!*h%fe9(FNvs_f)|D zUW`obo)nm~;XK-|XqJWcF88^`@5xKaDS-CtJ-Ag96R-Jq^d74fRlZ?Ha$ed~+)6#b z;d-?Ss#q0mBzAPM-yB8)mL!^dy8B@O)zTM(o19mwjncsFRQ|D{ug>!PAbk`Wmu<95 zb3B{n)=iNH=Sk9;?a`aZk}U@lI|_Jjy7-^}RuO%b-RHpevV8ztvy#+! zSX;2*u>v*r1>dj7M5~O!?hcBj((W{)umTCb_`Z*=8^)G&`>5INo_%!v-1%pB%Kf%p zsoR;3l)cyBmLH?17FZHo^uO;|OzXEZ4KrPy&P|kHjzFt-gq4{Yp+ctBe=k0gS#GaZ z!LGB3M&8JDMn!4doh2R?b{Gx`!<^pE7s4zF9-o(jY&*Xn*&@JwC#S7hPfE0X%)U?2 zb44SoIac2}3jsEaU7DujwRP-QCbhpPC^d`1_8JQqOuDZv{GLIVXHpDvM5a;O@y?{| z=y^-g4};n1HUAZ9lKH`6`ktXO#SP^@sB!V^&rJHbuvPZ6_O*dzfu{vQ6S!EkDQ( zUW)%+xn_8>!x_*I%u$0i0`X5 zAMbt68RJ(?%%BGhZb^sS*-ayc%&#u@V@9FNg;5EXa=Otme9-+Fkn!>dn5U_hUwkiv zRy;*Y7)98&2Ics)P=$?T%PQK)sj(SyJo-36X^^+4jF(0Rf+yb=>4{qws@(mUy^?=h zn|^09h%ASu}j zRj}RC<8f}e0|pKQZb{rbzX4P=47IRnz2*cj+&{`qR~}d=-DWw zbQb1H@xD*cGGY{$V@`pATQ5Z*?bQ2q2Dp6=cDun(?=>e@%Wt2w$mw1n`6fb=zgGbr z;#B|onSV21{)@REZuU4qcz)}&v2LDr2UXh!c(Efh`U)f z@QV>vO^I<1@xYlKKK#ec(nTnrW(h^J zdqaY3kZ_l^{qV=caG=g_a45@oAccaw@uHyO4L6ea<=$oecopvR3>W$IY9BcoH0Fq& zjAudGyEjevD_mTa#*v#Bn`clL+qI*LafXn+mDO#BHr-t#-+KckiEcItU2J)t%3bAa z4MHwF7;dDea~D&VX(fwqbCH@UX>sj<9s~o2pYg3q>uq(9;Ft2DlZft4g8TLulZ$XF z{F<@2KDj-lFS6Rpd?p@_;J|%Pb+*Cg_UsdY)o(w@7u%X37!KFSi~s(KoW|Y!l($ z_7l~#CwdF_i5Kk1P`T>+d%8TFdl9cOJ zn`^zgbFm>K8M z7F(s;4~%n5X-_RfJoxg=hP6A87z9Qx-coLJME;1-ML^*`gRJ1vjxoF*>wN|PaTAEDbhceRF)JE=+ zIImU1Yf+Utq$>sITfFj7pG~OC#{Vr4bF?OIcTAr0w>$aN)9 z-m(B__IA;9+E|DH?6G%zWIKR}k<(euNsY^2sy54ojgLK%8E3s4)If5eC^2ySj79Mt zF_Q|Dtpl2=Jf<;n9Ey&yiVspAaVSK8t9?GfbAXFP%=`jhilzm7xio$H11)vM4ea9? zC0{1Y7{y^jSIvq<@6^R?oP|k(o9No9dB&zUAKzLjb(BTY@l0brL=@nKOeIN#w0>5) znR14xU-=3_lDH1u;rwHH5U?!;Yu3Z6XZ>>ZRf zTKQ&MMS9~-%Ah9> zGV7PQz_xA)ta^i(=+QfAkjmEummu4Yc4aT^qYcpJ##<=FKGLFCU6fn?vw8uh2VFBk zjme3D$hjg6HJosukjS9;ID~)!Q$I(ZB3SLFut5a`@(f>eHcXw{MeR7Z@3(9ju%!cj zLE$CNF+cL*gnMtj#p(kE=^VF^_j{ofl~ia9bJ!2@$p*y=FGh;uo%uKKqh_S$PSHKm zQy)LYO6FF~8MPQV!$)lIoaaCT)PlXwou4hq-@3oWP;4WFZhv=XPmVG;~9I$itjLIzQ z*~s4FqR{^X@TAJmq>V7nx>u*j>NbZ5Ks#zU!g{#{KfV;nR-!f$${KF#cW?E0e3)4> z{{_v!jaQ(ZcV>_bRqty?y+nC!V-e4uBD-U*ElNX|?|T_uD6F4+>1iU*C#vZuZ~whcD~D z=7PXqAaPm8rp;4RfAj`d`i+C4>iw^X(Ei$@pBKvhwMD<6(+uYLD~kSOh5FyGslO84 zf3CLuE7ARx=>G2W_$!M3s_6cUXW*~9=qKD#e?`$>QS`q$iq2jucm2mKfWLaAe=|z` zmGu5fdSCsX|ChC~-rZEFp%UwzO9nT;<4pg2w90*^`voQB-&~;IUdbn~ zDZg+^>D&^9aWFa{dm8>H(WpBVRocbqtHTugM8!D@nD@Nlm*MN9-vE^l9eqmSqxr7i zDWzz=ovu;TMQ8pe0llN_e*_rbfBKmE@YTcyV=Fau}h>~wq~ra&1mAPEJ?1x zbj#}=Jk2A3cJq*Yko^Tf?XsV$$BSHU2Apn{z}_s#v~;Vn!A@H%JK(pYx39`k1-SE_ z(@DC}6ady{eUc!Fa;h~5qdk>){K@^_qjTevo%fq$Bw*KuU%cs*F3R1YY9~FXxpXIz zq8&4QQ1SWn;j1qh4^n~2pQQqQcIZ>s51kmSV;9}}Q=uX>gRCZiK`Ek**Q#mhZ@bD-KZv=u&xW+M}#Ic(%GJoH_G1s5zpAz4fJKc`h6Gn%OqRW>5=qgFT zq#^`HQ@nO|W9JPg2iAs4?wwwge!VIgD2=~Kj$(&Oh;qBXeSVqp6i)-7cm{Ebwj;zdy+wbU~066xH$x>^0tFC5a@bzTDe0-z?n&pkgxr1c! zCa|26ET|6R_sIA!Q1tgIDph(-r=i*l3+yBFR2mAqMFaYViQ20x*;)(mQ&mT_$`opZ z(|vX@)**}<6XaWk8%t~yA>wH&F^o9fWQE=u$tnJJ!f4HOJ3ztc3HQmFT74wuogh={ zok_us_+9^9-MC49-1SVA?a9LNMSDBCk^m1^!HVvDi#n)kcmULPKfirbW(=>0n=YYEP5@lh}Vf{jC64H?Xm_; z`Z$6$%2(1pg4TUzFKHWU(tz)TpAu%*+u-~yRQFsJX~VM6?n&YJ(V@76u8XVs01PD< z7NN>z3)&xLpv-qq{Kk1W!>kEABo3kzYq>R-t|r&#+t!dBl}}1=s-dtC5{+*ur2g;n zlvI=m__b7InQ9<5A%}i-V8jQ-9GSpSkE<;rvVPrNbEs zkxnJkkYHcGzSncbrjTP3bVreU(94SkS95ROA!S&VHu?5ria0v?eDDvJyy;f&BLY9& zc|A?@mI?!;0gHIR%sOvhJ$7)&sSp3^CuI&lGt61X9K-#VQ@sCy8WOd1$XzVEeUNgr z#BM|mhaLIMI9X9R%rXW!B+uV~PGKO>S z`rUpl|8=s1+Ar{KDUnpD$Yh3|*xd>?>-OjMNkS3q^P;(${e@$Xro!ee<$G(C+FEe~ z`3^lUeO?%Kn>U+d)s71tWWQ4k4x^>DIzeyQ!*3DNnXD1+t>rprgd|l-pZKvX)s5Z6 zeNCU~qGyMYZCrKY zdly6`ibeX(T4W0K<`>0Zk| z(0dgSUcasJ$L?|Rja<)IR^{TJN+ zMX}usS&Pz+9bA6NNi|%*galD?QS0{^0JY)rG|lH-%~CIi?W%gI<}?l{lqoWBVoT`6I9R8 z9&FC1J3ZR-k7y2~=0e6rT~3a2 z9yz=2gJJNusLgfN_#9yPl9+7avxEa>FS{I!>?{N~+?!}9Rz|}}nWByzv_mFQmmf7b z&)GiEenfd8J&j`~8n}Nnv9rQNVBxhZDh_&-h8>CbT)27Y53w46YkAhW26i#xFGy2(Q^jq`OuOQguIUSXO5l~ zI%pY=bgcgN)1JbW_(-T{cf9%G65%wW121vu0Sb%X^wbF#5*iO~0HxYKBqDNQ} zs)V|?=q@gniz+^O?`1YZ9co+k1RBfWswU1`iVlNeMkTCuP7DJ0vHq?q9($6QzHWPh z(ME?M!WPx4)nZ>)38RQ+`NhG)!rJE>W;+QnrquWXEkykNw)c>iOq!VPLo+`y_UO zC1u}j@#zFZI=kdnZjxy6ojMfpJ$~8g+TgjkZW-1@M0as#R>Q(*a2ieR!|0?w?fv;D zKO>n8BoqgNI> z@tk`#FMu0g2@R0-5H1VRH(Qr$(SZ@j9++=Rd=6%EdT4!}0r;G$pxA);*&{QajwTAogZsjsI7-vY;yW3eQEY1M=bu;b`+w*c4vl!;-$uK`233Q%(DI9mrW(w-96&rUV(f$FwqT6zOKSNN*<;|<&8 z9Hz+7`#9=L$+mN%BE#=4&n%p2EX&Ln(OzLL0()JNuZ^u)*W-agT{;+J-~iIG;od}* z?_@?z*!~lF$?5%l;$ff$b|3Udb=fs%Yu(Z8tYaC&u#$!?j1S2;ovLFyC@x`7cOhh2 zdVnr%GV(qFh#apU1&RqCRcB1!#F_){c&IKuPn51J`Z$Zbd|`Cp?VDMZ!YHGyaO%!F zydIN=DjO{B{4xQdPfS)eo(HXAXUF@@9So7%+HpV?T#;$Je{4uCB~%P#S`h~L95Me* zap+UDXqqo6sB02-6ZCnh#3Zez-lenCs=3w>{#7l@opOJZN~Brpva!%!m7JCtA*0Mz zl}kbLY;>tdIfDCRq_IYj-oTkjbg3z`^d`F>5N_6#E4A`Zh&(4$%O`ojCu~A-&?)z7 zYnKkV#E~jV@5l)@}n{4rg<-M9AL-qGX69nO(~6_k#;wL z$n|kwNEiMOfw0qIjz>;*t|%f!`FX-lezOlS@TNc7dcW z@{%DjcG7az%kAO;V6a!mmfJFh27OfQ)JxR-A9N~?HG`D+N( z^|r0J`>-hM41eOW8~m}xue9&t%rv;qlyVq;i6rymUda7XRqTnSKwIDU<(3|cp(%ZY zOO5C!iAb&a>#Xt`7m?ewu(hqX$>4V3yaWr`trLaS`BV85!bz_JkPi`Z4W+Q`p1T^oOPjtXb~ z(>zkKGj>p=6qH`I6{U8-5gG+f0-O?cVgI4NM9_*9FVWL!E(=3AmYni^^^H0f7 zSDLJS4e*x}q^3Nd_8~S`OSsrZTs+s(E4sSL6b<9rd$6r6^8M||f-r%FNzTIPX+7hq zZ>=~@V*Z%c?!-jNH)B}=gXL0`rK;k+i4yXQ*{?;w+&H`M=7uOl+5CI2xB6@HO;%8+ zWMV)3VKJWFO$wDaE z<6T^ZGAAr`>>Osbd&H{#>=$XIAiUv&P@(Md#0R^%MU9Op6S`W(;YVk#XsRhBHl)9JWA>} zf8h=l5A&!#QBpt8&^_gG>)5=XJ-cFvotjG}l1DF{diTovjCc4_ldwn^=Gef3hfB^%?y1PWF0&q;c;N0l-k?bL+i#WcCnI{vJzFLaXzko^!=9o|r@15`!CZ z{D{?Og}kTZAS={;Ylv@*vn6Rh*;$dceG*yUVV@|k@n>A_A{A zTml(^rMSf*XX7|iqn#<;6=f7#hTFUwds*WJ)1UlxuM8_Q6|TXF>Rm$S>(4yL?qp7W zIQgec%L&*@WAGEQkdIh6%AvoxUVFa`KOS?+-zxmcdXsmCH8JNBF<`t-Y`Da4_~o=; z!CLKC1zV95UrE?^5W52umQ1D}9D`cKhis&ulN@a@UWtO7O#$*-P*&#((^PuXaXj;oTe0|@XyYw(DgE<^d(Cq2;RxCTm~a@H zA%5^XJ-`QQPqrln%keZ-EH1ZPvfCQ|ZUlYQ=Ahep#kyu_zWD3+j^T@y;>PXs&uXUE z+MXHv0ACeq75L-leFn(pA_wXydfu8SV_qHO=%SzY z^%)Qf+6!0qpBpRQrE;V6&v#giaxzCc$sjTHjc6@rB~c@I1oLb{1%N?LygM6dWDuD5 zc)6~i#=yUke3TVzT%KUxAb9^C<tJz0wk!)Iz9>ayqis%J42q3`%xM>B9WFIvwO~ca=9Ig@=R#$$#T^Zrn8i~&t4MKsiPZ6qwbF*i1b?UVD%kq;!-!5O&zQ!^c)z0q)O!vA(dP`X&?99(L z&wAzrm$1TWBy%iV7@U0`<75Q^jp=#1YJO0Yel5u26n8kC=j`_JX*G%o+bJI7;PlDU zr6jv!!95~*BwHKC_gDh#Xw4ksnv~Bs6=FeDFbe54_hm?8I_N>DqX#e0|0>*le;4R8 zoo{n?{^b%lHrtmV5`qCypP@!NgApSRB26zu-9(+WWGoF(Lq>+^wHL<8(bYjbQJ6^m zswHGig!?3zYn$KyvuaeUF=hTHae`o@=ElAl2jQhf} zT_Bnr%>rkJKO4Toc&Th%X9`9NQb(Vr!RzP*;r>FyxXjg_=0Sc-o-6_&y!%a!7d{Ec z2_?9Z*53}v_svY^>-br1*J%WLHSZ4%z^=TmjnLqxDgP+-NHmu@SKLU6>WOx>q9M=~ ztA5ae;N~{&lMKN8#h)QMTCkEHkN+~FN{`RvD~DWWa?Yfj2xC4q;WLhF>`OqL49~|C zt|wLE+7W6}d1UHc6_NF|c8)6d&*L3zUrzLf)YWFg8nl77#p-yiS_NMAv(+LyW~*WU zkecMOO<((|v13pSq`GJ$r$);yxS{`j4WHLIy(MHc0EeNc)#h}RY{00-$1fX|yDlBF z6|6TYzmC4j`vuO%%HX=|3!=l)@KmVi8OsyF@eO>hyth0sBb{!EUBMxZgVwZ`byZg+ z^rr=it?nT}q8y$BnPMNYNiWgbKp=Zap#0u>*1xF)wTXrIQ_lI%z`k)R~O-F!{ z{QTs4l}d{(!fdQMT7*2tn2Aq^_xY6JZ`~Rvs|uho5Sv%-7O#9u=C^&BzxLkw7u*N^ z&iMX^dZ2bad*LrPXNtP4_h+D157xwVtKH9a7DDbR_dgTQ-Ci1dR3?WKktq=>l<``S z+WYFYBW2&>i}>h7bY6%)F}X)XYtS1$zlsoGx#XKZztUBPQ-A4_kEK^pmO1O| zttK~&dm`tML)W-vKreEc;kx>DK_Mb`*73sbPndh|DzlEFjse$??}`fzW?*eIge@0t zzfg zKGv2Hd8a{gKPr$SMks*oe^{}OL0J>ust#RD9sh(UOne7BKB|^95MS$S2gUWBPq`+^fZf(Jwz?39bRHyDpj@rY@+bX z4jue{jKsMi?66Rf$QG)p*YHp!o&x)vK<8;T&Br$Q1lr!67%r)Zq>7uLqiY?N6JIo3 zx%@+OzYlszK>#p4&!u!uJsXYeco3Ory0{x%yS_&E45QJc=zG&l5&q@MVB;h7`Lqb!S4 z_)suSFo3>Z6b|^{8W1^~?+0g(+=h4-Ja+=@9g5KvpyE2{vxWncuZbVh9a;5k2nS&$>pnDFvN0=^pMof4h8k62N@_da!8- z!8*0WeD|BptnfwA2RV+NK)SIppN9umh5}ph>H~)pT7~XSY5-bnBQM`a@h=$l; zTPRdJrF*pdyl|+!F>-m&i9dhsl%)Tz0afzR_*>#%E#R;7Y>#~ZEIvT_6f?W3HbSoh zb12(}ry8{JaYm$REdEN^{uJ_($>M1tZ^8zMCm9rbuVN||iiL!Yn0h(h)}E}9n<>Vz zU=1rM@8@;yXAgyM+1(l=kG<3@ykoVA`IEwu#%pS@E3?x@@rlCHYo94%N6z2qr-Y1>n;DS;^#&i}EnSDBBy3%F z?KB|V31P47miig~%En;njoK2G~EA*a+^!s80}ud;5|(kmzse&CSz?rgQ%J==E+{;X%3=6_euNG}Mj6aGr6 zsli&vdut{EO>EOl8qxI~H?&&lk^ci}W6m6VN|Y}#Jqa;WlbOL8!#ZUn+oMo)p||9m!H?Y4H5eZllKPHK`P2KoaVj){V*c1q~W+4Kg5G zh%kGH8f@PM^W!*z$=rN%q&nAZ;rc0^l{MqQHH+knjAy`W-fiD^pk5}rusq?Z4E3T{?F#UU}&TiqqF0lgoBB!{k! zE0wN}J888WWfRcHBbqAR1hU6@gfi|sQRXCL#74%_476OITW_X)nfazu@1_T!J6aTT z3a{b!_`2yT}-c#6r#jTs& zlPb&|VEjB~a5oM0L8$BvYOw-tX%ld-EB7t8iG}7B2!d5(?dO8-TqILf?-IpL<(oe< zw756mUgtXQX-&_EqcV;%H44c&6tMlq(IC zGI^0KY_UaPN-10WI5=STF=LIQZ7SKd8nAgr*h?Hvd16JO3rFTCf5IHV-0Vx*o8ZRf zG5)V(cCG({Tz}%>pWAuLT0`4@0sqW97q9bFV-}5bRd+MDgf_xAg1v(aX1J*7paUO# z`WP&kUo{YId=hSkv@5$nG>>?(nH4o1&*Li1VbKH#^1lhbCHTOdwKJ21;dj0P+D2~N zC)vh%Fr0|^l((jJis+5OZfZ>uo|siVc?MJx_(NG>yHdta z+_ky-AK)%`9`4c;ISFkO0%nW9K{vTgc8AW5wd_K#pmp+SypnWCer~Qu7f!EKYf~8| ziz-FGwlCP&>y;!s)8az$R`6dHh&m7AOddA{{!8zwRrd_uT5Y!40%=I?sGW~>A=zp! z)zs>%G^{n_bk%g%?yf#8wwc@5Sc1$`UM0Rms53uB$F?D>e6oEa;i+`MW=Ib0tivxA zrZdhIQSJ^frSn+2d9zsf}f;CZ$xTqD=!Bm^ax;ah&sm~JPa?UQ+n`DBt~YOk~O7qXei`4IO3>9 z=F~$6!C!b?6Qg#OnDd#aNX+W4n@EbKtnJbOoKsbyYLoDwUpkL*uN!=}PGs#HE>W68 zSvzSnGyi2o%lMitw;f76F^{0kfe=4&05NB!JvMCCCXDQ1HQca;yzdHl2L6T92@_h2 zkIQtM$zN96hptYYI`dNsZ0dJG*xKs-G~kq#KY;`n~jkzOC3nDrV);e6G*x}P+OUK5f2 zjQW%%Z5ceL?selU2u36KQ|HXD_r?!CT=jpL5rPL*-Uud92L$h*2-FN&oz=|APWFtbSV z_riDtg(d>kELn{RRKPXS&=kUThkY{B?W`$n7gJBqWL54Bi1)dUOrOkF$_K5)l5x+^ z4$rfE4SZ3U;7i2}twOOCKVt_}2z~=cPkWs2bx&oi{7oXz+JuV;kQ=F?5Q0g48bpq* zB1Jnucnq9V*seK{Y~p?G}in9v)O9K^xBCW6A_ocE{8Z`?51dwMyy z|Gb>wxM9dC*Oj98M@7z3(_OAUe64FSdNbAjt$o-$2<~EpUC@9Rdz%km>RBPI^+S5= z(2&I;xHp)-zEE7xh$|N09$AOjvA#-QpAFL#l9j71$G;1`Q5fXMbTGF4GM549RCW4> zaCF+5H8J)I4f(MbXBMAfjQ-RR8l}c8uGyP~o_=t~^hUc>F2l-gfJ~F> zq;-RE9;n^Vb&oEBTSDazUucBt{yh6uL}NP%-iD9^z=kr0%_po6)bPLd$;;`)KLy8d9q*I-_#z%0>>>B7*D)LxBS#ykc#8=yrlr=Ld^~ zLg{gk`Yvk^Z_BOeaqfN+z*j2~>C4sd@L~EfaSp96NC3?Voe7Giqm8-T>6)3K~+r$|Vw!H}@@x=sh3W7)cwmIFqwwi3@lUKN>mYCgnw$tYbfx zRNMI4x}hIy(Poz&;szI)O?x^7;L7i4?$fh^i-#_yp-Hr~MJ+A*JVs?=6A4=KY2SE<%GvD?`P;XVud~Q64 zCbjjUIBQtkL%VcpqspG{lM^ys0px#U*D;9Aa<`YzY&=Qd! z)+po3@E8*oKqJC@6OWu@$r`58K%t>^U%kgsl}>}Z#sqGgoS=`X*-iKH?KF0U|G@iL zTM~>GOj6!gA$;b$@R`M1mmUFNri+1nOIsjP>OkI))PW(dJWA;F&|G0)uRP1IMP;-K zbbMmr9HZ__41hcN?3@fmtqQjz8Z?1q?>Q41`~*!oo0!;ZFdd@1(J0h2c>|2fWriO$ z&vyN>M^HHD)BNio7(lSxg)?SH&^o{KQ4>gI#O0+K9-TWQWS(8kL0LoXEWuq$o9fk- zHv-2Qgxxo|9x)&;`?-g@N`m?Fc(rE0{PzyMhD*?RTB9f1*MC{ZU`Wf~S%g7H;_!+! z;Oxb>p_tQ}#$^X|D?x%{@)S0|^6+_W`at-1q|p9Ga{qyr-c4PTuAAwny(9YWSzAkQ zEN@DzWpLTm3mHD;o+`}ew+$fbAiKNo7L}i`*>;%SU)Nol*`^`}A4&*5lGqdBbz3|# z>I70=eaBAt53AEcJkgc|+s`A^Zf(-l$5Z!VgJVsUv$B~X9>oMlPvDV=du*3?Ee3@o zQ^#?7RT1D;SIxi>!&_k>quT6>X-z%i_!-d9yZ*c`LrAg`Z=En)BVZbjhDxQ zv-@dDts>6Mq+u)gF+^$bTJkX!uDV}aBCyFYVbXrWn{t8`1i3tLf1Ql4LL`ApTFH3X zZbKUhsg~88E)k-6mN{46mTT{f=3D-;(3&8^W(8j?AGdr{7dG8IUQ?O3_HvU2699Gc zsjcsPq1c-Y=D49IjIEb_vNM1c0qlWYeB6e1jyKb#<>VM=_AAIcNM6p|X`e<;>yHS0 zG^QN&kqG+qhf{?bdC8G}uZhT$a%ok;~yd?II4v9allC-ICuXS#4- zcObFsbWua`!=;r?kqy+#$|=d)dTgf9#t-ZeNkATf&BRfMWL*oT;qSpie(~}erWX*{ z@eu#k*>IOLn;yscaL&VA`s|RUJeMI5bXDP=)^ZIP)toKTx%@oHU>NPv0G%{ta~6Vd zKW61`Er*bw`t+IjBmte-r)GwG1#Y?<{Rp9c@kk73$#{$x8pkbNlBC*v$G`kYY{Q-~ z6W+VkNJu?T3(?2OB-69L(I&=aX7dFEu*U!5o##u3Wyi7Q@-s)f~l#ajrLhwS(bh%Q<~8C_JUzNMf{@3>zof{k);y4h z&9#=vEO2O}PYT2%G+}ey43I%P6Pjfli;pA-d-N`|Umw!8lP`~Xk)HV4CvkHV>jI3A z@V^O^nztgx)dzRg=&*bOpzXj_*i<`eWqI|QR^s`9%O4%uc(1fI5H_FadOAV;zH;#5 z=Q+EzTh>By8DxhEho#PGkw`puGf&_4tiCE(+kCHS51}-e0;H!z3uGUim@aP>=^jc= zMCW=A<&@hk-?uW`Kr|xkd-;%4^I@@4xr7q}blf#_x4cO9hhu-bd5~!sx#R`sfMPK4 z1M3ZLpW3)P%3`F>J)w%bVyrG_BsVeSba9hmm(nqrZQwu&`0RdH8q+Yuo1vp1b~2m6GziGrytcE(XJhOwXCpXRE~ z4rQs>(s1!&B~U7Awe0p#$^ga6QXdE(%W|A>ho|7nf}S=~R?75z3WHGhcrNY>J*{E4 z4InPr;Jm`-C9=NsCt}BP4$t4!x)K3`-UIb*)ikt2?&|+|(&+uYon^TgUVQN5JItsG zh2B}u`eoZ5rK9gjucU6#5J3DbvfW7tGkfoZodrjmH*7S#R0m%F2A(*SXubjxuL;gx zWh+%=)zue04eyN$Lf-?}d9%(E!pjSu=bLHMivvb0X4aN0?ZS!%Ma%K&fk&R}?4qEi z>+#;6MXXaDhYErkEv1V6x`wJs#cL+bNdR}C!SAlChY?ATFYql3;eXGt{6_(d}mg@FjiMx)e(}`@gh618xFfwYE@Iv zq#PR`Sd~#NO_?N1V+A>%KJ)%M)i^P~G*kR!&33 zz(B|yZInFRZ!P9CM*Xt3+gG(cgE}S|1EGS`{68aWn0w7S@2~cU-Ieq|NO~dxg?0#3 z)3O68T;7l!E}&KTZilJ%a!nv=U=H=^_C>3Q^m)oYWPk9F$6xoHg$iEA*LRN66!??8grXNUwxKBB z>1X2DJ0AboI|V)yR`B&`<{v}$zRr_p`0;(|BtX~|$`d~**+J_M9Zgp)ANt|BP~_zJ zH&Nkjyz`un*5sY%_)oxcH-s9CyZ3?VtdG}P=H3YiSqO}9k7GqD z({{VnS&XUUWp9SPPK|Lcwh*y&oE>&+lJ#cCxPb_%DTezaD`&?g^-z4}KEe9y0MslqZ>dd0T1A!;}3XQ6yq_gu_M_8#xI8arUqdQ8$`NN8oY0 z&R70<_R$mI)d#P5>#2WAJbIF$6Dxv7$O;!zj^uf&Ytg7fW*E!}@0pga?rFIam1ZGeB(A!YrP8Isr^V%-G4SG+J#tbdAD+FKErzgVNwY^5?51438i}3xYf?w44w|Ch@ghck*(3;K| z$~So2oPivn5HG!Z{p|7y-jg-^wVdZIm7e+eWN&}>WTx9X_@7<+%Qy3DA|EK3+6dWJ zmcn`Zf*mqYu@i}_b+wReJz3#~twb45rVqJKTZirMDw<)?C1urW-7e<0>Em=DD|<`X zo;L}7!8Kpi>%FQ5DwD<1@!=dmPfiYlA!x3sW`MfPEpG!{Q=(0YAN3Ucb0GT<*6EKF z8jA=Bqw1r~KC-VF#O|Gmkdo!!A-QdP)ZuL??-Tc;N+yktkX9a?9AmQ70w^)*qn3C! zdV-a;Ht1!GgUh=OT`WX-V&*gZ@DWu#rO!S5h2Cg@1feWiN!rX}?bEvXWcc$Zz{>(5 zJc~~HS?V@*koNw~@Qya(^Un2*-ORBBxhb+ox!w&!E=`B|>%c^FOLh>!Wb*|!$}B7x z%3iD~yQ$59)haoUayw_zpwPK@-scO3uKxVE+@rIfjqivKpowOT9dW&9W+-Uwa5tex z+qUi49)eeR^e0bR@aiGn+0RZtGS&O@Grxf3=C7j<%!;cGzYp8Wckhi&E)*rg3)HpSYl|K|+ z0+7LcT5Tial|?ynrs1}MuA+HKY>C1usdnmS?Ab=+Qm*&?4Y)ztoGh?T!DqPKb~Hct zv1%?jY9PBI0S|8OAzhHPuuD0xcRt@`V=$(h~(xv`<^SbaIEr5e7XCBeT0M~!;wz==} zf|bs>?P$3@55!L1S)|beoKddkOVD{)_r}Pz`Ef5G)bp;peOY%;nQCQMMVnOCcNQjR z!xj2RPLaU8^`H;mP8BVY8@#R1(?7lZY0~hKzw6~;hsUp9JhK1a3KcxoN#}v%sMY?K z@oT5Zd*4sZpE&(Hplo)va)-qJzY6{55znnY9sT!uoJBm#l{J5I^yd=#wLf;M?B{27OL|NVQ@-sdfGMEb>FsRdL!v}{w|6ZV%7v=xh^HG79mouNX{Ow{wd?)-MpRmrql`i?? zmp;a+_+PQ-#6Pa{FL?Hk>-=vdg@0Voqqt^ z>OZdYkLxi0$vS_B-}uLM{&AguT<335ga5eBKd$rtuj{fuEiJEw89L z@{=2Tx%M9rmxlL0b?g+)e_dCRe4vfbE-ZvR;ugzqJ?%9T(Wj(Z;*qB*q2K!Cf+aa* zo=^FM&Pbd;x)UrvIiw{m465YE@1@s<#Uq`Emj-6rMQd2Ma5u25^ zAK^y$U=bX@irS;65NcN6BNZC7a{8R_JspXllsy%v2TE`4`W*%A>-&?vTABY3sKt!R zyFL(tDQREP9o`Rd-kLq}!f-D4bRh~=c~M4X2xX2#4Kd>18MvBrXJ#_o;Nbz-?@vtw z1IouP2#Y6D;31w`bq}Q$+4Y{y1U2;X(LVNUT}H5RiInbbYd=@Rz3YN-?Lb}czMGW7fx8xeMIlLH3xapB|h(IL0C=UKbN4Eh6Ox8lN+BrdlhajDU)Sb=BVFYJFy zdxMRC($Gi$6B?TLnnq1tiElNw;@X6;T@L$p#q3_Lm*863iUz&WaTLa5!~u-ve3(qA zdkc8J*0@^~52bGERK&dBW(uMkRF&*`{7B((poaW_mv;LpiFJurXIf>*)-R1J7J*dj zRVU<7w4g3BVpp!{?^JkCHT)tS#s5C(xM1mv1p8Yo5iwVUdi+Jt4Sg%`VYPDQM$8#2 z>#GMnq*o3O%BOHIIog*DYP@V!%#A@a2N#=3c5?ivibp%{5RY8)%IYGKBC%>#ccxxR zzVasO*7p!!X(JY{Ff0@F&>s=ig_~2Mecy*h1+Q zO%2HCQUomk(t}>ja&l;QERp7_0?HTSFFxGL_s^luura&V-5tEts=^IN9Sdzxs9Ko6 zVm9#M6@H^!W<6+k)XCa=puHb)p-J9rMKBEe{qit7%U>7Yy}Y4JPhA#t@v-w@UHUB% z%S zjUh6F1r(r!uf#ju#N6@D?fa5cv1X(t0oN&MuUkb>@JQ~L$q8U5oMUBSu4w`9m`{0k z|I~~4W0_b5OxS^YwI+8}@5Q0ktDPsth(JuKrsFWvNrU5$H$>XOgHiLTd>4;Ag~0n# zwK9(MsIJUt9uj#e7;KX^L1|s?0nX1UA0E;^d43dF52h6Yj2fv)hwfp!t!NZ! zY%M>B(tJU9CfYR3tg%Q-FkFwd_epqB_+&(t=y;?%>EvZ%uW@0iCZs!q}0k9RyKuw96%5++ZFgy%9~uo+sEu;0iltciJS17d72e5SZarqfUP=C zKd9?Fd~KIFzB2ZmB~#-_17a~#G)K0dW>WfKDyt%TnE%H}k=xRqm<8)bLtE&k)rSyT z6$BDgv+sGYGV^6L%;>B9(%2R1{^r?nNNd_)J2Zg(U3cuX6L)Wb|FTw|dF~~<_5NAm z9qm0A$XZ)TamaGbd`Lh~N>Q)!YxwDgW`#Z%cI3AT3__%99aoN$la}->Zb*2W*HM230J@Nwe<;Ok-1HXY;`DU0RT8t;)q~;OlQLMt~>WEVb*9`j#}Pi=5`7k544GckbzOHmq*n zr5eUrue!eY8F>L)n{OR*)o)^KMTdPD-Yp3YPNN4Dt>La2I21V6S?@}>=S4b;KxHp& zw|~O|50;3}gGTDEA$JH1V=a3hMwebR0R!)m6>g95;XbH2{e)%_JZQGNd$Tp{CdeZ9 zl}O3?Xv$;-{CxH>${x%4YM(#Tg<;9oaSo9AD$Vb{%LezoKZ#M*9YTy)RtFH52dqMk z@?NOLiz<0Pw4HzZ*2Q_DlTBdS)(&_SjS3xjcsK?ikASfh4$Rc0=i`^fCn%3obnuY; z!Dz!Sp`BOjK#+~L4W;fbubJ+E9B}D++jz5vv$L^g;Y7dxz6^Yw-{|{zOAJ8FZ>i!+ zZ6Li@e2$~!*{=!clU}`@O1PN17-_3Km-S+J-Mc?NDF0zsaapXT*QmMkv@5R6vdY^_ z)FMZ|@+dpkJTB4#6j$p_VlJO?p=;*OTt#Ijo5O{Vji##&o%o0(vpc%_kdTD=@b}kf z6x4eygZ%t})2{q9S`;j!J6_zA(KdyAGkhD&*U}c(cXMOuff#xh620a3HGLQctJl9g zM!OhWT7=RrsnY(qMbuCcnrKVf$P`(&xzN5mwDq9X;>*7p=l`F-s_Q?k^MvB>V8;Jw zH)WO2t>o0{S#xVkYp&QhR7Bg}b|T2(Q3=j9Y*iYbG-U4W40rfwB3ZU}ZcTd{=*tXhAu(;2=kp2-dcYEE%Ij=o>c47WiJ@TL$Qj`0&@2t7*uFCL) z+sUbFf#X#Mslwox{&&9J(y4ED{@*lN{7NRgAfxM=4=fN}0J~6Tl3n-TD{) z)Pl|vn^!$KBOo!ow(phT9G|fDWnfTu!P&j$A3{2$Ux3rvE~Pb_#iJhYFnW9%`Ouu& z+@p6SYecCq@8Xei&W{>l9gLPo)~z9QGj*nHuM6GN)b@Sn=konaWp$Tdi5S(&G2P8| zDMIxfF%QFWXgC0hf7vrw410iD!1k@m|9IDL0te|OhG-MorZFcoM#@K|I24+n0W8$P z1YA)qJqBqNSCr%jP_2raVd3od{Im=2r1M!^2(Yc`0=DfM`U%e7&km92PmW&J6mu=3 zX&myfwZe>-y*Ch=CV8%D5Yi63y8>fMV_b&=0x?<6kuR&$YI_b^&ROI<9m-S@_7T*n zWgNaHkQC8!g*WB%e?lVFpP26W-^X;kDX5@6PtvHDIs6kJ%Fcb^zPDLO5@_@s?81i1`j!ErzYZp&^r|TD`t!P6o(cegP6->j*L`&!sBSOAU$V%<{mxwbqbWLQo8M~1R_Mjy6nDhQD&B7JHHpmXgFK603ax_A&;+PF{Af*P?! zeJyXptk)XeGaT>?Gm$+hVSgT;d{GuB-#b#h`s%H^#MoC;F-o%=`UJ|aI? z{L6Vp-VEvnlPFu7Va?Fwb~!2Bw|rx6=j$_z?kse;R=g8#kn?VMb4=)Xa7q>6^Ne}P ztBsGgw+trp9uM&ZO3s!adA&2{_K@u6>{?48H+eqjH5l3Thw#g<^QOLeA&{}>4W-37 zG#}(!rLFNc0ZH4s{EWKbiz)2lB(=FGK=Ye)hgWO)=;aXVb>sHhofZnKL1_*T{ZCGm ziFhmlryf0)VV={KLl5T=^io%TopMi_?WNdEZ?S)Dm1JorBN*Pzb8B z5F;%)JPw(8nx>xf#xe=<&8w}t3w=x(oW3#Y-+L4@6F`$jh$$1FKb5Rb84F!JTs)^J zMvMpOK#`M=6I+kOvHJ+K0(1{8R*f-%l&E&jgVf)m2D_hZ#E-vUzrt`&aBFKBF^i_OBJ5SI``9jr<+L|qLKGRdWFfVHgSig0r2|p|4SJ9ZY|3Dd_U zHXH=DW(=8Um?oQ^MRiGTT_AS%_8f1g!{WGZty+*Gxo%ioAd-B+co^E8nF;CpRKMMV z9;Z`o?xk%>=S99iyHAgV7Ur*4}%7;Um0 zZhyT~F?FP5Q$m|Oi@%7S;8eK_^`>!@_IWQY@+6?@n8QD zV}^QJ!y3FG(|2NRJ~BcwB5+HT54c~ocrnJpHWF;c-K$vk1c-cc!)7h+hIwBE@6x@* zZW4D!2@M1d=^>tE9Q-eI@+!pQJvb%9{H{Txe(=Y)HNIBz44W^r!=~?i%}8qX1S3TQ zZtaJI+`)np*S8_gB?ooSX|(x7j=bfpweSCJ*17j=|AuH4f?axNo`(tag*Xr+VLZ^ij=<#Up9Yh1#~FpEn%enXOx7 z?n{D)ly+f#ug#}cFYF;IMz%NeNX9*kEW|h4ohj9}I#TPA3#)}zz9rO)jmL3QASUdh zLA~(9Y4(sG7d(S-5sq-5@bKIO&KaMbL6JprgBfguPm)Wpbs#l~DV zShbM?24tBAlt&GQCdDbgA)Y{g-l-z7S#|;|bGr}ent zyiY*?eQQm_* z!%#o%Pmr;fm#hGvU#qc@s|OZY5>4uBT3(E^b0I$Ii8@V9HvJ?{S|IE9E_V{mqS)10 zn^FXe88$hriuk%_CSDbuE!@ANmaMGWyn_>pBPG^$mQB#AqVR+{cdNdvJ)N72@YyW2 z@Q9EpO03V{m8Njp$kC>BLM)3iStx(E-J9OtBw_WwoGE?el$z<3RQzQQkC^mdbz_M& z3p9m1W?kC3hG5l)neF7Yug(_L3bYeKi5rC|5EOFDUk2ly+FbPM^t z{c`vp4|;~}p$BYINh7Unur>~wN@&XEqP($8KQaW519*bVuG5jzLAmeRkwgL$@AW@b zY5RfSC_U}(bGSgfDdH)|{W4NJ6vv}Br_iwwmu#g~%T~=tmQn%u;1~Aj&v3f8aQt`hLuX`}DvDTW}dcP*6^#~qJ zxA%gT5z*2|0s|(5xMge9C`(5Q0lT}}5fy4sagJ59D!A}{tz(s_) zx8Tx5+h~YT@pMc|aihNFUuOxbb9({J_rM5@ycVGmZ)|tCY|GZBPbk-}yCW3f{ZT|~ z=*(YNcFNuG4_e<}AH{$3#83V{>#ywlB~dyLbBE!0p?xgQ&tV-dIeU$DUXKZUIlUSa z?3_H<76MZ@L)Zmtc+*2>Sl>7F=j;v4KwM8u!F6cHT#VD?1Q~FcWg|KWKu=${a>f@+ zom#2V=Rd!ujH)SlwOs!!=t&GtRh3A^pMbBQ$$0w9P9vh;$0_twgOCaFVI&7Q9W*wC zhRh}EK7iGFeEvd}Hxs0*N3llCw;uahGWr6Gus#cQ2bGS~>4~6y8`#1SNCqB>RBCg< z@z%A5y=%4;RFfV(L4EjkjSqWQJIQ#q;P||)*s3OA(+2@8f_yW=gP4M4PylM7%goi1 z`Gfigu`Br(TB@4tye25JS?=(nAoW`gNKA0MnCzzqf9M#*(^CGDQU5yka{e#+=6{L= zNu?vGY3pIRUuIqcr|7H}Q8iKT@esIVl`HZ;^FH@k?GkebOYGjhWf%WorUSNb8GKd7 zv^q|g^q3Y%N&~ z6~Fe~zCCwkRcqGZ3d>p_3NQyb1(c*~X}9`F&z zWkmZyopP3!BT!2z)fo5sa^c*G806J9vxvu0wR)4FX7T-B`r~Vt1=hoDPU|yv)RvSv z4`v1%z0k#6I5dtXLag zaTN~riasy-VNly66_%&uTvg+?l8V9F25KucF~WwkN_$!du3r)$nFc3mn*%8xGTj_C zY^c|*+uu+1NTUv0m?-7~j)Y(Sdy^_V%tDzuKX2FlvZ9LKk=-=9(ql6N<}z5Vlb%9uNeCe@(vd|9lf;)etH?pOnOc_=tl`~JA% z=Xs;|qU*NHS`b~_o=a4)heWaR;_4Ete{+71N(?#332P3T!D0={-K#lt7&=PN$c;L+ zxHab;XP>nn$JG(|wEb*uEr(1C<*t&f>(}Y@QLK8OP=Xz;7z?RD?x*ef(tv(l4&ovY z=dF>q&f6Y(W~p;93r~ghw>uB!e9nf-4rg51t8j8XJ;WgD=?AuuwW`vZl@-knIqB6+8UU+Ydzc6j~r*VwQKU&zSV7(|c3SzGD)}@AlSHyHdd%{(`VEmOftH1%C%rkzH zK|@TO*j<6cGc?Lya0>l+)uBem;7DP6mdA}M))<~L+Xgc zPzz{6Z`N_?6dAdAA9PE_Z4omM_T`4VyN_ksDuHO^h5dWu!~0pQKtvOW!`M&xsJKQA zP5TPt>P1mfLDWU(uhSu5DeVh`b9?Xc%woxeMxFMFvW-oR^_kj?6$DAj1~|lpAWJly z>qRuOcht_^wR>u5y_CBAj2dI*e@nIPV8&q4eShq0g;#aiI9P9cUbj3~&m?fWVTS2W z0bwVrYnzz+UXopBy}|xUQ%ssuF=pLQs6bpKB01Nwa9iNVkp5-=i7Ayr!n#AYO(jwX z#0_2Ms32;#)6k(LXXrh=YiYCK+7l7l4l!|7e59pbu6DlWA1ceq|Ho$E|N39TiQa!r zIH9^IO~gE-EiLVRIk)3Ac8-m*RqGUP0J>#IgYZ77Nudxeg;|(=DRb^-)AdHzN5tuYW{m_ZZ1M%)8Hf!+|FnaO_V&K!Sbot+K za$^5q5Ru^BZ+C>U5WnEYxoA<|T#brvI@DNjh}|r-%DWqOk?URULeuf;k{Ixa8r!}< z>-d4Mp!dZj+Sq$1p?y^?H(qR)qvy0s52w5lVY{Piw*BjK4?X1kY146i%xWr(vz}{X zE*lE`s6E#4LzHTkOsG^jZl;6KRRfHLrACV$b_gFcAn%j@#fholIWgX|-IZk9uEGsE zA=9A)+w0+BRlNvhb*o@r_M%($#|+CF{BJ^pcGm9*YOjCo)oHReKBc0+aN9&aMGz%u z*&zjd)e2I%Ek4+1mhl4uzPcqIcnI!AOnfQ3^hj#RC_5<>(?JM%3v7D$^VAsB{|1@{ zuk00U@Rv+ffmo`8VaoLoq*O&*#bMK$!KmEI&>D4ysp&WOqPzypgJ&#%ehGhJ`WO4V z=6}m-arDPfN-m{M!E}lDo{A!Q49q zb|ne;1ycoNmqUTSR`9d^BWvA{`UFsEgCRcB`P>oh*;(y`lc9+fg|cn>mf%kQ;sww~ntbxtZHaH8=i!7rKDPLgnR?G*|5=U9Iqrfx zc7|6Mn_<8xyLnk8t^#$utOdsv7bUkC$VJ`esoe{UpQO0?deflNqqCac)dnzGFJzE1 z*`T2`p6U#Wnt!q%AV^+#B6`u=O~sM?z>4JIeS*&_%6%3yVs>6*1;t)+6_2XAgv)g? zYdeW%v??+6?|Ny)4ENtGOY1?d3PUci$=S>?@boxm4 z1HREZ^H@99M9#$;xOH49RO5v8^FH^*pq044yDm?PetG&yaVMl^ZBD#>?W{gULv-(t zlxDr&Kt zMA08}=pM}-4@TwC@6qU1z%EMG6R<)54_j^4Z|64Q(@T!n|FVtbzxNFOe6;=L*!>^V z?*I7Re{&W8<9Gi*H~IXJ^YCvw4?|tw(eM8{nogj69k$vg9~UR~`lvbsAZh!=Fr{VR z=y-PhL1ll?dUVkb9L};8HBV_(@$kmAjvLoXRF)eypA=2i&?!oT_MvWWK*!|@#?4o3 zy;pyS=+?I@jdPt&J<_o+=3lw(N{^NXU+$)BITAW|+p2;T*)`Af0}vtvOAU*cF@uHj z(?uPVF=a~`^h=4F-V_jr7vpPKa2XF zO?%;y2!;Q7kvRo9Rida5Xw|M$VIG(`E%lE<%U??_@=oSM{^m9vdICOQKf$eholwM1 z?64l#QoVX>CwU!+F)3?)B_*5gz8QrjhU)s2YPWBltVH>9B-`?H={#UZ{D-vu@pOA) zD?(q`)Wh+u`xCO4pAD^FPuY&U@|w?c@%7Ih1UFOEj2=ITp#Lka<9>etAnN;LukDhs(3w-JaH}HikoefIhFyFS#pV?>57= z`k2UqK8f#K%-(Ol5vn%Qf&8)G5kGJmLcPrsmHkOa@d~@O6U%=X0&M@2AzUSi5r@ z_>blq(4nrFfxz9>rXyig70zwAS=eZ>DaLT)Kku~u5>$Wt+XHlb ze+DLTS)ey2=}2+cyRNInDhh+mN9vkcE5Fe-1-(Hxi@B%3nS@ggkzxBY$|?08n95f4 zH1XkeO6|?_o>Fyh;imbeGJl-%`IpkcUjs;+PZf4AYDXs}@~CK(YQ{sI6O|kJyZpPA zW{x{@$6}7+1KBofz^^^pe>phGt(MS>oS%lQ%RKh7S-QvLx|&E6JC_OU@-}&gNO6|c z{S9B^0V0i?&3s9PiD$PPgn2g_Boxmsvhw;`aU8lHwYX1t7fHF>jU!M-ox!bLUK>^_ z%Cdul9><862f9_ZGf<7F*nV?I>rtC?clchjaSg2%a0^jej&yP>3ZJ zB;R3R!=F(ve~)Oc{!0{8s-Nek+TkOhm*jGZp62;z@bB3RZ^pFTTl^a-5cXF7m@E0~ z^qEiU55A_$rG5V;AZ`AYJkDy-QWf+0_x6Pj3*@)NpUfKY;T;oK-%EbzyaB2PZ(h{5 z0cMNoSw%p&_nV#sN9H$uG9wlAK=iA>-T9s$vDMBB3a}j?8Ycvr)oHlhovQLkJ((w{XQfXu zpfgg;=Fj?vV2piNe97ynTx=ue@;F2gmrymRcmKgC;bq>zfI)_0%oWj}g*T9gk6e!X zE=f#cNW97HZ)Hs*-$MI3pAxXm5*;-en;l0xP0_ymdXO0FJw*o z+L_iz?MUq{Zr6U2`!lN9M6vnziguTWcU{m=C?KnOD@N0#*yI?ht=AZjMU%B<> zw_(ShtnAY9Sg!%}ba_#gWd1wCT@;ntqk%xz8g1%H~3j%CCW z$W$uz+J(Ec4^flrmyL9Kew(Hs7jAu7AYA2pVBhOG0WmCf7(gD<*Y!80FK90RdPeq1 z{NE1WYiVCA!-($B?Z<5gt~-|#gQShd6t6!Jv$&M&_Gmm}uccJFf5`mcxZn(}k$*A- zl|y+#&Jt@3$@ zrfE6q}(^V}?y ziPkuLW9yd!>J>e)9r)n$;oDHj?}_qA5(kvaskUcC{&G^rd!TuPBvu3Q%J! zZ~SAQz}En6U=!eHi3z+|n-+Gsk}jV-UMGo%bQnrJq{DcNpbzZcDhZp@tEv<@^srcp2Ij@wTTM;L(4CuNlO8Wv#) z{$e|cOihov$&7{uhW%6f&g1LS?SuuQiKh)WW!zFeLOKM5X+8>VJPRz$`fc;3YcM4A1Xx`h~i1kw6-UZ2?4KM-OiqGii* zhAI7-s%wEEY2Og?G-sZ@@P}$Ap7Svy2ja=;FlWcmf>sT-GN-AwwjbX*C+paHmW|rJ zWgGd?e!hC`iM_>N!UypA?(6>|eE8=Uy8$r-H6-+b?QbzIb2C0vO8I2UNzkkV#ht(f zA;Ex!vbxLd0cKc($C6ex9~#)OP$VFLNf~5Sd3gI^Rk`_>kTFFm?Le8@@C3QRwAN*S zYE}M<1KpJ(v#O?}8Zh;_Q!DVMTFMVJ!ITM-q;gUds+-f4%y)7Ut8ZoYz^F5WN-Nn3 z-xWbcgW^$C^Guc)kDJXs^wdUA=V$_|@A+q}8_Q(AM}) zv2L1u@1YLtH{?V?Mz+c2=R6!IN2AtiMcZmGZjX#5XX4p;z~#{~KKYBL%hi+JGE)~3b0Lgi{Z zRmS8ivIMtWhSh<$7{-n4?|ZMfsv(xQ6SbO)F+VnS!f$Um+%7IHP8F?iT==nB*>e<13wTv}fta{8T1y<%v5CRwe=aZ{CNxX-5PsZ^@;G86ab z@5o1&8uu%xP6K8=T^*Tq@hNz!ksabm%VZ~(rS(eh++k+3FJT8reK{Q9bu8%Td(8nJ zJx!A`V5N*Agw!@!Bpmxw5-f$|5&ULb&T1e+ae59m3`MV;4~SI<#VUWUMf&+CrVLiB zsvLbNxi_^xT3CpvL&?sY;~s>88Jv#NDC(=N$lw}I_VXS)D=M8~OTsaJvw6qxc%Apb z_`JD4)9vDzbAZ;P@@`C-xq6Izk06WY}^7{ulkug!=Y3?KG0-{&v@xyI? zX8HA^sU_nYPUq^YX7|dAEU6;jGGG{v8ux;y$0BNqQ%^NUuPi^g79c)@zv^4j|6wHX zy%}8w$YgoYQBDICR2 zO4E!_)_*xWqEBph5yH7eUOEQuX08j7eGGpMmwT-1RC(MZ1Svl{T>38ZtpWHt&s^=% zvuq>%(>(a4_JJbk>8#sxvC7?BPYJtppOxqfNu6c96SJrDX});q-mLWQ`(uEJa~}Ib zp;B>N#0QuG&hw~ZV}L8cjPJr=IVAZ~b}a3#WpRO(6$5v4q^#pgt=WywbCEyW=utZQ zGHNZ)FOvZY`h!e$jBxa*`VIJ9I<`Azy!{r@i{{Hg7x94Wt9kmLmnbOCZnL>I>-rTM z?L#h^sfMXT`=q!Z#ap{fmbA9(f<@IeR|{qP`Qh_FWuroJLK9Qkr6%>v^ zXAJu{yMx<4a*KA=a_7pL8>D^Vu!g$AQ=Y{**H&)NRD4{IrB0uWWxrf-bJ~PA!rlQ< z&85HGAg|1p?+9H!)Z;mraXJld5uZ$NwGlRZZJ87!8_47ExaHs?nO-eppIj{?;yd|D zGJphHlU|mAnYjwMeN8Os;p}?;Qu=})D~*^;I5y1OBqy~U+0g}hR<24ZYPGas%Pp9C zK$nnuFu{`y^_zb1T$f7ZxK(jDmZss!N+U`XEtoRti?n7-y$x`)_CRemmF+@HWs|m(TVzLWrjn`Cw^4UStKjkw>8BAw-x@@A za^BCj9$yhCcfzL7yFC`xjE{^MX^@26%09>*2T157c-M?PI*DUDFC z%!Gop6Ed}^=%sa-ZjSt0f2e^zENU1H?NN?!&nxOI=CNHKhV6*E7~@}UUN+l-ZvR3(omVK4y;I3 zeLD}Uu0nLhg_lv?+Y3g{(%%O)d^~V$jh8n0rPf5b4A^M~HmQTKR^v|Lb8hwy_hsW` z3~~Wg^;rbN(iu{Pxdr?m#974;zW0x9nR4m|Q>~I>Stx1XVkb?LC^o6D@4s)KqGlua z-9&Wz6J2*3lpkHBTfaT&u$}g*_q+q%dJ>+Vy>AisU?x8ebN!hIFZ++5i^n>J&sMU? zf;qe#5T~oM-0SRt2_Eg{mqc^11=}RQK+k}(2|`OVPOX07QI|t!Gb|&_<|~J?QE&C! zIZ|<&4Tkvr2VY3pNa;t8i!VU(iv0x1)KZUTE^(i=QXbdUzc^Sunm7fT-Pw+IcHQQG zEZ(^xmCkAP_LCp-kx#>h(;LVY#rz4?3pC0#o61#ABr&3#F}11AW8*7qfFki?l`;~; zWH8$(y&|1yWA{MgBriyctvEuhoN5Wj+!S+W2y=}vb-JGA-b_(h8Vm2FA{$S z_R;ZO7(O?jNp!v}3roj!Y8T%1hM6E&BGi7di<^yh7V*DTPs!bWS1{FX^kq-C_nRqa3BUY-6sk9JzwLl}W4>8X&CAcvkZ=X^+84h3N`0 zXmi#cL*w??LvSe#I*<1Bh-(nx+r*{3z!1%mt58c&iY^M~QzKYW+^uL8mlRen)bWgq z6;{4|cf1=)4^O90?+ai@TT9onAl)3#475Z@rG>77EaTsx-i0?fr4hKs>^_w`*7er2 zW`1?{yCi*iioeHk?&CP$N>>O8ae5z99?EzDIDx33zD?~l9^DlI{bIl}1njO34>0twlaS`#U zZ{IvBd{+~37->K~$n#oPF)@&3giJJVzo;h?vVF2M&?#TnuR2##?(h&zS;!($7&X+C zkm}3rMLP9UTqr@H1*qYJQa`|D z{0`XJE+2Z9*FLFR*pfY}*Qs75Pmh@EFSVam*IU;xEMmWT^5R|6?CRP>xxK&ymm2?G zqzi6pGP1{+2A2ateGi+}(Hvca;k-BZ*2CV^Q+{`Y(alBqoV1{_d50(aTeH7L>_1d- zOBrH)VXc)XL3cSk-HQUm4X@6SEaJ##>5tnj-KwBZob9B|$yL1p;mv%i1g1L&bHK;Z zV*NVt9@8F{wDBpGkkQXc7t5}P!b15&;2I}!LeaUDL_^r2FZ9$$i_(AmsfudMj_T`_ zm>F|b@0jG=z$3l`B14%jHp&ZGUZ;)ShT&`*zVV){&5ZNqR|y1dD)w+%HP5D zL8EOQF9NPGd^g133Yp_}>p3i~SNIJ+{4%@GJ?Ip6&YHOr9(#5dS)y+If1wjH+Wzq6 zNdZxE1E>u0x!EuSP-RUhN}gM4cf`0q5&Sa`P`C+QW!r$R+KeTXnwi_X?$Yqxmo2zu z#~*cEnngNF`bbzE$+ub_2P#-mXv^lz$e*zsJ@VZG0&rcoZZA31VXVxM;(LTpkxX7p!1XOg`i}yld1aSB@jJ>!+_*3+aX>jbRX`uo!GWXt4VTpDEoSHN;gI9rY41r{ta00pN6%JT zfj&F_=HA9Wc1=Y^M*Z>-j?Z+F)?b=dR@9FdS^|1}3W4)nzf8gnHFi|TfQH@D)$F)> zXPvX$cAB#H)7zKp+4DQ}?P0m&>p2@>DlylPlF$3N^aAYHjb+9!ImGmm(V^yynE0&{ zvAsvTt981Hc7;fQCjA6&j!+{)-EF=l40J(=w0c{c4;76XK7(3?RYlGS?9hA%H4Wfy z;o2EZrVz+3!lAf6xx4-nWLMv$Dg6cN>Hh@k*KS0b**~2K{kX;qr?7or6Y0?ub^nY@ zCx>RT7M2_xWtLIe%Q01JQ1f+~jqTBQrxpP1k&zjeKV%Mm`#jx6Bc=5I;8)>52f!r5-d z`s*fLX4n)#;llfr>Z5sEj=N}Twues$dC#q<69MzU2O`*B@IW5b(@(F;gRa0vqF(Z` z#QG;%!VTt{{plr-zt?PNopQH5QK#qKN91d{TKpgvR(X7W*wy(pyZ9FM>z&pkPAa~; zQ8G8-U&C_Ys&~`is$8m|%?YqIb2DJLS=-znpo<%dW$SD(c$zQQm9;E$OD_QrnG2S_ zB1^;Fl=!80!yTf%d7O@**ax7aBPr{zF})}sVWe$PBX6M0h>r)>h4i~jC9R9~AhBE5s&y$SIV39-jA`yv z96Qk-9}yC@|0e#)TM;t~9pB4LvVpek(JbNsg*B=zJ2{HMRjiUj<5mE}zhdx_$YHa5 zedSHh`$xPqgc%jrf>8mdwJ)Z`_RmPdBqmiS2hlaTb-Qj}`#YW<5Ks`xtp>JRfTGy0 z#;%;^x5(gc`NI0-6db+|L%>S}bu=J;q<2ecK`F~4vo+ejSCLiPP;g9YTi2C ziwLb!PS{ReW3{Lqm^e)xY%H3XQ~fGB(%Jv;3(!q33qkvTTc^q!#||1s}6qxr`|8ECM&BmM>$`^9l* zyU4v>IJEGLPvfuZ*)OR%UU>{-DMy5t zt{LuC(K@qyRs% zA2~p*C_n`cVYDoumvbe?TT|Jo-1w6E>h4y_A;>{P@9s=yo`LGn?5^Qek6k! zwpzn-*Vmc$Bx2*{-83*nu2bHQK1YWw6r#kPPI0~>-NX+_dU~ZsLT!W-dQ;b%M@s0~GrN<-hi-HH6QwlPJ`?GNHK;GiJuH)C)|hog zPkjiNFY5{~v{R+8C)CKgq0Os&ws5_vSBXPkI&PPSs=_-JY~!wGpeL{x`7!ati#mff z4E##}8lb`m_#Fw#z|#oDz)zzp^=-sLV@}=1P95gQ0;STOdvLCYPsHWqo2K_WmNBs$ zKRJ*2HPaaxX?yL5;RM}h8Q8IT@(MA!B8u5g+qUg2t+y%kQ~0Eh8zdDYwcEPf2=I`4TpVBVMAsZHi!_3~pDV%V1V##a7?J?G`hB`lEH+ z@9JFU3vDohThtK7U~Yfo#p0OEvzdhuXEDYZ4yZ$9x1I0YuI9L*kDg!y=!I1rw?c0N znzxg^^A4&}=j$vy#|FAM$asLImflgF1o}DKZJZCx4GdNs_YM5)ahl!L{7k#b<_`Mu zHPQdC*a}O4s3xHgTh2~{$uhC#G0Qr3)&5uo>2*uJ)Hw7v!S5qSRAOo4^8lP6`6ae& z1FDpcNQ$(sECAXmWXdfvAn`IDx#S2>n>DhWLmDkSMC52Vqxxk z1B}gtKF2Ro(f}ddwkwtw<<#Q?Ktfq=3+iw zp!9OSWa?X$=vlh$NqG4y=4<9rVl#6v`4d0SPet*Q=K9T&xVEo+i6+xS`i(c01z(6g ztoV}XxR{+-z&~W%8mAKr)IpM;DAtd{Qw6Q#3^c-3=}zY@uMb18g{b00vy)aJ#F9Kb z3LR{AZr@pnDddTIv!GqaJo94kNMf<$b5x(X<64MU6v}0ovvNFi+m!vWOb3ug?$HyT z&5DUzEZOk4YcjE+BXJ+lgy1xjDcgHoeeOk_bi^Ed_i)!#I!9^#Dv~8Np*Gm*5`*wD zvD(TPFlL`#BAkZJ#WW(06w+@9OAS!dqu|58x+wH%ihSJrM9L46FI{g71|JS}0-R4w z%_wK1UP0&kN?6JU+9BtA#swlUC7G7KX^$QU%|s|HEWaMaF9Zldl)mCB=uH36F#BeB z|6_Iy$HR)n9G${V-KTDll>MuKTe#6_wzvjpr90%qwz)uARVF6DDah(%+g&?c%DLlo zG>5w%jVu`D(WZ}Ea^bFitMWj4Cn#uB_A`!dI##6=EP;W^gXl%u=(xf;B3|lSN~qMU zA8U;Se>`*OxI-rjULvbUxzUMB7cA7tj_%e&`B^`yP)mscib@Cu;cahIrC2+iY>;|0 z<{gW|=z|&BX{MS7Jh=AoyV$-yrzCK4z$NZSF_d-7?Hj_`75Luu{r&u4R&VuoA}x8l#JBvR?xL2fT_lLrQWH`LU(HHE{e>#W=cBBI?Qru( z#aMv*P2p8t&Wj;Bw6?s_EpI}H00)?mSA^MP8C%%!hrvTT)s=InLxwlo-ZkTQIKxI6{e=2gXzaMEYd@BDoIA0w+wnRGUoQFCFd@T zY+Q8(ohG#^qAr+b^KeW$j|Ew2P){w+b*Wjd1>7#Q{yBXZ4L&Q$!at{@tc`W)Z5b-| zp9a7jf=zHa6)9NmKqV0s_X0lL8@qM2}hVlp|Wce*g#vK zWJ2J8sZrDAwtiv8ZtCJgbq^f*;7>?u{+h62!@3+ktQ^p1*lbjj-*^{)m6jF{uHWiv z=h3FKKF`|;&|RFSyY!(=q#lidtsf=U=F;rooyMnzap;|HhES;pdluRHPZ{(K_JU7- z(<;G#q*b2zG+a#n|9XOyD_?1(U#!zDd7UwNs*&k@>9csQv0L&Sa|u@4v3f>W>dMd7 z0xpUUa#_vfxHKlZ{6fvKA6E%k#dqVRDBd96)!EUPXO%^k{Ri#-FEkvoI!mNlUY6`c z@@htKdfo7F@svnJ=~OKys-I=##vMs3pSYi0Pva3Fw9W(cy>okYdQnyE^R~(R_F6EP z_vF**#E!Yv@Q0&s2%mE%t{!Wao>%2N=Vu|M^w8&^A+0UZ= zt>5vlh9t(FZ{N{JEWX((Q8u@^z^P_=u70_l~O*z zI@P|Ecj~(n3n_}`K2y95c}iRFA5N9UeQQ@6`2IP^$Ko7)RxHUJHi-USU3x!v4rF9RrA1c-e^A%RqOL0M!WwA3BMP=LH2o==IZmAqYJ+ks_1zCJeo=O*YRQq-+X;B?YB_^pR=g- zZn+x&IPE@oLo-rrlCt~UuSp?x^DQsRj(IgJeuJ$dn74%a=Hi1#>>h1=*b)Ut5Zv{7 zek?5YE@@^0F?8d^Tx|S-Fi1|g_My|D^u|3xIMXUR%Q~JMerK{`^Bb%*bYqS|U2Acb zgt0j;7xm(QH4VK~f29vkXB5K=^-`@Ys*BkKJ4Vr<3? z9ZB2a;tZ1@y#j~YQkCXn?w`kYu(K7(_|q3=tJ|>CLr#ksmr{PRP7xTp?*gFXlT@Up zZh_u<+SO;-FSWuv8YS&woQTE{mM|f)gsdC2be^7n9c}DkS;a0^_`dhh`tvD{^f6$r zvqDi^0pBd>Lw<1v#I1u870X@KhJok&DG=B%kAkJT$Z`4DsbaRr!E<0YrB-CYZEe2l zeA{7J0EDVF1+W+jBqxsH*=$yq(`*xclOOb~IZQN( zJu~acGpge8`f>Q-swqeBZvJ?+$6foS~Hi)H% zqn)VMa25Tm<85sBPzJI}q^Cvn>cQxUC=#X1j*H0PFjN@G{>Xep%`~}gd&L8t=|Aln z-eAb{f$q(3D&$vn`#q(v=ZN6TJP48?bmO%DVk1RVngB_%)&`EC@5fxg3ii+Wlk422 zE!K=!bPRsLs$Xq|n(=y=%*o#=%`iz6d+)mRU5qXNsaJ%>+ggt;OdE|@QLcI_(4d57 zPDaV*1^}(%25ujd4{RTG2|-bp?^(-z`%Xr^w0c&wc24{(-SaVPvzGMttB5nruuDY? zp#E{Q1&}mUl0cTn?=S9p@M0J`Yh4zEg{A7xg4NKA}uUJEq*rNYgj+(?g!Q7&K*> zJpXBriiKdzJyUVt_LkmD)ZfQw%}Ln}GX_k5i@jpLT({zz%Xc@qA*<)5-rU*jjtbgw zD<$y=jA8Eb`7+n@=KKA{Onc!%C_>!{CtJBLCyk?|_GAUa)bTt^@||O3!NOV5V${U= zDB*fTst4LbQRr-w2j<-BKix4Wn%%o<;=^{5d01+>_-vWW^9{|j4`~NCHfz{Gx|Q$3 z1K;8!KhOF%594*E>Co?Q^DsA_&*+6bmX^*LUj5=I1t*|ogm)h6>gF{*jiA3Wr=Anz z5IDw2juDxpQER=4;hm&Q1X zKlguaal060hbjIvZNFH$K3{xs{ELcBwBW<}o!vhBqM2q=Eb8UPe4VWcOaf^tvaro9 zc^8aP>h{488cU@6`Waj89;X~&lSXn%k6}I-BW+XY%w)Z^uV;101Z#~?we`@#KA}s~ zvv6S^h~!vyGFSiI`p0Q-TYWZt5J{LCQm|F-2i$la63_EfO?BnuYrwj=jV12th*kw( z?e^+8FSyA8*mtbTJ9N+$!*@rnk+sx({cZZBXS8@0K%YrXm4ldyPW^YvT;bx3wI|l{ z6i%k(|FkRfCM*(>d#sE3^i-gmW{X3ECuPwwn}t#=2FByGHfBj9yOYL7cw*OpDnB+i z9~r_sUk3%9&Y(9h)g~hJJB_AG3+6T2(|@oc-OyiYrXkX)Ra<+|MNqAF^uc?2KYm^H zA(!eyRPhye_(#BM%Mtv%Aq<-NX>jkcMT{*yiLuhF+YZ^Q* zh}>z02)?)g<+TuU0NZaxCC~e4AN1<0^(^94L370`ZsSLNwHtBzh<>^0B+;tzKI@M@ zOhegiSn1e%=2=7G@VPnlqxSF^Sl4E%qsIJvrEPOb=E%kAhz_#6Lv*Ch+#at?V#_kMz4v;O!>~W(&QULlK5T=6UXmWma&4Qwd+k*6LdRe zid5VsnXa~#=ts@9rY1V6_&N!WSfkOIS~d?$=g*1uJdtise;8}bIz`Rx&Y?&(+8u67 zCz0e?#}(`sZHY!*&0RW+(niE=odqvuu3+Q`eMkz!CsU)K1siS#abFut?xyVMx*$$P zj6g{!*F6^Byy^(MiBC5E8Yvg5l`nrRB~?$d!1k?8jVCIu)}@_UqLr`bujFoQZ4(x&no8fp5T9 zg+ZCLyzEz66uZ)`K5-~cFq>IQuH^>V8v|b#G&5HpgV@iT$zzN2^KWYseqmaDCa$*>hp`aKByi0j-L>*CfX>k`NW=6Z!X2X6DUa9zv#Qj%_v7`>$|FE4M-oK~9i zoIe{gaA(g?@5LK~ryh1oqY`39vAX|P>ht7Gdt6)DsS>>Q%*~+A>0P%C_b19lspz(=w!!g>*)^`L z$(+a210kGdna?-1UUm~iVeIGt1)kCqN2AL@dK zLhOTI(%W+Gx_xqRE_>J~tkkA23uE&nXQ=!&>>?F_ziL;VUYftq!vFQRWu*4=ph(wz zepm}SaN5Oyc&eLElMg$n>-&qK~jnAx6(Rq zE?UaN(y<+7KE|Z@(S!^Sw*r_#BsuqJA!Rz7@0ah5(!&FhnWKe4tbg_Zwwz?sCq9Kf zR=7sq1F{-vKIc;+z1u}hZRC^bvW#^=tyj%^JnqaNT4$QrUE|@r#Lp@_8}2fTX??7} zA8PJ`iU0UoBsG@^t(X53_CmM^42zzr`4JAzbwSVVHi!m#==;f=A0!lvdThgro z2?C-bA{j(LL~_n5NkoF=43cw>LN_8wG6K?MlpG}I*aAWmo1AlOazm4$X>Q{=YO2$&E1r~+SJ6@6Ith)IhDJN1*%p3}H9IOGW z{ak7-k7a48`UYaY*f`sl#`pS{74s^%8@1Mkm$jM4-PUx8l-gF=c&K-L!YLZcswoTV z7_{vO1-*KOZp6OL%=9Honv*)b609r2qOD3hi3jqWgS;23U5R`V#Y$4a=pQ>Duoq!6 zz}jz16*=?C6rw6iW_+~D@ERei*Ihg-e~y9;OF@LRUL&TNa_y#9G*BM4RYgjw@vO_Z zoK#aOc0D!WUO@fDXhVeC)wVCLTQ&#lJp0E+e9i1)f13qRnLWzjf->#Vvq27^uDu#I zyC#C%(B&~6zz=812|2LKGmZj@B+tx&;#5qJ^D0&4z>Ar(Ci`yzysY zZV@IE+&dPZs9zuqgK>w6Om~CKy6IRSC-p6>eJ0M{$k;jP7}>g4)gG-LVpGH{yXr>C z)?R65H3QA}-O+Nin&|VY+g_<)c-C1IUrx11GB~XZ&I`KAG*>>8rstb21g_KJ)h8Qj zn_gR>Fy+pVkg$J4;lqBXtaJC6s6ZZBuv=8`%mfPs4vVhUOmAxWnhbZWM=BPFZNc^- zv1fJ43sIc&JL#wX+QXUFK8w952Lo%1RgPLgFYQv-zRtoJ=9?y+0iKSyZF&q-<8#Du z+@C+zyC3VXE{nm1cs*euZ6TS(yP|2F?MkaJ9V!r)bb_kdJQ)paVT?4%6D?%(0)8Xz z3m&hSk+Y@%rmbVy@a^Pw-+O?gg=!u9mBOb4_0bNFGs)Hoq|=Uy_bc}xVvdj-Ga3)T zPY3n4$KjgPSntL!>>lxAa0>9QPK043_j=0ne4-H3jKjDO7VaYQtDNQWFq^{qybACj z3dmSx%kGUe%zaS*zV6c@aAbjg(wTd0!Aezr=c;x6*3JhGoZ})5tVj*AhLP-of(Nc! zqvAXenAts|TTd`0y|#YHzI> zDG@=;&lWaqr&-QEw;Xhd6%s+aX?=P`c~^<^wdi>*V&@7$k&((O&gmv2USJ#{okgH% zV_oC5hG6J=;&`2|wPMSM=EjtYg8XDdUft=N9CHZ0jB@kX4_)zU03*|V-V~&8(OZ_M z%BEiWwiL%G#%1nKXod_!`O2(i{6|WI`!cScI;Er59?ElRkHXvs}pLPu*YE(o;&}1R(=+E=rk3A^X7cs%B@_}do|dJ1+(5e}UsItL{>C~!MMbn*J~B6qs!*uPbYf?J#?!$d zv-6ax^5No*sv%c*Xmw8aimhY+PIDvR^gyNXv_~{=6BV;hb<9>@z>_gD1mIp@wH44( z?OkC_Fu4bl1R1E|J;8}@#HCOpj8r|Lm!C?N@hj8V{iIdM2YmFGN&GMALZC%A zAj|jB6sjxtKYiZ_3}5U#r|UF!%VEtw2r^@eo$J9{>Ru4?U5&9Ug)9S=TbD1u&d_(T z^Yo`+=f5H%qRaT}*)52$TWy(oyDk%al`h4h@~-Vxj9H%=5=<1BWr|e_-@hxAQWF51N|Rnqo1PLl=XSk$JdOPY1Slp zC}o#>cJ(br2x9t-?HQ04F<_ldhYvSp4FOGm{y}XkgE-kD_b`@ z?=uBf9NmxLJ)t}I5d)4TZN?dt>B)IozU`A|{(W_W&j>8Zs4%t#?ow&9Kf3=G9gCs2 z6wsyMM`62n^>M_XNX>SU2OKt>Nc)I7^zCY+hzJN2JBrQM#8@ zJ51>`-$TE6Z=Tqt@qFRk*KFdMoEhHTCx{q;)YbO=_@fEut^O)!pGCaWAJS1!7GX5YJdKP6@Tmt8#y9A4t9M8R(2)Rk|MOWre;E7KgM?!K=$@zgbHj(Y=o z@Mn(8YI*nk?b(|tulT`{c^be3eVIPN3hlmuf#4b6p3VCl+20qb0Q=57yZj5S%ikCI@ENsWcu2#JDEnH-h*t@56iNXvj{QliCiqB=_IAw1|e zKYU$j-_3=pD-_M$xYb7A44I0ZWaJ)#>5uxWA z&PPk_j=7Ul3nS(MbB({bF2b7^d7AN27|EX|5PYz6WLGH0{_U<^`X7HpeEog^H-7y9 z&}`TL`Bz=|2%M0Mjv(w;I)Z;K4!w^T{^75a`yVL{zx##1%<})&JBJQiwQswUkhLbJ zAJ$@@l%vMeh0i@r&ZitzN4^;ap<~ats+T=X4}z)cd1~Dq*vbud=TlgzME2iz;ak6d z%ZcI8uCz;O7OOJ@BE_@HP3GD2?zc_6_QX~Tn;J?JyDea1S@wzW=ibpS{{BUSx%d~l zGH68X>mARD#!$^8E@tb6x%szC(sNnqVoTP~;wEfU%7q>}KQVlK#a*erLmIppcQ=8s zWJ8a~Sm|5}q)ckGZlYqp_db5_Yg1u@_DFKs4YC^%m6F=EF0J&;r(L%lAQ6=ex59`W(^=x4Dn{KtDn7|sKQD8w)-ZnNUcETxN0_i@cJn0z%23)M>2WZVa~o}; z*N%}3@r%V1ix=;d-VjU`shfM^-Ics#Z^Ae0jMsyOMz`ob>IKOC@yueGZ%)Y9`Z3dpjO#ak&@V z=+vK#Kzr;y?Y%*4q8Sb5el6bTHs8W*6YP|Tr21D-@+@*5+a=378ZqFSDhC8zGfz_S zx98IjN(>Zrd*09_URlh`0Su%294BIT5WRW`DuxuI106w1HUl({PKBv4X~96EMd#nL zO5rnzuT7yR;Y!Ln?~J+=1&4|6SP!~>_ zV&N&E@3p@+8wmg0lfCkubKRycjPB^uxijV&%jb6y-8j1PUnqZOmS1y%E~018DxBC5 zhbI;y(`My@s3MT*Hh3bMgNB6WnX+mBMMi+*Q#$b;5=B{;3J|Lqf4xH2P*_tlJW^#S ziB|V@$5}3+n-^LKY9ARG7y?e&;vQ_Gj(Vh8iO1Bhyy8>U$@u{jpIwQ*xk@PUeo!T; z1X7=*?IbqgIJ#p^XcO6y8`S)aAc2o_ztR+I0PJ==U6L9l`{Kp8s%hq=w9(jJU9zdf zqlgl8Nf-Ate8O5e1?z4>YU$N8Czo0KlEm9Kes5oOc$mHFNVn8(xI=H`ajQkia5&1p^X?QNlQ9d~w za)M!gS@r5anDXz2Jv;b4CoB9}PPWK){3)m4Khrxu*p;#?(*%~D`mmGP#@3xg1NluP z-;chfWnqbUzw@jrCx{RvnVkFdT4eCe-8f^D1>6IIv4iOXU7r+zhfV#U$Z0R~H^#LG zaojXvtQiJ|$48yE%s4wP&vZPwMX^i|D9c`Z-xDABTWXmWl>c7(Ji-ol!LH^!+;?Ji zx;abtR1xRcGLJqzpS47p-MX=rcA~9Kae(fPe7%c7=yx3Y$9sIS_}kbQbtdTBU#K%N zP|h8Il_CLPfh-#HSW4Z?TWwnli|4A8IRF#g@?iFibnFK>brDZrJW8W}PePMQU6*$= zmra!jqCzV-^6W}`OMIN_!R8!|+H}26MSjxQ(YrG-7nZ4k^;YTArJ_)3xTi*My{sa0 zt>lMpiOK>hkpLD7#+=|723)RL_nD3z;)CY{2z1Bs6JP$d2a|H^Tf#(Sha(4lMibKu zr)^&W9`Y@j`bj@sy&TE+3d!|fP$4Aq`A$rgA{)pY1)>(I&+xPnYJlv>I!=Jh<}TB_ z$jPdBYU#JWTArU&{fcw>cFdO;NmZUX6vtTUu$eT=ma0M$!_lqAnsiu5ILB6(d2bv= zp2hAAu)*obQOd|SfyAD7ZAhLJZ!@_sxdr=th%CSG9|T_$Z-dC_?@iNV74U#P6h<27v-S1JP3%DOAKO+=DQat?|Q znXHc=IXH;T?@`#xE7~Ny6wR4@bqXzW9~yu8sZOiiQ4B$5l#(=5M442t1hkvz>zVOb z?j6A8)l7LicD2n{u&}49$TF`rv|s62l*_wDeOZ;3;;(aOf}NFC+OEi5y3#z5C05i` zeaZK2GO=2x;Z>rm2;H&$c;n2h-tH<3xkNtF$HH!(a?9!-l@aLTVMf~7u*LY&*esZx z(cx&8?FdaO32y%cS6)i;%R^y7`wj7-;u7JZ(;I63 z(yTkNMFzS?PpVWvn}VMAOItMJoHjC*zc5ibA5+PE+uZDGCElRoObt=t4cI#5p)Hw7 zSk4=wd;ZAsp&(WKe^%*I0bujz zz*?l6`5QJnDDA>+2k`-8gZ{lY^!S3awhX9_%*+!}qtV|n+^zW{{qw&v}2p^*%G z>=};vr|VqK@>Te6hGAq=GF~Lc{B~D-yK1a-HnsW*8%xT_u%6!@O`20Zf`a3hDsd|I zhN3aD_9$y!vkPwn9H)EgcIq-IjGg(a-fYEKwjwj0#XzjS1F2bDO_%HWg{F(*o4}fv zGZOxtdw#gjo-LL(HCRFt8g_U^)GwMeeZ1PEIU4b-Q=`Gjmo8nU73ICxX;2;7d@6I7 z)48Vv0Ios3(vtDo;VbIaJxLm3@c7!?Anny5T5Ek(k5=QX3ZF7+B08P4UE;ZHyQm9t zV1|_uTrXNi(6>c!eKpy?Gwp!OcfpdMLeEd%vk}$zoXh9MK~mMj{Xk%Tlemx`P%%%2 zaZG!DrmtMdr&MESGq@GWW;edJmaRZ*!jMnuj;aPaL|aY7l;r_VPs*S>43irNApW@+ zSxWc)ILxyeUTa$?C>7EM*v{=*uRuAp91$tC>~$=DC>I?v2oYzA-|%D9?9y$e$Ri@&v;b!Omz+0y&H0s8NG2Bcb znC{1*g*^Yl%=_vt+v?_QrS_6(c%n(p&8RDj6LDx{SkHEV0Y6`yFT-NBoaWw;dj9VR zEEu%w<|1mg5iSE$os`o~&1p>Or8wuX7Oz3@{yWK}J#|QX-`Nt@=*0OO^Zm#HPR^d| zJtCqn}%nGO2gXV8>bG{`jh>YvMdGR&DqDwBgwfRvXao4gdniyKix1uAD?hW*9A{&Qr0} z%%wVxnuJSxsBU#uqZ%J7I&C0XOEFzu2nbehoHnPBuefaV%jHBT2D8pBXM^!ftBj)< z;ZW_d5CDXe zW1y!WGGuS?vcV&tfToUheX;I68FXzz;vzB1nu?xM)zajD61Fkf0E19qg{x#5J>a(O z=cu>erN?gulU*J+1*D3^DmYW%hSS2&p!05LXV*uT?wp-}yn!!G+%K1RHWCojepEsj zA9m$uSp3rcn|c>Ux$_G~i57NacBht3usE^Rh7z#zbmqT>I&f+#hMwj~(@4)o+sWjN zs-qeYyIu6+27I?9h#q(}cvKo8b$ViUi6*y_4yBt#ow~8X5fi_o!+SdGLWq+NhFT|S z+}MhbD*+ zGJ)jgZmb5q5@$pkBjl?%ZoC9&SL;|IdwPSecBtRohHV)Vkdw>zpfcid0=mQV4WpKN zvhGmOXPa>*Xa{sKyZBV7a0P%xyxT}F^gAR!i=UyziU~5d&=S%-M$|o zBbxLS(ylemH@6rRGWqVzP_AlqA)uGUV*Dj#K1chOm~Ga4|dV+1a=Pg#^wnrYIvYzD=WLqmu)*thVoDK z8(UckBJ|C~_&%GB#q)FH8r)EQGJW>Ot>@;zvxy4#K0{Hwl!`jdhc8slGQbq~+wfb9 zAx@&r%=9sm8@=Sjz6mfOL-pd4yza^%ZQ3KQtNm{6uT1$MWdmVP{UxTA1z5buNI@6l z0DhBH1ZKRmW74k5#nG$axbBtD63s`}=el{A1{wh$UZ|iy&sC3E@2#V%#cG@gJ~-2! z(p-zwo@9^8#|23kQh1ay8gQQcP0NVZ8TGMFQE)TVSb98GmflGVWmJ# z-V)ZMBCOfGq#?3D?(7%rNA~_!VXrZ7Pe!LriRcq6#Jd-3X@oX7j=B%DYq5_P5z7>t&ycqK&@uAM>i@@_ezR{h(V*U+6Unq{gNgr!Y;*+FD-I$9Z zV!c=TI@ZY~9_5gDOKBeA`2f`LHU+Bp6%@JTcl^r3fWI~LZtuEedqA;Mc>X=bZoai_ zHBoc6G7m|QWg0zb7$_9|iYeY^>)T0lF|arOWKxaR;AVETHi8atjQZ5r>1xWi`-cAo zzV7(?!utpW9HkxUIzsmO?3~NU%#oZ{!VZUX`P73x}QTn9i^Csj0Qy#12`~ zzVnuKVD2$#slo{^@T4Z+XeSKK+K=ft+XpR3ayDi%pSdOkm*$cMbYiu6Oj{WYf&k* zlzBE)s&L|Fxlytzv4~44dI(4le7mz(BqGBpt{qt()zD}98e#mZdu{Pvc@v@v2 zlY;D-iY+UXw=d8lh}eHJFl~6q-9uB+NNtW-gzG;w-m>;qI5nR^_a_s`3tj z^)feQeY<{_f#+CFRx;mub8Y<}A?EkLeU1CAz$W%9;@xOFTEe@TM+G(`-7V@gi_KCz z!y@f^c(pRe%uGd4exjZ@m#jEI*-#V+x2^+p7czT_rL)4Rqr^O1Wu9C9(QJe)~(9B^be=qkkkFwc-Z>% ziq_Np@b5iGvlJ9lR*0t^d*t<|b)6O-M9~RvRxo)Qp|i!cFOS01n!3>^c-9vwqefA~ z?=>m6VB_pxipMFFFec;igvSrNKo?!HTSZw)o@O+ncGReHCY3ZbViFS*@8CtNfhfnd zip{$#mzdCLIX;e2K8yawyR*zl8L;Ty{?6_rFIiC3%g?9!I`_t~IyYl0zxnfLudx>C zrR6VJ$X!N|B;oVw*0#N6f9-xoV}!gw@=h-V68t6_vbO`gJ>?~h_xo@vefd~#=j+^Y zZNPZ6?z5ud-!(rcFQ{jRSL>Vb%yTb3@ARzSaQO2e2)a(8SV%MGyn*4q_#PT8I>6$C z6v%O`GI?6VK66lR7)C>PKW^A zgK6tz-`M)IOIx6JZe#>|R#&0mixxS+BA}m;o9eciYb8$YN0wdd{{}T+LLd zAYIFL`x0PZ2-Q~X0kGU865FO7>wWWQ70#eS%EMtC>7)0IAZT5@vBxq|h&8d{Sg}gW z&dVx|gA99cGf#xIjO#wB(CViz`L7e~$rm_oI6l@LKevZME`Y+=2Z{XY?MiDny&mjT z%xsv9y5)XAh|PpYnYDaenXICGK1*M57PH3G+Pn$(9COkA7Ha!Bmo6ELn}$I)Q30qc z;#d>4Htl&b!G~Eb{p;*R)R#+4&@u!$MFA2*yW_8BF9SY_c9} zPOx!vk}$Rstt~Qx;WDqkv)kplVZ6VOI;9JKqiDULl@*bvNXxlI za+aQBH9Ht(Xz;miXum22H_~#_ssOL`?r&-X+jgjT0 zJ`%EW5CLn&QeGQQgF>YY<_$Y&i>k*y4qq+lG&43tpymHXyu}aa_mLD0u zyqPZVGhgD3yKeZYGKZmokEcwftMGx-m55|q54M`Gq&_RcAsYsd^9m9gB3p7~n)2b_ zB+%-%ybXo=FW9_n&0RO3{S}%d%zEQ!-u7<=lQ^lcsx;5ZUnY1k2X72%~K zpr%eL#722C;+&GBaAe=|Sh2tcA|zDy;Y$J7KcW(RFJX#@KXxr|j3jaDv=v`M5{tWB zkY;iZKmy&0|)_uM1y(;?U)MtTQ3~W;k-iyF~+Sun0m_-bUsJ8K+D_T+B@xicuc~n z3*}hN288o?kR{;_McfJe>ENmgdf4nOnj6ckw);HAh~azGbC{-2UC7u4S3iD$rF6Pf*`NP`bL4s36UyvRF+W149C@ zmAL5Ocsd5P%t881O`g-EvX+E0s&cp6HfXJHvLUzA>LePl)~E}Nu*_xl*w8v@bl936 zeC9Mvvt=6`l)A-!t-xNlC)n3Q&CHH~8r^bMZ~?VRF&O9RjXNyGjxd$k!&Q5s#H3#@ z&!HzxO$=cIEcZ{11x@P6vnpg6>XABl&F5KVz9IaIHnHI(e=i^Y@LA}Z;@9@?%tOmf zVH)n=hg6P@rF4lV5}tu|z$=QkLJ6Puzf6$)kMqt5-`g#u`4*(}*2zZ}%0{uRRygVu zxlG?aX?L4CTM|NZ{#v>7pLtYlR8)g+cs1I}zKaEugFVK(_V!e~ZahIe2@?NZ6)7ge z*H4^BJjG`Y9tm3tteM3n~fI`*T~%o!=PuH$y- z=KXJu$F7bth^-TuLEOn#tUv{?m20vB?5XJ`^un>En$SKA@Dqhs45{6qgR>Ov#DiJm z?%K7_hSKb#qH@@mm@`#DqoeWR;vo}~@)P3>HmI1Zht}TYej#gQ57&uX# zw`w@P6FA04)0}apFR&6Taqx%Bi$md*HWT$vooQo?>q0&UojklhdHaT`%I0-fIkY%2 z>t#)*^@^+i0XF0D>}seO18YvussIBf`cC?hYeTRpsHPz_G&@IU^W9!{(9<}zl##Nu z6a$r-xn^ra+Z4r$K+{&v`rmpFG{WNFGw$_t7I)@+EYhDg_HKH!T_{LsFaJts4~R_LrZmoRb+c=&6dEkcs?z+WkwvV+C_mZf=|Cg zB~3``_G|Stkv+pn^5A*~n{|apPr8njE@=*KXmcQ2=NQ2~($*&y=M%21H_9I(XT)oK zUxV9j`-jvW*^f;m1T`ELBZ&FWlnT~P6DpWFa@ROdVM?a?ousD8axH#|fSIbsxv!3@qp&7ThajkSUwxsEJaapve)VzO z3TThR0r#M1Rjle(Y6*B2@h-$|?071Gu4j@vgFLKq65SVs7px}O_p#O{Cw;8o2Urv) zjI6ys6zedG5K)YnjhvWsQpjZVJ63!5dCbH_gnTBeaIsrk~~Az*`r!sgz7^eD?%O za#rKj8o@HHW zUh4#ZDm-YD$@Og=_xyM{=gUV#65p_I#l^okTs$Efjgpza&5;vy6{m94@LHRxA7Hpc z*C}t!m8aQgi@^^)*BQHOl$5RWY0btYw;_*OU4?@x$k7V=AX=)VXq#U;ck28w4L zBe(ImEE~m62gh4WAEM)_cp4ZHcNiRk!Np`MDsSzD{{{g!H)OHIH^Ie}Hg4HLPy;&U z<$IlY(msqZ$CwS_@NOAKXDTC=Q5{KQFH8~=6TW<@Jjs5Lc^k*{?QmjkL?omF)$8l===l$E+Vc#efHr3j ze2_yJLgIo5{gZYlAOH8RI^HjI)xV$hE8n*frs-RM6L$F?Bd>w?H(1V=s=9a+phnez z=Rlui3N3Ey=(((v;m&hUZpb^)v(pqUDvDhzzm{4@<|qH4FOvaKP4U|P(3i3AIQ(5a z<>}n6(Dg_0R4`gR)k!+axNpTnY}cLmZvUDD89oTJ{M*#BgIVr;ETN55JE93_iA%>R zqrC4?6@_REaiuceg_@I zoJGj!p17F===rxwK9+lRW=JBVXqwMbTue6|A9#pM1MM)sY=v{ zBvjx>igk(vsbu3vCygF2#McMw0?VzQ4t`MsynJt5r7HvSoI(zX0x8+&jxSYeWNfWp zea{%oBNb{YHY47s;as~%d2g>*hLQJhbF3m~jyvUcQHCgGyr9bwG&L5tj1scxj3-X5 zdm?ND{!vTrf28?hnj!%`9fc2HxidH*Lb@%WTOguqeA`yv*_p1|5kgZesZMw`uG|@&pcYUWYA_~6?qQ0TDl3oB%pQBA30U@bh1PMriLqboem{lY$UP8u{)>kL z?tm|bH9OfJiBp5)8YKSCGq^RGy$y$_xw#euRMTY0Rml8W;a!#j;js~=p0k3ZL#96n zofLi(I*DXKKUKm2G7As-%Xk7`vgTK)U8?`dbwuA$@2HEKpTOiSzyhxkbJqmAqPv&h6?kMV;Ab)&oBZ z1Y(O5+7PaMk!m;Uic+T%y7Tj%;&-I_gyLej(G7v0X4e1RIJY0%=N)nC1gOPog}u$D z0hyBep0Oa#*cp0)8W}xnVUXz*+dZYPw>&VNMR_h{n*YZ5ejR*< zp|PiTki<>zs{0XIPf&=ja4jd>xG|xoY!b?X5~tnI1Sw<_Z& zySwYrX#Z{qp=WosbCfok*Y`>9QfU381g37-Ds=8aAwA}x>@BXnrzg^iY7j?^N{{I)| z_ebK(Pfz46_Ji+clXUf$P{d!0yQn}v`CoQ&_PWQ9FI~dskQRTc{0}kaf7?R;_bm?T zb+B;{NB<^9>dKjIQt?+dJo?s0EqUrOL-UqcSFowyUi#x7$k?}j6K8zx#~=5f4+583 ztaU_8s<)OAaXE(GT%lKsJs?U22`a3IwgSs~7SJ10`%J6|LGBn6?up}};OVB#*))N7 z|L}!>{Qj@uIO^q!i8lp0m zH+przi2GnALvz*AB)$3-=E)l(xwQZMz<>Y#zaIVXd-2Clf9?9eG049R=8tCb_f7iC zVE(=r|M2NAgZaNTn3F4)E}fr~e0{S2w@E@9NjR~0hN{7qChEq7e($v~v?bXMYz$cJ zLhUave5^vK(Hh*5xY|nhLLC2AXliz2RSP}{BeF^y-{!+)ws*)m zaCUtK%k_Aw=%w%v0dh0FF=yN)?Kmo8&Jxpd{`+e<(Bn854p z(cJ09fHXBek_R01oNT8!ho%MUxGUx>=nOyN@n?#OhgY|z zr#urDhNxx1#Eb7ee?=oUTPsPElxI5Pr29Aq82`#rcB3Q8BK44@g{!o@phhQ(yqUTA zsqyunJiw2~`V@krU)7S3*3C*m=9k1UWW){9ee-5-XqErfV@yTmwwp%?4tNc8hkp~dFPCJFTEC0h{Z$31IKPp*6YPD5hy$a+@=kyC8y8tvi@|CZN%`=%0-+rGHz}`Pa%!#TPH?xgPjZke zXa3vWyjV;}>?MD#I{tBFfAOnPcSTuM$JLB1DZQj*!WIK+2|qktnaV#i;x<0s+u2ZH$jDs~jn-CQBl=3Ska8`^xN zIW*E$Kqk64pHXOqW6N|%Njg12N#Vo8G;_9F64e8?+`qd!>_+=@kRgJ>HfiwUPXidl zpubki?pAiqUfY(STD}gLryT|jC^>5fG|T)%afq%Bv)p*e+ri$X2$)7mUHkcQEEbcYq@Zjd}tB4FFHeBkJDpz zNq$iB+7;|4`aXnw&XZI51n_E=Q)+bzA+G@vnXO3&8(2r1&6DkQ7-X|SZT*Bt#o5t9 zips8I!<4f?88|S1c-Plo3(VYWw;%+X$yo^c2?~G6bb&@){yZ90BC`QNYbz}_*ahJw z)Aj*c5}hv0f@S#@rUwlLCS&m`+>NBCcTc8*+?A2GY&5#buJgSeq1=Ly?X#mguAgA`gsYeFD&0V3zq04g zPBn$sKHnw8+N=Zhc_OoRP4R0^hF*pzJ>DbTqrT*Ag~0;c&ae(2%diNbRwoh?%sk&? zzh^T!7qj{BW6NWxqlVR0;>$m->W}Sxa(w%%UGSk~f}Q}+bwT;ub_^V5RN4}KzEnRw6vLiwnJ~xNdTVCpMHq2xtO_6 z9M`TS&|b#7?lHnPX>~tA3FE(2Y%bPx(_fn}HOceuEqMVy7>t1hv4I2`4-YQdBI?4SgGp&QF zgcO`_5EDQxhFMF1n{`zuEBb@ddX_`EJjknMo?A6}w#Q-sT~WpyN^)&C?VgzYW>nDm z%lz8oMm6#gkn@b8i|i3sb+Y>Uywzg&%ppCiX8f}@;GPDgV#+prvvRCP_J*;7o*o#Q zSl>eosB+l)LXw9%_?G0{$1dwO)K79p<1lZoDZZsT9mY0hmq*EV|K5&|n80R*7!10Z zyY>j|<~1A{(5kcDaD#Y0^>sH7YrcQFv8x@VxVGS_1>BD)qczQ!Ccu z2v>J!erdsycX(zT$s`Rj7U-c97TuY-a|)N=h03>mhR@EfQQ=ut%7+(PP0=HhY;U0| zO@^`@!EVdm38J;fJ7Zzs&+Qv01mMpIDW8Vo1)h(=d8qw13V3K@#Q99@Vw}^D%kg*1 z8ST2rw#l+Z<@^3znu;i4pTrEQ$!d}CIhf89n{U*h>^d6AFNM~f1mdIW?am6_QioJ# zHZ`qTj8`2;>NxH82)P0Ns1iiUYpjh1+29k^13J|oE}xPc6XUSnQ>8HZ^R3}B;y_X# z^$Cl)ffV5GXs2jj5PLW>ZT&07dhMz+kYld>0J6W;FShT%_w|rIxNC%of}^*D9UJMiujEAa|Y5 zvOUWZe~4^OZVi9A+J)bT_%t+*o))YKp+{CH#Upen>v-(Dv|w^>+;BWg9mb>B{dlk( za{4-n4M0-XVyE+|#|9m2eE_tT=(v|HZMo<1XoPRVon`ab{KU1v9R@+BaI@4No`lV8 z4jB`V5hk2Rj=&RKzl~KEl&wSS;G_C$p;r&a9$6sHLT_D12daMpGGAllFEuky8(ITb zM;~sWs~CCJd;J4xg>pTC28JhGhY;7$X98+H1*>)HkI%T$hT}&+G7O2sIfKkiEOne~ z>D@K%*Zu_sp)+A!xjHGrHPjWbpVmyUZg_ql zRaBd60*&v(O5$MH8Y3pO)S(LL4Cq+qhT`fO&eF2F2s=UUPIWyZT2~!m)haPC2b@}u z+e}sD>NIz7H(K&iaV<<@C3!vEAeR4V$)Z9fLP#nEqMPO(DBA9w{Q#2M8)r8fd^2X5 zLLjm+dAN`N41LV8I*$Aa>qBtXiH58u4Q0>4Du~wk-fZCpO;e3A6+pyv%OizZORKm* zV&aBMQpHq-HORWgiOmDfacgO#&2wgFA&WIhcme1ZUZAMu zB1%@O{^f2B_!Eh2@dApJAW-g zPAG7!>B1PgnALhTkF$7dfu8En*e?Wk8&E5CGEmgg3-%&Oxf9E*g+sH`p~*G4$iXWx zVWE}*SaEkZ&1XjBymZRdR%a$NVu!jgjUR~2VlTziIkR$dH84LAHW_guSbSs@Qr?dF zZ863$d=x0pNjuTdY5CEB{ALLyad9#UN*7N?V0Uf-2CRd3bR;kceQ{fG~_i#-(#b9+X#a1 zkF#)vbqi+W!NoTXrvf$6W}wMXHtK+ro31;IjHp@{q~%opgs5ub3HoXge-_2bCM`iU)8TvcsSP zkErbw7(3$bUxBUYsn$8QpL;U%gq*?U!iLc`?|%U-`i^wyf+9TePZtzD3DHp0M=-g% z{B&fZu-o0-FQiO3Kt8w5bcM3Iwo9`hxfqcs22C7U@i6AI@XIn2dlFr~i$XSfixp@; zswQc{v$Qz)M&-i0xk~hs{JR&h^mWn8=AI~j$zCZ{mJk z!iLeh4ae?_jHCA2^^TpVKqToo!)+X|uT&T~lgVJ<=ZNmxuy1TN5BTJ3Z zxDA2;t8dxLo-fM7++)Pw3g_pd+{iWLnwhj*HsfZr#;sCPepvsC{mjf zo3I!rRJ~{0XH(|h^8ggmP?=&9(Pdlfm3LN?$bSg^HZU#V{0w#Iy|i9xT0zrmu*#H@ zB((jGVAC>6kR=}IrH*{<>KOWI)XvgPv^~=ZWy#}7rQ(9w&S_}KiXDU16L!3{$6f$4 z_IFhkqMFutjh7V9>m_{tY0kAUf?K8%ehlY7FHS~SaI|WIip`a~XI$O$Z-)Sy31)4h z31&h5iC8uKS#CK;kNsvAoSvSq8s2Zt-oBqPQRqLyh!0y%X%AK3Cr6J_mAt8JKi5BeUt$tvB3y4Lf%!KSR-l zA7AqZid*CyMO!3EcF5vYQcWMgT(SU$>&f_MON}$OBDSsal!-%M&bM(BWZ7F!Z;`e! zLQAzRs}obUH9oA#!Q=JEV|_Bioz7D3IS}hoY^}o`!msD&CQy;uFmwa8r*G2!i^D@l z#5M-B%iHZu@&0r8=$M{+vQ>!BdcwOFLon8-bY<1j1U<}*u-xy)t8*s$%9^#>30_Zl z#C~kqv)%rKGMb`|jD%%!o;3nSsz#y&!3>VcN5cR`QTua4lNw6S;cZlZor&iC3ZU6` zTPN+C&Dc}9yls}s?VUHrt}>z6lu0gYB2!J~A8}I%&~Mz%N?9R#Q3*GncKou>K3TF^ z3k1=<-)$&m)Gc&bJx!_KK@7^n!Ec(zM;Aj+rC+J~q&l4r*%^1ApGCTk);VV5^HS~J zUk05Y=3aOxIohQ*yF9PMxNuZaQBQ6ZDVXYu!Bpf4G0^_o1o1?8_nj{Z?f2kPJk8A5 z9ScZ|#`m+upa34Als-VA)M^QauSdBu{yz7UGsH!USLpiiuE(Tyr-IMF#+lj9Cl{d9 z_-CM$JtFm)|JVP3N-uVOp5W!WPbEESF`qNulT`!7IPSQT^zjgHhWAj|Mmkd(6=D^~ zgK<|FU~YyX$83hd1Nb;P$@pA1 z!#E^>uSIok^F@d6a6m#Qw{n^W3500Fn@#T?2yT@~;Ma5?&af9c!8E`N4t%2CCk>JS z>z0N1S-)+YDw)XhGzCwbJ3p!2S+%1*{QT6=GAJyx2^wWl5--ClEPS%Im-z7RRmMj~ z*q$Q~(;fFW;-SGU{qmd^`4@d&**%f8Sd)rjl}gJC`-3<04AS5HM zbO(ruK^!Lfx!ZeYqg)JBp|Xk4b5+?MUQC!4F+@i3UwsHBHf29_!jupytVSC&bH-BQ z8Tm4a&D`N@BGip1XQNCRdB#A7%dCip)2#-** zeSVZ&bkr5?cxSg`CfsSHZnYm*tM4}txz2KX?M~qftu_(0T=BNp z>1^-98VU^7=w^<`RhMP?Uy2_qR3q^!k#GYoV&Gda`1q37ittBP{24)4;(61#1wJs$ zjr=$3#YZi}Yc-6U&-a9PAVgW@jw?L%u467(ySS6vN`!STyYES0caP*)_+_3(KtDbF zKkU7CP?KpJK5DNNT~-hf&}9`B0g>Jk6$O>1A|NeM5fJIUgd{2o2m-nY2nbOTPy&SB zLWoF{7NiCUA<}z7OG5eyetniX-*?>KnK?7Znf&35Gvv+l-u1e#>wbtZH9MD&T5}YD zk*`p@eFWASAt~qYqbEOuZdc78{LAgy!*4$Un!2!`u0(@nGVQ zm!bR$WhrB4*qh0Aa0l?-8c}{vTB?eiZZ~&zcmZ;-J)9kzHz~QL#^8C4>#O_QPg=fG!!jP|9J$JlVb1v9pSzUdJ zp^X1$nq8#7qBy!10e{^9(fM+PA6k!PZ$O`LGe%5u{~LRP^gcW__+?+W!_N8c+OvBo z5|vujuHz5u%~dtm>RN$hYHtg5L`_K;i=ISF&ZAvdBj&7SPA~}T_&0=)e_xKXQ1$d3 ze~%5&hQ*bEV}_R}ohqJ)!Eo=f{t`uotwWHT4Dx(j-+c8{03jT57ml)Bl{UFr1eMwM zGRl`+^jYV4llt(vWOvfa@I>QfW~^Y=u;wip--x@>nMzPv-op%lamYyjn_Z7?kW6kC zaqd?XtydJ#h-BPbI$gRku>1)R|6tMdbJ%B{-M#QgqlWAobK{HkP9^T+GHT?wk-$^r zeXyo?jE};TW?TkAP7Nkwub(x_#$Vo-z55o%3hXKU@~3S+NcyfS*o#X%6RIudS=f3$;Tv(peykdNr6WhVGy3r z3=X5+=kA`50aQmX5@ON2zQ3VqG~Etv1q&h|2x+vKJV*-tE(}b1r8%0nU&JZT^~+v1 znsTvrY%C7RjbcC!aC>kNTG-ZzXVx~i8h5y=P3dY>elQ7zwP~>y_;NcALba{59T5t< z_o&9^n~peAzkB6Pj&-^52PK-62QY2%E{noP4*8qZtdek{v&6mO_Qe9Eyyo3+{ybdj z|79H^Mdtt=dVdfhHSwrOZu$iv0Z2R@y5lxEn?@7^NI*u98r^~4KkG$=X6V4Poe60Y zzea}{Mo4RM#3UC*>aHK$!dyyHuu{6oh)DHJ2f{21xU2{%d;cNjos=ST0(HTsv8P=F zH@#M;tXI<);I4z;Ip*kD@g&u!7OE5ochT+E~p4SUd4N8={6LwZhz%iv{FW4MBPe;$-li85dZNi9=UkcO&Zhy^uHQmpR>m zypTSU6SRuV$!z?5aNnVTF1oE0;1+^dh9g=?N~F9!5$J!fWx{*E!S|5ZLxijYVns^3 zDW-Z=OXM5A_(f7ahx{yh@2hbqTr!92C(FXrPC< zP#nv>*CZ^Eavl81%Y*Yl6eC|8z zdr;CtSvc^n@d^Ydp-aJ?e_&LftqK?Jh4`}VUjzob2g#8iR_b`09AyJl?DlaH;w5#m zpBugJ-s_T*N%o6r*fM9^ZIrG)r%SLZ<`)k^dL&^PdN6FY!p!#}_1wa&h5TGt-?_ED zgINho%H<^rwGDnFvzj>CSbbdl$OeA=_esYFiSd8q6_Rd+6Png%!e99_VJ0FhBg|G> zt9-6Jz)emAJz-+MGJ+Ky_8*E9JqmBKO|Q0ost)SH3RAlbfv20S@pC+E6GxUp0u-t4=+IZ90)3P21f3GGLx<4<3 zRVtM;JBc3-`gFONL;tvq1=@lOztl{_Yzsox=~#ygO80vsqzQrit5hw5G~Tna?+~My z+j(p(BMHH4?R`>xSP$|kxco-Up%QQhuCG!xCCVQ;Cx#1}#6(Aci$7yPD|FX7Z&QfS z7)iX{uxZXUF+X^U0*84{PlJ1>Lwtrp0fMd?fl}1rLvX9nIf~?v_C%Hxb|9Feo@Hr4 zhb^EwG;asID-2pylFtJ1@90z^i5~|lSg|1tt%&r}HxJC@x&+UtQ*`HyPDZSVY=ee_ ztQqmOJ1G^uO`?@euV&>{mzayn^)lS47_(y}D5Yp;E*j+S-fhTL6g265xZR}pnCsOI zYQ?{dSysOfw++|x)OP&z?bhlMk{iY$yG+5jm>exU2V%_0xJn20ahBlS+gngRJ&VyN zh5KD2`VJrgU=4aZ4~bc+wMwD3S_V)~v-fcsi~2#na-%JHPlU#|c~YJ+H0EeOT_Mqz zw7K>vi)>#xCq%SyBYt%6wN$XR%(rJXRK;;QSK5`10j{wj<-e#qe0nN-l8dH$eG!p?e+JJnGNJ$8~H=j*X3muKEL)*mYdBMye@M#V5h$=J>l@pgT}Lg^Q$@< z3lod8;Okpn*TqyWiETGC(^01%94MvevWEjrF(c72j9JOi(k=udw9b8Xb9P%S7UHLG zcf@sr@yDizH`cLGyN$5W|0g6}<%gSrkPj36vH`>0Hxe-+V?%W~_&xujqmMo{9{Hp- zr1^Tnf+m37yO_R+-h}*2IS6t1EdG4}xssMxG?{g%I88>N+@#XET73hE>f-uwM*cX< z;-H7P&`EQNT>_ev*c^lqH$-U#YRaFc+zf6$;*1*;5;kpWJjQ>@FZD>nZNfy~5GsyO z!^umfukBTt|QBsH2mOL*%Yy)e4>wK#JHEh8M0(&`P`FFUdSgWu=J?YmCs&$39^=du)uUP@L zRnxIemN%{K)x`9mK|Cv&VF_`>P&OMW9mu_1G%>#Kp6F)W?czl>-{sEQux`Zx=OnKL z#}zKEc0ykf#Jr+nHPqkDf8u`(z!T<>C;QrwSSQ{Q6&X^$XC!_DByH1{b*$%(`d@zb ziJm3lGA+g&Apn_^lang|yp?ZHYmTx;aUGX}t;}p#j^nkEVbyJ#5vk#jI;7=JIU$Nw zsY=?Q*7y#2{`8KY-tp5retO4G3FY5`uAhq5p915b0^>jT z_J0$G{J-xVu9d^y|JViaQ~Ui>ivRyxDZU1z&V8`NMLbr*{ClN-_~}_JjPr+0&jvs- zAI(=6Ue~?>Tz*)w^sh|}{eSRrQuk(bD`W$l?3>Z~b;jAfA7-3s@rMLqEx)dpT()QU z>=cFIz+le}xGSNT*L8@Jd4CNH{l329mJxrwL)lS^B1Q1ef$gEv?sfWT#*foS{{{=M zzohScv9fXE1m@hIB?5~_kE}15DEZ-O=f8G-JXA>D6i!I2MptWWP`cLqzRp^U>HA^U znnQ)7<_F`4>x8VMd_orCkH94Qjz22{KP5e0hkHB!8f5yn%^YQS`Q~f8OkN)TZtVYg zdTW2ItMN2!ewY^a5B1-^{+HYChrvyQ-*?*@x!RWAFApSoH-);oAWed`jzSm0>FQ(g zDeA-!sjB%!fKHy`%yN44?TX+>=QsHI{Opvp{`)ol`tSdg^?Sj|3V0B27K{-u*;6Hq zf-@h!Rnc*4X+1IH+C*8v;wpVd7W8TMH@YVD#Ol0OwmlK}vng-h^-^iwmOcOKh~sd9 z^6t>($-Q|zbyhL$T!Dqxr_Kn4nX-u?T*CgboNq5)Z~}P~C2vf=vW5mfikPNgEE*G9 zJZ;#+G-1K=Ipv`i&*+NZHZaY@1;OjDl79Iwze>sYPm*-bhq*{wUa!KgkezhXw9^=T z;+Udi{lV1he3#rWn%pSmadA^;_@9Xfo3>1R7jwz}KqAo^fNPTg0y%*ur18eDxUX)u9-`i)0$#RG-=XA2{|+;i)E)b?wKl&mOAF>$zYpyy4IDTmN}Jf8lsj{jXXn zGT$uMWg>G<+5~_|#fEt8t;gxb_q|UqOibx;S4hR$(CZ>M7Or#hCL#n6E)FQBArE0S zskQGID>kR>(KVkz*|6Tv-w++x{uvom2bn#S(wBhYPCYmpA=5{X#&zy(-rMNvR@|NM zigt6{hI|A!3;xg@4@aQgr#P{o5T-K8MnaE&y~gcDI9;!rXvAYw6Ne)ZtIgjyf%Yfl z6GC!@t=W8vn@x)Un5&94bg@$hRUSGsVO179Rrka_?2Y@^!d4+Q2oL`dA=BfG?_IKe zMoMjO%Kd{U;%e(ZTv!9a2h90lRau!JCKa{@6N?5I?dww8|QvxvhPdRaB-^&^=G?~fxeJUsTOfu~;t6|~kU5})x#KdrT?zP= zoGmuo<$LbM1Xo_w!b9m+&a0V0FSG_*s2n72mvCT(*LP>=vKWPGH%dKp$WCWw)Oshm zvpL8XhnQSoEiVR+q6M)c=P2J|u|ry8b5inATtjEB%9wV#-#|S2)!wR+r(&d8eCfqC zonKO~pQHG?BGSFO=7r7;l2GjOn|lCG4U;GlZ29?cLJGs&_H{s4CPd+0s3fpvp;Jo^ zmO)5qEE(7uZd<&+Xrth|ufJ!#0+ITP(4YMwt*lmfs{egiUs?8H-jl^Jwm3azCWMyP z5zyLPMMui`eUml{6Xp^FmU}dwT@&Z7@?YNsPMqc6H+hczHux(=&J|QK(yyiTj8}_G zGD*k!dt9l&(P{=ZU-Znw3mpmigkoHG0fHkF?oQg_*xuh##K zuhzHUalwTqA5!?oHX{;Sf9_$O=b2*x^G-Nw1&1Q4aBtWhqtIE#i9sG7h!mi)> zf|Nfegoh@E{HDPPwLvZaKXIv>yoycT?*^>$np+@ocGRVU*Vj7rG$~BvWZFJJR^iB2 z-r-j&6XB-W&!B5aCnlGFxAru145IKfDGI16%tVwgS8*m4Fl$x7CxK;DAw`52Lx)Fz zM5Me{uU1)Tye&r$`Ox`0DCGDJIZ?Q1y4yD0bmSrK$s%i zzvHl`Zp9>%IF+pPaoiMb1@|2Zm?BY^twwd=qsWsM?_=U+BJectAa~&>(G>XXM6{9? z2M#26O)s|x&llmc?dWZ$+Xc&yIlYD^DDO<#d@Y4j1TNNMV#4-1 zD-Y6a(K3jek|E_rIVS@LYci^em3O^E)2@TUhulA8_d?lsCN_sD4x-=oX;d7kPKWhT zdqUYZ69>X@L{??vQ!C&qyG{R8jEfqaloa7sBU#w2@k$bGC&;84n1nd>z0n)g7>0@= zp3Y;zf=V~m<+Fw)%#=0-(GgnIJ5tv;K~_|Qo8`l%!@W?0l^scUlGW?IjEn^I{xoIf zzx3le>p?#8$G5L259NkQh-;ps7Ze|6%c-6?24-1etDE$~CvLf%c3Jy0t5auqoVJTn z!?5?`M}!mlpWas@93DM|SKc!yr5?mkqd~dPC_*}#Yn;7fS(Fr&+)=fvh`@Y>=^zhi zUB=4i2FrFK#c7})!s@f@yfnzcIk@C*zm3!|G$68)mHXjEua|{2H!o&iGQ7Sa5V~0G zK(ppcX=M{l@{hti8&E2JRRWRIYAK~)W=^WOAw(oU9*thA&~l-i$+a%47%fh4m2XQZ zaqITs*upEy2uI^VyxfUNQGIThpn$gr}D1e0tXPj{!32!dfu86P7PiXlO!G11f`)@gt%A9+<2=< za*t1F1VMJh{#IqvEl~{aRaonr6Ya3(14*}Xp&Av-pF||FW|YNSqdlz>bQRX%5@cS| zIP{3FOqobxf#0yb)rhPCc#n+oeabc6Qa}(h$Gi&6?WrCL+!mY49<|-+=~<(sz;)r) zq?X>v7z_;@ssA|kIyoh#J10H63ocP^)h9UDKzbgs6k4&YHr~j?m7n?HU;K zjeD*Z6&9wG^(<|PinC~E3J27=9_2~aDI^O@ZBTi)o7? z%k==6pSG)@tvQ-8z=KNnDyY)eSgViCou@n`qvWP8cDjc5%8*!719G&%Dodb^N56^L z<8XU?e?hcBIe8>d)1-}6llSG<6Zh{<*q_h&JtW4fuYi!w7d2^A*3<(zlc-%m#-&!0%NKvs7p;Z)Vo!oZUdoN^ThaJ{} zx>dsoslwojg+)owaP28^gnZLp)kMp-*M}rL#(cw5qy1Ot_8^G27vY;Mgae=xpN!ah zj5yp_p$ys{9O|d^L)++EV4MhzCnVSYDUsxX(~Zu*ePOc>Z2K-Mn5U~BX5$)FYM9I% zkq&HNxgCn7Or;xFOfO*anz|;7Pnd*{SW3j^Zn!p9{m8l;t>!NvVC~u;UQ~8ch8FXS z;z!Xfr_$8xQ&J3C_8qS>U9)%YBsFFx)_NP#YzGI}J46{zhaIleDWv1|)*8m2dP;pAhwNGbS9o-mw8$J%JHuDa zD)w~_?8$Z{(ATK^!l7)vaDbYb7gCJvn3EJ6;X^Q%^toI4tiTcfDd6CBp2xOiIJPHH zU=k#!gXr>!?O;8SiDmk+tQtKP8W*@DfodS&xMcL5C`rZ7UIZ^UYwcrbh`^>KCnT-7dJ#0s(=J4fk+`tb~5)zlK!VS8Z z7nLm2{dz7|qUUjYWUNA>R=hKpCj%+))#D3a2xz$98Baa5w37k`)tQhu zCj?rcNy6Ta3H0JMRS@=EqsWBwm2ZM`CUBDzvh*8{?b=D97uGma9CoL658&CvJ~ucADP|Xs^VD+9x91 zRUB^)<8I<$v%I-3Z~T(=z74(BZQX0VH-gIkXRp=BAIT!u?0%N);~bQ2esN6c4!ag2 z;_I-tqHf`PQ_;)EYL^|hhTX!wl+;c;LmNT0h`MY&f1htz*6y;gBhnzRZ(pHpX%M{~ zalCo%N)6|B7qThbwuNG9tEO|12%iRYBtNM`%Vj?fGz%~dd9i5Piry(aPo3L-ZcSt4 z+c*9y#4P&YNpNmE@|g1(@N8Op>Y4oR=Y?jIw6%&CNw6CljGP7Oy{K9)sGPlhj1==Z z-1aRA<<;_)C^>fPC$Jv1~E(daf8xR&xzo@b|ZG;}=6{p>*x z{!tfScYzH;Sm;cCGt8Cf2BW9S;LkIE^ zC%iDjU^qkC9fPBe3B?J>5Hz(%SlCIRuWM7hBHB|-MPnvJ{qcxs4_4BSu^^H`Iqq6P z8?KdtSNb;Mb)p!#q!&;5$GzU+xhAgn3!Rj9|6yPdzng6WuklxcSdnxpZZErgQVBH; zRpHfsyhbm1DI?2A8v#41k^ERF0D@a0|3U?&5c4oY;32<=;!P&rF0L8;*k09Vk@wlk z_CTm6tJG4Y2~eEFMf`qYeV0Hjf z?A3xltD%Q<{9)+B)pL~C6JyTRtk${^I~}!qQ)doeDFz3BOHHWuCdF07R#3sjSWW+) z(K=y9-zX7HDJavIUvU-X^_)txT|yTE`xijI5#Y7%yKn~=hxZh~-bcmxJWlly7NzQp zO=*q#+A0uL`kIYDY9Ibgb9t=V_g6sKQsZJ_jIdh1-}skQpf+!f2l|DT%7>Bx0ftj6 z`H;KWJDQbi!<6iGp-K0a*6yfBj)*D(rwUuO5k5qf7?h0Y4toZ}C_@NJ^4=XICi1sZ zKqBenx&$es?E*en!%9!ST7I#l5xu3I7)fVO%!)(gQsQGMDiaSz5`Q`9vr(;k6}H~o z>2+?<-2HEhD^fd3^c`eR$DNQA<^B_JwUgLtD88j3Ur{wx8Z-Jbn3z(rm+uV%$qL_u z$`9W>G^D=v1%wsrF5I0>uC*AEU18GiSp@RFZ1s&p_=)e!96%jYO0PT|o(g&cp+o1& zNu{kR{28}3eSoE6YXq>DIOPSaIYky!)Fm(or`9g@qWy!>xoJ$S^vB>AKT5 z$)23euTw?j>{bK(9|ae`6)1m01J+J&HS-8sbqqR^A*ZJ@_eF0I61ldQ;*#55_Djb`#^|JHAu z|KXX72Vknn%REBujMpzR+fR(Hg)L>pm743luyu%oHRX$|uky9m6pT?!?|tJjH3K5Q z-v|qFx0jsxt#0AlqW810W$C7a$-iAh0c{lg_hAe)i}-Fhu>*tPhB8e=^gOf6%zL$?aWBe zz>|D^U_jxFjbOqk7EEiKTyeQsSULAAfU;zP-_bGTGaQ?wx7es&X+!CDmBDb@225gD zK?W(i>J$VON;Y5?oPBd@T?j^aw*egazbRP1%dDc!p7O!P5QL<}E)s$mGSCv0l9Cct z<>iwaK**gdNFa!wsG%ih-=r-)YN@0^yR`2SZWD!cC^m#V-#I6a@=3|_rN~E_MgXK; z^=h$bYZ5Bo#@@0zS3{#huJuz+vY|;N6cz9vNoapC$(H9ZuSPNxa%hp!`h#HpR^w zrF+%y6}j0D`_*?gfGFb8h~?}3dv?8Qx&ati{%YQ|;Br#{J@d5Ed3B~rLNPU+&#=fM zZOz{R&fdIBHGVx2Uj0Av2vJHp4-+V6$g0)HFEAkG!%T3I&n(ZGV)8BbIF8D@A8v7V z+qr9Y*A9gdI1tPupu;2Wr}R5L_o^QmJ+41^>77B0M8=W(0(VqTo)--~(x@g8D1yIt zRrVOZ{>_(nA1-XS-hNm7Rq_f-+j)4F-gCp>3P1Bu6j6yt4I!1M=X7)OQpQGfyNN)Z z5XJm$3XS;>Ml7HCf4cTy)2y5t;gQ z=~DKNhAg9RL@~-7w`)01o7{x^tIacl5;N;;!?)qct7`YXXr zb$O?a9&X*ddEcf#e;!`l!iU#hM(SmE;5xJuAW}0qa1u0S5g)7sOauf+Q zhn3ZHS08*jX7sI8r-l&Nro`){ExARcRn5{?%%INY3hz?5TT7ZB5iZH?sB@Qn*wp%H z<5PsKpW-P-V4SYy9+kk}d+Mp_%%C~sn1i43jz1K)ZL9J9eZ~#y6f@fOyFCk!YSPJr57JO#YQoeY@g7u)mkv;Z0jM_&z82fu#UPtbdu0j^~lmb4dKM{TZJ>8{QRi(77$~xmvxa}u{hJEXQyZ_~GK4a;n zmDtpdjegT2f1^R20_dIxZ0Y8Swjqm*0k@FZu{>04T&J@5rK)}V)^IQ07gLkf(z6?S z5SbG;2M9h^F{=QDWT&h?OAXhTbzXb>KOEe${jqOwN1W7p+aEqB}(@nE>8E|{fiB>1j--8L><|{0RG)7uHIVzmWGj^ z-}3Xse%jbifB6|<{_g_j&uIBGzx>RVKdXzM_1Mqa@@F;v?|sCd|NS#p{>+s>bLG!m z`7>Ak%$5IN&Xrf?A0E*Uf0=!=Y~E4X)iSU6w(dp<`9A>P8~gcc&#`ZR5ii?*?CWVu zUB9IlRNFu|a?txMBI-p@nPCu_(zU(#};vA>Ikot0c`SDJfA+O5`~(D(g&n z-yBcABWiBjQw>)adL9tc`_5Z&aH&KjfaH=P?@2isurO?%n~up}rS45+#D?W#b{|rB z=N*QA37!B8qvVMzKHqlIt0!G3D-CRf^cMXKs*LLNJH=JFciv9jS=5@&5RX(t`-W;@ z{_!+ucgp!Zqq?|@s*AQFvL z%w3VGYAvp3hD>?ATZwT)dA^j%$qz@Nn7IqtjT)&iSevzsUYcU~mTixAu@}i$4{C2( zeLzBObc0?->}$a74DdPi3+&N{u4P&uz$K+~@82a>wvP#GyEN)6Zl0BVd{&v>u|tb0 z$o%c%m|e-(z?$9a?un zTx|N!jjNgUBOQ9OF26ZTa8zf}Zk z-<>1&_E%+T%{5Aew&ccONVw$Xq;wt{k}W0QRN_aR=dlRYA9=3_Dnj#)Q-?w#gmn5S z-TsILOIii_73K3Yp_{8Ol1M!h@EvY_`jKj*mAgqcK2X7=-J;&SZHG^=pTG0QjRh?a zMMy$6XP~oMl)UE3M3(hRRvTV0Lj85fjf&UiC?8*W4gPVp_|mvqM`QSFDmB9F**g_F z38_0@Desh|7*e4;_p2imw6YBoBp4P|M!u+%F7b6z4CyTz z;IUnGsJ>z+`hvbZ0-~WuQ&W@*5BrBB^6l^VI(7~H^utKJgkZVYc<+T}BP~X;N9XGX zPX!xnjzd$dpND(d*%DgXBsi{SJYJ$k*i%Jr&*59YXijv^X~Vr)llkVJ+RhE*F_-}Z zLrq@3pI5dNqBd(GEj9J@gKe-He<(iOn7z)z3=W0ykSpadud4=MF9>2ACNSTCd*3 zR<4bgCS=xOS3GE1J(1OuyCGB?g9Glw=m6c)f_CRqDw)fwvnyH^63(}$EHBiVq!Evb zXd4pB{S=xzFuyIf;3baS*8I1~cGjCeQHjQfZ(xk`s@5gH>HW8PT1UHADsS3aB~D7i z9m+hTzj+HnYD+fhjDK|e4*#LckxomEA5lc zKPfG*Xo|Ki4IC{vu}~MFJT#r7RcI3#E%{ln{PiT`#zK#g^z0$%M^6khV~g_AbG#A# zChy2|*p=Y+cW zeb+A9(%(s$<%PP+2-oEWgumMSugJk43=KZv2ib%28rY!!CC2_auHLTL?sh|9^Jd@{ z!O`*#dw|!Q(5%b$W3Nlag!CMR6l<1clP;E?5SOyXNeKR$YX@FJje1ln5wI zI(W4lvv2R?waLP6qlacat*+@Y+b>X>B?Jl8vDkY}@%Z2;9b4-ZUP~GL$7u8{`j_=| z`NKo3;97z59o{34%H`u& zUW3p%Pe@8la*kMr5)+jDmL)t-%r?Y(oL7BHbp^QCY0{s>H6i?|64$rSTem(BQC_Yd z)Ak@)UszIBjcm<&J>a`2q*r#boku7_nleYuKo#{HBPHQMtLkWK?pzJKT@Ii<39&*I z84uc=Jd8LZ7wHX_>4Q@2%Z7_w@uv3LSIUrLHKpv2=zQA{qJHuH5OZ(eNQjUml_R9j zq+exKw0AItK^`?e%POF9ub!1$2-c5eVV<&@{v0x!A`vfL}Nz~_cd9hxf85$SEi%EyJoWhXZW7R(vDC04Dbl-{BaT5Np2z}vPQm$uQ ze%b|d^VY#q`P3u@>uT6Q4mF`v1z&&GBD(V}p7_c<)0$>RU0kGgH94gFny?C()1gJo zjHU}s3#Ar@nVj(j=ahUj%Q23l*g!Rm_KhPT<3pT|$YggIncQP<^G!tgj|9ffl<~*} z+VJ%n`UjWP)KuFZ2&*X?aFg2ChPUEPjLfC3!gut~l{GE(6bTQ!omnjC#QUw03t3bO z@wPV+NM^NH`+6)wl)6QF_T5vdRUMKrczUnCK%qVW1Bt4d)GqWJzOwX9!N`dIo+7O0 z920(dO?Nr=*_1S1dDbqfzDoE?CfL}eD^g;-7c3_;Xzqq~R0;-3)w5KRUN$0%?WTGA z?q%w%(R!ucp~!e}k3zl(9SlVIIS9?Eh2Hr!t&#_t5Q8pNX=ScZtmgm^9;e$(YWW!d zDpdux>U1v7pDm8R*;@h1eMR~m0K(hBF2-jroZcav6dE_JI6k%Q8rMEyd4Bix!{ka=B+0Y5F^wO7BsC<9kSnkjc7Uw z+({Fi=)f$;Qf3cL)vS5X%p>tH4dq4U<_D~E<9P*ki~u8-F1-XbwdbXm=lIv6y5n04 zYdCJ^6Les$7jlMr1Mu>?iNMQ$MXAcModnvLAo zff)^RY0o@ygrZlv*!g__zY4xhyMB#dulVfO0&RbgMDRp;NCJnh9Ah+*8I|p6lFpey zoK7%K*PXu^e5zh5V5Tk&PIIKb7CDm031-jV76S}v2KDqx!F*DG0HbWB&^P2MD|%sWj?w{j5}SGgw3pTK7Xucfcm3dXH!dLRJkS2hVs$pHjgFux8{ zpSzK#X9F4uxHhpzgV8|Mbg6J8x=O-{1ZSYUsi3oIuFgt7XXom|FU?9mL|~|i+er^U zT_wawz_}e(@qI*f&qR*?n5(^#wloY^O3~M@5?JVrer| zz=V>X*&wDnb~XWoCV#>=4cRk3ou6{ld9)9g&6|BlmZi;Ue4-BPqs-;7hxEQxw2EFc zbsuiZn9OsO>GGZl_~JO4>?%ncHWpK#U)f!n{7ImEnrRpki779tk%_YMfFS*7CQm65 zA-EW)ie{yk*&y{xUwG)X!$4TKX0PdzfXI@oG+M+vB(VXo}ATh{dF78cl_eD)wJ7$==9FS zr%Kt@gEzWXD;YTo^;1m#9i|F+5XRSI=Gkh;?%;XEy{@gq1{guWOM0*W`{a|?lbV(y zeLZInN)=B{O*<0Ge1rkC*5u4q8E+W*0JAdGXVurLP0@bUE92mac9JIy_NE||97C@O zQFEyip; z`iXJ^2F?k&x&HXx4gmObibm8Euxyem1FPoLU8T6s}nwRc& zg{xx+Vy>B&=Y`N`k6`_f3pujdzZJ)z?x*k~iibnJ$`OGa9Kb%{qoslf{aKY06QFS; z9~NcvZt@T2FITyK%yERg8LumF7@912TpAIg%za2G6CYH%Z=YmP=tZ`rU|AzYYEosx zd981Vtc6S9Us1{4O^}FmX6u1@KOe!4ny~>;T_Cw=fti@thixMt*A93oX~_AaWFS-$ zI^dzRiCJW~@KhyJS$)3dBNW?%br|>(ZPTZUy1Cq3G%1ZiyAR~$LmWdh)>!`fU|>e? z)i+u$(k;+Ih8Z`guTTuwJ&Ae~T}Wn7_;ou0%XFZ7&X-R-c-3*g(5Ew}VO9)MteEOQ zKbX-pnPv-@Ya@7vpSDCfjJ?KludPfKg8V#6$@>1frQB!mpusYIR@v&cm9}(tjE2GR zX_bbcgR;_Vb6@z~x=E9x(kTw=_7wDN({s703`O{d);OVokiZnQOGAWAN3iQ~*MYf= z#8{#_YOb=^lE_>o7gsXv{gZ=(4+-ZTkc#khB}7c#V)~BDme$ zan~i0O26p@-*-)(q;sooIR~%IR$Ce(Cwk8^;~XBNw7!@KYlF`Kk9Q2tYE8fgJ#W1TxlNvKAn> zi=lO{jTaQtA97Yq*^3}WeWgJOLapY3Euf}fJc+ho$DuI$cW;+i;Wq(1hb3Bd=JGp? zXs3I$b|(bsvCPv@qPRr6ykITavF?>mKNx2EqMq~phajVngxK<=-=C8H2uePH8a`># zoSMh~k0{a}l58h*=uFccXwUBc%&bP4%nXrUd zY(=}w@#)Hzht=;qW~ZYrm$P{QMM0f0QUc8B%ES^YK@4Fxd3$Q|%#b2G%`Rf|1RVaw z=-88>Z+~bQVS@}nEy+AHKb8vSF?&e9e+tB5O=|=2x5qy>scFsrd$+Ouh*z|3?7%Xw z7kgqnqPM8fmTrEiYgzen;Xt+zH6ylz8sF2@ zw6;#|lJCy$llgB9vLS);qFObN6c)-$3hfZrsS#M=-jkjO7RnXnRnL7ECnal|U^Y)9 zYBS{gE8KdxkgoDuzGQ9J#uMQNPb){tyath;r2@mA8q^8Tm3MH38pd+xid=csO=r^5 z9n{!Pzy2DGV7c(PvfHt^w|IydH0WC-;uNDwRlLSlT|DtA95bjHC=>i-hy4jP?!%;( z9f{hs#@2i1J~Jw3ql;xi`Gm60t1$wzn)@0wrF(SF8V2hW1B?vOY>(tgp@HXcj$9sipA& zyQ3%+cq+|1hC2#OVH=w%7f?A~!(lRsrWMz*GRHtqUih5~zm|a4wcu}UDYtsc&^aZt zRl8N5@IHbuWWU_<;(Xa!`bx=Ni1!7VG5u((d^zk?V9Q5cl<0jG ztIETk-i*;NnAY2UN?(!31YS*jSz5NMIf!VjP6C{=_aXl=YkTU<*3YV5(^M2EUiIZk zgvdC@(JB$gW}+>81-Lbl`MQNQJ_jrb@>^DH1O3m=2PHfWpv#_ z@@yra>D=o&nQ!BG49(~0x~3-4r&+=ERNAsA=bSK6HO8c9sD+uh*e4E{#$9+^Y=#^1-Q-dBy zfiJyBC}!A|u4V>6Bs~v!t)ePRZB5z6BdDuFTup2FKeTF%JMbMwTz<g&dFAQZ`-9e&k~XT3J+Tr@AU8Huhh0_sr0^F7X@l za&HVuvB*+rnD{u^(z2+*^06zR461$mAJ#wSOf2V zv2t@(;|Cc=W%(+#H3vYSCAknnmXJKR@avA24D52w#j2Afj_K73bCKdz^5rB{_1d^v zoVI=$$pkP)PO>ufAcQoOst#t`-3mrLJ5g#>@9E+yjab>fGCmf%-|s*A!?5-KP-+cm z@~4SFKMnJgyejaYBY{7AS+9o6a_fz^+`^z7HqRKilvD?(8y2-X6twKe6_AHnL{=q? zUS770B2yA(8|t%R=oL8i-U-NwGTYZn@s8eUH{*}KU0E4q&+G>(Lj1eQnfrFZV&@$R63M&B0s5S+^;wSxYy zIj2LV19B(CCz8fQCRC8*Lg@eq(*v4Lg*zBLJI*xk{jkdbIzRisApczU3cAk7vETX;LqOs zw}16{o-IH)!PkxO)dvqeK`mB}AfTbwtzkFV5vJ>pl^?(QGrgq${nk{bY%3yci~Euo zH&Xh~(*u2zlg3odWwVarM>6TNIHx}0xguG7F z0~+@yK*NaYF;@z_U1mWD&dvBL4Q;b7`A%nfm!mQ!5;w?E5)BpxWleF1(U3bQ*bEFq z_mERNbJ6;V)s214(BF)T7uoBL!5;gi=50=mX7389ave+5R@F>;STS;9myg-{ZDCaE z$H-z9eU(N-+cG)IN4d_otba391H}4y>Mv*3d|+G-Yq`;qd|p(WB+c4mm3lTlZyfh6>|4sI%(5vvXQtuV1eaG`0>KUCv&$tX(_1gt zLwbY+A||y-!CsHC{E=Zo$VZ(XJ%Si6yKBQF19RV{*mT$VIjk`U;z_4KWeClCf5wVB zKNmX3JJ2c>`IIj6$+;y8&2m+%iv7=1n+sd>47qR2GYWbhcT_|F9V^5O7-;fE0^2Y| z>&p!!o-NhISayVu+3>k9*3P~yZMKM_e^^E%s~jif_C{t$eJR!f<#<|rj;}>m+W6z1 z2`SC@UoaFW4kGp|htS+B=sE}^rLk#Nee{PE%c=94i)*hAaw28zzDiGs;p1+P1?vm6 zz;k((-IH66;t)C5K{29-TiC@L&9Mc%4g+WMF3z+pWlW?@HnBq71Bucx5e17IOC^Qq zxZ6DF`#J6~^oL%Wu!^Zb^#Tndgicj6i(7N=lIB#$X6q zxC(^jn3VvG8@4PK^Z$}-CQ7}mlpA`;R^mFd>E#cL8KJvgP1WeKH^eq~8pg50cH zY5m+eA!F^$;xfH>3tU|s(Oi5_HInAski9Avj%VI}x!{c*j%;cP?tdP9@dvBM8iGX`TQg$8T%8@KX5=6!xBl4+cVd;I7Etay8 z0{(OzaB3A97nKc!s5Z8@1$< z_3LXiScK2d5R4Q7(QG&xb}Xm~I-OdLJI?uD)9N!4WL9G3@>ZOHh- zMz_<&@ntn3dz}`N9medK-rg(NG_^5=CcVZ|lX`jjllZTHnrc4WwS}hfpZo@z<}Wou zo*e@&4cv!?C3tO?rE@VpdoFl^o2PaYb)cHB+wPs}Qgf_3uq(fp!}PcS&mPCH>wcM- z-ed2Xar76+dfueSZUO7E9x0j+t`?!7WTPEb3IHP}`Y)JQTDYoDW@`>=zBBK5l`2{1 z91h?=k3(J#IrvV4C&{>=R}n?K=VO{MqvN%QaPXzU`~7ba^YQ)O>Yd|KFTF}=)xnwG zDnC;Np|n9iEn88#(nIAXPqWUF)#HVFVvylfMPgcPt%L5(13XkBCdl{jZtqqNC_ z!lu!~W%`=M%=4DW{z-WEAw$<%4Q2+1P*PHLn;|5sQF4x?@}%o2C*7m;JSr}{>vjRg zXl4*Et@0Env0tL9Oe?)=Z1P_$*Pkgz%^u^ExaK#nA&s@GJ`^5Pa$~+0 zG_Dk%_Pz-plrG3|0M`rVUh3^ky{T0ay|CBk1}Oa#?Qh1zD=v@lqCgERJ~qCc?zK1q zGTuA6X|9yMVBEO;Y9=02klW-O-WbuS zzVJy;G(-7swhU!V_)pGqUIjLcU%o?>QIm)iTf8WR4KA5qCr*tRDE5+b&<2SI!|lqN zFo%@{opdwiOzH9#7}@d@d`ufblaoPr<)`jT^fjQf&%;HbAIOB!Fd=jL+ITIRj#%2I z8HI>b$n>pjvbN3gn++8Yx4FuUe%=W`wd;?GG`&8EhiR@8qP$5(T@NssjC_6QiF!Po zXL;i|7=4faTX^l_*TEX+Gpjw0n|nMRSstt@%&9LQ2Hk%#a@w07zpzqgFujH=0RT&b77xL(pH@ACX znth?DrP1&{g$TZy_R!vkiz%`ACr;04^yjujX@r;=Tya9$l-KgBT^k zI}VZpR=mc-g|`a8uajW4qE(64%#lOk@e`=Dvn* zG}69tMW8$TEIxf4?ZXM(YSRju=AMy~Sv4oUPh2287_FDetSANoo|PJ6N1Hk!Zdd1I5UviZ>oUJCZF<1z`C5dLA&qVteU_yxSQ=hIeL0+7-7Nb`>ZF3e&| zB`_{4N#4jDQsy&3xEY}=W8pEA>@&fGWuY@W#kcZ&r5DymC;rTqF5DWYag8zJNB%_| zz-ps=W9;AP7a+AcWKKD0uZ>%AOxWzYy#)UPmw&SMsxrQEdbbNY1TRpWvgyiH?3rFK z001pl7sOUD(YxBcmgirzJ(F&HkLo5%TnPRmNY^oXadiC^%wMzO2K0>Xdx17X{_u2* z{uKLcRSG-)p=T-QqNCg6gdm75 zQ2gbihjaTx))lUaFCOqp4JZ496>h1LZ+syyd9g(EyEffSND(7P?3zHo(_V@(FQVlg z>ftJ8DQT}o6?5-xXfE+19OcWe2X0I_3a_7tLI2XVOM=C>-FQ{2v&EIg7G1!m$PaC4 z>&_OOFpu}{J=w8QZeZ%Ww(@pe7+b|5(C5bScZFH$En7n_l;SPpmc-BIS^Z%S zS9W^W&;XciYeU;@}HRcpy=Gh;yGlw{(h7(LhV&R8tU^+G^cypJ^piS2spDP z32^8erP5!M1aLB~)%ZMuurv`v)zLnGvClzYm!(CfkLR{9wQyG>h#qgV+EE99misT% zu&g(s-`@{1QBYD1!7G6~K0P&yt;`zB_D&4HRJ@+aozl*0ECU+lXp;t|hF10d!WiAG zZk&h^xr_er5|HzUZ7jagOCHVf@!jtTO_#LS+U0d;vr5c8(vhNBy*7iB0g_V_t~wd? zl{pX}b*Qeqr3#1Qm~#s^=Im!a!bBdj(EV%|jM{WMJRO{ez8m%>-*3qnzB&*zWRrAy z9P!SqtEx0r6~yi3Gf999ip%^WjuxPZ?!V@Eh?%^V2j z&G6GwZv^nJ`kYYUq;^)hg!%68xzhs52s_#_#!WowE$wJzjw#NL?`L_D=XcBeWpR(_ zgcuI*J6GL_$TO^|;5+4G-TQ2cIXL$iQQdE$CI|BxKVq({iink8nh-{O2|2IWX*P%G z`N>P`mvwF#v$&S?uiBis-i{SG=H^ zHxs-WE^kH5;GS=F-vBqU6v2eLMU8FY6E!yz-(M_Y*(4a8imdX+V+DLk1pN(>Wax`y zUf3_103K{PT0}MBsQ73wSq6TJh!G!zjgN=M z$*I4CdF+q28Eq1ZQDTW3tz5GL-bQe@_58qBYc6i>(J3C759AiQG&NE{q5f&(%~~PH zFsgGMxq}Ul2aAyfrki2DDnsr`evnpNFXwM(n{yqxYc&+PH2}G1IQ8j?Of1*=A( ztZU>M9y-rDdnvQ^@lXh?j(;**lWEX!`@gX1O=#(*8;hW@X!BU>7);8$K7~h}y0|lR zsv_+TSdBs>a)}SK@g=A1A9%2mm5og!KW%afW+*wTei(x12F58ofrh9tr}kAFWu~OX zMepooyVvLO2ZP+XsPo9`*GXJztPn^A)$L}V8T3~aIJWBCBam{zT5kQLLHyCEL@(Fs z=m#|9sX)Nt+bOU?jkxET2pe`~er!4Qy|1>$*v64$(4Sc9!UPRCe*0zQLa6O6M0s`?W3$ znk?=?Iu$=fb0F%wjz-OIPCd)WexY`Qt`$|1>^63os$W#TXbZY^;h*LYAzSkY#ck^u zAs0DhO0-Wj1ha}MK4NyWFq0WKiVUeuu@M@{Dbw94vy+5Nd&pcR!nROCGrUS}_0+6b z&3Uf?ll3~bFE(ov6tLXvYof7JN=jIvQI1KGw|uX@Cyrj>N43?oU z6v?36d%83X6zPS&=I^}|+aI~WBnJfhkq!=g3Tv(SUJY4`;rE_-Dh1YU75b_B6DB<7 zI`ykNZi|588U@@s*#S(IthEwkcP<)Ev|(C{P3zQ`FxWd~%ULfB=z-rL;E3sIRfC;MC)CuP1yr7ww{u87pS&AcA_mAq6&ZTGa* zvOleBvYLto8@wbX$oAPe_cttI*mV42EhK!CC1+OQ(Qa_MO04#A4SVl|s>zFJLHIqN zjmBNgDks{UO5vuA2Qza6_Q^KzY||Phile(M3q#C&COO0eX`WIReAgET(R4lmwmU}K zom=Tk608lK)Xw$AA7BESgCOBb$i@Nv*TqOY!w2KDX9@tJ*{QeQ`HpQZw6m0k5fecfEzumBrS zVZJhCJ}c{i;O0KWAS~S*$PkvkFv$CRqs`M;$sZ_O`8X&H2a(cRTw~`ackNe}9eGWc zcjzc^rHbs*$#kh7lH%wmfGC*2%!HdljTL22_hCIMb121MRrCXBA3T~*Yn2x5g z-a)6f{chExq3Kf*4X+qy$$D4NwP8I{X-xQgU9eH(q&ud$EK!E$*P?_Q{|V{Xh2Ch-LNblN_ z-l4?Q+>+O09b9+)mxsD0dcdpb>Ko8`5k5xsxCy*8YUDiO_SW3ysA8{^=(wZ5IzZv# zMD9D{UI^*Tj}RcYd8hC9Cp@Fl|G9SR0B#{k|j?%zQ=ccJ=TI&mgVNX|>3oQ^46 z)R4q}46^rG6$lkUlq_Y&vhV$Kj|BxJ4bjX##$B z-oM&M;uD32EBd@$RYU16LH^2p>FUMa7A-tW;LXzKG#xQOD~0d9MP2mtZxD~!DzbIz ze)~v2?B=|DR~#^U(>dA5V79#YIBIX6K^zF%A8?A}Q6199qu;#}%7>U6$ORT@CS1({ zpsFTn{g7DCi9mBFwh&{A1+8Q1HutNI&%KcGh(mrczV)BGr+SUTK736bu}prFWF{Zd zc8j&Z*Qm&Iik#N@?l-(H$*VtV(kgs<$!PS8;^_{bmgcDfCU4;2UefhUVVHtgunM2B z#w9PSmhmL9d%ouVU$Rs8>f-^$U$V3L`IS*_DOU=9fiA^1u6EXEfUo6e zu1ryR{0B1R>}YaJgbNkJpB98Jv$mMj0jt9|X#`{H--ZznN_~AJDI7|9ile8OY+=iF z@&72{76yK=;6SUSL1`8qQp&;7SS6oE@)8{*K-~!AR%WUK8rSi?b!2XS(}C2I}Td&s%Frs#c(V$%dqtTOplV=Zalo1>ETOsD z-a7Y^l&@u;#>>If76)`+|;H zJ%CxA5xV-WdrD=!NQaqh`c<#IAPby3vX_qdx;yzUiXt#zF*&|i*6<}jP2dW$pS8KXV zzvO~jBz?N)c#~z%KmD_RSn)S7=-;C4{wqf34@%kJ{_2|K!PneQ2|lKc8KCq#IX>xn z8};wfw7NQ+@-1_t8piwRmEmhxQN_9kIG-2o30L=?($1xQ)UINzx-RyMWUIkivt|U? zdFD(PZZz%AtID=7b|OKO^DKi34_3R52tFF*3Q>>JGD=c7Q2h@l@w@Oy(&?>iseY6Z zIq@&;zrU^x`j2h@mhL0-KI~)4U7A$M{_i^6ov-{g&DNcB`JbxX{=c(h$6Ar3KePb; zy?XEeJL}q6%Rl8LJD&5u=}_-j^8dd+ZRhUq-2ESE(C^&+oxA_{>iS=Q*ol=pv2v%z z{QHX?JKl1~TmGw){QGZqyycF!{J+UtGMG<1VQX`;<||P)?WSeyUrt&cIJ^7wtEgvA zj}8UiF&6S~u-*6e1RMEc{oA95oQ8Q07d$y~B;r=8cxJR-jrXaBjMvZgZm0Y#ltI?` zrG`x{{-jJfjJ@_UXg|ql7YYIu?o+Z!P?WgRkM>Gj1XJ_eSJ&rq{nj9>L+iJ4rOLCz z2rq{OgKe$t%^;P6Qp|^b*doq->;11k-oJXf{~i-22XZZ5PX(pq&t@dfO?I~2Qw1cL zb4@-v84!BxC5eB)EiVSw<(_9c`MqzD!;8mbZwrN?-uoqM-LG`(T5u@>`@V(pp!R(0 zsjq8WU;o6=VZQGf!v${>OW+AGQzbu^i88moxP}^K$9%$kU zTF@@H$;@3(Yeh->o`lIP0i&1+s~A~Dg9Hd}^d>WyI?;#v2^#_*D7n%Q(50k)$)6w& z5S4{EC*4997D~daYliqR;XHPD4H4t29DPP%@ua6vc9uUn!Nq&zZguk^E3*)`I086r z$ZT0{Ik{fQlCP^c2yhAYqK4KTA~L#qBowm_r@Q4_b)HwP9I~w&v<3(Is*mT z{*t6;7o&viHdw0JbY{ar?G>KH(PP}2CZd_V64k>McT>FmDw0j$oi9S!bbP`|$h9u8 zSfUre^7%&%%o#y*vo#rjVz#d{p3B=^WS?4moD4}WAG*#(TIbg#mkF_{u=5$ZHgjid z&H*9`55DG?K#4p&h`_kzS&hi`7>p-y(6`d0|lo2LA6^8hAC`rPi5KmE(0{q|o^qPqERStIDY>#O78K>lJo4Q5F9wZdQ8EoTd!-&EH%< z61ow6sqx;$GP};Tp_@W#-h3PLj~5234%&+X#@9G+ljk1J%n?pa1aV&JF!dX*eH^71 z)%i@5m1lO9WJ|zy=jN2fm0wURRamZxv2^Mm>_r99zQ5*c?{Um06Ri%|FRM?fSoCQt z4z#64#e^ZRR-bRJzqXG@{19HTaK==kGJV#xymk4dvAwGSUk_Kc*5R(!-ii$mEjxA@ z>W$occnpeY0 zn}_pK*{Ba91mD6wUF<x4NzL%t%>? zvgq``c(XSDMq?^=K+$Zf*(y=1+c>QdTf$O6)}JaI0hkFhqs(j z^j|r1HfZ_RyZ+BPziW3-EfbhCrAc9vX3h!fYc>`?qJUor@7}X?>W#6Op{rI4yz2(r-b+^5b zh|rNpC}N=1DU`SwP$RfH*O6J)9Z!9HCC1LKA5-RoY1jY{nHG^`)aM<|Cp~pijwv;i z#l|3Y9b!ynd!lxO!{9UKUOMY8X8SnL6TscjwYYR>)pA%4?7_QwB5$KFd^q4ZfG)9o zQ+?JPqe!o6k&%TO%L~-K!Jv%_33Ww6Iy02AbN=`?#-u=+u%|@okrXF0Q*R<5@p4(J z0ku1AWDJP6a2-MO0b`HK{otHpx6WzBcDv_9c)$aUq766YjVa-M-Va>BG?Jrlrf}D) z;xDfHO);wGK7XiYDO<%95T1gO(qtq{-`v=YJ`3J&;{y~hJ%p|G#ZLlSy_aVZ!tz<9 zt31*)re@b^DxbIM_>h5em1p-6(g4fw#c=MUN|#+0W`d3p_d!7>ZL#)8Sy=;=12K&t z@`A_@4w{AO{f>Y6mP@zXC|(__RFzJ!x2Cuy2t|1*Y1?beXQg;2Q(iub9WXY)&)>ye zswKXtOzTuGE(dnayOTC;ZOnA9XJvp8buNtp_;LfZInLWn(@kVxsg>0xtlA6I|A#fUJ6?hff|-F?elvr+Q)VaurL%!!BQj!*>9z6E4Cj4#vb_#2QPMgdoGgj;25xn`BXIa>XZAng}Mjk z*m{+&f`}jeOd{M8DOrm(5jNf2?Qy8_7md6pa*qM)Ih=YKqm(0YXdaKvrpbaACgy&w zv{&jV12M3jS;@ls7*f1!Io)K{0Cvj_3gD3p(m)n1$ODK5+WpZE(qi&LLL|(@^ZDB% z;F3MpEjQNq0m`eLJ_O8gwsArIyWxTfhT#DGg3%-Cf!9dPe6j-=qp!)4SmB4YO;S@% zUj7<&o=M28dzzg5es^u|k@Tmj-?y5pM}KBVw61@hjA{@4oR{KV7^f~K!3S~o)`$*y zdRY3=S)|Y7u5xP+t-f;Cm?^H3-toMvS%Th47t&&K-O0qn?nMp+VW0+7lpW-Dm+|S= z7!MULOBLwLedW?w?<{fN#5;Wjj~oWGS<@|=H}xasWRyG~uNOD}Yzu1g#ka0d2VqxQq30g6BW_l>!!*t0YrN7;-JSh5!YXvTz}+*HYAd`V zU2oo5U7G*N{%4xk5lds0ynWThjUy(t#?nKm#Z(c5=~{v#(RQ=k@4EZO;%m_7#+&nI z)UHA8@cA5&Jr370rPMw1>|he#V|Ly3!;)11Myo#_LfY6F>I|pMT}uwG{yb z?`}H+G%~3V$`13L2Gp<%PC&1u7_ZjR)e?BO(o#zHEPvZryO?8HYOffSkrU#CnLv7k zNn)+j@DytvGiEkxWY~j{bs4^Py*Fh2;oZB}yBZ>zyx0Ip6FG#VwAPZ|EF+8B)~$MGs)73{hweg%A#tL7 zGL}IK?YbMczV*`j-_k_c^S?6lBhBztHaFm555AsooT+!r%yf2_{by75kNF4BEaJ|@ zwM!NGRJ2F5C?sW+oCo)4D|S$CiMKiAW;;S=I5r75IKR9x zoH`n^@I_=f&h@zVqp~9(OV4x1yVnf*ScSvtuz{GIMnGo9OxzspO=_4*Q>2ZOENG6y zgzpTj_ua6~3^=`slxIRFk>X{@H7u}z+;@5`peO~;(HFsbVnrSEeFElwP$B#o!A;^W zq5cxrsqR=?9#Dd^51-VJPTGAd0oHxL?F87wrmQ4>JZl&*g}xx~Go8-z4m$o(hNZF> zMW_1>x%K3!o&iQ3suk=g6Q!A#?ll@}iNrX^EiQyiShAegR7>6WRzU7ueg`kFu<+fp zUEnU-?Qxvj2iYrf6Tz%poUa7jVh={EnpVu0g_!b!F57nmkJ)bsZbVO10{l)omf{Qq zK-tbQ3tGLRxD{H@O+p$p7k}}JgE`fiXmB1E-j{O8O61^otI?l!hn-+LGj?xB=nVG4 z9Merzmakmt>M%&}dtQF*j>Q?3(SH{MSpwtYX9&acATh!Uw@qSiy1~>fgBku{>N8~p z7YYwPp1Qn3{TjCUVk8_>-0WD!R}S(q81rw8)XJXga|Pp9hXuJ9-elatv_~eqO;*cE zB9)#`27W3sfDAfh19ug*&7IryXBIQ;DCgBu!VFsoojmKWCB?0Bz+vxEP2S3lA&*Tn z5kRf-j}m^7t%U!{x6;kfnXW5KNxS2YDbPFLb!{BwzZcyI z9C{0#n|#EPA5p&07l=VA%abG+>B2o6wYd?_M*F{4U|t)ZW$zF+u`Ah3$OBqny`j<-2|K3L7(XJtIQ02QI9e9>lQ3}2j~tb-Oe70UsFqm7 zJ5#z6P*OS6ChHb6RN}HnTkE+{$1=zhPiuC>VvUx0#Zs|WItTKkr*gFNCQmkZ@dS4v z_Ya&!vCP(GvDo%y;lnsr`p#ErCOp{8cbOkW6ar*>z${{|{7N4sIZnTUYV}8TlJ<7> zsi;a|vo85Rv}y-O>a!|CS4+|H=DqKbY^}#E!0Dm+N#l~A^AZ@#g{TvQ_Sa6|VR{>S zA+u_fb1z2{(i#DI$9iO@9p|M@q#efzM&f4G$JwIz!4H<3{gvq*8tx%I{GXLGXto>k zwSf7x`EccpZlmfDt;?wF8DhQP#OilD7KxFpJjA^1@*622R=CKeMHg$ zjyGD%ytO_8(#I}X(_Vo@jqsZARFJ?`vmeCTCv00KNbt53tBRh$I3;vu_tVE9OIOCz z$5-^RnK{M97cRW<8Yw-35qy=1G>W@s-CMwpD6T2l>}|d-Lb6g%D$~2^icZA&tj^i> z_kHF4SfL-U=kds^=>w%B6;_=AB+kpDiIY zJZ;cfo}9neV_dl6(w$tbcDdQnk_|JbE`Dg{X7bYj!Q1fWdv7sN6l8w7DUQ6+`i}hv zLFlUNRz|(IbK5?mfCJG?P=9uJ%)Wy2xbq`8e*%|TN;~+vozqga0b>>>bB{K35N!HV ziK({VM@;fseeT`?*0X9&zonTwm*|wU4@n*88#!|%#el?SXP{65#IBG?uwKLP=4}5| zwub!|IWd*b1k-zRkT(^F#CZemPRay{z|IDvr<)i$vV@kKm1MYVUXFc~s9A6@TZsBT zHWOflx+F>NK6Q1l4KB)12|7aIjwsyg5`*j6#7tXXh>APQ^f7QjNj7bM; z!^W-(RvhN$mX;#kb=)8}H^?6qUjJfw9A=0)7{aW=R+g0kI_oh?2|jK_V;vnGL%nxO z?ST+^&P^9`i#rT|1$8l7>*!)!>(~XGdz;H#-g_|qc;Pale>@2l(w{DZdF07bqLqpt z@t}s4V&j+yfg8@QErXeQDb zL;p!b&ghr#ZYr}UKmF-v_59Pb+ zc}B&fYi!JVdv}St42OV>Pov-rV$tOLVQy3G+*YG(aohRa)|8OJR2tQsO2U%Mx{(OZ z*6OubGa*Y;Sz^)0D;fOD6VJL>DR)^6(krgvvzEFP!g4h6aJN!~G#1$CY~R*oA@bd- z=V{p1Pzl7p!jSLV{@}BS->*D5&FO39$r2^Gshp5L(J+^h;)%D-;$3Wcagte-bfF6J zrO^JelO;0i^C8L*%4iHlO6AUAv7+l}Pk`TYPf;@~Me&0{U-J99aWB2Qdjb#>ZIz#erSCppxM^WR za~*bO{!#6rexCumj!fr8f6E*)5_HXVff;a&OVz}op9#&R=jOA??X1D5I9 z`tDiw`B0K#aq`E$4b(`ejVuANv<|BtI|D>yY3f7rrq)j zfQ-bnb`4x}aAizL^5Yf>fq1#qz+6X~Pe11m^60^>;UY_cG-{jO%LeBnvF_%THb*Bb zzvxjsW7xn9MO)|J)z�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 K1GW1ue*X`ud4quf literal 0 HcmV?d00001 From 9fdd999cccd2f9aede3bb4a67c9d8710a0eb8774 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 14:05:27 +0530 Subject: [PATCH 12/81] 1.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3892ea1..98a76d5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "0.0.0", + "version": "1.0.0", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From d2085728629791b09d40d28ecc569818ca39ef4f Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 14:07:24 +0530 Subject: [PATCH 13/81] Update CHANGELOG.md --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..7e345fc --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +### v1.0.0 +2-Aug-2016 + +Add the initial release supporting following project types: + +* Create React App based projects. +* Any other React app. +* Any React component library. From b80ab9a0207ab1d6f85ec9a68c87874eea18b71e Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 14:49:03 +0530 Subject: [PATCH 14/81] Update README.md --- .gitignore | 3 ++- README.md | 11 +---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 170c74b..acf0928 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules *.log .idea -npm-shrinkwrap.json \ No newline at end of file +npm-shrinkwrap.json +*.DS_Store diff --git a/README.md b/README.md index a50fc78..15b9036 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,7 @@ Easiest way to add [Storybook](https://github.com/kadirahq/react-storybook) support to your project. -With Storybook, you'll get a visual development environment to development your UI React components.
-It comes with [many features](https://github.com/kadirahq/react-storybook#features) and [customizable](https://github.com/kadirahq/react-storybook#learn-more) as you need. - -![](https://raw.githubusercontent.com/kadirahq/react-storybook/master/docs/react_storybook_demo.gif) - ---- - -### Adding storybook into your app/project +![](docs/getstorybook.png) First install the storybook generator globally. @@ -23,6 +16,4 @@ Then go to your project and run: getstorybook ``` -![](docs/getstorybook.png) - That's all you've to do. From 07118d02cdafb95b2865f6a68850542178f7b009 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 2 Aug 2016 21:55:48 +0530 Subject: [PATCH 15/81] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 15b9036..7c60b69 100644 --- a/README.md +++ b/README.md @@ -17,3 +17,7 @@ getstorybook ``` That's all you've to do. + +--- + +For more information, refer [React Storybook](https://github.com/kadirahq/react-storybook) documentation. From b28466dbd54fcf547e46e00a29466a2dd5b669e4 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 3 Aug 2016 13:24:29 +0530 Subject: [PATCH 16/81] Now we are printing better NPM logs. related to: #5 --- lib/helpers.js | 11 +++++++---- package.json | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/helpers.js b/lib/helpers.js index 4ce0b13..88172a4 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -1,8 +1,8 @@ var path = require('path'); var fs = require('fs'); var chalk = require('chalk'); -var sh = require('shelljs'); var logger = console; +var spawnSync = require('spawn-sync'); exports.getPackageJson = function getPackageJson() { var packageJsonPath = path.resolve('package.json'); @@ -87,9 +87,12 @@ exports.codeLog = function codeLog(codeLines, leftPadAmount) { }; exports.installNpmDeps = function () { - var done = exports.commandLog('Installing NPM dependencies'); - var result = sh.exec('npm install', { silent: true }); - if (result.code !== 0) { + var done = exports.commandLog('Preparing to install NPM dependencies'); + done(); + + var result = spawnSync('npm', ['install'], { stdio: 'inherit' }); + done = exports.commandLog('Installing NPM dependencies'); + if (result.status !== 0) { done('An error occured while running `npm install`.', result.stderr); process.exit(1); } diff --git a/package.json b/package.json index 98a76d5..466ad1e 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "commander": "^2.9.0", "merge-dirs": "^0.2.1", "shelljs": "^0.7.3", + "spawn-sync": "^1.0.15", "update-notifier": "^1.0.2" }, "devDependencies": { From 0e3edd0d6e03a3285e1cd6e926c746c51ecc0557 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 3 Aug 2016 13:24:44 +0530 Subject: [PATCH 17/81] 1.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 466ad1e..7796439 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.0.0", + "version": "1.1.0", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From 6dfa5c4d232ae808b979353f577ec67862beaf45 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 3 Aug 2016 13:32:17 +0530 Subject: [PATCH 18/81] Fix some logging issues. --- CHANGELOG.md | 7 +++++++ lib/helpers.js | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e345fc..deb4951 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### v1.1.0 +3-Aug-2016 + +Show some feedback when installing NPM dependencies. Fixes: [#5](https://github.com/kadirahq/getstorybook/issues/5). + +Now we use `childProcess.spawnSync` to run the `npm install` command. + ### v1.0.0 2-Aug-2016 diff --git a/lib/helpers.js b/lib/helpers.js index 88172a4..f827bc1 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -93,7 +93,7 @@ exports.installNpmDeps = function () { var result = spawnSync('npm', ['install'], { stdio: 'inherit' }); done = exports.commandLog('Installing NPM dependencies'); if (result.status !== 0) { - done('An error occured while running `npm install`.', result.stderr); + done('An error occured while running `npm install`.'); process.exit(1); } done(); From d92b283f412b60ace964cfdebbb50eda7786eed3 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 10 Aug 2016 12:30:52 +0530 Subject: [PATCH 19/81] Add better stories for a REACT_SCRIPTS based app. --- .../template/src/stories/Button.js | 28 +++++++ .../template/src/stories/Welcome.js | 73 +++++++++++++++++++ .../template/src/stories/index.js | 19 +++-- 3 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 generators/REACT_SCRIPTS/template/src/stories/Button.js create mode 100644 generators/REACT_SCRIPTS/template/src/stories/Welcome.js diff --git a/generators/REACT_SCRIPTS/template/src/stories/Button.js b/generators/REACT_SCRIPTS/template/src/stories/Button.js new file mode 100644 index 0000000..fdbcf62 --- /dev/null +++ b/generators/REACT_SCRIPTS/template/src/stories/Button.js @@ -0,0 +1,28 @@ +import React from 'react'; + +const buttonStyles = { + border: '1px solid #eee', + borderRadius: 3, + backgroundColor: '#FFFFFF', + cursor: 'pointer', + fontSize: 15, + padding: '3px 10px', + margin: 10, +}; + +const Button = ({ children, onClick, style = {} }) => ( + +); + +Button.propTypes = { + children: React.PropTypes.string.isRequired, + onClick: React.PropTypes.func, + style: React.PropTypes.object, +}; + +export default Button; diff --git a/generators/REACT_SCRIPTS/template/src/stories/Welcome.js b/generators/REACT_SCRIPTS/template/src/stories/Welcome.js new file mode 100644 index 0000000..5887c01 --- /dev/null +++ b/generators/REACT_SCRIPTS/template/src/stories/Welcome.js @@ -0,0 +1,73 @@ +import React from 'react'; + +const styles = { + main: { + margin: 15, + maxWidth: 600, + lineHeight: 1.4, + fontFamily: '-apple-system, ".SFNSText-Regular", "San Francisco", Roboto, "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif', + }, + + logo: { + width: 200, + }, + + link: { + color: '#1474f3', + textDecoration: 'none', + borderBottom: '1px solid #1474f3', + paddingBottom: 2, + }, + + code: { + fontSize: 15, + fontWeight: 600, + padding: "2px 5px", + border: "1px solid #eae9e9", + borderRadius: 4, + backgroundColor: '#f3f2f2', + color: '#3a3a3a', + }, +}; + +export default class Welcome extends React.Component { + showApp(e) { + e.preventDefault(); + if(this.props.showApp) this.props.showApp(); + } + + render() { + return ( +
+

Welcome to Storybook

+ +

+ This is a UI component dev environment for your app. +

+

+ We've added some basic stories inside the src/stories directory. +
+ A story is a single state of one or more UI components. You can have as many stories as you want. +
+ (Basically a story is like a visual test case.) +

+

+ See these sample stories for a component called Button. +

+

+ Just like that, you can add your own components as stories. +
+ You can also edit those components and see changes right away. +
+ (Try editing the Button component + located at src/stories/Button.js.) +

+

+ This is just one thing you can do with Storybook. +
+ Have a look at the React Storybook repo for more information. +

+
+ ); + } +} diff --git a/generators/REACT_SCRIPTS/template/src/stories/index.js b/generators/REACT_SCRIPTS/template/src/stories/index.js index e1328b2..7ad560e 100644 --- a/generators/REACT_SCRIPTS/template/src/stories/index.js +++ b/generators/REACT_SCRIPTS/template/src/stories/index.js @@ -1,8 +1,17 @@ import React from 'react'; -import { storiesOf, action } from '@kadira/storybook'; -import App from '../App'; +import { storiesOf, action, linkTo } from '@kadira/storybook'; +import Button from './Button'; +import Welcome from './Welcome'; -storiesOf('App', module) - .add('Default View', () => ( - +storiesOf('Welcome', module) + .add('to Storybook', () => ( + + )); + +storiesOf('Button', module) + .add('with text', () => ( + + )) + .add('with some emojies', () => ( + )); From 6870e506e7627b8fd6703a71331cb63f64ea56c8 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 10 Aug 2016 12:43:10 +0530 Subject: [PATCH 20/81] Fix issue with force detection. After we added -f, it'll always detect this as a CRA app. --- bin/generate.js | 18 ++++++++---------- lib/detect.js | 3 ++- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/bin/generate.js b/bin/generate.js index 806128c..b5caa11 100755 --- a/bin/generate.js +++ b/bin/generate.js @@ -34,7 +34,9 @@ var projectType; var done = commandLog('Detecting project type'); try { - projectType = detect(); + projectType = detect({ + force: program.force, + }); } catch (ex) { done(ex.message); process.exit(1); @@ -42,16 +44,12 @@ try { done(); switch (projectType) { - /* eslint-disable no-fallthrough */ case types.ALREADY_HAS_STORYBOOK: - if (!program.force) { - logger.log(); - paddedLog('There seems to be a storybook already available in this project.'); - paddedLog('Apply following command to force:\n'); - codeLog(['getstorybook -f']); - break; - } - /* eslint-enable no-fallthrough */ + logger.log(); + paddedLog('There seems to be a storybook already available in this project.'); + paddedLog('Apply following command to force:\n'); + codeLog(['getstorybook -f']); + break; case types.REACT_SCRIPTS: done = commandLog('Adding storybook support to your "Create React App" based project'); require('../generators/REACT_SCRIPTS'); diff --git a/lib/detect.js b/lib/detect.js index 74af707..574e899 100644 --- a/lib/detect.js +++ b/lib/detect.js @@ -1,13 +1,14 @@ var types = require('./project_types.js'); var helpers = require('./helpers'); -module.exports = function detect() { +module.exports = function detect(options = { force: false }) { var packageJson = helpers.getPackageJson(); if (!packageJson) { return types.UNDETECTED; } if ( + !options.force && packageJson.devDependencies && ( packageJson.devDependencies['@kadira/storybook'] || From 2e290197b66531f25309dd9672deb3f87423c09d Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 10 Aug 2016 12:49:55 +0530 Subject: [PATCH 21/81] Add better default stories for the REACT template. --- generators/REACT/template/stories/Button.js | 27 +++++++ generators/REACT/template/stories/Welcome.js | 73 +++++++++++++++++++ generators/REACT/template/stories/index.js | 15 +++- .../template/src/stories/Button.js | 5 +- 4 files changed, 113 insertions(+), 7 deletions(-) create mode 100644 generators/REACT/template/stories/Button.js create mode 100644 generators/REACT/template/stories/Welcome.js diff --git a/generators/REACT/template/stories/Button.js b/generators/REACT/template/stories/Button.js new file mode 100644 index 0000000..5662b88 --- /dev/null +++ b/generators/REACT/template/stories/Button.js @@ -0,0 +1,27 @@ +import React from 'react'; + +const buttonStyles = { + border: '1px solid #eee', + borderRadius: 3, + backgroundColor: '#FFFFFF', + cursor: 'pointer', + fontSize: 15, + padding: '3px 10px', + margin: 10, +}; + +const Button = ({ children, onClick }) => ( + +); + +Button.propTypes = { + children: React.PropTypes.string.isRequired, + onClick: React.PropTypes.func, +}; + +export default Button; diff --git a/generators/REACT/template/stories/Welcome.js b/generators/REACT/template/stories/Welcome.js new file mode 100644 index 0000000..5887c01 --- /dev/null +++ b/generators/REACT/template/stories/Welcome.js @@ -0,0 +1,73 @@ +import React from 'react'; + +const styles = { + main: { + margin: 15, + maxWidth: 600, + lineHeight: 1.4, + fontFamily: '-apple-system, ".SFNSText-Regular", "San Francisco", Roboto, "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif', + }, + + logo: { + width: 200, + }, + + link: { + color: '#1474f3', + textDecoration: 'none', + borderBottom: '1px solid #1474f3', + paddingBottom: 2, + }, + + code: { + fontSize: 15, + fontWeight: 600, + padding: "2px 5px", + border: "1px solid #eae9e9", + borderRadius: 4, + backgroundColor: '#f3f2f2', + color: '#3a3a3a', + }, +}; + +export default class Welcome extends React.Component { + showApp(e) { + e.preventDefault(); + if(this.props.showApp) this.props.showApp(); + } + + render() { + return ( +
+

Welcome to Storybook

+ +

+ This is a UI component dev environment for your app. +

+

+ We've added some basic stories inside the src/stories directory. +
+ A story is a single state of one or more UI components. You can have as many stories as you want. +
+ (Basically a story is like a visual test case.) +

+

+ See these sample stories for a component called Button. +

+

+ Just like that, you can add your own components as stories. +
+ You can also edit those components and see changes right away. +
+ (Try editing the Button component + located at src/stories/Button.js.) +

+

+ This is just one thing you can do with Storybook. +
+ Have a look at the React Storybook repo for more information. +

+
+ ); + } +} diff --git a/generators/REACT/template/stories/index.js b/generators/REACT/template/stories/index.js index 9ab169d..7ad560e 100644 --- a/generators/REACT/template/stories/index.js +++ b/generators/REACT/template/stories/index.js @@ -1,10 +1,17 @@ import React from 'react'; -import { storiesOf, action } from '@kadira/storybook'; +import { storiesOf, action, linkTo } from '@kadira/storybook'; +import Button from './Button'; +import Welcome from './Welcome'; + +storiesOf('Welcome', module) + .add('to Storybook', () => ( + + )); storiesOf('Button', module) .add('with text', () => ( - + )) - .add('with no text', () => ( - + .add('with some emojies', () => ( + )); diff --git a/generators/REACT_SCRIPTS/template/src/stories/Button.js b/generators/REACT_SCRIPTS/template/src/stories/Button.js index fdbcf62..5662b88 100644 --- a/generators/REACT_SCRIPTS/template/src/stories/Button.js +++ b/generators/REACT_SCRIPTS/template/src/stories/Button.js @@ -10,9 +10,9 @@ const buttonStyles = { margin: 10, }; -const Button = ({ children, onClick, style = {} }) => ( +const Button = ({ children, onClick }) => ( +); + +Button.propTypes = { + children: React.PropTypes.string.isRequired, + onClick: React.PropTypes.func, +}; + +export default Button; diff --git a/generators/WEBPACK_REACT/template/stories/Welcome.js b/generators/WEBPACK_REACT/template/stories/Welcome.js new file mode 100644 index 0000000..280d5f9 --- /dev/null +++ b/generators/WEBPACK_REACT/template/stories/Welcome.js @@ -0,0 +1,83 @@ +import React from 'react'; + +const styles = { + main: { + margin: 15, + maxWidth: 600, + lineHeight: 1.4, + fontFamily: '-apple-system, ".SFNSText-Regular", "San Francisco", Roboto, "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif', + }, + + logo: { + width: 200, + }, + + link: { + color: '#1474f3', + textDecoration: 'none', + borderBottom: '1px solid #1474f3', + paddingBottom: 2, + }, + + code: { + fontSize: 15, + fontWeight: 600, + padding: "2px 5px", + border: "1px solid #eae9e9", + borderRadius: 4, + backgroundColor: '#f3f2f2', + color: '#3a3a3a', + }, + + note: { + opacity: 0.5, + } +}; + +export default class Welcome extends React.Component { + showApp(e) { + e.preventDefault(); + if(this.props.showApp) this.props.showApp(); + } + + render() { + return ( +
+

Welcome to Storybook

+ +

+ This is a UI component dev environment for your app. +

+

+ We've added some basic stories inside the src/stories directory. +
+ A story is a single state of one or more UI components. You can have as many stories as you want. +
+ (Basically a story is like a visual test case.) +

+

+ See these sample stories for a component called Button. +

+

+ Just like that, you can add your own components as stories. +
+ You can also edit those components and see changes right away. +
+ (Try editing the Button component + located at src/stories/Button.js.) +

+

+ This is just one thing you can do with Storybook. +
+ Have a look at the React Storybook repo for more information. +

+

+ NOTE: +
+ Have a look at the .storybook/webpack.config.js to add webpack + loaders and plugins you are using in this project. +

+
+ ); + } +} diff --git a/generators/WEBPACK_REACT/template/stories/index.js b/generators/WEBPACK_REACT/template/stories/index.js new file mode 100644 index 0000000..7ad560e --- /dev/null +++ b/generators/WEBPACK_REACT/template/stories/index.js @@ -0,0 +1,17 @@ +import React from 'react'; +import { storiesOf, action, linkTo } from '@kadira/storybook'; +import Button from './Button'; +import Welcome from './Welcome'; + +storiesOf('Welcome', module) + .add('to Storybook', () => ( + + )); + +storiesOf('Button', module) + .add('with text', () => ( + + )) + .add('with some emojies', () => ( + + )); diff --git a/lib/detect.js b/lib/detect.js index 4a3d2ad..6b7b568 100644 --- a/lib/detect.js +++ b/lib/detect.js @@ -25,6 +25,13 @@ module.exports = function detect(options) { return types.REACT_SCRIPTS; } + if ( + packageJson.devDependencies && + packageJson.devDependencies.webpack + ) { + return types.WEBPACK_REACT; + } + if ( packageJson.peerDependencies && packageJson.peerDependencies.react From 27dc9b23636db0a7aa349330733e759022f47e5a Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Thu, 11 Aug 2016 00:11:27 +0530 Subject: [PATCH 26/81] Add support for Meteor. --- bin/generate.js | 14 ++++ generators/METEOR/index.js | 54 ++++++++++++++ .../METEOR/template/.storybook/config.js | 7 ++ generators/METEOR/template/stories/Button.js | 27 +++++++ generators/METEOR/template/stories/Welcome.js | 73 +++++++++++++++++++ generators/METEOR/template/stories/index.js | 17 +++++ lib/detect.js | 8 ++ package.json | 1 + 8 files changed, 201 insertions(+) create mode 100644 generators/METEOR/index.js create mode 100644 generators/METEOR/template/.storybook/config.js create mode 100644 generators/METEOR/template/stories/Button.js create mode 100644 generators/METEOR/template/stories/Welcome.js create mode 100644 generators/METEOR/template/stories/index.js diff --git a/bin/generate.js b/bin/generate.js index 352e0ed..52068db 100755 --- a/bin/generate.js +++ b/bin/generate.js @@ -78,6 +78,20 @@ switch (projectType) { logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; + case types.METEOR: + done = commandLog('Adding storybook support to your "Meteor" app'); + require('../generators/METEOR'); + done(); + + installNpmDeps(); + + logger.log('\nTo run your storybook, type:\n'); + codeLog([ + 'npm run storybook' + ]); + logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); + break; + case types.WEBPACK_REACT: done = commandLog('Adding storybook support to your "Webpack React" app'); require('../generators/WEBPACK_REACT'); diff --git a/generators/METEOR/index.js b/generators/METEOR/index.js new file mode 100644 index 0000000..27e21e8 --- /dev/null +++ b/generators/METEOR/index.js @@ -0,0 +1,54 @@ +var mergeDirs = require('merge-dirs').default; +var helpers = require('../../lib/helpers'); +var path = require('path'); +var fs = require('fs'); +var sh = require('shelljs'); +var JSON5 = require('json5'); + +mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite'); + +var packageJson = helpers.getPackageJson(); +packageJson.devDependencies = packageJson.devDependencies || {}; +packageJson.scripts = packageJson.scripts || {}; +packageJson.dependencies = packageJson.dependencies || {}; + +// create or update .babelrc +var babelrc = null; +if(fs.existsSync('.babelrc')) { + var babelrcContent = fs.readFileSync('.babelrc', 'utf8'); + babelrc = JSON5.parse(babelrcContent); + babelrc.plugins = babelrc.plugins || []; + + if (babelrc.plugins.indexOf('babel-root-slash-import') < 0) { + babelrc.plugins.push('babel-root-slash-import'); + packageJson.devDependencies['babel-root-slash-import'] = '^1.1.0'; + } +} else { + babelrc = { + presets: ['es2015', 'es2016', 'react', 'stage-1'], + plugins: ['babel-root-slash-import'], + }; + + packageJson.devDependencies['babel-preset-es2015'] = '^6.9.0'; + packageJson.devDependencies['babel-preset-es2016'] = '^6.11.3'; + packageJson.devDependencies['babel-preset-react'] = '^6.11.1'; + packageJson.devDependencies['babel-preset-stage-1'] = '^6.13.0'; + packageJson.devDependencies['babel-root-slash-import'] = '^1.1.0'; +} + +fs.writeFileSync('.babelrc', JSON.stringify(babelrc, null, 2), 'utf8'); + +// write the new package.json. +packageJson.devDependencies['@kadira/storybook'] = '^2.0.0'; +packageJson.scripts['storybook'] = 'start-storybook -p 6006'; +packageJson.scripts['build-storybook'] = 'build-storybook'; + +// add react packages. +if (!packageJson.dependencies.react) { + packageJson.dependencies.react = '^15.3.0'; +} +if (!packageJson.dependencies['react-dom']) { + packageJson.dependencies['react-dom'] = '^15.3.0'; +} + +helpers.writePackageJson(packageJson); diff --git a/generators/METEOR/template/.storybook/config.js b/generators/METEOR/template/.storybook/config.js new file mode 100644 index 0000000..8e314a8 --- /dev/null +++ b/generators/METEOR/template/.storybook/config.js @@ -0,0 +1,7 @@ +import { configure } from '@kadira/storybook'; + +function loadStories() { + require('../stories'); +} + +configure(loadStories, module); diff --git a/generators/METEOR/template/stories/Button.js b/generators/METEOR/template/stories/Button.js new file mode 100644 index 0000000..5662b88 --- /dev/null +++ b/generators/METEOR/template/stories/Button.js @@ -0,0 +1,27 @@ +import React from 'react'; + +const buttonStyles = { + border: '1px solid #eee', + borderRadius: 3, + backgroundColor: '#FFFFFF', + cursor: 'pointer', + fontSize: 15, + padding: '3px 10px', + margin: 10, +}; + +const Button = ({ children, onClick }) => ( + +); + +Button.propTypes = { + children: React.PropTypes.string.isRequired, + onClick: React.PropTypes.func, +}; + +export default Button; diff --git a/generators/METEOR/template/stories/Welcome.js b/generators/METEOR/template/stories/Welcome.js new file mode 100644 index 0000000..5887c01 --- /dev/null +++ b/generators/METEOR/template/stories/Welcome.js @@ -0,0 +1,73 @@ +import React from 'react'; + +const styles = { + main: { + margin: 15, + maxWidth: 600, + lineHeight: 1.4, + fontFamily: '-apple-system, ".SFNSText-Regular", "San Francisco", Roboto, "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif', + }, + + logo: { + width: 200, + }, + + link: { + color: '#1474f3', + textDecoration: 'none', + borderBottom: '1px solid #1474f3', + paddingBottom: 2, + }, + + code: { + fontSize: 15, + fontWeight: 600, + padding: "2px 5px", + border: "1px solid #eae9e9", + borderRadius: 4, + backgroundColor: '#f3f2f2', + color: '#3a3a3a', + }, +}; + +export default class Welcome extends React.Component { + showApp(e) { + e.preventDefault(); + if(this.props.showApp) this.props.showApp(); + } + + render() { + return ( +
+

Welcome to Storybook

+ +

+ This is a UI component dev environment for your app. +

+

+ We've added some basic stories inside the src/stories directory. +
+ A story is a single state of one or more UI components. You can have as many stories as you want. +
+ (Basically a story is like a visual test case.) +

+

+ See these sample stories for a component called Button. +

+

+ Just like that, you can add your own components as stories. +
+ You can also edit those components and see changes right away. +
+ (Try editing the Button component + located at src/stories/Button.js.) +

+

+ This is just one thing you can do with Storybook. +
+ Have a look at the React Storybook repo for more information. +

+
+ ); + } +} diff --git a/generators/METEOR/template/stories/index.js b/generators/METEOR/template/stories/index.js new file mode 100644 index 0000000..7ad560e --- /dev/null +++ b/generators/METEOR/template/stories/index.js @@ -0,0 +1,17 @@ +import React from 'react'; +import { storiesOf, action, linkTo } from '@kadira/storybook'; +import Button from './Button'; +import Welcome from './Welcome'; + +storiesOf('Welcome', module) + .add('to Storybook', () => ( + + )); + +storiesOf('Button', module) + .add('with text', () => ( + + )) + .add('with some emojies', () => ( + + )); diff --git a/lib/detect.js b/lib/detect.js index 6b7b568..65eec8a 100644 --- a/lib/detect.js +++ b/lib/detect.js @@ -1,5 +1,7 @@ var types = require('./project_types.js'); var helpers = require('./helpers'); +var path = require('path'); +var fs = require('fs'); module.exports = function detect(options) { var packageJson = helpers.getPackageJson(); @@ -18,6 +20,12 @@ module.exports = function detect(options) { return types.ALREADY_HAS_STORYBOOK; } + if( + fs.existsSync(path.resolve('.meteor')) + ) { + return types.METEOR; + } + if ( packageJson.devDependencies && packageJson.devDependencies['react-scripts'] diff --git a/package.json b/package.json index ee3abb8..3790758 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "dependencies": { "chalk": "^1.1.3", "commander": "^2.9.0", + "json5": "^0.5.0", "merge-dirs": "^0.2.1", "shelljs": "^0.7.3", "spawn-sync": "^1.0.15", From 12054cc972dc2d8dc19c7b2491b58ca5cbad0f41 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Thu, 11 Aug 2016 00:56:54 +0530 Subject: [PATCH 27/81] 1.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3790758..87ecaf7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.2.0", + "version": "1.3.0", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From 6f8cab0d050017b34fd102d2b028c763e71af0e8 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Thu, 11 Aug 2016 00:58:13 +0530 Subject: [PATCH 28/81] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 356b26d..83f2d00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +### v1.2.0 +11-Aug-2016 + +* Add support for Webpack React apps. [PR8](https://github.com/kadirahq/getstorybook/pull/8) +* Add support for Meteor. [PR9](https://github.com/kadirahq/getstorybook/pull/9) + ### v1.1.0 10-Aug-2016 From ca9a94af962d1b5ca5c2e760aa106582080c1d26 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Thu, 11 Aug 2016 00:59:11 +0530 Subject: [PATCH 29/81] Update CHANGELOG for correct versioning. --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83f2d00..ed5822d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,12 @@ # Changelog -### v1.2.0 +### v1.3.0 11-Aug-2016 * Add support for Webpack React apps. [PR8](https://github.com/kadirahq/getstorybook/pull/8) * Add support for Meteor. [PR9](https://github.com/kadirahq/getstorybook/pull/9) -### v1.1.0 +### v1.2.0 10-Aug-2016 * Add better default stories. [PR7](https://github.com/kadirahq/getstorybook/pull/7) From 4d704388c67005f286c0a98123f0e1419ab0595c Mon Sep 17 00:00:00 2001 From: Muhammed Thanish Date: Thu, 25 Aug 2016 16:10:01 +0530 Subject: [PATCH 30/81] Add generator for React Native apps --- bin/generate.js | 14 ++++++++ generators/REACT_NATIVE/index.js | 16 +++++++++ .../REACT_NATIVE/template/storybook/addons.js | 1 + .../template/storybook/index.ios.js | 11 ++++++ .../storybook/stories/Button/index.android.js | 10 ++++++ .../storybook/stories/Button/index.ios.js | 10 ++++++ .../storybook/stories/CenterView/index.js | 11 ++++++ .../storybook/stories/CenterView/style.js | 8 +++++ .../storybook/stories/Welcome/index.js | 36 +++++++++++++++++++ .../template/storybook/stories/index.js | 27 ++++++++++++++ 10 files changed, 144 insertions(+) create mode 100644 generators/REACT_NATIVE/index.js create mode 100644 generators/REACT_NATIVE/template/storybook/addons.js create mode 100644 generators/REACT_NATIVE/template/storybook/index.ios.js create mode 100644 generators/REACT_NATIVE/template/storybook/stories/Button/index.android.js create mode 100644 generators/REACT_NATIVE/template/storybook/stories/Button/index.ios.js create mode 100644 generators/REACT_NATIVE/template/storybook/stories/CenterView/index.js create mode 100644 generators/REACT_NATIVE/template/storybook/stories/CenterView/style.js create mode 100644 generators/REACT_NATIVE/template/storybook/stories/Welcome/index.js create mode 100644 generators/REACT_NATIVE/template/storybook/stories/index.js diff --git a/bin/generate.js b/bin/generate.js index 52068db..cc9e924 100755 --- a/bin/generate.js +++ b/bin/generate.js @@ -78,6 +78,20 @@ switch (projectType) { logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; + case types.REACT_NATIVE: + done = commandLog('Adding storybook support to your "React Native" app'); + require('../generators/REACT_NATIVE'); + done(); + + installNpmDeps(); + + logger.log('\nTo run your storybook, type:\n'); + codeLog([ + 'npm run storybook' + ]); + logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); + break; + case types.METEOR: done = commandLog('Adding storybook support to your "Meteor" app'); require('../generators/METEOR'); diff --git a/generators/REACT_NATIVE/index.js b/generators/REACT_NATIVE/index.js new file mode 100644 index 0000000..4bb5a6d --- /dev/null +++ b/generators/REACT_NATIVE/index.js @@ -0,0 +1,16 @@ +var mergeDirs = require('merge-dirs').default; +var helpers = require('../../lib/helpers'); +var path = require('path'); + +mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite'); + +var packageJson = helpers.getPackageJson(); + +// TODO: Get the latest version of storybook here. +packageJson.devDependencies = packageJson.devDependencies || {}; +packageJson.devDependencies['@kadira/react-native-storybook'] = '^2.0.0'; + +packageJson.scripts = packageJson.scripts || {}; +packageJson.scripts['storybook'] = 'storybook start -p 7007'; + +helpers.writePackageJson(packageJson); diff --git a/generators/REACT_NATIVE/template/storybook/addons.js b/generators/REACT_NATIVE/template/storybook/addons.js new file mode 100644 index 0000000..f4d48bb --- /dev/null +++ b/generators/REACT_NATIVE/template/storybook/addons.js @@ -0,0 +1 @@ +import '@kadira/react-native-storybook/addons'; diff --git a/generators/REACT_NATIVE/template/storybook/index.ios.js b/generators/REACT_NATIVE/template/storybook/index.ios.js new file mode 100644 index 0000000..44de164 --- /dev/null +++ b/generators/REACT_NATIVE/template/storybook/index.ios.js @@ -0,0 +1,11 @@ +import { AppRegistry } from 'react-native'; +import { getStorybookUI, configure } from '@kadira/react-native-storybook'; +import './addons'; + +// import stories +configure(() => { + require('./stories'); +}, module); + +const StorybookUI = getStorybookUI({port: 9001, host: 'localhost'}); +AppRegistry.registerComponent('HelloWorld', () => StorybookUI); diff --git a/generators/REACT_NATIVE/template/storybook/stories/Button/index.android.js b/generators/REACT_NATIVE/template/storybook/stories/Button/index.android.js new file mode 100644 index 0000000..2bdb364 --- /dev/null +++ b/generators/REACT_NATIVE/template/storybook/stories/Button/index.android.js @@ -0,0 +1,10 @@ +import React from 'react'; +import { TouchableNativeFeedback } from 'react-native'; + +export default function Button(props) { + return ( + + {props.children} + + ); +} diff --git a/generators/REACT_NATIVE/template/storybook/stories/Button/index.ios.js b/generators/REACT_NATIVE/template/storybook/stories/Button/index.ios.js new file mode 100644 index 0000000..0447eb9 --- /dev/null +++ b/generators/REACT_NATIVE/template/storybook/stories/Button/index.ios.js @@ -0,0 +1,10 @@ +import React from 'react'; +import { TouchableHighlight } from 'react-native'; + +export default function Button(props) { + return ( + + {props.children} + + ); +} diff --git a/generators/REACT_NATIVE/template/storybook/stories/CenterView/index.js b/generators/REACT_NATIVE/template/storybook/stories/CenterView/index.js new file mode 100644 index 0000000..ab98f2d --- /dev/null +++ b/generators/REACT_NATIVE/template/storybook/stories/CenterView/index.js @@ -0,0 +1,11 @@ +import React from 'react'; +import { View } from 'react-native'; +import style from './style'; + +export default function CenterView(props) { + return ( + + {props.children} + + ); +} diff --git a/generators/REACT_NATIVE/template/storybook/stories/CenterView/style.js b/generators/REACT_NATIVE/template/storybook/stories/CenterView/style.js new file mode 100644 index 0000000..ff347fd --- /dev/null +++ b/generators/REACT_NATIVE/template/storybook/stories/CenterView/style.js @@ -0,0 +1,8 @@ +export default { + main: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: '#F5FCFF', + }, +}; diff --git a/generators/REACT_NATIVE/template/storybook/stories/Welcome/index.js b/generators/REACT_NATIVE/template/storybook/stories/Welcome/index.js new file mode 100644 index 0000000..1d5b561 --- /dev/null +++ b/generators/REACT_NATIVE/template/storybook/stories/Welcome/index.js @@ -0,0 +1,36 @@ +import React from 'react'; +import { View, Text } from 'react-native'; + +export default class Welcome extends React.Component { + styles = { + wrapper: { + flex: 1, + padding: 24, + justifyContent: 'center', + }, + header: { + fontSize: 18, + marginBottom: 18, + }, + content: { + fontSize: 12, + marginBottom: 10, + lineHeight: 18, + }, + } + + showApp(e) { + e.preventDefault(); + if(this.props.showApp) this.props.showApp(); + } + + render() { + return ( + + Welcome to React Native Storybook + This is a UI Component development environment for your React Native app. Here you can display and interact with your UI components as stories. A story is a single state of one or more UI components. You can have as many stories as you want. In other words a story is like a visual test case. + We have added some stories inside the "storybook/stories" directory for examples. Try editing the "storybook/stories/Welcome.js" file to edit this message. + + ); + } +} diff --git a/generators/REACT_NATIVE/template/storybook/stories/index.js b/generators/REACT_NATIVE/template/storybook/stories/index.js new file mode 100644 index 0000000..b2c3bf6 --- /dev/null +++ b/generators/REACT_NATIVE/template/storybook/stories/index.js @@ -0,0 +1,27 @@ +import React from 'react'; +import { Text } from 'react-native'; +import { storiesOf, action, linkTo } from '@kadira/react-native-storybook'; + +import Button from './Button'; +import CenterView from './CenterView'; +import Welcome from './Welcome'; + +storiesOf('Welcome', module) + .add('to Storybook', () => ( + + )); + +storiesOf('Button', module) + .addDecorator(getStory => ( + {getStory()} + )) + .add('with text', () => ( + + )) + .add('with some emojies', () => ( + + )); From 247e569b42cc4504834c93e099696054d6b36aa6 Mon Sep 17 00:00:00 2001 From: Muhammed Thanish Date: Thu, 25 Aug 2016 16:46:37 +0530 Subject: [PATCH 31/81] Fix react native server port --- generators/REACT_NATIVE/template/storybook/index.ios.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/REACT_NATIVE/template/storybook/index.ios.js b/generators/REACT_NATIVE/template/storybook/index.ios.js index 44de164..a05f629 100644 --- a/generators/REACT_NATIVE/template/storybook/index.ios.js +++ b/generators/REACT_NATIVE/template/storybook/index.ios.js @@ -7,5 +7,5 @@ configure(() => { require('./stories'); }, module); -const StorybookUI = getStorybookUI({port: 9001, host: 'localhost'}); +const StorybookUI = getStorybookUI({port: 7007, host: 'localhost'}); AppRegistry.registerComponent('HelloWorld', () => StorybookUI); From 76e6b93e7a2e9b3a8a61986a1a4c7a683307d729 Mon Sep 17 00:00:00 2001 From: Muhammed Thanish Date: Thu, 25 Aug 2016 17:23:31 +0530 Subject: [PATCH 32/81] Update CHANGELOG --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed5822d..9240e05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +### v1.4.0 +25-Aug-2016 + +* Add support for React Native apps. [PR11](https://github.com/kadirahq/getstorybook/pull/11) + ### v1.3.0 11-Aug-2016 From ef5714f18b8b8e34085c89d9a293fe7ab46259a1 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Thu, 25 Aug 2016 22:04:28 +0530 Subject: [PATCH 33/81] 1.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 87ecaf7..d3d86c2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.3.0", + "version": "1.4.0", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From d0398bfeb510cae9f0c9e6bd0d9506a9b35b8b1f Mon Sep 17 00:00:00 2001 From: Muhammed Thanish Date: Fri, 26 Aug 2016 15:26:03 +0530 Subject: [PATCH 34/81] Set the app name if possible --- generators/REACT_NATIVE/index.js | 12 ++++++++++++ .../REACT_NATIVE/template/storybook/index.ios.js | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/generators/REACT_NATIVE/index.js b/generators/REACT_NATIVE/index.js index 4bb5a6d..3ca0068 100644 --- a/generators/REACT_NATIVE/index.js +++ b/generators/REACT_NATIVE/index.js @@ -1,9 +1,21 @@ var mergeDirs = require('merge-dirs').default; var helpers = require('../../lib/helpers'); var path = require('path'); +var shell = require('shelljs'); +// copy all files from the template directory to project directory mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite'); +// set correct project name on entry files if possible +var dirname = shell.ls('-d', 'ios/*.xcodeproj').stdout; +var projectName = dirname && dirname.slice( + 'ios/'.length, + dirname.length - '.xcodeproj'.length - 1 +); +if (projectName) { + shell.sed('-i', '%APP_NAME%', projectName, 'storybook/index.ios.js'); +} + var packageJson = helpers.getPackageJson(); // TODO: Get the latest version of storybook here. diff --git a/generators/REACT_NATIVE/template/storybook/index.ios.js b/generators/REACT_NATIVE/template/storybook/index.ios.js index a05f629..ce47e17 100644 --- a/generators/REACT_NATIVE/template/storybook/index.ios.js +++ b/generators/REACT_NATIVE/template/storybook/index.ios.js @@ -8,4 +8,4 @@ configure(() => { }, module); const StorybookUI = getStorybookUI({port: 7007, host: 'localhost'}); -AppRegistry.registerComponent('HelloWorld', () => StorybookUI); +AppRegistry.registerComponent('%APP_NAME%', () => StorybookUI); From 935c5f4916eb8d052206d85fcf3ace9b6981104b Mon Sep 17 00:00:00 2001 From: Muhammed Thanish Date: Fri, 26 Aug 2016 15:29:34 +0530 Subject: [PATCH 35/81] Add android entry file for react native --- generators/REACT_NATIVE/index.js | 1 + .../REACT_NATIVE/template/storybook/index.android.js | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 generators/REACT_NATIVE/template/storybook/index.android.js diff --git a/generators/REACT_NATIVE/index.js b/generators/REACT_NATIVE/index.js index 3ca0068..ae6bcd7 100644 --- a/generators/REACT_NATIVE/index.js +++ b/generators/REACT_NATIVE/index.js @@ -14,6 +14,7 @@ var projectName = dirname && dirname.slice( ); if (projectName) { shell.sed('-i', '%APP_NAME%', projectName, 'storybook/index.ios.js'); + shell.sed('-i', '%APP_NAME%', projectName, 'storybook/index.android.js'); } var packageJson = helpers.getPackageJson(); diff --git a/generators/REACT_NATIVE/template/storybook/index.android.js b/generators/REACT_NATIVE/template/storybook/index.android.js new file mode 100644 index 0000000..ce47e17 --- /dev/null +++ b/generators/REACT_NATIVE/template/storybook/index.android.js @@ -0,0 +1,11 @@ +import { AppRegistry } from 'react-native'; +import { getStorybookUI, configure } from '@kadira/react-native-storybook'; +import './addons'; + +// import stories +configure(() => { + require('./stories'); +}, module); + +const StorybookUI = getStorybookUI({port: 7007, host: 'localhost'}); +AppRegistry.registerComponent('%APP_NAME%', () => StorybookUI); From 7fb01175c21585b4f145169bd4e9d1caa8932fd9 Mon Sep 17 00:00:00 2001 From: Muhammed Thanish Date: Fri, 26 Aug 2016 15:33:06 +0530 Subject: [PATCH 36/81] Update CHANGELOG --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9240e05..5c8d4f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +### v1.4.1 +26-Aug-2016 + +* [RN] Automate setting app name on entry files [PR12](https://github.com/kadirahq/getstorybook/pull/12) +* [RN] Add entry javascript file for Android [PR13](https://github.com/kadirahq/getstorybook/pull/13) + ### v1.4.0 25-Aug-2016 From 3ca6b052c8e33db2a27b3d5bd4fb2008509d642a Mon Sep 17 00:00:00 2001 From: Muhammed Thanish Date: Fri, 26 Aug 2016 15:33:46 +0530 Subject: [PATCH 37/81] 1.4.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d3d86c2..00a8fd1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.4.0", + "version": "1.4.1", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From d0e576836565db29011850e3bb87cb024c7b239d Mon Sep 17 00:00:00 2001 From: Muhammed Thanish Date: Fri, 26 Aug 2016 18:37:25 +0530 Subject: [PATCH 38/81] Do not import addons.js on entryfiles --- generators/REACT_NATIVE/template/storybook/index.android.js | 1 - generators/REACT_NATIVE/template/storybook/index.ios.js | 1 - 2 files changed, 2 deletions(-) diff --git a/generators/REACT_NATIVE/template/storybook/index.android.js b/generators/REACT_NATIVE/template/storybook/index.android.js index ce47e17..efe59a0 100644 --- a/generators/REACT_NATIVE/template/storybook/index.android.js +++ b/generators/REACT_NATIVE/template/storybook/index.android.js @@ -1,6 +1,5 @@ import { AppRegistry } from 'react-native'; import { getStorybookUI, configure } from '@kadira/react-native-storybook'; -import './addons'; // import stories configure(() => { diff --git a/generators/REACT_NATIVE/template/storybook/index.ios.js b/generators/REACT_NATIVE/template/storybook/index.ios.js index ce47e17..efe59a0 100644 --- a/generators/REACT_NATIVE/template/storybook/index.ios.js +++ b/generators/REACT_NATIVE/template/storybook/index.ios.js @@ -1,6 +1,5 @@ import { AppRegistry } from 'react-native'; import { getStorybookUI, configure } from '@kadira/react-native-storybook'; -import './addons'; // import stories configure(() => { From 8b059fc3bcf5e38326917b1fa32cd0fa6a72c7cb Mon Sep 17 00:00:00 2001 From: Loren Sands-Ramshaw Date: Sun, 28 Aug 2016 01:44:16 -0400 Subject: [PATCH 39/81] Fix "emojies" typo While some people use "emojis", my sense is that "emoji" is the more hip plural. --- generators/REACT_NATIVE/template/storybook/stories/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/REACT_NATIVE/template/storybook/stories/index.js b/generators/REACT_NATIVE/template/storybook/stories/index.js index b2c3bf6..7f7d5f4 100644 --- a/generators/REACT_NATIVE/template/storybook/stories/index.js +++ b/generators/REACT_NATIVE/template/storybook/stories/index.js @@ -20,7 +20,7 @@ storiesOf('Button', module) Hello Button )) - .add('with some emojies', () => ( + .add('with some emoji', () => ( From 65e524305fc1a48c29f30607fff7a4f624669625 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Sun, 28 Aug 2016 15:18:27 +0530 Subject: [PATCH 40/81] Change emojies to emoji. --- generators/METEOR/template/stories/index.js | 2 +- generators/REACT/template/stories/index.js | 2 +- generators/REACT_SCRIPTS/template/src/stories/index.js | 2 +- generators/WEBPACK_REACT/template/stories/index.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/generators/METEOR/template/stories/index.js b/generators/METEOR/template/stories/index.js index 7ad560e..cd66c18 100644 --- a/generators/METEOR/template/stories/index.js +++ b/generators/METEOR/template/stories/index.js @@ -12,6 +12,6 @@ storiesOf('Button', module) .add('with text', () => ( )) - .add('with some emojies', () => ( + .add('with some emoji', () => ( )); diff --git a/generators/REACT/template/stories/index.js b/generators/REACT/template/stories/index.js index 7ad560e..cd66c18 100644 --- a/generators/REACT/template/stories/index.js +++ b/generators/REACT/template/stories/index.js @@ -12,6 +12,6 @@ storiesOf('Button', module) .add('with text', () => ( )) - .add('with some emojies', () => ( + .add('with some emoji', () => ( )); diff --git a/generators/REACT_SCRIPTS/template/src/stories/index.js b/generators/REACT_SCRIPTS/template/src/stories/index.js index 7ad560e..cd66c18 100644 --- a/generators/REACT_SCRIPTS/template/src/stories/index.js +++ b/generators/REACT_SCRIPTS/template/src/stories/index.js @@ -12,6 +12,6 @@ storiesOf('Button', module) .add('with text', () => ( )) - .add('with some emojies', () => ( + .add('with some emoji', () => ( )); diff --git a/generators/WEBPACK_REACT/template/stories/index.js b/generators/WEBPACK_REACT/template/stories/index.js index 7ad560e..cd66c18 100644 --- a/generators/WEBPACK_REACT/template/stories/index.js +++ b/generators/WEBPACK_REACT/template/stories/index.js @@ -12,6 +12,6 @@ storiesOf('Button', module) .add('with text', () => ( )) - .add('with some emojies', () => ( + .add('with some emoji', () => ( )); From 12e756c6912ec4d8a98cfa21c0b4e143458843ba Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Sun, 28 Aug 2016 15:20:33 +0530 Subject: [PATCH 41/81] 1.4.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 00a8fd1..0bf0a99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.4.1", + "version": "1.4.2", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From ded79a011c47bff2c7e72e01919e3bbf56b1232c Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Sun, 28 Aug 2016 15:21:45 +0530 Subject: [PATCH 42/81] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c8d4f5..9bd23c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +### v1.4.2 +28-Aug-2016 + +* React Native: Do not import addons.js on entryfiles.[PR14](https://github.com/kadirahq/getstorybook/pull/14) +* Fix "emojies" typo. [PR15](https://github.com/kadirahq/getstorybook/pull/15) + ### v1.4.1 26-Aug-2016 From c55ba189dd3963067a85a90481bb268511c99264 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 30 Aug 2016 14:44:48 +0530 Subject: [PATCH 43/81] Add Arial font and remove image. --- generators/METEOR/template/stories/Welcome.js | 5 ++--- generators/REACT/template/stories/Welcome.js | 5 ++--- generators/REACT_SCRIPTS/template/src/stories/Welcome.js | 5 ++--- generators/WEBPACK_REACT/template/stories/Welcome.js | 5 ++--- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/generators/METEOR/template/stories/Welcome.js b/generators/METEOR/template/stories/Welcome.js index 5887c01..190f097 100644 --- a/generators/METEOR/template/stories/Welcome.js +++ b/generators/METEOR/template/stories/Welcome.js @@ -5,7 +5,7 @@ const styles = { margin: 15, maxWidth: 600, lineHeight: 1.4, - fontFamily: '-apple-system, ".SFNSText-Regular", "San Francisco", Roboto, "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif', + fontFamily: 'Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', }, logo: { @@ -39,8 +39,7 @@ export default class Welcome extends React.Component { render() { return (
-

Welcome to Storybook

- +

Welcome to STORYBOOK

This is a UI component dev environment for your app.

diff --git a/generators/REACT/template/stories/Welcome.js b/generators/REACT/template/stories/Welcome.js index 5887c01..190f097 100644 --- a/generators/REACT/template/stories/Welcome.js +++ b/generators/REACT/template/stories/Welcome.js @@ -5,7 +5,7 @@ const styles = { margin: 15, maxWidth: 600, lineHeight: 1.4, - fontFamily: '-apple-system, ".SFNSText-Regular", "San Francisco", Roboto, "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif', + fontFamily: 'Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', }, logo: { @@ -39,8 +39,7 @@ export default class Welcome extends React.Component { render() { return (
-

Welcome to Storybook

- +

Welcome to STORYBOOK

This is a UI component dev environment for your app.

diff --git a/generators/REACT_SCRIPTS/template/src/stories/Welcome.js b/generators/REACT_SCRIPTS/template/src/stories/Welcome.js index 5887c01..190f097 100644 --- a/generators/REACT_SCRIPTS/template/src/stories/Welcome.js +++ b/generators/REACT_SCRIPTS/template/src/stories/Welcome.js @@ -5,7 +5,7 @@ const styles = { margin: 15, maxWidth: 600, lineHeight: 1.4, - fontFamily: '-apple-system, ".SFNSText-Regular", "San Francisco", Roboto, "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif', + fontFamily: 'Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', }, logo: { @@ -39,8 +39,7 @@ export default class Welcome extends React.Component { render() { return (
-

Welcome to Storybook

- +

Welcome to STORYBOOK

This is a UI component dev environment for your app.

diff --git a/generators/WEBPACK_REACT/template/stories/Welcome.js b/generators/WEBPACK_REACT/template/stories/Welcome.js index 280d5f9..c393f96 100644 --- a/generators/WEBPACK_REACT/template/stories/Welcome.js +++ b/generators/WEBPACK_REACT/template/stories/Welcome.js @@ -5,7 +5,7 @@ const styles = { margin: 15, maxWidth: 600, lineHeight: 1.4, - fontFamily: '-apple-system, ".SFNSText-Regular", "San Francisco", Roboto, "Segoe UI", "Helvetica Neue", "Lucida Grande", sans-serif', + fontFamily: 'Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', }, logo: { @@ -43,8 +43,7 @@ export default class Welcome extends React.Component { render() { return (
-

Welcome to Storybook

- +

Welcome to STORYBOOK

This is a UI component dev environment for your app.

From 9f0cd56966e61abd8074b01a10cd390f1a2e8516 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 30 Aug 2016 14:46:21 +0530 Subject: [PATCH 44/81] Add missing char --- generators/METEOR/template/stories/Welcome.js | 2 +- generators/REACT/template/stories/Welcome.js | 2 +- generators/REACT_SCRIPTS/template/src/stories/Welcome.js | 2 +- generators/WEBPACK_REACT/template/stories/Welcome.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/generators/METEOR/template/stories/Welcome.js b/generators/METEOR/template/stories/Welcome.js index 190f097..d126acb 100644 --- a/generators/METEOR/template/stories/Welcome.js +++ b/generators/METEOR/template/stories/Welcome.js @@ -5,7 +5,7 @@ const styles = { margin: 15, maxWidth: 600, lineHeight: 1.4, - fontFamily: 'Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', + fontFamily: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', }, logo: { diff --git a/generators/REACT/template/stories/Welcome.js b/generators/REACT/template/stories/Welcome.js index 190f097..d126acb 100644 --- a/generators/REACT/template/stories/Welcome.js +++ b/generators/REACT/template/stories/Welcome.js @@ -5,7 +5,7 @@ const styles = { margin: 15, maxWidth: 600, lineHeight: 1.4, - fontFamily: 'Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', + fontFamily: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', }, logo: { diff --git a/generators/REACT_SCRIPTS/template/src/stories/Welcome.js b/generators/REACT_SCRIPTS/template/src/stories/Welcome.js index 190f097..d126acb 100644 --- a/generators/REACT_SCRIPTS/template/src/stories/Welcome.js +++ b/generators/REACT_SCRIPTS/template/src/stories/Welcome.js @@ -5,7 +5,7 @@ const styles = { margin: 15, maxWidth: 600, lineHeight: 1.4, - fontFamily: 'Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', + fontFamily: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', }, logo: { diff --git a/generators/WEBPACK_REACT/template/stories/Welcome.js b/generators/WEBPACK_REACT/template/stories/Welcome.js index c393f96..2dcd174 100644 --- a/generators/WEBPACK_REACT/template/stories/Welcome.js +++ b/generators/WEBPACK_REACT/template/stories/Welcome.js @@ -5,7 +5,7 @@ const styles = { margin: 15, maxWidth: 600, lineHeight: 1.4, - fontFamily: 'Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', + fontFamily: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', }, logo: { From 50f65665e5f487a8eb8aec6fcbe6981931924740 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 30 Aug 2016 14:49:58 +0530 Subject: [PATCH 45/81] Update @kadira/storybook to version 2.5.2 --- generators/METEOR/index.js | 4 ++-- generators/REACT/index.js | 2 +- generators/REACT_SCRIPTS/index.js | 2 +- generators/WEBPACK_REACT/index.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/generators/METEOR/index.js b/generators/METEOR/index.js index 27e21e8..00fdf6f 100644 --- a/generators/METEOR/index.js +++ b/generators/METEOR/index.js @@ -18,7 +18,7 @@ if(fs.existsSync('.babelrc')) { var babelrcContent = fs.readFileSync('.babelrc', 'utf8'); babelrc = JSON5.parse(babelrcContent); babelrc.plugins = babelrc.plugins || []; - + if (babelrc.plugins.indexOf('babel-root-slash-import') < 0) { babelrc.plugins.push('babel-root-slash-import'); packageJson.devDependencies['babel-root-slash-import'] = '^1.1.0'; @@ -39,7 +39,7 @@ if(fs.existsSync('.babelrc')) { fs.writeFileSync('.babelrc', JSON.stringify(babelrc, null, 2), 'utf8'); // write the new package.json. -packageJson.devDependencies['@kadira/storybook'] = '^2.0.0'; +packageJson.devDependencies['@kadira/storybook'] = '^2.5.2'; packageJson.scripts['storybook'] = 'start-storybook -p 6006'; packageJson.scripts['build-storybook'] = 'build-storybook'; diff --git a/generators/REACT/index.js b/generators/REACT/index.js index 7ff4306..dadd432 100644 --- a/generators/REACT/index.js +++ b/generators/REACT/index.js @@ -8,7 +8,7 @@ var packageJson = helpers.getPackageJson(); // TODO: Get the latest version of storybook here. packageJson.devDependencies = packageJson.devDependencies || {}; -packageJson.devDependencies['@kadira/storybook'] = '^2.0.0'; +packageJson.devDependencies['@kadira/storybook'] = '^2.5.2'; packageJson.scripts = packageJson.scripts || {}; packageJson.scripts['storybook'] = 'start-storybook -p 6006'; diff --git a/generators/REACT_SCRIPTS/index.js b/generators/REACT_SCRIPTS/index.js index 7261cf9..347a59d 100644 --- a/generators/REACT_SCRIPTS/index.js +++ b/generators/REACT_SCRIPTS/index.js @@ -7,7 +7,7 @@ mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite'); var packageJson = helpers.getPackageJson(); // TODO: Get the latest version of storybook here. -packageJson.devDependencies['@kadira/storybook'] = '^2.0.0'; +packageJson.devDependencies['@kadira/storybook'] = '^2.5.2'; packageJson.scripts['storybook'] = 'start-storybook -p 9009'; packageJson.scripts['build-storybook'] = 'build-storybook'; diff --git a/generators/WEBPACK_REACT/index.js b/generators/WEBPACK_REACT/index.js index 7ff4306..dadd432 100644 --- a/generators/WEBPACK_REACT/index.js +++ b/generators/WEBPACK_REACT/index.js @@ -8,7 +8,7 @@ var packageJson = helpers.getPackageJson(); // TODO: Get the latest version of storybook here. packageJson.devDependencies = packageJson.devDependencies || {}; -packageJson.devDependencies['@kadira/storybook'] = '^2.0.0'; +packageJson.devDependencies['@kadira/storybook'] = '^2.5.2'; packageJson.scripts = packageJson.scripts || {}; packageJson.scripts['storybook'] = 'start-storybook -p 6006'; From c61e1adc4e5149504785e51c98bcf174c6f81880 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 30 Aug 2016 14:54:47 +0530 Subject: [PATCH 46/81] 1.4.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0bf0a99..e0e28b7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.4.2", + "version": "1.4.3", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From a40ece596122c772875392b6add86e2658de89d1 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 30 Aug 2016 14:54:48 +0530 Subject: [PATCH 47/81] 1.4.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e0e28b7..79e973f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.4.3", + "version": "1.4.4", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From 62c6d3ccb001df2109896472e1ae9115c6a921fc Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 30 Aug 2016 14:56:36 +0530 Subject: [PATCH 48/81] Update CHANGELOG.md --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bd23c1..2ce5a9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +### v1.4.4 +30-Aug-2016 + +* Update @kadira/storybook to version 2.5.2. [PR17](https://github.com/kadirahq/getstorybook/pull/17) +* Add Arial font and remove image from Welcome message. [PR16](https://github.com/kadirahq/getstorybook/pull/16) + +### v1.4.3 +30-Aug-2016 + +This is a mistakenly published version. + ### v1.4.2 28-Aug-2016 From 088eecf740bebf522b6608892a3a7e3e34bcfc31 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 6 Sep 2016 13:56:07 +0530 Subject: [PATCH 49/81] Fix issue with Meteor. We have added a directory called stories into the root. So, it's going to load to Meteor by default. We don't want that. So, we've renamed it to be .stories. --- generators/METEOR/template/{stories => .stories}/Button.js | 0 generators/METEOR/template/{stories => .stories}/Welcome.js | 4 ++-- generators/METEOR/template/{stories => .stories}/index.js | 0 generators/METEOR/template/.storybook/config.js | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename generators/METEOR/template/{stories => .stories}/Button.js (100%) rename generators/METEOR/template/{stories => .stories}/Welcome.js (94%) rename generators/METEOR/template/{stories => .stories}/index.js (100%) diff --git a/generators/METEOR/template/stories/Button.js b/generators/METEOR/template/.stories/Button.js similarity index 100% rename from generators/METEOR/template/stories/Button.js rename to generators/METEOR/template/.stories/Button.js diff --git a/generators/METEOR/template/stories/Welcome.js b/generators/METEOR/template/.stories/Welcome.js similarity index 94% rename from generators/METEOR/template/stories/Welcome.js rename to generators/METEOR/template/.stories/Welcome.js index d126acb..d57d4c8 100644 --- a/generators/METEOR/template/stories/Welcome.js +++ b/generators/METEOR/template/.stories/Welcome.js @@ -44,7 +44,7 @@ export default class Welcome extends React.Component { This is a UI component dev environment for your app.

- We've added some basic stories inside the src/stories directory. + We've added some basic stories inside the .stories directory.
A story is a single state of one or more UI components. You can have as many stories as you want.
@@ -59,7 +59,7 @@ export default class Welcome extends React.Component { You can also edit those components and see changes right away.
(Try editing the Button component - located at src/stories/Button.js.) + located at .stories/Button.js.)

This is just one thing you can do with Storybook. diff --git a/generators/METEOR/template/stories/index.js b/generators/METEOR/template/.stories/index.js similarity index 100% rename from generators/METEOR/template/stories/index.js rename to generators/METEOR/template/.stories/index.js diff --git a/generators/METEOR/template/.storybook/config.js b/generators/METEOR/template/.storybook/config.js index 8e314a8..45095fa 100644 --- a/generators/METEOR/template/.storybook/config.js +++ b/generators/METEOR/template/.storybook/config.js @@ -1,7 +1,7 @@ import { configure } from '@kadira/storybook'; function loadStories() { - require('../stories'); + require('../.stories'); } configure(loadStories, module); From c6444cb5393e727e087761f71fafb52fcc9c24f8 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 6 Sep 2016 13:56:24 +0530 Subject: [PATCH 50/81] 1.4.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 79e973f..bae05f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.4.4", + "version": "1.4.5", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From 4dc060c333d9c2533cd6faea7c770b2890792377 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 6 Sep 2016 13:59:17 +0530 Subject: [PATCH 51/81] Update CHANGELOG.md --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ce5a9e..afaf894 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +### v1.4.5 +06-Aug-2016 + +Fix an issue related to Meteor. + + * Related issue: [kadirahq/react-storybook#423](https://github.com/kadirahq/react-storybook/issues/423) + * The fix: [088eecf](https://github.com/kadirahq/getstorybook/commit/088eecf740bebf522b6608892a3a7e3e34bcfc31) + ### v1.4.4 30-Aug-2016 From 0b85877203265187c64d5c4f1ee0d2df786c6696 Mon Sep 17 00:00:00 2001 From: Sylvain BANNIER Date: Wed, 28 Sep 2016 22:37:46 +0200 Subject: [PATCH 52/81] fixes #18 : create react app public directory --- generators/REACT_SCRIPTS/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/REACT_SCRIPTS/index.js b/generators/REACT_SCRIPTS/index.js index 347a59d..224f5af 100644 --- a/generators/REACT_SCRIPTS/index.js +++ b/generators/REACT_SCRIPTS/index.js @@ -8,7 +8,7 @@ var packageJson = helpers.getPackageJson(); // TODO: Get the latest version of storybook here. packageJson.devDependencies['@kadira/storybook'] = '^2.5.2'; -packageJson.scripts['storybook'] = 'start-storybook -p 9009'; +packageJson.scripts['storybook'] = 'start-storybook -p 9009 -s public'; packageJson.scripts['build-storybook'] = 'build-storybook'; helpers.writePackageJson(packageJson); From 68d195f515efc4aab1fa9bcc69f4df151c886d17 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Fri, 30 Sep 2016 23:02:41 +0530 Subject: [PATCH 53/81] Remove index.css import for CRA based apps. --- generators/REACT_SCRIPTS/template/.storybook/config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/generators/REACT_SCRIPTS/template/.storybook/config.js b/generators/REACT_SCRIPTS/template/.storybook/config.js index 301e6f5..73cb7ab 100644 --- a/generators/REACT_SCRIPTS/template/.storybook/config.js +++ b/generators/REACT_SCRIPTS/template/.storybook/config.js @@ -1,5 +1,4 @@ import { configure } from '@kadira/storybook'; -import '../src/index.css'; function loadStories() { require('../src/stories'); From 3905027c137b301aeb9d082c88f9fb17325e2ed1 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Fri, 30 Sep 2016 23:02:47 +0530 Subject: [PATCH 54/81] 1.4.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bae05f3..54381c5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.4.5", + "version": "1.4.6", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From 65a34b7f4e4f7580781cc895d5d687c5496ff6b8 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Fri, 30 Sep 2016 23:23:04 +0530 Subject: [PATCH 55/81] Update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index afaf894..640a268 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +### v1.4.6 +30-Sep-2016 + +* Remove index.css import from config.js in CRA. + ### v1.4.5 06-Aug-2016 From f7a20a94bca62fa8f88e0a6461cb996341816b4d Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 5 Oct 2016 14:18:43 +0530 Subject: [PATCH 56/81] Update generators to support to latest storybook. For the REACT_SCRIPT version, we add the support for public folders. --- generators/METEOR/index.js | 2 +- generators/REACT/index.js | 2 +- generators/REACT_SCRIPTS/index.js | 11 +++++++++-- generators/WEBPACK_REACT/index.js | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/generators/METEOR/index.js b/generators/METEOR/index.js index 00fdf6f..a266287 100644 --- a/generators/METEOR/index.js +++ b/generators/METEOR/index.js @@ -39,7 +39,7 @@ if(fs.existsSync('.babelrc')) { fs.writeFileSync('.babelrc', JSON.stringify(babelrc, null, 2), 'utf8'); // write the new package.json. -packageJson.devDependencies['@kadira/storybook'] = '^2.5.2'; +packageJson.devDependencies['@kadira/storybook'] = '^2.21.0'; packageJson.scripts['storybook'] = 'start-storybook -p 6006'; packageJson.scripts['build-storybook'] = 'build-storybook'; diff --git a/generators/REACT/index.js b/generators/REACT/index.js index dadd432..85ef839 100644 --- a/generators/REACT/index.js +++ b/generators/REACT/index.js @@ -8,7 +8,7 @@ var packageJson = helpers.getPackageJson(); // TODO: Get the latest version of storybook here. packageJson.devDependencies = packageJson.devDependencies || {}; -packageJson.devDependencies['@kadira/storybook'] = '^2.5.2'; +packageJson.devDependencies['@kadira/storybook'] = '^2.21.0'; packageJson.scripts = packageJson.scripts || {}; packageJson.scripts['storybook'] = 'start-storybook -p 6006'; diff --git a/generators/REACT_SCRIPTS/index.js b/generators/REACT_SCRIPTS/index.js index 224f5af..17668e1 100644 --- a/generators/REACT_SCRIPTS/index.js +++ b/generators/REACT_SCRIPTS/index.js @@ -1,14 +1,21 @@ var mergeDirs = require('merge-dirs').default; var helpers = require('../../lib/helpers'); var path = require('path'); +var fs = require('fs'); mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite'); var packageJson = helpers.getPackageJson(); // TODO: Get the latest version of storybook here. -packageJson.devDependencies['@kadira/storybook'] = '^2.5.2'; -packageJson.scripts['storybook'] = 'start-storybook -p 9009 -s public'; +packageJson.devDependencies['@kadira/storybook'] = '^2.21.0'; +packageJson.scripts['storybook'] = 'start-storybook -p 9009'; packageJson.scripts['build-storybook'] = 'build-storybook'; +if (fs.existsSync(path.resolve('./public'))) { + // has a public folder and add support to it. + packageJson.scripts['storybook'] += ' -s public'; + packageJson.scripts['build-storybook'] += ' -s public'; +} + helpers.writePackageJson(packageJson); diff --git a/generators/WEBPACK_REACT/index.js b/generators/WEBPACK_REACT/index.js index dadd432..85ef839 100644 --- a/generators/WEBPACK_REACT/index.js +++ b/generators/WEBPACK_REACT/index.js @@ -8,7 +8,7 @@ var packageJson = helpers.getPackageJson(); // TODO: Get the latest version of storybook here. packageJson.devDependencies = packageJson.devDependencies || {}; -packageJson.devDependencies['@kadira/storybook'] = '^2.5.2'; +packageJson.devDependencies['@kadira/storybook'] = '^2.21.0'; packageJson.scripts = packageJson.scripts || {}; packageJson.scripts['storybook'] = 'start-storybook -p 6006'; From 5158c41d253f3ff93cf76adf6d1a3cedfbb501d9 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 5 Oct 2016 14:18:51 +0530 Subject: [PATCH 57/81] 1.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 54381c5..ac203e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.4.6", + "version": "1.5.0", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From e7758aab18fe5a0be512f1fb84c6d621c4cfe8d3 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 5 Oct 2016 14:19:59 +0530 Subject: [PATCH 58/81] Update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 640a268..c09c447 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +### v1.5.0 +05-Oct-2016 + +* Update to use the latest storybook. Also update REACT_SCRIPTS generator to support public folder. + ### v1.4.6 30-Sep-2016 From f5f7c2c82ad9e541aa2403d2843c4f77d7db43d4 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Fri, 7 Oct 2016 12:47:37 +0530 Subject: [PATCH 59/81] Change REACT_SCRIPTS generator's welcome screen. --- .../template/src/stories/Welcome.js | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/generators/REACT_SCRIPTS/template/src/stories/Welcome.js b/generators/REACT_SCRIPTS/template/src/stories/Welcome.js index d126acb..2060daf 100644 --- a/generators/REACT_SCRIPTS/template/src/stories/Welcome.js +++ b/generators/REACT_SCRIPTS/template/src/stories/Welcome.js @@ -28,8 +28,26 @@ const styles = { backgroundColor: '#f3f2f2', color: '#3a3a3a', }, + + codeBlock: { + backgroundColor: '#f3f2f2', + padding: '1px 10px', + margin: '10px 0', + } }; +const codeBlock = ` +// Add this code to "src/stories/index.js" + +import '../index.css'; +import App from '../App'; + +storiesOf('App', module) + .add('default view', () => ( + <App /> + )) +`; + export default class Welcome extends React.Component { showApp(e) { e.preventDefault(); @@ -56,15 +74,15 @@ export default class Welcome extends React.Component {

Just like that, you can add your own components as stories.
- You can also edit those components and see changes right away. -
- (Try editing the Button component - located at src/stories/Button.js.) + Here's how to add your App component as a story. +

${codeBlock}`}} + />

- This is just one thing you can do with Storybook. -
- Have a look at the React Storybook repo for more information. + Usually we create stories with smaller UI components in your app.
+ Have a look at the Writing Stories section in our documentation.

); From 046e9bf49d16f1a078fdbdac67a7aec41b56363e Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Fri, 7 Oct 2016 12:47:59 +0530 Subject: [PATCH 60/81] 1.5.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ac203e7..1d64bc5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.5.0", + "version": "1.5.1", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From 371a0ed805611737394c834680b416da1d1716eb Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Fri, 7 Oct 2016 12:49:00 +0530 Subject: [PATCH 61/81] Update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c09c447..b38e8a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +### v1.5.1 +07-Oct-2016 + +* Update more user friendly welcome screen to REACT_SCRIPTS generator. + ### v1.5.0 05-Oct-2016 From f2e4f3481e7a2e01796444aa05714d5c48113e43 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Fri, 7 Oct 2016 12:50:43 +0530 Subject: [PATCH 62/81] Change REACT_SCRIPTS generator's welcome screen. --- generators/REACT_SCRIPTS/template/src/stories/Welcome.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/REACT_SCRIPTS/template/src/stories/Welcome.js b/generators/REACT_SCRIPTS/template/src/stories/Welcome.js index 2060daf..d68a350 100644 --- a/generators/REACT_SCRIPTS/template/src/stories/Welcome.js +++ b/generators/REACT_SCRIPTS/template/src/stories/Welcome.js @@ -82,7 +82,7 @@ export default class Welcome extends React.Component {

Usually we create stories with smaller UI components in your app.
- Have a look at the Writing Stories section in our documentation. + Have a look at the Writing Stories section in our documentation.

); From 354d3a2044955285ca2141014a31677f45c870b7 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Fri, 7 Oct 2016 12:50:49 +0530 Subject: [PATCH 63/81] 1.5.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d64bc5..3c5c2d1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.5.1", + "version": "1.5.2", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From bca4c724e7d3ed6ae72d53961e0f6f979d888c20 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Fri, 7 Oct 2016 12:51:09 +0530 Subject: [PATCH 64/81] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b38e8a9..2cd0a74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -### v1.5.1 +### v1.5.2 07-Oct-2016 * Update more user friendly welcome screen to REACT_SCRIPTS generator. From 2dd0fa8a55ad686c09af65ef8335370af15978d9 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Fri, 7 Oct 2016 12:57:42 +0530 Subject: [PATCH 65/81] Update CHANGELOG.md --- generators/REACT_SCRIPTS/template/src/stories/Welcome.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/REACT_SCRIPTS/template/src/stories/Welcome.js b/generators/REACT_SCRIPTS/template/src/stories/Welcome.js index d68a350..2170d7b 100644 --- a/generators/REACT_SCRIPTS/template/src/stories/Welcome.js +++ b/generators/REACT_SCRIPTS/template/src/stories/Welcome.js @@ -81,7 +81,7 @@ export default class Welcome extends React.Component { />

- Usually we create stories with smaller UI components in your app.
+ Usually we create stories with smaller UI components in the app.
Have a look at the Writing Stories section in our documentation.

From ff0f2ce5169ab4b72d6cebf30939e81e35b6671b Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Fri, 7 Oct 2016 12:57:51 +0530 Subject: [PATCH 66/81] 1.5.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3c5c2d1..a879351 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.5.2", + "version": "1.5.3", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From ed169e7b972910ec33ca261a6791e308f728dbb1 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 12 Oct 2016 08:02:33 +0530 Subject: [PATCH 67/81] Add the initial support for yarn with flag. --- README.md | 9 +++++++++ bin/generate.js | 33 ++++++++++++++++++++------------- lib/helpers.js | 18 +++++++++++++----- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 7c60b69..56f1bf5 100644 --- a/README.md +++ b/README.md @@ -20,4 +20,13 @@ That's all you've to do. --- +## Yarn support + +getstorybook also supports yarn. If you are using yarn, this is how to use it: + +``` +yarn global add getstorybook +getstorybook --use-yarn +``` + For more information, refer [React Storybook](https://github.com/kadirahq/react-storybook) documentation. diff --git a/bin/generate.js b/bin/generate.js index cc9e924..aa70842 100755 --- a/bin/generate.js +++ b/bin/generate.js @@ -9,7 +9,7 @@ var types = require('../lib/project_types'); var commandLog = require('../lib/helpers').commandLog; var codeLog = require('../lib/helpers').codeLog; var paddedLog = require('../lib/helpers').paddedLog; -var installNpmDeps = require('../lib/helpers').installNpmDeps; +var installDeps = require('../lib/helpers').installDeps; var chalk = require('chalk'); var logger = console; @@ -18,12 +18,19 @@ var pkg = require('../package.json'); program .version(pkg.version) .option('-f --force', 'Forcely add storybook') + .option('-Y --use-yarn', 'Use yarn to install deps') .parse(process.argv); var welcomeMessage = 'getstorybook - the simplest way to add a storybook to your project.'; logger.log(chalk.inverse('\n ' + welcomeMessage + ' \n')); +var npmOptions = { + useYarn: Boolean(program.useYarn) +}; + +var runStorybookCommand = program.useYarn? 'yarn run storybook' : 'npm run storybook'; + // Update notify code. updateNotifier({ pkg: pkg, @@ -55,11 +62,11 @@ switch (projectType) { require('../generators/REACT_SCRIPTS'); done(); - installNpmDeps(); + installDeps(npmOptions); logger.log('\nTo run your storybook, type:\n'); codeLog([ - 'npm run storybook' + runStorybookCommand ]); logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; @@ -69,11 +76,11 @@ switch (projectType) { require('../generators/REACT'); done(); - installNpmDeps(); + installDeps(npmOptions); logger.log('\nTo run your storybook, type:\n'); codeLog([ - 'npm run storybook' + runStorybookCommand ]); logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; @@ -83,11 +90,11 @@ switch (projectType) { require('../generators/REACT_NATIVE'); done(); - installNpmDeps(); + installDeps(npmOptions); logger.log('\nTo run your storybook, type:\n'); codeLog([ - 'npm run storybook' + runStorybookCommand ]); logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; @@ -97,11 +104,11 @@ switch (projectType) { require('../generators/METEOR'); done(); - installNpmDeps(); + installDeps(npmOptions); logger.log('\nTo run your storybook, type:\n'); codeLog([ - 'npm run storybook' + runStorybookCommand ]); logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; @@ -111,11 +118,11 @@ switch (projectType) { require('../generators/WEBPACK_REACT'); done(); - installNpmDeps(); + installDeps(npmOptions); logger.log('\nTo run your storybook, type:\n'); codeLog([ - 'npm run storybook' + runStorybookCommand ]); logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; @@ -125,11 +132,11 @@ switch (projectType) { require('../generators/REACT'); done(); - installNpmDeps(); + installDeps(npmOptions); logger.log('\nTo run your storybook, type:\n'); codeLog([ - 'npm run storybook' + runStorybookCommand ]); logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; diff --git a/lib/helpers.js b/lib/helpers.js index f827bc1..7e3eb6e 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -86,14 +86,22 @@ exports.codeLog = function codeLog(codeLines, leftPadAmount) { logger.log(finalResult); }; -exports.installNpmDeps = function () { - var done = exports.commandLog('Preparing to install NPM dependencies'); +exports.installDeps = function (options) { + var done = exports.commandLog('Preparing to install dependencies'); done(); + console.log(); - var result = spawnSync('npm', ['install'], { stdio: 'inherit' }); - done = exports.commandLog('Installing NPM dependencies'); + var result; + if (options.useYarn) { + result = spawnSync('yarn', { stdio: 'inherit' }); + } else { + result = spawnSync('npm', ['install'], { stdio: 'inherit' }); + } + + console.log(); + done = exports.commandLog('Installing dependencies'); if (result.status !== 0) { - done('An error occured while running `npm install`.'); + done('An error occured while installing dependencies`.'); process.exit(1); } done(); From 8fe8308ec9c40cb357a25fa590cb511d1a8b06f8 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 12 Oct 2016 08:20:07 +0530 Subject: [PATCH 68/81] Try to detect yarn from the install location. --- bin/generate.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/generate.js b/bin/generate.js index aa70842..86ff0d3 100755 --- a/bin/generate.js +++ b/bin/generate.js @@ -25,11 +25,13 @@ var welcomeMessage = 'getstorybook - the simplest way to add a storybook to your project.'; logger.log(chalk.inverse('\n ' + welcomeMessage + ' \n')); +var useYarn = Boolean(program.useYarn) || /\.yarn-cache/.test(__dirname); + var npmOptions = { - useYarn: Boolean(program.useYarn) + useYarn: useYarn }; -var runStorybookCommand = program.useYarn? 'yarn run storybook' : 'npm run storybook'; +var runStorybookCommand = useYarn? 'yarn run storybook' : 'npm run storybook'; // Update notify code. updateNotifier({ From af3ed491deb9e2938c4ec805c5102489d7ecceb9 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 12 Oct 2016 08:26:24 +0530 Subject: [PATCH 69/81] Update docs. --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 56f1bf5..f4e3002 100644 --- a/README.md +++ b/README.md @@ -29,4 +29,16 @@ yarn global add getstorybook getstorybook --use-yarn ``` +`getstorybook` will identify it's installed with yarn and it'll use yarn to install deps. + +> This is the way, if you wanna use yarn for all of your storybook projects. + +If that's not the case, you can do this: + +``` +npm i -g getstorybook +getstorybook --use-yarn + +``` + For more information, refer [React Storybook](https://github.com/kadirahq/react-storybook) documentation. From cdb14f55617e3e7f4925b72dd825a680943cb1cb Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 12 Oct 2016 08:29:49 +0530 Subject: [PATCH 70/81] 1.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a879351..2b139e4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.5.3", + "version": "1.6.0", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From 528de2cda291c478cb8b30f008d393a9cbb945bc Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Wed, 12 Oct 2016 08:31:54 +0530 Subject: [PATCH 71/81] Update CHANGELOG.md --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cd0a74..4afddc8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +### v1.6.0 +12-Oct-2016 + +Add yarn support. Now users could install storybook with yarn and use yarn to install deps: + +``` +yarn global add getstorybook +getstorybook +``` + +For more info check [docs](https://github.com/kadirahq/getstorybook#yarn-support). + ### v1.5.2 07-Oct-2016 From a3d091641b4addedd31f1d0b0d85774f6a1988de Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 18 Oct 2016 08:20:58 +0530 Subject: [PATCH 72/81] Fix some typos --- lib/helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/helpers.js b/lib/helpers.js index 7e3eb6e..235de7f 100644 --- a/lib/helpers.js +++ b/lib/helpers.js @@ -101,7 +101,7 @@ exports.installDeps = function (options) { console.log(); done = exports.commandLog('Installing dependencies'); if (result.status !== 0) { - done('An error occured while installing dependencies`.'); + done('An error occurred while installing dependencies.'); process.exit(1); } done(); From af81763157fcfb8be0e515877c691d6930e8459c Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 18 Oct 2016 08:21:49 +0530 Subject: [PATCH 73/81] 1.6.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2b139e4..8e1cbc3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.6.0", + "version": "1.6.1", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From 01bbf4c1706c721f1c4ac10ac13f9030023e08f3 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Tue, 18 Oct 2016 08:22:32 +0530 Subject: [PATCH 74/81] Update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4afddc8..1edc697 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +### v1.6.1 +18-Oct-2016 + +Fix some typos. [PR21](https://github.com/kadirahq/getstorybook/pull/21) + ### v1.6.0 12-Oct-2016 From 660ef932a5eb3ce4135a93006d8967d55d24043c Mon Sep 17 00:00:00 2001 From: Tim Oxley Date: Thu, 20 Oct 2016 16:46:33 -0500 Subject: [PATCH 75/81] Fix link to custom webpack config docs You may want to re-apply your url shortener to this. --- generators/WEBPACK_REACT/template/.storybook/webpack.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/WEBPACK_REACT/template/.storybook/webpack.config.js b/generators/WEBPACK_REACT/template/.storybook/webpack.config.js index d8098ec..7441c98 100644 --- a/generators/WEBPACK_REACT/template/.storybook/webpack.config.js +++ b/generators/WEBPACK_REACT/template/.storybook/webpack.config.js @@ -1,6 +1,6 @@ // you can use this file to add your custom webpack plugins, loaders and anything you like. // This is just the basic way to add addional webpack configurations. -// For more information refer the docs: https://goo.gl/qPbSyX +// For more information refer the docs: https://getstorybook.io/docs/configurations/custom-webpack-config // IMPORTANT // When you add this file, we won't add the default configurations which is similar From a8641b7201d5ad185c22072b501984bbaf1b4dad Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Sun, 18 Dec 2016 11:49:54 +0530 Subject: [PATCH 76/81] Use a non-hacky way to detect yarn. Now it simply try to see whether user's system has yarn or not. --- README.md | 20 ++++++-------------- bin/generate.js | 7 ++++--- lib/has_yarn.js | 6 ++++++ 3 files changed, 16 insertions(+), 17 deletions(-) create mode 100644 lib/has_yarn.js diff --git a/README.md b/README.md index f4e3002..0768b89 100644 --- a/README.md +++ b/README.md @@ -20,25 +20,17 @@ That's all you've to do. --- -## Yarn support +## [Yarn](https://github.com/yarnpkg/yarn) support -getstorybook also supports yarn. If you are using yarn, this is how to use it: +`getstorybook` also supports yarn. +If you have installed yarn in your system, it'll detect it and use `yarn` instead of `npm`. + +If you don't want to use `npm` always you can use the `--use-npm` option like this: ``` -yarn global add getstorybook -getstorybook --use-yarn +getstorybook --use-npm ``` -`getstorybook` will identify it's installed with yarn and it'll use yarn to install deps. - -> This is the way, if you wanna use yarn for all of your storybook projects. -If that's not the case, you can do this: - -``` -npm i -g getstorybook -getstorybook --use-yarn - -``` For more information, refer [React Storybook](https://github.com/kadirahq/react-storybook) documentation. diff --git a/bin/generate.js b/bin/generate.js index 86ff0d3..f4bdb5b 100755 --- a/bin/generate.js +++ b/bin/generate.js @@ -4,13 +4,14 @@ var updateNotifier = require('update-notifier'); var program = require('commander'); +var chalk = require('chalk'); var detect = require('../lib/detect'); +var hasYarn = require('../lib/has_yarn') var types = require('../lib/project_types'); var commandLog = require('../lib/helpers').commandLog; var codeLog = require('../lib/helpers').codeLog; var paddedLog = require('../lib/helpers').paddedLog; var installDeps = require('../lib/helpers').installDeps; -var chalk = require('chalk'); var logger = console; var pkg = require('../package.json'); @@ -18,14 +19,14 @@ var pkg = require('../package.json'); program .version(pkg.version) .option('-f --force', 'Forcely add storybook') - .option('-Y --use-yarn', 'Use yarn to install deps') + .option('-N --use-npm', 'Use npm to install deps') .parse(process.argv); var welcomeMessage = 'getstorybook - the simplest way to add a storybook to your project.'; logger.log(chalk.inverse('\n ' + welcomeMessage + ' \n')); -var useYarn = Boolean(program.useYarn) || /\.yarn-cache/.test(__dirname); +var useYarn = Boolean(program.useNpm !== true) && hasYarn() var npmOptions = { useYarn: useYarn diff --git a/lib/has_yarn.js b/lib/has_yarn.js new file mode 100644 index 0000000..7228451 --- /dev/null +++ b/lib/has_yarn.js @@ -0,0 +1,6 @@ +var spawnSync = require('spawn-sync'); + +module.exports = function hasYarn() { + var result = spawnSync('yarn', ['--version'], { silent: true }); + return result.status === 0; +} From 514e39c39bc713fb73048e1aae5e860eeea5eb6a Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Sun, 18 Dec 2016 11:51:09 +0530 Subject: [PATCH 77/81] 1.7.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8e1cbc3..95385b8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "getstorybook", - "version": "1.6.1", + "version": "1.7.0", "description": "Easiest way to add Storybook support to your project.", "bin": { "getstorybook": "./bin/generate.js" From f2daf9a04f0f4921b57f37508e1cffa13a2c1343 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Sun, 18 Dec 2016 11:52:08 +0530 Subject: [PATCH 78/81] Update CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1edc697..eb3b16b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +### v1.7.0 +18-Dec-2016 + +Use a non-hacky way to detect yarn. [PR24](https://github.com/storybooks/getstorybook/pull/24) + ### v1.6.1 18-Oct-2016 From 06b0e90edfc89d592d0791e145fdaa9f27a9ee19 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Tue, 4 Apr 2017 23:54:06 +0200 Subject: [PATCH 79/81] MOVE to packages --- CHANGELOG.md => packages/getstorybook/CHANGELOG.md | 0 LICENSE => packages/getstorybook/LICENSE | 0 {bin => packages/getstorybook/bin}/generate.js | 0 .../getstorybook/docs}/getstorybook.png | Bin .../getstorybook/generators}/METEOR/index.js | 0 .../generators}/METEOR/template/.stories/Button.js | 0 .../generators}/METEOR/template/.stories/Welcome.js | 0 .../generators}/METEOR/template/.stories/index.js | 0 .../METEOR/template/.storybook/config.js | 0 .../getstorybook/generators}/REACT/index.js | 0 .../generators}/REACT/template/.storybook/config.js | 0 .../generators}/REACT/template/stories/Button.js | 0 .../generators}/REACT/template/stories/Welcome.js | 0 .../generators}/REACT/template/stories/index.js | 0 .../getstorybook/generators}/REACT_NATIVE/index.js | 0 .../REACT_NATIVE/template/storybook/addons.js | 0 .../template/storybook/index.android.js | 0 .../REACT_NATIVE/template/storybook/index.ios.js | 0 .../storybook/stories/Button/index.android.js | 0 .../template/storybook/stories/Button/index.ios.js | 0 .../template/storybook/stories/CenterView/index.js | 0 .../template/storybook/stories/CenterView/style.js | 0 .../template/storybook/stories/Welcome/index.js | 0 .../template/storybook/stories/index.js | 0 .../getstorybook/generators}/REACT_SCRIPTS/index.js | 0 .../REACT_SCRIPTS/template/.storybook/config.js | 0 .../REACT_SCRIPTS/template/src/stories/Button.js | 0 .../REACT_SCRIPTS/template/src/stories/Welcome.js | 0 .../REACT_SCRIPTS/template/src/stories/index.js | 0 .../getstorybook/generators}/WEBPACK_REACT/index.js | 0 .../WEBPACK_REACT/template/.storybook/config.js | 0 .../template/.storybook/webpack.config.js | 0 .../WEBPACK_REACT/template/stories/Button.js | 0 .../WEBPACK_REACT/template/stories/Welcome.js | 0 .../WEBPACK_REACT/template/stories/index.js | 0 {lib => packages/getstorybook/lib}/detect.js | 0 {lib => packages/getstorybook/lib}/has_yarn.js | 0 {lib => packages/getstorybook/lib}/helpers.js | 0 {lib => packages/getstorybook/lib}/project_types.js | 0 39 files changed, 0 insertions(+), 0 deletions(-) rename CHANGELOG.md => packages/getstorybook/CHANGELOG.md (100%) rename LICENSE => packages/getstorybook/LICENSE (100%) rename {bin => packages/getstorybook/bin}/generate.js (100%) rename {docs => packages/getstorybook/docs}/getstorybook.png (100%) rename {generators => packages/getstorybook/generators}/METEOR/index.js (100%) rename {generators => packages/getstorybook/generators}/METEOR/template/.stories/Button.js (100%) rename {generators => packages/getstorybook/generators}/METEOR/template/.stories/Welcome.js (100%) rename {generators => packages/getstorybook/generators}/METEOR/template/.stories/index.js (100%) rename {generators => packages/getstorybook/generators}/METEOR/template/.storybook/config.js (100%) rename {generators => packages/getstorybook/generators}/REACT/index.js (100%) rename {generators => packages/getstorybook/generators}/REACT/template/.storybook/config.js (100%) rename {generators => packages/getstorybook/generators}/REACT/template/stories/Button.js (100%) rename {generators => packages/getstorybook/generators}/REACT/template/stories/Welcome.js (100%) rename {generators => packages/getstorybook/generators}/REACT/template/stories/index.js (100%) rename {generators => packages/getstorybook/generators}/REACT_NATIVE/index.js (100%) rename {generators => packages/getstorybook/generators}/REACT_NATIVE/template/storybook/addons.js (100%) rename {generators => packages/getstorybook/generators}/REACT_NATIVE/template/storybook/index.android.js (100%) rename {generators => packages/getstorybook/generators}/REACT_NATIVE/template/storybook/index.ios.js (100%) rename {generators => packages/getstorybook/generators}/REACT_NATIVE/template/storybook/stories/Button/index.android.js (100%) rename {generators => packages/getstorybook/generators}/REACT_NATIVE/template/storybook/stories/Button/index.ios.js (100%) rename {generators => packages/getstorybook/generators}/REACT_NATIVE/template/storybook/stories/CenterView/index.js (100%) rename {generators => packages/getstorybook/generators}/REACT_NATIVE/template/storybook/stories/CenterView/style.js (100%) rename {generators => packages/getstorybook/generators}/REACT_NATIVE/template/storybook/stories/Welcome/index.js (100%) rename {generators => packages/getstorybook/generators}/REACT_NATIVE/template/storybook/stories/index.js (100%) rename {generators => packages/getstorybook/generators}/REACT_SCRIPTS/index.js (100%) rename {generators => packages/getstorybook/generators}/REACT_SCRIPTS/template/.storybook/config.js (100%) rename {generators => packages/getstorybook/generators}/REACT_SCRIPTS/template/src/stories/Button.js (100%) rename {generators => packages/getstorybook/generators}/REACT_SCRIPTS/template/src/stories/Welcome.js (100%) rename {generators => packages/getstorybook/generators}/REACT_SCRIPTS/template/src/stories/index.js (100%) rename {generators => packages/getstorybook/generators}/WEBPACK_REACT/index.js (100%) rename {generators => packages/getstorybook/generators}/WEBPACK_REACT/template/.storybook/config.js (100%) rename {generators => packages/getstorybook/generators}/WEBPACK_REACT/template/.storybook/webpack.config.js (100%) rename {generators => packages/getstorybook/generators}/WEBPACK_REACT/template/stories/Button.js (100%) rename {generators => packages/getstorybook/generators}/WEBPACK_REACT/template/stories/Welcome.js (100%) rename {generators => packages/getstorybook/generators}/WEBPACK_REACT/template/stories/index.js (100%) rename {lib => packages/getstorybook/lib}/detect.js (100%) rename {lib => packages/getstorybook/lib}/has_yarn.js (100%) rename {lib => packages/getstorybook/lib}/helpers.js (100%) rename {lib => packages/getstorybook/lib}/project_types.js (100%) diff --git a/CHANGELOG.md b/packages/getstorybook/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to packages/getstorybook/CHANGELOG.md diff --git a/LICENSE b/packages/getstorybook/LICENSE similarity index 100% rename from LICENSE rename to packages/getstorybook/LICENSE diff --git a/bin/generate.js b/packages/getstorybook/bin/generate.js similarity index 100% rename from bin/generate.js rename to packages/getstorybook/bin/generate.js diff --git a/docs/getstorybook.png b/packages/getstorybook/docs/getstorybook.png similarity index 100% rename from docs/getstorybook.png rename to packages/getstorybook/docs/getstorybook.png diff --git a/generators/METEOR/index.js b/packages/getstorybook/generators/METEOR/index.js similarity index 100% rename from generators/METEOR/index.js rename to packages/getstorybook/generators/METEOR/index.js diff --git a/generators/METEOR/template/.stories/Button.js b/packages/getstorybook/generators/METEOR/template/.stories/Button.js similarity index 100% rename from generators/METEOR/template/.stories/Button.js rename to packages/getstorybook/generators/METEOR/template/.stories/Button.js diff --git a/generators/METEOR/template/.stories/Welcome.js b/packages/getstorybook/generators/METEOR/template/.stories/Welcome.js similarity index 100% rename from generators/METEOR/template/.stories/Welcome.js rename to packages/getstorybook/generators/METEOR/template/.stories/Welcome.js diff --git a/generators/METEOR/template/.stories/index.js b/packages/getstorybook/generators/METEOR/template/.stories/index.js similarity index 100% rename from generators/METEOR/template/.stories/index.js rename to packages/getstorybook/generators/METEOR/template/.stories/index.js diff --git a/generators/METEOR/template/.storybook/config.js b/packages/getstorybook/generators/METEOR/template/.storybook/config.js similarity index 100% rename from generators/METEOR/template/.storybook/config.js rename to packages/getstorybook/generators/METEOR/template/.storybook/config.js diff --git a/generators/REACT/index.js b/packages/getstorybook/generators/REACT/index.js similarity index 100% rename from generators/REACT/index.js rename to packages/getstorybook/generators/REACT/index.js diff --git a/generators/REACT/template/.storybook/config.js b/packages/getstorybook/generators/REACT/template/.storybook/config.js similarity index 100% rename from generators/REACT/template/.storybook/config.js rename to packages/getstorybook/generators/REACT/template/.storybook/config.js diff --git a/generators/REACT/template/stories/Button.js b/packages/getstorybook/generators/REACT/template/stories/Button.js similarity index 100% rename from generators/REACT/template/stories/Button.js rename to packages/getstorybook/generators/REACT/template/stories/Button.js diff --git a/generators/REACT/template/stories/Welcome.js b/packages/getstorybook/generators/REACT/template/stories/Welcome.js similarity index 100% rename from generators/REACT/template/stories/Welcome.js rename to packages/getstorybook/generators/REACT/template/stories/Welcome.js diff --git a/generators/REACT/template/stories/index.js b/packages/getstorybook/generators/REACT/template/stories/index.js similarity index 100% rename from generators/REACT/template/stories/index.js rename to packages/getstorybook/generators/REACT/template/stories/index.js diff --git a/generators/REACT_NATIVE/index.js b/packages/getstorybook/generators/REACT_NATIVE/index.js similarity index 100% rename from generators/REACT_NATIVE/index.js rename to packages/getstorybook/generators/REACT_NATIVE/index.js diff --git a/generators/REACT_NATIVE/template/storybook/addons.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/addons.js similarity index 100% rename from generators/REACT_NATIVE/template/storybook/addons.js rename to packages/getstorybook/generators/REACT_NATIVE/template/storybook/addons.js diff --git a/generators/REACT_NATIVE/template/storybook/index.android.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/index.android.js similarity index 100% rename from generators/REACT_NATIVE/template/storybook/index.android.js rename to packages/getstorybook/generators/REACT_NATIVE/template/storybook/index.android.js diff --git a/generators/REACT_NATIVE/template/storybook/index.ios.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/index.ios.js similarity index 100% rename from generators/REACT_NATIVE/template/storybook/index.ios.js rename to packages/getstorybook/generators/REACT_NATIVE/template/storybook/index.ios.js diff --git a/generators/REACT_NATIVE/template/storybook/stories/Button/index.android.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/Button/index.android.js similarity index 100% rename from generators/REACT_NATIVE/template/storybook/stories/Button/index.android.js rename to packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/Button/index.android.js diff --git a/generators/REACT_NATIVE/template/storybook/stories/Button/index.ios.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/Button/index.ios.js similarity index 100% rename from generators/REACT_NATIVE/template/storybook/stories/Button/index.ios.js rename to packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/Button/index.ios.js diff --git a/generators/REACT_NATIVE/template/storybook/stories/CenterView/index.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/CenterView/index.js similarity index 100% rename from generators/REACT_NATIVE/template/storybook/stories/CenterView/index.js rename to packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/CenterView/index.js diff --git a/generators/REACT_NATIVE/template/storybook/stories/CenterView/style.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/CenterView/style.js similarity index 100% rename from generators/REACT_NATIVE/template/storybook/stories/CenterView/style.js rename to packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/CenterView/style.js diff --git a/generators/REACT_NATIVE/template/storybook/stories/Welcome/index.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/Welcome/index.js similarity index 100% rename from generators/REACT_NATIVE/template/storybook/stories/Welcome/index.js rename to packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/Welcome/index.js diff --git a/generators/REACT_NATIVE/template/storybook/stories/index.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/index.js similarity index 100% rename from generators/REACT_NATIVE/template/storybook/stories/index.js rename to packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/index.js diff --git a/generators/REACT_SCRIPTS/index.js b/packages/getstorybook/generators/REACT_SCRIPTS/index.js similarity index 100% rename from generators/REACT_SCRIPTS/index.js rename to packages/getstorybook/generators/REACT_SCRIPTS/index.js diff --git a/generators/REACT_SCRIPTS/template/.storybook/config.js b/packages/getstorybook/generators/REACT_SCRIPTS/template/.storybook/config.js similarity index 100% rename from generators/REACT_SCRIPTS/template/.storybook/config.js rename to packages/getstorybook/generators/REACT_SCRIPTS/template/.storybook/config.js diff --git a/generators/REACT_SCRIPTS/template/src/stories/Button.js b/packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/Button.js similarity index 100% rename from generators/REACT_SCRIPTS/template/src/stories/Button.js rename to packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/Button.js diff --git a/generators/REACT_SCRIPTS/template/src/stories/Welcome.js b/packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/Welcome.js similarity index 100% rename from generators/REACT_SCRIPTS/template/src/stories/Welcome.js rename to packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/Welcome.js diff --git a/generators/REACT_SCRIPTS/template/src/stories/index.js b/packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/index.js similarity index 100% rename from generators/REACT_SCRIPTS/template/src/stories/index.js rename to packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/index.js diff --git a/generators/WEBPACK_REACT/index.js b/packages/getstorybook/generators/WEBPACK_REACT/index.js similarity index 100% rename from generators/WEBPACK_REACT/index.js rename to packages/getstorybook/generators/WEBPACK_REACT/index.js diff --git a/generators/WEBPACK_REACT/template/.storybook/config.js b/packages/getstorybook/generators/WEBPACK_REACT/template/.storybook/config.js similarity index 100% rename from generators/WEBPACK_REACT/template/.storybook/config.js rename to packages/getstorybook/generators/WEBPACK_REACT/template/.storybook/config.js diff --git a/generators/WEBPACK_REACT/template/.storybook/webpack.config.js b/packages/getstorybook/generators/WEBPACK_REACT/template/.storybook/webpack.config.js similarity index 100% rename from generators/WEBPACK_REACT/template/.storybook/webpack.config.js rename to packages/getstorybook/generators/WEBPACK_REACT/template/.storybook/webpack.config.js diff --git a/generators/WEBPACK_REACT/template/stories/Button.js b/packages/getstorybook/generators/WEBPACK_REACT/template/stories/Button.js similarity index 100% rename from generators/WEBPACK_REACT/template/stories/Button.js rename to packages/getstorybook/generators/WEBPACK_REACT/template/stories/Button.js diff --git a/generators/WEBPACK_REACT/template/stories/Welcome.js b/packages/getstorybook/generators/WEBPACK_REACT/template/stories/Welcome.js similarity index 100% rename from generators/WEBPACK_REACT/template/stories/Welcome.js rename to packages/getstorybook/generators/WEBPACK_REACT/template/stories/Welcome.js diff --git a/generators/WEBPACK_REACT/template/stories/index.js b/packages/getstorybook/generators/WEBPACK_REACT/template/stories/index.js similarity index 100% rename from generators/WEBPACK_REACT/template/stories/index.js rename to packages/getstorybook/generators/WEBPACK_REACT/template/stories/index.js diff --git a/lib/detect.js b/packages/getstorybook/lib/detect.js similarity index 100% rename from lib/detect.js rename to packages/getstorybook/lib/detect.js diff --git a/lib/has_yarn.js b/packages/getstorybook/lib/has_yarn.js similarity index 100% rename from lib/has_yarn.js rename to packages/getstorybook/lib/has_yarn.js diff --git a/lib/helpers.js b/packages/getstorybook/lib/helpers.js similarity index 100% rename from lib/helpers.js rename to packages/getstorybook/lib/helpers.js diff --git a/lib/project_types.js b/packages/getstorybook/lib/project_types.js similarity index 100% rename from lib/project_types.js rename to packages/getstorybook/lib/project_types.js From 76b407c94250027b37a5f8db44ac9ec5b0370981 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Tue, 4 Apr 2017 23:55:49 +0200 Subject: [PATCH 80/81] FIX linting --- packages/getstorybook/bin/generate.js | 71 +++++++---------- .../getstorybook/generators/METEOR/index.js | 22 +++--- .../getstorybook/generators/REACT/index.js | 8 +- .../REACT/template/stories/Button.js | 9 +-- .../REACT/template/stories/Welcome.js | 45 +++++++---- .../REACT/template/stories/index.js | 13 +--- .../generators/REACT_NATIVE/index.js | 18 ++--- .../template/storybook/index.android.js | 11 ++- .../template/storybook/index.ios.js | 11 ++- .../storybook/stories/CenterView/style.js | 4 +- .../storybook/stories/Welcome/index.js | 20 +++-- .../template/storybook/stories/index.js | 9 +-- .../generators/REACT_SCRIPTS/index.js | 10 +-- .../template/src/stories/Button.js | 9 +-- .../template/src/stories/Welcome.js | 49 ++++++++---- .../template/src/stories/index.js | 13 +--- .../generators/WEBPACK_REACT/index.js | 8 +- .../WEBPACK_REACT/template/stories/Button.js | 9 +-- .../WEBPACK_REACT/template/stories/Welcome.js | 53 +++++++++---- .../WEBPACK_REACT/template/stories/index.js | 13 +--- packages/getstorybook/lib/detect.js | 45 ++++------- packages/getstorybook/lib/has_yarn.js | 6 +- packages/getstorybook/lib/helpers.js | 77 ++++++++----------- 23 files changed, 261 insertions(+), 272 deletions(-) diff --git a/packages/getstorybook/bin/generate.js b/packages/getstorybook/bin/generate.js index f4bdb5b..ad0615a 100755 --- a/packages/getstorybook/bin/generate.js +++ b/packages/getstorybook/bin/generate.js @@ -2,19 +2,19 @@ /* eslint global-require: 0 */ -var updateNotifier = require('update-notifier'); -var program = require('commander'); -var chalk = require('chalk'); -var detect = require('../lib/detect'); -var hasYarn = require('../lib/has_yarn') -var types = require('../lib/project_types'); -var commandLog = require('../lib/helpers').commandLog; -var codeLog = require('../lib/helpers').codeLog; -var paddedLog = require('../lib/helpers').paddedLog; -var installDeps = require('../lib/helpers').installDeps; -var logger = console; - -var pkg = require('../package.json'); +const updateNotifier = require('update-notifier'); +const program = require('commander'); +const chalk = require('chalk'); +const detect = require('../lib/detect'); +const hasYarn = require('../lib/has_yarn'); +const types = require('../lib/project_types'); +const commandLog = require('../lib/helpers').commandLog; +const codeLog = require('../lib/helpers').codeLog; +const paddedLog = require('../lib/helpers').paddedLog; +const installDeps = require('../lib/helpers').installDeps; +const logger = console; + +const pkg = require('../package.json'); program .version(pkg.version) @@ -22,27 +22,26 @@ program .option('-N --use-npm', 'Use npm to install deps') .parse(process.argv); -var welcomeMessage = - 'getstorybook - the simplest way to add a storybook to your project.'; -logger.log(chalk.inverse('\n ' + welcomeMessage + ' \n')); +const welcomeMessage = 'getstorybook - the simplest way to add a storybook to your project.'; +logger.log(chalk.inverse(`\n ${welcomeMessage} \n`)); -var useYarn = Boolean(program.useNpm !== true) && hasYarn() +const useYarn = Boolean(program.useNpm !== true) && hasYarn(); -var npmOptions = { - useYarn: useYarn +const npmOptions = { + useYarn }; -var runStorybookCommand = useYarn? 'yarn run storybook' : 'npm run storybook'; +const runStorybookCommand = useYarn ? 'yarn run storybook' : 'npm run storybook'; // Update notify code. updateNotifier({ - pkg: pkg, + pkg, updateCheckInterval: 1000 * 60 * 60 // every hour (we could increase this later on.) }).notify(); -var projectType; +let projectType; -var done = commandLog('Detecting project type'); +let done = commandLog('Detecting project type'); try { projectType = detect({ force: program.force @@ -68,9 +67,7 @@ switch (projectType) { installDeps(npmOptions); logger.log('\nTo run your storybook, type:\n'); - codeLog([ - runStorybookCommand - ]); + codeLog([runStorybookCommand]); logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; @@ -82,9 +79,7 @@ switch (projectType) { installDeps(npmOptions); logger.log('\nTo run your storybook, type:\n'); - codeLog([ - runStorybookCommand - ]); + codeLog([runStorybookCommand]); logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; @@ -96,9 +91,7 @@ switch (projectType) { installDeps(npmOptions); logger.log('\nTo run your storybook, type:\n'); - codeLog([ - runStorybookCommand - ]); + codeLog([runStorybookCommand]); logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; @@ -110,9 +103,7 @@ switch (projectType) { installDeps(npmOptions); logger.log('\nTo run your storybook, type:\n'); - codeLog([ - runStorybookCommand - ]); + codeLog([runStorybookCommand]); logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; @@ -124,9 +115,7 @@ switch (projectType) { installDeps(npmOptions); logger.log('\nTo run your storybook, type:\n'); - codeLog([ - runStorybookCommand - ]); + codeLog([runStorybookCommand]); logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; @@ -138,14 +127,12 @@ switch (projectType) { installDeps(npmOptions); logger.log('\nTo run your storybook, type:\n'); - codeLog([ - runStorybookCommand - ]); + codeLog([runStorybookCommand]); logger.log('\nFor more information visit:', chalk.cyan('http://getstorybook.io')); break; default: - paddedLog('Unsupported Project type. (code: ' + projectType + ')'); + paddedLog(`Unsupported Project type. (code: ${projectType})`); paddedLog('Visit http://getstorybook.io for more information.'); } diff --git a/packages/getstorybook/generators/METEOR/index.js b/packages/getstorybook/generators/METEOR/index.js index a266287..491dd20 100644 --- a/packages/getstorybook/generators/METEOR/index.js +++ b/packages/getstorybook/generators/METEOR/index.js @@ -1,21 +1,21 @@ -var mergeDirs = require('merge-dirs').default; -var helpers = require('../../lib/helpers'); -var path = require('path'); -var fs = require('fs'); -var sh = require('shelljs'); -var JSON5 = require('json5'); +const mergeDirs = require('merge-dirs').default; +const helpers = require('../../lib/helpers'); +const path = require('path'); +const fs = require('fs'); +const sh = require('shelljs'); +const JSON5 = require('json5'); mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite'); -var packageJson = helpers.getPackageJson(); +const packageJson = helpers.getPackageJson(); packageJson.devDependencies = packageJson.devDependencies || {}; packageJson.scripts = packageJson.scripts || {}; packageJson.dependencies = packageJson.dependencies || {}; // create or update .babelrc -var babelrc = null; -if(fs.existsSync('.babelrc')) { - var babelrcContent = fs.readFileSync('.babelrc', 'utf8'); +let babelrc = null; +if (fs.existsSync('.babelrc')) { + const babelrcContent = fs.readFileSync('.babelrc', 'utf8'); babelrc = JSON5.parse(babelrcContent); babelrc.plugins = babelrc.plugins || []; @@ -26,7 +26,7 @@ if(fs.existsSync('.babelrc')) { } else { babelrc = { presets: ['es2015', 'es2016', 'react', 'stage-1'], - plugins: ['babel-root-slash-import'], + plugins: ['babel-root-slash-import'] }; packageJson.devDependencies['babel-preset-es2015'] = '^6.9.0'; diff --git a/packages/getstorybook/generators/REACT/index.js b/packages/getstorybook/generators/REACT/index.js index 85ef839..c20fac0 100644 --- a/packages/getstorybook/generators/REACT/index.js +++ b/packages/getstorybook/generators/REACT/index.js @@ -1,10 +1,10 @@ -var mergeDirs = require('merge-dirs').default; -var helpers = require('../../lib/helpers'); -var path = require('path'); +const mergeDirs = require('merge-dirs').default; +const helpers = require('../../lib/helpers'); +const path = require('path'); mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite'); -var packageJson = helpers.getPackageJson(); +const packageJson = helpers.getPackageJson(); // TODO: Get the latest version of storybook here. packageJson.devDependencies = packageJson.devDependencies || {}; diff --git a/packages/getstorybook/generators/REACT/template/stories/Button.js b/packages/getstorybook/generators/REACT/template/stories/Button.js index 5662b88..e6e3976 100644 --- a/packages/getstorybook/generators/REACT/template/stories/Button.js +++ b/packages/getstorybook/generators/REACT/template/stories/Button.js @@ -7,21 +7,18 @@ const buttonStyles = { cursor: 'pointer', fontSize: 15, padding: '3px 10px', - margin: 10, + margin: 10 }; const Button = ({ children, onClick }) => ( - ); Button.propTypes = { children: React.PropTypes.string.isRequired, - onClick: React.PropTypes.func, + onClick: React.PropTypes.func }; export default Button; diff --git a/packages/getstorybook/generators/REACT/template/stories/Welcome.js b/packages/getstorybook/generators/REACT/template/stories/Welcome.js index d126acb..01766dc 100644 --- a/packages/getstorybook/generators/REACT/template/stories/Welcome.js +++ b/packages/getstorybook/generators/REACT/template/stories/Welcome.js @@ -5,35 +5,35 @@ const styles = { margin: 15, maxWidth: 600, lineHeight: 1.4, - fontFamily: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', + fontFamily: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif' }, logo: { - width: 200, + width: 200 }, link: { color: '#1474f3', textDecoration: 'none', borderBottom: '1px solid #1474f3', - paddingBottom: 2, + paddingBottom: 2 }, code: { fontSize: 15, fontWeight: 600, - padding: "2px 5px", - border: "1px solid #eae9e9", + padding: '2px 5px', + border: '1px solid #eae9e9', borderRadius: 4, backgroundColor: '#f3f2f2', - color: '#3a3a3a', - }, + color: '#3a3a3a' + } }; export default class Welcome extends React.Component { showApp(e) { e.preventDefault(); - if(this.props.showApp) this.props.showApp(); + if (this.props.showApp) this.props.showApp(); } render() { @@ -44,14 +44,25 @@ export default class Welcome extends React.Component { This is a UI component dev environment for your app.

- We've added some basic stories inside the src/stories directory. -
+ We've added some basic stories inside the + {' '} + src/stories + {' '} + directory. +
A story is a single state of one or more UI components. You can have as many stories as you want. -
+
(Basically a story is like a visual test case.)

- See these sample stories for a component called Button. + See these sample + {' '} + stories + {' '} + for a component called + {' '} + Button + .

Just like that, you can add your own components as stories. @@ -63,8 +74,14 @@ export default class Welcome extends React.Component {

This is just one thing you can do with Storybook. -
- Have a look at the React Storybook repo for more information. +
+ Have a look at the + {' '} + + React Storybook + + {' '} + repo for more information.

); diff --git a/packages/getstorybook/generators/REACT/template/stories/index.js b/packages/getstorybook/generators/REACT/template/stories/index.js index cd66c18..ee57702 100644 --- a/packages/getstorybook/generators/REACT/template/stories/index.js +++ b/packages/getstorybook/generators/REACT/template/stories/index.js @@ -3,15 +3,8 @@ import { storiesOf, action, linkTo } from '@kadira/storybook'; import Button from './Button'; import Welcome from './Welcome'; -storiesOf('Welcome', module) - .add('to Storybook', () => ( - - )); +storiesOf('Welcome', module).add('to Storybook', () => ); storiesOf('Button', module) - .add('with text', () => ( - - )) - .add('with some emoji', () => ( - - )); + .add('with text', () => ) + .add('with some emoji', () => ); diff --git a/packages/getstorybook/generators/REACT_NATIVE/index.js b/packages/getstorybook/generators/REACT_NATIVE/index.js index ae6bcd7..455e8bb 100644 --- a/packages/getstorybook/generators/REACT_NATIVE/index.js +++ b/packages/getstorybook/generators/REACT_NATIVE/index.js @@ -1,23 +1,21 @@ -var mergeDirs = require('merge-dirs').default; -var helpers = require('../../lib/helpers'); -var path = require('path'); -var shell = require('shelljs'); +const mergeDirs = require('merge-dirs').default; +const helpers = require('../../lib/helpers'); +const path = require('path'); +const shell = require('shelljs'); // copy all files from the template directory to project directory mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite'); // set correct project name on entry files if possible -var dirname = shell.ls('-d', 'ios/*.xcodeproj').stdout; -var projectName = dirname && dirname.slice( - 'ios/'.length, - dirname.length - '.xcodeproj'.length - 1 -); +const dirname = shell.ls('-d', 'ios/*.xcodeproj').stdout; +const projectName = dirname && + dirname.slice('ios/'.length, dirname.length - '.xcodeproj'.length - 1); if (projectName) { shell.sed('-i', '%APP_NAME%', projectName, 'storybook/index.ios.js'); shell.sed('-i', '%APP_NAME%', projectName, 'storybook/index.android.js'); } -var packageJson = helpers.getPackageJson(); +const packageJson = helpers.getPackageJson(); // TODO: Get the latest version of storybook here. packageJson.devDependencies = packageJson.devDependencies || {}; diff --git a/packages/getstorybook/generators/REACT_NATIVE/template/storybook/index.android.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/index.android.js index efe59a0..b36980f 100644 --- a/packages/getstorybook/generators/REACT_NATIVE/template/storybook/index.android.js +++ b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/index.android.js @@ -2,9 +2,12 @@ import { AppRegistry } from 'react-native'; import { getStorybookUI, configure } from '@kadira/react-native-storybook'; // import stories -configure(() => { - require('./stories'); -}, module); +configure( + () => { + require('./stories'); + }, + module +); -const StorybookUI = getStorybookUI({port: 7007, host: 'localhost'}); +const StorybookUI = getStorybookUI({ port: 7007, host: 'localhost' }); AppRegistry.registerComponent('%APP_NAME%', () => StorybookUI); diff --git a/packages/getstorybook/generators/REACT_NATIVE/template/storybook/index.ios.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/index.ios.js index efe59a0..b36980f 100644 --- a/packages/getstorybook/generators/REACT_NATIVE/template/storybook/index.ios.js +++ b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/index.ios.js @@ -2,9 +2,12 @@ import { AppRegistry } from 'react-native'; import { getStorybookUI, configure } from '@kadira/react-native-storybook'; // import stories -configure(() => { - require('./stories'); -}, module); +configure( + () => { + require('./stories'); + }, + module +); -const StorybookUI = getStorybookUI({port: 7007, host: 'localhost'}); +const StorybookUI = getStorybookUI({ port: 7007, host: 'localhost' }); AppRegistry.registerComponent('%APP_NAME%', () => StorybookUI); diff --git a/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/CenterView/style.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/CenterView/style.js index ff347fd..f34efdc 100644 --- a/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/CenterView/style.js +++ b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/CenterView/style.js @@ -3,6 +3,6 @@ export default { flex: 1, justifyContent: 'center', alignItems: 'center', - backgroundColor: '#F5FCFF', - }, + backgroundColor: '#F5FCFF' + } }; diff --git a/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/Welcome/index.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/Welcome/index.js index 1d5b561..8c9e331 100644 --- a/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/Welcome/index.js +++ b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/Welcome/index.js @@ -6,30 +6,34 @@ export default class Welcome extends React.Component { wrapper: { flex: 1, padding: 24, - justifyContent: 'center', + justifyContent: 'center' }, header: { fontSize: 18, - marginBottom: 18, + marginBottom: 18 }, content: { fontSize: 12, marginBottom: 10, - lineHeight: 18, - }, - } + lineHeight: 18 + } + }; showApp(e) { e.preventDefault(); - if(this.props.showApp) this.props.showApp(); + if (this.props.showApp) this.props.showApp(); } render() { return ( Welcome to React Native Storybook - This is a UI Component development environment for your React Native app. Here you can display and interact with your UI components as stories. A story is a single state of one or more UI components. You can have as many stories as you want. In other words a story is like a visual test case. - We have added some stories inside the "storybook/stories" directory for examples. Try editing the "storybook/stories/Welcome.js" file to edit this message. + + This is a UI Component development environment for your React Native app. Here you can display and interact with your UI components as stories. A story is a single state of one or more UI components. You can have as many stories as you want. In other words a story is like a visual test case. + + + We have added some stories inside the "storybook/stories" directory for examples. Try editing the "storybook/stories/Welcome.js" file to edit this message. + ); } diff --git a/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/index.js b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/index.js index 7f7d5f4..c7da190 100644 --- a/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/index.js +++ b/packages/getstorybook/generators/REACT_NATIVE/template/storybook/stories/index.js @@ -6,15 +6,10 @@ import Button from './Button'; import CenterView from './CenterView'; import Welcome from './Welcome'; -storiesOf('Welcome', module) - .add('to Storybook', () => ( - - )); +storiesOf('Welcome', module).add('to Storybook', () => ); storiesOf('Button', module) - .addDecorator(getStory => ( - {getStory()} - )) + .addDecorator(getStory => {getStory()}) .add('with text', () => ( ); Button.propTypes = { children: React.PropTypes.string.isRequired, - onClick: React.PropTypes.func, + onClick: React.PropTypes.func }; export default Button; diff --git a/packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/Welcome.js b/packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/Welcome.js index 2170d7b..776d5c0 100644 --- a/packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/Welcome.js +++ b/packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/Welcome.js @@ -5,34 +5,34 @@ const styles = { margin: 15, maxWidth: 600, lineHeight: 1.4, - fontFamily: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', + fontFamily: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif' }, logo: { - width: 200, + width: 200 }, link: { color: '#1474f3', textDecoration: 'none', borderBottom: '1px solid #1474f3', - paddingBottom: 2, + paddingBottom: 2 }, code: { fontSize: 15, fontWeight: 600, - padding: "2px 5px", - border: "1px solid #eae9e9", + padding: '2px 5px', + border: '1px solid #eae9e9', borderRadius: 4, backgroundColor: '#f3f2f2', - color: '#3a3a3a', + color: '#3a3a3a' }, codeBlock: { backgroundColor: '#f3f2f2', padding: '1px 10px', - margin: '10px 0', + margin: '10px 0' } }; @@ -51,7 +51,7 @@ storiesOf('App', module) export default class Welcome extends React.Component { showApp(e) { e.preventDefault(); - if(this.props.showApp) this.props.showApp(); + if (this.props.showApp) this.props.showApp(); } render() { @@ -62,14 +62,25 @@ export default class Welcome extends React.Component { This is a UI component dev environment for your app.

- We've added some basic stories inside the src/stories directory. -
+ We've added some basic stories inside the + {' '} + src/stories + {' '} + directory. +
A story is a single state of one or more UI components. You can have as many stories as you want. -
+
(Basically a story is like a visual test case.)

- See these sample stories for a component called Button. + See these sample + {' '} + stories + {' '} + for a component called + {' '} + Button + .

Just like that, you can add your own components as stories. @@ -77,12 +88,22 @@ export default class Welcome extends React.Component { Here's how to add your App component as a story.

${codeBlock}`}} + dangerouslySetInnerHTML={{ __html: `
${codeBlock}
` }} />

Usually we create stories with smaller UI components in the app.
- Have a look at the Writing Stories section in our documentation. + Have a look at the + {' '} + + Writing Stories + + {' '} + section in our documentation.

); diff --git a/packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/index.js b/packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/index.js index cd66c18..ee57702 100644 --- a/packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/index.js +++ b/packages/getstorybook/generators/REACT_SCRIPTS/template/src/stories/index.js @@ -3,15 +3,8 @@ import { storiesOf, action, linkTo } from '@kadira/storybook'; import Button from './Button'; import Welcome from './Welcome'; -storiesOf('Welcome', module) - .add('to Storybook', () => ( - - )); +storiesOf('Welcome', module).add('to Storybook', () => ); storiesOf('Button', module) - .add('with text', () => ( - - )) - .add('with some emoji', () => ( - - )); + .add('with text', () => ) + .add('with some emoji', () => ); diff --git a/packages/getstorybook/generators/WEBPACK_REACT/index.js b/packages/getstorybook/generators/WEBPACK_REACT/index.js index 85ef839..c20fac0 100644 --- a/packages/getstorybook/generators/WEBPACK_REACT/index.js +++ b/packages/getstorybook/generators/WEBPACK_REACT/index.js @@ -1,10 +1,10 @@ -var mergeDirs = require('merge-dirs').default; -var helpers = require('../../lib/helpers'); -var path = require('path'); +const mergeDirs = require('merge-dirs').default; +const helpers = require('../../lib/helpers'); +const path = require('path'); mergeDirs(path.resolve(__dirname, 'template/'), '.', 'overwrite'); -var packageJson = helpers.getPackageJson(); +const packageJson = helpers.getPackageJson(); // TODO: Get the latest version of storybook here. packageJson.devDependencies = packageJson.devDependencies || {}; diff --git a/packages/getstorybook/generators/WEBPACK_REACT/template/stories/Button.js b/packages/getstorybook/generators/WEBPACK_REACT/template/stories/Button.js index 5662b88..e6e3976 100644 --- a/packages/getstorybook/generators/WEBPACK_REACT/template/stories/Button.js +++ b/packages/getstorybook/generators/WEBPACK_REACT/template/stories/Button.js @@ -7,21 +7,18 @@ const buttonStyles = { cursor: 'pointer', fontSize: 15, padding: '3px 10px', - margin: 10, + margin: 10 }; const Button = ({ children, onClick }) => ( - ); Button.propTypes = { children: React.PropTypes.string.isRequired, - onClick: React.PropTypes.func, + onClick: React.PropTypes.func }; export default Button; diff --git a/packages/getstorybook/generators/WEBPACK_REACT/template/stories/Welcome.js b/packages/getstorybook/generators/WEBPACK_REACT/template/stories/Welcome.js index 2dcd174..c1a504e 100644 --- a/packages/getstorybook/generators/WEBPACK_REACT/template/stories/Welcome.js +++ b/packages/getstorybook/generators/WEBPACK_REACT/template/stories/Welcome.js @@ -5,39 +5,39 @@ const styles = { margin: 15, maxWidth: 600, lineHeight: 1.4, - fontFamily: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif', + fontFamily: '"Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif' }, logo: { - width: 200, + width: 200 }, link: { color: '#1474f3', textDecoration: 'none', borderBottom: '1px solid #1474f3', - paddingBottom: 2, + paddingBottom: 2 }, code: { fontSize: 15, fontWeight: 600, - padding: "2px 5px", - border: "1px solid #eae9e9", + padding: '2px 5px', + border: '1px solid #eae9e9', borderRadius: 4, backgroundColor: '#f3f2f2', - color: '#3a3a3a', + color: '#3a3a3a' }, note: { - opacity: 0.5, + opacity: 0.5 } }; export default class Welcome extends React.Component { showApp(e) { e.preventDefault(); - if(this.props.showApp) this.props.showApp(); + if (this.props.showApp) this.props.showApp(); } render() { @@ -48,14 +48,25 @@ export default class Welcome extends React.Component { This is a UI component dev environment for your app.

- We've added some basic stories inside the src/stories directory. -
+ We've added some basic stories inside the + {' '} + src/stories + {' '} + directory. +
A story is a single state of one or more UI components. You can have as many stories as you want. -
+
(Basically a story is like a visual test case.)

- See these sample stories for a component called Button. + See these sample + {' '} + stories + {' '} + for a component called + {' '} + Button + .

Just like that, you can add your own components as stories. @@ -67,13 +78,23 @@ export default class Welcome extends React.Component {

This is just one thing you can do with Storybook. -
- Have a look at the React Storybook repo for more information. +
+ Have a look at the + {' '} + + React Storybook + + {' '} + repo for more information.

NOTE: -
- Have a look at the .storybook/webpack.config.js to add webpack +
+ Have a look at the + {' '} + .storybook/webpack.config.js + {' '} + to add webpack loaders and plugins you are using in this project.

diff --git a/packages/getstorybook/generators/WEBPACK_REACT/template/stories/index.js b/packages/getstorybook/generators/WEBPACK_REACT/template/stories/index.js index cd66c18..ee57702 100644 --- a/packages/getstorybook/generators/WEBPACK_REACT/template/stories/index.js +++ b/packages/getstorybook/generators/WEBPACK_REACT/template/stories/index.js @@ -3,15 +3,8 @@ import { storiesOf, action, linkTo } from '@kadira/storybook'; import Button from './Button'; import Welcome from './Welcome'; -storiesOf('Welcome', module) - .add('to Storybook', () => ( - - )); +storiesOf('Welcome', module).add('to Storybook', () => ); storiesOf('Button', module) - .add('with text', () => ( - - )) - .add('with some emoji', () => ( - - )); + .add('with text', () => ) + .add('with some emoji', () => ); diff --git a/packages/getstorybook/lib/detect.js b/packages/getstorybook/lib/detect.js index 65eec8a..f69e1f9 100644 --- a/packages/getstorybook/lib/detect.js +++ b/packages/getstorybook/lib/detect.js @@ -1,10 +1,10 @@ -var types = require('./project_types.js'); -var helpers = require('./helpers'); -var path = require('path'); -var fs = require('fs'); +const types = require('./project_types.js'); +const helpers = require('./helpers'); +const path = require('path'); +const fs = require('fs'); module.exports = function detect(options) { - var packageJson = helpers.getPackageJson(); + const packageJson = helpers.getPackageJson(); if (!packageJson) { return types.UNDETECTED; } @@ -12,52 +12,33 @@ module.exports = function detect(options) { if ( !options.force && packageJson.devDependencies && - ( - packageJson.devDependencies['@kadira/storybook'] || - packageJson.devDependencies['@kadira/react-native-storybook'] - ) + (packageJson.devDependencies['@kadira/storybook'] || + packageJson.devDependencies['@kadira/react-native-storybook']) ) { return types.ALREADY_HAS_STORYBOOK; } - if( - fs.existsSync(path.resolve('.meteor')) - ) { + if (fs.existsSync(path.resolve('.meteor'))) { return types.METEOR; } - if ( - packageJson.devDependencies && - packageJson.devDependencies['react-scripts'] - ) { + if (packageJson.devDependencies && packageJson.devDependencies['react-scripts']) { return types.REACT_SCRIPTS; } - if ( - packageJson.devDependencies && - packageJson.devDependencies.webpack - ) { + if (packageJson.devDependencies && packageJson.devDependencies.webpack) { return types.WEBPACK_REACT; } - if ( - packageJson.peerDependencies && - packageJson.peerDependencies.react - ) { + if (packageJson.peerDependencies && packageJson.peerDependencies.react) { return types.REACT_PROJECT; } - if ( - packageJson.dependencies && - packageJson.dependencies['react-native'] - ) { + if (packageJson.dependencies && packageJson.dependencies['react-native']) { return types.REACT_NATIVE; } - if ( - packageJson.dependencies && - packageJson.dependencies.react - ) { + if (packageJson.dependencies && packageJson.dependencies.react) { return types.REACT; } diff --git a/packages/getstorybook/lib/has_yarn.js b/packages/getstorybook/lib/has_yarn.js index 7228451..0d30687 100644 --- a/packages/getstorybook/lib/has_yarn.js +++ b/packages/getstorybook/lib/has_yarn.js @@ -1,6 +1,6 @@ -var spawnSync = require('spawn-sync'); +const spawnSync = require('spawn-sync'); module.exports = function hasYarn() { - var result = spawnSync('yarn', ['--version'], { silent: true }); + const result = spawnSync('yarn', ['--version'], { silent: true }); return result.status === 0; -} +}; diff --git a/packages/getstorybook/lib/helpers.js b/packages/getstorybook/lib/helpers.js index 235de7f..38a4f40 100644 --- a/packages/getstorybook/lib/helpers.js +++ b/packages/getstorybook/lib/helpers.js @@ -1,65 +1,55 @@ -var path = require('path'); -var fs = require('fs'); -var chalk = require('chalk'); -var logger = console; -var spawnSync = require('spawn-sync'); +const path = require('path'); +const fs = require('fs'); +const chalk = require('chalk'); +const logger = console; +const spawnSync = require('spawn-sync'); exports.getPackageJson = function getPackageJson() { - var packageJsonPath = path.resolve('package.json'); + const packageJsonPath = path.resolve('package.json'); if (!fs.existsSync(packageJsonPath)) { return false; } - var jsonContent = fs.readFileSync(packageJsonPath, 'utf8'); + const jsonContent = fs.readFileSync(packageJsonPath, 'utf8'); return JSON.parse(jsonContent); }; exports.writePackageJson = function writePackageJson(packageJson) { - var content = JSON.stringify(packageJson, null, 2) + '\n'; - var packageJsonPath = path.resolve('package.json'); + const content = `${JSON.stringify(packageJson, null, 2)}\n`; + const packageJsonPath = path.resolve('package.json'); fs.writeFileSync(packageJsonPath, content, 'utf8'); }; exports.commandLog = function commandLog(message) { process.stdout.write(chalk.cyan(' • ') + message); - var done = function (errorMessage, errorInfo) { + const done = function(errorMessage, errorInfo) { if (errorMessage) { - process.stdout.write('. ' + chalk.red('✖') + '\n'); - logger.error('\n ' + chalk.red(errorMessage)); + process.stdout.write(`. ${chalk.red('✖')}\n`); + logger.error(`\n ${chalk.red(errorMessage)}`); if (!errorInfo) return; - var newErrorInfo = errorInfo - .split('\n') - .map(function (line) { - return ' ' + chalk.dim(line); - }) - .join('\n'); - logger.error(newErrorInfo + '\n'); + const newErrorInfo = errorInfo.split('\n').map(line => ` ${chalk.dim(line)}`).join('\n'); + logger.error(`${newErrorInfo}\n`); return; } - process.stdout.write('. ' + chalk.green('✓') + '\n'); + process.stdout.write(`. ${chalk.green('✓')}\n`); }; return done; }; -exports.paddedLog = function (message) { - var newMessage = message - .split('\n') - .map(function (line) { - return ' ' + line; - }) - .join('\n'); +exports.paddedLog = function(message) { + const newMessage = message.split('\n').map(line => ` ${line}`).join('\n'); logger.log(newMessage); }; exports.getChars = function getChars(char, amount) { - var line = ''; - for (var lc = 0; lc < amount; lc++) { + let line = ''; + for (let lc = 0; lc < amount; lc++) { line += char; } @@ -67,18 +57,17 @@ exports.getChars = function getChars(char, amount) { }; exports.codeLog = function codeLog(codeLines, leftPadAmount) { - var maxLength = 0; - var newLines = codeLines - .map(function (line) { - maxLength = (line.length > maxLength) ? line.length : maxLength; - return line; - }); - - var finalResult = newLines - .map(function (line) { - var rightPadAmount = maxLength - line.length; - var newLine = line + exports.getChars(' ', rightPadAmount); - newLine = exports.getChars(' ', leftPadAmount || 2) + chalk.inverse(' ' + newLine + ' '); + let maxLength = 0; + const newLines = codeLines.map(line => { + maxLength = line.length > maxLength ? line.length : maxLength; + return line; + }); + + const finalResult = newLines + .map(line => { + const rightPadAmount = maxLength - line.length; + let newLine = line + exports.getChars(' ', rightPadAmount); + newLine = exports.getChars(' ', leftPadAmount || 2) + chalk.inverse(` ${newLine} `); return newLine; }) .join('\n'); @@ -86,12 +75,12 @@ exports.codeLog = function codeLog(codeLines, leftPadAmount) { logger.log(finalResult); }; -exports.installDeps = function (options) { - var done = exports.commandLog('Preparing to install dependencies'); +exports.installDeps = function(options) { + let done = exports.commandLog('Preparing to install dependencies'); done(); console.log(); - var result; + let result; if (options.useYarn) { result = spawnSync('yarn', { stdio: 'inherit' }); } else { From 3dbf9e5629083d85b957e63f99ff03ca7d99627b Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 5 Apr 2017 00:26:40 +0200 Subject: [PATCH 81/81] CHANGE travis to test on latest node --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 96fafb2..e906c10 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ cache: notifications: email: false node_js: - - "5" + - "node" before_install: ./scripts/travis/before_install.sh after_success: ./scripts/travis/after_success.sh script: npm run lint && npm run test