webpack-cli
Advanced tools
Comparing version
389
bin/cli.js
#!/usr/bin/env node | ||
/* | ||
MIT License http://www.opensource.org/licenses/mit-license.php | ||
Author Tobias Koppers @sokra | ||
*/ | ||
'use strict'; | ||
require('v8-compile-cache'); | ||
const importLocal = require('import-local'); | ||
const runCLI = require('../lib/bootstrap'); | ||
const { yellow } = require('colorette'); | ||
const { error, success } = require('../lib/utils/logger'); | ||
const { packageExists } = require('../lib/utils/package-exists'); | ||
const { promptInstallation } = require('../lib/utils/prompt-installation'); | ||
const { NON_COMPILATION_ARGS } = require("./utils/constants"); | ||
// Prefer the local installation of webpack-cli | ||
if (importLocal(__filename)) { | ||
return; | ||
} | ||
process.title = 'webpack'; | ||
(function() { | ||
// wrap in IIFE to be able to use return | ||
const importLocal = require("import-local"); | ||
// Prefer the local installation of webpack-cli | ||
if (importLocal(__filename)) { | ||
return; | ||
} | ||
require("v8-compile-cache"); | ||
const ErrorHelpers = require("./utils/errorHelpers"); | ||
const NON_COMPILATION_CMD = process.argv.find(arg => { | ||
if (arg === "serve") { | ||
global.process.argv = global.process.argv.filter(a => a !== "serve"); | ||
process.argv = global.process.argv; | ||
} | ||
return NON_COMPILATION_ARGS.find(a => a === arg); | ||
}); | ||
if (NON_COMPILATION_CMD) { | ||
return require("./utils/prompt-command")(NON_COMPILATION_CMD, ...process.argv); | ||
} | ||
const yargs = require("yargs").usage(`webpack-cli ${require("../package.json").version} | ||
Usage: webpack-cli [options] | ||
webpack-cli [options] --entry <entry> --output <output> | ||
webpack-cli [options] <entries...> --output <output> | ||
webpack-cli <command> [options] | ||
For more information, see https://webpack.js.org/api/cli/.`); | ||
require("./config/config-yargs")(yargs); | ||
// yargs will terminate the process early when the user uses help or version. | ||
// This causes large help outputs to be cut short (https://github.com/nodejs/node/wiki/API-changes-between-v0.10-and-v4#process). | ||
// To prevent this we use the yargs.parse API and exit the process normally | ||
yargs.parse(process.argv.slice(2), (err, argv, output) => { | ||
Error.stackTraceLimit = 30; | ||
// arguments validation failed | ||
if (err && output) { | ||
console.error(output); | ||
process.exitCode = 1; | ||
return; | ||
} | ||
// help or version info | ||
if (output) { | ||
console.log(output); | ||
return; | ||
} | ||
if (argv.verbose) { | ||
argv["display"] = "verbose"; | ||
} | ||
let options; | ||
try { | ||
options = require("./utils/convert-argv")(argv); | ||
} catch (err) { | ||
if (err.code === "MODULE_NOT_FOUND") { | ||
const moduleName = err.message.split("'")[1]; | ||
let instructions = ""; | ||
let errorMessage = ""; | ||
if (moduleName === "webpack") { | ||
errorMessage = `\n${moduleName} not installed`; | ||
instructions = `Install webpack to start bundling: \u001b[32m\n $ npm install --save-dev ${moduleName}\n`; | ||
if (process.env.npm_execpath !== undefined && process.env.npm_execpath.includes("yarn")) { | ||
instructions = `Install webpack to start bundling: \u001b[32m\n $ yarn add ${moduleName} --dev\n`; | ||
} | ||
Error.stackTraceLimit = 1; | ||
console.error(`${errorMessage}\n\n${instructions}`); | ||
process.exitCode = 1; | ||
return; | ||
} | ||
} | ||
if (err.name !== "ValidationError") { | ||
throw err; | ||
} | ||
const stack = ErrorHelpers.cleanUpWebpackOptions(err.stack, err.message); | ||
const message = err.message + "\n" + stack; | ||
if (argv.color) { | ||
console.error(`\u001b[1m\u001b[31m${message}\u001b[39m\u001b[22m`); | ||
} else { | ||
console.error(message); | ||
} | ||
process.exitCode = 1; | ||
return; | ||
} | ||
/** | ||
* When --silent flag is present, an object with a no-op write method is | ||
* used in place of process.stout | ||
*/ | ||
const stdout = argv.silent ? { write: () => {} } : process.stdout; | ||
function ifArg(name, fn, init) { | ||
if (Array.isArray(argv[name])) { | ||
if (init) init(); | ||
argv[name].forEach(fn); | ||
} else if (typeof argv[name] !== "undefined") { | ||
if (init) init(); | ||
fn(argv[name], -1); | ||
} | ||
} | ||
function processOptions(options) { | ||
// process Promise | ||
if (typeof options.then === "function") { | ||
options.then(processOptions).catch(function(err) { | ||
console.error(err.stack || err); | ||
// eslint-disable-next-line no-process-exit | ||
process.exit(1); | ||
}); | ||
return; | ||
} | ||
const firstOptions = [].concat(options)[0]; | ||
const statsPresetToOptions = require("webpack").Stats.presetToOptions; | ||
let outputOptions = options.stats; | ||
if (typeof outputOptions === "boolean" || typeof outputOptions === "string") { | ||
outputOptions = statsPresetToOptions(outputOptions); | ||
} else if (!outputOptions) { | ||
outputOptions = {}; | ||
} | ||
ifArg("display", function(preset) { | ||
outputOptions = statsPresetToOptions(preset); | ||
}); | ||
outputOptions = Object.create(outputOptions); | ||
if (Array.isArray(options) && !outputOptions.children) { | ||
outputOptions.children = options.map(o => o.stats); | ||
} | ||
if (typeof outputOptions.context === "undefined") outputOptions.context = firstOptions.context; | ||
ifArg("env", function(value) { | ||
if (outputOptions.env) { | ||
outputOptions._env = value; | ||
} | ||
}); | ||
ifArg("json", function(bool) { | ||
if (bool) { | ||
outputOptions.json = bool; | ||
outputOptions.modules = bool; | ||
} | ||
}); | ||
if (typeof outputOptions.colors === "undefined") outputOptions.colors = require("supports-color").stdout; | ||
ifArg("sort-modules-by", function(value) { | ||
outputOptions.modulesSort = value; | ||
}); | ||
ifArg("sort-chunks-by", function(value) { | ||
outputOptions.chunksSort = value; | ||
}); | ||
ifArg("sort-assets-by", function(value) { | ||
outputOptions.assetsSort = value; | ||
}); | ||
ifArg("display-exclude", function(value) { | ||
outputOptions.exclude = value; | ||
}); | ||
if (!outputOptions.json) { | ||
if (typeof outputOptions.cached === "undefined") outputOptions.cached = false; | ||
if (typeof outputOptions.cachedAssets === "undefined") outputOptions.cachedAssets = false; | ||
ifArg("display-chunks", function(bool) { | ||
if (bool) { | ||
outputOptions.modules = false; | ||
outputOptions.chunks = true; | ||
outputOptions.chunkModules = true; | ||
} | ||
}); | ||
ifArg("display-entrypoints", function(bool) { | ||
outputOptions.entrypoints = bool; | ||
}); | ||
ifArg("display-reasons", function(bool) { | ||
if (bool) outputOptions.reasons = true; | ||
}); | ||
ifArg("display-depth", function(bool) { | ||
if (bool) outputOptions.depth = true; | ||
}); | ||
ifArg("display-used-exports", function(bool) { | ||
if (bool) outputOptions.usedExports = true; | ||
}); | ||
ifArg("display-provided-exports", function(bool) { | ||
if (bool) outputOptions.providedExports = true; | ||
}); | ||
ifArg("display-optimization-bailout", function(bool) { | ||
if (bool) outputOptions.optimizationBailout = bool; | ||
}); | ||
ifArg("display-error-details", function(bool) { | ||
if (bool) outputOptions.errorDetails = true; | ||
}); | ||
ifArg("display-origins", function(bool) { | ||
if (bool) outputOptions.chunkOrigins = true; | ||
}); | ||
ifArg("display-max-modules", function(value) { | ||
outputOptions.maxModules = +value; | ||
}); | ||
ifArg("display-cached", function(bool) { | ||
if (bool) outputOptions.cached = true; | ||
}); | ||
ifArg("display-cached-assets", function(bool) { | ||
if (bool) outputOptions.cachedAssets = true; | ||
}); | ||
if (!outputOptions.exclude) outputOptions.exclude = ["node_modules", "bower_components", "components"]; | ||
if (argv["display-modules"]) { | ||
outputOptions.maxModules = Infinity; | ||
outputOptions.exclude = undefined; | ||
outputOptions.modules = true; | ||
} | ||
} | ||
ifArg("hide-modules", function(bool) { | ||
if (bool) { | ||
outputOptions.modules = false; | ||
outputOptions.chunkModules = false; | ||
} | ||
}); | ||
ifArg("info-verbosity", function(value) { | ||
outputOptions.infoVerbosity = value; | ||
}); | ||
ifArg("build-delimiter", function(value) { | ||
outputOptions.buildDelimiter = value; | ||
}); | ||
const webpack = require("webpack"); | ||
let lastHash = null; | ||
let compiler; | ||
try { | ||
compiler = webpack(options); | ||
} catch (err) { | ||
if (err.name === "WebpackOptionsValidationError") { | ||
if (argv.color) console.error(`\u001b[1m\u001b[31m${err.message}\u001b[39m\u001b[22m`); | ||
else console.error(err.message); | ||
// eslint-disable-next-line no-process-exit | ||
process.exit(1); | ||
} | ||
throw err; | ||
} | ||
if (argv.progress) { | ||
const ProgressPlugin = require("webpack").ProgressPlugin; | ||
new ProgressPlugin({ | ||
profile: argv.profile | ||
}).apply(compiler); | ||
} | ||
if (outputOptions.infoVerbosity === "verbose") { | ||
if (argv.w) { | ||
compiler.hooks.watchRun.tap("WebpackInfo", compilation => { | ||
const compilationName = compilation.name ? compilation.name : ""; | ||
console.error("\nCompilation " + compilationName + " starting…\n"); | ||
}); | ||
} else { | ||
compiler.hooks.beforeRun.tap("WebpackInfo", compilation => { | ||
const compilationName = compilation.name ? compilation.name : ""; | ||
console.error("\nCompilation " + compilationName + " starting…\n"); | ||
}); | ||
} | ||
compiler.hooks.done.tap("WebpackInfo", compilation => { | ||
const compilationName = compilation.name ? compilation.name : ""; | ||
console.error("\nCompilation " + compilationName + " finished\n"); | ||
}); | ||
} | ||
function compilerCallback(err, stats) { | ||
if (!options.watch || err) { | ||
// Do not keep cache anymore | ||
compiler.purgeInputFileSystem(); | ||
} | ||
if (err) { | ||
lastHash = null; | ||
console.error(err.stack || err); | ||
if (err.details) console.error(err.details); | ||
process.exitCode = 1; | ||
return; | ||
} | ||
if (outputOptions.json) { | ||
stdout.write(JSON.stringify(stats.toJson(outputOptions), null, 2) + "\n"); | ||
} else if (stats.hash !== lastHash) { | ||
lastHash = stats.hash; | ||
if (stats.compilation && stats.compilation.errors.length !== 0) { | ||
const errors = stats.compilation.errors; | ||
if (errors[0].name === "EntryModuleNotFoundError") { | ||
console.error("\n\u001b[1m\u001b[31mInsufficient number of arguments or no entry found."); | ||
console.error( | ||
"\u001b[1m\u001b[31mAlternatively, run 'webpack(-cli) --help' for usage info.\u001b[39m\u001b[22m\n" | ||
); | ||
} | ||
} | ||
const statsString = stats.toString(outputOptions); | ||
const delimiter = outputOptions.buildDelimiter ? `${outputOptions.buildDelimiter}\n` : ""; | ||
if (statsString) stdout.write(`${statsString}\n${delimiter}`); | ||
} | ||
if (!options.watch && stats.hasErrors()) { | ||
process.exitCode = 2; | ||
} | ||
} | ||
if (firstOptions.watch || options.watch) { | ||
const watchOptions = | ||
firstOptions.watchOptions || options.watchOptions || firstOptions.watch || options.watch || {}; | ||
if (watchOptions.stdin) { | ||
process.stdin.on("end", function(_) { | ||
process.exit(); // eslint-disable-line | ||
}); | ||
process.stdin.resume(); | ||
} | ||
compiler.watch(watchOptions, compilerCallback); | ||
if (outputOptions.infoVerbosity !== "none") console.error("\nwebpack is watching the files…\n"); | ||
} else { | ||
compiler.run((err, stats) => { | ||
if (compiler.close) { | ||
compiler.close(err2 => { | ||
compilerCallback(err || err2, stats); | ||
}); | ||
} else { | ||
compilerCallback(err, stats); | ||
} | ||
}); | ||
} | ||
} | ||
processOptions(options); | ||
}); | ||
})(); | ||
if (packageExists('webpack')) { | ||
const [, , ...rawArgs] = process.argv; | ||
runCLI(rawArgs); | ||
} else { | ||
promptInstallation('webpack', () => { | ||
error(`It looks like ${yellow('webpack')} is not installed.`); | ||
}) | ||
.then(() => success(`${yellow('webpack')} was installed sucessfully.`)) | ||
.catch(() => { | ||
process.exitCode = 2; | ||
error(`Action Interrupted, Please try once again or install ${yellow('webpack')} manually.`); | ||
}); | ||
return; | ||
} |
175
package.json
{ | ||
"name": "webpack-cli", | ||
"version": "3.3.12", | ||
"version": "4.0.0", | ||
"description": "CLI for webpack & friends", | ||
@@ -13,5 +13,5 @@ "license": "MIT", | ||
}, | ||
"main": "./bin/cli.js", | ||
"main": "./lib/webpack-cli.js", | ||
"engines": { | ||
"node": ">=6.11.5" | ||
"node": ">=10.13.0" | ||
}, | ||
@@ -28,149 +28,38 @@ "keywords": [ | ||
"bin", | ||
"scripts" | ||
"lib" | ||
], | ||
"scripts": { | ||
"bootstrap": "npm run clean:all && npm install && lerna bootstrap", | ||
"build": "tsc", | ||
"changelog": "conventional-changelog --config ./build/changelog-generator/index.js --infile CHANGELOG.md --same-file", | ||
"clean:all": "rimraf node_modules packages/*/{node_modules}", | ||
"format": "npm run format:js && npm run format:ts", | ||
"format:js": "prettier-eslint ./bin/*.js ./bin/**/*.js ./test/**/*.js ./packages/**/**/*.js ./packages/**/*.js --write", | ||
"format:ts": "prettier-eslint ./packages/**/**/*.ts ./packages/**/*.ts ./packages/**/**/**/*.ts --write", | ||
"lint": "eslint \"./bin/*.js\" \"./bin/**/*.js\" \"./test/**/*.js\" \"packages/**/!(node_modules)/*.ts\" \"packages/**/!(node_modules)/**/*.ts\"", | ||
"pretest": "npm run build && npm run lint", | ||
"reportCoverage": "nyc report --reporter=json && codecov -f coverage/coverage-final.json --disable=gcov", | ||
"test": "nyc jest --maxWorkers=4 --reporters=default --reporters=jest-junit", | ||
"test:cli": "nyc jest test/ --maxWorkers=4 --reporters=default --reporters=jest-junit", | ||
"test:packages": "nyc jest packages/ --maxWorkers=4 --reporters=default --reporters=jest-junit", | ||
"test:ci": "nyc jest --maxWorkers=$(nproc) --reporters=default --reporters=jest-junit", | ||
"travis:integration": "npm run build && npm run test && npm run reportCoverage", | ||
"travis:lint": "npm run build && npm run lint", | ||
"watch": "npm run build && tsc -w", | ||
"publish:monorepo": "npm run format && npm run test && lerna publish -m \"chore: monorepo version update\"" | ||
"dependencies": { | ||
"@webpack-cli/info": "^1.0.1", | ||
"@webpack-cli/init": "^1.0.1", | ||
"@webpack-cli/serve": "^1.0.1", | ||
"ansi-escapes": "^4.3.1", | ||
"colorette": "^1.2.1", | ||
"command-line-usage": "^6.1.0", | ||
"commander": "^6.0.0", | ||
"enquirer": "^2.3.4", | ||
"execa": "^4.0.0", | ||
"import-local": "^3.0.2", | ||
"interpret": "^2.0.0", | ||
"rechoir": "^0.7.0", | ||
"v8-compile-cache": "^2.1.0", | ||
"webpack-merge": "^4.2.2" | ||
}, | ||
"husky": { | ||
"hooks": { | ||
"pre-commit": "lint-staged", | ||
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS" | ||
} | ||
"peerDependencies": { | ||
"webpack": "4.x.x || 5.x.x" | ||
}, | ||
"lint-staged": { | ||
"*.md": [ | ||
"prettier --parser markdown --write", | ||
"git add" | ||
], | ||
"{packages,bin}/**/!(__testfixtures__)/**.js": [ | ||
"eslint --fix", | ||
"git add" | ||
], | ||
"*.ts": [ | ||
"npm run format:ts", | ||
"git add" | ||
], | ||
"*.js": [ | ||
"npm run format:js", | ||
"git add" | ||
] | ||
}, | ||
"jest": { | ||
"testPathIgnorePatterns": [ | ||
"/node_modules/" | ||
], | ||
"testEnvironment": "node", | ||
"collectCoverage": true, | ||
"coverageReporters": [ | ||
"json", | ||
"html", | ||
"cobertura" | ||
], | ||
"transform": { | ||
"^.+\\.(ts)?$": "ts-jest" | ||
"peerDependenciesMeta": { | ||
"@webpack-cli/generate-loader": { | ||
"optional": true | ||
}, | ||
"testRegex": [ | ||
"/__tests__/.*\\.(test.js|test.ts)$", | ||
"/test/.*\\.(test.js|test.ts)$" | ||
], | ||
"moduleFileExtensions": [ | ||
"ts", | ||
"js", | ||
"json" | ||
] | ||
}, | ||
"nyc": { | ||
"include": [ | ||
"bin/**.js", | ||
"packages/**/*.js" | ||
], | ||
"reporter": [ | ||
"lcov" | ||
], | ||
"all": true | ||
}, | ||
"config": { | ||
"commitizen": { | ||
"path": "./node_modules/cz-customizable" | ||
"@webpack-cli/generate-plugin": { | ||
"optional": true | ||
}, | ||
"cz-customizable": { | ||
"config": "./.cz-config.js" | ||
"@webpack-cli/migrate": { | ||
"optional": true | ||
}, | ||
"webpack-bundle-analyzer": { | ||
"optional": true | ||
} | ||
}, | ||
"dependencies": { | ||
"chalk": "^2.4.2", | ||
"cross-spawn": "^6.0.5", | ||
"enhanced-resolve": "^4.1.1", | ||
"findup-sync": "^3.0.0", | ||
"global-modules": "^2.0.0", | ||
"import-local": "^2.0.0", | ||
"interpret": "^1.4.0", | ||
"loader-utils": "^1.4.0", | ||
"supports-color": "^6.1.0", | ||
"v8-compile-cache": "^2.1.1", | ||
"yargs": "^13.3.2" | ||
}, | ||
"peerDependencies": { | ||
"webpack": "4.x.x" | ||
}, | ||
"devDependencies": { | ||
"@babel/preset-env": "^7.8.3", | ||
"@babel/register": "7.8.3", | ||
"@commitlint/cli": "8.1.0", | ||
"@commitlint/config-lerna-scopes": "8.0.0", | ||
"@commitlint/travis-cli": "8.0.0", | ||
"@strictsoftware/typedoc-plugin-monorepo": "0.2.1", | ||
"@types/jest": "24.9.1", | ||
"@types/node": "12.0.8", | ||
"@typescript-eslint/eslint-plugin": "1.10.2", | ||
"@typescript-eslint/parser": "1.10.2", | ||
"babel-preset-env": "^1.7.0", | ||
"babel-preset-jest": "24.9.0", | ||
"codecov": "3.5.0", | ||
"commitizen": "4.0.3", | ||
"commitlint": "^8.1.0", | ||
"commitlint-config-cz": "0.12.0", | ||
"conventional-changelog-cli": "2.0.21", | ||
"cz-customizable": "6.2.0", | ||
"eslint": "5.16.0", | ||
"eslint-config-prettier": "5.0.0", | ||
"eslint-plugin-node": "9.1.0", | ||
"eslint-plugin-prettier": "3.1.0", | ||
"esm": "3.2.25", | ||
"execa": "1.0.0", | ||
"husky": "2.4.1", | ||
"jest": "24.9.0", | ||
"jest-cli": "24.9.0", | ||
"jest-junit": "6.4.0", | ||
"lerna": "3.15.0", | ||
"lint-staged": "8.2.1", | ||
"nyc": "14.1.1", | ||
"prettier": "1.18.2", | ||
"prettier-eslint-cli": "5.0.0", | ||
"readable-stream": "3.4.0", | ||
"rimraf": "2.6.3", | ||
"schema-utils": "1.0.0", | ||
"ts-jest": "24.0.2", | ||
"ts-node": "8.3.0", | ||
"typescript": "3.5.2", | ||
"webpack": "4.x.x", | ||
"webpack-dev-server": "3.7.2" | ||
} | ||
"gitHead": "fb50f766851f500ca12867a2aa9de81fa6e368f9" | ||
} |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Debug access
Supply chain riskUses debug, reflection and dynamic code execution features.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
Debug access
Supply chain riskUses debug, reflection and dynamic code execution features.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
0
-100%43
186.67%654
478.76%11
-31.25%0
-100%199125
-11.09%15
25%2104
-41.39%+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
Updated
Updated
Updated