├── .gitignore ├── .jshintrc ├── test └── .eslintrc ├── generate-key.sh ├── .travis.yml ├── lib ├── screens │ ├── demo.js │ ├── post-signup.js │ ├── account-review.js │ ├── server-select.js │ ├── welcome.js │ └── account-info.js ├── ssh │ ├── auth-handler.js │ ├── connection-handler.js │ └── session-handler.js └── screen-renderer.js ├── signup-ssh.service ├── index.js ├── package.json ├── LICENSE.md ├── Makefile ├── Dockerfile ├── README.md └── npm-shrinkwrap.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | keys 3 | .tern-port 4 | *.log 5 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "esversion": 6, 3 | "expr": true 4 | } 5 | -------------------------------------------------------------------------------- /test/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "mocha": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /generate-key.sh: -------------------------------------------------------------------------------- 1 | mkdir -p keys 2 | ssh-keygen -t dsa -f ./keys/host_dsa.key 3 | ssh-keygen -t rsa -f ./keys/host_rsa.key 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "6.2.1" 4 | 5 | script: "make test-travis" 6 | after_script: "npm install coveralls@2.11.1 && cat ./coverage/lcov.info | coveralls" 7 | -------------------------------------------------------------------------------- /lib/screens/demo.js: -------------------------------------------------------------------------------- 1 | const blessed = require('blessed'), 2 | contrib = require('blessed-contrib'); 3 | 4 | module.exports = (screen, stream, user) => { 5 | var grid = new contrib.grid({rows: 12, cols: 12, screen: screen}); 6 | var map = grid.set(0, 0, 4, 4, contrib.map, {label: 'World Map'}); 7 | var box = grid.set(4, 4, 4, 4, blessed.box, {content: 'My Box'}); 8 | }; 9 | -------------------------------------------------------------------------------- /signup-ssh.service: -------------------------------------------------------------------------------- 1 | Description=#! SSH Signup Service 2 | After=docker.service 3 | Requires=docker.service 4 | 5 | [Service] 6 | Restart=always 7 | ExecStartPre=-/usr/bin/docker pull hashbang/signup-ssh 8 | ExecStartPre=-/usr/bin/docker kill signup-ssh 9 | ExecStartPre=-/usr/bin/docker rm signup-ssh 10 | ExecStart=/usr/bin/docker run \ 11 | -p 22:4444 \ 12 | --name="signup-ssh" 13 | hashbang/signup-ssh 14 | ExecStop=/usr/bin/docker stop signup-ssh 15 | 16 | [Install] 17 | WantedBy=multi-user.target 18 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const Server = require('ssh2').Server, 2 | connectionHandler = require('./lib/ssh/connection-handler'); 3 | 4 | const config = { hostKeys: [require('fs').readFileSync('keys/host_rsa.key')] }; 5 | 6 | let ssh = new Server(config); 7 | let port = (typeof process.env.PORT === 'undefined') ? 4444 : process.env.PORT; 8 | console.log(process.env.PORT) 9 | 10 | ssh.on('connection', connectionHandler); 11 | 12 | ssh.listen(port, function(){ 13 | console.log('Listening on port ' + this.address().port); 14 | }); 15 | -------------------------------------------------------------------------------- /lib/screens/post-signup.js: -------------------------------------------------------------------------------- 1 | const blessed = require('blessed'), 2 | contrib = require('blessed-contrib'), 3 | renderScreen = require('../screen-renderer'), 4 | auto = true; 5 | 6 | module.exports = (screen, stream, user) => { 7 | var content = 'Post Signup Screen'; 8 | 9 | var contentArea = blessed.text({ 10 | top: auto, 11 | width: 'shrink', 12 | height: '80%', 13 | content: content, 14 | padding: 1, 15 | scrollable: true, 16 | keys: true, 17 | vi: true, 18 | alwaysScroll: true, 19 | scrollbar: { 20 | bg: 'blue', 21 | fg: 'red' 22 | } 23 | }); 24 | 25 | screen.append(contentArea); 26 | contentArea.focus(); 27 | }; 28 | -------------------------------------------------------------------------------- /lib/screens/account-review.js: -------------------------------------------------------------------------------- 1 | const blessed = require('blessed'), 2 | contrib = require('blessed-contrib'), 3 | renderScreen = require('../screen-renderer'), 4 | auto = true; 5 | 6 | module.exports = (screen, stream, user) => { 7 | var content = 'Account Review Screen'; 8 | 9 | var contentArea = blessed.text({ 10 | top: auto, 11 | width: 'shrink', 12 | height: '80%', 13 | content: content, 14 | padding: 1, 15 | scrollable: true, 16 | keys: true, 17 | vi: true, 18 | alwaysScroll: true, 19 | scrollbar: { 20 | bg: 'blue', 21 | fg: 'red' 22 | } 23 | }); 24 | 25 | screen.append(contentArea); 26 | contentArea.focus(); 27 | }; 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "signup-ssh", 3 | "version": "1.0.0", 4 | "description": "Over SSH onboarding", 5 | "main": "index.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/hashbang/signup-ssh.git" 9 | }, 10 | "author": "Aagat Adhikari ", 11 | "license": "MIT", 12 | "bugs": { 13 | "url": "https://github.com/hashbang/signup-ssh/issues" 14 | }, 15 | "homepage": "https://github.com/hashbang/signup-ssh#readme", 16 | "dependencies": { 17 | "blessed": "^0.1.81", 18 | "blessed-contrib": "^3.5.5", 19 | "ssh2": "^0.5.0" 20 | }, 21 | "scripts": { 22 | "start": "node $V8_OPTIONS index.js", 23 | "test": "make test" 24 | }, 25 | "devDependencies": { 26 | "eslint": "^2.12.0", 27 | "istanbul": "^0.4.3", 28 | "mocha": "^2.5.3" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Internet Systems Consortium license 2 | =================================== 3 | 4 | Copyright (c) 2016, Hashbang Inc. `` 5 | 6 | Permission to use, copy, modify, and/or distribute this software for any purpose 7 | with or without fee is hereby granted, provided that the above copyright notice 8 | and this permission notice appear in all copies. 9 | 10 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 11 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 12 | FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 13 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS 14 | OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 | TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 16 | THIS SOFTWARE. 17 | -------------------------------------------------------------------------------- /lib/screens/server-select.js: -------------------------------------------------------------------------------- 1 | const blessed = require('blessed'), 2 | contrib = require('blessed-contrib'), 3 | renderScreen = require('../screen-renderer'), 4 | auto = true; 5 | 6 | module.exports = (screen, stream, user) => { 7 | var content = 'Server Select Screen'; 8 | 9 | var contentArea = blessed.text({ 10 | top: auto, 11 | width: 'shrink', 12 | height: '100%-6', 13 | content: content, 14 | padding: 1, 15 | scrollable: true, 16 | keys: true, 17 | vi: true, 18 | alwaysScroll: true, 19 | scrollbar: { 20 | bg: 'blue', 21 | fg: 'red' 22 | } 23 | }); 24 | 25 | var map = contrib.map({ 26 | parent: contentArea, 27 | label: 'Choose your primary server' 28 | }); 29 | 30 | screen.append(contentArea); 31 | contentArea.focus(); 32 | }; 33 | -------------------------------------------------------------------------------- /lib/ssh/auth-handler.js: -------------------------------------------------------------------------------- 1 | function authHandler (ctx, user) { 2 | user.name = ctx.username; 3 | 4 | if (ctx.method === 'none') { 5 | console.log(user.clientInfo.ip + ' => Client connecting using authmethod: none. Rejecting.'); 6 | ctx.reject(); 7 | } 8 | 9 | if (ctx.method === 'password') { 10 | console.log(user.clientInfo.ip + ' => Client connecting using password'); 11 | ctx.reject(); 12 | } 13 | 14 | if (ctx.method === 'publickey') { 15 | console.log(user.clientInfo.ip + ' => Client connecting using pubkey'); 16 | user.keys.push(ctx.key.algo + ' ' + ctx.key.data.toString('base64')); 17 | ctx.reject(); 18 | } 19 | 20 | if (ctx.method === 'keyboard-interactive') { 21 | console.log(user.clientInfo.ip + ' => All methods exhausted, let them pass through'); 22 | ctx.accept(); 23 | } 24 | } 25 | 26 | module.exports = authHandler; 27 | -------------------------------------------------------------------------------- /lib/ssh/connection-handler.js: -------------------------------------------------------------------------------- 1 | const authHandler = require('./auth-handler'), 2 | sessionHandler = require('./session-handler'); 3 | 4 | function connectionHandler(client, clientInfo){ 5 | var user = {}, 6 | stream, 7 | screen; 8 | 9 | user.keys = []; 10 | user.clientInfo = clientInfo; 11 | user.name = ''; 12 | user.inputData = {}; 13 | 14 | client.on('authentication', (context) => { 15 | authHandler(context, user); 16 | }); 17 | 18 | client.on('ready', () => { 19 | client.once('session', (accept, reject) => { 20 | sessionHandler(accept, reject, user, stream, screen); 21 | }); 22 | }); 23 | 24 | client.on('end', () => { 25 | console.log(clientInfo.ip + " => Disconnected"); 26 | }); 27 | 28 | client.on('error', (err) => { 29 | // what's an error? 30 | }); 31 | 32 | } 33 | 34 | module.exports = connectionHandler; 35 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | test: lint server test-cov 2 | 3 | server: 4 | @ $(ENV_VARS) ./node_modules/.bin/mocha -A --recursive $(MOCHA_OPTS) 5 | 6 | lint: 7 | @ find . -name "*.js" \ 8 | -not -path "./node_modules/*" \ 9 | -not -path "./coverage/*" -print0 | \ 10 | xargs -0 ./node_modules/eslint/bin/eslint.js 11 | 12 | test-cov: 13 | @ $(ENV_VARS) node \ 14 | node_modules/.bin/istanbul cover \ 15 | ./node_modules/.bin/_mocha \ 16 | -- -A --recursive $(MOCHA_OPTS) 17 | 18 | open-cov: 19 | open coverage/lcov-report/index.html 20 | 21 | 22 | test-travis: lint 23 | @ $(ENV_VARS) \ 24 | node \ 25 | node_modules/.bin/istanbul cover \ 26 | ./node_modules/.bin/_mocha \ 27 | --report lcovonly \ 28 | -- \ 29 | --bail \ 30 | -A --recursive $(MOCHA_OPTS) 31 | 32 | @ node node_modules/.bin/istanbul check-coverage \ 33 | --statements 100 --functions 100 --branches 100 --lines 100 34 | 35 | .PHONY: test lint test-cov open-cov test-travis 36 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:6.2.1-slim 2 | 3 | # Install dependencies 4 | RUN apt-get update \ 5 | && apt-get install -qy git build-essential \ 6 | && rm -rf /var/lib/apt/lists/* 7 | 8 | # Setup User 9 | RUN useradd -g daemon -m -d /app app 10 | 11 | # cd /app 12 | WORKDIR /app 13 | 14 | # Setup port for container/app 15 | EXPOSE 22 16 | ENV PORT 22 17 | RUN setcap cap_net_bind_service=+ep /usr/local/bin/node 18 | 19 | # Ensure node modules are layer-cached until dependency files change 20 | ADD npm-shrinkwrap.json /tmp/npm-shrinkwrap.json 21 | ADD package.json /tmp/package.json 22 | RUN cd /tmp && \ 23 | npm install --no-optional 24 | 25 | # Copy app but replace node_modules with layer-cached version 26 | ADD . /app 27 | RUN rm -rf node_modules .tmp keys && \ 28 | mv /tmp/node_modules /app/ 29 | 30 | # Drop privileges 31 | USER app 32 | 33 | # Generate default keys for test/eval 34 | RUN bash generate-key.sh 35 | 36 | # Allow host keys to be overridden by volume 37 | VOLUME /app/keys 38 | 39 | # Default command to run on boot 40 | CMD ["start"] 41 | ENTRYPOINT ["npm"] 42 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # new.hashbang.sh 2 | 3 | Over-SSH onboarding for new #! users. 4 | 5 | ## Rationale 6 | 7 | - Using SSH makes it obvious nothing untowards is happening. 8 | - We can grab the pubkeys directly from the SSH client, unless `IdentitiesOnly` 9 | is set -- in which case, the user knows what they are doing. 10 | 11 | ## Design 12 | 13 | - [ ] Should use the API rather than LDAP directly, so that compromising 14 | the custom SSHd is not critical. 15 | - [ ] Should lookup the public keys against Github to see if they can be found. 16 | Use that to prefill the onboarding info (and hopefully make the user take 17 | note of that privacy issue). 18 | - [ ] Should check for common SSH security issues: 19 | - [ ] X11 forwarding 20 | - [ ] SSH agent forwarding 21 | - [ ] GPG agent forwarding 22 | - [ ] `UseRoaming` 23 | - [ ] weak SSH keys 24 | 25 | 26 | ## UX thoughts 27 | 28 | - Instead of a sequence of questions, this could be an actual curse-style 29 | form. Current version is implemented using [blessed] and [blessed-contrib] 30 | 31 | [blessed]: https://github.com/chjj/blessed 32 | [blessed-contrib]: https://github.com/yaronn/blessed-contrib 33 | -------------------------------------------------------------------------------- /lib/ssh/session-handler.js: -------------------------------------------------------------------------------- 1 | const blessed = require('blessed'), 2 | contrib = require('blessed-contrib'); 3 | 4 | const renderScreen = require('../screen-renderer'); 5 | 6 | function noop(v) {} 7 | 8 | function sessionHandler(accept, reject, user, stream, screen) { 9 | var session = accept(); 10 | 11 | session.once('pty', function(accept, reject, info){ 12 | rows = info.rows; 13 | cols = info.cols; 14 | term = info.term; 15 | accept && accept(); 16 | }); 17 | 18 | session.on('window-change', function(accept, reject, info) { 19 | rows = info.rows; 20 | cols = info.cols; 21 | if (stream) { 22 | stream.rows = rows; 23 | stream.columns = cols; 24 | stream.emit('resize'); 25 | } 26 | accept && accept(); 27 | }); 28 | 29 | session.once('shell', (accept, reject) => { 30 | // accept() returns a Channel for the interactive shell. 31 | stream = accept(); 32 | 33 | // https://github.com/mscdex/ssh2/#pseudo-tty-settings 34 | stream.rows = rows || 24; 35 | stream.columns = cols || 80; 36 | stream.isTTY = true; 37 | stream.setRawMode = noop; 38 | stream.on('error', noop); 39 | 40 | // Render welcome screen 41 | renderScreen(screen, stream, 'welcome', user); 42 | }); 43 | } 44 | 45 | module.exports = sessionHandler; 46 | -------------------------------------------------------------------------------- /lib/screens/welcome.js: -------------------------------------------------------------------------------- 1 | const blessed = require('blessed'), 2 | contrib = require('blessed-contrib'), 3 | renderScreen = require('../screen-renderer'), 4 | auto = true; 5 | 6 | module.exports = (screen, stream, user) => { 7 | 8 | 9 | screen.title = 'Welcome to #!'; 10 | var welcomeText = 'Welcome to #!. This network has three rules:\r\n\r\n1. When people need help, teach. Don\'t do it for them\r\n2. Don\'t use our resources for closed source projects\r\n3. Be excellent to each other\r\n \r\nWe are a diverse community of people who love teaching and learning.Putting a #! at the beginning of a \"script\" style program tells a computer that it needs to \"do something\" or \"execute\" this file. Likewise, we are a community of people that like to \"do stuff\".\r\n\r\nIf you like technology, and you want to learn to write your first program, learn to use Linux, or even take on interesting challenges with some of the best in the industry, you are in the right place.\r\n \r\nThe following will set you up with a \"shell\" account on one of our shared systems. From here you can run IRC chat clients to talk to us,\r\n access to personal file storage and web hosting, and a wide range of development tools. \r\n \r\nEverything should work perfectly, unless it doesn\'t\r\n \r\nPlease report any issues here: \r\n-> https:\/\/github.com\/hashbang\/hashbang.sh\/issues\/\r\n'; 11 | 12 | var contentArea = blessed.text({ 13 | top: auto, 14 | width: 'shrink', 15 | height: '80%', 16 | content: welcomeText, 17 | padding: 1, 18 | scrollable: true, 19 | keys: true, 20 | vi: true, 21 | alwaysScroll: true, 22 | scrollbar: { 23 | bg: 'blue', 24 | fg: 'red' 25 | } 26 | }); 27 | 28 | screen.append(contentArea); 29 | contentArea.focus(); 30 | }; 31 | -------------------------------------------------------------------------------- /lib/screen-renderer.js: -------------------------------------------------------------------------------- 1 | const blessed = require('blessed'), 2 | contrib = require('blessed-contrib'), 3 | auto = true; 4 | 5 | function renderScreen(screen, stream, screenName, user) { 6 | screen = new blessed.screen({ 7 | autoPadding: true, 8 | smartCSR: true, 9 | program: new blessed.program({ 10 | input: stream, 11 | output: stream 12 | }), 13 | dockBorders: true, 14 | terminal: term || 'ansi' 15 | }); 16 | 17 | // add common screen components 18 | var bottomBarMenu = blessed.listbar({ 19 | parent: screen, 20 | bottom: 0, 21 | height: auto ? 'shrink' : 3, 22 | width: '100%', 23 | mouse: true, 24 | keys: true, 25 | autoCommandKeys: true, 26 | vi: true, 27 | style: { 28 | bg: 'magenta', 29 | item: { 30 | bg: 'red', 31 | hover: { 32 | bg: 'blue' 33 | } 34 | }, 35 | selected: { 36 | bg: 'blue' 37 | } 38 | }, 39 | commands: { 40 | 'Welcome': function() { 41 | screen.destroy(); 42 | renderScreen(screen, stream, 'welcome', user); 43 | screen.render(); 44 | }, 45 | 'Account Info': function() { 46 | screen.destroy(); 47 | renderScreen(screen, stream, 'account-info', user); 48 | screen.render(); 49 | }, 50 | 'Select Server': function() { 51 | screen.destroy(); 52 | renderScreen(screen, stream, 'server-select', user); 53 | screen.render(); 54 | }, 55 | 'Confirm': function() { 56 | screen.destroy(); 57 | renderScreen(screen, stream, 'account-review', user); 58 | screen.render(); 59 | }, 60 | 'Guide': function() { 61 | screen.destroy(); 62 | renderScreen(screen, stream, 'post-signup', user); 63 | screen.render(); 64 | } 65 | } 66 | }); 67 | 68 | var topBar = blessed.box({ 69 | top: '0', 70 | width: '100%', 71 | height: 'shrink', 72 | valign: 'middle', 73 | content: '{bold} Welcome to #! {/bold} - Sign Up', 74 | tags: true, 75 | style: { 76 | fg: 'white', 77 | bg: 'magenta' 78 | } 79 | }); 80 | 81 | require('./screens/'+ screenName)(screen, stream, user); 82 | 83 | screen.key(['q', 'C-c'], (ch, key) => { 84 | screen.destroy(); 85 | stream.end(); 86 | }); 87 | 88 | screen.append(topBar); 89 | screen.render(); 90 | } 91 | 92 | module.exports = renderScreen; 93 | -------------------------------------------------------------------------------- /lib/screens/account-info.js: -------------------------------------------------------------------------------- 1 | const blessed = require('blessed'), 2 | contrib = require('blessed-contrib'), 3 | renderScreen = require('../screen-renderer'), 4 | auto = true; 5 | 6 | module.exports = (screen, stream, user) => { 7 | var contentArea = blessed.box({ 8 | top: auto, 9 | width: 'shrink', 10 | content: 'Welcome to #! account creation page.\nPress arrow keys to move up/down the fields. Press Return to change/insert text. Press Esc to exit the field. Press Ctrl+s to submit the form after you\'ve entered your details.', 11 | height: '100%-4', 12 | padding: 1, 13 | scrollable: true, 14 | keys: true, 15 | vi: true, 16 | alwaysScroll: true, 17 | scrollbar: { 18 | bg: 'blue', 19 | fg: 'red' 20 | } 21 | }); 22 | 23 | // Main form elements 24 | var form = blessed.form({ 25 | parent: contentArea, 26 | inputOnFocus: true, 27 | keys: true, 28 | left: 0, 29 | top: 6, 30 | height: '100%-8', 31 | width: '100%-1', 32 | vi: true 33 | }); 34 | 35 | var userNameLabel = blessed.text({ 36 | parent: form, 37 | content: 'Username:', 38 | top: 0 39 | }); 40 | 41 | var username = blessed.textbox({ 42 | parent: form, 43 | name: 'username', 44 | value: user.inputData.username === undefined ? user.name : user.inputData.username, 45 | input: true, 46 | keys: true, 47 | top: 0, 48 | left: 12, 49 | height: 1, 50 | width: '80%', 51 | style: { 52 | fg: 'white', 53 | bg: 'black', 54 | focus: { 55 | bg: 'red', 56 | fg: 'white' 57 | } 58 | } 59 | }); 60 | 61 | var userNameDescription = blessed.text({ 62 | parent: form, 63 | content: 'Your username is your unique identifier. You\'ll use this to login to #! account and receive mail', 64 | left: 12, 65 | top: 1 66 | }); 67 | 68 | var sshKeyLabel = blessed.text({ 69 | parent: form, 70 | content: 'SSH Key:', 71 | top: 4 72 | }); 73 | 74 | 75 | console.log(user); 76 | 77 | var sshKey = blessed.textarea({ 78 | parent: form, 79 | name: 'ssh_keys', 80 | value: user.inputData.ssh_keys === undefined ? user.keys[0] : user.inputData.ssh_keys, 81 | input: true, 82 | keys: true, 83 | top: 4, 84 | left: 12, 85 | width: '80%', 86 | height: '100%-8', 87 | style: { 88 | fg: 'white', 89 | bg: 'black', 90 | focus: { 91 | bg: 'red', 92 | fg: 'white' 93 | } 94 | } 95 | }); 96 | 97 | var sshKeyDescription = blessed.text({ 98 | parent: form, 99 | content: 'This SSH key is used to setup passwordless authentication to #! shell servers. You can always add more SSH keys using hashbangctl tool from #! shell.', 100 | left: 12, 101 | top: '100%-4' 102 | }); 103 | 104 | screen.append(contentArea); 105 | form.focus(); 106 | 107 | form.on('submit', (data) => { 108 | user.inputData = data; 109 | renderScreen(screen, stream, 'account-review', user); 110 | }); 111 | 112 | 113 | screen.key(['C-y', 'C-s'], (ch, key) => { 114 | form.submit(); 115 | }); 116 | }; 117 | -------------------------------------------------------------------------------- /npm-shrinkwrap.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "signup-ssh", 3 | "version": "1.0.0", 4 | "dependencies": { 5 | "abbrev": { 6 | "version": "1.0.7", 7 | "from": "abbrev@>=1.0.0 <2.0.0", 8 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz" 9 | }, 10 | "acorn": { 11 | "version": "3.2.0", 12 | "from": "acorn@>=3.1.0 <4.0.0", 13 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.2.0.tgz" 14 | }, 15 | "acorn-jsx": { 16 | "version": "3.0.1", 17 | "from": "acorn-jsx@>=3.0.0 <4.0.0", 18 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz" 19 | }, 20 | "align-text": { 21 | "version": "0.1.4", 22 | "from": "align-text@>=0.1.3 <0.2.0", 23 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" 24 | }, 25 | "amdefine": { 26 | "version": "1.0.0", 27 | "from": "amdefine@>=0.0.4", 28 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" 29 | }, 30 | "ansi-escapes": { 31 | "version": "1.4.0", 32 | "from": "ansi-escapes@>=1.1.0 <2.0.0", 33 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz" 34 | }, 35 | "ansi-regex": { 36 | "version": "2.0.0", 37 | "from": "ansi-regex@>=2.0.0 <3.0.0", 38 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz" 39 | }, 40 | "ansi-styles": { 41 | "version": "2.2.1", 42 | "from": "ansi-styles@>=2.2.1 <3.0.0", 43 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" 44 | }, 45 | "ansi-term": { 46 | "version": "0.0.2", 47 | "from": "ansi-term@>=0.0.2", 48 | "resolved": "https://registry.npmjs.org/ansi-term/-/ansi-term-0.0.2.tgz" 49 | }, 50 | "ansicolors": { 51 | "version": "0.2.1", 52 | "from": "ansicolors@>=0.2.1 <0.3.0", 53 | "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz" 54 | }, 55 | "argparse": { 56 | "version": "1.0.7", 57 | "from": "argparse@>=1.0.7 <2.0.0", 58 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.7.tgz" 59 | }, 60 | "array-union": { 61 | "version": "1.0.1", 62 | "from": "array-union@>=1.0.1 <2.0.0", 63 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.1.tgz" 64 | }, 65 | "array-uniq": { 66 | "version": "1.0.2", 67 | "from": "array-uniq@>=1.0.1 <2.0.0", 68 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz" 69 | }, 70 | "arrify": { 71 | "version": "1.0.1", 72 | "from": "arrify@>=1.0.0 <2.0.0", 73 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" 74 | }, 75 | "asn1": { 76 | "version": "0.2.3", 77 | "from": "asn1@>=0.2.3 <0.3.0", 78 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz" 79 | }, 80 | "assert-plus": { 81 | "version": "0.2.0", 82 | "from": "assert-plus@>=0.2.0 <0.3.0", 83 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" 84 | }, 85 | "async": { 86 | "version": "1.5.2", 87 | "from": "async@>=1.5.2 <2.0.0", 88 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz" 89 | }, 90 | "aws-sign2": { 91 | "version": "0.6.0", 92 | "from": "aws-sign2@>=0.6.0 <0.7.0", 93 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz" 94 | }, 95 | "aws4": { 96 | "version": "1.4.1", 97 | "from": "aws4@>=1.2.1 <2.0.0", 98 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz" 99 | }, 100 | "balanced-match": { 101 | "version": "0.4.1", 102 | "from": "balanced-match@>=0.4.1 <0.5.0", 103 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz" 104 | }, 105 | "bl": { 106 | "version": "1.1.2", 107 | "from": "bl@>=1.1.2 <1.2.0", 108 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", 109 | "dependencies": { 110 | "isarray": { 111 | "version": "1.0.0", 112 | "from": "isarray@>=1.0.0 <1.1.0", 113 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" 114 | }, 115 | "readable-stream": { 116 | "version": "2.0.6", 117 | "from": "readable-stream@>=2.0.5 <2.1.0", 118 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz" 119 | } 120 | } 121 | }, 122 | "blessed": { 123 | "version": "0.1.81", 124 | "from": "blessed@>=0.1.81 <0.2.0", 125 | "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz" 126 | }, 127 | "blessed-contrib": { 128 | "version": "3.5.5", 129 | "from": "blessed-contrib@>=3.5.5 <4.0.0", 130 | "resolved": "https://registry.npmjs.org/blessed-contrib/-/blessed-contrib-3.5.5.tgz" 131 | }, 132 | "bluebird": { 133 | "version": "3.4.0", 134 | "from": "bluebird@>=3.1.1 <4.0.0", 135 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.0.tgz" 136 | }, 137 | "boom": { 138 | "version": "2.10.1", 139 | "from": "boom@>=2.0.0 <3.0.0", 140 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" 141 | }, 142 | "brace-expansion": { 143 | "version": "1.1.4", 144 | "from": "brace-expansion@>=1.0.0 <2.0.0", 145 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.4.tgz" 146 | }, 147 | "bresenham": { 148 | "version": "0.0.3", 149 | "from": "bresenham@0.0.3", 150 | "resolved": "https://registry.npmjs.org/bresenham/-/bresenham-0.0.3.tgz" 151 | }, 152 | "buffers": { 153 | "version": "0.1.1", 154 | "from": "buffers@>=0.1.1 <0.2.0", 155 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" 156 | }, 157 | "caller-path": { 158 | "version": "0.1.0", 159 | "from": "caller-path@>=0.1.0 <0.2.0", 160 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz" 161 | }, 162 | "callsites": { 163 | "version": "0.2.0", 164 | "from": "callsites@>=0.2.0 <0.3.0", 165 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz" 166 | }, 167 | "camelcase": { 168 | "version": "1.2.1", 169 | "from": "camelcase@>=1.0.2 <2.0.0", 170 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" 171 | }, 172 | "cardinal": { 173 | "version": "0.5.0", 174 | "from": "cardinal@>=0.5.0 <0.6.0", 175 | "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-0.5.0.tgz" 176 | }, 177 | "caseless": { 178 | "version": "0.11.0", 179 | "from": "caseless@>=0.11.0 <0.12.0", 180 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz" 181 | }, 182 | "center-align": { 183 | "version": "0.1.3", 184 | "from": "center-align@>=0.1.1 <0.2.0", 185 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz" 186 | }, 187 | "chalk": { 188 | "version": "1.1.3", 189 | "from": "chalk@>=1.1.0 <2.0.0", 190 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" 191 | }, 192 | "charm": { 193 | "version": "0.1.2", 194 | "from": "charm@>=0.1.0 <0.2.0", 195 | "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz" 196 | }, 197 | "cli-cursor": { 198 | "version": "1.0.2", 199 | "from": "cli-cursor@>=1.0.1 <2.0.0", 200 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz" 201 | }, 202 | "cli-table": { 203 | "version": "0.3.1", 204 | "from": "cli-table@>=0.3.1 <0.4.0", 205 | "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz" 206 | }, 207 | "cli-width": { 208 | "version": "2.1.0", 209 | "from": "cli-width@>=2.0.0 <3.0.0", 210 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz" 211 | }, 212 | "cliui": { 213 | "version": "2.1.0", 214 | "from": "cliui@>=2.1.0 <3.0.0", 215 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 216 | "dependencies": { 217 | "wordwrap": { 218 | "version": "0.0.2", 219 | "from": "wordwrap@0.0.2", 220 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" 221 | } 222 | } 223 | }, 224 | "code-point-at": { 225 | "version": "1.0.0", 226 | "from": "code-point-at@>=1.0.0 <2.0.0", 227 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz" 228 | }, 229 | "colors": { 230 | "version": "1.0.3", 231 | "from": "colors@1.0.3", 232 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" 233 | }, 234 | "combined-stream": { 235 | "version": "1.0.5", 236 | "from": "combined-stream@>=1.0.5 <1.1.0", 237 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" 238 | }, 239 | "commander": { 240 | "version": "2.9.0", 241 | "from": "commander@>=2.9.0 <3.0.0", 242 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" 243 | }, 244 | "concat-map": { 245 | "version": "0.0.1", 246 | "from": "concat-map@0.0.1", 247 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 248 | }, 249 | "concat-stream": { 250 | "version": "1.5.1", 251 | "from": "concat-stream@>=1.4.6 <2.0.0", 252 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz", 253 | "dependencies": { 254 | "isarray": { 255 | "version": "1.0.0", 256 | "from": "isarray@>=1.0.0 <1.1.0", 257 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" 258 | }, 259 | "readable-stream": { 260 | "version": "2.0.6", 261 | "from": "readable-stream@>=2.0.0 <2.1.0", 262 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz" 263 | } 264 | } 265 | }, 266 | "core-util-is": { 267 | "version": "1.0.2", 268 | "from": "core-util-is@>=1.0.0 <1.1.0", 269 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" 270 | }, 271 | "cryptiles": { 272 | "version": "2.0.5", 273 | "from": "cryptiles@>=2.0.0 <3.0.0", 274 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz" 275 | }, 276 | "d": { 277 | "version": "0.1.1", 278 | "from": "d@>=0.1.1 <0.2.0", 279 | "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz" 280 | }, 281 | "dashdash": { 282 | "version": "1.14.0", 283 | "from": "dashdash@>=1.12.0 <2.0.0", 284 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz", 285 | "dependencies": { 286 | "assert-plus": { 287 | "version": "1.0.0", 288 | "from": "assert-plus@>=1.0.0 <2.0.0", 289 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 290 | } 291 | } 292 | }, 293 | "debug": { 294 | "version": "2.2.0", 295 | "from": "debug@>=2.1.1 <3.0.0", 296 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz" 297 | }, 298 | "decamelize": { 299 | "version": "1.2.0", 300 | "from": "decamelize@>=1.0.0 <2.0.0", 301 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" 302 | }, 303 | "deep-is": { 304 | "version": "0.1.3", 305 | "from": "deep-is@>=0.1.3 <0.2.0", 306 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" 307 | }, 308 | "del": { 309 | "version": "2.2.0", 310 | "from": "del@>=2.0.2 <3.0.0", 311 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.0.tgz" 312 | }, 313 | "delayed-stream": { 314 | "version": "1.0.0", 315 | "from": "delayed-stream@>=1.0.0 <1.1.0", 316 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 317 | }, 318 | "diff": { 319 | "version": "1.4.0", 320 | "from": "diff@1.4.0", 321 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz" 322 | }, 323 | "doctrine": { 324 | "version": "1.2.2", 325 | "from": "doctrine@>=1.2.2 <2.0.0", 326 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.2.2.tgz", 327 | "dependencies": { 328 | "esutils": { 329 | "version": "1.1.6", 330 | "from": "esutils@>=1.1.6 <2.0.0", 331 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz" 332 | }, 333 | "isarray": { 334 | "version": "1.0.0", 335 | "from": "isarray@^1.0.0", 336 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" 337 | } 338 | } 339 | }, 340 | "drawille-blessed-contrib": { 341 | "version": "1.0.0", 342 | "from": "drawille-blessed-contrib@>=0.0.1", 343 | "resolved": "https://registry.npmjs.org/drawille-blessed-contrib/-/drawille-blessed-contrib-1.0.0.tgz" 344 | }, 345 | "drawille-canvas-blessed-contrib": { 346 | "version": "0.1.3", 347 | "from": "drawille-canvas-blessed-contrib@>=0.1.3", 348 | "resolved": "https://registry.npmjs.org/drawille-canvas-blessed-contrib/-/drawille-canvas-blessed-contrib-0.1.3.tgz" 349 | }, 350 | "ecc-jsbn": { 351 | "version": "0.1.1", 352 | "from": "ecc-jsbn@>=0.1.1 <0.2.0", 353 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz" 354 | }, 355 | "es5-ext": { 356 | "version": "0.10.11", 357 | "from": "es5-ext@>=0.10.11 <0.11.0", 358 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.11.tgz", 359 | "dependencies": { 360 | "es6-symbol": { 361 | "version": "3.0.2", 362 | "from": "es6-symbol@>=3.0.2 <3.1.0", 363 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.0.2.tgz" 364 | } 365 | } 366 | }, 367 | "es6-iterator": { 368 | "version": "2.0.0", 369 | "from": "es6-iterator@>=2.0.0 <3.0.0", 370 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.0.tgz" 371 | }, 372 | "es6-map": { 373 | "version": "0.1.4", 374 | "from": "es6-map@>=0.1.3 <0.2.0", 375 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.4.tgz" 376 | }, 377 | "es6-set": { 378 | "version": "0.1.4", 379 | "from": "es6-set@>=0.1.3 <0.2.0", 380 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.4.tgz" 381 | }, 382 | "es6-symbol": { 383 | "version": "3.1.0", 384 | "from": "es6-symbol@>=3.1.0 <3.2.0", 385 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.0.tgz" 386 | }, 387 | "es6-weak-map": { 388 | "version": "2.0.1", 389 | "from": "es6-weak-map@>=2.0.1 <3.0.0", 390 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.1.tgz" 391 | }, 392 | "escape-string-regexp": { 393 | "version": "1.0.5", 394 | "from": "escape-string-regexp@>=1.0.2 <2.0.0", 395 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 396 | }, 397 | "escodegen": { 398 | "version": "1.8.0", 399 | "from": "escodegen@>=1.8.0 <1.9.0", 400 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.0.tgz", 401 | "dependencies": { 402 | "esprima": { 403 | "version": "2.7.2", 404 | "from": "esprima@^2.7.1", 405 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz" 406 | }, 407 | "estraverse": { 408 | "version": "1.9.3", 409 | "from": "estraverse@>=1.9.1 <2.0.0", 410 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz" 411 | } 412 | } 413 | }, 414 | "escope": { 415 | "version": "3.6.0", 416 | "from": "escope@>=3.6.0 <4.0.0", 417 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz" 418 | }, 419 | "espree": { 420 | "version": "3.1.4", 421 | "from": "espree@3.1.4", 422 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.1.4.tgz" 423 | }, 424 | "esprima-fb": { 425 | "version": "12001.1.0-dev-harmony-fb", 426 | "from": "esprima-fb@>=12001.1.0-dev-harmony-fb <12001.2.0", 427 | "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-12001.1.0-dev-harmony-fb.tgz" 428 | }, 429 | "esrecurse": { 430 | "version": "4.1.0", 431 | "from": "esrecurse@>=4.1.0 <5.0.0", 432 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", 433 | "dependencies": { 434 | "estraverse": { 435 | "version": "4.1.1", 436 | "from": "estraverse@>=4.1.0 <4.2.0", 437 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz" 438 | } 439 | } 440 | }, 441 | "estraverse": { 442 | "version": "4.2.0", 443 | "from": "estraverse@>=4.2.0 <5.0.0", 444 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz" 445 | }, 446 | "esutils": { 447 | "version": "2.0.2", 448 | "from": "esutils@>=2.0.2 <3.0.0", 449 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" 450 | }, 451 | "event-emitter": { 452 | "version": "0.3.4", 453 | "from": "event-emitter@>=0.3.4 <0.4.0", 454 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.4.tgz" 455 | }, 456 | "event-stream": { 457 | "version": "0.9.8", 458 | "from": "event-stream@>=0.9.8 <0.10.0", 459 | "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-0.9.8.tgz", 460 | "dependencies": { 461 | "optimist": { 462 | "version": "0.2.8", 463 | "from": "optimist@>=0.2.0 <0.3.0", 464 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz" 465 | } 466 | } 467 | }, 468 | "exit-hook": { 469 | "version": "1.1.1", 470 | "from": "exit-hook@>=1.0.0 <2.0.0", 471 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz" 472 | }, 473 | "extend": { 474 | "version": "3.0.0", 475 | "from": "extend@>=3.0.0 <3.1.0", 476 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" 477 | }, 478 | "extsprintf": { 479 | "version": "1.0.2", 480 | "from": "extsprintf@1.0.2", 481 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz" 482 | }, 483 | "fast-levenshtein": { 484 | "version": "1.1.3", 485 | "from": "fast-levenshtein@>=1.1.0 <2.0.0", 486 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.3.tgz" 487 | }, 488 | "figures": { 489 | "version": "1.7.0", 490 | "from": "figures@>=1.3.5 <2.0.0", 491 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz" 492 | }, 493 | "file-entry-cache": { 494 | "version": "1.2.4", 495 | "from": "file-entry-cache@>=1.1.1 <2.0.0", 496 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.2.4.tgz" 497 | }, 498 | "fileset": { 499 | "version": "0.2.1", 500 | "from": "fileset@>=0.2.0 <0.3.0", 501 | "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.2.1.tgz", 502 | "dependencies": { 503 | "glob": { 504 | "version": "5.0.15", 505 | "from": "glob@>=5.0.0 <6.0.0", 506 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" 507 | }, 508 | "minimatch": { 509 | "version": "2.0.10", 510 | "from": "minimatch@>=2.0.0 <3.0.0", 511 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz" 512 | } 513 | } 514 | }, 515 | "flat-cache": { 516 | "version": "1.0.10", 517 | "from": "flat-cache@>=1.0.9 <2.0.0", 518 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.0.10.tgz" 519 | }, 520 | "forever-agent": { 521 | "version": "0.6.1", 522 | "from": "forever-agent@>=0.6.1 <0.7.0", 523 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" 524 | }, 525 | "form-data": { 526 | "version": "1.0.0-rc4", 527 | "from": "form-data@>=1.0.0-rc3 <1.1.0", 528 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz" 529 | }, 530 | "generate-function": { 531 | "version": "2.0.0", 532 | "from": "generate-function@>=2.0.0 <3.0.0", 533 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz" 534 | }, 535 | "generate-object-property": { 536 | "version": "1.2.0", 537 | "from": "generate-object-property@>=1.1.0 <2.0.0", 538 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz" 539 | }, 540 | "getpass": { 541 | "version": "0.1.6", 542 | "from": "getpass@>=0.1.1 <0.2.0", 543 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", 544 | "dependencies": { 545 | "assert-plus": { 546 | "version": "1.0.0", 547 | "from": "assert-plus@>=1.0.0 <2.0.0", 548 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 549 | } 550 | } 551 | }, 552 | "gl-matrix": { 553 | "version": "2.3.2", 554 | "from": "gl-matrix@>=2.1.0 <3.0.0", 555 | "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.3.2.tgz" 556 | }, 557 | "glob": { 558 | "version": "7.0.3", 559 | "from": "glob@>=7.0.3 <8.0.0", 560 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.3.tgz" 561 | }, 562 | "globals": { 563 | "version": "9.8.0", 564 | "from": "globals@>=9.2.0 <10.0.0", 565 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.8.0.tgz" 566 | }, 567 | "globby": { 568 | "version": "4.1.0", 569 | "from": "globby@>=4.0.0 <5.0.0", 570 | "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz", 571 | "dependencies": { 572 | "glob": { 573 | "version": "6.0.4", 574 | "from": "glob@>=6.0.1 <7.0.0", 575 | "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" 576 | } 577 | } 578 | }, 579 | "graceful-fs": { 580 | "version": "4.1.4", 581 | "from": "graceful-fs@>=4.1.2 <5.0.0", 582 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz" 583 | }, 584 | "graceful-readlink": { 585 | "version": "1.0.1", 586 | "from": "graceful-readlink@>=1.0.0", 587 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" 588 | }, 589 | "growl": { 590 | "version": "1.9.2", 591 | "from": "growl@1.9.2", 592 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz" 593 | }, 594 | "handlebars": { 595 | "version": "4.0.5", 596 | "from": "handlebars@>=4.0.1 <5.0.0", 597 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.5.tgz", 598 | "dependencies": { 599 | "optimist": { 600 | "version": "0.6.1", 601 | "from": "optimist@>=0.6.1 <0.7.0", 602 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz" 603 | }, 604 | "source-map": { 605 | "version": "0.4.4", 606 | "from": "source-map@>=0.4.4 <0.5.0", 607 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz" 608 | } 609 | } 610 | }, 611 | "har-validator": { 612 | "version": "2.0.6", 613 | "from": "har-validator@>=2.0.6 <2.1.0", 614 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz" 615 | }, 616 | "has-ansi": { 617 | "version": "2.0.0", 618 | "from": "has-ansi@>=2.0.0 <3.0.0", 619 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" 620 | }, 621 | "has-flag": { 622 | "version": "1.0.0", 623 | "from": "has-flag@>=1.0.0 <2.0.0", 624 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" 625 | }, 626 | "hawk": { 627 | "version": "3.1.3", 628 | "from": "hawk@>=3.1.3 <3.2.0", 629 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" 630 | }, 631 | "here": { 632 | "version": "0.0.2", 633 | "from": "here@0.0.2", 634 | "resolved": "https://registry.npmjs.org/here/-/here-0.0.2.tgz" 635 | }, 636 | "hoek": { 637 | "version": "2.16.3", 638 | "from": "hoek@>=2.0.0 <3.0.0", 639 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" 640 | }, 641 | "http-signature": { 642 | "version": "1.1.1", 643 | "from": "http-signature@>=1.1.0 <1.2.0", 644 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz" 645 | }, 646 | "ignore": { 647 | "version": "3.1.2", 648 | "from": "ignore@>=3.1.2 <4.0.0", 649 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.1.2.tgz" 650 | }, 651 | "imurmurhash": { 652 | "version": "0.1.4", 653 | "from": "imurmurhash@>=0.1.4 <0.2.0", 654 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" 655 | }, 656 | "inflight": { 657 | "version": "1.0.5", 658 | "from": "inflight@>=1.0.4 <2.0.0", 659 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz" 660 | }, 661 | "inherits": { 662 | "version": "2.0.1", 663 | "from": "inherits@>=2.0.1 <2.1.0", 664 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" 665 | }, 666 | "inquirer": { 667 | "version": "0.12.0", 668 | "from": "inquirer@>=0.12.0 <0.13.0", 669 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz" 670 | }, 671 | "is-buffer": { 672 | "version": "1.1.3", 673 | "from": "is-buffer@>=1.0.2 <2.0.0", 674 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.3.tgz" 675 | }, 676 | "is-fullwidth-code-point": { 677 | "version": "1.0.0", 678 | "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", 679 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" 680 | }, 681 | "is-my-json-valid": { 682 | "version": "2.13.1", 683 | "from": "is-my-json-valid@>=2.12.4 <3.0.0", 684 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz" 685 | }, 686 | "is-path-cwd": { 687 | "version": "1.0.0", 688 | "from": "is-path-cwd@>=1.0.0 <2.0.0", 689 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz" 690 | }, 691 | "is-path-in-cwd": { 692 | "version": "1.0.0", 693 | "from": "is-path-in-cwd@>=1.0.0 <2.0.0", 694 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz" 695 | }, 696 | "is-path-inside": { 697 | "version": "1.0.0", 698 | "from": "is-path-inside@>=1.0.0 <2.0.0", 699 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz" 700 | }, 701 | "is-property": { 702 | "version": "1.0.2", 703 | "from": "is-property@>=1.0.0 <2.0.0", 704 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz" 705 | }, 706 | "is-resolvable": { 707 | "version": "1.0.0", 708 | "from": "is-resolvable@>=1.0.0 <2.0.0", 709 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz" 710 | }, 711 | "is-typedarray": { 712 | "version": "1.0.0", 713 | "from": "is-typedarray@>=1.0.0 <1.1.0", 714 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" 715 | }, 716 | "isarray": { 717 | "version": "0.0.1", 718 | "from": "isarray@0.0.1", 719 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" 720 | }, 721 | "isexe": { 722 | "version": "1.1.2", 723 | "from": "isexe@>=1.1.1 <2.0.0", 724 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz" 725 | }, 726 | "isstream": { 727 | "version": "0.1.2", 728 | "from": "isstream@>=0.1.2 <0.2.0", 729 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" 730 | }, 731 | "jade": { 732 | "version": "0.26.3", 733 | "from": "jade@0.26.3", 734 | "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", 735 | "dependencies": { 736 | "commander": { 737 | "version": "0.6.1", 738 | "from": "commander@0.6.1", 739 | "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" 740 | }, 741 | "mkdirp": { 742 | "version": "0.3.0", 743 | "from": "mkdirp@0.3.0", 744 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" 745 | } 746 | } 747 | }, 748 | "jodid25519": { 749 | "version": "1.0.2", 750 | "from": "jodid25519@>=1.0.0 <2.0.0", 751 | "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz" 752 | }, 753 | "js-yaml": { 754 | "version": "3.6.1", 755 | "from": "js-yaml@>=3.5.1 <4.0.0", 756 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", 757 | "dependencies": { 758 | "esprima": { 759 | "version": "2.7.2", 760 | "from": "esprima@>=2.6.0 <3.0.0", 761 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.2.tgz" 762 | } 763 | } 764 | }, 765 | "jsbn": { 766 | "version": "0.1.0", 767 | "from": "jsbn@>=0.1.0 <0.2.0", 768 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz" 769 | }, 770 | "json-schema": { 771 | "version": "0.2.2", 772 | "from": "json-schema@0.2.2", 773 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz" 774 | }, 775 | "json-stable-stringify": { 776 | "version": "1.0.1", 777 | "from": "json-stable-stringify@>=1.0.0 <2.0.0", 778 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" 779 | }, 780 | "json-stringify-safe": { 781 | "version": "5.0.1", 782 | "from": "json-stringify-safe@>=5.0.1 <5.1.0", 783 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" 784 | }, 785 | "jsonify": { 786 | "version": "0.0.0", 787 | "from": "jsonify@>=0.0.0 <0.1.0", 788 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" 789 | }, 790 | "jsonpointer": { 791 | "version": "2.0.0", 792 | "from": "jsonpointer@2.0.0", 793 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz" 794 | }, 795 | "jsprim": { 796 | "version": "1.2.2", 797 | "from": "jsprim@>=1.2.2 <2.0.0", 798 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz" 799 | }, 800 | "kind-of": { 801 | "version": "3.0.3", 802 | "from": "kind-of@>=3.0.2 <4.0.0", 803 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.3.tgz" 804 | }, 805 | "lazy-cache": { 806 | "version": "1.0.4", 807 | "from": "lazy-cache@>=1.0.3 <2.0.0", 808 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" 809 | }, 810 | "levn": { 811 | "version": "0.3.0", 812 | "from": "levn@>=0.3.0 <0.4.0", 813 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" 814 | }, 815 | "lodash": { 816 | "version": "4.13.1", 817 | "from": "lodash@>=3.0.0", 818 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz" 819 | }, 820 | "lodash._baseassign": { 821 | "version": "3.2.0", 822 | "from": "lodash._baseassign@>=3.0.0 <4.0.0", 823 | "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz" 824 | }, 825 | "lodash._basecopy": { 826 | "version": "3.0.1", 827 | "from": "lodash._basecopy@>=3.0.0 <4.0.0", 828 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz" 829 | }, 830 | "lodash._bindcallback": { 831 | "version": "3.0.1", 832 | "from": "lodash._bindcallback@>=3.0.0 <4.0.0", 833 | "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz" 834 | }, 835 | "lodash._createassigner": { 836 | "version": "3.1.1", 837 | "from": "lodash._createassigner@>=3.0.0 <4.0.0", 838 | "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz" 839 | }, 840 | "lodash._getnative": { 841 | "version": "3.9.1", 842 | "from": "lodash._getnative@>=3.0.0 <4.0.0", 843 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz" 844 | }, 845 | "lodash._isiterateecall": { 846 | "version": "3.0.9", 847 | "from": "lodash._isiterateecall@>=3.0.0 <4.0.0", 848 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz" 849 | }, 850 | "lodash.assign": { 851 | "version": "3.2.0", 852 | "from": "lodash.assign@>=3.0.0 <4.0.0", 853 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz" 854 | }, 855 | "lodash.isarguments": { 856 | "version": "3.0.8", 857 | "from": "lodash.isarguments@>=3.0.0 <4.0.0", 858 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.8.tgz" 859 | }, 860 | "lodash.isarray": { 861 | "version": "3.0.4", 862 | "from": "lodash.isarray@>=3.0.0 <4.0.0", 863 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" 864 | }, 865 | "lodash.keys": { 866 | "version": "3.1.2", 867 | "from": "lodash.keys@>=3.0.0 <4.0.0", 868 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz" 869 | }, 870 | "lodash.restparam": { 871 | "version": "3.6.1", 872 | "from": "lodash.restparam@>=3.0.0 <4.0.0", 873 | "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz" 874 | }, 875 | "longest": { 876 | "version": "1.0.1", 877 | "from": "longest@>=1.0.1 <2.0.0", 878 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" 879 | }, 880 | "lru-cache": { 881 | "version": "2.7.3", 882 | "from": "lru-cache@>=2.0.0 <3.0.0", 883 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" 884 | }, 885 | "map-canvas": { 886 | "version": "0.1.5", 887 | "from": "map-canvas@>=0.1.5", 888 | "resolved": "https://registry.npmjs.org/map-canvas/-/map-canvas-0.1.5.tgz" 889 | }, 890 | "marked": { 891 | "version": "0.3.5", 892 | "from": "marked@>=0.3.3 <0.4.0", 893 | "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.5.tgz" 894 | }, 895 | "marked-terminal": { 896 | "version": "1.6.1", 897 | "from": "marked-terminal@>=1.5.0 <2.0.0", 898 | "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-1.6.1.tgz" 899 | }, 900 | "memory-streams": { 901 | "version": "0.1.0", 902 | "from": "memory-streams@>=0.1.0 <0.2.0", 903 | "resolved": "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.0.tgz" 904 | }, 905 | "memorystream": { 906 | "version": "0.3.1", 907 | "from": "memorystream@>=0.3.1 <0.4.0", 908 | "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" 909 | }, 910 | "mime-db": { 911 | "version": "1.23.0", 912 | "from": "mime-db@>=1.23.0 <1.24.0", 913 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz" 914 | }, 915 | "mime-types": { 916 | "version": "2.1.11", 917 | "from": "mime-types@>=2.1.7 <2.2.0", 918 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz" 919 | }, 920 | "minimatch": { 921 | "version": "3.0.0", 922 | "from": "minimatch@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0", 923 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz" 924 | }, 925 | "minimist": { 926 | "version": "0.0.8", 927 | "from": "minimist@0.0.8", 928 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" 929 | }, 930 | "mkdirp": { 931 | "version": "0.5.1", 932 | "from": "mkdirp@>=0.5.0 <0.6.0", 933 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" 934 | }, 935 | "ms": { 936 | "version": "0.7.1", 937 | "from": "ms@0.7.1", 938 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz" 939 | }, 940 | "mute-stream": { 941 | "version": "0.0.5", 942 | "from": "mute-stream@0.0.5", 943 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz" 944 | }, 945 | "node-emoji": { 946 | "version": "0.1.0", 947 | "from": "node-emoji@>=0.1.0 <0.2.0", 948 | "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-0.1.0.tgz" 949 | }, 950 | "node-uuid": { 951 | "version": "1.4.7", 952 | "from": "node-uuid@>=1.4.7 <1.5.0", 953 | "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz" 954 | }, 955 | "nopt": { 956 | "version": "2.1.2", 957 | "from": "nopt@>=2.1.2 <2.2.0", 958 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz" 959 | }, 960 | "number-is-nan": { 961 | "version": "1.0.0", 962 | "from": "number-is-nan@>=1.0.0 <2.0.0", 963 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz" 964 | }, 965 | "oauth-sign": { 966 | "version": "0.8.2", 967 | "from": "oauth-sign@>=0.8.1 <0.9.0", 968 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz" 969 | }, 970 | "object-assign": { 971 | "version": "4.1.0", 972 | "from": "object-assign@>=4.0.1 <5.0.0", 973 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz" 974 | }, 975 | "once": { 976 | "version": "1.3.3", 977 | "from": "once@>=1.3.0 <2.0.0", 978 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" 979 | }, 980 | "onetime": { 981 | "version": "1.1.0", 982 | "from": "onetime@>=1.0.0 <2.0.0", 983 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz" 984 | }, 985 | "optimist": { 986 | "version": "0.3.7", 987 | "from": "optimist@>=0.3.4 <0.4.0", 988 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz" 989 | }, 990 | "optionator": { 991 | "version": "0.8.1", 992 | "from": "optionator@>=0.8.1 <0.9.0", 993 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.1.tgz", 994 | "dependencies": { 995 | "wordwrap": { 996 | "version": "1.0.0", 997 | "from": "wordwrap@>=1.0.0 <1.1.0", 998 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" 999 | } 1000 | } 1001 | }, 1002 | "os-homedir": { 1003 | "version": "1.0.1", 1004 | "from": "os-homedir@>=1.0.0 <2.0.0", 1005 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.1.tgz" 1006 | }, 1007 | "path-is-absolute": { 1008 | "version": "1.0.0", 1009 | "from": "path-is-absolute@>=1.0.0 <2.0.0", 1010 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz" 1011 | }, 1012 | "path-is-inside": { 1013 | "version": "1.0.1", 1014 | "from": "path-is-inside@>=1.0.1 <2.0.0", 1015 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.1.tgz" 1016 | }, 1017 | "picture-tube": { 1018 | "version": "0.0.4", 1019 | "from": "picture-tube@0.0.4", 1020 | "resolved": "https://registry.npmjs.org/picture-tube/-/picture-tube-0.0.4.tgz", 1021 | "dependencies": { 1022 | "request": { 1023 | "version": "2.9.203", 1024 | "from": "request@>=2.9.202 <2.10.0", 1025 | "resolved": "https://registry.npmjs.org/request/-/request-2.9.203.tgz" 1026 | } 1027 | } 1028 | }, 1029 | "pify": { 1030 | "version": "2.3.0", 1031 | "from": "pify@>=2.0.0 <3.0.0", 1032 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" 1033 | }, 1034 | "pinkie": { 1035 | "version": "2.0.4", 1036 | "from": "pinkie@>=2.0.0 <3.0.0", 1037 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" 1038 | }, 1039 | "pinkie-promise": { 1040 | "version": "2.0.1", 1041 | "from": "pinkie-promise@>=2.0.0 <3.0.0", 1042 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" 1043 | }, 1044 | "pluralize": { 1045 | "version": "1.2.1", 1046 | "from": "pluralize@>=1.2.1 <2.0.0", 1047 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz" 1048 | }, 1049 | "png-js": { 1050 | "version": "0.1.1", 1051 | "from": "png-js@>=0.1.0 <0.2.0", 1052 | "resolved": "https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz" 1053 | }, 1054 | "prelude-ls": { 1055 | "version": "1.1.2", 1056 | "from": "prelude-ls@>=1.1.2 <1.2.0", 1057 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" 1058 | }, 1059 | "process-nextick-args": { 1060 | "version": "1.0.7", 1061 | "from": "process-nextick-args@>=1.0.6 <1.1.0", 1062 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" 1063 | }, 1064 | "progress": { 1065 | "version": "1.1.8", 1066 | "from": "progress@>=1.1.8 <2.0.0", 1067 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz" 1068 | }, 1069 | "qs": { 1070 | "version": "6.1.0", 1071 | "from": "qs@>=6.1.0 <6.2.0", 1072 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.1.0.tgz" 1073 | }, 1074 | "read-json-sync": { 1075 | "version": "1.1.1", 1076 | "from": "read-json-sync@>=1.1.0 <2.0.0", 1077 | "resolved": "https://registry.npmjs.org/read-json-sync/-/read-json-sync-1.1.1.tgz" 1078 | }, 1079 | "readable-stream": { 1080 | "version": "1.0.34", 1081 | "from": "readable-stream@>=1.0.2 <1.1.0", 1082 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" 1083 | }, 1084 | "readline2": { 1085 | "version": "1.0.1", 1086 | "from": "readline2@>=1.0.1 <2.0.0", 1087 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz" 1088 | }, 1089 | "redeyed": { 1090 | "version": "0.5.0", 1091 | "from": "redeyed@>=0.5.0 <0.6.0", 1092 | "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-0.5.0.tgz" 1093 | }, 1094 | "repeat-string": { 1095 | "version": "1.5.4", 1096 | "from": "repeat-string@>=1.5.2 <2.0.0", 1097 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.4.tgz" 1098 | }, 1099 | "request": { 1100 | "version": "2.72.0", 1101 | "from": "request@>=2.53.0 <3.0.0", 1102 | "resolved": "https://registry.npmjs.org/request/-/request-2.72.0.tgz" 1103 | }, 1104 | "require-uncached": { 1105 | "version": "1.0.2", 1106 | "from": "require-uncached@>=1.0.2 <2.0.0", 1107 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.2.tgz" 1108 | }, 1109 | "resolve": { 1110 | "version": "1.1.7", 1111 | "from": "resolve@>=1.1.0 <1.2.0", 1112 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" 1113 | }, 1114 | "resolve-from": { 1115 | "version": "1.0.1", 1116 | "from": "resolve-from@>=1.0.0 <2.0.0", 1117 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz" 1118 | }, 1119 | "restore-cursor": { 1120 | "version": "1.0.1", 1121 | "from": "restore-cursor@>=1.0.1 <2.0.0", 1122 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz" 1123 | }, 1124 | "right-align": { 1125 | "version": "0.1.3", 1126 | "from": "right-align@>=0.1.1 <0.2.0", 1127 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz" 1128 | }, 1129 | "rimraf": { 1130 | "version": "2.5.2", 1131 | "from": "rimraf@>=2.2.8 <3.0.0", 1132 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.2.tgz" 1133 | }, 1134 | "run-async": { 1135 | "version": "0.1.0", 1136 | "from": "run-async@>=0.1.0 <0.2.0", 1137 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz" 1138 | }, 1139 | "rx-lite": { 1140 | "version": "3.1.2", 1141 | "from": "rx-lite@>=3.1.2 <4.0.0", 1142 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz" 1143 | }, 1144 | "sax": { 1145 | "version": "1.2.1", 1146 | "from": "sax@>=0.6.0", 1147 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz" 1148 | }, 1149 | "semver": { 1150 | "version": "5.1.0", 1151 | "from": "semver@>=5.1.0 <6.0.0", 1152 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz" 1153 | }, 1154 | "shelljs": { 1155 | "version": "0.6.0", 1156 | "from": "shelljs@>=0.6.0 <0.7.0", 1157 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.0.tgz" 1158 | }, 1159 | "sigmund": { 1160 | "version": "1.0.1", 1161 | "from": "sigmund@>=1.0.0 <1.1.0", 1162 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" 1163 | }, 1164 | "slice-ansi": { 1165 | "version": "0.0.4", 1166 | "from": "slice-ansi@0.0.4", 1167 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz" 1168 | }, 1169 | "sntp": { 1170 | "version": "1.0.9", 1171 | "from": "sntp@>=1.0.0 <2.0.0", 1172 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" 1173 | }, 1174 | "source-map": { 1175 | "version": "0.2.0", 1176 | "from": "source-map@>=0.2.0 <0.3.0", 1177 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz" 1178 | }, 1179 | "sparkline": { 1180 | "version": "0.1.2", 1181 | "from": "sparkline@>=0.1.1 <0.2.0", 1182 | "resolved": "https://registry.npmjs.org/sparkline/-/sparkline-0.1.2.tgz" 1183 | }, 1184 | "sprintf-js": { 1185 | "version": "1.0.3", 1186 | "from": "sprintf-js@>=1.0.2 <1.1.0", 1187 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" 1188 | }, 1189 | "ssh2": { 1190 | "version": "0.5.0", 1191 | "from": "ssh2@>=0.5.0 <0.6.0", 1192 | "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.5.0.tgz" 1193 | }, 1194 | "ssh2-streams": { 1195 | "version": "0.1.4", 1196 | "from": "ssh2-streams@>=0.1.0 <0.2.0", 1197 | "resolved": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.1.4.tgz" 1198 | }, 1199 | "sshpk": { 1200 | "version": "1.8.3", 1201 | "from": "sshpk@>=1.7.0 <2.0.0", 1202 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.8.3.tgz", 1203 | "dependencies": { 1204 | "assert-plus": { 1205 | "version": "1.0.0", 1206 | "from": "assert-plus@>=1.0.0 <2.0.0", 1207 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 1208 | } 1209 | } 1210 | }, 1211 | "streamsearch": { 1212 | "version": "0.1.2", 1213 | "from": "streamsearch@>=0.1.2 <0.2.0", 1214 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz" 1215 | }, 1216 | "string_decoder": { 1217 | "version": "0.10.31", 1218 | "from": "string_decoder@>=0.10.0 <0.11.0", 1219 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" 1220 | }, 1221 | "string-width": { 1222 | "version": "1.0.1", 1223 | "from": "string-width@>=1.0.1 <2.0.0", 1224 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz" 1225 | }, 1226 | "stringstream": { 1227 | "version": "0.0.5", 1228 | "from": "stringstream@>=0.0.4 <0.1.0", 1229 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz" 1230 | }, 1231 | "strip-ansi": { 1232 | "version": "3.0.1", 1233 | "from": "strip-ansi@>=3.0.0 <4.0.0", 1234 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" 1235 | }, 1236 | "strip-json-comments": { 1237 | "version": "1.0.4", 1238 | "from": "strip-json-comments@>=1.0.1 <1.1.0", 1239 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" 1240 | }, 1241 | "supports-color": { 1242 | "version": "2.0.0", 1243 | "from": "supports-color@>=2.0.0 <3.0.0", 1244 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" 1245 | }, 1246 | "table": { 1247 | "version": "3.7.8", 1248 | "from": "table@>=3.7.8 <4.0.0", 1249 | "resolved": "https://registry.npmjs.org/table/-/table-3.7.8.tgz" 1250 | }, 1251 | "term-canvas": { 1252 | "version": "0.0.5", 1253 | "from": "term-canvas@0.0.5", 1254 | "resolved": "https://registry.npmjs.org/term-canvas/-/term-canvas-0.0.5.tgz" 1255 | }, 1256 | "text-table": { 1257 | "version": "0.2.0", 1258 | "from": "text-table@>=0.2.0 <0.3.0", 1259 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" 1260 | }, 1261 | "through": { 1262 | "version": "2.3.8", 1263 | "from": "through@>=2.3.6 <3.0.0", 1264 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" 1265 | }, 1266 | "to-iso-string": { 1267 | "version": "0.0.2", 1268 | "from": "to-iso-string@0.0.2", 1269 | "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz" 1270 | }, 1271 | "tough-cookie": { 1272 | "version": "2.2.2", 1273 | "from": "tough-cookie@>=2.2.0 <2.3.0", 1274 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz" 1275 | }, 1276 | "tryit": { 1277 | "version": "1.0.2", 1278 | "from": "tryit@>=1.0.1 <2.0.0", 1279 | "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.2.tgz" 1280 | }, 1281 | "tunnel-agent": { 1282 | "version": "0.4.3", 1283 | "from": "tunnel-agent@>=0.4.1 <0.5.0", 1284 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" 1285 | }, 1286 | "tv4": { 1287 | "version": "1.2.7", 1288 | "from": "tv4@>=1.2.7 <2.0.0", 1289 | "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.2.7.tgz" 1290 | }, 1291 | "tweetnacl": { 1292 | "version": "0.13.3", 1293 | "from": "tweetnacl@>=0.13.0 <0.14.0", 1294 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz" 1295 | }, 1296 | "type-check": { 1297 | "version": "0.3.2", 1298 | "from": "type-check@>=0.3.2 <0.4.0", 1299 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" 1300 | }, 1301 | "typedarray": { 1302 | "version": "0.0.6", 1303 | "from": "typedarray@>=0.0.5 <0.1.0", 1304 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" 1305 | }, 1306 | "uglify-js": { 1307 | "version": "2.6.2", 1308 | "from": "uglify-js@>=2.6.0 <3.0.0", 1309 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.2.tgz", 1310 | "dependencies": { 1311 | "async": { 1312 | "version": "0.2.10", 1313 | "from": "async@>=0.2.6 <0.3.0", 1314 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz" 1315 | }, 1316 | "source-map": { 1317 | "version": "0.5.6", 1318 | "from": "source-map@>=0.5.1 <0.6.0", 1319 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" 1320 | } 1321 | } 1322 | }, 1323 | "uglify-to-browserify": { 1324 | "version": "1.0.2", 1325 | "from": "uglify-to-browserify@>=1.0.0 <1.1.0", 1326 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" 1327 | }, 1328 | "user-home": { 1329 | "version": "2.0.0", 1330 | "from": "user-home@>=2.0.0 <3.0.0", 1331 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz" 1332 | }, 1333 | "util-deprecate": { 1334 | "version": "1.0.2", 1335 | "from": "util-deprecate@>=1.0.1 <1.1.0", 1336 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 1337 | }, 1338 | "verror": { 1339 | "version": "1.3.6", 1340 | "from": "verror@1.3.6", 1341 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz" 1342 | }, 1343 | "which": { 1344 | "version": "1.2.10", 1345 | "from": "which@>=1.1.1 <2.0.0", 1346 | "resolved": "https://registry.npmjs.org/which/-/which-1.2.10.tgz" 1347 | }, 1348 | "window-size": { 1349 | "version": "0.1.0", 1350 | "from": "window-size@0.1.0", 1351 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" 1352 | }, 1353 | "wordwrap": { 1354 | "version": "0.0.3", 1355 | "from": "wordwrap@>=0.0.1 <0.1.0", 1356 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" 1357 | }, 1358 | "wrappy": { 1359 | "version": "1.0.2", 1360 | "from": "wrappy@>=1.0.0 <2.0.0", 1361 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 1362 | }, 1363 | "write": { 1364 | "version": "0.2.1", 1365 | "from": "write@>=0.2.1 <0.3.0", 1366 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz" 1367 | }, 1368 | "x256": { 1369 | "version": "0.0.2", 1370 | "from": "x256@>=0.0.1", 1371 | "resolved": "https://registry.npmjs.org/x256/-/x256-0.0.2.tgz" 1372 | }, 1373 | "xml2js": { 1374 | "version": "0.4.16", 1375 | "from": "xml2js@>=0.4.5 <0.5.0", 1376 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.16.tgz" 1377 | }, 1378 | "xmlbuilder": { 1379 | "version": "4.2.1", 1380 | "from": "xmlbuilder@>=4.1.0 <5.0.0", 1381 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz" 1382 | }, 1383 | "xregexp": { 1384 | "version": "3.1.1", 1385 | "from": "xregexp@>=3.0.0 <4.0.0", 1386 | "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-3.1.1.tgz" 1387 | }, 1388 | "xtend": { 1389 | "version": "4.0.1", 1390 | "from": "xtend@>=4.0.0 <5.0.0", 1391 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" 1392 | }, 1393 | "yargs": { 1394 | "version": "3.10.0", 1395 | "from": "yargs@>=3.10.0 <3.11.0", 1396 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" 1397 | } 1398 | } 1399 | } 1400 | --------------------------------------------------------------------------------