diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 0000000..92fad47
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,241 @@
+{
+  "ecmaFeatures": {
+    "jsx": true
+  },
+  "env": {
+    "browser": true,
+    "mocha": true,
+    "node": true
+  },
+  "parser": "babel-eslint",
+  "plugins": [
+    "react"
+  ],
+  "globals": {
+    "window": true,
+    "$": true,
+    "ga": true,
+    "jQuery": true,
+    "router": true
+  },
+  "rules": {
+    "comma-dangle": 2,
+    "no-cond-assign": 2,
+    "no-console": 0,
+    "no-constant-condition": 2,
+    "no-control-regex": 2,
+    "no-debugger": 2,
+    "no-dupe-keys": 2,
+    "no-empty": 2,
+    "no-empty-character-class": 2,
+    "no-ex-assign": 2,
+    "no-extra-boolean-cast": 2,
+    "no-extra-parens": 0,
+    "no-extra-semi": 2,
+    "no-func-assign": 2,
+    "no-inner-declarations": 2,
+    "no-invalid-regexp": 2,
+    "no-irregular-whitespace": 2,
+    "no-negated-in-lhs": 2,
+    "no-obj-calls": 2,
+    "no-regex-spaces": 2,
+    "no-reserved-keys": 0,
+    "no-sparse-arrays": 2,
+    "no-unreachable": 2,
+    "use-isnan": 2,
+    "valid-jsdoc": 2,
+    "valid-typeof": 2,
+
+    "block-scoped-var": 0,
+    "complexity": 0,
+    "consistent-return": 2,
+    "curly": 2,
+    "default-case": 1,
+    "dot-notation": 0,
+    "eqeqeq": 1,
+    "guard-for-in": 1,
+    "no-alert": 1,
+    "no-caller": 2,
+    "no-div-regex": 2,
+    "no-else-return": 0,
+    "no-empty-label": 2,
+    "no-eq-null": 1,
+    "no-eval": 2,
+    "no-extend-native": 2,
+    "no-extra-bind": 2,
+    "no-fallthrough": 2,
+    "no-floating-decimal": 2,
+    "no-implied-eval": 2,
+    "no-iterator": 2,
+    "no-labels": 2,
+    "no-lone-blocks": 2,
+    "no-loop-func": 1,
+    "no-multi-spaces": 1,
+    "no-multi-str": 2,
+    "no-native-reassign": 2,
+    "no-new": 2,
+    "no-new-func": 2,
+    "no-new-wrappers": 2,
+    "no-octal": 2,
+    "no-octal-escape": 2,
+    "no-process-env": 0,
+    "no-proto": 2,
+    "no-redeclare": 1,
+    "no-return-assign": 2,
+    "no-script-url": 2,
+    "no-self-compare": 2,
+    "no-sequences": 2,
+    "no-unused-expressions": 2,
+    "no-void": 1,
+    "no-warning-comments": [
+      1,
+      {
+        "terms": [
+          "fixme"
+        ],
+        "location": "start"
+      }
+    ],
+    "no-with": 2,
+    "radix": 2,
+    "vars-on-top": 0,
+    "wrap-iife": [2, "any"],
+    "yoda": 0,
+
+    "strict": 0,
+
+    "no-catch-shadow": 2,
+    "no-delete-var": 2,
+    "no-label-var": 2,
+    "no-shadow": 0,
+    "no-shadow-restricted-names": 2,
+    "no-undef": 2,
+    "no-undef-init": 2,
+    "no-undefined": 1,
+    "no-unused-vars": 2,
+    "no-use-before-define": 0,
+
+    "handle-callback-err": 2,
+    "no-mixed-requires": 0,
+    "no-new-require": 2,
+    "no-path-concat": 2,
+    "no-process-exit": 2,
+    "no-restricted-modules": 0,
+    "no-sync": 0,
+
+    "brace-style": [
+      2,
+      "1tbs",
+      { "allowSingleLine": true }
+    ],
+    "camelcase": 1,
+    "comma-spacing": [
+      2,
+      {
+        "before": false,
+        "after": true
+      }
+    ],
+    "comma-style": [
+      2, "last"
+    ],
+    "consistent-this": 0,
+    "eol-last": 2,
+    "func-names": 0,
+    "func-style": 0,
+    "key-spacing": [
+      2,
+      {
+        "beforeColon": false,
+        "afterColon": true
+      }
+    ],
+    "max-nested-callbacks": 0,
+    "new-cap": 0,
+    "new-parens": 2,
+    "no-array-constructor": 2,
+    "no-inline-comments": 1,
+    "no-lonely-if": 1,
+    "no-mixed-spaces-and-tabs": 2,
+    "no-multiple-empty-lines": [
+      1,
+      { "max": 2 }
+    ],
+    "no-nested-ternary": 2,
+    "no-new-object": 2,
+    "semi-spacing": [2, { "before": false, "after": true }],
+    "no-spaced-func": 2,
+    "no-ternary": 0,
+    "no-trailing-spaces": 1,
+    "no-underscore-dangle": 0,
+    "one-var": 0,
+    "operator-assignment": 0,
+    "padded-blocks": 0,
+    "quote-props": 0,
+    "quotes": [
+      2,
+      "single",
+      "avoid-escape"
+    ],
+    "semi": [
+      2,
+      "always"
+    ],
+    "sort-vars": 0,
+    "space-after-keywords": [
+      2,
+      "always"
+    ],
+    "space-before-function-paren": [
+      2,
+      "never"
+    ],
+    "space-before-blocks": [
+      2,
+      "always"
+    ],
+    "space-in-brackets": 0,
+    "space-in-parens": 0,
+    "space-infix-ops": 2,
+    "space-return-throw-case": 2,
+    "space-unary-ops": [
+      1,
+      {
+        "words": true,
+        "nonwords": false
+      }
+    ],
+    "spaced-comment": [
+      2,
+      "always",
+      { "exceptions": ["-"] }
+    ],
+    "wrap-regex": 1,
+
+    "max-depth": 0,
+    "max-len": [
+      1,
+      80,
+      2
+    ],
+    "max-params": 0,
+    "max-statements": 0,
+    "no-bitwise": 1,
+    "no-plusplus": 0,
+
+    "react/display-name": 1,
+    "react/jsx-boolean-value": [1, "always"],
+    "jsx-quotes": [1, "prefer-single"],
+    "react/jsx-no-undef": 1,
+    "react/jsx-sort-props": 1,
+    "react/jsx-uses-react": 1,
+    "react/jsx-uses-vars": 1,
+    "react/no-did-mount-set-state": 2,
+    "react/no-did-update-set-state": 2,
+    "react/no-multi-comp": 2,
+    "react/prop-types": 2,
+    "react/react-in-jsx-scope": 1,
+    "react/self-closing-comp": 1,
+    "react/wrap-multilines": 1
+  }
+}
diff --git a/.gitmodules b/.gitmodules
index 2861c5e..382c78e 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +1,6 @@
-[submodule "nap/data/kbase.wiki"]
-	path = nap/data/kbase.wiki
+[submodule "data/kbase.wiki"]
+	path = data/kbase.wiki
 	url = https://github.com/bothelpers/kbase.wiki.git
-[submodule "nap/data/fcc.wiki"]
-	path = nap/data/fcc.wiki
+[submodule "data/fcc.wiki"]
+	path = data/fcc.wiki
 	url = https://github.com/FreeCodeCamp/wiki.git
diff --git a/app.js b/app.js
new file mode 100644
index 0000000..8455021
--- /dev/null
+++ b/app.js
@@ -0,0 +1,40 @@
+'use strict';
+
+require('dotenv').config({path: 'dot.env'});
+
+console.log('--------------- startup ------------------');
+
+if (typeof Map !== 'function' ) {
+  throw new Error('ES6 is required; add --harmony');
+}
+
+const express = require('express'),
+      port = process.env.PORT || 7891,
+      passport = require('./lib/gitter/passportModule'),
+      GBot = require('./lib/bot/GBot'),
+      routes = require('./lib/app/routes.js'),
+      path = require('path');
+
+const app = express();
+
+// Middlewares
+app.set('view engine', 'jade');
+app.set('views', path.join(__dirname, '/views'));
+app.use(express.json());
+app.use(express.urlencoded());
+app.use(express.static(path.join(__dirname, '/public')));
+app.use(express.bodyParser());
+app.use(express.methodOverride());
+app.use(express.cookieParser());
+app.use(express.session({
+  secret: 'keyboard cat'
+}));
+app.use(passport.initialize());
+app.use(passport.session());
+app.use(app.router);
+
+GBot.init();
+routes.init(app, GBot, passport);
+
+app.listen(port);
+console.log('Demo app running at http://localhost:' + port);
diff --git a/bin/.gitignore b/bin/.gitignore
new file mode 100644
index 0000000..b9ac4fa
--- /dev/null
+++ b/bin/.gitignore
@@ -0,0 +1,3 @@
+credentials*
+!credentials-example.sh
+!credentials-demobot.sh
diff --git a/bin/auth.sh b/bin/auth.sh
new file mode 100755
index 0000000..2dbb524
--- /dev/null
+++ b/bin/auth.sh
@@ -0,0 +1,15 @@
+source bin/credentials.sh
+
+# this doesnt seem to work
+# https://developer.gitter.im/docs/authentication
+
+
+set -x
+echo "client_id=${GITTER_APP_KEY}\n"
+
+curl -i -X POST https://gitter.im/login/oauth/token \
+  -d"client_id=${GITTER_APP_KEY}" \
+  -d"client_secret=${GITTER_APP_SECRET}" \
+  -d"code=CODE" \
+  -d"grant_type=authorization_code" \
+  -d"redirect_uri=${GITTER_APP_REDIRECT_URL}"
\ No newline at end of file
diff --git a/bin/camperbot-run.sh b/bin/camperbot-run.sh
new file mode 100755
index 0000000..d816f35
--- /dev/null
+++ b/bin/camperbot-run.sh
@@ -0,0 +1,15 @@
+
+
+
+source bin/credentials-camperbot.sh
+
+set -x
+
+SERVER_ENV=prod \
+BOT_APP_HOST=bot.freecodecamp.com \
+GITTER_USER_TOKEN=${GITTER_USER_TOKEN} \
+GITTER_APP_KEY=${GITTER_APP_KEY} \
+GITTER_APP_SECRET=${GITTER_APP_SECRET} \
+LOG_LEVEL=10 \
+PORT=7891 \
+    nodemon -x iojs app.js
diff --git a/bin/credentials-demobot.sh b/bin/credentials-demobot.sh
new file mode 100644
index 0000000..12684ad
--- /dev/null
+++ b/bin/credentials-demobot.sh
@@ -0,0 +1,15 @@
+#!/usr/bin/env bash
+# get these keys from here
+# https://developer.gitter.im/apps
+
+# Personal Access Token
+GITTER_USER_TOKEN=1ac342045f5a57d99fe537e58da78f6cba94f7db
+
+# Your Apps
+# OAUTH KEY
+GITTER_APP_KEY=63ece8ac0eeed9b17b1cc9867f65d4857ec6e5fc
+
+# OAUTH SECRET
+GITTER_APP_SECRET=9026e3b3a74357035ee15a9591f31b2de5cfd3a6
+# REDIRECT URL
+GITTER_APP_REDIRECT_URL=http://localhost:7891/login/callback
diff --git a/bin/credentials-example.sh b/bin/credentials-example.sh
new file mode 100644
index 0000000..e1047a7
--- /dev/null
+++ b/bin/credentials-example.sh
@@ -0,0 +1,12 @@
+# edit this file and save it as credentials.sh
+# 
+# or, create a new file like credentials-ENV.sh
+# and symlink it
+# $ ln -s credentials-ENV.sh credentials.sh
+# this file is included in other run commands
+
+GITTER_APP_KEY=XXXX
+GITTER_APP_SECRET=XXXX
+GITTER_APP_REDIRECT_URL=http://localhost:7000/login/callback
+
+GITTER_USER_TOKEN=XXXX
diff --git a/bin/debug.sh b/bin/debug.sh
new file mode 100755
index 0000000..0f43fcf
--- /dev/null
+++ b/bin/debug.sh
@@ -0,0 +1,21 @@
+open "http://localhost:8080/?ws=localhost:8080&port=5858" &
+
+source bin/credentials-bothelp.sh
+
+set -x
+
+SERVER_ENV=${SERVER_ENV} \
+GITTER_USER_TOKEN=${GITTER_USER_TOKEN} \
+GITTER_APP_KEY=${GITTER_APP_KEY} \
+GITTER_APP_SECRET=${GITTER_APP_SECRET} \
+LOG_LEVEL=10 \
+PORT=7891 \
+    node-debug -x iojs app.js
+
+    # iojs debug app.js
+
+    # node-debug --harmony app.js
+    # nodemon -x iojs app.js
+    # nodemon --harmony app.js
+    # node-debug --harmony app.js
+
diff --git a/bin/deploy.sh b/bin/deploy.sh
new file mode 100755
index 0000000..7bf6829
--- /dev/null
+++ b/bin/deploy.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+
+set -x
+bin/wiki-update.sh
+ssh freecodecamp@104.131.2.16 "cd /home/freecodecamp/www/gitterbot/nap && \
+    git clean -f && \
+    git checkout . && \
+    git pull && \
+    pm2 restart all"
+
+
+    # bin/pm2-update.sh"
diff --git a/bin/force-update.sh b/bin/force-update.sh
new file mode 100755
index 0000000..aadeaf8
--- /dev/null
+++ b/bin/force-update.sh
@@ -0,0 +1,9 @@
+git checkout .
+git clean -f
+git reset --hard HEAD
+
+# we need to remove the /wiki directory
+# to avoid git conflicts
+rm -rf data/wiki/*md
+
+git pull
diff --git a/bin/git-clean.sh b/bin/git-clean.sh
new file mode 100755
index 0000000..bddf79c
--- /dev/null
+++ b/bin/git-clean.sh
@@ -0,0 +1,2 @@
+git reset --hard HEAD
+git clean -f
diff --git a/bin/mocha-debug.sh b/bin/mocha-debug.sh
new file mode 100755
index 0000000..204f691
--- /dev/null
+++ b/bin/mocha-debug.sh
@@ -0,0 +1,11 @@
+open "http://localhost:8080/?ws=localhost:8080&port=5858" &
+
+source bin/credentials.sh
+
+set -x
+
+GITTER_USER_TOKEN=${GITTER_USER_TOKEN} \
+    GITTER_APP_KEY=${GITTER_APP_KEY} \
+    GITTER_APP_SECRET=${GITTER_APP_SECRET} \
+    mocha --debug-brk --harmony
+
diff --git a/bin/pm2-run.sh b/bin/pm2-run.sh
new file mode 100755
index 0000000..685db93
--- /dev/null
+++ b/bin/pm2-run.sh
@@ -0,0 +1,22 @@
+
+
+
+
+source bin/credentials-camperbot.sh
+
+set -x
+
+SERVER_ENV=prod \
+GITTER_USER_TOKEN=${GITTER_USER_TOKEN} \
+GITTER_APP_KEY=${GITTER_APP_KEY} \
+GITTER_APP_SECRET=${GITTER_APP_SECRET} \
+LOG_LEVEL=10 \
+PORT=7891 \
+    pm2 start --name bot --interpreter iojs  app.js
+
+    # iojs app.js
+    # node --harmony app.js
+    # nodemon -x iojs app.js
+
+pm2 list
+pm2 logs all
diff --git a/bin/pm2-update.sh b/bin/pm2-update.sh
new file mode 100755
index 0000000..a93bc10
--- /dev/null
+++ b/bin/pm2-update.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+set -x
+
+approot="/home/freecodecamp/www/gitterbot/nap"
+logpath="${approot}/logs/bot.log"
+
+git pull && pm2 restart all && pm2 logs > $logpath &&
+tail -f $logpath
diff --git a/bin/post.sh b/bin/post.sh
new file mode 100755
index 0000000..80918b6
--- /dev/null
+++ b/bin/post.sh
@@ -0,0 +1,9 @@
+source bin/credentials.sh
+
+BOTZYROOM="55b1a9030fc9f982beaac901"
+
+curl -X POST -i -H "Content-Type: application/json" \
+    -H "Accept: application/json" \
+    -H "Authorization: Bearer ${GITTER_USER_TOKEN}" \
+    "https://api.gitter.im/v1/rooms/${BOTZYROOM}/chatMessages" \
+    -d '{"text":"curl test"}'
diff --git a/bin/run.sh b/bin/run.sh
new file mode 100755
index 0000000..b8a0fd9
--- /dev/null
+++ b/bin/run.sh
@@ -0,0 +1,20 @@
+
+
+# bin/update-wiki.sh
+
+#source bin/credentials-bothelp.sh
+
+#set -x
+#
+#SERVER_ENV=local \
+#GITTER_USER_TOKEN=${GITTER_USER_TOKEN} \
+#GITTER_APP_KEY=${GITTER_APP_KEY} \
+#GITTER_APP_SECRET=${GITTER_APP_SECRET} \
+#LOG_LEVEL=10 \
+#PORT=7891 \
+
+# nodemon -x --harmony iojs app.js
+
+    # nodemon --harmony app.js
+
+nodemon --harmony app.js
\ No newline at end of file
diff --git a/bin/step-debug.sh b/bin/step-debug.sh
new file mode 100755
index 0000000..e77733a
--- /dev/null
+++ b/bin/step-debug.sh
@@ -0,0 +1,17 @@
+# open "http://localhost:8080/?ws=localhost:8080&port=5858" &
+
+source bin/credentials-bothelp.sh
+
+set -x
+
+SERVER_ENV=${SERVER_ENV} \
+GITTER_USER_TOKEN=${GITTER_USER_TOKEN} \
+GITTER_APP_KEY=${GITTER_APP_KEY} \
+GITTER_APP_SECRET=${GITTER_APP_SECRET} \
+LOG_LEVEL=10 \
+PORT=7891 \
+    node-debug --harmony app.js
+    # iojs debug app.js
+    # nodemon -x iojs app.js
+    # nodemon --harmony app.js
+
diff --git a/bin/update-run-dev.sh b/bin/update-run-dev.sh
new file mode 100755
index 0000000..7454d4e
--- /dev/null
+++ b/bin/update-run-dev.sh
@@ -0,0 +1,3 @@
+# 
+bin/update-wiki.sh
+bin/run-dev-bothelp.sh
\ No newline at end of file
diff --git a/bin/wiki-pull-prod.sh b/bin/wiki-pull-prod.sh
new file mode 100755
index 0000000..203c617
--- /dev/null
+++ b/bin/wiki-pull-prod.sh
@@ -0,0 +1,22 @@
+# pull down wiki files
+# don't commit them back
+# just used on prod server
+# 
+# used on the production server only
+
+APPDIR=/home/freecodecamp/www/gitterbot/nap
+
+GITPATH=/usr/bin/git
+
+
+cd $APPDIR/data/fcc.wiki
+$GITPATH fetch
+$GITPATH checkout master
+$GITPATH pull origin master
+cd $APPDIR
+
+rm $APPDIR/data/wiki/*
+
+cp $APPDIR/data/fcc.wiki/*md $APPDIR/data/wiki
+
+
diff --git a/bin/wiki-pull.sh b/bin/wiki-pull.sh
new file mode 100755
index 0000000..c24f7ec
--- /dev/null
+++ b/bin/wiki-pull.sh
@@ -0,0 +1,17 @@
+# pull down wiki files
+# don't commit them back
+# just used on prod server
+
+# set -x
+
+cd data/fcc.wiki
+git fetch
+# git checkout master
+git pull origin master
+cd ../..
+
+rm data/wiki/*
+
+cp data/fcc.wiki/*md data/wiki
+
+
diff --git a/bin/wiki-update.sh b/bin/wiki-update.sh
new file mode 100755
index 0000000..e5ca66e
--- /dev/null
+++ b/bin/wiki-update.sh
@@ -0,0 +1,17 @@
+# pull down wiki files
+
+cd data/fcc.wiki
+git fetch
+git checkout master
+git pull origin master
+cd ../..
+
+rm data/wiki/*
+
+cp data/fcc.wiki/*md data/wiki
+
+git add data/wiki
+git commit -am "wiki update and merge"
+git fetch 
+git push -u
+
diff --git a/config/AppConfig.js b/config/AppConfig.js
new file mode 100644
index 0000000..3c0cab8
--- /dev/null
+++ b/config/AppConfig.js
@@ -0,0 +1,141 @@
+'use strict';
+
+const _ = require('lodash');
+
+const AppConfig = {
+  clientId: process.env.GITTER_APP_KEY,
+  token: process.env.GITTER_USER_TOKEN,
+  apiKey: process.env.FCC_API_KEY,
+  supportDmRooms: false,
+  botname: null,
+  roomId: '55b1a9030fc9f982beaac901',
+  org: 'bothelp',
+  testUser: 'bothelp',
+  // so bot doesnt get in a loop replying itself
+  botlist: ['bothelp', 'camperbot', 'YOUR_GITHUB_ID', 'demobot'],
+  webuser: 'webuser',
+  wikiHost: 'https://github.com/freecodecamp/freecodecamp/wiki/',
+  gitterHost: 'https://gitter.im/',
+  botVersion: '0.0.11',
+  MAX_WIKI_LINES: 20,
+  botNoiseLevel: 1,
+
+  init: function() {
+    const serverEnv = process.env.SERVER_ENV;
+    AppConfig.serverEnv = serverEnv;
+    this.warn('AppConfig.init serverEnv:', serverEnv);
+
+    const thisConfig = envConfigs[serverEnv];
+    if (!thisConfig) {
+      const msg = ('FATAL ERROR! cant find serverEnv: ' + serverEnv);
+      console.error(msg);
+      throw new Error(msg);
+    }
+    _.merge(AppConfig, thisConfig);
+  },
+
+  showConfig: function() {
+    console.log('AppConfig');
+    Object.keys(AppConfig)
+    .sort()
+    .forEach(v => {
+      if (typeof AppConfig[v] !== 'function') {
+        console.log('\t', v, ':\t\t', AppConfig[v]);
+      }
+    });
+  },
+
+  warn: function(msg, obj) {
+    console.warn('WARN> AppConfig', msg, obj);
+  },
+
+  // TODO cleanup
+  // use as a function so it can be set at startup
+  // before other code calls it at runtime
+  getBotName: function() {
+    if (!AppConfig.botname) {
+      AppConfig.init();
+      this.warn('getBotName()', AppConfig.botname );
+      console.log('tried to call botname before it was set');
+    }
+    return AppConfig.botname;
+  },
+
+  who: function(req) {
+    let who;
+
+    if (req.user) {
+      console.warn('got a user in the request but ignoring');
+    } else if (req.who) {
+      who = req.who;
+    } else {
+      who = AppConfig.webuser;
+    }
+    return who;
+  },
+
+  // TODO read from config file for dev/live modes and running env
+  getOrg: function() {
+    return AppConfig.org;
+  },
+
+  topicDmUri: function(topic) {
+    let uri = AppConfig.appHost + '/go?dm=y&room=' + AppConfig.getBotName();
+    if (topic) {
+        uri += '&topic=' + topic;
+    }
+    return uri;
+  },
+
+  dmLink: function() {
+    return 'https://gitter.im/' + AppConfig.getBotName();
+  }
+};
+
+const envConfigs = {
+
+  // replace this with your own ID
+  YOUR_GITHUB_ID: {
+    botname: 'YOUR_GITHUB_ID',
+    appHost: 'http://localhost:7000',
+    apiServer: 'freecodecamp.com',
+    appRedirectUrl: 'http://localhost:7891/login/callback'
+  },
+
+  demobot: {
+    botname: 'demobot',
+    appHost: 'http://localhost:7000',
+    apiServer: 'www.freecodecamp.com',
+    appRedirectUrl: 'http://localhost:7891/login/callback'
+  },
+
+  test: {
+    botname: 'bothelp',
+    appHost: 'http://localhost:7000',
+    apiServer: 'www.freecodecamp.com',
+    appRedirectUrl: 'http://localhost:7891/login/callback'
+  },
+
+  local: {
+    botname: 'bothelp',
+    appHost: 'http://localhost:7000',
+    apiServer: 'www.freecodecamp.com',
+    appRedirectUrl: 'http://localhost:7891/login/callback'
+  },
+  beta: {
+    botname: 'bothelp',
+    appHost: 'http://localhost:7000',
+    apiServer: 'beta.freecodecamp.com',
+    appRedirectUrl: 'http://localhost:7891/login/callback'
+  },
+  prod: {
+    botname: 'camperbot',
+    appHost: 'http://bot.freecodecamp.com',
+    apiServer: 'www.freecodecamp.com',
+    appRedirectUrl: 'http://bot.freecodecamp.com/login/callback'
+  }
+};
+
+AppConfig.init();
+
+module.exports = AppConfig;
diff --git a/config/Settings.js b/config/Settings.js
new file mode 100644
index 0000000..abb0776
--- /dev/null
+++ b/config/Settings.js
@@ -0,0 +1,7 @@
+'use strict';
+
+const Settings = {
+  MAX_WIKI_LINES: 10
+};
+
+module.exports = Settings;
diff --git a/data/RoomData.js b/data/RoomData.js
new file mode 100644
index 0000000..6443321
--- /dev/null
+++ b/data/RoomData.js
@@ -0,0 +1,231 @@
+'use strict';
+
+// This file needs to be edited to comment out
+// rooms you want to join
+
+// TODO - move to lib/ dir?
+
+const AppConfig = require('../config/AppConfig');
+
+// from the webapp
+// users enter the rooms with a topic=XXX url
+// we find a matching room here with that topic
+// and redirect them
+
+// TODO - read this from the JSON file
+const bonfireTopics = [
+  'bonfires',
+  'Pair Program on Bonfires',
+  'Meet Bonfire',
+  'Reverse a String',
+  'Factorialize a Number',
+  'Check for Palindromes',
+  'Find the Longest Word in a String',
+  'Title Case a Sentence',
+  'Return Largest Numbers in Arrays',
+  'Confirm the Ending',
+  'Repeat a string repeat a string',
+  'Truncate a string',
+  'Chunky Monkey',
+  'Slasher Flick',
+  'Mutations',
+  'Falsey Bouncer',
+  'Where art thou',
+  'Seek and Destroy',
+  'Where do I belong',
+  'Sum All Numbers in a Range',
+  'Diff Two Arrays',
+  'Roman Numeral Converter',
+  'Search and Replace',
+  'Pig Latin',
+  'DNA Pairing',
+  'Missing letters',
+  'Boo who',
+  'Sorted Union',
+  'Convert HTML Entities',
+  'Spinal Tap Case',
+  'Sum All Odd Fibonacci Numbers',
+  'Sum All Primes',
+  'Smallest Common Multiple',
+  'Finders Keepers',
+  'Drop it',
+  'Steamroller',
+  'Binary Agents',
+  'Everything Be True',
+  'Arguments Optional'
+];
+
+const bonfireDashedNames = [
+  'bonfire-meet-bonfire',
+  'bonfire-reverse-a-string',
+  'bonfire-factorialize-a-number',
+  'bonfire-check-for-palindromes',
+  'bonfire-find-the-longest-word-in-a-string',
+  'bonfire-title-case-a-sentence',
+  'bonfire-return-largest-numbers-in-arrays',
+  'bonfire-confirm-the-ending',
+  'bonfire-repeat-a-string-repeat-a-string',
+  'bonfire-truncate-a-string',
+  'bonfire-chunky-monkey',
+  'bonfire-slasher-flick',
+  'bonfire-mutations',
+  'bonfire-falsey-bouncer',
+  'bonfire-where-art-thou',
+  'bonfire-seek-and-destroy',
+  'bonfire-where-do-i-belong',
+  'bonfire-sum-all-numbers-in-a-range',
+  'bonfire-diff-two-arrays',
+  'bonfire-roman-numeral-converter',
+  'bonfire-search-and-replace',
+  'bonfire-pig-latin',
+  'bonfire-dna-pairing',
+  'bonfire-missing-letters',
+  'bonfire-boo-who',
+  'bonfire-sorted-union',
+  'bonfire-convert-html-entities',
+  'bonfire-spinal-tap-case',
+  'bonfire-sum-all-odd-fibonacci-numbers',
+  'bonfire-sum-all-primes',
+  'bonfire-smallest-common-multiple',
+  'bonfire-finders-keepers',
+  'bonfire-drop-it',
+  'bonfire-steamroller',
+  'bonfire-binary-agents',
+  'bonfire-everything-be-true',
+  'bonfire-arguments-optional',
+  'bonfire-make-a-person',
+  'bonfire-map-the-debris',
+  'bonfire-pairwise',
+  'bonfire-validate-us-telephone-numbers',
+  'bonfire-symmetric-difference',
+  'bonfire-exact-change',
+  'bonfire-inventory-update',
+  'bonfire-no-repeats-please',
+  'bonfire-friendly-date-ranges'
+];
+
+var camperBotChatRooms = [
+    'FreeCodeCamp/admin',
+    'FreeCodeCamp/camperbot',
+    'FreeCodeCamp/camperbotPlayground',
+    'FreeCodeCamp/Casual',
+    'FreeCodeCamp/CodeReview',
+    'FreeCodeCamp/CodingJobs',
+    'FreeCodeCamp/CurriculumDevelopment',
+    'FreeCodeCamp/DataScience',
+    'FreeCodeCamp/FreeCodeCamp',
+    'FreeCodeCamp/HalfWayClub',
+    'FreeCodeCamp/Help',
+    'FreeCodeCamp/HelpBasejumps',
+    'FreeCodeCamp/HelpBonfires',
+    'FreeCodeCamp/HelpContributors',
+    'FreeCodeCamp/HelpZiplines',
+    'FreeCodeCamp/LiveCoding',
+    'FreeCodeCamp/PairProgrammingWomen',
+    'FreeCodeCamp/Wiki',
+    'FreeCodeCamp/YouCanDoThis'
+];
+
+// @TODO Refactor into a room generator function
+const camperBotRooms = [camperBotChatRooms]
+  .reduce((rooms, currRooms) => rooms.concat(currRooms))
+  .map(room => { return {name: room}; });
+
+const BotRoomData = {
+  // this controls which rooms you can access
+  YOUR_GITHUB_ID: [
+    // change this to be a room your user is already in
+    {
+      title: 'bothelp',
+      name: 'YOUR_GITHUB_ID/testing',
+      icon: 'question',
+      topics: ['chitchat', 'bots', 'bot-development', 'camperbot']
+    },
+    {
+      title: 'bothelp',
+      name: 'bothelp/testing',
+      icon: 'question',
+      topics: ['chitchat', 'bots', 'bot-development', 'camperbot']
+    }
+  ],
+  // this is the demobot that ships with the app
+  demobot: [{
+    title: 'demobot',
+    name: 'demobot/test',
+    icon: 'star',
+    topics: ['getting started']
+  }],
+  // developer bot
+  bothelp: [
+    {
+      title: 'bothelp',
+      name: 'bothelp/testing',
+      icon: 'question',
+      topics: ['chitchat', 'bots', 'bot-development', 'camperbot']
+    },
+    {
+      title: 'HelpBonfires',
+      icon: 'fire',
+      name: 'bothelp/HelpBonfires',
+      topics: bonfireTopics
+    },
+    {
+      title: 'camperbot/localdev',
+      name: 'camperbot/localdev'
+    },
+    {
+      title: 'bothelpDM',
+      name: 'bothelp'
+    },
+    {
+      title: 'GeneralChat',
+      name: 'bothelp/GeneralChat'
+    },
+    {
+      title: 'PrivateRoomTest',
+      name: 'bothelp/PrivateRoomTest',
+      topics: ['general', 'intros']
+    },
+    {
+      title: 'EdaanDemo',
+      name: 'egetzel/demo',
+      topics: ['egdemo']
+    },
+    // Bonfire single rooms
+    {
+      name: 'bothelp/bonfire-factorialize-a-number',
+      topics: ['bonfire factorialize a number'],
+      isBonfire: true
+    }
+  ],
+  camperbot: camperBotRooms
+};
+
+bonfireDashedNames.map(bfName => {
+  const room = {
+    name: 'camperbot/' + bfName,
+    isBonfire: true
+  };
+  BotRoomData.camperbot.push(room);
+});
+
+BotRoomData.camperbot.map(room => {
+  room.title = room.title || room.name.split('/')[1];
+  if (room.isBonfire) {
+    room.entry = 'camperbot/testing';
+    room.topic = room.title;
+  }
+});
+
+const RoomData = {
+  rooms: function(botname) {
+    botname = botname || AppConfig.getBotName();
+    return BotRoomData[botname];
+  },
+
+  defaultRoom: function() {
+    return RoomData.rooms().rooms[0];
+  }
+};
+
+module.exports = RoomData;
diff --git a/data/rooms/RoomMessages.js b/data/rooms/RoomMessages.js
new file mode 100644
index 0000000..2fbc9bd
--- /dev/null
+++ b/data/rooms/RoomMessages.js
@@ -0,0 +1,107 @@
+'use strict';
+
+// the users input is scanned for these keywords
+// and can trigger the messages below
+// chance controls the frequency the result will be echoed back by the camper
+
+// using js rather than json so we can have functions and comments
+
+const BotCommands = require('../../lib/bot/BotCommands'),
+      _ = require('lodash'),
+      Utils = require('../../lib/utils/Utils');
+
+
+// TODO - add these to all of the rooms
+// this is easier for people to add content to
+// as they don't have to add to two lists
+const AllRoomMessages = [
+  {
+    regex: /.*help.*bonfire:?s?/i,
+    text: ' > type `bonfire name` to get some info on that bonfire. ' +
+          'And check [HelpBonfires chatroom]' +
+          '(https://gitter.im/FreeCodeCamp/HelpBonfires)',
+    not: 'freecodecamp/HelpBonfires'
+  },
+
+  {
+    regex: /botx/i,
+    text: '> you called?'
+  },
+
+  {
+    regex: /\btroll\b/i,
+    text: '> :trollface: troll problems? [notify admins here]' +
+          '(https://gitter.im/freecodecamp/admins)'
+  },
+  {
+    regex: /allyourbase/,
+    text: '![all your base]' +
+          '(https://files.gitter.im/FreeCodeCamp/CoreTeam/Bw51/imgres.jpg)'
+  },
+  {
+    regex: /'''/,
+    text: '> :bulb: to format code use backticks! ``` [more info]' +
+          '(https://github.com/freecodecamp/freecodecamp/wiki/code-formatting)'
+  },
+  {
+    regex: /holler/i,
+    text: '> holler back!',
+    // only say this 50% of the time
+    chance: 1
+  },
+  {
+    regex: /\bth?a?n?[xk]s?q?\b/gim,
+    func: BotCommands.thanks
+  }
+];
+
+const RoomMessages = {
+  scanInput: function(input, roomName, chance) {
+    if (Math.random() > chance) {
+       // dont always reply
+      return null;
+    }
+    const chat = input.message.model.text.toLowerCase();
+    chance = chance || 1;
+    roomName = roomName.toLowerCase();
+
+    // some messages are only for certain rooms so exclude them here
+    const thisRoomMessages = AllRoomMessages.filter(msg => {
+      if (msg.not) {
+        return (msg.not !== roomName);
+      } else {
+        return true;
+      }
+    });
+    if (!thisRoomMessages) { return false; }
+
+    const msgList = thisRoomMessages.filter(item => {
+      if (!item) { return null; }
+
+      if (item.regex) {
+        var flag = item.regex.test(chat);
+      }
+
+      if (flag) {
+        Utils.clog(chat, item.word, 'flag:' + flag);
+      }
+      return flag;
+    });
+
+    // now check if chance is high enough
+    if (msgList.length > 0) {
+      // if we have multiple messages, make sure to choose just one
+      const oneMessage = _.sample(msgList);
+      // check if the chance is high enough so we can have % of time messages
+      chance = oneMessage.chance || 1;
+      if (Math.random() < (chance)) {
+        // we have a winner!
+        return oneMessage;
+      }
+    } else {
+      return null;
+    }
+  }
+};
+
+module.exports = RoomMessages;
diff --git a/data/seed/bonfireMDNlinks.js b/data/seed/bonfireMDNlinks.js
new file mode 100644
index 0000000..e367a71
--- /dev/null
+++ b/data/seed/bonfireMDNlinks.js
@@ -0,0 +1,93 @@
+/* eslint-disable */
+// Copied from
+// https://github.com/FreeCodeCamp/freecodecamp/blob/staging/seed/bonfireMDNlinks.js
+
+// MDN Links
+
+/* These links are for Bonfires. Each key/value pair is used to render a Bonfire with appropriate links.
+
+
+ The text of the key is what the link text will be, e.g. <a href="https://developer ...">Global Array Object</a>
+ General convention is to use the page title of the MDN reference page.
+ */
+var links = {
+  // ========= NON MDN REFS
+  "Currying": "https://leanpub.com/javascript-allonge/read#pabc",
+  "Smallest Common Multiple": "https://www.mathsisfun.com/least-common-multiple.html",
+  "Permutations": "https://www.mathsisfun.com/combinatorics/combinations-permutations.html",
+  "HTML Entities": "http://dev.w3.org/html5/html-author/charref",
+  "Symmetric Difference": "https://www.youtube.com/watch?v=PxffSUQRkG4",
+
+  // ========= GLOBAL OBJECTS
+  "Global Array Object": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array",
+  "Global Object": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object",
+  "Global String Object": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String",
+  "Boolean Objects": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean",
+  "RegExp": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp",
+  "Global Function Object": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function",
+  "Arguments object": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments",
+  "Closures": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures",
+
+  // ========= GLOBAL OBJECT METHODS
+  "parseInt()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt",
+
+  // =========  PROPERTIES/MISC
+  "String.length": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length",
+
+  // ========== OBJECT METHODS
+  "Object.getOwnPropertyNames()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames",
+  "Object.keys()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys",
+  "Object.hasOwnProperty()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty",
+
+  // ======== STRING METHODS
+  "String.charAt()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt",
+  "String.charCodeAt()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt",
+  "String.concat()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/concat",
+  "String.indexOf()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf",
+  "String.fromCharCode()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode",
+  "String.lastIndexOf()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf",
+  "String.match()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match",
+  "String.replace()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace",
+  "String.slice()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice",
+  "String.split()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split",
+  "String.substring()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring",
+  "String.substr()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr",
+  "String.toLowerCase()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase",
+  "String.toString()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toString",
+  "String.toUpperCase()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase",
+
+  // ======== ARRAY METHODS
+  "Array.concat()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat",
+  "Array.every()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every",
+  "Array.filter()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter",
+  "Array.forEach()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach",
+  "Array.indexOf()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf",
+  "Array.isArray()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray",
+  "Array.join()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join",
+  "Array.lastIndexOf()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf",
+  "Array.map()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map",
+  "Array.pop()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop",
+  "Array.push()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push",
+  "Array.reduce()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce",
+  "Array.reverse()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse",
+  "Array.shift()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift",
+  "Array.slice()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice",
+  "Array.some()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some",
+  "Array.sort()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort",
+  "Array.splice()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice",
+  "Array.toString()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toString",
+
+  // ======== MATH METHODS
+  "Math.max()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max",
+  "Math.min()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min",
+  "Math.pow()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow",
+  "Remainder": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder_(.25)",
+
+  // ======== GENERAL JAVASCRIPT REFERENCES
+  "Arithmetic Operators": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators",
+  "Comparison Operators": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators",
+  "Details of the Object Model": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model",
+  "For Loops": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for"
+};
+
+module.exports = links;
diff --git a/data/seed/challenges/advanced-bonfires.json b/data/seed/challenges/advanced-bonfires.json
new file mode 100644
index 0000000..c071bfb
--- /dev/null
+++ b/data/seed/challenges/advanced-bonfires.json
@@ -0,0 +1,139 @@
+{
+  "name": "Advanced Algorithm Scripting",
+  "order": 0.011,
+  "challenges": [
+    {
+      "id": "a2f1d72d9b908d0bd72bb9f6",
+      "name": "Bonfire: Make a Person",
+      "dashedName": "bonfire-make-a-person",
+      "difficulty": "3.01",
+      "description": [
+        "Fill in the object constructor with the methods specified in the tests.",
+        "Those methods are getFirstName(), getLastName(), getFullName(), setFirstName(first), setLastName(last), and setFullName(firstAndLast).",
+        "All functions that take an argument have an arity of 1, and the argument will be a string.",
+        "These methods must be the only available means for interacting with the object.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "var Person = function(firstAndLast) {",
+        "    return firstAndLast;",
+        "};",
+        "",
+        "var bob = new Person('Bob Ross');",
+        "bob.getFullName();"
+      ],
+      "tests": [
+        "expect(Object.keys(bob).length).to.eql(6);",
+        "expect(bob instanceof Person).to.be.true;",
+        "expect(bob.firstName).to.be.undefined();",
+        "expect(bob.lastName).to.be.undefined();",
+        "expect(bob.getFirstName()).to.eql('Bob');",
+        "expect(bob.getLastName()).to.eql('Ross');",
+        "expect(bob.getFullName()).to.eql('Bob Ross');",
+        "bob.setFirstName('Happy');",
+        "expect(bob.getFirstName()).to.eql('Happy');",
+        "bob.setLastName('Trees');",
+        "expect(bob.getLastName()).to.eql('Trees');",
+        "bob.setFullName('George Carlin');",
+        "expect(bob.getFullName()).to.eql('George Carlin');",
+        "bob.setFullName('Bob Ross');"
+      ],
+      "MDNlinks": [
+        "Closures",
+        "Details of the Object Model"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "af4afb223120f7348cdfc9fd",
+      "name": "Bonfire: Map the Debris",
+      "dashedName": "bonfire-map-the-debris",
+      "difficulty": "3.02",
+      "description": [
+        "Return a new array that transforms the element's average altitude into their orbital periods.",
+        "The array will contain objects in the format <code>{name: 'name', avgAlt: avgAlt}</code>.",
+        "You can read about orbital periods <a href=\"http://en.wikipedia.org/wiki/Orbital_period\" target='_blank'>on wikipedia</a>.",
+        "The values should be rounded to the nearest whole number. The body being orbited is Earth.",
+        "The radius of the earth is 6367.4447 kilometers, and the GM value of earth is 398600.4418",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function orbitalPeriod(arr) {",
+        "  var GM = 398600.4418;",
+        "  var earthRadius = 6367.4447;",
+        "  return arr;",
+        "}",
+        "",
+        "orbitalPeriod([{name : \"sputnik\", avgAlt : 35873.5553}]);"
+      ],
+      "tests": [
+        "expect(orbitalPeriod([{name : \"sputnik\", avgAlt : 35873.5553}])).to.eqls([{name: \"sputnik\", orbitalPeriod: 86400}]);",
+        "expect(orbitalPeriod([{name: \"iss\", avgAlt: 413.6}, {name: \"hubble\", avgAlt: 556.7}, {name: \"moon\", avgAlt: 378632.553}])).to.eqls([{name : \"iss\", orbitalPeriod: 5557}, {name: \"hubble\", orbitalPeriod: 5734}, {name: \"moon\", orbitalPeriod: 2377399}]);"
+      ],
+      "MDNlinks": [
+        "Math.pow()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a3f503de51cfab748ff001aa",
+      "name": "Bonfire: Pairwise",
+      "dashedName": "bonfire-pairwise",
+      "difficulty": "3.03",
+      "description": [
+        "Return the sum of all indices of elements of 'arr' that can be paired with one other element to form a sum that equals the value in the second argument 'arg'. If multiple sums are possible, return the smallest sum. Once an element has been used, it cannot be reused to pair with another.",
+        "For example, pairwise([1, 4, 2, 3, 0, 5], 7) should return 11 because 4, 2, 3 and 5 can be paired with each other to equal 7.",
+        "pairwise([1, 3, 2, 4], 4) would only equal 1, because only the first two elements can be paired to equal 4, and the first element has an index of 0!",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function pairwise(arr, arg) {",
+        "  return arg;",
+        "}",
+        "",
+        "pairwise([1,4,2,3,0,5], 7);"
+      ],
+      "tests": [
+        "expect(pairwise([1, 4, 2, 3, 0, 5], 7)).to.equal(11);",
+        "expect(pairwise([1, 3, 2, 4], 4)).to.equal(1);",
+        "expect(pairwise([1,1,1], 2)).to.equal(1);",
+        "expect(pairwise([0, 0, 0, 0, 1, 1], 1)).to.equal(10);",
+        "expect(pairwise([], 100)).to.equal(0);"
+      ],
+      "MDNlinks": [
+        "Array.reduce()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    }
+  ]
+}
diff --git a/data/seed/challenges/basejumps.json b/data/seed/challenges/basejumps.json
new file mode 100644
index 0000000..137e679
--- /dev/null
+++ b/data/seed/challenges/basejumps.json
@@ -0,0 +1,240 @@
+{
+  "name": "Full Stack JavaScript Projects",
+  "order": 0.019,
+  "challenges": [
+    {
+      "id": "bd7158d8c443eddfaeb5bcef",
+      "name": "Waypoint: Get Set for Basejumps",
+      "dashedName": "waypoint-get-set-for-basejumps",
+      "difficulty": 2.00,
+      "challengeSeed": ["128451852"],
+      "description": [
+        "<span class='text-info'>Objective:</span> Get the MEAN stack running on Cloud 9, push your code to GitHub, and deploy it to Heroku.",
+        "We'll build our Basejumps on Cloud 9, a powerful online code editor with a full Ubuntu Linux workspace, all running in the cloud.",
+        "If you don't already have Cloud 9 account, create one now at <a href='http://c9.io' target='_blank'>http://c9.io</a>.",
+        "Now let's get your development environment ready for a new Angular-Fullstack application provided by Yeoman.",
+        "Open up <a href='http://c9.io' target='_blank'>http://c9.io</a> and sign in to your account.",
+        "Click on Create New Workspace at the top right of the c9.io page, then click on the \"Create a new workspace\" popup that appears below it the button after you click on it.",
+        "Give your workspace a name.",
+        "Choose Node.js in the selection area below the name field.",
+        "Click the Create button. Then click into your new workspace.",
+        "In the lower right hand corner you should see a terminal window. In this window use the following commands. You don't need to know what these mean at this point.",
+        "Never run this command on your local machine. But in your Cloud 9 terminal window, run: <code>rm -rf * && echo \"export NODE_PATH=$NODE_PATH:/home/ubuntu/.nvm/v0.10.35/lib/node_modules\" >> ~/.bashrc && source ~/.bashrc && npm install -g yo grunt grunt-cli generator-angular-fullstack && yo angular-fullstack</code>",
+        "Yeoman will prompt you to answer some questions. Answer them like this:",
+        "What would you like to write scripts with? <span class='text-success'>JavaScript</span>",
+        "What would you like to write markup with? <span class='text-success'>HTML</span>",
+        "What would you like to write stylesheets with? <span class='text-success'>CSS</span>",
+        "What Angular router would you like to use? <span class='text-success'>ngRoute</span>",
+        "Would you like to include Bootstrap? <span class='text-success'>Yes</span>",
+        "Would you like to include UI Bootstrap? <span class='text-success'>Yes</span>",
+        "Would you like to use MongoDB with Mongoose for data modeling? <span class='text-success'>Yes</span>",
+        "Would you scaffold out an authentication boilerplate? <span class='text-success'>Yes</span>",
+        "Would you like to include additional oAuth strategies? <span class='text-success'>Twitter</span>",
+        "Would you like to use socket.io? <span class='text-success'>No</span>",
+        "May bower anonymously report usage statistics to improve the tool over time? (Y/n) <span class='text-success'>Y</span>",
+        "You may get an error similar to <code> ERR! EEXIST, open ‘/home/ubuntu/.npm</code>. This is caused when Cloud9 runs out of memory and kills an install. If you get this, simply re-run this process with the command <code>yo angular-fullstack</code>. You will then be asked a few questions regarding the re-install. Answer them as follows:",
+        "Existing .yo-rc configuration found, would you like to use it? (Y/n) <span class='text-success'>Y</span>",
+        "Overwrite client/favicon.ico? (Ynaxdh) <span class='text-success'>Y</span>",
+        "To finish the installation run the commands: <code>bower install && npm install</code>",
+        "To start MongoDB, run the following commands in your terminal: <code>mkdir data && echo 'mongod --bind_ip=$IP --dbpath=data --nojournal --rest \"$@\"' > mongod && chmod a+x mongod && ./mongod</code>",
+        "You will want to open up a new terminal to work from by clicking on the + icon and select New Terminal",
+        "Start the application by running the following command in your new terminal window: <code>grunt serve</code>",
+        "Wait for the following message to appear: <code>xdg-open: no method available for opening 'http://localhost:8080' </code>. Now you can open the internal Cloud9 browser. To launch the browser select Preview in the toolbar then select the dropdown option Preview Running Application.",
+        "Turn the folder in which your application is running into a Git repository by running the following commands: <code>git init && git add . && git commit -am 'initial commit'</code>.",
+        "Now we need to add your GitHub SSH key to c9.io. Click the \"Add-on Services\" button in the lower left of your C9 dashboard. Click \"activate\" next to the GitHub icon.",
+        "A pop up will appear. Allow access to your account.",
+        "While still on the dashboard, under “Account Settings”, click the link for \"Show your SSH key\". Copy the key to you clipboard.",
+        "Sign in to <a href='http://github.com' target='_blank'>http://github.com</a> and navigate to the GitHub SSH settings page. Click the \"Add SSH Key\". Give your key the title \"cloud 9\". Paste your SSH Key into the \"Key\" box, then click \"Add Key\".",
+        "Create a new GitHub repository by  and clicking on the + button next to your username in the upper-right hand side of your screen, then selecting \"New Repository\".",
+        "Enter a project name, then click the \"Create Repository\" button.",
+        "Find the \"...or push an existing repository from the command line\" section and click the Copy to Clipboard button beside it.",
+        "Paste the commands from your clipboard into the Cloud9 terminal prompt. This will push your changes to your repository on Cloud 9 up to GitHub.",
+        "Check back on your GitHub profile to verify the changes were successfully pushed up to GitHub.",
+        "Now let's push your code to Heroku. If you don't already have a Heroku account, create one at <a href='http://heroku.com' target='_blank'>http://heroku.com</a>. You shouldn't be charged for anything, but you will need to add your credit card information to your Heroku before you will be able to use Heroku's free MongoLab add on.",
+        "Before you publish to Heroku, you should free up as much memory as possible on Cloud9. In each of the Cloud9 terminal prompt tabs where MongoDB and Grunt are running, press the <code>control + c</code> hotkey to shut down these processes.",
+        "Run the following command in a Cloud9 terminal prompt tab: <code>npm install grunt-contrib-imagemin --save-dev && npm install --save-dev && heroku login</code>. At this point, the terminal will prompt you to log in to Heroku from the command line.",
+        "Now run <code>yo angular-fullstack:heroku</code>. You can choose a name for your Heroku project, or Heroku will create a random one for you. You can choose whether you want to deploy to servers the US or the EU.",
+        "Set the config flag for your Heroku environment and add MongoLab for your MongoDB instance by running the following command: <code>cd ~/workspace/dist && heroku config:set NODE_ENV=production && heroku addons:create mongolab</code>.",
+        "As you build your app, you should frequently commit changes to your codebase. Make sure you're in the <code>~/workspace</code> directory by running <code>cd ~/workspace</code>. Then you can this code to stage the changes to your changes and commit them: <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a short summary of the changes you made to your code, such as \"added a records controller and corresponding routes\".",
+        "You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
+        "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
+        "Now you're ready to move on to your first Basejump. Click the \"I've completed this challenge\" and move on."
+      ],
+      "challengeType": 2,
+      "tests": []
+    },
+    {
+      "id": "bd7158d8c443eddfaeb5bdef",
+      "name": "Basejump: Build a Voting App",
+      "dashedName": "basejump-build-a-voting-app",
+      "difficulty": 2.01,
+      "challengeSeed": ["133315786"],
+      "description": [
+        "<span class='text-info'>Objective:</span> Build a full stack JavaScript app that successfully reverse-engineers this: <a href='http://votingapp.herokuapp.com/' target='_blank'>http://votingapp.herokuapp.com/</a> and deploy it to Heroku.",
+        "Note that for each Basejump, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-basejumps'>http://freecodecamp.com/challenges/get-set-for-basejumps</a>.",
+        "As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.",
+        "You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
+        "Here are the specific User Stories you should implement for this Basejump:",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can keep my polls and come back later to access them.",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can share my polls with my friends.",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can see the aggregate results of my polls.",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can delete polls that I decide I don't want anymore.",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can create a poll with any number of possible items.",
+        "<span class='text-info'>Bonus User Story:</span> As an unauthenticated user, I can see everyone's polls, but I can't vote on anything.",
+        "<span class='text-info'>Bonus User Story:</span> As an unauthenticated or authenticated user, I can see the results of polls in chart form. (This could be implemented using Chart.js or Google Charts.)",
+        "<span class='text-info'>Bonus User Story:</span> As an authenticated user, if I don't like the options on a poll, I can create a new option.",
+        "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
+        "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
+        "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
+      ],
+      "challengeType": 4,
+      "tests": [],
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "bd7158d8c443eddfaeb5bdff",
+      "name": "Basejump: Build a Nightlife Coordination App",
+      "dashedName": "basejump-build-a-nightlife-coordination-app",
+      "difficulty": 2.02,
+      "challengeSeed": ["133315781"],
+      "description": [
+        "<span class='text-info'>Objective:</span> Build a full stack JavaScript app that successfully reverse-engineers this: <a href='http://whatsgoinontonight.herokuapp.com/' target='_blank'>http://whatsgoinontonight.herokuapp.com/</a> and deploy it to Heroku.",
+        "Note that for each Basejump, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-basejumps'>http://freecodecamp.com/challenges/get-set-for-basejumps</a>.",
+        "As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.",
+        "You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
+        "Here are the specific User Stories you should implement for this Basejump:",
+        "<span class='text-info'>User Story:</span> As an unauthenticated user, I can view all bars in my area.",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can add myself to a bar to indicate I am going there tonight.",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can remove myself from a bar if I no longer want to go there.",
+        "<span class='text-info'>Bonus User Story:</span> As an unauthenticated user, when I login I should not have to search again.",
+        "<span class='text-info'>Hint:</span> Try using the <a href='https://www.yelp.com/developers/documentation/v2/overview' target='_blank'>Yelp API</a> to find venues in the cities your users search for.",
+        "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
+        "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
+        "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
+      ],
+      "challengeType": 4,
+      "tests": [],
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "bd7158d8c443eddfaeb5bd0e",
+      "name": "Basejump: Chart the Stock Market",
+      "dashedName": "basejump-chart-the-stock-market",
+      "difficulty": 2.03,
+      "challengeSeed": ["133315787"],
+      "description": [
+        "<span class='text-info'>Objective:</span> Build a full stack JavaScript app that successfully reverse-engineers this: <a href='http://stockstream.herokuapp.com/' target='_blank'>http://stockstream.herokuapp.com/</a> and deploy it to Heroku.",
+        "Note that for each Basejump, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-basejumps'>http://freecodecamp.com/challenges/get-set-for-basejumps</a>.",
+        "As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.",
+        "You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
+        "Here are the specific User Stories you should implement for this Basejump:",
+        "<span class='text-info'>User Story:</span> As a user, I can view a graph displaying the recent trend lines for each added stock.",
+        "<span class='text-info'>User Story:</span> As a user, I can add new stocks by their symbol name.",
+        "<span class='text-info'>User Story:</span> As a user, I can remove stocks.",
+        "<span class='text-info'>Bonus User Story:</span> As a user, I can see changes in real-time when any other user adds or removes a stock.",
+        "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
+        "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
+        "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
+      ],
+      "challengeType": 4,
+      "tests": [],
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "bd7158d8c443eddfaeb5bd0f",
+      "name": "Basejump: Manage a Book Trading Club",
+      "dashedName": "basejump-manage-a-book-trading-club",
+      "difficulty": 2.04,
+      "challengeSeed": ["133316032"],
+      "description": [
+        "<span class='text-info'>Objective:</span> Build a full stack JavaScript app that successfully reverse-engineers this: <a href='http://bookjump.herokuapp.com/' target='_blank'>http://bookjump.herokuapp.com/</a> and deploy it to Heroku.",
+        "Note that for each Basejump, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-basejumps'>http://freecodecamp.com/challenges/get-set-for-basejumps</a>.",
+        "As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.",
+        "You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
+        "Here are the specific User Stories you should implement for this Basejump:",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can view all books posted by every user.",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can add a new book.",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can update my settings to store my full name, city, and state.",
+        "<span class='text-info'>Bonus User Story:</span> As an authenticated user, I can propose a trade and wait for the other user to accept the trade.",
+        "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
+        "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
+        "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
+      ],
+      "challengeType": 4,
+      "tests": [],
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "bd7158d8c443eddfaeb5bdee",
+      "name": "Basejump: Build a Pinterest Clone",
+      "dashedName": "basejump-build-a-pinterest-clone",
+      "difficulty": 2.05,
+      "challengeSeed": ["133315784"],
+      "description": [
+        "<span class='text-info'>Objective:</span> Build a full stack JavaScript app that successfully reverse-engineers this: <a href='http://stark-lowlands-3680.herokuapp.com/' target='_blank'>http://stark-lowlands-3680.herokuapp.com/</a> and deploy it to Heroku.",
+        "Note that for each Basejump, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-basejumps'>http://freecodecamp.com/challenges/get-set-for-basejumps</a>.",
+        "As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.",
+        "You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
+        "Here are the specific User Stories you should implement for this Basejump:",
+        "<span class='text-info'>User Story:</span> As an unauthenticated user, I can login with Twitter.",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can link to images.",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can delete images that I've linked to.",
+        "<span class='text-info'>User Story:</span> As an authenticated user, I can see a Pinterest-style wall of all the images I've linked to.",
+        "<span class='text-info'>User Story:</span> As an unauthenticated user, I can browse other users' walls of images.",
+        "<span class='text-info'>Bonus User Story:</span> As an authenticated user, if I upload an image that is broken, it will be replaced by a placeholder image. (can use jQuery broken image detection)",
+        "<span class='text-info'>Hint:</span> <a href='http://masonry.desandro.com/' target='_blank'>Masonry.js</a> is a library that allows for Pinterest-style image grids.",
+        "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
+        "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
+        "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
+      ],
+      "challengeType": 4,
+      "tests": [],
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    }
+  ]
+}
diff --git a/data/seed/challenges/basic-bonfires.json b/data/seed/challenges/basic-bonfires.json
new file mode 100644
index 0000000..767b1e8
--- /dev/null
+++ b/data/seed/challenges/basic-bonfires.json
@@ -0,0 +1,1529 @@
+{
+  "name": "Basic Algorithm Scripting",
+  "order": 0.007,
+  "challenges": [
+    {
+      "id": "bd7139d8c441eddfaeb5bdef",
+      "name": "Waypoint: Pair Program on Bonfires",
+      "dashedName": "waypoint-pair-program-on-bonfires",
+      "difficulty": 0.44,
+      "challengeSeed": ["119657641"],
+      "description": [
+        "Please note that the video for this challenge is a little outdated, and doesn't perfectly match these steps. We plan to record a new video soon.",
+        "OK, we're finally ready to start pair programming!",
+        "Pair Programming is where two people code together on the same computer. It is an efficient way to collaborate, and widely practiced at software companies. Pair Programming is one of the core concepts of \"Agile\" Software Development, which you will hear more about later.",
+        "Many people use Skype or Google Hangouts to pair program, but if you talk with professional software engineers, they will tell you that it's not really pair programming unless both people have the ability to use the keyboard and mouse.",
+        "The most popular tool for pair programming is Screenhero. You can download Screenhero for <a href='http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjowLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLnppcD9zb3VyY2U9d2ViIn0=' target='_blank'>Mac</a> or <a href='http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjoxLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLXNldHVwLmV4ZSJ9' target='_blank'>Windows</a>. Create your new user account from within the app.",
+        "We have a special chat room for people ready to pair program. Go to our <a href='//gitter.im/FreeCodeCamp/LetsPair' target='_blank'>LetsPair chatroom on Gitter</a> and type \"Hello Pair Programmers!\"",
+        "If someone is available, they will be your \"pair\" - the person you pair programming with.",
+        "If no one gets back to you in the first few minutes, don't worry. There will be lots of opportunities to pair program in the future.",
+        "If someone does get back to you, private message them and ask for the email address they used to register Screenhero.",
+        "Add them as a new contact in Screenhero, then click the monitor-looking button to attempt to share your screen with them.",
+        "Once the Screenhero session starts, your screen's margins will glow orange. You are now sharing your screen.",
+        "Your pair will have their own cursor, and will be able to type text on his or her keyboard.",
+        "Now it's time to tackle our Bonfires. You can begin them by advancing to the next challenge.",
+        "Once you you finish pair programming, end the session in Screenhero session.",
+        "Congratulations! You have completed your first pair programming session.",
+        "Pair program as much as possible with different campers until you've completed all the Bonfire challenges. This is a big time investment, but the JavaScript practice you get will be well worth it!",
+        "Mark this Waypoint complete and move on."
+      ],
+      "challengeType": 2,
+      "tests": [],
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "ad7123c8c441eddfaeb5bdef",
+      "name": "Bonfire: Meet Bonfire",
+      "dashedName": "bonfire-meet-bonfire",
+      "difficulty": "0",
+      "description": [
+        "Your goal is to fix the failing test.",
+        "First, run all the tests by clicking \"Run code\" or by pressing Control + Enter.",
+        "The failing test is in red. Fix the code so that all tests pass. Then you can move on to the next Bonfire.",
+        "Make this function return true no matter what."
+      ],
+      "tests": [
+        "expect(meetBonfire()).to.be.a(\"boolean\");",
+        "expect(meetBonfire()).to.be.true;"
+      ],
+      "challengeSeed": [
+        "function meetBonfire(argument) {",
+        "  // Good luck!",
+        "  console.log(\"you can read this function's argument in the developer tools\", argument);",
+        "",
+        "  return false;",
+        "}",
+        "",
+        "",
+        "",
+        "meetBonfire(\"You can do this!\");"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a202eed8fc186c8434cb6d61",
+      "name": "Bonfire: Reverse a String",
+      "dashedName": "bonfire-reverse-a-string",
+      "difficulty": "1.01",
+      "tests": [
+        "expect(reverseString('hello')).to.be.a('String');",
+        "expect(reverseString('hello')).to.equal('olleh');",
+        "expect(reverseString('Howdy')).to.equal('ydwoH');",
+        "expect(reverseString('Greetings from Earth')).to.equal('htraE morf sgniteerG');"
+      ],
+      "description": [
+        "Reverse the provided string.",
+        "You may need to turn the string into an array before you can reverse it.",
+        "Your result must be a string.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function reverseString(str) {",
+        "  return str;",
+        "}",
+        "",
+        "reverseString('hello');"
+      ],
+      "MDNlinks": [
+        "Global String Object",
+        "String.split()",
+        "Array.reverse()",
+        "Array.join()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a302f7aae1aa3152a5b413bc",
+      "name": "Bonfire: Factorialize a Number",
+      "dashedName": "bonfire-factorialize-a-number",
+      "tests": [
+        "expect(factorialize(5)).to.be.a(\"Number\");",
+        "expect(factorialize(5)).to.equal(120);",
+        "expect(factorialize(10)).to.equal(3628800);",
+        "expect(factorialize(20)).to.equal(2432902008176640000);"
+      ],
+      "difficulty": "1.02",
+      "description": [
+        "Return the factorial of the provided integer.",
+        "If the integer is represented with the letter n, a factorial is the product of all positive integers less than or equal to n.",
+        "Factorials are often represented with the shorthand notation n!",
+        "For example: 5! = 1 * 2 * 3 * 4 * 5 = 120f",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function factorialize(num) {",
+        "  return num;",
+        "}",
+        "",
+        "factorialize(5);"
+      ],
+      "MDNlinks": [
+        "Arithmetic Operators"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "aaa48de84e1ecc7c742e1124",
+      "name": "Bonfire: Check for Palindromes",
+      "dashedName": "bonfire-check-for-palindromes",
+      "difficulty": "1.03",
+      "description": [
+        "Return true if the given string is a palindrome. Otherwise, return false.",
+        "A palindrome is a word or sentence that's spelled the same way both forward and backward, ignoring punctuation, case, and spacing.",
+        "You'll need to remove punctuation and turn everything lower case in order to check for palindromes.",
+        "We'll pass strings with varying formats, such as \"racecar\", \"RaceCar\", and \"race CAR\" among others.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "tests": [
+        "expect(palindrome(\"eye\")).to.be.a(\"boolean\");",
+        "assert.deepEqual(palindrome(\"eye\"), true);",
+        "assert.deepEqual(palindrome(\"race car\"), true);",
+        "assert.deepEqual(palindrome(\"not a palindrome\"), false);",
+        "assert.deepEqual(palindrome(\"A man, a plan, a canal. Panama\"), true);",
+        "assert.deepEqual(palindrome(\"never odd or even\"), true);",
+        "assert.deepEqual(palindrome(\"nope\"), false);",
+        "assert.deepEqual(palindrome(\"almostomla\"), false);"
+      ],
+      "challengeSeed": [
+        "function palindrome(str) {",
+        "  // Good luck!",
+        "  return true;",
+        "}",
+        "",
+        "",
+        "",
+        "palindrome(\"eye\");"
+      ],
+      "MDNlinks": [
+        "String.replace()",
+        "String.toLowerCase()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a26cbbe9ad8655a977e1ceb5",
+      "name": "Bonfire: Find the Longest Word in a String",
+      "dashedName": "bonfire-find-the-longest-word-in-a-string",
+      "difficulty": "1.04",
+      "description": [
+        "Return the length of the longest word in the provided sentence.",
+        "Your response should be a number.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function findLongestWord(str) {",
+        "  return str.length;",
+        "}",
+        "",
+        "findLongestWord('The quick brown fox jumped over the lazy dog');"
+      ],
+      "tests": [
+        "expect(findLongestWord('The quick brown fox jumped over the lazy dog')).to.be.a('Number');",
+        "expect(findLongestWord('The quick brown fox jumped over the lazy dog')).to.equal(6);",
+        "expect(findLongestWord('May the force be with you')).to.equal(5);",
+        "expect(findLongestWord('Google do a barrel roll')).to.equal(6);",
+        "expect(findLongestWord('What is the average airspeed velocity of an unladen swallow')).to.equal(8);"
+      ],
+      "MDNlinks": [
+        "String.split()",
+        "String.length"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "ab6137d4e35944e21037b769",
+      "name": "Bonfire: Title Case a Sentence",
+      "dashedName": "bonfire-title-case-a-sentence",
+      "difficulty": "1.05",
+      "description": [
+        "Return the provided string with the first letter of each word capitalized.",
+        "For the purpose of this exercise, you should also capitalize connecting words like 'the' and 'of'.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function titleCase(str) {",
+        "  return str;",
+        "}",
+        "",
+        "titleCase(\"I'm a little tea pot\");"
+      ],
+      "tests": [
+        "expect(titleCase(\"I'm a little tea pot\")).to.be.a('String');",
+        "expect(titleCase(\"I'm a little tea pot\")).to.equal(\"I'm A Little Tea Pot\");",
+        "expect(titleCase(\"sHoRt AnD sToUt\")).to.equal(\"Short And Stout\");",
+        "expect(titleCase(\"HERE IS MY HANDLE HERE IS MY SPOUT\")).to.equal(\"Here Is My Handle Here Is My Spout\");"
+      ],
+      "MDNlinks": [
+        "String.charAt()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a789b3483989747d63b0e427",
+      "name": "Bonfire: Return Largest Numbers in Arrays",
+      "dashedName": "bonfire-return-largest-numbers-in-arrays",
+      "difficulty": "1.06",
+      "description": [
+        "Return an array consisting of the largest number from each provided sub-array. For simplicity, the provided array will contain exactly 4 sub-arrays.",
+        "Remember, you can iterate through an array with a simple for loop, and access each member with array syntax arr[i] .",
+        "If you are writing your own Chai.js tests, be sure to use a deep equal statement instead of an equal statement when comparing arrays.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function largestOfFour(arr) {",
+        "  // You can do this!",
+        "  return arr;",
+        "}",
+        "",
+        "largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);"
+      ],
+      "tests": [
+        "expect(largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]])).to.be.a('array');",
+        "(largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]])).should.eql([27,5,39,1001]);",
+        "assert(largestOfFour([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]).should.eql([9,35,97,1000000]));"
+      ],
+      "MDNlinks": [
+        "Comparison Operators"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "acda2fb1324d9b0fa741e6b5",
+      "name": "Bonfire: Confirm the Ending",
+      "dashedName": "bonfire-confirm-the-ending",
+      "difficulty": "1.07",
+      "description": [
+        "Check if a string (first argument) ends with the given target string (second argument).",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function end(str, target) {",
+        "  // \"Never give up and good luck will find you.\"",
+        "  // -- Falcor",
+        "  return str;",
+        "}",
+        "",
+        "end('Bastian', 'n');"
+      ],
+      "tests": [
+        "assert.strictEqual(end('Bastian', 'n'), true, 'should equal true if target equals end of string');",
+        "assert.strictEqual(end('Connor', 'n'), false, 'should equal false if target does not equal end of string');",
+        "assert.strictEqual(end('Walking on water and developing software from a specification are easy if both are frozen.', 'specification'), false, 'should equal false if target does not equal end of string');",
+        "assert.strictEqual(end('He has to give me a new name', 'name'), true, 'should equal true if target equals end of string');",
+        "assert.strictEqual(end('If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing', 'mountain'), false, 'should equal false if target does not equal end of string');"
+      ],
+      "MDNlinks": [
+        "String.substr()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "afcc8d540bea9ea2669306b6",
+      "name": "Bonfire: Repeat a string repeat a string",
+      "dashedName": "bonfire-repeat-a-string-repeat-a-string",
+      "difficulty": "1.08",
+      "description": [
+        "Repeat a given string (first argument) n times (second argument). Return an empty string if n is a negative number.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function repeat(str, num) {",
+        "  // repeat after me",
+        "  return str;",
+        "}",
+        "",
+        "repeat('abc', 3);"
+      ],
+      "tests": [
+        "assert.strictEqual(repeat('*', 3), '***', 'should repeat a string n times');",
+        "assert.strictEqual(repeat('abc', 3), 'abcabcabc', 'should repeat a string n times');",
+        "assert.strictEqual(repeat('abc', -2), '', 'should return an empty string for negative numbers');"
+      ],
+      "MDNlinks": [
+        "Global String Object"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "ac6993d51946422351508a41",
+      "name": "Bonfire: Truncate a string",
+      "dashedName": "bonfire-truncate-a-string",
+      "difficulty": "1.09",
+      "description": [
+        "Truncate a string (first argument) if it is longer than the given maximum string length (second argument). Return the truncated string with a '...' ending.",
+        "Note that the three dots at the end add to the string length.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function truncate(str, num) {",
+        "  // Clear out that junk in your trunk",
+        "  return str;",
+        "}",
+        "",
+        "truncate('A-tisket a-tasket A green and yellow basket', 11);"
+      ],
+      "tests": [
+        "expect(truncate('A-tisket a-tasket A green and yellow basket', 11)).to.eqls('A-tisket...');",
+        "expect(truncate('Peter Piper picked a peck of pickled peppers', 14)).to.eqls('Peter Piper...');",
+        "assert(truncate('A-tisket a-tasket A green and yellow basket', 'A-tisket a-tasket A green and yellow basket'.length) === 'A-tisket a-tasket A green and yellow basket', 'should not truncate if string is = length');",
+        "assert.strictEqual(truncate('A-tisket a-tasket A green and yellow basket', 'A-tisket a-tasket A green and yellow basket'.length + 2), 'A-tisket a-tasket A green and yellow basket', 'should not truncate if string is < length');"
+      ],
+      "MDNlinks": [
+        "String.slice()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a9bd25c716030ec90084d8a1",
+      "name": "Bonfire: Chunky Monkey",
+      "dashedName": "bonfire-chunky-monkey",
+      "difficulty": "1.10",
+      "description": [
+        "Write a function that splits an array (first argument) into groups the length of size (second argument) and returns them as a multidimensional array.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function chunk(arr, size) {",
+        "  // Break it up.",
+        "  return arr;",
+        "}",
+        "",
+        "chunk(['a', 'b', 'c', 'd'], 2);"
+      ],
+      "tests": [
+        "assert.deepEqual(chunk(['a', 'b', 'c', 'd'], 2), [['a', 'b'], ['c', 'd']], 'should return chunked arrays');",
+        "assert.deepEqual(chunk([0, 1, 2, 3, 4, 5], 3), [[0, 1, 2], [3, 4, 5]], 'should return chunked arrays');",
+        "assert.deepEqual(chunk([0, 1, 2, 3, 4, 5], 2), [[0, 1], [2, 3], [4, 5]], 'should return chunked arrays');",
+        "assert.deepEqual(chunk([0, 1, 2, 3, 4, 5], 4), [[0, 1, 2, 3], [4, 5]], 'should return the last chunk as remaining elements');"
+      ],
+      "MDNlinks": [
+        "Array.push()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "ab31c21b530c0dafa9e241ee",
+      "name": "Bonfire: Slasher Flick",
+      "dashedName": "bonfire-slasher-flick",
+      "difficulty": "1.11",
+      "description": [
+        "Return the remaining elements of an array after chopping off n elements from the head.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function slasher(arr, howMany) {",
+        "  // it doesn't always pay to be first",
+        "  return arr;",
+        "}",
+        "",
+        "slasher([1, 2, 3], 2);"
+      ],
+      "tests": [
+        "assert.deepEqual(slasher([1, 2, 3], 2), [3], 'should drop the first two elements');",
+        "assert.deepEqual(slasher([1, 2, 3], 0), [1, 2, 3], 'should return all elements when n < 1');",
+        "assert.deepEqual(slasher([1, 2, 3], 9), [], 'should return an empty array when n >= array.length');"
+      ],
+      "MDNlinks": [
+        "Array.slice()",
+        "Array.splice()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "af2170cad53daa0770fabdea",
+      "name": "Bonfire: Mutations",
+      "dashedName": "bonfire-mutations",
+      "difficulty": "1.12",
+      "description": [
+        "Return true if the string in the first element of the array contains all of the letters of the string in the second element of the array.",
+        "For example, ['hello', 'Hello'], should return true because all of the letters in the second string are present in the first, ignoring case.",
+        "The arguments ['hello', 'hey'] should return false because the string 'hello' does not contain a 'y'.",
+        "Lastly, ['Alien', 'line'], should return true because all of the letters in 'line' are present in 'Alien'.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function mutation(arr) {",
+        "  return arr;",
+        "}",
+        "",
+        "mutation(['hello', 'hey']);"
+      ],
+      "tests": [
+        "expect(mutation(['hello', 'hey'])).to.be.false;",
+        "expect(mutation(['hello', 'Hello'])).to.be.true;",
+        "expect(mutation(['zyxwvutsrqponmlkjihgfedcba', 'qrstu'])).to.be.true;",
+        "expect(mutation(['Mary', 'Army'])).to.be.true;",
+        "expect(mutation(['Mary', 'Aarmy'])).to.be.true;",
+        "expect(mutation(['Alien', 'line'])).to.be.true;",
+        "expect(mutation(['floor', 'for'])).to.be.true;"
+      ],
+      "MDNlinks": [
+        "Array.indexOf()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "adf08ec01beb4f99fc7a68f2",
+      "name": "Bonfire: Falsy Bouncer",
+      "dashedName": "bonfire-falsy-bouncer",
+      "difficulty": "1.50",
+      "description": [
+        "Remove all falsy values from an array.",
+        "Falsy values in javascript are false, null, 0, \"\", undefined, and NaN.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function bouncer(arr) {",
+        "  // Don't show a false ID to this bouncer.",
+        "  return arr;",
+        "}",
+        "",
+        "bouncer([7, 'ate', '', false, 9]);"
+      ],
+      "tests": [
+        "assert.deepEqual(bouncer([7, 'ate', '', false, 9]), [7, 'ate', 9], 'should remove falsy values');",
+        "assert.deepEqual(bouncer(['a', 'b', 'c']), ['a', 'b', 'c'], 'should return full array if no falsy elements');",
+        "assert.deepEqual(bouncer([false, null, 0]), [], 'should return empty array if all elements are falsy');"
+      ],
+      "MDNlinks": [
+        "Boolean Objects",
+        "Array.filter()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a8e512fbe388ac2f9198f0fa",
+      "name": "Bonfire: Where art thou",
+      "dashedName": "bonfire-where-art-thou",
+      "difficulty": "1.55",
+      "description": [
+        "Make a function that looks through a list (first argument) and returns an array of all objects that have equivalent property values (second argument).",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function where(collection, source) {",
+        "  var arr = [];",
+        "  // What's in a name?",
+        "  return arr;",
+        "}",
+        "",
+        "where([{ first: 'Romeo', last: 'Montague' }, { first: 'Mercutio', last: null }, { first: 'Tybalt', last: 'Capulet' }], { last: 'Capulet' });"
+      ],
+      "tests": [
+        "assert.deepEqual(where([{ first: 'Romeo', last: 'Montague' }, { first: 'Mercutio', last: null }, { first: 'Tybalt', last: 'Capulet' }], { last: 'Capulet' }), [{ first: 'Tybalt', last: 'Capulet' }], 'should return an array of objects');",
+        "assert.deepEqual(where([{ 'a': 1 }, { 'a': 1 }, { 'a': 1, 'b': 2 }], { 'a': 1 }), [{ 'a': 1 }, { 'a': 1 }, { 'a': 1, 'b': 2 }], 'should return with multiples');"
+      ],
+      "MDNlinks": [
+        "Global Object",
+        "Object.hasOwnProperty()",
+        "Object.keys()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a39963a4c10bc8b4d4f06d7e",
+      "name": "Bonfire: Seek and Destroy",
+      "dashedName": "bonfire-seek-and-destroy",
+      "difficulty": "1.60",
+      "description": [
+        "You will be provided with an initial array (the first argument in the destroyer function), followed by one or more arguments. Remove all elements from the initial array that are of the same value as these arguments.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function destroyer(arr) {",
+        "  // Remove all the values",
+        "  return arr;",
+        "}",
+        "",
+        "destroyer([1, 2, 3, 1, 2, 3], 2, 3);"
+      ],
+      "tests": [
+        "assert.deepEqual(destroyer([1, 2, 3, 1, 2, 3], 2, 3), [1, 1], 'should remove correct values from an array');",
+        "assert.deepEqual(destroyer([1, 2, 3, 5, 1, 2, 3], 2, 3), [1, 5, 1], 'should remove correct values from an array');",
+        "assert.deepEqual(destroyer([3, 5, 1, 2, 2], 2, 3, 5), [1], 'should accept more than two additional arguments');",
+        "assert.deepEqual(destroyer([2, 3, 2, 3], 2, 3), [], 'should remove correct values from an array');",
+        "assert.deepEqual(destroyer(['tree', 'hamburger', 53], 'tree', 53), ['hamburger'], 'should handle NaN-elements');"
+      ],
+      "MDNlinks": [
+        "Arguments object",
+        "Array.filter()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a24c1a4622e3c05097f71d67",
+      "name": "Bonfire: Where do I belong",
+      "dashedName": "bonfire-where-do-i-belong",
+      "difficulty": "1.61",
+      "description": [
+        "Return the lowest index at which a value (second argument) should be inserted into a sorted array (first argument).",
+        "For example, where([1,2,3,4], 1.5) should return 1 because it is greater than 1 (0th index), but less than 2 (1st index).",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function where(arr, num) {",
+        "  // Find my place in this sorted array.",
+        "  return num;",
+        "}",
+        "",
+        "where([40, 60], 50);"
+      ],
+      "MDNlinks": [
+        "Array.sort()"
+      ],
+      "tests": [
+        "expect(where([10, 20, 30, 40, 50], 35)).to.equal(3);",
+        "expect(where([10, 20, 30, 40, 50], 30)).to.equal(2);"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a3566b1109230028080c9345",
+      "name": "Bonfire: Sum All Numbers in a Range",
+      "dashedName": "bonfire-sum-all-numbers-in-a-range",
+      "difficulty": "2.00",
+      "description": [
+        "We'll pass you an array of two numbers. Return the sum of those two numbers and all numbers between them.",
+        "The lowest number will not always come first.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function sumAll(arr) {",
+        "  return(1);",
+        "}",
+        "",
+        "sumAll([1, 4]);"
+      ],
+      "tests": [
+        "expect(sumAll([1, 4])).to.be.a('Number');",
+        "expect(sumAll([1, 4])).to.equal(10);",
+        "expect(sumAll([4, 1])).to.equal(10);",
+        "expect(sumAll([5, 10])).to.equal(45);",
+        "expect(sumAll([10, 5])).to.equal(45);"
+      ],
+      "MDNlinks": [
+        "Math.max()",
+        "Math.min()",
+        "Array.reduce()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a5de63ebea8dbee56860f4f2",
+      "name": "Bonfire: Diff Two Arrays",
+      "dashedName": "bonfire-diff-two-arrays",
+      "difficulty": "2.01",
+      "description": [
+        "Compare two arrays and return a new array with any items not found in both of the original arrays.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function diff(arr1, arr2) {",
+        "  var newArr = [];",
+        "  // Same, same; but different.",
+        "  return newArr;",
+        "}",
+        "",
+        "diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);"
+      ],
+      "tests": [
+        "expect(diff([1, 2, 3, 5], [1, 2, 3, 4, 5])).to.be.a('array');",
+        "assert.deepEqual(diff(['diorite', 'andesite', 'grass', 'dirt', 'pink wool', 'dead shrub'], ['diorite', 'andesite', 'grass', 'dirt', 'dead shrub']), ['pink wool'], 'arrays with only one difference');",
+        "assert.includeMembers(diff(['andesite', 'grass', 'dirt', 'pink wool', 'dead shrub'], ['diorite', 'andesite', 'grass', 'dirt', 'dead shrub']), ['diorite', 'pink wool'], 'arrays with more than one difference');",
+        "assert.deepEqual(diff(['andesite', 'grass', 'dirt', 'dead shrub'], ['andesite', 'grass', 'dirt', 'dead shrub']), [], 'arrays with no difference');",
+        "assert.deepEqual(diff([1, 2, 3, 5], [1, 2, 3, 4, 5]), [4], 'arrays with numbers');",
+        "assert.includeMembers(diff([1, 'calf', 3, 'piglet'], [1, 'calf', 3, 4]), ['piglet', 4], 'arrays with numbers and strings');",
+        "assert.deepEqual(diff([], ['snuffleupagus', 'cookie monster', 'elmo']), ['snuffleupagus', 'cookie monster', 'elmo'], 'empty array');"
+      ],
+      "MDNlinks": [
+        "Comparison Operators",
+        "String.slice()",
+        "Array.filter()",
+        "Array.indexOf()",
+        "String.concat()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a7f4d8f2483413a6ce226cac",
+      "name": "Bonfire: Roman Numeral Converter",
+      "dashedName": "bonfire-roman-numeral-converter",
+      "tests": [
+        "expect(convert(12)).to.equal(\"XII\");",
+        "expect(convert(5)).to.equal(\"V\");",
+        "expect(convert(9)).to.equal(\"IX\");",
+        "expect(convert(29)).to.equal(\"XXIX\");",
+        "expect(convert(16)).to.equal(\"XVI\");"
+      ],
+      "difficulty": "2.02",
+      "description": [
+        "Convert the given number into a roman numeral.",
+        "All <a href=\"http://www.mathsisfun.com/roman-numerals.html\">roman numerals</a> answers should be provided in upper-case.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function convert(num) {",
+        " return num;",
+        "}",
+        "",
+        "convert(36);"
+      ],
+      "MDNlinks": [
+        "Array.splice()",
+        "Array.indexOf()",
+        "Array.join()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a0b5010f579e69b815e7c5d6",
+      "name": "Bonfire: Search and Replace",
+      "dashedName": "bonfire-search-and-replace",
+      "tests": [
+        "expect(replace(\"Let us go to the store\", \"store\", \"mall\")).to.equal(\"Let us go to the mall\");",
+        "expect(replace(\"He is Sleeping on the couch\", \"Sleeping\", \"sitting\")).to.equal(\"He is Sitting on the couch\");",
+        "expect(replace(\"This has a spellngi error\", \"spellngi\", \"spelling\")).to.equal(\"This has a spelling error\");",
+        "expect(replace(\"His name is Tom\", \"Tom\", \"john\")).to.equal(\"His name is John\");",
+        "expect(replace(\"Let us get back to more Coding\", \"Coding\", \"bonfires\")).to.equal(\"Let us get back to more Bonfires\");"
+      ],
+      "difficulty": "2.03",
+      "description": [
+        "Perform a search and replace on the sentence using the arguments provided and return the new sentence.",
+        "First argument is the sentence to perform the search and replace on.",
+        "Second argument is the word that you will be replacing (before).",
+        "Third argument is what you will be replacing the second argument with (after).",
+        "NOTE: Preserve the case of the original word when you are replacing it. For example if you mean to replace the word 'Book' with the word 'dog', it should be replaced as 'Dog'",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function replace(str, before, after) {",
+        " return str;",
+        "}",
+        "",
+        "replace(\"A quick brown fox jumped over the lazy dog\", \"jumped\", \"leaped\");"
+      ],
+      "MDNlinks": [
+        "Array.splice()",
+        "String.replace()",
+        "Array.join()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "aa7697ea2477d1316795783b",
+      "name": "Bonfire: Pig Latin",
+      "dashedName": "bonfire-pig-latin",
+      "tests": [
+        "expect(translate(\"california\")).to.equal(\"aliforniacay\");",
+        "expect(translate(\"paragraphs\")).to.equal(\"aragraphspay\");",
+        "expect(translate(\"glove\")).to.equal(\"oveglay\");",
+        "expect(translate(\"algorithm\")).to.equal(\"algorithmway\");",
+        "expect(translate(\"eight\")).to.equal(\"eightway\");"
+      ],
+      "difficulty": "2.04",
+      "description": [
+        "Translate the provided string to pig latin.",
+        "<a href=\"http://en.wikipedia.org/wiki/Pig_Latin\">Pig Latin</a> takes the first consonant (or consonant cluster) of an English word, moves it to the end of the word and suffixes an \"ay\".",
+        "If a word begins with a vowel you just add \"way\" to the end.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function translate(str) {",
+        " return str;",
+        "}",
+        "",
+        "translate(\"consonant\");"
+      ],
+      "MDNlinks": [
+        "Array.indexOf()",
+        "Array.push()",
+        "Array.join()",
+        "String.substr()",
+        "String.split()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "afd15382cdfb22c9efe8b7de",
+      "name": "Bonfire: DNA Pairing",
+      "dashedName": "bonfire-dna-pairing",
+      "tests": [
+        "assert.deepEqual(pair(\"ATCGA\"),[['A','T'],['T','A'],['C','G'],['G','C'],['A','T']], 'should return the dna pair');",
+        "assert.deepEqual(pair(\"TTGAG\"),[['T','A'],['T','A'],['G','C'],['A','T'],['G','C']], 'should return the dna pair');",
+        "assert.deepEqual(pair(\"CTCTA\"),[['C','G'],['T','A'],['C','G'],['T','A'],['A','T']], 'should return the dna pair');"
+      ],
+      "difficulty": "2.05",
+      "description": [
+        "The DNA strand is missing the pairing element. Match each character with the missing element and return the results as a 2d array.",
+        "<a href=\"http://en.wikipedia.org/wiki/Base_pair\">Base pairs</a> are a pair of AT and CG. Match the missing element to the provided character.",
+        "Return the provided character as the first element in each array.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function pair(str) {",
+        " return str;",
+        "}",
+        "",
+        "pair(\"GCG\");"
+      ],
+      "MDNlinks": [
+        "Array.push()",
+        "String.split()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "af7588ade1100bde429baf20",
+      "name": "Bonfire: Missing letters",
+      "dashedName": "bonfire-missing-letters",
+      "difficulty": "2.05",
+      "description": [
+        "Find the missing letter in the passed letter range and return it.",
+        "If all letters are present in the range, return undefined.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function fearNotLetter(str) {",
+        "  return str;",
+        "}",
+        "",
+        "fearNotLetter('abce');"
+      ],
+      "tests": [
+        "expect(fearNotLetter('abce')).to.equal('d');",
+        "expect(fearNotLetter('bcd')).to.be.undefined;",
+        "expect(fearNotLetter('abcdefghjklmno')).to.equal('i');",
+        "expect(fearNotLetter('yz')).to.be.undefined;"
+      ],
+      "MDNlinks": [
+        "String.charCodeAt()",
+        "String.fromCharCode()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a77dbc43c33f39daa4429b4f",
+      "name": "Bonfire: Boo who",
+      "dashedName": "bonfire-boo-who",
+      "difficulty": "2.06",
+      "description": [
+        "Check if a value is classified as a boolean primitive. Return true or false.",
+        "Boolean primitives are true and false.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function boo(bool) {",
+        "  // What is the new fad diet for ghost developers? The Boolean.",
+        "  return bool;",
+        "}",
+        "",
+        "boo(null);"
+      ],
+      "tests": [
+        "assert.strictEqual(boo(true), true);",
+        "assert.strictEqual(boo(false), true);",
+        "assert.strictEqual(boo([1, 2, 3]), false);",
+        "assert.strictEqual(boo([].slice), false);",
+        "assert.strictEqual(boo({ 'a': 1 }), false);",
+        "assert.strictEqual(boo(1), false);",
+        "assert.strictEqual(boo(NaN), false);",
+        "assert.strictEqual(boo('a'), false);"
+      ],
+      "MDNlinks": [
+        "Boolean Objects"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a105e963526e7de52b219be9",
+      "name": "Bonfire: Sorted Union",
+      "dashedName": "bonfire-sorted-union",
+      "difficulty": "2.07",
+      "description": [
+        "Write a function that takes two or more arrays and returns a new array of unique values in the order of the original provided arrays.",
+        "In other words, all values present from all arrays should be included in their original order, but with no duplicates in the final array.",
+        "The unique numbers should be sorted by their original order, but the final array should not be sorted in numerical order.",
+        "Check the assertion tests for examples.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function unite(arr1, arr2, arr3) {",
+        "  return arr1;",
+        "}",
+        "",
+        "unite([1, 2, 3], [5, 2, 1, 4], [2, 1]);"
+      ],
+      "tests": [
+        "assert.deepEqual(unite([1, 3, 2], [5, 2, 1, 4], [2, 1]), [1, 3, 2, 5, 4], 'should return the union of the given arrays');",
+        "assert.deepEqual(unite([1, 3, 2], [1, [5]], [2, [4]]), [1, 3, 2, [5], [4]], 'should not flatten nested arrays');",
+        "assert.deepEqual(unite([1, 2, 3], [5, 2, 1]), [1, 2, 3, 5], 'should correctly handle exactly two arguments');",
+        "assert.deepEqual(unite([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8]), [ 1, 2, 3, 5, 4, 6, 7, 8 ], 'should correctly handle higher numbers of arguments');"
+      ],
+      "MDNlinks": [
+        "Arguments object",
+        "Array.reduce()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a6b0bb188d873cb2c8729495",
+      "name": "Bonfire: Convert HTML Entities",
+      "dashedName": "bonfire-convert-html-entities",
+      "difficulty": "2.07",
+      "description": [
+        "Convert the characters \"&\", \"<\", \">\", '\"' (double quote), and \"'\" (apostrophe), in a string to their corresponding HTML entities.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function convert(str) {",
+        "  // &colon;&rpar;",
+        "  return str;",
+        "}",
+        "",
+        "convert('Dolce & Gabbana');"
+      ],
+      "tests": [
+        "assert.strictEqual(convert('Dolce & Gabbana'), 'Dolce &amp; Gabbana', 'should escape characters');",
+        "assert.strictEqual(convert('Hamburgers < Pizza < Tacos'), 'Hamburgers &lt; Pizza &lt; Tacos', 'should escape characters');",
+        "assert.strictEqual(convert('Sixty > twelve'), 'Sixty &gt; twelve', 'should escape characters');",
+        "assert.strictEqual(convert('Stuff in \"quotation marks\"'), 'Stuff in &quot;quotation marks&quot;', 'should escape characters');",
+        "assert.strictEqual(convert(\"Shindler's List\"), 'Shindler&apos;s List', 'should escape characters');",
+        "assert.strictEqual(convert('<>'), '&lt;&gt;', 'should escape characters');",
+        "assert.strictEqual(convert('abc'), 'abc', 'should handle strings with nothing to escape');"
+      ],
+      "MDNlinks": [
+        "RegExp",
+        "HTML Entities"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a103376db3ba46b2d50db289",
+      "name": "Bonfire: Spinal Tap Case",
+      "dashedName": "bonfire-spinal-tap-case",
+      "difficulty": "2.08",
+      "description": [
+        "Convert a string to spinal case. Spinal case is all-lowercase-words-joined-by-dashes.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function spinalCase(str) {",
+        "  // \"It's such a fine line between stupid, and clever.\"",
+        "  // --David St. Hubbins",
+        "  return str;",
+        "}",
+        "",
+        "spinalCase('This Is Spinal Tap');"
+      ],
+      "tests": [
+        "assert.strictEqual(spinalCase('This Is Spinal Tap'), 'this-is-spinal-tap', 'should return spinal case from string with spaces');",
+        "assert.strictEqual(spinalCase('thisIsSpinalTap'), 'this-is-spinal-tap', 'should return spinal case from string with camel case');",
+        "assert.strictEqual(spinalCase('The_Andy_Griffith_Show'), 'the-andy-griffith-show', 'should return spinal case from string with snake case');",
+        "assert.strictEqual(spinalCase('Teletubbies say Eh-oh'), 'teletubbies-say-eh-oh', 'should return spinal case from string with spaces and hyphens');"
+      ],
+      "MDNlinks": [
+        "RegExp",
+        "String.replace()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a5229172f011153519423690",
+      "name": "Bonfire: Sum All Odd Fibonacci Numbers",
+      "dashedName": "bonfire-sum-all-odd-fibonacci-numbers",
+      "difficulty": "2.09",
+      "description": [
+        "Return the sum of all odd Fibonacci numbers up to and including the passed number if it is a Fibonacci number.",
+        "The first few numbers of the Fibonacci sequence are 1, 1, 2, 3, 5 and 8, and each subsequent number is the sum of the previous two numbers.",
+        "As an example, passing 4 to the function should return 5 because all the odd Fibonacci numbers under 4 are 1, 1, and 3.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function sumFibs(num) {",
+        "  return num;",
+        "}",
+        "",
+        "sumFibs(4);"
+      ],
+      "tests": [
+        "expect(sumFibs(1)).to.be.a('number');",
+        "expect(sumFibs(1000)).to.equal(1785);",
+        "expect(sumFibs(4000000)).to.equal(4613732);",
+        "expect(sumFibs(4)).to.equal(5);",
+        "expect(sumFibs(75024)).to.equal(60696);",
+        "expect(sumFibs(75025)).to.equal(135721);"
+      ],
+      "MDNlinks": [
+        "Remainder"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a3bfc1673c0526e06d3ac698",
+      "name": "Bonfire: Sum All Primes",
+      "dashedName": "bonfire-sum-all-primes",
+      "difficulty": "2.10",
+      "description": [
+        "Sum all the prime numbers up to and including the provided number.",
+        "A prime number is defined as having only two divisors, 1 and itself. For example, 2 is a prime number because it's only divisible by 1 and 2. 1 isn't a prime number, because it's only divisible by itself.",
+        "The provided number may not be a prime.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function sumPrimes(num) {",
+        "  return num;",
+        "}",
+        "",
+        "sumPrimes(10);"
+      ],
+      "tests": [
+        "expect(sumPrimes(10)).to.be.a('number');",
+        "expect(sumPrimes(10)).to.equal(17);",
+        "expect(sumPrimes(977)).to.equal(73156);"
+      ],
+      "MDNlinks": [
+        "For Loops",
+        "Array.push()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "ae9defd7acaf69703ab432ea",
+      "name": "Bonfire: Smallest Common Multiple",
+      "dashedName": "bonfire-smallest-common-multiple",
+      "difficulty": "2.11",
+      "description": [
+        "Find the smallest number that is evenly divisible by all numbers in the provided range.",
+        "The range will be an array of two numbers that will not necessarily be in numerical order.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function smallestCommons(arr) {",
+        "  return arr;",
+        "}",
+        "",
+        "",
+        "smallestCommons([1,5]);"
+      ],
+      "tests": [
+        "expect(smallestCommons([1,5])).to.be.a('number');",
+        "expect(smallestCommons([1,5])).to.equal(60);",
+        "expect(smallestCommons([5,1])).to.equal(60);",
+        "expect(smallestCommons([1,13])).to.equal(360360);"
+      ],
+      "MDNlinks": [
+        "Smallest Common Multiple"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a6e40f1041b06c996f7b2406",
+      "name": "Bonfire: Finders Keepers",
+      "dashedName": "bonfire-finders-keepers",
+      "difficulty": "2.12",
+      "description": [
+        "Create a function that looks through an array (first argument) and returns the first element in the array that passes a truth test (second argument).",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function find(arr, func) {",
+        "  var num = 0;",
+        "  return num;",
+        "}",
+        "",
+        "find([1, 2, 3, 4], function(num){ return num % 2 === 0; });"
+      ],
+      "tests": [
+        "assert.strictEqual(find([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; }), 8, 'should return first found value');",
+        "assert.strictEqual(find([1, 3, 5, 9], function(num) { return num % 2 === 0; }), undefined, 'should return undefined if not found');"
+      ],
+      "MDNlinks": [
+        "Array.some()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a5deed1811a43193f9f1c841",
+      "name": "Bonfire: Drop it",
+      "dashedName": "bonfire-drop-it",
+      "difficulty": "2.13",
+      "description": [
+        "Drop the elements of an array (first argument), starting from the front, until the predicate (second argument) returns true.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function drop(arr, func) {",
+        "  // Drop them elements.",
+        "  return arr;",
+        "}",
+        "",
+        "drop([1, 2, 3], function(n) {return n < 3; });"
+      ],
+      "tests": [
+        "expect(drop([1, 2, 3, 4], function(n) {return n >= 3; })).to.eqls([3, 4]);",
+        "expect(drop([1, 2, 3], function(n) {return n > 0; })).to.eqls([1, 2, 3]);",
+        "expect(drop([1, 2, 3, 4], function(n) {return n > 5; })).to.eqls([]);"
+      ],
+      "MDNlinks": [
+        "Arguments object",
+        "Array.shift()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "ab306dbdcc907c7ddfc30830",
+      "name": "Bonfire: Steamroller",
+      "dashedName": "bonfire-steamroller",
+      "difficulty": "2.14",
+      "description": [
+        "Flatten a nested array. You must account for varying levels of nesting.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function steamroller(arr) {",
+        "  // I'm a steamroller, baby",
+        "  return arr;",
+        "}",
+        "",
+        "steamroller([1, [2], [3, [[4]]]]);"
+      ],
+      "tests": [
+        "assert.deepEqual(steamroller([[['a']], [['b']]]), ['a', 'b'], 'should flatten nested arrays');",
+        "assert.deepEqual(steamroller([1, [2], [3, [[4]]]]), [1, 2, 3, 4], 'should flatten nested arrays');",
+        "assert.deepEqual(steamroller([1, [], [3, [[4]]]]), [1, 3, 4], 'should work with empty arrays');"
+      ],
+      "MDNlinks": [
+        "Array.isArray()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a8d97bd4c764e91f9d2bda01",
+      "name": "Bonfire: Binary Agents",
+      "dashedName": "bonfire-binary-agents",
+      "difficulty": "2.15",
+      "description": [
+        "Return an English translated sentence of the passed binary string.",
+        "The binary string will be space separated.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function binaryAgent(str) {",
+        "  return str;",
+        "}",
+        "",
+        "binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111');"
+      ],
+      "tests": [
+        "expect(binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111')).to.equal(\"Aren't bonfires fun!?\");",
+        "expect(binaryAgent('01001001 00100000 01101100 01101111 01110110 01100101 00100000 01000110 01110010 01100101 01100101 01000011 01101111 01100100 01100101 01000011 01100001 01101101 01110000 00100001')).to.equal(\"I love FreeCodeCamp!\");"
+      ],
+      "MDNlinks": [
+        "String.charCodeAt()",
+        "String.fromCharCode()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a10d2431ad0c6a099a4b8b52",
+      "name": "Bonfire: Everything Be True",
+      "dashedName": "bonfire-everything-be-true",
+      "difficulty": "2.21",
+      "description": [
+        "Check if the predicate (second argument) returns truthy (defined) for all elements of a collection (first argument).",
+        "For this, check to see if the property defined in the second argument is present on every element of the collection.",
+        "Remember, you can access object properties through either dot notation or [] notation.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function every(collection, pre) {",
+        "  // Does everyone have one of these?",
+        "  return pre;",
+        "}",
+        "",
+        "every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], 'sex');"
+      ],
+      "tests": [
+        "assert.strictEqual(every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], 'sex'), true, 'should return true if predicate returns truthy for all elements in the collection');",
+        "assert.strictEqual(every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], {'sex': 'female'}), false, 'should return false if predicate returns falsey for any element in the collection');",
+        "assert.strictEqual(every([{'user': 'Tinky-Winky', 'sex': 'female'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], {'sex': 'female'}), false, 'should return false if predicate returns falsey for any element in the collection');"
+
+      ],
+      "MDNlinks": [
+        "Object.hasOwnProperty()",
+        "Object.getOwnPropertyNames()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a97fd23d9b809dac9921074f",
+      "name": "Bonfire: Arguments Optional",
+      "dashedName": "bonfire-arguments-optional",
+      "difficulty": "2.22",
+      "description": [
+        "Create a function that sums two arguments together. If only one argument is provided, return a function that expects one additional argument and will return the sum.",
+        "For example, add(2, 3) should return 5, and add(2) should return a function that is waiting for an argument so that <code>var sum2And = add(2); return sum2And(3); // 5</code>",
+        "If either argument isn't a valid number, return undefined.",
+        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function add() {",
+        "  return false;",
+        "}",
+        "",
+        "add(2,3);"
+      ],
+      "tests": [
+        "expect(add(2, 3)).to.equal(5);",
+        "expect(add(2)(3)).to.equal(5);",
+        "expect(add('http://bit.ly/IqT6zt')).to.be.undefined;",
+        "expect(add(2, '3')).to.be.undefined;",
+        "expect(add(2)([3])).to.be.undefined;"
+      ],
+      "MDNlinks": [
+        "Global Function Object",
+        "Arguments object"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    }
+  ]
+}
diff --git a/data/seed/challenges/basic-ziplines.json b/data/seed/challenges/basic-ziplines.json
new file mode 100644
index 0000000..e6418a3
--- /dev/null
+++ b/data/seed/challenges/basic-ziplines.json
@@ -0,0 +1,210 @@
+{
+  "name": "Basic Front End Development Projects",
+  "order": 0.008,
+  "challenges": [
+    {
+      "id": "bd7158d8c442eddfbeb5bd1f",
+      "name": "Waypoint: Get Set for Ziplines",
+      "dashedName": "waypoint-get-set-for-ziplines",
+      "difficulty": 1.00,
+      "challengeSeed": ["125658022"],
+      "description": [
+        "Now you're ready to start our Zipline challenges. These front-end development challenges will give you many opportunities to apply the HTML, CSS, jQuery and JavaScript you've learned to build static (database-less) applications.",
+        "For many of these challenges, you will be using JSON data from external API endpoints, such as Twitch.tv and Twitter. Note that you don't need to have a database to use these data.",
+        "The easiest way to manipulate these data is with <a href='http://api.jquery.com/jquery.getjson/' target='_blank'>jQuery $.getJSON()</a>.",
+        "Whatever you do, don't get discouraged! Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck.",
+        "We'll build these challenges using CodePen, a popular tool for creating, sharing, and discovering static web applications.",
+        "Go to <a href='http://codepen.io' target='_blank'>http://codepen.io</a> and create an account.",
+        "Click your user image in the top right corner, then click the \"New pen\" button that drops down.",
+        "Drag the windows around and press the buttons in the lower-right hand corner to change the orientation to suit your preference.",
+        "Click the gear next to CSS. Click the \"Quick-add...\" select box and choose Bootstrap.",
+        "Verify that bootstrap is active by adding the following code to your HTML: <code>&lt;h1 class='text-primary'&gt;Hello CodePen!&lt;/h1&gt;</code>. The text's color should be Bootstrap blue.",
+        "Click the gear next to JavaScript. Click the \"Quick-add...\" select box and choose jQuery.",
+        "Now add the following code to your JavaScript: <code>$(document).ready(function() { $('.text-primary').text('Hi CodePen!') });</code>. Click the \"Save\" button at the top. Your \"Hello CodePen!\" should change to \"Hi CodePen!\". This means that jQuery is working.",
+        "You can use this CodePen that you've just created as a starting point for your Ziplines. Just click the \"fork\" button at the top of your CodePen and it will create a duplicate CodePen.",
+        "Now you're ready for your first Zipline. Click the \"I've completed this challenge\" button."
+      ],
+      "challengeType": 2,
+      "tests": [],
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "bd7158d8c242eddfaeb5bd13",
+      "name": "Zipline: Build a Personal Portfolio Webpage",
+      "dashedName": "zipline-build-a-personal-portfolio-webpage",
+      "difficulty": 1.01,
+      "challengeSeed": ["133315782"],
+      "description": [
+        "<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/ThiagoFerreir4/full/eNMxEp' target='_blank'>http://codepen.io/ThiagoFerreir4/full/eNMxEp</a>.",
+        "<span class='text-info'>Rule #1:</span> Don't look at the example project's code on CodePen. Figure it out for yourself.",
+        "<span class='text-info'>Rule #2:</span> You may use whichever libraries or APIs you need.",
+        "<span class='text-info'>Rule #3:</span> Reverse engineer the example project's functionality, and also feel free to personalize it.",
+        "Here are the <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a> you must enable, and optional bonus user stories:",
+        "<span class='text-info'>User Story:</span> As a user, I can access all of the portfolio webpage's content just by scrolling.",
+        "<span class='text-info'>User Story:</span> As a user, I can click different buttons that will take me to the portfolio creator's different social media pages.",
+        "<span class='text-info'>User Story:</span> As a user, I can see thumbnail images of different projects the portfolio creator has built (if you don't haven't built any websites before, use placeholders.)",
+        "<span class='text-info'>Bonus User Story:</span> As a user, I navigate to different sections of the webpage by clicking buttons in the navigation.",
+        "Don't worry if you don't have anything to showcase on your portfolio yet - you will build several several apps on the next few CodePen challenges, and can come back and update your portfolio later.",
+        "There are many great portfolio templates out there, but for this challenge, you'll need to build a portfolio page yourself. Using Bootstrap will make this much easier for you.",
+        "Note that CodePen.io overrides the Window.open() function, so if you want to open windows using jquery, you will need to target invisible anchor elements like this one: <code>&lt;a target='_blank'&rt;</a>.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck.",
+        "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
+        "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
+      ],
+      "challengeType": 3,
+      "tests": [],
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "bd7158d8c442eddfaeb5bd13",
+      "name": "Zipline: Build a Random Quote Machine",
+      "dashedName": "zipline-build-a-random-quote-machine",
+      "difficulty": 1.02,
+      "challengeSeed": ["126415122"],
+      "description": [
+        "<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/AdventureBear/full/vEoVMw' target='_blank'>http://codepen.io/AdventureBear/full/vEoVMw</a>.",
+        "<span class='text-info'>Rule #1:</span> Don't look at the example project's code on CodePen. Figure it out for yourself.",
+        "<span class='text-info'>Rule #2:</span> You may use whichever libraries or APIs you need.",
+        "<span class='text-info'>Rule #3:</span> Reverse engineer the example project's functionality, and also feel free to personalize it.",
+        "Here are the <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a> you must enable, and optional bonus user stories:",
+        "<span class='text-info'>User Story:</span> As a user, I can click a button to show me a new random quote.",
+        "<span class='text-info'>Bonus User Story:</span> As a user, I can press a button to tweet out a quote.",
+        "Note that you can either put your quotes into an array and show them at random, or use an API to get quotes, such as <a href='http://forismatic.com/en/api/'>http://forismatic.com/en/api/</a>.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck.",
+        "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
+        "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
+      ],
+      "challengeType": 3,
+      "tests": [],
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "bd7158d8c442eddfaeb5bd10",
+      "name": "Zipline: Show the Local Weather",
+      "dashedName": "zipline-show-the-local-weather",
+      "difficulty": 1.03,
+      "challengeSeed": ["126415127"],
+      "description": [
+        "<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/AdventureBear/full/yNBJRj' target='_blank'>http://codepen.io/AdventureBear/full/yNBJRj</a>.",
+        "<span class='text-info'>Rule #1:</span> Don't look at the example project's code on CodePen. Figure it out for yourself.",
+        "<span class='text-info'>Rule #2:</span> You may use whichever libraries or APIs you need.",
+        "<span class='text-info'>Rule #3:</span> Reverse engineer the example project's functionality, and also feel free to personalize it.",
+        "Here are the <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a> you must enable, and optional bonus user stories:",
+        "<span class='text-info'>User Story:</span> As a user, I can see the weather in my current location.",
+        "<span class='text-info'>Bonus User Story:</span> As a user, I can see an icon depending on the temperature..",
+        "<span class='text-info'>Bonus User Story:</span> As a user, I see a different background image depending on the temperature (e.g. snowy mountain, hot desert).",
+        "<span class='text-info'>Bonus User Story:</span> As a user, I can push a button to toggle between Fahrenheit and Celsius.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck.",
+        "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
+        "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
+      ],
+      "challengeType": 3,
+      "tests": [],
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "bd7158d8c442eddfaeb5bd0f",
+      "name": "Zipline: Build a Pomodoro Clock",
+      "dashedName": "zipline-build-a-pomodoro-clock",
+      "difficulty": 1.04,
+      "challengeSeed": ["126411567"],
+      "description": [
+        "<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/GeoffStorbeck/full/RPbGxZ/' target='_blank'>http://codepen.io/GeoffStorbeck/full/RPbGxZ/</a>.",
+        "<span class='text-info'>Rule #1:</span> Don't look at the example project's code on CodePen. Figure it out for yourself.",
+        "<span class='text-info'>Rule #2:</span> You may use whichever libraries or APIs you need.",
+        "<span class='text-info'>Rule #3:</span> Reverse engineer the example project's functionality, and also feel free to personalize it.",
+        "Here are the <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a> you must enable, and optional bonus user stories:",
+        "<span class='text-info'>User Story:</span> As a user, I can start a 25 minute pomodoro, and the timer will go off once 25 minutes has elapsed.",
+        "<span class='text-info'>Bonus User Story:</span> As a user, I can reset the clock for my next pomodoro.",
+        "<span class='text-info'>Bonus User Story:</span> As a user, I can customize the length of each pomodoro.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck.",
+        "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
+        "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
+      ],
+      "challengeType": 3,
+      "tests": [],
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "bd7158d8c442eddfaeb5bd1f",
+      "name": "Zipline: Use the Twitch.tv JSON API",
+      "dashedName": "zipline-use-the-twitchtv-json-api",
+      "difficulty": 1.05,
+      "challengeSeed": ["126411564"],
+      "description": [
+        "<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/GeoffStorbeck/full/GJKRxZ' target='_blank'>http://codepen.io/GeoffStorbeck/full/GJKRxZ</a>.",
+        "<span class='text-info'>Rule #1:</span> Don't look at the example project's code on CodePen. Figure it out for yourself.",
+        "<span class='text-info'>Rule #2:</span> You may use whichever libraries or APIs you need.",
+        "<span class='text-info'>Rule #3:</span> Reverse engineer the example project's functionality, and also feel free to personalize it.",
+        "Here are the <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a> you must enable, and optional bonus user stories:",
+        "<span class='text-info'>User Story:</span> As a user, I can see whether Free Code Camp is currently streaming on Twitch.tv.",
+        "<span class='text-info'>User Story:</span> As a user, I can click the status output and be sent directly to the Free Code Camp's Twitch.tv channel.",
+        "<span class='text-info'>User Story:</span> As a user, if Free Code Camp is streaming, I can see additional details about what they are streaming.",
+        "<span class='text-info'>Bonus User Story:</span> As a user, I can search through the streams listed.",
+        "<span class='text-info'>Hint:</span> Here's an example call to Twitch.tv's JSON API: <code>https://api.twitch.tv/kraken/streams/freecodecamp</code>.",
+        "<span class='text-info'>Hint:</span> The relevant documentation about this API call is here: <a href='https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel' target='_blank'>https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel</a>.",
+        "<span class='text-info'>Hint:</span> Here's an array of the Twitch.tv usernames of people who regularly stream coding: <code>[\"freecodecamp\", \"storbeck\", \"terakilobyte\", \"habathcx\",\"RobotCaleb\",\"comster404\",\"brunofin\",\"thomasballinger\",\"noobs2ninjas\",\"beohoff\"]</code>",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck.",
+        "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
+        "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
+      ],
+      "challengeType": 3,
+      "tests": [],
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    }
+  ]
+}
diff --git a/data/seed/challenges/expert-bonfires.json b/data/seed/challenges/expert-bonfires.json
new file mode 100644
index 0000000..50bbe89
--- /dev/null
+++ b/data/seed/challenges/expert-bonfires.json
@@ -0,0 +1,304 @@
+{
+  "name": "Expert Algorithm Scripting",
+  "order": 0.013,
+  "challenges": [
+    {
+      "id": "aff0395860f5d3034dc0bfc9",
+      "name": "Bonfire: Validate US Telephone Numbers",
+      "dashedName": "bonfire-validate-us-telephone-numbers",
+      "difficulty": "4.01",
+      "description": [
+        "Return true if the passed string is a valid US phone number",
+        "The user may fill out the form field any way they choose as long as it is a valid US number. The following are all valid formats for US numbers:",
+        "555-555-5555, (555)555-5555, (555) 555-5555, 555 555 5555, 5555555555, 1 555 555 5555",
+        "For this challenge you will be presented with a string such as \"800-692-7753\" or \"8oo-six427676;laskdjf\". Your job is to validate or reject the US phone number based on any combination of the formats provided above. The area code is required. If the country code is provided, you must confirm that the country code is \"1\". Return true if the string is a valid US phone number; otherwise false.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "tests": [
+        "expect(telephoneCheck(\"555-555-5555\")).to.be.a(\"boolean\");",
+        "assert.deepEqual(telephoneCheck(\"1 555-555-5555\"), true);",
+        "assert.deepEqual(telephoneCheck(\"1 (555) 555-5555\"), true);",
+        "assert.deepEqual(telephoneCheck(\"5555555555\"), true);",
+        "assert.deepEqual(telephoneCheck(\"555-555-5555\"), true);",
+        "assert.deepEqual(telephoneCheck(\"(555)555-5555\"), true);",
+        "assert.deepEqual(telephoneCheck(\"1(555)555-5555\"), true);",
+        "assert.deepEqual(telephoneCheck(\"1 555 555 5555\"), true);",
+        "assert.deepEqual(telephoneCheck(\"555-555-5555\"), true);",
+        "assert.deepEqual(telephoneCheck(\"1 456 789 4444\"), true);",
+        "assert.deepEqual(telephoneCheck(\"123**&!!asdf#\"), false);",
+        "assert.deepEqual(telephoneCheck(\"55555555\"), false);",
+        "assert.deepEqual(telephoneCheck(\"(6505552368)\"), false);",
+        "assert.deepEqual(telephoneCheck(\"2 (757) 622-7382\"), false);",
+        "assert.deepEqual(telephoneCheck(\"0 (757) 622-7382\"), false);",
+        "assert.deepEqual(telephoneCheck(\"-1 (757) 622-7382\"), false);",
+        "assert.deepEqual(telephoneCheck(\"2 757 622-7382\"), false);",
+        "assert.deepEqual(telephoneCheck(\"10 (757) 622-7382\"), false);",
+        "assert.deepEqual(telephoneCheck(\"27576227382\"), false);",
+        "assert.deepEqual(telephoneCheck(\"(275)76227382\"), false);",
+        "assert.deepEqual(telephoneCheck(\"2(757)6227382\"), false);",
+        "assert.deepEqual(telephoneCheck(\"2(757)622-7382\"), false);"
+      ],
+      "challengeSeed": [
+        "function telephoneCheck(str) {",
+        "  // Good luck!",
+        "  return true;",
+        "}",
+        "",
+        "",
+        "",
+        "telephoneCheck(\"555-555-5555\");"
+      ],
+      "MDNlinks": [
+        "RegExp"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a3f503de51cf954ede28891d",
+      "name": "Bonfire: Symmetric Difference",
+      "dashedName": "bonfire-symmetric-difference",
+      "difficulty": "4.02",
+      "description": [
+        "Create a function that takes two or more arrays and returns an array of the symmetric difference of the provided arrays.",
+        "The mathematical term symmetric difference refers to the elements in two sets that are in either the first or second set, but not in both.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function sym(args) {",
+        "  return arguments;",
+        "}",
+        "",
+        "sym([1, 2, 3], [5, 2, 1, 4]);"
+      ],
+      "tests": [
+        "expect(sym([1, 2, 3], [5, 2, 1, 4])).to.equal([3, 5, 4]);",
+        "assert.deepEqual(sym([1, 2, 5], [2, 3, 5], [3, 4, 5]), [1, 4, 5], 'should return the symmetric difference of the given arrays');",
+        "assert.deepEqual(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]), [1, 4, 5], 'should return an array of unique values');",
+        "assert.deepEqual(sym([1, 1]), [1], 'should return an array of unique values');"
+      ],
+      "MDNlinks": [
+        "Array.reduce()",
+        "Symmetric Difference"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "aa2e6f85cab2ab736c9a9b24",
+      "name": "Bonfire: Exact Change",
+      "dashedName": "bonfire-exact-change",
+      "difficulty": "4.03",
+      "description": [
+        "Design a cash register drawer function that accepts purchase price as the first argument, payment as the second argument, and cash-in-drawer (cid) as the third argument.",
+        "cid is a 2d array listing available currency.",
+        "Return the string \"Insufficient Funds\" if cash-in-drawer is less than the change due. Return the string \"Closed\" if cash-in-drawer is equal to the change due.",
+        "Otherwise, return change in coin and bills, sorted in highest to lowest order.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function drawer(price, cash, cid) {",
+        "  var change;",
+        "  // Here is your change, ma'am.",
+        "  return change;",
+        "}",
+        "",
+        "// Example cash-in-drawer array:",
+        "// [['PENNY', 1.01],",
+        "// ['NICKEL', 2.05],",
+        "// ['DIME', 3.10],",
+        "// ['QUARTER', 4.25],",
+        "// ['ONE', 90.00],",
+        "// ['FIVE', 55.00],",
+        "// ['TEN', 20.00],",
+        "// ['TWENTY', 60.00],",
+        "// ['ONE HUNDRED', 100.00]]",
+        "",
+        "drawer(19.50, 20.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]]);"
+      ],
+      "tests": [
+        "expect(drawer(19.50, 20.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]])).to.be.a('array');",
+        "expect(drawer(19.50, 20.00, [['PENNY', 0.01], ['NICKEL', 0], ['DIME', 0], ['QUARTER', 0], ['ONE', 0], ['FIVE', 0], ['TEN', 0], ['TWENTY', 0], ['ONE HUNDRED', 0]])).to.be.a('string');",
+        "expect(drawer(19.50, 20.00, [['PENNY', 0.50], ['NICKEL', 0], ['DIME', 0], ['QUARTER', 0], ['ONE', 0], ['FIVE', 0], ['TEN', 0], ['TWENTY', 0], ['ONE HUNDRED', 0]])).to.be.a('string');",
+        "assert.deepEqual(drawer(19.50, 20.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]]), [['QUARTER', 0.50]], 'return correct change');",
+        "assert.deepEqual(drawer(3.26, 100.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]]), [['TWENTY', 60.00], ['TEN', 20.00], ['FIVE', 15], ['ONE', 1], ['QUARTER', 0.50], ['DIME', 0.20], ['PENNY', 0.04] ], 'return correct change with multiple coins and bills');",
+        "assert.deepEqual(drawer(19.50, 20.00, [['PENNY', 0.01], ['NICKEL', 0], ['DIME', 0], ['QUARTER', 0], ['ONE', 0], ['FIVE', 0], ['TEN', 0], ['TWENTY', 0], ['ONE HUNDRED', 0]]), 'Insufficient Funds', 'insufficient funds');",
+        "assert.deepEqual(drawer(19.50, 20.00, [['PENNY', 0.50], ['NICKEL', 0], ['DIME', 0], ['QUARTER', 0], ['ONE', 0], ['FIVE', 0], ['TEN', 0], ['TWENTY', 0], ['ONE HUNDRED', 0]]), \"Closed\", 'cash-in-drawer equals change');"
+      ],
+      "MDNlinks": [
+        "Global Object"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a56138aff60341a09ed6c480",
+      "name": "Bonfire: Inventory Update",
+      "dashedName": "bonfire-inventory-update",
+      "difficulty": "4.04",
+      "description": [
+        "Compare and update inventory stored in a 2d array against a second 2d array of a fresh delivery. Update current inventory item quantity, and if an item cannot be found, add the new item and quantity into the inventory array in alphabetical order.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function inventory(arr1, arr2) {",
+        "    // All inventory must be accounted for or you're fired!",
+        "    return arr1;",
+        "}",
+        "",
+        "// Example inventory lists",
+        "var curInv = [",
+        "    [21, 'Bowling Ball'],",
+        "    [2, 'Dirty Sock'],",
+        "    [1, 'Hair Pin'],",
+        "    [5, 'Microphone']",
+        "];",
+        "",
+        "var newInv = [",
+        "    [2, 'Hair Pin'],",
+        "    [3, 'Half-Eaten Apple'],",
+        "    [67, 'Bowling Ball'],",
+        "    [7, 'Toothpaste']",
+        "];",
+        "",
+        "inventory(curInv, newInv);"
+      ],
+      "tests": [
+        "expect(inventory([[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair Pin'], [5, 'Microphone']], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']])).to.be.a('array');",
+        "assert.equal(inventory([[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair Pin'], [5, 'Microphone']], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']]).length, 6);",
+        "assert.deepEqual(inventory([[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair Pin'], [5, 'Microphone']], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']]), [[88, 'Bowling Ball'], [2, 'Dirty Sock'], [3, 'Hair Pin'], [3, 'Half-Eaten Apple'], [5, 'Microphone'], [7, 'Toothpaste']]);",
+        "assert.deepEqual(inventory([[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair Pin'], [5, 'Microphone']], []), [[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair Pin'], [5, 'Microphone']]);",
+        "assert.deepEqual(inventory([], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']]), [[67, 'Bowling Ball'], [2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [7, 'Toothpaste']]);",
+        "assert.deepEqual(inventory([[0, 'Bowling Ball'], [0, 'Dirty Sock'], [0, 'Hair Pin'], [0, 'Microphone']], [[1, 'Hair Pin'], [1, 'Half-Eaten Apple'], [1, 'Bowling Ball'], [1, 'Toothpaste']]), [[1, 'Bowling Ball'], [0, 'Dirty Sock'], [1, 'Hair Pin'], [1, 'Half-Eaten Apple'], [0, 'Microphone'], [1, 'Toothpaste']]);"
+      ],
+      "MDNlinks": [
+        "Global Array Object"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a7bf700cd123b9a54eef01d5",
+      "name": "Bonfire: No repeats please",
+      "dashedName": "bonfire-no-repeats-please",
+      "difficulty": "4.05",
+      "description": [
+        "Return the number of total permutations of the provided string that don't have repeated consecutive letters.",
+        "For example, 'aab' should return 2 because it has 6 total permutations, but only 2 of them don't have the same letter (in this case 'a') repeating.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function permAlone(str) {",
+        "  return str;",
+        "}",
+        "",
+        "permAlone('aab');"
+      ],
+      "tests": [
+        "expect(permAlone('aab')).to.be.a('number');",
+        "expect(permAlone('aab')).to.equal(2);",
+        "expect(permAlone('aaa')).to.equal(0);",
+        "expect(permAlone('aabb')).to.equal(8);",
+        "expect(permAlone('abcdefa')).to.equal(3600);",
+        "expect(permAlone('abfdefa')).to.equal(2640);",
+        "expect(permAlone('zzzzzzzz')).to.equal(0);"
+      ],
+      "MDNlinks": [
+        "Permutations",
+        "RegExp"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a19f0fbe1872186acd434d5a",
+      "name": "Bonfire: Friendly Date Ranges",
+      "dashedName": "bonfire-friendly-date-ranges",
+      "difficulty": "4.06",
+      "description": [
+        "Implement a way of converting two dates into a more friendly date range that could be presented to a user.",
+        "It must not show any redundant information in the date range.",
+        "For example, if the year and month are the same then only the day range should be displayed.",
+        "Secondly, if the starting year is the current year, and the ending year can be inferred by the reader, the year should be omitted.",
+        "Input date is formatted as YYYY-MM-DD",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function friendly(str) {",
+        "  return str;",
+        "}",
+        "",
+        "friendly(['2015-07-01', '2015-07-04']);"
+      ],
+      "tests": [
+        "assert.deepEqual(friendly(['2015-07-01', '2015-07-04']), ['July 1st','4th'], 'ending month should be omitted since it is already mentioned');",
+        "assert.deepEqual(friendly(['2015-12-01', '2016-02-03']), ['December 1st','February 3rd'], 'two months apart can be inferred if it is the next year');",
+        "assert.deepEqual(friendly(['2015-12-01', '2017-02-03']), ['December 1st, 2015','February 3rd, 2017']);",
+        "assert.deepEqual(friendly(['2016-03-01', '2016-05-05']), ['March 1st','May 5th'], 'one month apart can be inferred it is the same year');",
+        "assert.deepEqual(friendly(['2017-01-01', '2017-01-01']), ['January 1st, 2017'], 'since we do not duplicate only return once');",
+        "assert.deepEqual(friendly(['2022-09-05', '2023-09-04']), ['September 5th, 2022','September 4th, 2023']);"
+      ],
+      "MDNlinks": [
+        "String.split()",
+        "String.substr()",
+        "parseInt()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    }
+  ]
+}
diff --git a/data/seed/challenges/intermediate-bonfires.json b/data/seed/challenges/intermediate-bonfires.json
new file mode 100644
index 0000000..184a648
--- /dev/null
+++ b/data/seed/challenges/intermediate-bonfires.json
@@ -0,0 +1,816 @@
+{
+  "name": "Intermediate Algorithm Scripting",
+  "order": 0.009,
+  "challenges": [
+    {
+      "id": "a3566b1109230028080c9345",
+      "name": "Bonfire: Sum All Numbers in a Range",
+      "dashedName": "bonfire-sum-all-numbers-in-a-range",
+      "difficulty": "2.00",
+      "description": [
+        "We'll pass you an array of two numbers. Return the sum of those two numbers and all numbers between them.",
+        "The lowest number will not always come first.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function sumAll(arr) {",
+        "  return(1);",
+        "}",
+        "",
+        "sumAll([1, 4]);"
+      ],
+      "tests": [
+        "expect(sumAll([1, 4])).to.be.a('Number');",
+        "expect(sumAll([1, 4])).to.equal(10);",
+        "expect(sumAll([4, 1])).to.equal(10);",
+        "expect(sumAll([5, 10])).to.equal(45);",
+        "expect(sumAll([10, 5])).to.equal(45);"
+      ],
+      "MDNlinks": [
+        "Math.max()",
+        "Math.min()",
+        "Array.reduce()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a5de63ebea8dbee56860f4f2",
+      "name": "Bonfire: Diff Two Arrays",
+      "dashedName": "bonfire-diff-two-arrays",
+      "difficulty": "2.01",
+      "description": [
+        "Compare two arrays and return a new array with any items not found in both of the original arrays.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function diff(arr1, arr2) {",
+        "  var newArr = [];",
+        "  // Same, same; but different.",
+        "  return newArr;",
+        "}",
+        "",
+        "diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);"
+      ],
+      "tests": [
+        "expect(diff([1, 2, 3, 5], [1, 2, 3, 4, 5])).to.be.a('array');",
+        "assert.deepEqual(diff(['diorite', 'andesite', 'grass', 'dirt', 'pink wool', 'dead shrub'], ['diorite', 'andesite', 'grass', 'dirt', 'dead shrub']), ['pink wool'], 'arrays with only one difference');",
+        "assert.includeMembers(diff(['andesite', 'grass', 'dirt', 'pink wool', 'dead shrub'], ['diorite', 'andesite', 'grass', 'dirt', 'dead shrub']), ['diorite', 'pink wool'], 'arrays with more than one difference');",
+        "assert.deepEqual(diff(['andesite', 'grass', 'dirt', 'dead shrub'], ['andesite', 'grass', 'dirt', 'dead shrub']), [], 'arrays with no difference');",
+        "assert.deepEqual(diff([1, 2, 3, 5], [1, 2, 3, 4, 5]), [4], 'arrays with numbers');",
+        "assert.includeMembers(diff([1, 'calf', 3, 'piglet'], [1, 'calf', 3, 4]), ['piglet', 4], 'arrays with numbers and strings');",
+        "assert.deepEqual(diff([], ['snuffleupagus', 'cookie monster', 'elmo']), ['snuffleupagus', 'cookie monster', 'elmo'], 'empty array');"
+      ],
+      "MDNlinks": [
+        "Comparison Operators",
+        "String.slice()",
+        "Array.filter()",
+        "Array.indexOf()",
+        "String.concat()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a7f4d8f2483413a6ce226cac",
+      "name": "Bonfire: Roman Numeral Converter",
+      "dashedName": "bonfire-roman-numeral-converter",
+      "tests": [
+        "expect(convert(12)).to.equal(\"XII\");",
+        "expect(convert(5)).to.equal(\"V\");",
+        "expect(convert(9)).to.equal(\"IX\");",
+        "expect(convert(29)).to.equal(\"XXIX\");",
+        "expect(convert(16)).to.equal(\"XVI\");"
+      ],
+      "difficulty": "2.02",
+      "description": [
+        "Convert the given number into a roman numeral.",
+        "All <a href=\"http://www.mathsisfun.com/roman-numerals.html\" target=\"_blank\">roman numerals</a> answers should be provided in upper-case.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function convert(num) {",
+        " return num;",
+        "}",
+        "",
+        "convert(36);"
+      ],
+      "MDNlinks": [
+        "Array.splice()",
+        "Array.indexOf()",
+        "Array.join()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a0b5010f579e69b815e7c5d6",
+      "name": "Bonfire: Search and Replace",
+      "dashedName": "bonfire-search-and-replace",
+      "tests": [
+        "expect(replace(\"Let us go to the store\", \"store\", \"mall\")).to.equal(\"Let us go to the mall\");",
+        "expect(replace(\"He is Sleeping on the couch\", \"Sleeping\", \"sitting\")).to.equal(\"He is Sitting on the couch\");",
+        "expect(replace(\"This has a spellngi error\", \"spellngi\", \"spelling\")).to.equal(\"This has a spelling error\");",
+        "expect(replace(\"His name is Tom\", \"Tom\", \"john\")).to.equal(\"His name is John\");",
+        "expect(replace(\"Let us get back to more Coding\", \"Coding\", \"bonfires\")).to.equal(\"Let us get back to more Bonfires\");"
+      ],
+      "difficulty": "2.03",
+      "description": [
+        "Perform a search and replace on the sentence using the arguments provided and return the new sentence.",
+        "First argument is the sentence to perform the search and replace on.",
+        "Second argument is the word that you will be replacing (before).",
+        "Third argument is what you will be replacing the second argument with (after).",
+        "NOTE: Preserve the case of the original word when you are replacing it. For example if you mean to replace the word 'Book' with the word 'dog', it should be replaced as 'Dog'",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function replace(str, before, after) {",
+        " return str;",
+        "}",
+        "",
+        "replace(\"A quick brown fox jumped over the lazy dog\", \"jumped\", \"leaped\");"
+      ],
+      "MDNlinks": [
+        "Array.splice()",
+        "String.replace()",
+        "Array.join()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "aa7697ea2477d1316795783b",
+      "name": "Bonfire: Pig Latin",
+      "dashedName": "bonfire-pig-latin",
+      "tests": [
+        "expect(translate(\"california\")).to.equal(\"aliforniacay\");",
+        "expect(translate(\"paragraphs\")).to.equal(\"aragraphspay\");",
+        "expect(translate(\"glove\")).to.equal(\"oveglay\");",
+        "expect(translate(\"algorithm\")).to.equal(\"algorithmway\");",
+        "expect(translate(\"eight\")).to.equal(\"eightway\");"
+      ],
+      "difficulty": "2.04",
+      "description": [
+        "Translate the provided string to pig latin.",
+        "<a href=\"http://en.wikipedia.org/wiki/Pig_Latin\">Pig Latin</a> takes the first consonant (or consonant cluster) of an English word, moves it to the end of the word and suffixes an \"ay\".",
+        "If a word begins with a vowel you just add \"way\" to the end.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function translate(str) {",
+        " return str;",
+        "}",
+        "",
+        "translate(\"consonant\");"
+      ],
+      "MDNlinks": [
+        "Array.indexOf()",
+        "Array.push()",
+        "Array.join()",
+        "String.substr()",
+        "String.split()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "afd15382cdfb22c9efe8b7de",
+      "name": "Bonfire: DNA Pairing",
+      "dashedName": "bonfire-dna-pairing",
+      "tests": [
+        "assert.deepEqual(pair(\"ATCGA\"),[['A','T'],['T','A'],['C','G'],['G','C'],['A','T']], 'should return the dna pair');",
+        "assert.deepEqual(pair(\"TTGAG\"),[['T','A'],['T','A'],['G','C'],['A','T'],['G','C']], 'should return the dna pair');",
+        "assert.deepEqual(pair(\"CTCTA\"),[['C','G'],['T','A'],['C','G'],['T','A'],['A','T']], 'should return the dna pair');"
+      ],
+      "difficulty": "2.05",
+      "description": [
+        "The DNA strand is missing the pairing element. Match each character with the missing element and return the results as a 2d array.",
+        "<a href=\"http://en.wikipedia.org/wiki/Base_pair\">Base pairs</a> are a pair of AT and CG. Match the missing element to the provided character.",
+        "Return the provided character as the first element in each array.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function pair(str) {",
+        " return str;",
+        "}",
+        "",
+        "pair(\"GCG\");"
+      ],
+      "MDNlinks": [
+        "Array.push()",
+        "String.split()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "af7588ade1100bde429baf20",
+      "name": "Bonfire: Missing letters",
+      "dashedName": "bonfire-missing-letters",
+      "difficulty": "2.05",
+      "description": [
+        "Find the missing letter in the passed letter range and return it.",
+        "If all letters are present in the range, return undefined.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function fearNotLetter(str) {",
+        "  return str;",
+        "}",
+        "",
+        "fearNotLetter('abce');"
+      ],
+      "tests": [
+        "expect(fearNotLetter('abce')).to.equal('d');",
+        "expect(fearNotLetter('bcd')).to.be.undefined;",
+        "expect(fearNotLetter('abcdefghjklmno')).to.equal('i');",
+        "expect(fearNotLetter('yz')).to.be.undefined;"
+      ],
+      "MDNlinks": [
+        "String.charCodeAt()",
+        "String.fromCharCode()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a77dbc43c33f39daa4429b4f",
+      "name": "Bonfire: Boo who",
+      "dashedName": "bonfire-boo-who",
+      "difficulty": "2.06",
+      "description": [
+        "Check if a value is classified as a boolean primitive. Return true or false.",
+        "Boolean primitives are true and false.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function boo(bool) {",
+        "  // What is the new fad diet for ghost developers? The Boolean.",
+        "  return bool;",
+        "}",
+        "",
+        "boo(null);"
+      ],
+      "tests": [
+        "assert.strictEqual(boo(true), true);",
+        "assert.strictEqual(boo(false), true);",
+        "assert.strictEqual(boo([1, 2, 3]), false);",
+        "assert.strictEqual(boo([].slice), false);",
+        "assert.strictEqual(boo({ 'a': 1 }), false);",
+        "assert.strictEqual(boo(1), false);",
+        "assert.strictEqual(boo(NaN), false);",
+        "assert.strictEqual(boo('a'), false);"
+      ],
+      "MDNlinks": [
+        "Boolean Objects"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a105e963526e7de52b219be9",
+      "name": "Bonfire: Sorted Union",
+      "dashedName": "bonfire-sorted-union",
+      "difficulty": "2.07",
+      "description": [
+        "Write a function that takes two or more arrays and returns a new array of unique values in the order of the original provided arrays.",
+        "In other words, all values present from all arrays should be included in their original order, but with no duplicates in the final array.",
+        "The unique numbers should be sorted by their original order, but the final array should not be sorted in numerical order.",
+        "Check the assertion tests for examples.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function unite(arr1, arr2, arr3) {",
+        "  return arr1;",
+        "}",
+        "",
+        "unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);"
+      ],
+      "tests": [
+        "assert.deepEqual(unite([1, 3, 2], [5, 2, 1, 4], [2, 1]), [1, 3, 2, 5, 4], 'should return the union of the given arrays');",
+        "assert.deepEqual(unite([1, 3, 2], [1, [5]], [2, [4]]), [1, 3, 2, [5], [4]], 'should not flatten nested arrays');",
+        "assert.deepEqual(unite([1, 2, 3], [5, 2, 1]), [1, 2, 3, 5], 'should correctly handle exactly two arguments');",
+        "assert.deepEqual(unite([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8]), [ 1, 2, 3, 5, 4, 6, 7, 8 ], 'should correctly handle higher numbers of arguments');"
+      ],
+      "MDNlinks": [
+        "Arguments object",
+        "Array.reduce()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a6b0bb188d873cb2c8729495",
+      "name": "Bonfire: Convert HTML Entities",
+      "dashedName": "bonfire-convert-html-entities",
+      "difficulty": "2.07",
+      "description": [
+        "Convert the characters \"&\", \"<\", \">\", '\"' (double quote), and \"'\" (apostrophe), in a string to their corresponding HTML entities.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function convert(str) {",
+        "  // &colon;&rpar;",
+        "  return str;",
+        "}",
+        "",
+        "convert('Dolce & Gabbana');"
+      ],
+      "tests": [
+        "assert.strictEqual(convert('Dolce & Gabbana'), 'Dolce &amp; Gabbana', 'should escape characters');",
+        "assert.strictEqual(convert('Hamburgers < Pizza < Tacos'), 'Hamburgers &lt; Pizza &lt; Tacos', 'should escape characters');",
+        "assert.strictEqual(convert('Sixty > twelve'), 'Sixty &gt; twelve', 'should escape characters');",
+        "assert.strictEqual(convert('Stuff in \"quotation marks\"'), 'Stuff in &quot;quotation marks&quot;', 'should escape characters');",
+        "assert.strictEqual(convert(\"Shindler's List\"), 'Shindler&apos;s List', 'should escape characters');",
+        "assert.strictEqual(convert('<>'), '&lt;&gt;', 'should escape characters');",
+        "assert.strictEqual(convert('abc'), 'abc', 'should handle strings with nothing to escape');"
+      ],
+      "MDNlinks": [
+        "RegExp",
+        "HTML Entities"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a103376db3ba46b2d50db289",
+      "name": "Bonfire: Spinal Tap Case",
+      "dashedName": "bonfire-spinal-tap-case",
+      "difficulty": "2.08",
+      "description": [
+        "Convert a string to spinal case. Spinal case is all-lowercase-words-joined-by-dashes.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function spinalCase(str) {",
+        "  // \"It's such a fine line between stupid, and clever.\"",
+        "  // --David St. Hubbins",
+        "  return str;",
+        "}",
+        "",
+        "spinalCase('This Is Spinal Tap');"
+      ],
+      "tests": [
+        "assert.strictEqual(spinalCase('This Is Spinal Tap'), 'this-is-spinal-tap', 'should return spinal case from string with spaces');",
+        "assert.strictEqual(spinalCase('thisIsSpinalTap'), 'this-is-spinal-tap', 'should return spinal case from string with camel case');",
+        "assert.strictEqual(spinalCase('The_Andy_Griffith_Show'), 'the-andy-griffith-show', 'should return spinal case from string with snake case');",
+        "assert.strictEqual(spinalCase('Teletubbies say Eh-oh'), 'teletubbies-say-eh-oh', 'should return spinal case from string with spaces and hyphens');"
+      ],
+      "MDNlinks": [
+        "RegExp",
+        "String.replace()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a5229172f011153519423690",
+      "name": "Bonfire: Sum All Odd Fibonacci Numbers",
+      "dashedName": "bonfire-sum-all-odd-fibonacci-numbers",
+      "difficulty": "2.09",
+      "description": [
+        "Return the sum of all odd Fibonacci numbers up to and including the passed number if it is a Fibonacci number.",
+        "The first few numbers of the Fibonacci sequence are 1, 1, 2, 3, 5 and 8, and each subsequent number is the sum of the previous two numbers.",
+        "As an example, passing 4 to the function should return 5 because all the odd Fibonacci numbers under 4 are 1, 1, and 3.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function sumFibs(num) {",
+        "  return num;",
+        "}",
+        "",
+        "sumFibs(4);"
+      ],
+      "tests": [
+        "expect(sumFibs(1)).to.be.a('number');",
+        "expect(sumFibs(1000)).to.equal(1785);",
+        "expect(sumFibs(4000000)).to.equal(4613732);",
+        "expect(sumFibs(4)).to.equal(5);",
+        "expect(sumFibs(75024)).to.equal(60696);",
+        "expect(sumFibs(75025)).to.equal(135721);"
+      ],
+      "MDNlinks": [
+        "Remainder"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a3bfc1673c0526e06d3ac698",
+      "name": "Bonfire: Sum All Primes",
+      "dashedName": "bonfire-sum-all-primes",
+      "difficulty": "2.10",
+      "description": [
+        "Sum all the prime numbers up to and including the provided number.",
+        "A prime number is defined as having only two divisors, 1 and itself. For example, 2 is a prime number because it's only divisible by 1 and 2. 1 isn't a prime number, because it's only divisible by itself.",
+        "The provided number may not be a prime.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function sumPrimes(num) {",
+        "  return num;",
+        "}",
+        "",
+        "sumPrimes(10);"
+      ],
+      "tests": [
+        "expect(sumPrimes(10)).to.be.a('number');",
+        "expect(sumPrimes(10)).to.equal(17);",
+        "expect(sumPrimes(977)).to.equal(73156);"
+      ],
+      "MDNlinks": [
+        "For Loops",
+        "Array.push()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "ae9defd7acaf69703ab432ea",
+      "name": "Bonfire: Smallest Common Multiple",
+      "dashedName": "bonfire-smallest-common-multiple",
+      "difficulty": "2.11",
+      "description": [
+        "Find the smallest number that is evenly divisible by all numbers in the provided range.",
+        "The range will be an array of two numbers that will not necessarily be in numerical order.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function smallestCommons(arr) {",
+        "  return arr;",
+        "}",
+        "",
+        "",
+        "smallestCommons([1,5]);"
+      ],
+      "tests": [
+        "expect(smallestCommons([1,5])).to.be.a('number');",
+        "expect(smallestCommons([1,5])).to.equal(60);",
+        "expect(smallestCommons([5,1])).to.equal(60);",
+        "expect(smallestCommons([1,13])).to.equal(360360);"
+      ],
+      "MDNlinks": [
+        "Smallest Common Multiple"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a6e40f1041b06c996f7b2406",
+      "name": "Bonfire: Finders Keepers",
+      "dashedName": "bonfire-finders-keepers",
+      "difficulty": "2.12",
+      "description": [
+        "Create a function that looks through an array (first argument) and returns the first element in the array that passes a truth test (second argument).",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function find(arr, func) {",
+        "  var num = 0;",
+        "  return num;",
+        "}",
+        "",
+        "find([1, 2, 3, 4], function(num){ return num % 2 === 0; });"
+      ],
+      "tests": [
+        "assert.strictEqual(find([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; }), 8, 'should return first found value');",
+        "assert.strictEqual(find([1, 3, 5, 9], function(num) { return num % 2 === 0; }), undefined, 'should return undefined if not found');"
+      ],
+      "MDNlinks": [
+        "Array.some()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a5deed1811a43193f9f1c841",
+      "name": "Bonfire: Drop it",
+      "dashedName": "bonfire-drop-it",
+      "difficulty": "2.13",
+      "description": [
+        "Drop the elements of an array (first argument), starting from the front, until the predicate (second argument) returns true.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function drop(arr, func) {",
+        "  // Drop them elements.",
+        "  return arr;",
+        "}",
+        "",
+        "drop([1, 2, 3], function(n) {return n < 3; });"
+      ],
+      "tests": [
+        "expect(drop([1, 2, 3, 4], function(n) {return n >= 3; })).to.eqls([3, 4]);",
+        "expect(drop([1, 2, 3], function(n) {return n > 0; })).to.eqls([1, 2, 3]);",
+        "expect(drop([1, 2, 3, 4], function(n) {return n > 5; })).to.eqls([]);"
+      ],
+      "MDNlinks": [
+        "Arguments object",
+        "Array.shift()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "ab306dbdcc907c7ddfc30830",
+      "name": "Bonfire: Steamroller",
+      "dashedName": "bonfire-steamroller",
+      "difficulty": "2.14",
+      "description": [
+        "Flatten a nested array. You must account for varying levels of nesting.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function steamroller(arr) {",
+        "  // I'm a steamroller, baby",
+        "  return arr;",
+        "}",
+        "",
+        "steamroller([1, [2], [3, [[4]]]]);"
+      ],
+      "tests": [
+        "assert.deepEqual(steamroller([[['a']], [['b']]]), ['a', 'b'], 'should flatten nested arrays');",
+        "assert.deepEqual(steamroller([1, [2], [3, [[4]]]]), [1, 2, 3, 4], 'should flatten nested arrays');",
+        "assert.deepEqual(steamroller([1, [], [3, [[4]]]]), [1, 3, 4], 'should work with empty arrays');",
+        "assert.deepEqual(steamroller([1, {}, [3, [[4]]]]), [1, {}, 3, 4], 'should work with actual objects');"
+      ],
+      "MDNlinks": [
+        "Array.isArray()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a8d97bd4c764e91f9d2bda01",
+      "name": "Bonfire: Binary Agents",
+      "dashedName": "bonfire-binary-agents",
+      "difficulty": "2.15",
+      "description": [
+        "Return an English translated sentence of the passed binary string.",
+        "The binary string will be space separated.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function binaryAgent(str) {",
+        "  return str;",
+        "}",
+        "",
+        "binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111');"
+      ],
+      "tests": [
+        "expect(binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111')).to.equal(\"Aren't bonfires fun!?\");",
+        "expect(binaryAgent('01001001 00100000 01101100 01101111 01110110 01100101 00100000 01000110 01110010 01100101 01100101 01000011 01101111 01100100 01100101 01000011 01100001 01101101 01110000 00100001')).to.equal(\"I love FreeCodeCamp!\");"
+      ],
+      "MDNlinks": [
+        "String.charCodeAt()",
+        "String.fromCharCode()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a10d2431ad0c6a099a4b8b52",
+      "name": "Bonfire: Everything Be True",
+      "dashedName": "bonfire-everything-be-true",
+      "difficulty": "2.21",
+      "description": [
+        "Check if the predicate (second argument) returns truthy (defined) for all elements of a collection (first argument).",
+        "For this, check to see if the property defined in the second argument is present on every element of the collection.",
+        "Remember, you can access object properties through either dot notation or [] notation.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function every(collection, pre) {",
+        "  // Does everyone have one of these?",
+        "  return pre;",
+        "}",
+        "",
+        "every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], 'sex');"
+      ],
+      "tests": [
+        "assert.strictEqual(every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], 'sex'), true, 'should return true if predicate returns truthy for all elements in the collection');",
+        "assert.strictEqual(every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], {'sex': 'female'}), false, 'should return false if predicate returns falsey for any element in the collection');",
+        "assert.strictEqual(every([{'user': 'Tinky-Winky', 'sex': 'female'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], {'sex': 'female'}), false, 'should return false if predicate returns falsey for any element in the collection');"
+
+      ],
+      "MDNlinks": [
+        "Object.hasOwnProperty()",
+        "Object.getOwnPropertyNames()"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    },
+    {
+      "id": "a97fd23d9b809dac9921074f",
+      "name": "Bonfire: Arguments Optional",
+      "dashedName": "bonfire-arguments-optional",
+      "difficulty": "2.22",
+      "description": [
+        "Create a function that sums two arguments together. If only one argument is provided, return a function that expects one additional argument and will return the sum.",
+        "For example, add(2, 3) should return 5, and add(2) should return a function that is waiting for an argument so that <code>var sum2And = add(2); return sum2And(3); // 5</code>",
+        "If either argument isn't a valid number, return undefined.",
+        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
+      ],
+      "challengeSeed": [
+        "function add() {",
+        "  return false;",
+        "}",
+        "",
+        "add(2,3);"
+      ],
+      "tests": [
+        "expect(add(2, 3)).to.equal(5);",
+        "expect(add(2)(3)).to.equal(5);",
+        "expect(add('http://bit.ly/IqT6zt')).to.be.undefined;",
+        "expect(add(2, '3')).to.be.undefined;",
+        "expect(add(2)([3])).to.be.undefined;"
+      ],
+      "MDNlinks": [
+        "Global Function Object",
+        "Arguments object"
+      ],
+      "challengeType": 5,
+      "nameCn": "",
+      "descriptionCn": [],
+      "nameFr": "",
+      "descriptionFr": [],
+      "nameRu": "",
+      "descriptionRu": [],
+      "nameEs": "",
+      "descriptionEs": [],
+      "namePt": "",
+      "descriptionPt": []
+    }
+  ]
+}
diff --git a/data/wiki/5-Steps-to-organizing-a-successful-Campsite-event..md b/data/wiki/5-Steps-to-organizing-a-successful-Campsite-event..md
new file mode 100644
index 0000000..13def03
--- /dev/null
+++ b/data/wiki/5-Steps-to-organizing-a-successful-Campsite-event..md
@@ -0,0 +1,18 @@
+# In-person group programming sessions and events are fun! 
+
+## This Wiki will help you with organizing a successful Campsite event.
+
+### With a little planning and communication having a successful Campsite event can be easy! Here are some steps to help you in doing this.
+###  
+
+* Determine the topic for the event (code and coffee, hack session, invite campers to another organization's event).
+
+* Find a suitable location. Campsite events should always take place in a public space (library, cafe, hackerspace).
+
+* Create an event on your Campsite's Facebook page for the event, and link to it on your Campsite Facebook Group page.
+
+* Follow-up with reminder posts for the event 1 week prior to the event and then again the day before the event.
+
+* On the day of the event arrive early, get setup, greet members, and kick the event off. Don't forget to thank everyone afterwards and extend invites to future meetups.
+
+**Try to take some pictures and post them on your Campsite's Facebook group page.**
diff --git a/data/wiki/Accessing-the-database-from-your-frontend.md b/data/wiki/Accessing-the-database-from-your-frontend.md
new file mode 100644
index 0000000..fe66434
--- /dev/null
+++ b/data/wiki/Accessing-the-database-from-your-frontend.md
@@ -0,0 +1,13 @@
+You must have noticed in **main.controller.js** how *things* were retrieved from the database and displayed:
+  
+~~~javascript
+ $http.get('/api/things').success(function(awesomeThings){  
+	$scope.awesomeThings = awesomeThings;  
+});
+
+~~~  
+
+What this does is call the api with a “get” request, which is then routed by **/server/api/thing/index.js** to the *exports.index* function in **thing.controller.js**. You’ll also notice in **main.controller.js** that there are included examples of *$http.post* and *$http.delete* functions too! How nice!  
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Fixing-exports.update)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Seed-data)
\ No newline at end of file
diff --git a/data/wiki/Adding-Environment-Variables.md b/data/wiki/Adding-Environment-Variables.md
new file mode 100644
index 0000000..ba03c81
--- /dev/null
+++ b/data/wiki/Adding-Environment-Variables.md
@@ -0,0 +1,9 @@
+1. Download [Varpanel](http://implbits.com/products/varpanel/).
+2. Open Varpanel.
+3. In PATH variable, add the relevant path.
+
+![](http://i.imgur.com/RqgGcf5.gif)
+
+## []()
+
+Easy Launch Programs using [Launchy](http://www.launchy.net/) App.
\ No newline at end of file
diff --git a/data/wiki/Angular-Resources.md b/data/wiki/Angular-Resources.md
new file mode 100644
index 0000000..b7e7cbf
--- /dev/null
+++ b/data/wiki/Angular-Resources.md
@@ -0,0 +1,14 @@
+A collection of helpful Angular resources
+
+### General Pages
+* [Angular JS](https://angularjs.org/) - The Angular JS Homepage
+* [Angular Style Guide](https://github.com/johnpapa/angular-styleguide) - Detailed best practices for Angular Development
+
+### Specific-topic Pages
+* [Directives](http://www.sitepoint.com/practical-guide-angularjs-directives/) - Excellent guide going into detail on Angular Directives (Part 1)
+* [Directives](http://www.sitepoint.com/practical-guide-angularjs-directives-part-two/) - Excellent guide going into detail on Angular Directives (Part 2)
+
+### Videos
+* [Routing in Angular JS](https://www.youtube.com/watch?v=5uhZCc0j9RY) - Client Side Routing in 15 minutes
+* [Angular ToDo App](https://www.youtube.com/watch?v=WuiHuZq_cg4) - An Angular ToDo app in 12 minutes
+* [Shaping Up with Angular.JS](https://www.codeschool.com/courses/shaping-up-with-angular-js) - A free Angular.JS tutorial
\ No newline at end of file
diff --git a/data/wiki/August-2015-Improvements.md b/data/wiki/August-2015-Improvements.md
new file mode 100644
index 0000000..c4670e6
--- /dev/null
+++ b/data/wiki/August-2015-Improvements.md
@@ -0,0 +1,28 @@
+### Email login and password reset is fixed!
+
+If you have any issues with Free Code Camp, please let us know: https://github.com/freecodecamp/freecodecamp/issues/new
+
+## Sunday's Improvements
+* replaced our getting-started videos with a simple 10-minute process (using GIFs instead of videos)
+* doubled the number of our HTML5 and Bootstrap challenges
+* replaced Codecademy's JavaScript and jQuery challenges with our own challenges
+* added our own Object-oriented Programming and Functional Programming challenges
+* added two new Zipline front end challenges (Personal Portfolio and Simon game), and moved our Ziplines to much earlier in our curriculum
+* completely replaced our Field Guide with a searchable, and easily-editable open-source wiki
+* made it so your Bonfire code is stored in your browser, so if you leave the page, your code will be there when you come back
+* simplified our portfolio pages. You can now click a single button to mirror your Free Code Camp profile with your GitHub profile. Bonfire solutions are no longer shown here, but they'll eventually be accessible through our API.
+* fixed some issues with Brownie Points and Streaks
+* improved our Camper News page by removing the (mostly unused) comments and adding one-click upvoting
+* added a Creative Commons license to literally all of our images and text
+* thanks to Loopback, everything is now an API, and we will soon publish cool ways to interact with Free Code Camp's (non-sensitive) data
+
+## FAQ
+
+### The challenge I was most recently doing disappeared.
+You can just keep going. If you have time to go back and try our new challenges, they should be a quick review for you. Otherwise, keep moving forward.
+
+### Why are you deploying all these improvements at once?
+We've been working on some of the features for months on our Staging branch. Most of them were held up by a single task: our transition to [Loopback](http://loopback.io/). @BerkeleyTrue started working on this back in March. 
+
+### Was deploying everything at once necessary?
+Probably not. Going forward, we will deploy new code several times a day (as we did prior to the Loopback feature). We plan to start using a [continuous integration](https://en.wikipedia.org/wiki/Continuous_integration) and other agile best practices as we reduce our [technical debt](https://en.wikipedia.org/wiki/Technical_debt).
diff --git a/data/wiki/August-Live-Stream.md b/data/wiki/August-Live-Stream.md
new file mode 100644
index 0000000..af64e12
--- /dev/null
+++ b/data/wiki/August-Live-Stream.md
@@ -0,0 +1,20 @@
+### Free Code Camp's [August Live Stream] (https://youtu.be/UhoxoYrJ6Qs) was the largest yet.
+
+## The agenda included:
+
+- Opening words Michael
+- New front end challenges [3:00] (https://youtu.be/UhoxoYrJ6Qs?t=3m)
+- Newly configured full-stack challenges
+- New Nonprofit Projects [12:32] (https://youtu.be/UhoxoYrJ6Qs?t=12m32s)
+- Wiki [22:49] (https://youtu.be/UhoxoYrJ6Qs?t=22m49s)
+- New chat rooms [29:40] (https://youtu.be/UhoxoYrJ6Qs?t=29m40s)
+- New Live Streams [35:34] (https://youtu.be/UhoxoYrJ6Qs?t=35m34s)
+- New Internet Radio Station DJ'd by campers [36:30] (https://youtu.be/UhoxoYrJ6Qs?t=36m30s)
+- FCC Bot [39:24] (https://youtu.be/UhoxoYrJ6Qs?t=39m24s)
+- Matt Yamamoto Zipline Demo [54:24] (https://youtu.be/UhoxoYrJ6Qs?t=54m24s)
+- Closing from Quincy [1:04:15] (https://youtu.be/UhoxoYrJ6Qs?t=1h4m15s)
+- [Pull Request After Party with Quincy] (https://youtu.be/r0lCJ_TFYlI)
+
+<a href="http://www.youtube.com/watch?feature=player_embedded&v=UhoxoYrJ6Qs
+" target="_blank"><img src="https://www.evernote.com/l/AnvmsUWWNeJFNbfm7fDa7SRLmnbn7jafRL4B/image.png" 
+alt="Screen shot from our twitch feed on August 1 2015" width="560" height="315"border="10" /></a>
\ No newline at end of file
diff --git a/data/wiki/Backend-file-structure.md b/data/wiki/Backend-file-structure.md
new file mode 100644
index 0000000..1124170
--- /dev/null
+++ b/data/wiki/Backend-file-structure.md
@@ -0,0 +1,9 @@
+Your app’s backend api that interacts with your database is located in **/server/api**  
+Let’s take a look at **/server/api/thing**: 
+
+1. **index.js**:  this file routes the $http API requests made from your app’s front-end to the appropriate function in **thing.controller.js ** 
+2. **thing.controller.js**: Here is where we actually deal with the database! Take a minute to look through here and figure out what’s going on. These functions will: return all items in a collection, return a single item from a collection when passed its id, post an item to a collection, update an item in the collection (this doesn’t really work as intended out of the box, we're going to fix that in a minute), and of course, delete an item from the collection.  
+3. **thing.model.js**: Here, the actual structure of a *thing* object is defined. You can add or remove any fields you want from the *thing* model, and as long as they’re syntactically correct they won’t break anything, even if there are *things* with different schemas in your database already. But! You don’t just have to edit the *thing* model to make a new type of collection, because generator-angular-fullstack can do it for you!
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Grunt)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-API-endpoint)
\ No newline at end of file
diff --git a/data/wiki/Basejump-Resources.md b/data/wiki/Basejump-Resources.md
new file mode 100644
index 0000000..217dd98
--- /dev/null
+++ b/data/wiki/Basejump-Resources.md
@@ -0,0 +1,30 @@
+The curriculum lead-up to the first Basejump is not very comprehensive.  Here are a number of common resources which other campers have found helpful.
+
+### Getting Started with Yeoman
+* https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Intro-to-Yeoman-Angular-Fullstack-Basejumps - Lots of helpful tips and tricks for the Yeoman Angular Fullstack setup
+* https://github.com/DaftMonk/generator-angular-fullstack#generators - Generator used by Yeoman, you can find syntax and what files it creates
+
+### APIs
+* API for Charting the stock market: https://www.quandl.com/help/api
+
+### MEAN Stack Videos
+* https://www.youtube.com/watch?v=kHV7gOHvNdk - 5 Part Series on setting up a MEAN stack
+
+### MEAN Stack Tutorials
+* Clementine is a stripped down MEAN stack, great for learning the fundamentals.  
+https://johnstonbl01.github.io/clementinejs/tutorials/tutorial-beginner.html
+
+* Authentication with Passport for the MEAN stack:
+https://vickev.com/#!/article/authentication-in-single-page-applications-node-js-passportjs-angularjs
+
+* An amazing list of resources for learning the MEAN stack:
+https://github.com/ericdouglas/MEAN-Learning
+
+### Scotch IO Tutorials
+* https://scotch.io/tutorials/setting-up-a-mean-stack-single-page-application   
+* https://scotch.io/tutorials/node-and-angular-to-do-app-application-organization-and-structure
+
+### Cloud 9 Tricks
+##### Speed up browser reloads
+1. Open gruntfile.js and edit both instances of `livereload: true` to `livereload: false`.
+2. Open server/config/express.js and comment out the line `app.use(require('connect-livereload')());`
\ No newline at end of file
diff --git a/data/wiki/Bobby-Tables.md b/data/wiki/Bobby-Tables.md
new file mode 100644
index 0000000..12c93b4
--- /dev/null
+++ b/data/wiki/Bobby-Tables.md
@@ -0,0 +1,2 @@
+![Her daughter is named Help I'm trapped in a driver's license factory](https://imgs.xkcd.com/comics/exploits_of_a_mom.png)  
+*Source:[xkcd](https://xkcd.com/327/)*
diff --git a/data/wiki/Bonfire Meet Bonfire.md b/data/wiki/Bonfire Meet Bonfire.md
new file mode 100644
index 0000000..dac0aac
--- /dev/null
+++ b/data/wiki/Bonfire Meet Bonfire.md	
@@ -0,0 +1,32 @@
+# Explanation:
+This is very simple, they just want you to get familiar with how their Bonfires work.
+
+## Hint: 1
+Read details.
+
+## Hint: 2
+Did you read all the details?
+
+## Hint: 3
+You need to change the return statement to what they ask.
+
+## Spoiler Alert!
+[![687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/thumb/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)
+
+**Solution ahead!**
+
+## Solution Code:
+
+```
+function meetBonfire(argument) {
+  // Good luck!
+  console.log("you can read this function's argument in the developer tools", argument);
+
+  return true;
+}
+
+meetBonfire("You can do this!");
+```
+
+## Code Explanation:
+All you had to do was change from false to true.
diff --git a/data/wiki/Bonfire-Factorialize-a-Number.md b/data/wiki/Bonfire-Factorialize-a-Number.md
new file mode 100644
index 0000000..d48b3d8
--- /dev/null
+++ b/data/wiki/Bonfire-Factorialize-a-Number.md
@@ -0,0 +1,93 @@
+You should make sure to try hard to solve the Bonfire yourself before reading this!
+# :link: [Original Bonfire](http://www.freecodecamp.com/challenges/bonfire-factorialize-a-number) :point_right:  
+
+## Author
+![Luis](https://avatars3.githubusercontent.com/u/6039444?v=3&s=96) submitted by [luishendrix92](//freecodecamp.com/luishendrix92) | https://github.com/luishendrix92
+
+## The problem
+Return the factorial of the provided integer.
+If the integer is represented with the letter n, a factorial is the product of all positive integers less than or equal to n.
+
+Factorials are often represented with the shorthand notation n!
+
+For example: `5! = 1 * 2 * 3 * 4 * 5 = 120f`
+
+## Analysis
+Return the factorial of the provided integer.
+If the integer is represented with the letter n, a factorial is the product of all positive integers less than or equal to n.
+Factorials are often represented with the shorthand notation n!
+For example: 5! = 1 * 2 * 3 * 4 * 5 = 120
+
+## Outline
+This one is simple, since the factorials of both 0 and 1 is just 1, you can go ahead and return 1. The IF function here is responsible for breaking the loop I created using a **recursive function**, first it checks if the number you gave the function is 0 or 1 and then returns 1 if the condition passed; since there's no ELSE, the rest of the function is executed.
+
+## Understanding recursion
+Now, I put the references I studied to understand a *little bit* of how recursion works, and it's when a function repeats itself. The first time I did this challenge I used a short but effective **while loop** but I wanted to make it shorter and more efficient, you know... because of reasons ;).
+Basically what this does is return the number you gave multiplied by the function itself but this time the value passed to the *num* parameter is `num-1` which ultimately translates to 4. The very function is going to **run inside itself** haha, funny eh? It's like having functions that run inside themselves until they reach a very deep level (depends on how many times it runs itself).
+
+## Visualizing the flow
+![Recursion](http://i61.tinypic.com/28auvsw.jpg)
+
+The first **returned** value can be visualised better if you think about those parenthesis operations you did in secondary school where you do the math inside every parenthesis, bracket and square bracket until you get a final result (a total). This time it's the same thing, look at the program flow:
+
+## During the first execution of the function:
+[**num** = 5]
+
+Is 5 *equal* to 1 or 0? **No** ---> Oki doki, let's continue...
+
+**Returns:**
+
+(**5** * (*second execution*: **4** * (*third execution*: **3** * (*fourth execution*: **2** * *fifth execution*: **1**))))
+
+What it returns can be viewed as `(5*(4*(3*(2*1))))` or just `5 * 4 * 3 * 2 * 1`, and the function will return the result of that operation: `120`.
+Now, let's check whhat the rest of the executions do:
+
+## During the rest of the executions:
+- **Second Execution**: *num* = 5-1 = **4** -> is *num* 0 or 1? No --> return the multiplication between 4 and the next result when *num* is now 4-1.
+
+- **Third Execution**: *num* = 4 - 1 = **3** -> is *num* 0 or 1? No --> return the multiplication between 3 and the next result when *num* is now 3-1.
+
+- **Fourth Execution**: *num* = 3-1 = **2** -> is *num* 0 or 1? No --> return the multiplication between 2 and the next result when *num* is now 2-1.
+
+- **Fifth Execution**: *num* = 2-1 = **1** -> is *num* 0 or 1? Yep --> return **1**. And this is where the recursion stops because there are no more executions.
+
+## :construction: My Solution is coming up!
+Don't scroll down if you don't want to see it!
+
+![warning](http://www.yourdrum.com/yourdrum/images/2007/10/10/red_warning_sign_2.gif)        
+
+```
+           ,,,         ,,,
+          ;"   ^;     ;'   ",
+          ;    s$$$$$$$s     ;
+          ,  ss$$$$$$$$$$s  ,'
+          ;s$$$$$$$$$$$$$$$
+          $$$$$$$$$$$$$$$$$$
+         $$$$P""Y$$$Y""W$$$$$      -{ Happy Camping! }
+         $$$$  p"$$$"q  $$$$$
+         $$$$  .$$$$$.  $$$$
+          $$DcaU$$$$$$$$$$
+            "Y$$$"*"$$$Y"    
+                "$b.$$"     
+```
+
+## My solution
+``` javascript
+function factorialize(num) {
+  if (num === 0 || num == 1) { return 1; }
+  return num * factorialize(num-1);
+}
+
+factorialize(5);
+```
+
+
+
+## References
+- **Recursion**: https://www.codecademy.com/es/courses/javascript-lesson-205/0/1
+- **Factorialization**: https://en.wikipedia.org/wiki/Factorial
+- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators
+
+## If you enjoyed this guide, then type:
+`thanks @luishendrix92`
+in the chat!
diff --git a/data/wiki/Bonfire-Reverse-a-String.md b/data/wiki/Bonfire-Reverse-a-String.md
new file mode 100644
index 0000000..bf2c1d4
--- /dev/null
+++ b/data/wiki/Bonfire-Reverse-a-String.md
@@ -0,0 +1,29 @@
+# Problem Explanation:
+You need to take the string and reverse it so if you had originally 'hello', it will turn into 'olleh'. Because you will need to split it, you will be working with Arrays too.
+
+# Hint: 1
+- You should split the string by characters.
+
+# Hint: 2
+- Find out about the built in function to reverse a string.
+
+# Hint: 3
+- Once you have split and reversed, do not forget to join them back into one string.
+
+# Spoiler Alert!
+[![687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/thumb/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)
+
+**Solution ahead!**
+
+# Solution Code:
+
+```
+function reverseString(str) {
+  var strReverse = str.split('').reverse().join('');
+
+  return strReverse;
+}
+```
+
+# Code Explanation:
+This is a straightforward code. We create a variable that will hold the string split by characters, and then reversed and put back together.
diff --git a/data/wiki/Bonfire-Style-Guide.md b/data/wiki/Bonfire-Style-Guide.md
new file mode 100644
index 0000000..61e4702
--- /dev/null
+++ b/data/wiki/Bonfire-Style-Guide.md
@@ -0,0 +1,43 @@
+*work in progress*
+
+# Bonfire Style Guide
+
+Writing Bonfire challenges is a great way to exercise your own problem solving and testing abilities. It is a simple three step process.
+
+1. Fill out the generator form and test your challenge: http://www.freecodecamp.com/bonfire-challenge-generator
+2. Once you have confirmed a working bonfire challenge in the generator, copy and paste the the fields into the JSON generator: http://www.freecodecamp.com/bonfire-json-generator
+3. Copy the JSON, fork the freecodecamp repository, and submit a pull request with your addition to the bonfires.json: https://github.com/FreeCodeCamp/freecodecamp/blob/master/seed_data/bonfires.json
+
+## Name
+
+Name your challenge
+
+## Difficulty
+
+Attempt to rate difficulty compared against existing bonfire challenges.
+
+*TODO: add basic quantifiers for each difficulty level*
+
+## Description
+
+Separate paragraphs with a line break. Only the first paragraph is visible prior to a user clicking the "More information" button.
+
+All necessary information must be included in the first paragraph. Write this first paragraph as succinct as possible. Subsequent paragraphs should offer hints or details if needed.
+
+If your subject matter warrants deeper understanding, you may link to Wikipedia.
+
+## Challenge Seed
+
+This is important.
+
+## ~~Challenge Entry Point~~ (deprecated)
+
+*Leave this field blank. It will soon be removed from the generator.*
+
+## Tests
+
+These tests are what bring your challenge to life. Without them, we cannot confirm the accuracy of a user's submitted answer. Choose your tests wisely.
+
+Bonfire tests are written using the [Chai.js](http://chaijs.com/) assertion library. Please use the `should` and `expect` syntax for end user readability. As an example of what not do to, many of the original Bonfire challenges are written with `assert` syntax and many of the test cases are difficult to read.
+
+If your bonfire question has a lot of edge cases, you will need to write many tests for full coverage. If you find yourself writing more tests than you desire, you may consider simplifying the requirements of your bonfire challenge. For difficulty level 1 through 3, you will generally only need 2 to 4 tests.
\ No newline at end of file
diff --git a/data/wiki/Bonfire-Symmetric-Difference.md b/data/wiki/Bonfire-Symmetric-Difference.md
new file mode 100644
index 0000000..4226406
--- /dev/null
+++ b/data/wiki/Bonfire-Symmetric-Difference.md
@@ -0,0 +1,21 @@
+Symmetric Difference is the difference between **two** sets.
+
+So in the Symmetric Difference Bonfire you would work through the arrays of numbers something like this - 
+
+`sym(A, B, C)`
+Translates to
+`sym(sym(A,B),C)`
+
+Or in plain English - First find the Symmetric Difference of Set A and Set B. Then find the Symmetric Difference of this new set and Set C.
+
+So - 
+
+`sym([1, 2, 5], [2, 3, 5], [3, 4, 5])`
+
+would equal
+
+`[1,4,5]`
+
+Here's a nice video tutorial (with an awful fake British accent!) -
+
+[YouTube - Symmetric Difference](https://www.youtube.com/watch?v=PxffSUQRkG4)
\ No newline at end of file
diff --git a/data/wiki/Bonfire-Wiki-Template.md b/data/wiki/Bonfire-Wiki-Template.md
new file mode 100644
index 0000000..b557f0b
--- /dev/null
+++ b/data/wiki/Bonfire-Wiki-Template.md
@@ -0,0 +1,25 @@
+# Problem Explanation:
+- Explain what is asked in an easy to understand way.
+
+## Hint: 1
+- Add hint here.
+
+## Hint: 2
+- Add hint here.
+
+## Hint: 3
+- Add hint here.
+
+## Spoiler Alert!
+[![687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/thumb/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)
+
+**Solution ahead!**
+
+## Solution Code:
+
+```
+code here
+```
+
+## Code Explanation:
+- Explain your code here
diff --git a/data/wiki/Bonus-SocketIO.md b/data/wiki/Bonus-SocketIO.md
new file mode 100644
index 0000000..9239114
--- /dev/null
+++ b/data/wiki/Bonus-SocketIO.md
@@ -0,0 +1,9 @@
+If you've gotten to the Stock Charting basejump you may have noticed that the bonus criteria is to have your stock list live update across clients. This can be accomplished with SocketIO, but that’s not all SocketIO can do. Remember earlier, I mentioned that when using *$http.post* you had to update your local array with the database's version of the item you were posting? SocketIO keeps a user’s browser environment synced with your database in realtime. This has two practical upshots:  
+
+1. You no longer have to manually update your local data with database data; it is all managed automatically
+2. You can push database changes live to users on different machines all at the same time  
+
+Even better, if you just include SocketIO when prompted during the yeoman angular-fullstack setup, there is absolutely no work involved to include it. It works out of the box, has a working demo on the **main/** route, and you can learn how to use it yourself by simply looking at how they include it in **main.controller.js** (so I won’t go any further into detail).
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/isLoggedInAsync())
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Epilogue)
\ No newline at end of file
diff --git a/data/wiki/Brownie-Points.md b/data/wiki/Brownie-Points.md
new file mode 100644
index 0000000..923ed70
--- /dev/null
+++ b/data/wiki/Brownie-Points.md
@@ -0,0 +1,13 @@
+The number beside your picture on Free Code Camp tells you how many Brownie Points you have.
+
+![A user profile picture next to a with Brownie Points score](http://i.imgur.com/SsvbkDH.png)
+
+There are three ways you can get Brownie Points:
+
+1. Complete challenges - you get one point per challenge you complete    
+1. Post relevant links on [Camper News](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Camper-News) - you get 1 point for posting a link, and another point for each upvote your link gets    
+1. Help other campers in chat - each time you help another camper and they thank you (by typing "thanks @yourname"), you will get a point    
+
+Brownie Points help you look like the kind of person who codes a lot, shares relevant links, and helps people. 
+
+They also add to your [Streak](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/streak/).
\ No newline at end of file
diff --git a/data/wiki/Camper-News.md b/data/wiki/Camper-News.md
new file mode 100644
index 0000000..c8b8b2a
--- /dev/null
+++ b/data/wiki/Camper-News.md
@@ -0,0 +1,11 @@
+Camper News is a link sharing tool, based on popular collaborative filtering systems like Reddit and Hacker News.
+
+![Screenshot of Camper News](https://www.evernote.com/l/AlwvYXoOf89EbYXWEXRfUw-_yHdBwx2jLr8B/image.png)
+
+Camper News is intentionally simple. You can:
+
+1. Browse and search through the camper-submitted links
+1. Upvote links
+1. Submit links of your own
+
+Our links are ranked in order of "hotness", which is a combination of each link's upvote count, and how recently the link was submitted.
\ No newline at end of file
diff --git a/data/wiki/Casual-Chat-Rooms.md b/data/wiki/Casual-Chat-Rooms.md
new file mode 100644
index 0000000..6017daa
--- /dev/null
+++ b/data/wiki/Casual-Chat-Rooms.md
@@ -0,0 +1,20 @@
+The following are our casual chat rooms.
+
+**Please note that all chat rooms listed here are publicly accessible and indexed by search engines, so only share email addresses or other sensitive information in private messages.**
+
+| Chat Room | Description |
+| --- | --- |
+| [Hardware](https://gitter.im/freecodecamp/Hardware) | chat about computer hardware and Internet of Things | 
+| [GameDev](https://gitter.im/freecodecamp/GameDev) | chat about designing and developing video games | 
+| [Gaming](https://gitter.im/freecodecamp/Gaming) | chat about gaming of all kinds, such as video games and table top games | 
+| [TVandMovies](https://gitter.im/freecodecamp/TVandMovies) | chat about TV shows and movies | 
+| [Sports](https://gitter.im/freecodecamp/Sports) | chat about sports | 
+| [Music](https://gitter.im/freecodecamp/Music) | chat about music | 
+| [Art and Photography](https://gitter.im/freecodecamp/Photography) | chat about art, photography and videography | 
+| [Business](https://gitter.im/freecodecamp/Business) | chat about business and entrepreneurship | 
+| [Saving](https://gitter.im/freecodecamp/Saving) | chat about saving, investing, and home economics | 
+| [SelfImprovement](https://gitter.im/freecodecamp/SelfImprovement) | chat about productivity, self improvement and quantified self |
+
+By joining these chat rooms, you accept our [Code of Conduct](https://github.com/FreeCodeCamp/freecodecamp/wiki/Code-of-Conduct). If you think we should add a chat room, please [message @quincylarson in Gitter](https://gitter.im/QuincyLarson).
+
+[Official Free Code Camp chat rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/Official-Free-Code-Camp-Chat-Rooms)
\ No newline at end of file
diff --git a/data/wiki/Clear-Your-Browser's-Local-Storage.md b/data/wiki/Clear-Your-Browser's-Local-Storage.md
new file mode 100644
index 0000000..cee7e28
--- /dev/null
+++ b/data/wiki/Clear-Your-Browser's-Local-Storage.md
@@ -0,0 +1,14 @@
+Removing all your locally stored challenges will solve many problems related to the browser crashing on FreeCodeCamp
+
+In Chrome:
+* On 'freecodecamp.com' open your console
+ * Windows: Ctrl + Shift + J
+ * Mac OS: Cmd + Opt + J
+* Go to resources tab(chrome). 
+ * There click on the localStorate link in the nav bar on the right.
+* Delete all the entries on the right side. 
+* See if this solves your issue
+
+![](https://cloud.githubusercontent.com/assets/6775919/9448820/911626ee-4a53-11e5-98c9-b2bf4ca50816.png)
+
+Alternatively, if you are having issue's with a specific challenge freezing your browser find the name of that challenge in local storage and delete just that one.
\ No newline at end of file
diff --git a/data/wiki/Code-Style-Guide.md b/data/wiki/Code-Style-Guide.md
new file mode 100644
index 0000000..7d0192e
--- /dev/null
+++ b/data/wiki/Code-Style-Guide.md
@@ -0,0 +1,60 @@
+# Free Code Camp Style Guide
+<small>or How Cool People Write JavaScript.</small>
+
+
+## indent
+  #alwaysUseTwoSpaces
+
+  no hard tabs, ever. No really, just don't do it.
+
+## curly braces
+ #curlyBracesEverywhere!
+
+## space after `function` keyword expect in anonymous functions.
+Good:
+```js
+var foo = function() {
+  // ...
+};
+
+function foo() {
+}
+
+```
+Bad: 
+```js
+var foo = function () {
+  // ...
+};
+
+function foo ()
+{
+  // ...
+}
+```
+## comments
+
+ * no inline comments
+ * single space after `//`
+ * Do not use multiline comment `/* */`, we are reserving these for use with jsDocs.
+
+## keywords
+
+ * space immediately after if, else, while, etc
+ * opening curly brace should always be on the same line.
+
+Good:
+```js
+if (true) {
+ // do the thing
+}
+```
+
+Bad:
+```js
+if(true)
+{
+ // do the thing
+}
+```
+...more to come
\ No newline at end of file
diff --git a/data/wiki/Code-of-Conduct.md b/data/wiki/Code-of-Conduct.md
new file mode 100644
index 0000000..c6884a2
--- /dev/null
+++ b/data/wiki/Code-of-Conduct.md
@@ -0,0 +1,20 @@
+Free Code Camp is friendly place to learn to code. We're committed to keeping it that way.
+
+All campers are required to agree with the following code of conduct. We'll enforce this code. We're expecting cooperation from all campers in ensuring a friendly environment for everybody.
+
+In short: be nice to your fellow campers.
+
+Remember these 3 things and your fellow campers will like you:
+- Compliment your fellow campers when they do good work. Congratulate them when they accomplish something (like finishing a nonprofit project or getting a job).
+- Critique the work, not the camper doing it.
+- Only argue about something if it's important to the greater discussion.
+
+Free Code Camp should be a harassment-free experience for everyone, regardless of gender, gender identity and expression, age, sexual orientation, disability, physical appearance, body size, race, national origin, or religion (or lack thereof).
+
+We do not tolerate harassment of campers in any form, anywhere on Free Code Camp's online media (Gitter, Twitch, etc.) or during pair programming. Harassment includes sexual language and imagery, deliberate intimidation, stalking, unwelcome sexual attention, libel, and any malicious hacking or social engineering.
+
+If a camper engages in harassing behavior, our team will take any action we deem appropriate, up to and including banning them from Free Code Camp.
+
+We want everyone to feel safe and respected. If you are being harassed or notice that someone else is being harassed, say something! Message @quincylarson, @brianamarie and @codenonprofit in Gitter (preferably with a screen shot of the offending language) so we can take fast action.
+
+If you have questions about this code of conduct, email us at [team@freecodecamp.com](mailto:team@freecodecamp.com).
\ No newline at end of file
diff --git a/data/wiki/Coding-Help.md b/data/wiki/Coding-Help.md
new file mode 100644
index 0000000..f811934
--- /dev/null
+++ b/data/wiki/Coding-Help.md
@@ -0,0 +1,21 @@
+# Coding Help
+I started this list while doing bonfires, noticing a few things that were common issues / questions but I think most of them are going to be useful to people coding in general. If you've got some tips to help people code I'd love to hear them.
+
+1. If you don't know where to start, write some pseudocode. Plan out the logic you're trying to implement in your native language before you try to put it into code.
+
+2. Comment your code! Can't stress that one enough, if you get lost or take a break then come back you need to know what your code is trying to do. It will also reinforce what the code means to you, and help other people understand what your code does if you get stuck and ask for help. If you've got a any other tips for campers I'd love to see them!
+
+3. Use the chrome javascript debugger console in conjunction with something like netbeans IDE or sublime text to write your code. Both are free to download. <br />
+The free code camp window is great but you can get a lot more feedback on your code's behaviour by using chrome's JS debugger and a bunch of **console.log(myVariableGoesHere);** <br />
+https://developer.chrome.com/devtools/docs/console <br />
+http://www.sublimetext.com/ <br />
+https://netbeans.org/downloads/
+
+4. Posting your code in gitter is as simple as adding a line consisting of only
+> \`\`\`
+>     
+> Then your code on the next lines, followed by a final
+>     
+> \`\`\`
+
+5. Ask for help in gitter! I can personally relate to staring at a problem for hours, then seeing the solution as soon as I try to explain it to someone, or having someone say something like "typo on line 6" as soon as they see it.
\ No newline at end of file
diff --git a/data/wiki/Create,-Upload-and-Link-Animated-GIF-Image.md b/data/wiki/Create,-Upload-and-Link-Animated-GIF-Image.md
new file mode 100644
index 0000000..61e6139
--- /dev/null
+++ b/data/wiki/Create,-Upload-and-Link-Animated-GIF-Image.md
@@ -0,0 +1,7 @@
+1. Download [LICEcap](http://www.cockos.com/licecap/) and install.
+2. Open and start recording to create animated GIF.
+3. Upload the `.gif` file in [EZGIF.com](http://ezgif.com/optimize).
+   - Crop, Resize and Optimize as many times or as required.
+4. Download animated GIF.
+5. Upload image to [imgur.com](http://imgur.com).
+6. Link image using `![image title](http://i.imgur.com/RqgGcf5.gif)`.
\ No newline at end of file
diff --git a/data/wiki/Creating-a-New-Github-Issue.md b/data/wiki/Creating-a-New-Github-Issue.md
new file mode 100644
index 0000000..08edf1a
--- /dev/null
+++ b/data/wiki/Creating-a-New-Github-Issue.md
@@ -0,0 +1,14 @@
+Before submitting an issue try [Searching for Your Issue on Github](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Searching-for-Your-Issue-on-Github)
+
+Crafting a good issue will make it much easier for the dev team to replicate and resolve your problem. Follow these steps to do it right:
+
+1. Go to FreeCodeCamp's [Github Issues](https://github.com/FreeCodeCamp/FreeCodeCamp/issues) page and click on `New Issue`.
+* **Have a useful title**
+ * Write a meaningful title that describes the issue. Some good examples are `Logging in from the News and Field Guide pages doesn't redirect properly (using e-mail)` and `Typo: "for" instead of "while" loop`; bad examples include `A bug, HELP!!!11` and `I found this bug in a waypoint`.
+ * Keep the title relatively short, the description is for further information. One example is to shorten long waypoint names, so instead of writing `Test case bug in 'Waypoint: Check Radio Buttons and Checkboxes by Default'`, you might want to write `Test case bug in 'Radio Buttons' waypoint`.
+* In the body, **provide a link** to the page on which you encountered this issue.
+* **Describe the problem** and **provide steps** so that a developer can try to replicate the issue.  Include your operating system and browser version.
+ * When referencing other issues or pull requests, simply write #issue/pr-number.
+* Paste in any relevant code using proper [Code Formatting](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/code-formatting.)
+* **Take a screenshot** of the issue and include it in the post.
+* Click `Submit New Issue` and you are done! You will be automatically subscribed to notifications for any updates or future comments.
\ No newline at end of file
diff --git a/data/wiki/Creating-a-new-API-endpoint.md b/data/wiki/Creating-a-new-API-endpoint.md
new file mode 100644
index 0000000..7860dde
--- /dev/null
+++ b/data/wiki/Creating-a-new-API-endpoint.md
@@ -0,0 +1,5 @@
+	>> yo angular-fullstack:endpoint whatsit
+ Using this line, you get Yeoman to automatically generate another API endpoint and new kind of collection for your database. Now we have *things* as well as *whatsits*! Feel free to open up **/server/api/whatsit/whatsit.model.js** and define your whatsit however you like.
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Backend-file-structure)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Fixing-exports.update)
\ No newline at end of file
diff --git a/data/wiki/Creating-a-new-directive.md b/data/wiki/Creating-a-new-directive.md
new file mode 100644
index 0000000..f58ddb9
--- /dev/null
+++ b/data/wiki/Creating-a-new-directive.md
@@ -0,0 +1,12 @@
+Do you remember custom directives from the shaping up with angular course? You can also make a custom directive!
+
+	>> yo angular-fullstack:directive newdirective
+
+And if you need an html template for your custom directive (maybe you’re just making a directive to clean up your HTML code), tell it to make an html file when it prompts you to and you'll be able to include the contents of that template anywhere in your app with:
+
+~~~html
+<newdirective></newdirective>
+~~~
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-route)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Grunt)
\ No newline at end of file
diff --git a/data/wiki/Creating-a-new-route.md b/data/wiki/Creating-a-new-route.md
new file mode 100644
index 0000000..ae7760c
--- /dev/null
+++ b/data/wiki/Creating-a-new-route.md
@@ -0,0 +1,10 @@
+	>> yo angular-fullstack:route newpage 
+   Typing the above into your command-line will generate a **newpage/** route for your app! It automatically generates all the necessary files within your **/client/app/newpage** folder, like your **/client/app/main** folder, with a **newpage.controller.js**, **newpage.controller.spec.js**, **newpage.js**, and **newpage.html**. These all pretty much behave like the ones in the **main/** route. If you’re accessing the database in your newpage controller, you’ll want to add *$http* to the list of dependencies in **newpage.controller.js** the same way it’s included in **main.controller.js**: 
+
+~~~javascript
+angular.module('myApp')
+  .controller('MainCtrl', function ($scope, $http) { ...
+~~~
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Frontend-file-structure)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-directive)
\ No newline at end of file
diff --git a/data/wiki/Dynamic-URLs-using-$routeParams.md b/data/wiki/Dynamic-URLs-using-$routeParams.md
new file mode 100644
index 0000000..f09508e
--- /dev/null
+++ b/data/wiki/Dynamic-URLs-using-$routeParams.md
@@ -0,0 +1,30 @@
+What if you have a lot of users posting *things* to your website? Maybe your users want to have a profile, or a wall, of the *things* they’ve posted, and they want to be able to share it with their friends with a url? You can do that, no biggie!
+
+Let’s say you used 
+
+	>> yo angular-fullstack:route wall
+
+to generate a <a href="#">http://myapp.wherever.com/wall/</a> route for your users. You want a link to <a href="#">http://myapp.wherever.com/wall/someUsername</a> to show a specific user’s *things*.  
+Browse to **/client/app/wall/wall.js** and notice that it detects what URL the user is requesting before acting on it:  
+
+~~~javascript
+$routeProvider.when('/wall', …
+~~~
+You can customize that path to catch when a user is trying to see a profile associated with a specific username like so:  
+
+~~~javascript
+$routeProvider.when('/wall/:username', …
+~~~
+The colon before "username" indicates that this is a variable, which is then passed to the *$routeParams* module. In **wall.controller.js**, include *$routeParams*:  
+
+~~~javascript
+.controller('WallCtrl', function ($scope, $routeParams) { …
+~~~
+Then later on in **wall.controller.js**, you can see what username was requested in the URL by referring to the variable generated by *$routeProvider* using something like  
+
+~~~javascript
+var wallOwner = $routeParams.username;
+~~~
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Quick-tip:-keep-data-in-sync)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/More-useful-APIs)
\ No newline at end of file
diff --git a/data/wiki/Edit-or-Delete-message.md b/data/wiki/Edit-or-Delete-message.md
new file mode 100644
index 0000000..1f480db
--- /dev/null
+++ b/data/wiki/Edit-or-Delete-message.md
@@ -0,0 +1,3 @@
+> Editing or Deleting a previous message within 5 mins. of posting
+
+![How to delete message](http://i.imgur.com/gDivlLJ.gif)
\ No newline at end of file
diff --git a/data/wiki/Epilogue.md b/data/wiki/Epilogue.md
new file mode 100644
index 0000000..ed91e40
--- /dev/null
+++ b/data/wiki/Epilogue.md
@@ -0,0 +1,13 @@
+If you have any issues not covered in this guide: 
+
+1. google google google google duckduckgo
+2. bug @freecodecamp and me (@clnhll) on twitter
+3. did you miss a semicolon? a comma? 
+4. make a big loud stink in the freecodecamp help gitter.
+
+If you notice any inaccuracies or bad coding practices in this guide, please let me know ASAP! 
+
+I believe in you!
+-[clnhll](https://github.com/clnhll)
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Bonus:-SocketIO)
\ No newline at end of file
diff --git a/data/wiki/Fixing-exports.update.md b/data/wiki/Fixing-exports.update.md
new file mode 100644
index 0000000..0cd449c
--- /dev/null
+++ b/data/wiki/Fixing-exports.update.md
@@ -0,0 +1,14 @@
+As it turns out, in **thing.controller.js** as well as in any other endpoints you may generate, the *exports.update* function that is called when you make an *$http.put* call from your frontend to modify an existing database object is broken. This is a <a href="https://github.com/DaftMonk/generator-angular-fullstack/issues/310">known issue</a>, and can be fixed by changing the following line:
+ 
+~~~javascript
+// Updates an existing thing in the DB.
+exports.update = function(req, res) { 
+...    
+    var updated = _.extend(thing, req.body); 
+    // change _.merge to _.extend
+... 
+ };
+~~~
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-API-endpoint)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Accessing-the-database-from-your-frontend)
\ No newline at end of file
diff --git a/data/wiki/Free-Code-Camp's-Privacy-Policy.md b/data/wiki/Free-Code-Camp's-Privacy-Policy.md
new file mode 100644
index 0000000..620ee0e
--- /dev/null
+++ b/data/wiki/Free-Code-Camp's-Privacy-Policy.md
@@ -0,0 +1,53 @@
+Free Code Camp is committed to respecting the privacy of visitors to our web sites and web applications. The guidelines below explain how we protect the privacy of visitors to FreeCodeCamp.com and its features.
+
+### Personally Identifiable Information
+
+Free Code Camp protects the identity of visitors to FreeCodeCamp.com by limiting the collection of personally identifiable information.
+
+Free Code Camp does not knowingly collect or solicit personally identifiable information from or about children under 13, except as permitted by law. If we discover we have received any information from a child under 13 in violation of this policy, we will delete that information immediately. If you believe Free Code Camp has any information from or about anyone under 13, please email us at [team@freecodecamp.com](mailto:team@freecodecamp.com).
+
+All personally identifiable information you provide to us is used by Free Code Camp and its team to process and manage your account, analyze the demographic of our users, or to deliver services through the site. 
+
+If you choose to provide personally identifiable information to us, you may receive occasional emails from us that are relevant to Free Code Camp, getting a job, or learning to code in general.
+Free Code Camp may also use other third-party providers to facilitate the delivery of the services described above, and these third-party providers may be supplied with or have access to personally identifiable information for the sole purpose of providing these services, to you on behalf of Free Code Camp.
+
+Free Code Camp may also disclose personally identifiable information in special legal circumstances. For instance, such information may be used where it is necessary to protect our copyright or intellectual property rights, or if the law requires us to do so.
+
+### Anonymous Information
+Anonymous aggregated data may be provided to other organizations we associate with for statistical purposes. For example, we may report to an organization that a certain percentage of our site's visitors are adults between the ages of 25 and 35.
+
+### Cookies and Beacons—Use by Free Code Camp; Opting Out
+We use cookies and software logs to monitor the use of FreeCodeCamp.com and to gather non-personal information about visitors to the site. Cookies are small files that Free Code Camp transfers to the hard drives of visitors for record-keeping purposes. These monitoring systems allow us to track general information about our visitors, such as the type of browsers (for example, Firefox or Internet Explorer), the operating systems (for instance, Windows or Macintosh), or the Internet providers (for instance, Comcast) they use. This information is used for statistical and market research purposes to tailor content to usage patterns and to provide services requested by our customers. To delete these cookies, please see your browser's privacy settings.
+
+A beacon is an electronic file object (typically a transparent image) placed in the code of a Web page. We use third party beacons to monitor the traffic patterns of visitors from one Free Code Camp.com page to another and to improve site performance.
+None of the information we gather in this way can be used to identify any individual who visits our site.
+
+### Security
+
+Any personally identifiable information collected through this site is stored on limited-access servers. We will maintain safeguards to protect these servers and the information they store.
+
+### Surveys
+We may occasionally conduct on-line surveys. All surveys are voluntary and you may decline to participate.
+
+### Copyright
+All of the content on FreeCodeCamp.com is copyrighted by Free Code Camp. If you'd like to redistribute it beyond simply sharing it through social media, please contact us at [team@freecodecamp.com](mailto:team@freecodecamp.com).
+
+### Contacting Us
+If you have questions about Free Code Camp, or to correct, update, or remove personally identifiable information, please email us at [team@freecodecamp.com](mailto:team@freecodecamp.com).
+
+### Links to Other Web sites
+Free Code Camp's sites each contain links to other Web sites. Free Code Camp is not responsible for the privacy practices or content of these third-party Web sites. We urge all FreeCodeCamp.com visitors to follow safe Internet practices: Do not supply Personally Identifiable Information to these Web sites unless you have verified their security and privacy policies.
+
+### Data Retention
+We retain your information for as long as necessary to permit us to use it for the purposes that we have communicated to you and comply with applicable law or regulations.
+
+### Business Transfers
+As we continue to develop our business, we might sell or buy subsidiaries, or business units. In such transactions, customer information generally is one of the transferred business assets but remains subject to the promises made in any pre-existing Privacy Policy (unless, of course, the customer consents otherwise). Also, in the unlikely event that Free Code Camp, or substantially all of its assets are acquired, customer information will be one of the transferred assets, and will remain subject to our Privacy Policy.
+
+### Your California Privacy Rights
+If you are a California resident, you are entitled to prevent sharing of your personal information with third parties for their own marketing purposes through a cost-free means. If you send a request to the address above, Free Code Camp will provide you with a California Customer Choice Notice that you may use to opt-out of such information sharing. To receive this notice, submit a written request to <a href="mailto:team@freecodecamp.com" target="_blank">team@freecodecamp.com</a>, specifying that you seek your &quot;California Customer Choice Notice.&quot; Please allow at least thirty (30) days for a response.
+
+### Acceptance of Privacy Policy Terms and Conditions
+By using this site, you signify your agreement to the terms and conditions of this FreeCodeCamp.com Privacy Policy. If you do not agree to these terms, please do not use this site. We reserve the right, at our sole discretion, to change, modify, add, or remove portions of this policy at any time. All amended terms automatically take effect 30 days after they are initially posted on the site. Please check this page periodically for any modifications. Your continued use of FreeCodeCamp.com following the posting of any changes to these terms shall mean that you have accepted those changes.
+
+If you have any questions or concerns, please send an email to [team@freecodecamp.com](mailto:team@freecodecamp.com).
\ No newline at end of file
diff --git a/data/wiki/Free-Code-Camp-Front-End-Development-Certificate.md b/data/wiki/Free-Code-Camp-Front-End-Development-Certificate.md
new file mode 100644
index 0000000..723381b
--- /dev/null
+++ b/data/wiki/Free-Code-Camp-Front-End-Development-Certificate.md
@@ -0,0 +1,19 @@
+We're creating a free Front End Development Certificate.
+
+Here are the challenges that will make up our Basic Front End Development Certificate Program:
+
+- HTML5 and CSS
+- Responsive Design with Bootstrap
+- jQuery
+- Basic JavaScript
+- Basic Bonfires
+- Ajax and JSON APIs (not available in the current version of the [Map](http://www.freecodecamp.com/map))
+- Zipline: Build a Personal Portfolio Webpage
+- Zipline: Build a Random Quote Machine
+- Zipline: Show the Local Weather
+- Zipline: Build a Pomodoro Clock
+- Zipline: Zipline: Use the Twitch.tv JSON API
+
+This won't be a new curriculum - it will just be the first 400 hours of our full stack JavaScript curriculum.
+
+All campers who have already completed these challenges will retroactively be eligible for the certificate.
\ No newline at end of file
diff --git a/data/wiki/Free-Code-Camp-Full-Stack-Developent-Certificate.md b/data/wiki/Free-Code-Camp-Full-Stack-Developent-Certificate.md
new file mode 100644
index 0000000..915f69f
--- /dev/null
+++ b/data/wiki/Free-Code-Camp-Full-Stack-Developent-Certificate.md
@@ -0,0 +1,8 @@
+We're creating a free Full Stack Development Certificate.
+
+In order to qualify for this verified certificate, you must:
+
+- Complete the first 800 hours of Free Code Camp (all Bonfires, Ziplines and Basejumps)
+- Complete 4 nonprofit projects or complete at least 1 nonprofit project before getting a coding job.
+
+All campers who have already completed these challenges are retroactively be eligible for the certificate.
\ No newline at end of file
diff --git a/data/wiki/Free-Code-Camp-completion-language-requirements.md b/data/wiki/Free-Code-Camp-completion-language-requirements.md
new file mode 100644
index 0000000..bc864f7
--- /dev/null
+++ b/data/wiki/Free-Code-Camp-completion-language-requirements.md
@@ -0,0 +1,7 @@
+The last 800 hours of free code camp involve building projects for nonprofits. These nonprofit projects will involve lots of meetings, correspondence, and pair programming, all of which will be conducted in English.
+
+You will need to be good enough with English to be able to participate in these meetings.
+
+We are translating our challenges into native languages so that you can focus on learning to code, rather than focusing on learning English.
+
+Many non-native English speakers have succeeded in our nonprofit project program. With some effort, you can, too.
\ No newline at end of file
diff --git a/data/wiki/Free-Code-Camp-logo.md b/data/wiki/Free-Code-Camp-logo.md
new file mode 100644
index 0000000..9a04918
--- /dev/null
+++ b/data/wiki/Free-Code-Camp-logo.md
@@ -0,0 +1,9 @@
+### Free Code Camp's logo
+
+![Free Code Camp's logo](https://i.vimeocdn.com/video/520129377_1280x720.jpg)
+
+It uses the typeface 'saxmono'.
+
+Like most of Free Code Camp's design assets, it was created by [@rybar](https://gitter.im/rybar) with help from [@iheartkode](https://gitter.im/iheartkode).
+
+You can download all of our assets, which are Creative Commons licensed, from our [Free Code Camp Assets repository](https://github.com/FreeCodeCamp/FCCAssets).
diff --git a/data/wiki/Frontend-file-structure.md b/data/wiki/Frontend-file-structure.md
new file mode 100644
index 0000000..a3e0317
--- /dev/null
+++ b/data/wiki/Frontend-file-structure.md
@@ -0,0 +1,11 @@
+First things first: All your user-facing files and angular files are in **/client/app/**  
+
+1. **app.js**: defines your app and includes some basic app-wide functions, you probably don’t really need to mess with it unless you’re trying to add more dependencies to your app. We’re not gonna worry about that right now.  
+2. **app.css**: an app-wide stylesheet, you can put styles here if you want but I’d recommend you put them in **main/main.css**, as these styles are also app-wide.  
+3. **main/**: this folder contains what the user sees first when they load up your site. **main.html** is the page template, **main.js** routes the user to **main.html** when the user goes to the top level directory of your website—that is, <a href="#">http://yourapp.wherever.itis/</a> with no <a href="#">/other/url/hierarchy</a>. You’ll also learn soon that you can define your app’s <a href="#">/url/heirarchy/fairly/arbitrarily</a>. You won’t really need to edit **main.js** or **main.controller.spec.js**, so let's not worry about those right now. If you look through the **main.html** file you’ll see it uses *ng-repeat* to show *things* in *awesomeThings*. Where does it get *awesomeThings*?  
+4. **main/main.controller.js**: all of the javascript functions you want to use to interact directly with the user go here! You’ll put functions here to interact with your API, refresh views for your user, etc. Here, *awesomeThings* are pulled from your database and added to the local scope so your HTML view can display them! How cool! We’ll get to adding custom objects to your database in a minute.
+
+Great! Now you know how to interact with the user! But what if you want your app to have another page that does something else? Maybe **main.html** shows the home page, but you want a page that shows a form to add a poll? maybe <a href="#">http://yourapp.wherever.itis/newpage</a>? This is where the yeoman generator comes in handy.
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Guide-to-Basejumps-Table-of-Contents/)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-route)
\ No newline at end of file
diff --git a/data/wiki/Functional-Programming---Higher-Order-Functions.md b/data/wiki/Functional-Programming---Higher-Order-Functions.md
new file mode 100644
index 0000000..dcc7774
--- /dev/null
+++ b/data/wiki/Functional-Programming---Higher-Order-Functions.md
@@ -0,0 +1,9 @@
+### Links to help with functional programming!
+
+####Workshops
+(https://github.com/timoxley/functional-javascript-workshop)
+
+A node package workshop. More can be found at [nodeschool](http://nodeschool.io/)
+
+####Reading and videos
+(https://github.com/timoxley/functional-javascript-workshop)
\ No newline at end of file
diff --git a/data/wiki/Get-info-about-the-current-user.md b/data/wiki/Get-info-about-the-current-user.md
new file mode 100644
index 0000000..98ed297
--- /dev/null
+++ b/data/wiki/Get-info-about-the-current-user.md
@@ -0,0 +1,15 @@
+You may have noticed if you opened up **/client/app/admin/admin.controller.js** that it calls the *Auth* module like so:
+
+~~~javascript
+.controller('AdminCtrl', function ($scope, $http, Auth …
+~~~
+You can include Auth in your other controllers the same way. It’s pretty useful to have *Auth* available in your controller to detect if a user is logged in, or to get information about the current user. In the body of your controller you can add 
+
+~~~javascript
+$scope.getCurrentUser = Auth.getCurrentUser;
+$scope.isLoggedIn = Auth.isLoggedIn;
+~~~
+And then you can use *isLoggedIn()* or *getCurrentUser()* in the HTML view for your controller!  
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/More-useful-APIs)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Restrict-a-page-to-authenticated-users)
\ No newline at end of file
diff --git a/data/wiki/Git-Blame.md b/data/wiki/Git-Blame.md
new file mode 100644
index 0000000..97f63d5
--- /dev/null
+++ b/data/wiki/Git-Blame.md
@@ -0,0 +1,9 @@
+> Shows what revision and author last modified each line of a file and blame them.
+
+:point_right: :no_good: — :see_no_evil: :hear_no_evil: :speak_no_evil: 
+
+![](http://i.imgur.com/Ywpucz6.png)
+
+**Reference:** https://git-scm.com/docs/git-blame
+
+## [](http://i.imgur.com/xancoby.png)
\ No newline at end of file
diff --git a/data/wiki/Gitter.md b/data/wiki/Gitter.md
new file mode 100644
index 0000000..1a00a44
--- /dev/null
+++ b/data/wiki/Gitter.md
@@ -0,0 +1,9 @@
+### Gitter is a chat room system popular with open source projects.
+
+![A screenshot from Gitter](https://www.evernote.com/l/AntJzLbImEFNbaLfG7YQnWWBbqLliTKTYeoB/image.png)
+
+[Gitter.im](https://gitter.im) is a rapidly growing startup based in London.
+
+Free Code Camp has hundreds of Gitter rooms. These are accessible through Gitter's website, as well as [desktop and mobile apps](https://gitter.im/apps).
+
+Gitter allows you to share [formatted code](https://github.com/FreeCodeCamp/freecodecamp/wiki/Pasting-Code-in-Gitter) with fellow campers.
\ No newline at end of file
diff --git a/data/wiki/Grunt.md b/data/wiki/Grunt.md
new file mode 100644
index 0000000..a344322
--- /dev/null
+++ b/data/wiki/Grunt.md
@@ -0,0 +1,4 @@
+Whenever you create a new route or directive, you have to use `control+c` in your *grunt* terminal window to quit the grunt process and re-run `grunt serve` for your new route/directive to be included in your project's **index.html**. Sometimes *grunt* can be a little finnicky and refuses to run if it thinks something is wrong with your project. Obviously you should try to fix the problem, but grunt's errors aren't very helpful so don't worry too much—grunt usually will still run totally fine with the command `grunt serve --force`.
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-directive)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Backend-file-structure)
\ No newline at end of file
diff --git a/data/wiki/Guide-to-Basejumps-Table-of-Contents.md b/data/wiki/Guide-to-Basejumps-Table-of-Contents.md
new file mode 100644
index 0000000..024ca56
--- /dev/null
+++ b/data/wiki/Guide-to-Basejumps-Table-of-Contents.md
@@ -0,0 +1,31 @@
+###Table of contents
+* Part 1: Frontend
+    - [Frontend file structure](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Frontend-file-structure)
+    - [Creating a new route](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-route)
+    - [Creating a new directive](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-directive)
+    - [Grunt](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Grunt)
+* Part 2: Backend
+    - [Backend file structure](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Backend-file-structure)
+    - [Creating a new API endpoint](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-API-endpoint)
+    - [Fixing exports.update](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Fixing-exports.update)
+* Part 3: Interfacing Between Frontend & Backend
+    - [Accessing the database from your frontend](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Accessing-the-database-from-your-frontend)
+    - [Seed Data](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Seed-data)
+    - [Quick tip: keep data in sync](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Quick-tip:-keep-data-in-sync)
+* Part 4: Dynamic URLs using $routeParams, more useful APIs
+    - [Dynamic URLS using $routeParams](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Dynamic-URLs-using-$routeParams)
+    - [More Useful APIs](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/More-useful-APIs)
+* Part 5: Auth, isLoggedInAsync()
+    - [Get info about the current user](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Get-info-about-the-current-user)
+    - [Restrict a page to authenticated users](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Restrict-a-page-to-authenticated-users)
+    - [isLoggedInAsync()](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/isLoggedInAsync())
+* [Bonus: SocketIO](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Bonus:-SocketIO)
+* [Epilogue](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Epilogue)
+
+###Legend
+**/bolded/names/with.extensions** are directories and files in the project file structure  
+<a href="#">highlighted.items/are/hypothetical</a> URLs that allow access to different pages in your app  
+*italicizedItems* are function and object names within your code
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Intro-to-Yeoman-Angular-Fullstack-Basejumps)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Frontend-file-structure)
\ No newline at end of file
diff --git a/data/wiki/Help-I've-Found-a-Bug.md b/data/wiki/Help-I've-Found-a-Bug.md
new file mode 100644
index 0000000..a1e1973
--- /dev/null
+++ b/data/wiki/Help-I've-Found-a-Bug.md
@@ -0,0 +1,12 @@
+Thank you for taking the effort to report an issue with FreeCodeCamp.
+
+If you think you've found a bug on FreeCodeCamp, please follow these steps to resolve your problem:
+
+1. If the page seems broken in any way, try to do a [Hard Refresh](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Refresh-Your-Browser-Cache) of the page.  This will update any old code that may have been cached in your browser.  
+ * If your code crashes your browser, also try [Clearing Your Browser's Local Storage](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Clear-Your-Browser's-Local-Storage).
+
+2. [Ask for Help on Gitter](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-to-Get-Help-on-Gitter).  You can usually get a quick response from a helpful community member there.
+
+3. If your problem has baffled everyone in Gitter, try [Searching for Your Issue on GitHub](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Searching-for-Your-Issue-on-Github) for anyone who has posted about a similar issue. If someone has, you can upvote the issue by replying to it with "+1" as your message.
+
+3. If you can't find any relevant issues on GitHub, then [Create a New Issue](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-New-Github-Issue) and our development team will take a look at your problem.
\ No newline at end of file
diff --git a/data/wiki/Home.md b/data/wiki/Home.md
new file mode 100644
index 0000000..dd8ed36
--- /dev/null
+++ b/data/wiki/Home.md
@@ -0,0 +1,16 @@
+##Welcome to the Free Code Camp Wiki!
+
+Our open source community's Wiki focuses on answering your questions about learning to code and getting a coding job. We also cover in detail our:
+- Curriculum
+- Local Campsite Communities
+- Nonprofit Projects
+
+"Wiki" is a Hawaiian word meaning "quick", and that is a good mindset to have when creating a Wiki. Please reference our [Wiki style guide] ([https://github.com/FreeCodeCamp/freecodecamp/wiki/Wiki-Style-Guide](https://github.com/FreeCodeCamp/freecodecamp/wiki/Wiki-Style-Guide)) for more direction regarding styling.  <img align="right" src="https://avatars1.githubusercontent.com/camperbot?&s=100">
+
+The best way to access this wiki is via [CamperBot](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/camperbot), located in our Gitter channels. CamperBot is a community designed tool useful for accessing our wiki content without ever leaving Gitter.
+
+To contribute a wiki article for any of the bonfires, please use this [template.](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Bonfire-Wiki-Template) This is essential for [@CamperBot](https://github.com/camperbot) to retrieve the article. Bonfire articles that do not use this template will be removed.
+
+If you have questions about contributing to the Free Code Camp Wiki message [@Rafase282 in Gitter](https://gitter.im/Rafase282).
+
+We look forward to collaborating with you on expanding and improving this wiki!
\ No newline at end of file
diff --git a/data/wiki/How-Free-Code-Camp-works.md b/data/wiki/How-Free-Code-Camp-works.md
new file mode 100644
index 0000000..5146c59
--- /dev/null
+++ b/data/wiki/How-Free-Code-Camp-works.md
@@ -0,0 +1,15 @@
+Free Code Camp offers you a free, self-paced, browser-based program that takes about 1,600 hours to complete.
+
+![An image of a table showing the different segments of Free Code Camp](https://s3.amazonaws.com/freecodecamp/curriculum-diagram-waypoints.jpg)
+
+## how it works
+![An image of a table showing the different segments of Free Code Camp](https://s3.amazonaws.com/freecodecamp/curriculum-diagram-bonfires.jpg)
+
+![An image of a table showing the different segments of Free Code Camp](https://s3.amazonaws.com/freecodecamp/curriculum-diagram-ziplines.jpg)
+
+![An image of a table showing the different segments of Free Code Camp](https://s3.amazonaws.com/freecodecamp/curriculum-diagram-basejumps.jpg)
+
+![An image of a table showing the different segments of Free Code Camp](https://s3.amazonaws.com/freecodecamp/curriculum-diagram-nonprofit-projects.jpg)
+
+![An image of a table showing the different segments of Free Code Camp](https://s3.amazonaws.com/freecodecamp/curriculum-diagram-full.jpg)
+
diff --git a/data/wiki/How-FreeCodeCamp-Nonprofit-Projects-work.md b/data/wiki/How-FreeCodeCamp-Nonprofit-Projects-work.md
new file mode 100644
index 0000000..39e11c6
--- /dev/null
+++ b/data/wiki/How-FreeCodeCamp-Nonprofit-Projects-work.md
@@ -0,0 +1,87 @@
+Building nonprofit projects is the main way that our campers learn full stack JavaScript and agile software development. Once you complete the Free Code Camp Waypoints, Bonfires, Ziplines and Basejumps, you'll begin this process.
+
+## Starting with the end in mind
+
+Our goal at Free Code Camp is to help you land a job as a junior software developer (or, if you prefer, a 'pivot job' that leads your current career in a more technical direction).
+
+You'll continue to work on nonprofit projects until you've built a sufficiently impressive portfolio and references to start your job search. Your portfolio will ultimately have four nonprofit projects. We estimate that the 800 hours of nonprofit projects you're going to complete, in addition to the 800 hours of challenges you've already completed, will be enough to qualify you for your first coding job. This will produce a much broader portfolio than a traditional coding bootcamp, which generally only has one or two capstone projects.
+
+## Choosing your first Nonprofit Project
+
+We've categorized all the nonprofit projects by estimated time investment per camper: 100 hours, 200 hours, and 300 hours. These are only rough estimates.
+
+Example: if you and the camper you're paired up with (your pair) each stated you could work 20 hours per week. If the project is a 100 hour per camper project, you should be able to complete it in about 5 weeks.
+Our Nonprofit Project team will match you and your pair based on:
+
+- Your estimated time commitment (10, 20 or 40 hours per week)
+- Your time zone
+- The nonprofit projects you've chosen
+- Prior coding experience (we'd like both campers to be able to contribute equally)
+
+
+We won't take age or gender into account. This will provide you with valuable experience in meshing with diverse teams, which is a reality of the contemporary workplace.
+
+You'll only work on one project at a time. Once you start a nonprofit project, we'll remove you from all other nonprofit project you've expressed interest in. There's a good chance those projects will no longer be available when you finish your current project, anyway. Don't worry, though - we get new nonprofit project requests every day, so there will be plenty more projects for you to consider after you finish your current one.
+
+### Finalizing the Project
+
+Before you can start working on the project, our team of Nonprofit Project Coordinators will go through the following process:
+
+- We'll wait until there are two campers who have chosen the same project and look like they're a good match for one another based on the factors mentioned above.
+- We'll call the stakeholder to confirm once again that he or she agrees with our [terms](http://freecodecamp.com/nonprofits) and has signed our [Nonprofit Project Stakeholder Pledge] (http://goo.gl/forms/0YKkd9bpcR).
+- We'll set an initial meeting with representatives from Free Code Camp, the two campers, and the stakeholder.
+- If the stakeholder and both campers shows up promptly, and seem enthusiastic and professional, we'll start the project.
+
+This lengthy process serves an important purpose: it reduces the likelihood that any of our campers or stakeholders will waste their precious time.
+
+### Nonprofit Stakeholders
+
+Each nonprofit project was submitted by a nonprofit. A representative from this nonprofit has agreed to serve as a "stakeholder" - an authorative person who understands the organization and its needs for this particular project.
+
+Stakeholders have a deep understanding of their organizations' needs. Campers will work with them to figure out the best solutions to these needs.
+
+When you and your pair first speak with your nonprofit stakeholder, you'll:
+
+- talk at length to better understand their needs.
+- create a new Trello board and use it to prioritize what needs to be built.
+- and establish deadlines based on your weekly time commitment, and how long you think each task will take.
+
+It's notoriously difficult to estimate how long building software projects will take, so feel free to ask our volunteer team for help.
+
+You'll continue to meet with your stakeholder at least twice a month in your project's Gitter channel.
+You should also ask questions in your project's Gitter channel as they come up throughout the week, and your stakeholder can answer them asynchronously.
+
+Getting "blocked" on a task can take away your sense of forward momentum, so be sure to proactively seek answers to any ambiguities you encounter.
+
+Ultimately, the project will be considered complete once both the stakeholder's needs have been met, and you and your pair are happy with the project. Then you can add it to your portfolio!
+
+### Working with your Pair
+
+You and your pair will pair program (code together on the same computer virtually) about half of the time, and work independently the other half of the time.
+
+Here are our recommended ways of collaborating:
+
+- Gitter has robust private messaging functionality. It's the main way our team communicates, and we recommend it over email.
+- Trello is great for managing projects. Work with your stakeholder to create Trello cards, and update these cards regularly as you make progress on them.
+- Screen Hero or Team Viewer - These are the ideal way to pair program. Tools like TMUX are good, but difficult to use. We discourage you from using screen sharing tools where only one person has control of the keyboard and mouse - that isn't real pair programming.
+- Write clear and readable code, commit messages, branch names, and pull request messages.
+
+### Hosting Apps
+
+Unless your stakeholder has an existing modern host (AWS, Digital Ocean), you'll need to transition them over to a new platform. We believe Heroku is the best choice for a vast majority of web projects. It's free, easy to use, and has both browser and command line interfaces. It's owned by Salesforce and used by a ton of companies, so it's accountable and unlikely to go away.
+
+If you need help convincing your stakeholder that Heroku is the ideal platform, we'll be happy to talk with them.
+
+### Maintaining Apps
+
+Once you complete a nonprofit project, your obligation to its stakeholder is finished. Your goal is to leave behind a well documented solution that can be easily maintained by a contract JavaScript developer (or even a less-technical "super user").
+
+While you will no longer need to help with feature development, we encourage you to consider helping your stakeholder with occasional patches down the road. After all, this project will be an important piece of your portfolio, and you'll want it to remain in good shape for curious future employers.
+
+### Pledging to finish the project
+
+Your nonprofit stakeholder, your pair, and our volunteer team are all counting on you to finish your nonprofit project. If you walk away from an unfinished nonprofit project, you'll become ineligible to ever be assigned another one.
+
+To confirm that you understand the seriousness of this commitment, we require that all campers [sign this pledge](http://goo.gl/forms/ZMn96z2QqY) before starting on their nonprofit projects.
+
+There will likely be times of confusion or frustration. This is normal in software development. The most important thing is that you do not give up and instead persevere through these setbacks. As Steve Jobs famously said, "Real artists ship." And you are going to ship one successful nonprofit project after another until you feel ready to take the next step in your promising career.
\ No newline at end of file
diff --git a/data/wiki/How-GitHub-Issue-Moderators-AKA-Issue-Mods-Work.md b/data/wiki/How-GitHub-Issue-Moderators-AKA-Issue-Mods-Work.md
new file mode 100644
index 0000000..0716695
--- /dev/null
+++ b/data/wiki/How-GitHub-Issue-Moderators-AKA-Issue-Mods-Work.md
@@ -0,0 +1,11 @@
+GitHub Issue Moderators, or "issue mods", have the ability to close issues and accept or deny pull requests.
+
+In order to become an issue mod, you must first prove your helpfulness by leaving useful comments on outstanding issues, and submitting pull requests of your own to fix these issues.
+
+If you've been doing these things, and want the additional power/responsibility that comes with helping Free Code Camp as an issue mod, please contact [@berkeleytrue](https://gitter.im/berkeleytrue) in Gitter.
+
+If you are approved, we will add you to a GitHub Team.
+
+Though you will have write access to Free Code Camp's repository, **you should never write directly to the Free Code Camp repository**. All code should enter Free Code Camp's codebase in the form of a pull request.
+
+Please note that we will frequently remove issue mods whom we think are inactive. If you are removed, please do not take this personally - we can add you back to the team. Just message us and let us know you're still active.
\ No newline at end of file
diff --git a/data/wiki/How-long-Free-Code-Camp-takes-to-complete.md b/data/wiki/How-long-Free-Code-Camp-takes-to-complete.md
new file mode 100644
index 0000000..854504c
--- /dev/null
+++ b/data/wiki/How-long-Free-Code-Camp-takes-to-complete.md
@@ -0,0 +1,10 @@
+It takes about 1,600 hours of coding to develop the skills you'll need to get an entry level software engineering job.
+
+Most coding bootcamps try to jam all this into 3 or 4 months of intensive study. Free Code Camp is fully online, and there will always be other people at your skill level that you can pair program with, so you can learn at your own pace. Here are some example coding schedules:
+
+Time budgeted | Hours per week | Weeks to complete
+--- | --- | ---
+Weekends | 10 hours/week | 160 weeks (36 months)
+Nights and Weekends | 20 hours/week | 80 weeks (18 months)
+Full time | 40 hours/week | 40 weeks (9 months)
+Traditional Bootcamp Pacing | 80 hours/week | 20 weeks (5 months)
\ No newline at end of file
diff --git a/data/wiki/How-to-Get-Help-on-Gitter.md b/data/wiki/How-to-Get-Help-on-Gitter.md
new file mode 100644
index 0000000..9b81dec
--- /dev/null
+++ b/data/wiki/How-to-Get-Help-on-Gitter.md
@@ -0,0 +1,9 @@
+Sorry that you are stuck. Luckily there are many campers who hang out on Gitter and can help you resolve most issues! Follow these simple steps to get help fast:
+
+1. Go to the [Help Room](https://gitter.im/FreeCodeCamp/Help)
+ *  If the problem is code related, paste the problematic code in the chat room with the [Proper Formatting](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/code-formatting) and a description of the issue.
+ * If the problem seems to be with the site itself, post a screenshot of the issue or describe it well.
+
+2. Remember that the people there are campers just like you, so be courteous!
+
+3. If your problem has baffled everyone in Gitter, try [Searching for Your Issue on Github](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Searching-for-Your-Issue-on-Github) for anyone who has posted about a similar issue.  
\ No newline at end of file
diff --git a/data/wiki/How-to-add-Free-Code-Camp-to-my-LinkedIn-profile.md b/data/wiki/How-to-add-Free-Code-Camp-to-my-LinkedIn-profile.md
new file mode 100644
index 0000000..b9a545e
--- /dev/null
+++ b/data/wiki/How-to-add-Free-Code-Camp-to-my-LinkedIn-profile.md
@@ -0,0 +1,10 @@
+LinkedIn recognizes Free Code Camp as a university.
+
+You can explore our alumni activity [here](https://www.linkedin.com/edu/school?id=166029).
+
+You should add Free Code Camp to your LinkedIn profile. Here's how:
+
+- Follow this link: [https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp](https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp)
+- Follow these instructions:![](https://www.evernote.com/l/AHRnpH-PN-JPQa9_u8FSOzejNG-tX40h1fkB/image.png)
+
+Once you complete our curriculum (or complete at least one Nonprofit Project and then get a coding job), we will issue you an official Full Stack Web Development certificate that you can also add to your LinkedIn profile.
\ No newline at end of file
diff --git a/data/wiki/How-to-best-use-the-Global-Control-Shortcuts-for-Mac.md b/data/wiki/How-to-best-use-the-Global-Control-Shortcuts-for-Mac.md
new file mode 100644
index 0000000..e25fd05
--- /dev/null
+++ b/data/wiki/How-to-best-use-the-Global-Control-Shortcuts-for-Mac.md
@@ -0,0 +1,15 @@
+These Global Control Shortcuts for Mac will save you hours by speeding up your typing.
+
+https://player.vimeo.com/video/107073108
+
+These global shortcuts work everywhere on a Mac:
+
+- Control + F = Forward
+- Control + B = Backward
+- Control + N = Next Line
+- Control + P = Previous Line
+- Control + H = Backspace
+- Control + D = Delete
+- Control + A = Beginning of Line
+- Control + E = End of Line
+- Control + K = Kill line
\ No newline at end of file
diff --git a/data/wiki/How-to-clone-the-FreeCodeCamp-website-on-a-Windows-pc.md b/data/wiki/How-to-clone-the-FreeCodeCamp-website-on-a-Windows-pc.md
new file mode 100644
index 0000000..22afc0c
--- /dev/null
+++ b/data/wiki/How-to-clone-the-FreeCodeCamp-website-on-a-Windows-pc.md
@@ -0,0 +1,32 @@
+# How to clone and setup the FreeCodeCamp website on a Windows pc
+This list works with the FreeCodeCamp site and have been tested on this Angular tutorial [https://docs.angularjs.org/tutorial](https://docs.angularjs.org/tutorial) as well. Setting up the dev environment on a Windows pc is easy although it will give a ton of errors first in the process. The important part is to correct these errors.
+## Toolchain
+1. Git bash [https://msysgit.github.io/](https://msysgit.github.io/)
+2. Node.js [https://nodejs.org/](https://nodejs.org/)
+3. MongoDB [https://www.mongodb.org/downloads](https://www.mongodb.org/downloads)
+4. Python 2.7.10 [https://www.python.org/downloads/release/python-2710/](https://www.python.org/downloads/release/python-2710/)
+
+Install the 4 downloaded prerequsites. When installing Python and Node it is important to check
+ the option add to the path variable. The Node installer does that by default. It is optional to add Mongo to the path. Python should be installed in a subfolder in %programfiles%
+ 
+1. Open a command prompt with admin rights
+2. Verify that Node is in th path with node -v
+3. Verify that npm is in the path with npm -v
+5. `npm install npm -g`
+	`npm install bower -g`  
+	`npm install gulp -g`
+	`npm install node-gyp -g` 
+	`npm install babel -g`  
+6. If you want to spare the time in explorer finding Mongo when it has to be started create a .cmd file on your desktop and write the path to Mongo. Probably  %programfiles%\MongoDB\Server\3.0\bin\mongod.exe. 
+7. Create the default folder for mongo to store databases: C:\data\db
+
+**Every command from now on has to be executed from Git Bash. npm install and bower install is downloading components from Git repos and MUST have access to the Git commands**
+
+1. Follow the instructions here [https://github.com/FreeCodeCamp/freecodecamp](https://github.com/FreeCodeCamp/freecodecamp) and clone the project.
+2. Run `npm install` This will produce some warnings and maybe some errors. The warnings and some of the errors can be disregarded. Stackoverflow has large 
+resources to solve the errors if they still come up the 2. time you run npm install.
+3. Run `bower install`, `npm install` again and `bower install`again
+4. Start mongo from the desktop shortcut and run `node seed`. You should now see a lot of activity in the window where you started mongo.
+5. Run `gulp` and note what port it starts the site on. (Should be 3000) Open localhost:3000 (or whatever port it started)
+
+**you're good to go**
diff --git a/data/wiki/How-to-create-a-Campsite-for-your-city.md b/data/wiki/How-to-create-a-Campsite-for-your-city.md
new file mode 100644
index 0000000..6bf31f5
--- /dev/null
+++ b/data/wiki/How-to-create-a-Campsite-for-your-city.md
@@ -0,0 +1,38 @@
+If you didn't see your city on [our list of Campsites](https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites), you should create your own Facebook group for your city.
+ 
+Please follow these steps: 
+- Sign in to Facebook. 
+- Click the down arrow in the upper right corner of the screen, then choose "Create Group" from the options.
+
+![A screenshot of Facebook showing the drop down menu that appears when you click the down arrow, with an arrow pointing to the "Create Group" option](https://www.evernote.com/shard/s116/sh/d01bb2bc-6260-4987-bedf-b2ce4c31972f/3eecbcff3109036cf90b69589360f407/deep/0/Facebook.png)
+- Set the group name as "Free Code Camp" plus the proper name of your city. Avoid using slang terms such as "Philly" for "Philadelphia". If your city is not the biggest city that uses its name, also include the state or province. For example, the Free Code Camp group in Paris, France should be called "Free Code Camp Paris". The Free Code Camp group in Paris, Texas should be called "Free Code Camp Paris, Texas". 
+- Set your group to public. 
+- You'll need to add at least one friend from your city to this group in order to create the group. 
+
+![A screenshot of the Facebook group creation modal saying that your group name should be Free Code Camp plus your city name, that your group should be public, and that you need to invite at least one Facebook friend.](https://www.evernote.com/shard/s116/sh/4ed3197c-db1b-4103-a040-b42482ad232a/6c34948ebe12c57f0b7a54d7b2222ab3/deep/0/Facebook.png)
+- Choose the graduation cap icon to indicate that this group is related to a school. 
+
+![a screenshot telling you to choose the graduation icon, which is on the forth row of icons, seven icons from the left.](https://www.evernote.com/shard/s116/sh/00e461b3-e0a8-4ecd-9cbf-8b0ae9de75d1/59c4e9f25672b1b2ca2d7e6b06d55e0b/deep/0/Facebook.png)
+- Click the "..." menu, then click "Edit group settings" in the dropdown menu. 
+
+![a screenshot telling you to click the "..." button then choose the "Edit group settings" option](https://www.evernote.com/shard/s116/sh/ae9a22e2-19a5-4309-b46c-f05a6be5644c/0870b25572d37d4d650cca1a0d59e407/deep/0/Free-Code-Camp-Testland.png)
+- Set the group's privacy setting to public. 
+- Set your group's membership approval to where any member can add or approve members ![a screenshot showing the Facebook settings panel and where you can click to set the group to public and allow all members to be able to add or approve members>
+- Click the "Customize Address" button.
+
+![A screen shot showing you the group description box on the Facebook page.](https://www.evernote.com/l/AHTs6Ec_hylKyYWVhpZonOHPn8j8I5ydgv4B/image.png)
+- Enter "free.code.camp.your.city.name" with each word separated by periods. 
+
+![a screenshot telling you to enter free.code.camp.your.city.name with each word seperated by periods.](https://www.evernote.com/shard/s116/sh/357b1bd9-7c40-4f72-8a9a-d918e632a5e8/c4714ca59360b2517dfffe90c60b1556/deep/0/Free-Code-Camp-Testland.png)
+- Please feel free to personalize your city's group description, but be sure to include a link to Free Code Camp: "http://www.freecodecamp.com". 
+
+![A screen shot showing you the group description box on the Facebook page.](https://www.evernote.com/shard/s116/sh/e13808ea-f084-46f1-95bc-63db524383d5/0586484d44360e73e9acda956dad7f6a/deep/0/Free-Code-Camp-Testland.png)
+- Click the "Upload a photo button. To start out, you'll probably just want to use Free Code Camp's banner (download it [here](https://s3.amazonaws.com/freecodecamp/wide-social-banner.png)), or a scenic shot of your city. Later you can update this with a picture from one of your city's Free Code Camp events. 
+
+![A screenshot showing the "Upload a photo" button.](https://www.evernote.com/shard/s116/sh/fabe226a-5a26-4508-b015-1dac35192a21/37f8119dc57845a31e972217714b038b/deep/0/Free-Code-Camp-Testland.png)
+- [message @quincylarson in Gitter](https://gitter.im/QuincyLarson) with a link to your city's group page. He'll include it on this list and also create a Gitter room for you. 
+- Join our [Local Leaders Facebook group](https://www.facebook.com/groups/freecodecampers/), where we share ideas about involving campers in your city. 
+
+If you don't have a Facebook account, we strongly recommend you create one, even if it's just for the purpose of coordinating with campers in your city through this group. 
+
+If Facebook is blocked in your country, feel free to use social network with a similar group functionality that's popular in your region.
\ No newline at end of file
diff --git a/data/wiki/How-to-deploy-a-website-without-writing-any-code-at-all.md b/data/wiki/How-to-deploy-a-website-without-writing-any-code-at-all.md
new file mode 100644
index 0000000..c3ed849
--- /dev/null
+++ b/data/wiki/How-to-deploy-a-website-without-writing-any-code-at-all.md
@@ -0,0 +1,12 @@
+It's possible to build dynamic, mobile-responsive websites without writing any code at all, in just a few minutes.
+
+https://player.vimeo.com/video/115194017
+
+Here are the technologies we used here:
+
+- [atom.io](http://www.atom.io/) a free code editor 
+- [startbootstrap.com](http://www.startbootstrap.com/) a collection of free responsive (Bootstrap) templates 
+- [powr.io](http://www.powr.io/) a collection of free JavaScript plugins 
+- [bitballoon.com](http://www.bitballoon.com/) a tool for drag and drop website deployment
+
+You will quickly reach the limits of what you can do without actually coding, but it's nice to be able to rapidly build working prototype websites like this.
\ No newline at end of file
diff --git a/data/wiki/How-to-get-help-when-you-get-stuck.md b/data/wiki/How-to-get-help-when-you-get-stuck.md
new file mode 100644
index 0000000..55eacfe
--- /dev/null
+++ b/data/wiki/How-to-get-help-when-you-get-stuck.md
@@ -0,0 +1,13 @@
+When you get stuck, remember: Read-Search-Ask.
+
+1) **Read** the documentation or error    
+2) **Search** Google    
+3) **Ask** your friends for help    
+
+This is the most time-efficient way to handle being stuck, and it's the most respectful of other people's time, too.
+
+Most of the time, you'll solve your problem after just one or two steps of this algorithm.
+
+We have a special chat room just for getting help: <a href='https://gitter.im/freecodecamp/help/' target='_blank'>https://gitter.im/freecodecamp/help/</a>
+
+Learning to code is hard. But it's a lot easier if you ask for help when you need it!
\ No newline at end of file
diff --git a/data/wiki/How-to-help-with-the-Free-Code-Camp-translation-effort.md b/data/wiki/How-to-help-with-the-Free-Code-Camp-translation-effort.md
new file mode 100644
index 0000000..bcddc03
--- /dev/null
+++ b/data/wiki/How-to-help-with-the-Free-Code-Camp-translation-effort.md
@@ -0,0 +1,3 @@
+Our translation effort is driven by bilingual campers like you.
+
+If you're able to help us, you can join our [translation Trello board](https://trello.com/b/m7zhwXka/fcc-translation) by sending @quincylarson your email address in Gitter.
\ No newline at end of file
diff --git a/data/wiki/How-to-install-Screenhero.md b/data/wiki/How-to-install-Screenhero.md
new file mode 100644
index 0000000..212558c
--- /dev/null
+++ b/data/wiki/How-to-install-Screenhero.md
@@ -0,0 +1,7 @@
+[Download for Mac](http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjowLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLnppcD9zb3VyY2U9d2ViIn0=) 
+
+[Download for Windows](http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjoxLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLXNldHVwLmV4ZSJ9) 
+
+Linux users should use TeamViewer as an alternative.
+
+You'll use Screen Hero to pair program starting with [our Zipline challenges](http://www.freecodecamp.com/challenges/waypoint-get-set-for-ziplines)
\ No newline at end of file
diff --git a/data/wiki/How-to-know-who-is-in-charge-of-your-Campsite-on-Facebook.md b/data/wiki/How-to-know-who-is-in-charge-of-your-Campsite-on-Facebook.md
new file mode 100644
index 0000000..3d3959f
--- /dev/null
+++ b/data/wiki/How-to-know-who-is-in-charge-of-your-Campsite-on-Facebook.md
@@ -0,0 +1,13 @@
+Each Campsite has members that are designated as Admins who can approve new members and also designate other Admins for the group. The steps below will show you how to find out who is an Admin for your Campsite.
+
+* First, click the Members tab below the cover photo. Then the click on the dropdown box that says "all members"**
+
+![](http://i.imgur.com/qLx6kVZ.png?1)
+
+* Next, use the drop down box to select "Admins"**
+
+![](http://i.imgur.com/pfB2pDP.png?1)
+
+* You should now be able to see who is designated as an Admin for your Campsite.
+
+![](http://i.imgur.com/AwoYT01.png?1)
\ No newline at end of file
diff --git a/data/wiki/How-to-share-your-workspace-selfie-with-FreeCodeCamp-on-instagram.md b/data/wiki/How-to-share-your-workspace-selfie-with-FreeCodeCamp-on-instagram.md
new file mode 100644
index 0000000..07cd5eb
--- /dev/null
+++ b/data/wiki/How-to-share-your-workspace-selfie-with-FreeCodeCamp-on-instagram.md
@@ -0,0 +1,9 @@
+# FreeCodecamp is on instagram! Here is how to take a workspace selfie and share it with us.
+
+## Take a selfie of you at your workspace with Free Code Camp open.
+
+![](https://www.evernote.com/l/AkpdrY2nGrtBO69RoxdNq8rluri5K7B367YB/image.png)
+
+## Share it on Instagram, Twitter or Facebook with the hashtag #freecodecamp.
+
+## Social media not your thing? No problem! Email your workspace selfie to team@freecodecamp.com
diff --git a/data/wiki/How-to-start-when-you-are-stuck-(I).md b/data/wiki/How-to-start-when-you-are-stuck-(I).md
new file mode 100644
index 0000000..1d5b136
--- /dev/null
+++ b/data/wiki/How-to-start-when-you-are-stuck-(I).md
@@ -0,0 +1,21 @@
+**[How to start when you are stuck (II)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(II))**
+
+**[How to start when you are stuck (III)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(III))**
+
+You are a camper just like me, you get to an exercise and you get stuck … just like anyone else. You have no idea how to start, you stare at your editor and you think you must have a problem, surely you are not developer material … well you’re wrong!  Perhaps you are just like me? I’m a visual person, I like a drawing better than a text. Everytime the same problem put down in a schema makes more sense to me than if you gave me a text. So … what do I do when I have problems solving/understanding an exercise? I start to draw. After I have my drawing in place if I need more to translate it to code I can also write it in pseudocode. After that transposing it to code should not be very hard. 
+
+### So what are this flowcharts (the drawings) and pseudocode?
+
+During my first semester in college, we had a course about introduction to algorithms. This is where we first learned about this stuff. We learned that a good algorithm and good logical programing is developed using flowcharts and pseudocode.
+
+A **flowchart** represents your program flow from top to bottom. Each command is represented on this. Depending on the nature of the command there are different shapes you can use. A few of them that I mostly use (you can google more on this, google is your friend when you know what to google for) are:
+
+![](http://biancamihai.github.io/img/flowchart-theory.png)
+
+More information about this you can find here https://en.wikipedia.org/wiki/Flowchart.
+
+**Pseudocode** is an informal language that helps developers write algorithms. It is a text-based design tool and it uses a human readable language. It’s a structured english text that describes an algorithm. 
+
+Every bonfire in Free Code Camp curriculum can be solved using pseudocode and after that translated using javascript in a functional javascript code.
+
+**[How to start when you are stuck (II)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(II))**
\ No newline at end of file
diff --git a/data/wiki/How-to-start-when-you-are-stuck-(II).md b/data/wiki/How-to-start-when-you-are-stuck-(II).md
new file mode 100644
index 0000000..b0034eb
--- /dev/null
+++ b/data/wiki/How-to-start-when-you-are-stuck-(II).md
@@ -0,0 +1,30 @@
+**[How to start when you are stuck (I)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(I))**
+
+**[How to start when you are stuck (III)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(III))**
+
+Let’s try an example. If we take a look at one of the Free Code Camp exercices, and let’s choose a more simple one: [find the longest word in a string](http://www.freecodecamp.com/challenges/bonfire-find-the-longest-word-in-a-string). We can start and draw a flowchart for it and write a first solution in pseudocode.
+
+![](http://biancamihai.github.io/img/bonfire-1.png)
+
+So what does Free Code Camp want from us with this problem? Well it wants as to create a function that gets a string as a parameter and returns an integer. This integer should represent the length of the longest word in this string. Usually you can solve a problem on Free Code Camp by just looking at the **More information** text. In this case Free code camp is giving us some very good tips:
+    
+    Return the length of the longest word in the provided sentence.
+    Your response should be a number.
+    Remember to use RSAP if you get stuck. Try to pair program. Write your own code.
+    Here are some helpful links: String.split(), String.length
+
+If we take a look at the Free Code Camp suggestions we’ll see that String.split() can be used to split a string into an array and String.length gives us the length of a string. This helps us think of an algorithm. What if we split the string into an array, we loop through it and using the length attribute we find out the length of the longest word. Hmm, doesn’t seem very complicated but how to start this? Well ... take a look at the image below. 
+
+![](http://biancamihai.github.io/img/flowchart.png)
+
+If we follow the schema AND/OR the pseudocode, writing the function that gives us the length of the longest word in a string shouldn’t be very hard now … in any language … not just in javascript.
+
+![](http://biancamihai.github.io/img/bonfire-2.png)
+
+Now that we have this first working version, we can try and rewrite it using a for loop. Or we can take a look at forEach and if we really want to go wild we can rewrite this using the functional programming way. So let’s challenge ourselves to write a “one line” solution for the problem. 
+
+Searching through the MDN documentation you’ll find out that you can use the max function on arrays and that there is a map function that helps us change the current array. Hmm … that should should help us … right? Yes! the idea remains the same, you get a string, split it into an array and you return an integer but here is how:
+
+![](http://biancamihai.github.io/img/bonfire-3.png)
+
+**[How to start when you are stuck (III)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(III))**
\ No newline at end of file
diff --git a/data/wiki/How-to-start-when-you-are-stuck-(III).md b/data/wiki/How-to-start-when-you-are-stuck-(III).md
new file mode 100644
index 0000000..0471b7d
--- /dev/null
+++ b/data/wiki/How-to-start-when-you-are-stuck-(III).md
@@ -0,0 +1,14 @@
+**[How to start when you are stuck (I)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(I))**
+
+**[How to start when you are stuck (II)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(II))**
+
+### Tips
+
+* Always look at your logs, keep your console open. You can spot errors faster this way. To open the console log on chrome: click right -> inspect -> console There are so many errors that come from typos and so much time lost that you can save just by developing this very simple habit 
+* Pair with other programmers as much as you can
+* Read the documentation. You can install a very helpful [MDN Chrome Extension](https://chrome.google.com/webstore/detail/mdn-search/ffpifaemeofjmncjdbegmbpcdaemkeoc) and use it as much and often as you need to
+* Follow the help tips provided by Free Code Camp in the “More informations” section. The answer is there!
+* Try to solve the problem in more than one way, always try to make it better, more readable, a lower complexity time, less memory
+* If none of the above steps work, ask for help :)
+
+![](http://biancamihai.github.io/img/console.png)
\ No newline at end of file
diff --git a/data/wiki/How-to-use-the-Free-Code-Camp-Wiki.md b/data/wiki/How-to-use-the-Free-Code-Camp-Wiki.md
new file mode 100644
index 0000000..ed004b1
--- /dev/null
+++ b/data/wiki/How-to-use-the-Free-Code-Camp-Wiki.md
@@ -0,0 +1,18 @@
+The Free Code Camp wiki strives to provide clear answers to common questions about Free Code Camp, learning to code, and getting a coding job.
+
+Individual Wiki's can be accessed from the main page, or from other linked Wiki pages.  
+
+You can also access them from Gitter using Camperbot 
+
+- #### **`help $topic`**  
+  find related materials to that topic, usually a page from the [wiki]
+  (https://github.com/bothelpers/kbase/wiki/)  
+  examples: `help css` `help bootstrap`
+
+- #### `topics`
+  show the list of topics.
+
+- #### `find $topic` 
+  this will search for entries that include `$topic` in the title. We'll add fulltext search in    
+  future.  
+  examples: `find wiki`
diff --git a/data/wiki/How-you-can-get-to-Inbox-Zero-with-Gmail-shortcuts.md b/data/wiki/How-you-can-get-to-Inbox-Zero-with-Gmail-shortcuts.md
new file mode 100644
index 0000000..b07d7ab
--- /dev/null
+++ b/data/wiki/How-you-can-get-to-Inbox-Zero-with-Gmail-shortcuts.md
@@ -0,0 +1,21 @@
+> These Gmail Shortcuts will save you hours and help you get to Inbox Zero.
+
+See https://player.vimeo.com/video/115194016
+
+### Gmail Shortcuts
+| shortcut 	| description 	|
+|----------	|------------:	|
+| j        	|   move down 	|
+| k        	|     move up 	|
+| o        	|        open 	|
+| r        	|       reply 	|
+| a        	|   reply all 	|
+| f        	|     forward 	|
+| c        	|     compose 	|
+| x        	|      select 	|
+| e        	|     archive 	|
+| !        	|   mark spam 	|
+| z        	|        undo 	|
+| \#       	|     *delete 	|
+
+\* This may not work on some EU Mac keyboards where # is accessed with, `ALT + 3`. Workaround [here](http://toodlepip.co.uk/2010/blog-2010-09-gmail-delete-key-shortcut-uk-apple-users/).
\ No newline at end of file
diff --git a/data/wiki/How-you-can-help-to-stimulate-your-city's-Campsite-on-Facebook.md b/data/wiki/How-you-can-help-to-stimulate-your-city's-Campsite-on-Facebook.md
new file mode 100644
index 0000000..997b61a
--- /dev/null
+++ b/data/wiki/How-you-can-help-to-stimulate-your-city's-Campsite-on-Facebook.md
@@ -0,0 +1,10 @@
+
+## A great way to stimulate your Campsite is by asking questions.     
+**You can ask questions like**
+* What is everyone working on this week?
+* How did you approach a specific waypoint, bonfire, zipline, basejump?
+* Would anyone be interested in meeting up to pair program together this week?
+* Did everyone hear about "insert recent announcement"
+* What are some parts of free code camp you'd like to give additional focus to?
+
+**You can also provide useful links for other members to relevant resources that you find helpful.**
\ No newline at end of file
diff --git a/data/wiki/How-you-can-reach-the-Free-Code-Camp-team-to-interview-them-for-your-publication.md b/data/wiki/How-you-can-reach-the-Free-Code-Camp-team-to-interview-them-for-your-publication.md
new file mode 100644
index 0000000..345bc0b
--- /dev/null
+++ b/data/wiki/How-you-can-reach-the-Free-Code-Camp-team-to-interview-them-for-your-publication.md
@@ -0,0 +1,8 @@
+We're happy to do a quick interview for your publication or show. Here's whom you should contact about what, and how to best reach them:
+
+- Want to talk to about Free Code Camp's curriculum or long-term vision? Reach out to Quincy Larson. He's [@ossia on Twitter](https://twitter.com/ossia)</a> and @quincylarson on Gitter.
+- Want to talk about Free Code Camp's open source codebase, infrastructure, or JavaScript in general? Talk to Berkeley Martinez. He's [@berkeleytrue on Twitter](https://twitter.com/berkeleytrue) and @berkeleytrue on Gitter.
+- Want to explore our efforts to empower nonprofits with code? Michael D. Johnson eats, sleeps and breathes that. He's [@figitalboy on Twitter](https://twitter.com/figitalboy) and @codenonprofit on Gitter.
+- Want to get a camper's perspective on our community? Talk with Bianca Mihai. She's [@bubuslubu on Twitter](https://twitter.com/bubuslubu) and @biancamihai on Gitter. Or you can talk with Suzanne Atkinson. She's [@steelcitycoach on Twitter](https://twitter.com/SteelCityCoach) and @adventurebear on Gitter.
+
+We strive to be helpful and transparent in everything we do. We'll do what we can to help you share our community with your audience.
\ No newline at end of file
diff --git a/data/wiki/How-you-can-stream-your-live-coding-sessions-on-the-Free-Code-Camp-Twitch.tv-channel.md b/data/wiki/How-you-can-stream-your-live-coding-sessions-on-the-Free-Code-Camp-Twitch.tv-channel.md
new file mode 100644
index 0000000..107f7fc
--- /dev/null
+++ b/data/wiki/How-you-can-stream-your-live-coding-sessions-on-the-Free-Code-Camp-Twitch.tv-channel.md
@@ -0,0 +1,19 @@
+If you're interested in coding JavaScript live in front of dozens of people on our popular [twitch.tv channel](http://twitch.tv/freecodecamp), we'd love to have you.
+
+Please follow these steps to get started:
+
+- Follow [this tutorial](http://www.hdpvrcapture.com/wordpress/?p=5951) to set up your computer for streaming.
+- Contact [Wesley](https://gitter.im/septimus). He's in charge of our Twitch.tv channel. Tell him what you'd like to stream, and when you're available to stream.
+- Wesley will pair with you using [Screen Hero](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-install-Screenhero) to verify your computer is configured properly to stream.
+
+Be respectful of your audience. Everything you stream should be related to coding JavaScript, and should be safe-for-work.
+
+While you're streaming, keep the chat room open so you can respond to questions from your viewers. If we get a new follower, try to thank them.
+
+Play our [camper-DJ'd radio station](http://plug.dj/freecodecamp) in the background.
+
+Use a webcam. If viewers can see your face while you're talking, it will help them feel more connected to you.
+
+Think out-loud as much as possible so that your viewers can understand what you're thinking and doing.
+
+If you do a good job, we'll invite you back to stream some more. Who knows, you might become one of our regular streamers!
\ No newline at end of file
diff --git a/data/wiki/IIFE.md b/data/wiki/IIFE.md
new file mode 100644
index 0000000..ba36059
--- /dev/null
+++ b/data/wiki/IIFE.md
@@ -0,0 +1,9 @@
+> IIFE — initialism for Immediately Invoked Function Expression
+
+Keep your data inside the [closure](https://github.com/freecodecamp/freecodecamp/wiki/js-closures)!
+
+```js
+(function(){
+  //add your magic here
+})();
+```
\ No newline at end of file
diff --git a/data/wiki/If-Free-Code-Camp-is-free,-how-does-it-make-money.md b/data/wiki/If-Free-Code-Camp-is-free,-how-does-it-make-money.md
new file mode 100644
index 0000000..60e5aa5
--- /dev/null
+++ b/data/wiki/If-Free-Code-Camp-is-free,-how-does-it-make-money.md
@@ -0,0 +1,7 @@
+We will always be completely free for both students and for nonprofits.
+
+Our name is Free Code Camp. We are a free code camp. If you had to pay us (or sign over future earnings), we'd have to change our name. And we are not going to do that.
+
+Everyone working on our community and our open source projects is a volunteer.
+
+We plan to eventually cover our operational costs by earning job placement bonuses from companies who hire our graduates. Note that we will not actually garnish any wages from our graduates - employers are already paying recruiters thousands of dollars to find successful candidates. Employers will simply pay the recruitment bonus to Free Code Camp instead of paying a recruiter.
\ No newline at end of file
diff --git a/data/wiki/Intro-to-Yeoman-Angular-Fullstack-Basejumps.md b/data/wiki/Intro-to-Yeoman-Angular-Fullstack-Basejumps.md
new file mode 100644
index 0000000..e484c12
--- /dev/null
+++ b/data/wiki/Intro-to-Yeoman-Angular-Fullstack-Basejumps.md
@@ -0,0 +1,9 @@
+> Hey FreeCodeCampers! This guide is here to help you navigate creating your first basejump. When I encountered the first basejump, I had no idea what was going on and spent weeks learning all of these things myself. Everything here is stuff I wish I had known coming into the basejumps. Oh and by the way, if you have a question that isn't answered by this guide, that's an issue, and you should report it as an issue to this repository! —[@clnhll](http://twitter.com/clnhll)
+
+Yeoman is a tool that allows you to generate barebones apps based on different software stacks using “generator” packages made by developers who want to make your life easier. These packages streamline your time developing and deploying websites using your platform of choice. We’re using a full-stack MEAN (MongoDB, ExpressJS, AngularJS, NodeJS) generator called generator-angular-fullstack by DaftMonk (https://github.com/DaftMonk/generator-angular-fullstack).
+
+Once you’ve completed the Waypoint: Get Set for Basejumps, use this guide to navigate the base structure of your new app and learn how to interact with the database as well as the user.
+
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Guide-to-Basejumps-Table-of-Contents)
+
+Sourced from (https://github.com/clnhll/guidetobasejumps) with permission.
\ No newline at end of file
diff --git a/data/wiki/JavaScript-Truth-Table.md b/data/wiki/JavaScript-Truth-Table.md
new file mode 100644
index 0000000..e9ea3d1
--- /dev/null
+++ b/data/wiki/JavaScript-Truth-Table.md
@@ -0,0 +1,5 @@
+![A table showing which JavaScript arguments are true and false.](http://i.stack.imgur.com/35MpY.png)
+
+This is why you should always use `===` and `!==`.
+
+Source: https://dorey.github.io/JavaScript-Equality-Table/
\ No newline at end of file
diff --git a/data/wiki/Javascript-Links.md b/data/wiki/Javascript-Links.md
new file mode 100644
index 0000000..87bcff5
--- /dev/null
+++ b/data/wiki/Javascript-Links.md
@@ -0,0 +1,9 @@
+> Links to Javascript Resources
+
+### Challenges
+- [Code Wars](http://codewars.com)
+- [Hacker Rank](https://hackerrank.com)
+- [Coding Game](http://codingame.com)
+
+### Exercises
+- [Codility](https://codility.com/programmers/lessons/)
\ No newline at end of file
diff --git a/data/wiki/Linking-Your-Account-with-GitHub.md b/data/wiki/Linking-Your-Account-with-GitHub.md
new file mode 100644
index 0000000..78a84ea
--- /dev/null
+++ b/data/wiki/Linking-Your-Account-with-GitHub.md
@@ -0,0 +1,8 @@
+In August 2015, we pushed some changes that caused trouble for many of our campers.
+
+If you are unable to link your GitHub account to your current account, here is what we recommend doing: 
+
+1) Sign out with your current account and try signing in with GitHub. 
+2) Check your challenge map. Your account should have no progress. Delete that account here: http://freecodecamp.com/account
+3) Sign into Free Code Camp the way you normally do (Facebook, email, etc). You should see your original progress. 
+3) Now add GitHub to that account, and you should be all set.
\ No newline at end of file
diff --git a/data/wiki/List-of-Free-Code-Camp-city-based-Campsites-and-Chat-rooms.md b/data/wiki/List-of-Free-Code-Camp-city-based-Campsites-and-Chat-rooms.md
new file mode 100644
index 0000000..643bd01
--- /dev/null
+++ b/data/wiki/List-of-Free-Code-Camp-city-based-Campsites-and-Chat-rooms.md
@@ -0,0 +1,428 @@
+| City | Facebook | Gitter |
+| --- | --- | --- | 
+| Aarhus | [Facebook](https://www.facebook.com/groups/FreeCodeCampAarhus) | [Gitter](//gitter.im/freecodecamp/Aarhus) |
+| Abu Dhabi | [Facebook](https://www.facebook.com/groups/free.code.camp.abu.dhabi/) | [Gitter](//gitter.im/freecodecamp/AbuDhabi) |
+| Accra | [Facebook](//www.facebook.com/groups/free.code.camp.accra/) | [Gitter](//gitter.im/freecodecamp/Accra) |
+| Adelaide | [Facebook](//www.facebook.com/groups/free.code.camp.adelaide/) | [Gitter](//gitter.im/freecodecamp/Adelaide) |
+| Ahmedabad | [Facebook](//www.facebook.com/groups/free.code.camp.ahmedabad/) | [Gitter](//gitter.im/freecodecamp/Ahmedabad) |
+| Aichi | [Facebook](//www.facebook.com/groups/free.code.camp.aichi/) | [Gitter](//gitter.im/freecodecamp/Aichi) |
+| Alameda | [Facebook](//www.facebook.com/groups/free.code.camp.berkeley/) | [Gitter](//gitter.im/freecodecamp/EastBay) |
+| Albany | [Facebook](//www.facebook.com/groups/free.code.camp.albany.ny/) | [Gitter](//gitter.im/freecodecamp/Albany) |
+| Albuquerque | [Facebook](https://www.facebook.com/groups/free.code.camp.albuquerque/) | [Gitter](//gitter.im/freecodecamp/Albuquerque) |
+| Algiers | [Facebook](https://www.facebook.com/groups/free.code.camp.Algiers/) | [Gitter](//gitter.im/freecodecamp/Algiers) |
+| Allahabad | [Facebook](https://www.facebook.com/groups/free.code.camp.allahabad/) | [Gitter](//gitter.im/freecodecamp/Allahabad) |
+| Almeria | [Facebook](https://www.facebook.com/groups/free.code.camp.almeria/) | [Gitter](//gitter.im/freecodecamp/Almeria) |
+| Amman | [Facebook](//www.facebook.com/groups/free.code.camp.amman/) | [Gitter](//gitter.im/freecodecamp/Amman) |
+| Amsterdam | [Facebook](//www.facebook.com/groups/free.code.camp.amsterdam/) | [Gitter](//gitter.im/freecodecamp/Amsterdam) |
+| Anacortes | [Facebook](https://www.facebook.com/groups/free.code.camp.anacortes/) | [Gitter](//gitter.im/freecodecamp/Anacortes) |
+| Ankara | [Facebook](//www.facebook.com/groups/free.code.camp.ankara/) | [Gitter](//gitter.im/freecodecamp/Ankara) |
+| Ann Arbor | [Facebook](//www.facebook.com/groups/free.code.camp.ann.arbor/) | [Gitter](//gitter.im/freecodecamp/AnnArbor) |
+| Apucarana | [Facebook](//www.facebook.com/groups/free.code.camp.your.apucarana.parana/) | [Gitter](//gitter.im/freecodecamp/Apucarana) |
+| Aracaju | [Facebook](//www.facebook.com/groups/free.code.camp.aracaju/) | [Gitter](//gitter.im/freecodecamp/Aracaju) |
+| Asheville | [Facebook](//www.facebook.com/groups/free.code.camp.asheville/) | [Gitter](//gitter.im/freecodecamp/Asheville) |
+| Asuncion | [Facebook](//www.facebook.com/groups/free.code.camp.asuncion/) | [Gitter](//gitter.im/freecodecamp/Asuncion) |
+| Athens | [Facebook](https://www.facebook.com/groups/free.code.camp.athens.greece/) | [Gitter](//gitter.im/freecodecamp/Athens) |
+| Athens, Ohio | [Facebook](https://www.facebook.com/groups/free.code.camp.athens.ohio/) | [Gitter](//gitter.im/freecodecamp/AthensOH) |
+| Atlanta | [Facebook](//www.facebook.com/groups/free.code.camp.atlanta/) | [Gitter](//gitter.im/freecodecamp/Atlanta) |
+| Auburn, ME| [Facebook]( https://www.facebook.com/groups/free.code.camp.auburn.maine/) | [Gitter](//gitter.im/freecodecamp/AuburnME) |
+| Auckland | [Facebook](//www.facebook.com/groups/awesome.code.camp/) | [Gitter](//gitter.im/freecodecamp/Auckland) |
+| Aurora | [Facebook](https://www.facebook.com/groups/free.code.camp.aurora/) | [Gitter](//gitter.im/freecodecamp/Aurora) |
+| Austin | [Facebook](//www.facebook.com/groups/free.code.camp.austin/) | [Gitter](//gitter.im/freecodecamp/Austin) |
+| Bacau | [Facebook](https://www.facebook.com/groups/free.code.camp.bacau/) | [Gitter](//gitter.im/freecodecamp/Bacau) |
+| Bakersfield | [Facebook](https://www.facebook.com/groups/free.code.camp.bakersfield.california/) | [Gitter](//gitter.im/freecodecamp/Bakersfield) |
+| Baku | [Facebook](https://www.facebook.com/groups/free.code.camp.baku/) | [Gitter](//gitter.im/freecodecamp/Baku) |
+| Baltimore | [Facebook](//www.facebook.com/groups/free.code.camp.baltimore/) | [Gitter](//gitter.im/freecodecamp/Baltimore) |
+| Bandung | [Facebook](//www.facebook.com/groups/free.code.camp.bandung/) | [Gitter](//gitter.im/freecodecamp/Bandung) |
+| Bangkok | [Facebook](//www.facebook.com/groups/free.code.camp.bangkok/) | [Gitter](//gitter.im/freecodecamp/Bangkok) |
+| Barcelona | [Facebook](https://www.facebook.com/groups/free.code.camp.barcelona/) | [Gitter](//gitter.im/freecodecamp/Barcelona) |
+| Barranquilla | [Facebook](https://www.facebook.com/groups/free.code.camp.barranquilla.co/) | [Gitter](//gitter.im/freecodecamp/Barranquilla) |
+| Batticaloa | [Facebook](https://www.facebook.com/groups/free.code.camp.batticaloa/) | [Gitter](//gitter.im/freecodecamp/Batticaloa) |
+| Beirut | [Facebook](https://www.facebook.com/groups/free.code.camp.beirut/) | [Gitter](//gitter.im/freecodecamp/Beirut) |
+| Belem | [Facebook](//www.facebook.com/groups/free.code.camp.belem/) | [Gitter](//gitter.im/freecodecamp/Belem) |
+| Belgrade | [Facebook](//www.facebook.com/groups/free.code.camp.belgrade/) | [Gitter](//gitter.im/freecodecamp/Belgrade) |
+| Belize City | [Facebook](https://www.facebook.com/groups/free.code.camp.belize.city/) | [Gitter](//gitter.im/freecodecamp/BelizeCity) |
+| Belize | [Facebook](//www.facebook.com/groups/free.code.camp.belize/) | [Gitter](//gitter.im/freecodecamp/Belize) |
+| Bellingham | [Facebook](//www.facebook.com/groups/free.code.camp.bellingham/) | [Gitter](//gitter.im/freecodecamp/Bellingham) |
+| Belo Horizonte | [Facebook](//www.facebook.com/groups/free.code.camp.belo.horizonte/) | [Gitter](//gitter.im/freecodecamp/BeloHorizonte) |
+| Bengaluru | [Facebook](//www.facebook.com/groups/free.code.camp.bengaluru/) | [Gitter](//gitter.im/freecodecamp/Bengaluru) |
+| Berkeley | [Facebook](//www.facebook.com/groups/free.code.camp.berkeley/) | [Gitter](//gitter.im/freecodecamp/EastBay) |
+| Berlin | [Facebook](//www.facebook.com/groups/free.code.camp.berlin/) | [Gitter](//gitter.im/freecodecamp/Berlin) |
+| Bhaktapur | [Facebook](//www.facebook.com/groups/free.code.camp.bhaktapur/) | [Gitter](//gitter.im/freecodecamp/Bhaktapur) |
+| Bhubaneswar | [Facebook](//www.facebook.com/groups/free.code.camp.bhubaneswar/) | [Gitter](//gitter.im/freecodecamp/Bhubaneswar) |
+| Bijeljina | [Facebook](//www.facebook.com/groups/free.code.camp.bijeljina/) | [Gitter](//gitter.im/freecodecamp/Bijeljina) |
+| Birmingham | [Facebook](//www.facebook.com/groups/free.code.camp.birmingham.uk/) | [Gitter](//gitter.im/freecodecamp/Birmingham) |
+| Birmingham, Alabama | [Facebook](//www.facebook.com/groups/free.code.camp.oxford.al/) | [Gitter](//gitter.im/freecodecamp/BirminghamAlabama) |
+| Bishkek | [Facebook](//www.facebook.com/groups/free.code.camp.bishkek/) | [Gitter](//gitter.im/freecodecamp/Bishkek) |
+| Bismarck, ND | [Facebook](//www.facebook.com/groups/free.code.camp.bismarck.north.dakota/) | [Gitter](//gitter.im/freecodecamp/Bismarck) |
+| Bloomington, IL | [Facebook](//www.facebook.com/groups/free.code.camp.bloomington.normal/) | [Gitter](//gitter.im/freecodecamp/BloomingtonNormal) |
+| Bloomington, IN | [Facebook](//www.facebook.com/groups/free.code.camp.bloomington.in/) | [Gitter](//gitter.im/freecodecamp/BloomingtonIN) |
+| Bogota | [Facebook](//www.facebook.com/groups/free.code.camp.bogota/) | [Gitter](//gitter.im/freecodecamp/Bogota) |
+| Boise | [Facebook](//www.facebook.com/groups/free.code.camp.boise) | [Gitter](//gitter.im/freecodecamp/Boise) |
+| Boston | [Facebook](//www.facebook.com/groups/free.code.camp.boston/) | [Gitter](//gitter.im/freecodecamp/Boston) |
+| Boulder | [Facebook](//www.facebook.com/groups/free.code.camp.boulder/) | [Gitter](//gitter.im/freecodecamp/Boulder) |
+| Brasilia | [Facebook](//www.facebook.com/groups/free.code.camp.brasilia/) | [Gitter](//gitter.im/freecodecamp/Brasilia) |
+| Brasov | [Facebook](https://www.facebook.com/groups/free.code.camp.brasov) | [Gitter](//gitter.im/freecodecamp/Brasov) |
+| Bratislava | [Facebook](//www.facebook.com/groups/free.code.camp.bratislava/) | [Gitter](//gitter.im/freecodecamp/Bratislava) |
+| Brighton | [Facebook](//www.facebook.com/groups/free.code.camp.brighton/) | [Gitter](//gitter.im/freecodecamp/Brighton) |
+| Brisbane | [Facebook](https://www.facebook.com/groups/free.code.camp.brisbane/) | [Gitter](//gitter.im/freecodecamp/Brisbane) |
+| Brno | [Facebook](//www.facebook.com/groups/free.code.camp.brno/) | [Gitter](//gitter.im/freecodecamp/Brno) |
+| Brussels | [Facebook](//www.facebook.com/groups/free.code.camp.brussels/) | [Gitter](//gitter.im/freecodecamp/Brussels) |
+| Bryan College Station | [Facebook](https://www.facebook.com/groups/free.code.camp.bryan.college.station/) | [Gitter](//gitter.im/freecodecamp/BryanCollegeStation) |
+| Bucaramanga | [Facebook](//www.facebook.com/groups/free.code.camp.bucaramanga/) | [Gitter](//gitter.im/freecodecamp/Bucaramanga) |
+| Bucharest | [Facebook](//www.facebook.com/groups/free.code.camp.bucharest/) | [Gitter](//gitter.im/freecodecamp/Bucharest) |
+| Budapest | [Facebook](//www.facebook.com/groups/free.code.camp.budapest/) | [Gitter](//gitter.im/freecodecamp/Budapest) |
+| Buenos Aires | [Facebook](//www.facebook.com/groups/free.code.camp.buenos.aires/) | [Gitter](//gitter.im/freecodecamp/BuenosAires) |
+| Buffalo | [Facebook](https://www.facebook.com/groups/free.code.camp.buffalo/) | [Gitter](//gitter.im/freecodecamp/Buffalo) |
+| Bury St Edmunds | [Facebook](//www.facebook.com/groups/free.code.camp.Bury.St.Edmunds/) | [Gitter](//gitter.im/freecodecamp/BuryStEdmunds) |
+| Busan | [Facebook](https://www.facebook.com/groups/free.code.camp.busan/) | [Gitter](//gitter.im/freecodecamp/Busan) |
+| Butte, MN| [Facebook]( https://www.facebook.com/groups/free.code.camp.butte.montana/) | [Gitter](//gitter.im/freecodecamp/ButteMN) |
+| Bydgoszcz | [Facebook](//www.facebook.com/groups/free.code.camp.bydgoszcz/) | [Gitter](//gitter.im/freecodecamp/Bydgoszcz) |
+| Cairo | [Facebook](//www.facebook.com/groups/free.code.camp.cairo/) | [Gitter](//gitter.im/freecodecamp/Cairo) |
+| Calgary | [Facebook](//www.facebook.com/groups/free.code.camp.calgary/) | [Gitter](//gitter.im/freecodecamp/Calgary) |
+| Cali | [Facebook](https://www.facebook.com/groups/free.code.camp.cali/) | [Gitter](//gitter.im/freecodecamp/Cali) |
+| Campinas | [Facebook](//www.facebook.com/groups/free.code.camp.campinas/) | [Gitter](//gitter.im/freecodecamp/Campinas) |
+| Canberra | [Facebook](https://www.facebook.com/groups/free.code.camp.canberra/) | [Gitter](//gitter.im/freecodecamp/Canberra) |
+| Cape Cod | [Facebook](//www.facebook.com/groups/free.code.camp.cape.cod/) | [Gitter](//gitter.im/freecodecamp/CapeCod) |
+| Cape Town | [Facebook](//www.facebook.com/groups/free.code.camp.cape.town/) | [Gitter](//gitter.im/freecodecamp/CapeTown) |
+| Caracas | [Facebook](//www.facebook.com/groups/free.code.camp.caracas/) | [Gitter](//gitter.im/freecodecamp/Caracas) |
+| Cardiff | [Facebook](https://www.facebook.com/groups/free.code.camp.cardiff/) | [Gitter](//gitter.im/freecodecamp/Cardiff) |
+| Casablanca | [Facebook](https://www.facebook.com/groups/free.code.camp.casablanca/) | [Gitter](//gitter.im/freecodecamp/Casablanca) |
+| Central Mississippi | [Facebook](https://www.facebook.com/groups/free.code.camp.central.mississippi/) | [Gitter](//gitter.im/freecodecamp/CentralMississippi) |
+| Champaign-Urbana | [Facebook](https://www.facebook.com/groups/free.code.camp.champaign.urbana/) | [Gitter](//gitter.im/freecodecamp/ChampaignUrbana) |
+| Charlotte | [Facebook](//www.facebook.com/groups/free.code.camp.charlotte.nc/) | [Gitter](//gitter.im/freecodecamp/Charlotte) |
+| Chattanooga | [Facebook](//www.facebook.com/groups/free.code.camp.chattanooga/) | [Gitter](//gitter.im/freecodecamp/Chattanooga) |
+| Chennai | [Facebook](//www.facebook.com/groups/free.code.camp.chennai/) | [Gitter](//gitter.im/freecodecamp/Chennai) |
+| Chernivtsi | [Facebook](https://www.facebook.com/groups/free.code.camp.chernivtsi.chernivetska.oblast.u/) | [Gitter](//gitter.im/freecodecamp/Chernivtsi) |
+| Chiang Mai | [Facebook](//www.facebook.com/groups/free.code.camp.chiang.mai/) | [Gitter](//gitter.im/freecodecamp/ChiangMai) |
+| Chicago | [Facebook](//www.facebook.com/groups/free.code.camp.chicago/) | [Gitter](//gitter.im/freecodecamp/Chicago) |
+| Christchurch | [Facebook](//www.facebook.com/groups/free.code.camp.christchurch/) | [Gitter](//gitter.im/freecodecamp/Christchurch) |
+| Cincinnati | [Facebook](//www.facebook.com/groups/free.code.camp.cincinnati/) | [Gitter](//gitter.im/freecodecamp/Cincinnati) |
+| Clarksville | [Facebook](//www.facebook.com/groups/free.code.camp.clarksville.TN/) | [Gitter](//gitter.im/freecodecamp/Clarksville) |
+| Cleveland | [Facebook](//www.facebook.com/groups/free.code.camp.cleveland/) | [Gitter](//gitter.im/freecodecamp/Cleveland) |
+| Cluj | [Facebook](//www.facebook.com/groups/free.code.camp.cluj) | [Gitter](//gitter.im/freecodecamp/Cluj) |
+| Coimbatore | [Facebook](//www.facebook.com/groups/free.code.camp.coimbatore) | [Gitter](//gitter.im/freecodecamp/Coimbatore) |
+| Colombo | [Facebook](https://www.facebook.com/groups/free.code.camp.colombo/) | [Gitter](//gitter.im/freecodecamp/Colombo) |
+| Colorado Springs | [Facebook](//www.facebook.com/groups/freecodecampcoloradosprings/) | [Gitter](//gitter.im/freecodecamp/ColoradoSprings) |
+| Columbus | [Facebook](https://www.facebook.com/groups/free.code.camp.columbus/) | [Gitter](//gitter.im/freecodecamp/Columbus) |
+| Coventry | [Facebook](//www.facebook.com/groups/free.code.camp.coventry/) | [Gitter](//gitter.im/freecodecamp/Coventry) |
+| Cuenca | [Facebook](//www.facebook.com/groups/free.code.camp.cuenca/) | [Gitter](//gitter.im/freecodecamp/Cuenca) |
+| Curitiba | [Facebook](//www.facebook.com/groups/free.code.camp.curitiba/) | [Gitter](//gitter.im/freecodecamp/Curitiba) |
+| Dallas | [Facebook](//www.facebook.com/groups/free.code.camp.dallas/) | [Gitter](//gitter.im/freecodecamp/DallasFortWorth) |
+| Delhi | [Facebook](//www.facebook.com/groups/free.code.camp.delhi/) | [Gitter](//gitter.im/freecodecamp/Delhi) |
+| Denver | [Facebook](//www.facebook.com/groups/free.code.camp.denver/) | [Gitter](//gitter.im/freecodecamp/Denver) |
+| Derby | [Facebook](//www.facebook.com/groups/free.code.camp.derby/) | [Gitter](//gitter.im/freecodecamp/Derby) |
+| Des Moines | [Facebook](//www.facebook.com/groups/free.code.camp.des.moines/) | [Gitter](//gitter.im/freecodecamp/DesMoines) |
+| Detroit | [Facebook](//www.facebook.com/groups/free.code.camp.detroit/) | [Gitter](//gitter.im/freecodecamp/Detroit) |
+| Dhaka | [Facebook](//www.facebook.com/groups/free.code.camp.dhaka/) | [Gitter](//gitter.im/freecodecamp/Dhaka) |
+| Dnipropetrovsk | [Facebook](//www.facebook.com/groups/free.code.camp.dnipropetrovsk) | [Gitter](//gitter.im/freecodecamp/Dnipropetrovsk) |
+| Doha | [Facebook](//www.facebook.com/groups/free.code.camp.doha/) | [Gitter](//gitter.im/freecodecamp/Doha) |
+| Dubai | [Facebook](//www.facebook.com/groups/free.code.camp.dubai/) | [Gitter](//gitter.im/freecodecamp/Dubai) |
+| Dublin | [Facebook](//www.facebook.com/groups/free.code.camp.dublin/) | [Gitter](//gitter.im/freecodecamp/Dublin) |
+| Duluth | [Facebook](https://www.facebook.com/groups/free.code.camp.duluth/) | [Gitter](//gitter.im/freecodecamp/Duluth) |
+| Durango | [Facebook](//www.facebook.com/groups/free.code.camp.durango/) | [Gitter](//gitter.im/freecodecamp/Durango) |
+| Edinburgh | [Facebook](https://www.facebook.com/groups/free.code.camp.edinburgh/) | [Gitter](//gitter.im/freecodecamp/Edinburgh) |
+| Edmonton | [Facebook](//www.facebook.com/groups/free.code.camp.edmonton/) | [Gitter](//gitter.im/freecodecamp/Edmonton) |
+| El Paso | [Facebook](https://www.facebook.com/groups/free.code.camp.el.paso) | [Gitter](//gitter.im/freecodecamp/ElPaso) |
+| Evansville | [Facebook](https://www.facebook.com/groups/free.code.camp.evansville.in/) | [Gitter](//gitter.im/freecodecamp/Evansville) |
+| Farmville | [Facebook](https://www.facebook.com/groups/free.code.camp.farmville.va/) | [Gitter](//gitter.im/freecodecamp/Farmville) |
+| Fayetteville | [Facebook](https://www.facebook.com/groups/free.code.camp.fayetteville.arkansas/) | [Gitter](//gitter.im/freecodecamp/Fayetteville) |
+| Ferizaj | [Facebook](https://www.facebook.com/groups/free.code.camp.ferizaj/) | [Gitter](//gitter.im/freecodecamp/Ferizaj) |
+| Firenze | [Facebook](//www.facebook.com/groups/free.code.camp.firenze/) | [Gitter](//gitter.im/freecodecamp/Firenze) |
+| Flagstaff | [Facebook](//www.facebook.com/groups/free.code.camp.northern.arizona/) | [Gitter](//gitter.im/freecodecamp/NorthernArizona) |
+| Florianopolis | [Facebook](//www.facebook.com/groups/free.code.camp.florianopolis/) | [Gitter](//gitter.im/freecodecamp/Florianopolis) |
+| Folsom | [Facebook](https://www.facebook.com/groups/free.code.camp.folsom) | [Gitter](//gitter.im/freecodecamp/Folsom) |
+| Fort Collins | [Facebook](https://www.facebook.com/groups/free.code.camp.fort.collins/) | [Gitter](//gitter.im/freecodecamp/FortCollins) |
+| Fort Worth | [Facebook](//www.facebook.com/groups/free.code.camp.dallas/) | [Gitter](//gitter.im/freecodecamp/DallasFortWorth) |
+| Fortaleza | [Facebook](https://www.facebook.com/groups/free.code.group.fortaleza/) | [Gitter](//gitter.im/freecodecamp/Fortaleza) |
+| Frankfort | [Facebook](//www.facebook.com/groups/free.code.camp.frankfort.kentucky/) | [Gitter](//gitter.im/freecodecamp/Frankfort) |
+| Frankfurt | [Facebook](//www.facebook.com/groups/free.code.camp.frankfurt.main/) | [Gitter](//gitter.im/freecodecamp/Frankfurt) |
+| Freehold | [Facebook](//www.facebook.com/groups/free.code.camp.freehold/) | [Gitter](//gitter.im/freecodecamp/Freehold) |
+| Fremont | [Facebook](https://www.facebook.com/groups/free.code.camp.fremont/) | [Gitter](//gitter.im/freecodecamp/Fremont) |
+| Fresno | [Facebook](//www.facebook.com/groups/free.code.camp.fresno/) | [Gitter](//gitter.im/freecodecamp/Fresno) |
+| Fuengirola | [Facebook](//www.facebook.com/groups/free.code.camp.fuengirola/) | [Gitter](//gitter.im/freecodecamp/Fuengirola) |
+| Gainesville, FL | [Facebook](//www.facebook.com/groups/free.code.camp.gainesville.fla/) | [Gitter](//gitter.im/freecodecamp/GainesvilleFL) |
+| Galveston | [Facebook](//www.facebook.com/groups/free.code.camp.galveston/) | [Gitter](//gitter.im/freecodecamp/Galveston) |
+| Gdańsk | [Facebook](//www.facebook.com/groups/free.code.camp.trojmiasto/) | [Gitter](//gitter.im/freecodecamp/Trojmiasto) |
+| Gdynia | [Facebook](//www.facebook.com/groups/free.code.camp.trojmiasto) | [Gitter](//gitter.im/freecodecamp/Trojmiasto) |
+| Geneva | [Facebook](//www.facebook.com/groups/free.code.camp.geneva/) | [Gitter](//gitter.im/freecodecamp/Geneva) |
+| Glendora | [Facebook](//www.facebook.com/groups/free.code.camp.Glendora.California/) | [Gitter](//gitter.im/freecodecamp/Glendora) |
+| Goiania | [Facebook](https://www.facebook.com/groups/free.code.camp.goiania/) | [Gitter](//gitter.im/freecodecamp/Goiania) |
+| Granada | [Facebook](//www.facebook.com/groups/free.code.camp.granada/) | [Gitter](//gitter.im/freecodecamp/Granada) |
+| Grand Rapids | [Facebook](//www.facebook.com/groups/free.code.camp.grand.rapids/) | [Gitter](//gitter.im/freecodecamp/GrandRapids) |
+| Guadalajara | [Facebook](//www.facebook.com/groups/fcc.guadalajara) | [Gitter](//gitter.im/freecodecamp/Guadalajara) |
+| Guarapuava | [Facebook](//www.facebook.com/groups/free.code.camp.guarapuava/) | [Gitter](//gitter.im/freecodecamp/Guarapuava) |
+| Guatemala City | [Facebook](https://www.facebook.com/groups/free.code.camp.guatemala/) | [Gitter](//gitter.im/freecodecamp/GuatemalaCity) |
+| Guntur | [Facebook](//www.facebook.com/groups/free.code.camp.guntur/) | [Gitter](//gitter.im/freecodecamp/Guntur) |
+| Gurgaon | [Facebook](https://www.facebook.com/groups/free.code.camp.gurgaon/) | [Gitter](//gitter.im/freecodecamp/Gurgaon) |
+| Göttingen | [Facebook](https://www.facebook.com/groups/free.code.camp.goettingen/) | [Gitter](//gitter.im/freecodecamp/Goettingen) |
+| Hagerstown | [Facebook](//www.facebook.com/groups/free.code.camp.hagerstown/) | [Gitter](//gitter.im/freecodecamp/Hagerstown) |
+| Haifa | [Facebook]( //www.facebook.com/groups/free.code.camp.Haifa/) | [Gitter](//gitter.im/freecodecamp/Christchurch) |
+| Halifax | [Facebook](https://www.facebook.com/groups/free.code.camp.halifax/) | [Gitter](//gitter.im/freecodecamp/Halifax) |
+| Hamburg | [Facebook](//www.facebook.com/groups/free.code.camp.hamburg/) | [Gitter](//gitter.im/freecodecamp/Hamburg) |
+| Hampton Roads | [Facebook](//www.facebook.com/groups/free.code.camp.hamptonroads/) | [Gitter](//gitter.im/freecodecamp/HamptonRoads) |
+| Hanoi | [Facebook](//www.facebook.com/groups/free.code.camp.hanoi/) | [Gitter](//gitter.im/freecodecamp/Hanoi) |
+| Hartford | [Facebook](//www.facebook.com/groups/free.code.camp.hartford.connecticut/) | [Gitter](//gitter.im/freecodecamp/Hartford) |
+| Hermosillo | [Facebook](//www.facebook.com/groups/free.code.camp.Hermosillo/) | [Gitter](//gitter.im/freecodecamp/Hermosillo) |
+| Hickory | [Facebook](//www.facebook.com/groups/free.code.camp.hickory.nc) | [Gitter](//gitter.im/freecodecamp/Hickory) |
+| Ho Chi Minh City | [Facebook](//www.facebook.com/groups/free.code.camp.hochiminhcity/) | [Gitter](//gitter.im/freecodecamp/HoChiMinhCity) |
+| Hobart | [Facebook](https://www.facebook.com/groups/free.code.camp.hobart/) | [Gitter](//gitter.im/freecodecamp/Hobart) |
+| Hong Kong | [Facebook](//www.facebook.com/groups/free.code.camp.hk/) | [Gitter](//gitter.im/freecodecamp/HongKong) |
+| Houston | [Facebook](//www.facebook.com/groups/free.code.camp.houston/) | [Gitter](//gitter.im/freecodecamp/Houston) |
+| Hove | [Facebook](//www.facebook.com/groups/free.code.camp.hove) | [Gitter](//gitter.im/freecodecamp/Hove) |
+| Huntsville | [Facebook](https://www.facebook.com/groups/free.code.camp.huntsville/) | [Gitter](//gitter.im/freecodecamp/Huntsville) |
+| Hyderabad | [Facebook](//www.facebook.com/groups/free.code.camp.hyderabad/) | [Gitter](//gitter.im/freecodecamp/Hyderabad) |
+| Iasi | [Facebook](//www.facebook.com/groups/free.code.camp.iasi.romania/) | [Gitter](//gitter.im/freecodecamp/Iasi) |
+| idaho Falls | [Facebook](https://www.facebook.com/groups/free.code.camp.idaho.falls.idaho/) | [Gitter](//gitter.im/freecodecamp/IdahoFalls) |
+| Indianapolis | [Facebook](//www.facebook.com/groups/free.code.camp.indianapolis.in/) | [Gitter](//gitter.im/freecodecamp/Indianapolis) |
+| Ipswich | [Facebook](https://www.facebook.com/groups/free.code.camp.ipswich.qld/) | [Gitter](//gitter.im/freecodecamp/Ipswich) |
+| Irkutsk | [Facebook](//www.facebook.com/groups/free.code.camp.irkutsk/) | [Gitter](//gitter.im/freecodecamp/Irkutsk) |
+| Isfahan | [Facebook](https://www.facebook.com/groups/free.code.camp.isfahan/) | [Gitter](//gitter.im/freecodecamp/Isfahan) |
+| Islamabad | [Facebook](//www.facebook.com/groups/free.code.camp.islamabad/) | [Gitter](//gitter.im/freecodecamp/Islamabad) |
+| Istanbul | [Facebook](//www.facebook.com/groups/free.code.camp.istanbul/) | [Gitter](//gitter.im/freecodecamp/Istanbul) |
+| Ivano Frankivsk | [Facebook](//www.facebook.com/groups/free.code.camp.ivano.frankivsk/) | [Gitter](//gitter.im/freecodecamp/IvanoFrankivsk) |
+| Izmir | [Facebook](https://www.facebook.com/groups/free.code.camp.izmir) | [Gitter](//gitter.im/freecodecamp/Izmir) |
+| Jacarei | [Facebook](https://www.facebook.com/groups/free.code.camp.sao.paulo.jacarei/) | [Gitter](//gitter.im/freecodecamp/Jacarei) |
+| Jackson, MS | [Facebook](https://www.facebook.com/groups/free.code.camp.jackson.ms) | [Gitter](//gitter.im/freecodecamp/JacksonMS) |
+| Jacksonville | [Facebook](//www.facebook.com/groups/free.code.camp.jacksonville/) | [Gitter](//gitter.im/freecodecamp/Jacksonville) |
+| Jaffna | [Facebook](https://www.facebook.com/groups/free.code.camp.jaffna/) | [Gitter](//gitter.im/freecodecamp/Jaffna) |
+| Jaipur | [Facebook](//www.facebook.com/groups/free.code.camp.jaipur/) | [Gitter](//gitter.im/freecodecamp/Jaipur) |
+| Jakarta | [Facebook](//www.facebook.com/groups/free.code.camp.jakarta/) | [Gitter](//gitter.im/freecodecamp/Jakarta) |
+| Jamnagar | [Facebook](https://www.facebook.com/groups/free.code.camp.jamnagar.guj.in/) | [Gitter](//gitter.im/freecodecamp/) |
+| Jerusalem | [Facebook](https://www.facebook.com/groups/free.code.camp.jerusalem/) | [Gitter](//gitter.im/freecodecamp/Jerusalem) |
+| Joao Pessoa | [Facebook](//www.facebook.com/groups/free.code.camp.joao.pessoa/) | [Gitter](//gitter.im/freecodecamp/JoaoPessoa) |
+| Johannesburg | [Facebook](//www.facebook.com/groups/free.code.camp.johannesburg/) | [Gitter](//gitter.im/freecodecamp/Johannesburg) |
+| Johor | [Facebook](//facebook.com/groups/free.code.camp.nusajaya.malaysia/) | [Gitter](//gitter.im/FreeCodeCamp/Nusajaya) |
+| Juarezchi | [Facebook](https://www.facebook.com/groups/free.code.camp.juarezchi/) | [Gitter](//gitter.im/freecodecamp/Juarezchi) |
+| Kaduna | [Facebook](//www.facebook.com/groups/free.code.camp.kaduna/) | [Gitter](//gitter.im/freecodecamp/Kaduna) |
+| Kalamazoo | [Facebook](//www.facebook.com/groups/free.code.camp.kalamazoo/) | [Gitter](//gitter.im/freecodecamp/Kalamazoo) |
+| Kampala | [Facebook](//www.facebook.com/groups/free.code.camp.kampala/) | [Gitter](//gitter.im/freecodecamp/Kampala) |
+| Kansas City | [Facebook](//www.facebook.com/groups/free.code.camp.kansascity/) | [Gitter](//gitter.im/freecodecamp/KansasCity) |
+| Karachi | [Facebook](//www.facebook.com/groups/free.code.camp.karachi/) | [Gitter](//gitter.im/freecodecamp/Karachi) |
+| Kathmandu | [Facebook](//www.facebook.com/groups/free.code.camp.kathmandu/) | [Gitter](//gitter.im/freecodecamp/Kathmandu) |
+| Kemerovo | [Facebook](//www.facebook.com/groups/free.code.camp.kemerovo/) | [Gitter](//gitter.im/freecodecamp/Kemerovo) |
+| Kerch | [Facebook](//www.facebook.com/groups/free.code.camp.kerch/) | [Gitter](//gitter.im/freecodecamp/Kerch) |
+| Kiev | [Facebook](//www.facebook.com/groups/free.code.camp.kiev/) | [Gitter](//gitter.im/freecodecamp/Kiev) |
+| Killeen | [Facebook](https://www.facebook.com/groups/free.code.camp.killeen.texas/) | [Gitter](//gitter.im/freecodecamp/Killeen) |
+| Kingston, ON | [Facebook](//www.facebook.com/groups/free.code.camp.kingston.ontario/) | [Gitter](//gitter.im/freecodecamp/KingstonON) |
+| Knoxville | [Facebook](//www.facebook.com/groups/free.code.camp.knoxville.tn/) | [Gitter](//gitter.im/freecodecamp/Knoxville) |
+| Koeln | [Facebook](//www.facebook.com/groups/free.code.camp.koeln/) | [Gitter](//gitter.im/freecodecamp/Koeln) |
+| Kolkata | [Facebook](//www.facebook.com/groups/free.code.camp.kolkata/) | [Gitter](//gitter.im/freecodecamp/Kolkata) |
+| Kosovo | [Facebook](https://www.facebook.com/groups/free.code.camp.kosovo/) | [Gitter](//gitter.im/freecodecamp/Kosovo) |
+| Kozhikode | [Facebook](https://www.facebook.com/groups/free.code.camp.kozhikode/) | [Gitter](//gitter.im/freecodecamp/Kozhikode) |
+| Krasnodar | [Facebook](//www.facebook.com/groups/free.code.camp.krasnodar/) | [Gitter](//gitter.im/freecodecamp/Krasnodar) |
+| Kryvyi Rih | [Facebook](//www.facebook.com/groups/free.code.camp.kryvyi.rih/) | [Gitter](//gitter.im/freecodecamp/KryvyiRih) |
+| Kuala Lumpur | [Facebook](//www.facebook.com/groups/free.code.camp.malaysia.kl/) | [Gitter](//gitter.im/freecodecamp/KualaLumpur) |
+| La Crosse | [Facebook](//www.facebook.com/groups/free.code.camp.la.crosse) | [Gitter](//gitter.im/freecodecamp/LaCrosse) |
+| La Paz | [Facebook](//www.facebook.com/groups/free.code.camp.La.Paz/) | [Gitter](//gitter.im/freecodecamp/LaPaz) |
+| Lae | [Facebook](https://www.facebook.com/groups/free.code.camp.papua.new.guinea.lae/) | [Gitter](//gitter.im/freecodecamp/Lae) |
+| Lagos | [Facebook](//www.facebook.com/groups/free.code.camp.lagos/) | [Gitter](//gitter.im/freecodecamp/Lagos) |
+| Lahore | [Facebook](//www.facebook.com/groups/free.code.camp.lahore/) | [Gitter](//gitter.im/freecodecamp/Lahore) |
+| Lakeland | [Facebook](https://www.facebook.com/groups/Free.Code.Camp.Lakeland.Florida/) | [Gitter](//gitter.im/freecodecamp/Lakeland) |
+| Las Cruces | [Facebook](//www.facebook.com/groups/free.code.camp.lc.nm/) | [Gitter](//gitter.im/freecodecamp/LasCruces) |
+| Las Vegas | [Facebook](https://www.facebook.com/groups/free.code.camp.las.vegas.nv/) | [Gitter](//gitter.im/freecodecamp/LasVegas) |
+| Lawrence | [Facebook](https://www.facebook.com/groups/free.code.camp.lawrence) | [Gitter](//gitter.im/freecodecamp/Lawrence) |
+| Leesburg | [Facebook](//www.facebook.com/groups/free.code.camp.leesburg/) | [Gitter](//gitter.im/freecodecamp/Leesburg) |
+| Leesville | [Facebook](//www.facebook.com/groups/free.code.camp.leesville.la/) | [Gitter](//gitter.im/freecodecamp/Leesville) |
+| Lehi | [Facebook](//www.facebook.com/groups/free.code.camp.lehi/) | [Gitter](//gitter.im/freecodecamp/Lehi) |
+| Lexington | [Facebook](//www.facebook.com/groups/free.code.camp.lexington/) | [Gitter](//gitter.im/freecodecamp/Lexington) |
+| Lima | [Facebook](//www.facebook.com/groups/Free.Code.Camp.Lima/) | [Gitter](//gitter.im/freecodecamp/Lima) |
+| Limassol | [Facebook](//www.facebook.com/groups/free.code.camp.limassol/) | [Gitter](//gitter.im/freecodecamp/Limassol) |
+| Lindsay | [Facebook](//www.facebook.com/groups/free.code.camp.lindsay/) | [Gitter](//gitter.im/freecodecamp/Lindsay) |
+| Lisbon | [Facebook](//www.facebook.com/groups/free.code.camp.lisbon/) | [Gitter](//gitter.im/freecodecamp/Lisbon) |
+| Little Rock | [Facebook](https://www.facebook.com/groups/free.code.camp.little.rock/) | [Gitter](//gitter.im/freecodecamp/LittleRock) |
+| London | [Facebook](//www.facebook.com/groups/free.code.camp.london/) | [Gitter](//gitter.im/freecodecamp/London) |
+| London, ON | [Facebook](https://www.facebook.com/groups/free.code.camp.london.on/) | [Gitter](//gitter.im/freecodecamp/LondonON) |
+| Los Alamos | [Facebook](//www.facebook.com/groups/free.code.camp.los.alamos.nm/) | [Gitter](//gitter.im/freecodecamp/LosAlamos) |
+| Los Angeles | [Facebook](//www.facebook.com/groups/free.code.camp.los.angeles/) | [Gitter](//gitter.im/freecodecamp/FCCLosAngeles) |
+| Louisville | [Facebook](https://www.facebook.com/groups/free.code.camp.Louisville) | [Gitter](//gitter.im/freecodecamp/Louisville) |
+| Luanda | [Facebook](https://www.facebook.com/groups/free.code.camp.luanda/) | [Gitter](//gitter.im/freecodecamp/Luanda) |
+| Lubbock | [Facebook](//www.facebook.com/groups/free.code.camp.lubbock/) | [Gitter](//gitter.im/freecodecamp/Lubbock) |
+| Lviv | [Facebook](//www.facebook.com/groups/free.code.camp.lviv/) | [Gitter](//gitter.im/freecodecamp/Lviv) |
+| Madison | [Facebook](//www.facebook.com/groups/free.code.camp.madison.wisconsin/) | [Gitter](//gitter.im/freecodecamp/Madison) |
+| Madrid | [Facebook](//www.facebook.com/groups/free.code.camp.madrid/) | [Gitter](//gitter.im/freecodecamp/Madrid) |
+| Manchester, UK | [Facebook](//www.facebook.com/groups/free.code.camp.manchester/) | [Gitter](//gitter.im/freecodecamp/Manchester) |
+| Manila | [Facebook](//www.facebook.com/groups/free.code.camp.manila/) | [Gitter](//gitter.im/freecodecamp/Manila) |
+| Melbourne | [Facebook](//www.facebook.com/groups/free.code.camp.Melbourne/) | [Gitter](//gitter.im/freecodecamp/Melbourne) |
+| Mexico City | [Facebook](//www.facebook.com/groups/free.code.camp.mexico.df/) | [Gitter](//gitter.im/freecodecamp/MexicoCity) |
+| Miami | [Facebook](//www.facebook.com/groups/free.code.camp.miami/) | [Gitter](//gitter.im/freecodecamp/Miami) |
+| Mianwali | [Facebook](https://www.facebook.com/groups/free.code.camp.mianwali/) | [Gitter](//gitter.im/freecodecamp/Mianwali) |
+| Milan | [Facebook](https://www.facebook.com/groups/free.code.camp.milan/) | [Gitter](//gitter.im/freecodecamp/Milan) |
+| Milwaukee | [Facebook](//www.facebook.com/groups/free.code.camp.milwaukee/) | [Gitter](//gitter.im/freecodecamp/Milwaukee) |
+| Minneapolis | [Facebook](//www.facebook.com/groups/free.code.camp.minneapolis/) | [Gitter](//gitter.im/freecodecamp/Minneapolis) |
+| Minsk | [Facebook](//www.facebook.com/groups/free.code.camp.Minsk/) | [Gitter](//gitter.im/freecodecamp/Minsk) |
+| Mississippi Gulf Coast | [Facebook](//www.facebook.com/groups/free.code.camp.msgulfcoast/) | [Gitter](//gitter.im/freecodecamp/MississippiGulfCoast) |
+| Missoula | [Facebook](//www.facebook.com/groups/free.code.camp.missoula/) | [Gitter](//gitter.im/freecodecamp/Missoula) |
+| Modesto | [Facebook](https://www.facebook.com/groups/free.code.camp.modesto/) | [Gitter](//gitter.im/freecodecamp/Modesto) |
+| Monterrey | [Facebook](//www.facebook.com/groups/free.code.camp.monterrey/) | [Gitter](//gitter.im/freecodecamp/Monterrey) |
+| Montevideo | [Facebook](https://www.facebook.com/groups/free.code.camp.montevideo/) | [Gitter](//gitter.im/freecodecamp/Montevideo) |
+| Montgomery | [Facebook](//www.facebook.com/groups/free.code.camp.montgomery.alabama/) | [Gitter](//gitter.im/freecodecamp/Montgomery) |
+| Montreal | [Facebook](//www.facebook.com/groups/free.code.camp.montreal/) | [Gitter](//gitter.im/freecodecamp/Montreal) |
+| Moosejaw | [Facebook](//www.facebook.com/groups/free.code.camp.moosejaw) | [Gitter](//gitter.im/freecodecamp/Moosejaw) |
+| Morgan City | [Facebook](//www.facebook.com/groups/free.code.camp.morgan.ciry.la/) | [Gitter](//gitter.im/freecodecamp/MorganCity) |
+| Moscow | [Facebook](//www.facebook.com/groups/free.code.camp.moscow/) | [Gitter](//gitter.im/freecodecamp/Moscow) |
+| Moss Point | [Facebook](https://www.facebook.com/groups/free.code.camp.moss.point.mississippi/) | [Gitter](//gitter.im/freecodecamp/MossPoint) |
+| Multan | [Facebook](//www.facebook.com/groups/free.code.camp.multan) | [Gitter](//gitter.im/freecodecamp/Multan) |
+| Mumbai | [Facebook](https://www.facebook.com/groups/frre.code.camp.mumbai/) | [Gitter](//gitter.im/freecodecamp/Mumbai) |
+| Munich | [Facebook](//www.facebook.com/groups/free.code.camp.munich/) | [Gitter](//gitter.im/freecodecamp/Munich) |
+| Mysore | [Facebook](//www.facebook.com/groups/free.code.camp.mysore/) | [Gitter](//gitter.im/freecodecamp/Mysore) |
+| Nairobi | [Facebook](//www.facebook.com/groups/free.code.camp.nairobi/) | [Gitter](//gitter.im/freecodecamp/Nairobi) |
+| Napoli | [Facebook](https://www.facebook.com/groups/free.code.camp.napoli) | [Gitter](//gitter.im/freecodecamp/Napoli) |
+| Nashik | [Facebook](//www.facebook.com/groups/free.code.camp.your.nashik/) | [Gitter](//gitter.im/freecodecamp/Nashik) |
+| Nashville | [Facebook](//www.facebook.com/groups/free.code.camp.nashville/) | [Gitter](//gitter.im/freecodecamp/Nashville) |
+| New Brunswick | [Facebook](https://www.facebook.com/groups/free.code.camp.new.brunswick.new.jersey/) | [Gitter](//gitter.im/freecodecamp/NewBrunswick) |
+| New Haven | [Facebook](//www.facebook.com/groups/free.code.camp.new.haven/) | [Gitter](//gitter.im/freecodecamp/NewHaven) |
+| New Orleans | [Facebook](//www.facebook.com/groups/free.code.camp.neworleans/) | [Gitter](//gitter.im/freecodecamp/NewOrleans) |
+| New Paltz | [Facebook](//www.facebook.com/groups/free.code.camp.new.paltz/) | [Gitter](//gitter.im/freecodecamp/NewPaltz) |
+| New Westminster | [Facebook](//www.facebook.com/groups/free.code.camp.new.westminster/) | [Gitter](//gitter.im/freecodecamp/NewWestminster) |
+| New York City | [Facebook](//www.facebook.com/groups/free.code.camp.new.york.city/) | [Gitter](//gitter.im/freecodecamp/NewYorkCity) |
+| Nicosia | [Facebook](//www.facebook.com/groups/free.code.camp.nicosia/) | [Gitter](//gitter.im/freecodecamp/Nicosia) |
+| Noida | [Facebook](//www.facebook.com/groups/free.code.camp.noida/) | [Gitter](//gitter.im/freecodecamp/Noida) |
+| Norfolk | [Facebook](https://www.facebook.com/groups/free.code.camp.norfolk) | [Gitter](//gitter.im/freecodecamp/Norfolk) |
+| Normal | [Facebook](//www.facebook.com/groups/free.code.camp.bloomington.normal/) | [Gitter](//gitter.im/freecodecamp/BloomingtonNormal) |
+| North Mississippi | [Facebook](https://www.facebook.com/groups/free.code.camp.north.mississippi/) | [Gitter](//gitter.im/freecodecamp/NorthMississippi) |
+| North Platte | [Facebook](//www.facebook.com/groups/free.code.camp.north.platte/) | [Gitter](//gitter.im/freecodecamp/NorthPlatte) |
+| Nusajaya | [Facebook](//facebook.com/groups/free.code.camp.nusajaya.malaysia//) | [Gitter](//gitter.im/FreeCodeCamp/Nusajaya) |
+| Oakland | [Facebook](//www.facebook.com/groups/free.code.camp.berkeley/) | [Gitter](//gitter.im/freecodecamp/EastBay) |
+| Oklahoma City | [Facebook](//www.facebook.com/groups/free.code.camp.oklahoma.city/) | [Gitter](//gitter.im/freecodecamp/OklahomaCity) |
+| Olympia | [Facebook](//www.facebook.com/groups/free.code.camp.olympia/) | [Gitter](//gitter.im/FreeCodeCamp/Olympia) |
+| Omaha | [Facebook](//www.facebook.com/groups/free.code.camp.omaha/) | [Gitter](//gitter.im/freecodecamp/Omaha) |
+| Orange County | [Facebook](//www.facebook.com/groups/free.code.camp.orange.county/) | [Gitter](//gitter.im/freecodecamp/OrangeCounty) |
+| Orlando | [Facebook](//www.facebook.com/groups/free.code.camp.orlando/) | [Gitter](//gitter.im/freecodecamp/Orlando) |
+| Ottawa | [Facebook](https://www.facebook.com/groups/free.code.camp.ottawa/) | [Gitter](//gitter.im/freecodecamp/Ottawa) |
+| Panama City | [Facebook](https://www.facebook.com/groups/free.code.camp.panama.city) | [Gitter](//gitter.im/freecodecamp/PanamaCity) |
+| Parana | [Facebook](//www.facebook.com/groups/free.code.camp.your.apucarana.parana/) | [Gitter](//gitter.im/freecodecamp/Parana) |
+| Paris | [Facebook](//www.facebook.com/groups/free.code.camp.paris/) | [Gitter](//gitter.im/freecodecamp/Paris) |
+| Pasadena | [Facebook](//www.facebook.com/groups/free.code.camp.pasadena.ca/) | [Gitter](//gitter.im/freecodecamp/Pasadena) |
+| Pasto | [Facebook](//www.facebook.com/groups/free.code.camp.pasto/) | [Gitter](//gitter.im/freecodecamp/Pasto) |
+| Penang | [Facebook](//www.facebook.com/groups/free.code.camp.penang/) | [Gitter](//gitter.im/freecodecamp/Penang) |
+| Perth | [Facebook](//www.facebook.com/groups/free.code.camp.perth/) | [Gitter](//gitter.im/freecodecamp/Perth) |
+| Perugia | [Facebook](//www.facebook.com/groups/free.code.camp.perugia.it/) | [Gitter](//gitter.im/freecodecamp/Perugia) |
+| Philadelphia | [Facebook](//www.facebook.com/groups/free.code.camp.philadelphia/) | [Gitter](//gitter.im/freecodecamp/Philadelphia) |
+| Phoenix | [Facebook](//www.facebook.com/groups/free.code.camp.tempe.phoenix.scottsdale/) | [Gitter](//gitter.im/freecodecamp/Phoenix) |
+| Pittsburgh | [Facebook](//www.facebook.com/groups/free.code.camp.pittsburgh.pa/) | [Gitter](//gitter.im/freecodecamp/Pittsburgh) |
+| Poitiers | [Facebook](//www.facebook.com/groups/free.code.camp.poitiers/) | [Gitter](//gitter.im/freecodecamp/Poitiers) |
+| Pondicherry | [Facebook](https://www.facebook.com/groups/free.code.camp.pondicherry/) | [Gitter](//gitter.im/freecodecamp/Pondicherry) |
+| Port Harcourt | [Facebook](//www.facebook.com/groups/free.code.camp.port.harcourt/) | [Gitter](//gitter.im/freecodecamp/Harcourt) |
+| Portland | [Facebook](//www.facebook.com/groups/free.code.camp.portland/) | [Gitter](//gitter.im/freecodecamp/Portland) |
+| Porto Alegre | [Facebook](https://www.facebook.com/groups/free.code.camp.porto.alegre.rs/) | [Gitter](//gitter.im/freecodecamp/PortoAlegre) |
+| Porto | [Facebook](//www.facebook.com/groups/free.code.camp.porto/) | [Gitter](//gitter.im/freecodecamp/Porto) |
+| Prague | [Facebook](https://www.facebook.com/groups/free.code.camp.prague/) | [Gitter](//gitter.im/freecodecamp/Prague) |
+| Prescott | [Facebook](//www.facebook.com/groups/free.code.camp.northern.arizona/) | [Gitter](//gitter.im/freecodecamp/NorthernArizona) |
+| Pristina | [Facebook](//www.facebook.com/groups/free.code.camp.pristina/) | [Gitter](//gitter.im/freecodecamp/Pristina) |
+| Providence | [Facebook](//www.facebook.com/groups/free.code.camp.providence/) | [Gitter](//gitter.im/freecodecamp/Providence) |
+| Provo | [Facebook](//www.facebook.com/groups/free.code.camp.provo/) | [Gitter](//gitter.im/freecodecamp/Provo) |
+| Puebla | [Facebook](https://www.facebook.com/groups/free.code.camp.pueblaMX/) | [Gitter](//gitter.im/freecodecamp/Puebla) |
+| Pune | [Facebook](//www.facebook.com/groups/free.code.camp.pune/) | [Gitter](//gitter.im/freecodecamp/Pune) |
+| Quibdo | [Facebook](//www.facebook.com/groups/free.code.camp.quibdo/) | [Gitter](//gitter.im/freecodecamp/Quibdo) |
+| Raleigh | [Facebook](//www.facebook.com/groups/free.code.camp.raleigh/) | [Gitter](//gitter.im/freecodecamp/Raleigh) |
+| Ranchi | [Facebook](//www.facebook.com/groups/free.code.camp.ranchi/) | [Gitter](//gitter.im/freecodecamp/Ranchi) |
+| Reading | [Facebook](https://www.facebook.com/groups/free.code.camp.reading/) | [Gitter](//gitter.im/freecodecamp/Reading) |
+| Recife | [Facebook](//www.facebook.com/groups/free.code.camp.recife) | [Gitter](//gitter.im/freecodecamp/Recife) |
+| Redmond, OR | [Facebook](//www.facebook.com/groups/free.code.camp.remond.oregon/) | [Gitter](//gitter.im/freecodecamp/RedmondOR) |
+| Reno | [Facebook](https://www.facebook.com/groups/free.code.camp.reno/) | [Gitter](//gitter.im/freecodecamp/Reno) |
+| Reykjavik | [Facebook](https://www.facebook.com/groups/free.code.camp.reykjavik/) | [Gitter](//gitter.im/freecodecamp/Reykjavik) |
+| Rice Lake | [Facebook](//www.facebook.com/groups/free.code.camp.rice.lake.wi/) | [Gitter](//gitter.im/freecodecamp/RiceLake) |
+| Richmond | [Facebook](//www.facebook.com/groups/free.code.camp.richmond/) | [Gitter](//gitter.im/freecodecamp/Richmond) |
+| Rio de Janeiro | [Facebook](//www.facebook.com/groups/free.code.camp.rio.de.janeiro/) | [Gitter](//gitter.im/freecodecamp/RiodeJaneiro) |
+| Riverside, CA | [Facebook](https://www.facebook.com/groups/free.code.camp.riverside.ca/) | [Gitter](//gitter.im/freecodecamp/RiversideCA) |
+| Rochester, NY | [Facebook](//www.facebook.com/groups/free.code.camp.Rochester.New.York/) | [Gitter](//gitter.im/freecodecamp/RochesterNY) |
+| Roma | [Facebook](//www.facebook.com/groups/free.code.camp.roma/) | [Gitter](//gitter.im/freecodecamp/Roma) |
+| Rotterdam | [Facebook](//www.facebook.com/groups/free.code.camp.rotterdam/) | [Gitter](//gitter.im/freecodecamp/Rotterdam) |
+| Sacramento | [Facebook](//www.facebook.com/groups/free.code.camp.sacramento/) | [Gitter](//gitter.im/freecodecamp/Sacramento) |
+| Saint George | [Facebook](//www.facebook.com/groups/free.code.camp.saint.george/) | [Gitter](//gitter.im/freecodecamp/SaintGeorge) |
+| Saint Louis | [Facebook](//www.facebook.com/groups/free.code.camp.saint.louis/) | [Gitter](//gitter.im/freecodecamp/SaintLouis) |
+| Saint Paul | [Facebook](//www.facebook.com/groups/free.code.camp.saint.paul.mn/) | [Gitter](//gitter.im/freecodecamp/SaintPaul) |
+| Salamanca | [Facebook](//www.facebook.com/groups/free.code.camp.salamanca/) | [Gitter](//gitter.im/freecodecamp/Salamanca) |
+| Salisbury, MD | [Facebook](https://www.facebook.com/groups/free.code.camp.salisbury.maryland/) | [Gitter](//gitter.im/freecodecamp/SalisburyMD) |
+| Salt Lake City | [Facebook](//www.facebook.com/groups/free.code.camp.salt.lake.city/) | [Gitter](//gitter.im/freecodecamp/SaltLakeCity) |
+| Salvador | [Facebook](//www.facebook.com/groups/free.code.camp.salvador/) | [Gitter](//gitter.im/freecodecamp/Salvador) |
+| San Antonio | [Facebook](https://www.facebook.com/groups/free.code.camp.san.antonio) | [Gitter](//gitter.im/freecodecamp/SanAntonio) |
+| San Bernardino | [Facebook](//www.facebook.com/groups/free.code.camp.san.bernardino/) | [Gitter](//gitter.im/freecodecamp/SanBernardino) |
+| San Diego | [Facebook](//www.facebook.com/groups/free.code.camp.san.diego/) | [Gitter](//gitter.im/freecodecamp/SanDiego) |
+| San Francisco | [Facebook](//www.facebook.com/groups/free.code.camp.san.francisco) | [Gitter](//gitter.im/freecodecamp/SanFrancisco) |
+| San Jose | [Facebook](//www.facebook.com/groups/free.code.camp.san.jose) | [Gitter](//gitter.im/freecodecamp/SanJose) |
+| San Jose, Costa Rica | [Facebook](https://www.facebook.com/groups/free.code.camp.san.jose.costa.rica/) | [Gitter](//gitter.im/freecodecamp/SanJoseCostaRica) |
+| San Juan | [Facebook](//www.facebook.com/groups/free.code.camp.sanjuan.pr/) | [Gitter](//gitter.im/freecodecamp/SanJuan) |
+| Santa Barbara | [Facebook](//www.facebook.com/groups/free.code.camp.santa.barbara/) | [Gitter](//gitter.im/freecodecamp/SantaBarbara) |
+| Santa Cruz | [Facebook](//www.facebook.com/groups/free.code.camp.SC/) | [Gitter](//gitter.im/freecodecamp/SantaCruz) |
+| Santa Luis Obispo | [Facebook](//www.facebook.com/groups/free.code.camp.SLO/) | [Gitter](//gitter.im/freecodecamp/SanLuisObispo) |
+| Santiago | [Facebook](https://www.facebook.com/groups/free.code.camp.santiago/) | [Gitter](//gitter.im/freecodecamp/Santiago) |
+| Santo Domingo | [Facebook](//www.facebook.com/groups/free.code.camp.dr/) | [Gitter](//gitter.im/freecodecamp/SantoDomingo) |
+| Sao Paulo | [Facebook](//www.facebook.com/groups/free.code.camp.sao.paulo/) | [Gitter](//gitter.im/freecodecamp/SaoPaulo) |
+| Savannah | [Facebook](//www.facebook.com/groups/free.code.camp.savannah/) | [Gitter](//gitter.im/freecodecamp/Savannah) |
+| Scottsdale | [Facebook](//www.facebook.com/groups/free.code.camp.tempe.phoenix.scottsdale/) | [Gitter](//gitter.im/freecodecamp/Phoenix) |
+| Seattle | [Facebook](//www.facebook.com/groups/free.code.camp.seattle/) | [Gitter](//gitter.im/freecodecamp/Seattle) |
+| Sedona | [Facebook](//www.facebook.com/groups/free.code.camp.northern.arizona/) | [Gitter](//gitter.im/freecodecamp/NorthernArizona) |
+| Seoul | [Facebook](//www.facebook.com/groups/free.code.camp.seoul/) | [Gitter](//gitter.im/freecodecamp/Seoul) |
+| Shanghai | [Facebook](https://www.facebook.com/groups/free.code.camp.Shanghai/) | [Gitter](//gitter.im/freecodecamp/Shanghai) |
+| Sheffield | [Facebook](//www.facebook.com/groups/free.code.camp.sheffield/) | [Gitter](//gitter.im/freecodecamp/Sheffield) |
+| Shenzhen | [Facebook](https://www.facebook.com/groups/free.code.camp.shenzhen/) | [Gitter](//gitter.im/freecodecamp/Shenzhen) |
+| Sidoarjo | [Facebook](//www.facebook.com/groups/free.code.camp.sidoarjo/) | [Gitter](//gitter.im/freecodecamp/Sidoarjo) |
+| Sierra Vista | [Facebook](//www.facebook.com/groups/free.code.camp.sierra.vista/) | [Gitter](//gitter.im/freecodecamp/SierraVista) |
+| Singapore | [Facebook](//www.facebook.com/groups/free.code.camp.singapore/) | [Gitter](//gitter.im/freecodecamp/Singapore) |
+| Skopje | [Facebook](//www.facebook.com/groups/free.code.camp.skopje/) | [Gitter](//gitter.im/freecodecamp/Skopje) |
+| Solo | [Facebook](//www.facebook.com/groups/free.code.camp.solo/) | [Gitter](//gitter.im/freecodecamp/Solo) |
+| Sopot | [Facebook](//www.facebook.com/groups/free.code.camp.trojmiasto/) | [Gitter](//gitter.im/freecodecamp/Trojmiasto) |
+| South Bend | [Facebook](//www.facebook.com/groups/free.code.camp.south.bend/) | [Gitter](//gitter.im/freecodecamp/SouthBend) |
+| Spartanburg | [Facebook](https://www.facebook.com/groups/free.code.camp.spartanburg/) | [Gitter](//gitter.im/freecodecamp/Spartanburg) |
+| Srinagar | [Facebook](https://www.facebook.com/groups/free.code.camp.srinagar/) | [Gitter](//gitter.im/freecodecamp/Srinagar) |
+| St Cloud | [Facebook](//www.facebook.com/groups/free.code.camp.stcloud/) | [Gitter](//gitter.im/freecodecamp/StCloud) |
+| Stockholm | [Facebook](https://www.facebook.com/groups/free.code.camp.stockholm.sweden/) | [Gitter](//gitter.im/freecodecamp/Stockholm) |
+| Stroke-on-Trent | [Facebook](https://www.facebook.com/groups/free.code.camp.stoke.on.trent/) | [Gitter](//gitter.im/freecodecamp/StrokeOnTrent) |
+| Struga | [Facebook](//www.facebook.com/groups/free.code.camp.struga/) | [Gitter](//gitter.im/freecodecamp/Struga) |
+| Stuttgart | [Facebook](//www.facebook.com/groups/free.code.camp.stuttgart/) | [Gitter](//gitter.im/freecodecamp/Stuttgart) |
+| Surabaya | [Facebook](https://www.facebook.com/groups/free.code.camp.surabaya/) | [Gitter](//gitter.im/freecodecamp/Surabaya) |
+| Surrey | [Facebook](https://www.facebook.com/groups/free.code.camp.surrey/) | [Gitter](//gitter.im/freecodecamp/Surrey) |
+| Sydney | [Facebook](//www.facebook.com/groups/free.code.camp.sydney.au/) | [Gitter](//gitter.im/freecodecamp/Sydney) |
+| Sydney, Nova Scotia | [Facebook](https://www.facebook.com/groups/free.code.camp.sydney.ns/) | [Gitter](//gitter.im/freecodecamp/SydneyNS) |
+| Taipei | [Facebook](//www.facebook.com/groups/free.code.camp.taipei/) | [Gitter](//gitter.im/freecodecamp/Taipei) |
+| Tallahassee | [Facebook](https://www.facebook.com/groups/free.code.camp.tallahassee.florida/) | [Gitter](//gitter.im/freecodecamp/Tallahassee) |
+| Tallinn | [Facebook](https://www.facebook.com/groups/free.code.camp.tallinn/) | [Gitter](//gitter.im/freecodecamp/Tallinn) |
+| Tampa Bay | [Facebook](//www.facebook.com/groups/free.code.camp.tampa/) | [Gitter](//gitter.im/freecodecamp/Tampa) |
+| Tashkent | [Facebook](https://www.facebook.com/groups/free.code.camp.tashkent/) | [Gitter](//gitter.im/freecodecamp/Tashkent) |
+| Tegucigalpa | [Facebook](https://www.facebook.com/groups/free.code.camp.Honduras/) | [Gitter](//gitter.im/freecodecamp/Tegucigalpa) |
+| Tehran | [Facebook](https://www.facebook.com/groups/free.code.camp.tehran/) | [Gitter](//gitter.im/freecodecamp/Tehran) |
+| Tel Aviv | [Facebook](//www.facebook.com/groups/free.code.camp.Tel.Aviv/) | [Gitter](//gitter.im/freecodecamp/TelAviv) |
+| Temecula | [Facebook](//www.facebook.com/groups/free.code.camp.temecula/) | [Gitter](//gitter.im/freecodecamp/Temecula) |
+| Tempe | [Facebook](//www.facebook.com/groups/free.code.camp.tempe.phoenix.scottsdale/) | [Gitter](//gitter.im/freecodecamp/Phoenix) |
+| Thessaloniki | [Facebook](https://www.facebook.com/groups/free.code.camp.thessaloniki/) | [Gitter](//gitter.im/freecodecamp/Thessaloniki) |
+| Ticino | [Facebook](https://www.facebook.com/groups/free.code.camp.ticino/) | [Gitter](//gitter.im/freecodecamp/Ticino) |
+| Tijuana | [Facebook](//www.facebook.com/groups/free.code.camp.tijuana/) | [Gitter](//gitter.im/freecodecamp/Tijuana) |
+| Timisoara | [Facebook](https://www.facebook.com/groups/free.code.camp.timisoara/) | [Gitter](//gitter.im/freecodecamp/Timisoara) |
+| Tirana | [Facebook](//www.facebook.com/groups/free.code.camp.tirana/) | [Gitter](//gitter.im/freecodecamp/Tirana) |
+| Tokyo | [Facebook](https://www.facebook.com/groups/free.code.camp.tokyo/) | [Gitter](//gitter.im/freecodecamp/Tokyo) |
+| Tom's River | [Facebook](https://www.facebook.com/groups/free.code.camp.toms.river/) | [Gitter](//gitter.im/freecodecamp/TomsRiver) |
+| Torino | [Facebook](//www.facebook.com/groups/free.code.camp.torino/) | [Gitter](//gitter.im/freecodecamp/Torino) |
+| Toronto | [Facebook](//www.facebook.com/groups/free.code.camp.to/) | [Gitter](//gitter.im/freecodecamp/Toronto) |
+| Tri-Cities Washington | [Facebook](https://www.facebook.com/groups/free.code.camp.tricitieswa/) | [Gitter](//gitter.im/freecodecamp/TriCitiesWashington) |
+| Trivandrum | [Facebook](https://www.facebook.com/groups/freecodecamp.trivandrum/) | [Gitter](//gitter.im/freecodecamp/Trivandrum) |
+| Tucson | [Facebook](//www.facebook.com/groups/free.code.camp.tucson/) | [Gitter](//gitter.im/freecodecamp/Tucson) |
+| Tulsa | [Facebook](//www.facebook.com/groups/free.code.camp.tulsa/) | [Gitter](//gitter.im/freecodecamp/Tulsa) |
+| Tunis | [Facebook](https://www.facebook.com/groups/free.code.camp.tunisia/) | [Gitter](//gitter.im/freecodecamp/Tunis) |
+| University Center | [Facebook](https://www.facebook.com/groups/free.code.camp.university.center/) | [Gitter](//gitter.im/freecodecamp/UniversityCenter) |
+| Valdosta | [Facebook](https://www.facebook.com/groups/free.code.camp.valdosta/) | [Gitter](//gitter.im/freecodecamp/Valdosta) |
+| Valencia | [Facebook](//www.facebook.com/groups/free.code.camp.vlc/) | [Gitter](//gitter.im/freecodecamp/Valencia) |
+| Vancouver | [Facebook](//www.facebook.com/groups/free.code.camp.vancouver.bc.canada/) | [Gitter](//gitter.im/freecodecamp/Vancouver) |
+| Verde Valley | [Facebook](//www.facebook.com/groups/free.code.camp.northern.arizona/) | [Gitter](//gitter.im/freecodecamp/NorthernArizona) |
+| Victoria | [Facebook](//www.facebook.com/groups/free.code.camp.victoria.bc/) | [Gitter](//gitter.im/freecodecamp/Victoria) |
+| Vilnius | [Facebook](//www.facebook.com/groups/free.code.camp.vilnius.lt/) | [Gitter](//gitter.im/freecodecamp/Vilnius) |
+| Virginia Beach | [Facebook](//www.facebook.com/groups/free.code.camp.virginia.beach/) | [Gitter](//gitter.im/freecodecamp/VirginiaBeach) |
+| Vitória | [Facebook](//www.facebook.com/groups/free.code.camp.vitoria.e.regiao.metropolitana.es/) | [Gitter](//gitter.im/freecodecamp/Vitoria) |
+| Vladivostok | [Facebook](https://www.facebook.com/groups/free.code.camp.vladivostok/) | [Gitter](//gitter.im/freecodecamp/Vladivostok) |
+| Warrington | [Facebook](https://www.facebook.com/groups/free.code.camp.warrington/) | [Gitter](//gitter.im/freecodecamp/Warrington) |
+| Warsaw | [Facebook](https://www.facebook.com/groups/free.code.camp.warsaw/) | [Gitter](//gitter.im/freecodecamp/Warsaw) |
+| Washington, DC | [Facebook](//www.facebook.com/groups/free.code.camp.washington.dc/) | [Gitter](//gitter.im/freecodecamp/WashingtonDC) |
+| Waterford | [Facebook](//www.facebook.com/groups/free.code.camp.waterford/) | [Gitter](//gitter.im/freecodecamp/Waterford) |
+| Wichita | [Facebook](//www.facebook.com/groups/free.code.camp.wichita/) | [Gitter](//gitter.im/freecodecamp/Wichita) |
+| Winnipeg | [Facebook](//www.facebook.com/groups/free.code.camp.winnipeg/) | [Gitter](//gitter.im/freecodecamp/Winnipeg) |
+| Wuerzburg | [Facebook](https://www.facebook.com/groups/free.code.camp.wuerzburg/) | [Gitter](//gitter.im/freecodecamp/Wuerzburg) |
+| Yangon | [Facebook](//www.facebook.com/groups/free.code.camp.myanmar) | [Gitter](//gitter.im/freecodecamp/Yangon) |
+| Yaounde | [Facebook](//www.facebook.com/groups/free.code.camp.yaounde) | [Gitter](//gitter.im/freecodecamp/Yaounde) |
+| Yaroslavl | [Facebook](https://www.facebook.com/groups/free.code.camp.yaroslavl/) | [Gitter](//gitter.im/freecodecamp/Yaroslavl) |
+| Yekaterinburg | [Facebook](//www.facebook.com/groups/free.code.camp.yekaterinburg) | [Gitter](//gitter.im/freecodecamp/Yekaterinburg) |
+| Yerevan | [Facebook](//www.facebook.com/groups/free.code.camp.armenia/) | [Gitter](//gitter.im/freecodecamp/Yerevan) |
+| Zagreb | [Facebook](//www.facebook.com/groups/free.code.camp.zagreb/) | [Gitter](//gitter.im/freecodecamp/Zagreb) |
+| Znojmo | [Facebook](//www.facebook.com/groups/free.code.camp.znojmo/) | [Gitter](//gitter.im/freecodecamp/Znojmo) |
+| Zurich | [Facebook](//www.facebook.com/groups/free.code.camp.zurich/) | [Gitter](//gitter.im/freecodecamp/Zurich) |
+
+If your city isn't listed here, you should [create a Campsite for your city](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-create-a-Campsite-for-your-city).
\ No newline at end of file
diff --git a/data/wiki/More-useful-APIs.md b/data/wiki/More-useful-APIs.md
new file mode 100644
index 0000000..5f33f37
--- /dev/null
+++ b/data/wiki/More-useful-APIs.md
@@ -0,0 +1,31 @@
+There are two more things you have to do before this to be useful to you, however. Say you want to show all the *things* associated with the username requested with that page: you must first  
+ 
+1. Have a “username” or “owner” field in your *thing* schema at **/server/api/thing/thing.model.js**  
+2. Write a custom route in **/server/api/thing/index.js** to catch a request for a specific username. The request from your frontend might look something like:
+
+~~~javascript
+ $http.get('/api/things/' + username).success( … 
+
+~~~
+so you’ll add a line into your **index.js** like:
+
+```javascript
+
+router.get('/:user', controller.indexUser);
+```  
+  and then in **thing.controller.js** you’ll write an *exports.indexUser* function like so:
+
+~~~javascript
+exports.indexUser = function(req, res) {
+	Thing.find({owner:req.params.user}, function (err, things) {
+		if(err) return res.send(500, err);
+		res.json(200, things);
+	});
+};
+~~~
+
+
+Warning!!! this method only works right if usernames are absolutely unique between users. The default authentication system that comes with the angular-fullstack generator does not have unique usernames, so you’re probably better off using the *user._id* field to determine unique users in your database for now, unless you want to implement unique user names yourself by altering your **/api/user/user.model.js**, **/api/user/user.controller.js**, and your **/app/client/account/signup/signup.controller.js**. Thankfully, you should know how to go about doing all that after reading this guide!
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Dynamic-URLs-using-%24routeParams)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Get-info-about-the-current-user)
\ No newline at end of file
diff --git a/data/wiki/Official-Free-Code-Camp-Chat-Rooms.md b/data/wiki/Official-Free-Code-Camp-Chat-Rooms.md
new file mode 100644
index 0000000..adfa954
--- /dev/null
+++ b/data/wiki/Official-Free-Code-Camp-Chat-Rooms.md
@@ -0,0 +1,38 @@
+The following are our official chat rooms.
+
+**Please note that all chat rooms listed here are publicly accessible and indexed by search engines, so only share email addresses or other sensitive information in private messages.**
+
+| Chat Room | Description |
+| --- | --- |
+| [FreeCodeCamp](https://gitter.im/freecodecamp/FreeCodeCamp) | our main chat room - hang out and chat about life and learning to code | 
+| [Help](https://gitter.im/freecodecamp/Help) | get help with our Waypoint challenges from your fellow campers | 
+| [HelpZiplines](https://gitter.im/freecodecamp/HelpZiplines) | get help with our Zipline challenges from your fellow campers | 
+| [HelpBonfires](https://gitter.im/freecodecamp/HelpBonfires) | get help with our Bonfire challenges from your fellow campers | 
+| [HelpBasejumps](https://gitter.im/freecodecamp/HelpBasejumps) | get help with our Basejump challenges from your fellow campers | 
+| [NonprofitProjects](https://gitter.im/freecodecamp/NonprofitProjects) | get help with your Nonprofit Projects from your fellow campers | 
+| [CodingJobs](https://gitter.im/freecodecamp/CodingJobs) | chat about the process of getting a coding job, such as portfolios, networking, and interviewing | 
+| [YouCanDoThis](https://gitter.im/freecodecamp/YouCanDoThis) | learning to code is hard - share your feelings and get moral support here | 
+| [News](https://gitter.im/freecodecamp/News) | chat about stories trending on [Camper News](http://freecodecamp.com/news) | 
+| [LetsPair](https://gitter.im/freecodecamp/LetsPair) | find fellow campers to pair program with using [Screen Hero](/field-guide/how-do-i-install-screenhero) | 
+| [TeamViewer](https://gitter.im/freecodecamp/TeamViewer) | find fellow campers who use Linux and pair program using [Team Viewer](https:https://www.teamviewer.com/en/download/linux.aspx) | 
+| [PairProgrammingWomen](https://gitter.im/freecodecamp/PairProgrammingWomen) | this women-only chat room helps women pair program with other women if they so desire |
+| [40PlusDevs](https://gitter.im/freecodecamp/40PlusDevs) | campers who are over 40+ years old can chat here if they so desire |
+| [LiveCoding](https://gitter.im/freecodecamp/LiveCoding) | chat about streaming webdev and gamedev on [Twitch.tv](https://twitch.tv/freecodecamp) and [LiveCoding.tv](https://www.livecoding.tv/freecodecamp) |
+| [CodeReview](https://gitter.im/freecodecamp/CodeReview) | give and receive constructive feedback from your fellow campers on Bonfires Solutions, Zipline apps and Basejump apps | 
+| [HalfWayClub](https://gitter.im/freecodecamp/HalfWayClub) | this room is only for campers who have finished all the Bonfires, Ziplines and Basejumps |
+| [Beta](https://gitter.im/freecodecamp/Beta) | chat about experimental changes that are live on [beta.freecodecamp.com](http://beta.freecodecamp.com) | 
+| [CurriculumDevelopment](https://gitter.im/FreeCodeCamp/CurriculumDevelopment) | discuss the current and future Curriculum for FreeCodeCamp |
+| [Wiki](https://gitter.im/freecodecamp/Wiki) | propose new articles and coordinate improvements to this wiki | 
+| [Issues](https://gitter.im/freecodecamp/Issues) | this is the place to discuss issues with our open source codebase and coordinate pull requests | 
+| [DataScience](https://gitter.im/freecodecamp/DataScience) | let's measure and improve our community's efficacy by studying Free Code Camp's open data | 
+| [Design](https://gitter.im/freecodecamp/Design) | chat about design theory and practice | 
+| [BookClub](https://gitter.im/freecodecamp/BookClub) | chat about [these free coding books](http://blog.freecodecamp.com/2015/06/25-free-resources-for-new-javascript-developers.html) and more | 
+
+[World Language chat rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/World-Language-Chat-Rooms)
+
+
+[World Language chat rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/World-Language-Chat-Rooms)
+[Casual chat rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/Casual-Chat-Rooms)
+[Campsite chat rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites/)
+
+By joining these chat rooms, you accept our [Code of Conduct](https://github.com/FreeCodeCamp/freecodecamp/wiki/Code-of-Conduct).
\ No newline at end of file
diff --git a/data/wiki/Other-resources-that-Free-Code-Camp-recommends-to-nonprofits.md b/data/wiki/Other-resources-that-Free-Code-Camp-recommends-to-nonprofits.md
new file mode 100644
index 0000000..53bbae9
--- /dev/null
+++ b/data/wiki/Other-resources-that-Free-Code-Camp-recommends-to-nonprofits.md
@@ -0,0 +1,40 @@
+Please note that Free Code Camp is not partnered with, nor do we receive a referral fee from, any of the following providers. We simply want to help guide you towards a solution for your organization.
+
+### Skills-based Volunteer Organizations:
+- [http://www.volunteermatch.com](http://www.volunteermatch.com) 
+- [http://www.catchafire.org](http://www.catchafire.org) 
+
+###Building a website: 
+- [http://www.wix.com/](http://www.wix.com/) 
+- [https://wordpress.com/](https://wordpress.com/) 
+- [Build it yourself for free with no code](http://www.freecodecamp.com/field-guide/how-can-i-deploy-a-website-without-writing-any-code-at-all) 
+
+### Donor and Volunteer Management Systems 
+- [http://causesignal.com](http://causesignal.com) 
+- [https://www.thedatabank.com/](https://www.thedatabank.com/) 
+- [http://www.donorsnap.com/](http://www.donorsnap.com/) 
+- [http://www.donorperfect.com/](http://www.donorperfect.com/) 
+- [https://www.blackbaud.com/fundraising-crm/etapestry-donor-management](https://www.blackbaud.com/fundraising-crm/etapestry-donor-management) 
+- [http://www.z2systems.com](http://www.z2systems.com/) 
+- [http://www.regpacks.com/volunteer-management](http://www.regpacks.com/volunteer-management/) 
+- [http://sumac.com](http://sumac.com/) 
+- [http://www.volgistics.com](http://www.volgistics.com) 
+
+### Inventory Management Systems 
+- [https://www.ezofficeinventory.com/industries/non-profits](https://www.ezofficeinventory.com/industries/non-profits) 
+- [https://www.ordoro.com](https://www.ordoro.com) 
+- [http://www.unleashedsoftware.com](http://www.unleashedsoftware.com) 
+
+### E-Learning platforms 
+- [http://www.dokeos.com](http://www.dokeos.com/) 
+- [http://www.efrontlearning.net/](http://www.efrontlearning.net/) 
+- [https://moodle.org/](https://moodle.org/) 
+- [https://sakaiproject.org/](https://sakaiproject.org/) 
+
+### Community Management 
+- [https://civicrm.org/](https://civicrm.org/) 
+- [http://tcmgr.com/](http://tcmgr.com/) 
+
+### Electronic Forms 
+- [http://www.google.com/forms](http://www.google.com/forms) 
+- [http://www.typeform.com](http://www.typeform.com)
\ No newline at end of file
diff --git a/data/wiki/Pair-programming-and-why-it-is-special.md b/data/wiki/Pair-programming-and-why-it-is-special.md
new file mode 100644
index 0000000..cd457ff
--- /dev/null
+++ b/data/wiki/Pair-programming-and-why-it-is-special.md
@@ -0,0 +1,13 @@
+Pair Programming is an Agile Development practice that was born out of the **Extreme Programming** movement.
+
+Working as a team of [exactly] two, at a single computer, the pair will slide the keyboard and mouse back-and-forth throughout a "pairing session".  This increases the code quality by providing a "greater than the sum of its parts" effect of two developers working on a single problem domain.
+
+The increase in quality of the code, combined with the effect of knowledge and understanding on the project being spread across multiple developers, can produce a large savings in cost on the project as a whole.
+
+In a Test Driven Development (TDD) shop, it is most common for each member of the pair to take turns a) writing a test and b) writing code to pass the test.  This "ping pong" yields a cumulative effect on the overall quality of the final product.
+
+
+To be most effective it is important that pairs are intermixed; not the same couple of developers **always** working together. 
+
+Pair programming is considered to be very "social". It can be akin to a marriage because you learn to cooperate with a peer in a close, give-and-take relationship.  As such it is often very difficult to become comfortable with pair programming.  Some developers simply NEVER feel quite at-home.  In the end, the willingness to share, be a bit vulnerable and work cooperatively toward a better product will make you a far better developer (and a better person overall).
+ 
\ No newline at end of file
diff --git a/data/wiki/Pseudoclassical-class-definition-OOp.md b/data/wiki/Pseudoclassical-class-definition-OOp.md
new file mode 100644
index 0000000..37e2cf5
--- /dev/null
+++ b/data/wiki/Pseudoclassical-class-definition-OOp.md
@@ -0,0 +1,38 @@
+###Overview
+
+Pseudoclassical class definition happens in 2 code blocks instead of one, which happens in other languages like Python and PHP.
+
+The first block is called the "Constructor Function" which is where attributes of the class is declared. These are the aspects of the class that are unique to each new instance. Example with cars is that brand, color, and location can differ. In the second block of code you declare the methods that will be shared by each instance of the class. Examples are things the car can do, drive forward, stop, open door.
+
+### Example
+
+```javascript
+var Car = function(brand, color, location) {
+ this.brand = brand;
+ this.color = color;
+ this.location = location
+};
+
+Car.prototype = {
+ move: function() { this.location++; },
+ stop: function() { this.location = 0; },
+};
+```
+
+###Explanation
+
+The reason for declaring the entire class in 2 blocks is to save on memory when you start creating instances of the class. If the class declaration was "Functional" style then there is a new copy of the method(s) made for **each** instance. By declaring the class "Pseudoclassical" style only a *single* of copy of the methods are stored in memory.
+
+When a instance of the class attempt to access a method:
+
+```javascript
+var x_car = new Car('lexus', 'white', 0);
+x_car.move();
+```
+
+The interpreter will actually *first* fail to find the called method in the object itself since it was made from the Car constructor function. As you can see above there is no reference to any of the methods in the Car constructor function. From there the interpreter searches to the `Car.prototype` which is now shared between all instances. There the interpreter find the method that was called!
+
+####Further reading: 
+[Natac's Blog](https://natacseanc.wordpress.com/2015/08/04/javascript-object-create-and-classes/)
+
+[MDN Classes](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript)
\ No newline at end of file
diff --git a/data/wiki/Pull-Request-Contribute.md b/data/wiki/Pull-Request-Contribute.md
new file mode 100644
index 0000000..b06df3b
--- /dev/null
+++ b/data/wiki/Pull-Request-Contribute.md
@@ -0,0 +1,22 @@
+> A (PR)pull request is a method of submitting contributions to an open source project. It is often the preferred way of submitting contributions to a project using a Distributed Version Control System (DVCS) such as Git.
+
+FreeCodeCamp is an Open Source project and all of the contents are freely editable.
+
+- [Fork](https://help.github.com/articles/fork-a-repo/) the project on GitHub.
+- [Clone](https://help.github.com/articles/cloning-a-repository/) it to a local machine.  Do not edit online in github.com, as the editor may cause issues with JSON formatted data.
+- [Create a branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/) and make your changes in that branch and commit them.
+- [Push](https://help.github.com/articles/pushing-to-a-remote/) the branch online (if editing locally).
+- [Create a pull request](https://help.github.com/articles/creating-a-pull-request/) against the **"staging"** branch.
+- The title (also called the subject) of your PR should be descriptive of your changes. i.e. `fix typo in basic-javascript challenge` 
+- If the PR is meant to fix a specific issue, append to the end of your PR's commit message `closes #1337`. This tells GitHub to close that issue if the PR is merged.
+- Do NOT add issue numbers to the title.
+
+These are general guidelines for PR's that work across most projects. It gives everyone a quick guide to your changes when looking at the commit history of a project. 
+
+*Note:  Not all pull requests are accepted. FCC project maintainers will explain the reason of non-acceptance.*
+
+## Further Reading
+* [GitHub & Git Foundations Training](https://www.youtube.com/playlist?list=PLg7s6cbtAD15G8lNyoaYDuKZSKyJrgwB-) - How to use Git and GitHub
+* [FreeCodeCamp Contribution Guidelines](https://github.com/FreeCodeCamp/FreeCodeCamp#contributing)
+* [How to write Git commit messages](http://chris.beams.io/posts/git-commit/)
+* [How to Clone FCC to a Windows PC](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-to-clone-the-FreeCodeCamp-website-on-a-Windows-pc)
\ No newline at end of file
diff --git a/data/wiki/Quick-tip-keep-data-in-sync.md b/data/wiki/Quick-tip-keep-data-in-sync.md
new file mode 100644
index 0000000..1e930f7
--- /dev/null
+++ b/data/wiki/Quick-tip-keep-data-in-sync.md
@@ -0,0 +1,27 @@
+Say you want something to show up on the user view when you add it to the database. A new *thing* object will instantly show up in an *ng-repeat* loop in your HTML view if you simply add it to your local array with  
+
+~~~javascript
+
+$scope.awesomeThings.push(newThing);
+~~~
+
+But you’ll still need to add it to your database collection. Add it to your collection with  
+
+~~~javascript
+
+$http.post('/api/things', newThing);	
+
+~~~
+But wait! You’ll soon realize that while all the other things in your *$scope.awesomeThings* array have unique ids assigned by MongoDB (under the *thing.\_id* property), your *newThing* object will not, which will make it hard for you at some point to make database actions on it (deleting it from your database requires you to use its *._id* property). So what you’ll want to do after you add it to your *$scope.awesomeThings* array (because we want it to show up on the user’s page immediately). Altogether, your code to add a newThing to your local array and database will look like:
+
+~~~javascript
+$scope.awesomeThings.push(newThing);
+$http.post('/api/things', newThing).success(function(thatThingWeJustAdded) {
+	$scope.awesomeThings.pop(); // let's lose that id-lacking newThing 
+	$scope.awesomeThings.push(thatThingWeJustAdded); // and add the id-having newThing!
+};
+~~~
+This updates the local array for seemingly instant results for your user and then syncs it to your database and updates the local array in the background with the database’s version of your *newThing* object, unique *._id* and all. Notice the callback we pass to the *success* function receives the new *thing* back from the database as an argument! This way you can easily add it back to your local scope without too much overhead.
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Seed-data)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Dynamic-URLs-using-$routeParams)
\ No newline at end of file
diff --git a/data/wiki/RTFM.md b/data/wiki/RTFM.md
new file mode 100644
index 0000000..3664618
--- /dev/null
+++ b/data/wiki/RTFM.md
@@ -0,0 +1,11 @@
+> RTFM is an initialism for the expression "Read The F**king Manual"
+
+![RTFM Comic](http://i.imgur.com/UxbHkrB.png)
+
+## Urban Dictionary
+
+> "Read The F**king Manual" — a term showing the frustration of being bothered with questions so trivial that the asker could have quickly figured out the answer on their own with minimal effort, usually by reading readily-available documents. People who say "RTFM!" might be considered rude, but the true rude ones are the annoying people who take absolutely no self-responsibility and expect to have all the answers handed to them personally.
+
+*"Damn, that's the twelveth time that somebody posted this question to the message board today! RTFM, already!"*
+
+https://www.youtube.com/watch?v=Bumx4AerJUQ
\ No newline at end of file
diff --git a/data/wiki/Refresh-Your-Browser-Cache.md b/data/wiki/Refresh-Your-Browser-Cache.md
new file mode 100644
index 0000000..9fdfbca
--- /dev/null
+++ b/data/wiki/Refresh-Your-Browser-Cache.md
@@ -0,0 +1,10 @@
+You may have to do a "hard refresh" of a page in your browser if you have an out of date, cached version of that website.
+
+While on the problematic site use the key combination below to trigger a hard refresh depending on your operating system:
+* Windows: CTRL + F5
+* Mac/Apple: Apple + R or command + R
+* Linux: F5
+
+To learn more about this read: http://refreshyourcache.com/en/cache/
+
+If a hard refresh doesn't work, try opening the problematic page in your browser's private browsing mode.
\ No newline at end of file
diff --git a/data/wiki/Restrict-a-page-to-authenticated-users.md b/data/wiki/Restrict-a-page-to-authenticated-users.md
new file mode 100644
index 0000000..2608f63
--- /dev/null
+++ b/data/wiki/Restrict-a-page-to-authenticated-users.md
@@ -0,0 +1,15 @@
+Let's say you have a route that you want to restrict to logged-in users; maybe you have a <a href="#">/profile</a> page that lets your users fill in some information about themselves, but it wouldn't work if they weren't logged in. Open **/client/app/profile/profile.js**, and add `authenticate: true` to the options passed to *$routeProvider.when* like so:
+
+~~~javascript 
+    $routeProvider
+      .when('/profile', {
+        templateUrl: 'app/profile/profile.html',
+        controller: 'ProfileCtrl',
+        authenticate: true // restrict to authenticated users
+      });
+~~~
+
+This way, if the user isn't authenticated when they try to access the <A href="#">/profile</a> page, they'll be redirected to your login screen to authenticate before continuing to their profile page.
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Get-info-about-the-current-user)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/isLoggedInAsync())
\ No newline at end of file
diff --git a/data/wiki/Searching-for-Your-Issue-on-Github.md b/data/wiki/Searching-for-Your-Issue-on-Github.md
new file mode 100644
index 0000000..0965ab7
--- /dev/null
+++ b/data/wiki/Searching-for-Your-Issue-on-Github.md
@@ -0,0 +1,9 @@
+If you still see problems after [Getting Help on Gitter](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-to-Get-Help-on-Gitter), you will want to try to see if anyone else has posted about a similar problem.
+
+![gif walking through the subsequent steps to search GitHub for the issue](http://i.imgur.com/MdrSdQW.gif)
+
+1. Go to FreeCodeCamp's [Github Issues](https://github.com/FreeCodeCamp/FreeCodeCamp/issues) page.
+
+2. Use the search bar to search for already filed issues that may be related to your problem.
+ * If you find one, read it! You can subscribe to get updates about that specific issue by clicking on `Subscribe` in the sidebar.  You can also comment on the issue if you have something to add.
+ * If you cannot find any relevant issues you should [Create a New Github Issue](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-New-Github-Issue).
\ No newline at end of file
diff --git a/data/wiki/Seed-data.md b/data/wiki/Seed-data.md
new file mode 100644
index 0000000..dedb17e
--- /dev/null
+++ b/data/wiki/Seed-data.md
@@ -0,0 +1,6 @@
+The *things* that show up on your app's main view are part of some seed data that is added to your database (including your test and admin users) every time you restart your app (by running `grunt serve` in the command line). This data is defined in **/server/config/seed.js**.  
+
+You can add, remove, or change data in this file, and it will be written to your database, overwriting any duplicates the next time you run `grunt serve`. If an object defined in **seed.js** is overwritten, the database will assign a new *.\_id* property to it (we'll cover *.\_id* properties in the next section), which may give you some issues later on in testing. To avoid this, you can turn off seeding by setting `seedDB: false` in **/server/config/environment/development.js**.
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Accessing-the-database-from-your-frontend)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Quick-tip:-keep-data-in-sync)
\ No newline at end of file
diff --git a/data/wiki/Slack.md b/data/wiki/Slack.md
new file mode 100644
index 0000000..ab84076
--- /dev/null
+++ b/data/wiki/Slack.md
@@ -0,0 +1,9 @@
+### Slack is a popular chatroom service that Free Code Camp outgrew
+
+![Free Code Camp's Slack usage stats](https://www.evernote.com/l/AHRvSgBsEqZMBqugb3gWNG9jSKhPT8Dj5FAB/image.png)
+
+As much as we enjoyed using this service, it is a poor fit for large open source communities. This said, many open source communities still use Slack, and Slack does nothing to discourage this practice.
+
+If you're curious, you can read about [Slack's false advertising and the debacle this caused in June 2015](http://blog.freecodecamp.com/2015/06/so-yeah-we-tried-slack-and-we-deeply-regretted-it.html).
+
+Free Code Camp now uses [Gitter](https://github.com/FreeCodeCamp/freecodecamp/wiki/Gitter).
\ No newline at end of file
diff --git a/data/wiki/Spanish-Translation-Terminology.md b/data/wiki/Spanish-Translation-Terminology.md
new file mode 100644
index 0000000..ae9257d
--- /dev/null
+++ b/data/wiki/Spanish-Translation-Terminology.md
@@ -0,0 +1,59 @@
+#Spanish terminology alignment
+
+Para evitar confusión para otros Campers necesitamos alinearnos todos los traductores con la misma terminología. Para ello, hemos creado una lista con las palabras más comúnes y las traducciones que hemos estado utilizando hasta ahora.
+
+Vale recalcar que todos los términos están abiertos a discusión. En caso se tenga que hacer algún cambio, nos pueden enviar un mensaje directo a través de Slack a @miya o @eabedrapo.
+
+##FCC terminology
+
+###Untranslated
+* Free Code Camp
+* Waypoint
+* Bonfire
+* Zipline
+* Basejump
+* Top menu buttons.
+* Camper
+* Full Stack
+* Bug
+
+
+##CS terminology
+
+###Untranslated
+* Hardware
+* Software
+* Bit
+* Byte
+* Front-end
+* Link
+* Framework
+* Query
+
+###Translated
+* Boolean Logic: Lógica Booleana
+* Loop: Búcle
+* Computer Science: Informática
+* Run (a program): Ejecutar
+* Click: Darle click
+* Responsive: Adaptable
+
+##General terminology
+
+###Translated
+* Non-profit: Empresas sin fines de lucro
+* Self-paced: Manejados a tu propio ritmo
+
+##HTML / CSS terminology
+
+###Non-Traslated
+* Web
+* Tests & challengeSeeds (they shouldn't be translated, at least for this first version).
+
+
+####To do
+Video para mostrar a otras personas como colaborar con la traducción y revisión de los archivos.
+
+####To discuss
+Género a usar? ejem: "Una de las mejores maneras de mantenerte **motivado** cuando estás aprendiendo..."
+* "motivado o motivada" (ambos?)
\ No newline at end of file
diff --git a/data/wiki/Streaks.md b/data/wiki/Streaks.md
new file mode 100644
index 0000000..e4ad4ca
--- /dev/null
+++ b/data/wiki/Streaks.md
@@ -0,0 +1,5 @@
+Your user profile displays your recent activity. If you get [Brownie Points](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Brownie-Points/) on several consecutive days, you will start a streak.
+
+![A picture of a camper's streak readout showing a 21-day streak](https://www.evernote.com/l/AlyDvfhZplROUZxyMN8dIGGd-DQT7Bn8S9oB/image.png)
+
+This shows everyone that you are highly active in our community, and that you code a lot. When you're learning to code, it's important that you [code at least some everyday](http://www.quora.com/How-does-one-become-a-great-coder/answer/Quincy-Larson).
\ No newline at end of file
diff --git a/data/wiki/The-main-advantages-of-Free-Code-Camp.md b/data/wiki/The-main-advantages-of-Free-Code-Camp.md
new file mode 100644
index 0000000..606e865
--- /dev/null
+++ b/data/wiki/The-main-advantages-of-Free-Code-Camp.md
@@ -0,0 +1,7 @@
+Free Code Camp's main advantages are that we're accessible to busy adults who want to change careers. 
+
+Specifically, we're:
+
+- Free
+- Self-paced
+- Browser-based
\ No newline at end of file
diff --git a/data/wiki/Tips-on-How-To-Become-A-Good-Pair-Programmer.md b/data/wiki/Tips-on-How-To-Become-A-Good-Pair-Programmer.md
new file mode 100644
index 0000000..969b462
--- /dev/null
+++ b/data/wiki/Tips-on-How-To-Become-A-Good-Pair-Programmer.md
@@ -0,0 +1,12 @@
+Pair programming is a great way to learn programming! [Read why.](https://github.com/FreeCodeCamp/freecodecamp/wiki/Why-You-Should-Try-Pair-Programming)
+
+1. **Communicate well with your partner.** Voice chat will make communication easy, let you focus on learning, and will allow you to use your time effectively.
+
+2. **Before you start coding:** decide together with your partner how your workflow should look so that both you and your partner can benefit from the time spent coding. An example of a good workflow:
+    - Read through and discuss the problem to make sure you understand it.
+    - Solve the problem with pseudo-code by identifying the steps you need to take in order to get from the given inputs to the expected result.
+    - Create your actual solution
+
+3. **When explaining things:** Ask questions to guide your partner's thoughts instead of just showing the answer right away. This will let him or her think about the problem and make it easier for them to learn.
+
+4. **Finally**, be *open to your partner's ideas*, *respect each other* and **have fun! :)**
\ No newline at end of file
diff --git a/data/wiki/Trying-to-understand-the-solution-for-FCCs-sorted-union-using-callback-function.md b/data/wiki/Trying-to-understand-the-solution-for-FCCs-sorted-union-using-callback-function.md
new file mode 100644
index 0000000..107ccef
--- /dev/null
+++ b/data/wiki/Trying-to-understand-the-solution-for-FCCs-sorted-union-using-callback-function.md
@@ -0,0 +1,24 @@
+Hopefully the following post is appropriate for this forum...
+
+      function unite(arr1, arr2, arr3) {
+        var merge = function(coll,item) {
+          if (coll.indexOf(item) < 0)
+            coll.push(item);
+          return coll;
+        };
+        //TODO this can be simplified
+        arr1 = arr2.reduce(merge, arr1);
+        arr1 = arr3.reduce(merge, arr1);
+        return arr1;
+      }
+      unite([1, 2, 3], [5, 2, 1, 4], [2, 1]);
+
+I've already submitted an answer for "Sorted Union" but it was without using "reduce", which uses a "callback function". The answer that I've found, shown above uses it.  
+
+I've spent several hours so far trying to understand where "merge" gets its arguments. I understand from reduce's prototype that its first argument is a callback function (which is merge in this case), and I get what a callback function is. And the callback function's arguments are supposedly: (previousValue, currentValue, index, array) when being called by "reduce", which steps, one-by-one, through the arrays somehow using merge. Maybe "item" matches up with being currentValue, but that's it.  
+
+I don't know where someone's supposed to learn this type of programming because there are no examples like it in "prototypes" and "callback functions" where arguments required seem to change depending on context.  
+
+I would greatly appreciate someone explaining the above example to me or at least where the heck I would learn to do what's apparently been done in this example.  
+
+**chris dot r dot lafave at gmail dot com**
diff --git a/data/wiki/Waypoint Access Array Data with Indexes.md b/data/wiki/Waypoint Access Array Data with Indexes.md
new file mode 100644
index 0000000..36a3d40
--- /dev/null
+++ b/data/wiki/Waypoint Access Array Data with Indexes.md	
@@ -0,0 +1,12 @@
+# Access Array Data with Indexes
+We can access the data inside arrays using indexes.
+
+Array indexes are written in the same bracket notation that strings use, except that instead of specifying a character, they are specifying an entry in the array.
+
+For example:
+
+```
+var array = [1,2,3];
+array[0]; //equals 1
+var data = array[1];
+```
diff --git a/data/wiki/Waypoint Add Elements within your Bootstrap Wells.md b/data/wiki/Waypoint Add Elements within your Bootstrap Wells.md
new file mode 100644
index 0000000..fe97df1
--- /dev/null
+++ b/data/wiki/Waypoint Add Elements within your Bootstrap Wells.md	
@@ -0,0 +1,2 @@
+# Add Elements within your Bootstrap Wells
+Once you have gone deep enough in `divs` you can start adding your Bootstrap buttons.
diff --git a/data/wiki/Waypoint Add Font Awesome Icons to all of our Buttons.md b/data/wiki/Waypoint Add Font Awesome Icons to all of our Buttons.md
new file mode 100644
index 0000000..af9d1db
--- /dev/null
+++ b/data/wiki/Waypoint Add Font Awesome Icons to all of our Buttons.md	
@@ -0,0 +1,4 @@
+# Add Font Awesome Icons to all of our Buttons
+`<i class="fa fa-trash"></i>` Will add a trash can icon.
+
+`<i class="fa fa-info-circle"></i>` Will add an info icon.
diff --git a/data/wiki/Waypoint Add Font Awesome Icons to our Buttons.md b/data/wiki/Waypoint Add Font Awesome Icons to our Buttons.md
new file mode 100644
index 0000000..b544309
--- /dev/null
+++ b/data/wiki/Waypoint Add Font Awesome Icons to our Buttons.md	
@@ -0,0 +1,4 @@
+# Add Font Awesome Icons to our Buttons
+Font Awesome is a convenient library of icons. These icons are vector graphics, stored in the .svg file format. These icons are treated just like fonts. You can specify their size using pixels, and they will assume the font size of their parent HTML elements.
+
+`<i class="fa fa-thumbs-up"><button class="btn btn-block btn-primary">Like</i></button>`
diff --git a/data/wiki/Waypoint Add ID Attributes to Bootstrap Elements.md b/data/wiki/Waypoint Add ID Attributes to Bootstrap Elements.md
new file mode 100644
index 0000000..9b332af
--- /dev/null
+++ b/data/wiki/Waypoint Add ID Attributes to Bootstrap Elements.md	
@@ -0,0 +1,4 @@
+# Add ID Attributes to Bootstrap Elements
+Recall that in addition to class attributes, you can give each of your elements an id attribute.
+
+Each id should be unique to a specific element. Remember that you can give an element an id like this: `<div class="well" id="center-well">`
diff --git a/data/wiki/Waypoint Add Two Numbers with JavaScript.md b/data/wiki/Waypoint Add Two Numbers with JavaScript.md
new file mode 100644
index 0000000..3c6f938
--- /dev/null
+++ b/data/wiki/Waypoint Add Two Numbers with JavaScript.md	
@@ -0,0 +1,4 @@
+# Add Two Numbers with JavaScript
+JavaScript uses the `+` symbol for addition. It can also be used instead of `parseInt()` but that is beyond this.
+
+`var sum = 10 + 10;`
diff --git a/data/wiki/Waypoint Add your JavaScript Slot Machine Slots.md b/data/wiki/Waypoint Add your JavaScript Slot Machine Slots.md
new file mode 100644
index 0000000..4415212
--- /dev/null
+++ b/data/wiki/Waypoint Add your JavaScript Slot Machine Slots.md	
@@ -0,0 +1,10 @@
+# Add your JavaScript Slot Machine Slots
+For this part we should notify if they same number is returned three times or return `null` otherwise.
+
+```
+if(slotOne !== slotTwo || slotTwo !== slotThree){
+      return (null);
+    }
+```
+
+If slot one and to are different, or slot two and three are not the same, then return `null`.
diff --git a/data/wiki/Waypoint Apply the Default Bootstrap Button Style.md b/data/wiki/Waypoint Apply the Default Bootstrap Button Style.md
new file mode 100644
index 0000000..79f9072
--- /dev/null
+++ b/data/wiki/Waypoint Apply the Default Bootstrap Button Style.md	
@@ -0,0 +1,23 @@
+# Apply the Default Bootstrap Button Style
+Bootstrap has a button class called `btn-default`
+
+```
+<div class="container-fluid">
+  <h3 class="text-primary text-center">jQuery Playground</h3>
+  <div class="row">
+    <div class="col-xs-6">
+      <div class="well">
+        <button class="btn btn-default"></button>
+        <button class="btn btn-default"></button>
+        <button class="btn btn-default"></button>
+      </div>
+    </div>
+    <div class="col-xs-6">
+      <div class="well">
+        <button class="btn btn-default"></button>
+        <button class="btn btn-default"></button>
+        <button class="btn btn-default"></button>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/data/wiki/Waypoint Bring your JavaScript Slot Machine to Life.md b/data/wiki/Waypoint Bring your JavaScript Slot Machine to Life.md
new file mode 100644
index 0000000..0cbb08e
--- /dev/null
+++ b/data/wiki/Waypoint Bring your JavaScript Slot Machine to Life.md	
@@ -0,0 +1,10 @@
+# Bring your JavaScript Slot Machine to Life
+Let's use the jQuery selector `$(".slot")` to select all of the slots.
+
+Once they are all selected, we can use bracket notation to access each individual slot:
+
+```
+$($(".slot")[0]).html(slotOne);
+$($(".slot")[1]).html(slotTwo);
+$($(".slot")[2]).html(slotThree);
+```
diff --git a/data/wiki/Waypoint Build JavaScript Objects.md b/data/wiki/Waypoint Build JavaScript Objects.md
new file mode 100644
index 0000000..27bf627
--- /dev/null
+++ b/data/wiki/Waypoint Build JavaScript Objects.md	
@@ -0,0 +1,15 @@
+# Build JavaScript Objects
+Objects are similar to arrays, except that instead of using indexes to access and modify their data, you access the data in objects through what are called properties.
+
+Here's a sample object:
+
+```
+var cat = {
+ "name": "Whiskers",
+ "legs": 4,
+ "tails": 1,
+ "enemies": ["Water", "Dogs"]
+};
+```
+
+Objects are useful for storing data in a structured way, and can represents real world objects, like a cats.
diff --git a/data/wiki/Waypoint Call out Optional Actions with Button Info.md b/data/wiki/Waypoint Call out Optional Actions with Button Info.md
new file mode 100644
index 0000000..292641d
--- /dev/null
+++ b/data/wiki/Waypoint Call out Optional Actions with Button Info.md	
@@ -0,0 +1,4 @@
+# Call out Optional Actions with Button Info
+Bootstrap comes with several pre-defined colors for buttons. The `btn-info` class is used to call attention to optional actions that the user can take. Note that these buttons still need the `btn` and`btn-block` classes.
+
+`<button class= "btn btn-block btn-info">Info</button>`
diff --git a/data/wiki/Waypoint Center Text with Bootstrap.md b/data/wiki/Waypoint Center Text with Bootstrap.md
new file mode 100644
index 0000000..c7683d6
--- /dev/null
+++ b/data/wiki/Waypoint Center Text with Bootstrap.md	
@@ -0,0 +1,4 @@
+# Center Text with Bootstrap
+Now that we're using Bootstrap, we can center our heading elements to make them look better. All we need to do is add the class text-center to our h1 and h2 elements.
+
+Remember that you can add several classes to the same element by separating each of them with a space, like this: `<h2 class="text-red text-center">your text</h2>`.
diff --git a/data/wiki/Waypoint Change the CSS of an Element Using jQuery.md b/data/wiki/Waypoint Change the CSS of an Element Using jQuery.md
new file mode 100644
index 0000000..4adb4fd
--- /dev/null
+++ b/data/wiki/Waypoint Change the CSS of an Element Using jQuery.md	
@@ -0,0 +1,13 @@
+# Change the CSS of an Element Using jQuery
+We can also change the CSS of an HTML element directly with jQuery.
+
+Query has a function called `.css()` that allows you to change the CSS of an element.
+
+```
+<script>
+  $(document).ready(function() {
+    $("#target1").css("color", "red");
+
+  });
+</script>
+```
diff --git a/data/wiki/Waypoint Check the Length Property of a String Variable.md b/data/wiki/Waypoint Check the Length Property of a String Variable.md
new file mode 100644
index 0000000..922c2bc
--- /dev/null
+++ b/data/wiki/Waypoint Check the Length Property of a String Variable.md	
@@ -0,0 +1,4 @@
+# Check the Length Property of a String Variable
+Data structures have properties. For example, strings have a property called `.length` that will tell you how many characters are in the string.
+
+`lastNameLength = lastName.length;`
diff --git a/data/wiki/Waypoint Clone an Element Using jQuery.md b/data/wiki/Waypoint Clone an Element Using jQuery.md
new file mode 100644
index 0000000..3cc267c
--- /dev/null
+++ b/data/wiki/Waypoint Clone an Element Using jQuery.md	
@@ -0,0 +1,4 @@
+# Clone an Element Using jQuery
+jQuery has a function called`clone()` that makes a copy of an element.
+
+For example, if we wanted to copy target2 from our left-well to our right-well, we would use `$("#target2").clone().appendTo("#right-well");`
diff --git a/data/wiki/Waypoint Comment your JavaScript Code.md b/data/wiki/Waypoint Comment your JavaScript Code.md
new file mode 100644
index 0000000..66a4ddb
--- /dev/null
+++ b/data/wiki/Waypoint Comment your JavaScript Code.md	
@@ -0,0 +1,10 @@
+# Comment your JavaScript Code
+Comments are a great way to leave notes to yourself and to other people who will later need to figure out what it does. Any code in it will be ignored.
+
+Let's take a look at the two ways you can write comments in JavaScript.
+- The double-slash comment will comment out the remainder of the text on the current line:
+
+`// This is a comment.`
+- The slash-star-star-slash comment will comment out everything between the `/*` and the `*/` characters:
+
+`/* This is also a comment */`
diff --git a/data/wiki/Waypoint Create Bootstrap Wells.md b/data/wiki/Waypoint Create Bootstrap Wells.md
new file mode 100644
index 0000000..5538b97
--- /dev/null
+++ b/data/wiki/Waypoint Create Bootstrap Wells.md	
@@ -0,0 +1,26 @@
+# Create Bootstrap Wells
+Bootstrap has a class called `well` that can create a visual sense of depth for your columns.
+
+Nest one div element with the class well within each of your `col-xs-6 div` elements.
+
+```
+<div class="container-fluid">
+  <h3 class="text-primary text-center">jQuery Playground</h3>
+  <div class="row">
+    <div class="col-xs-6">
+      <div class="well">
+
+
+
+      </div>
+    </div>
+    <div class="col-xs-6">
+      <div class="well">
+
+
+
+      </div>
+    </div>
+  </div>
+</div>
+```
diff --git a/data/wiki/Waypoint Create Decimal Numbers with JavaScript.md b/data/wiki/Waypoint Create Decimal Numbers with JavaScript.md
new file mode 100644
index 0000000..9567d1f
--- /dev/null
+++ b/data/wiki/Waypoint Create Decimal Numbers with JavaScript.md	
@@ -0,0 +1,2 @@
+# Create Decimal Numbers with JavaScript
+JavaScript number variables can have decimals. `var myDecimal = 2.8;`
diff --git a/data/wiki/Waypoint Create a Block Element Bootstrap Button.md b/data/wiki/Waypoint Create a Block Element Bootstrap Button.md
new file mode 100644
index 0000000..ec74f3c
--- /dev/null
+++ b/data/wiki/Waypoint Create a Block Element Bootstrap Button.md	
@@ -0,0 +1,4 @@
+# Create a Block Element Bootstrap Button
+Normally, your button elements are only as wide as the text that they contain. By making them block elements, your button will stretch to fill your page's entire horizontal space. Note that these buttons still need the `btn` class.
+
+`<button class="btn btn-block">Like</button>`
diff --git a/data/wiki/Waypoint Create a Bootstrap Button.md b/data/wiki/Waypoint Create a Bootstrap Button.md
new file mode 100644
index 0000000..c46a1cb
--- /dev/null
+++ b/data/wiki/Waypoint Create a Bootstrap Button.md	
@@ -0,0 +1,4 @@
+# Create a Bootstrap Button
+Bootstrap has its own styles for button elements, which look much better than the plain HTML ones.
+
+`<button type="submit" class="btn">Like</button>`
diff --git a/data/wiki/Waypoint Create a Bootstrap Headline.md b/data/wiki/Waypoint Create a Bootstrap Headline.md
new file mode 100644
index 0000000..9f9f518
--- /dev/null
+++ b/data/wiki/Waypoint Create a Bootstrap Headline.md	
@@ -0,0 +1,2 @@
+# Create a Bootstrap Headline
+`<h3 class="text-primary text-center"> jQuery Playground </h3>`
diff --git a/data/wiki/Waypoint Create a Bootstrap Row.md b/data/wiki/Waypoint Create a Bootstrap Row.md
new file mode 100644
index 0000000..ea17b35
--- /dev/null
+++ b/data/wiki/Waypoint Create a Bootstrap Row.md	
@@ -0,0 +1,2 @@
+# Create a Bootstrap Row
+Create a div element with the class row. `<div class="row"></div>`
diff --git a/data/wiki/Waypoint Create a Class to Target with jQuery Selectors.md b/data/wiki/Waypoint Create a Class to Target with jQuery Selectors.md
new file mode 100644
index 0000000..461fe66
--- /dev/null
+++ b/data/wiki/Waypoint Create a Class to Target with jQuery Selectors.md	
@@ -0,0 +1,4 @@
+# Create a Class to Target with jQuery Selectors
+Not every class needs to have corresponding CSS. Sometimes we create classes just for the purpose of selecting these elements more easily using jQuery.
+
+For this we use the `target` class on the `button` elements.
diff --git a/data/wiki/Waypoint Create a Custom Heading.md b/data/wiki/Waypoint Create a Custom Heading.md
new file mode 100644
index 0000000..50b84d7
--- /dev/null
+++ b/data/wiki/Waypoint Create a Custom Heading.md	
@@ -0,0 +1,12 @@
+# Create a Custom Heading
+Using `div` and the custom grid layout we can create our own heading.
+
+```
+<div class="row">
+   <div class="col-xs-8">
+     <h2 class="text-primary text-center">CatPhotoApp</h2>
+   </div>
+   <div class="col-xs-4">
+     <a href="#"><img class="img-responsive thick-green-border" src="https://bit.ly/fcc-relaxing-cat"></a>
+   </div>
+```
diff --git a/data/wiki/Waypoint Create a JavaScript Slot Machine.md b/data/wiki/Waypoint Create a JavaScript Slot Machine.md
new file mode 100644
index 0000000..08977cc
--- /dev/null
+++ b/data/wiki/Waypoint Create a JavaScript Slot Machine.md	
@@ -0,0 +1,8 @@
+# Create a JavaScript Slot Machine
+For this we have to generate three random numbers using the formula they give us and not the general one. `Math.floor(Math.random() * (3 - 1 + 1)) + 1;`
+
+```
+slotOne = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
+slotTwo = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
+slotThree = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
+```
diff --git a/data/wiki/Waypoint Declare JavaScript Variables.md b/data/wiki/Waypoint Declare JavaScript Variables.md
new file mode 100644
index 0000000..2811568
--- /dev/null
+++ b/data/wiki/Waypoint Declare JavaScript Variables.md	
@@ -0,0 +1,4 @@
+# Declare JavaScript Variables
+When we store data in a data structure, we call it a variable. JavaScript variables are written in `camel case`. An example of camel case is: `camelCase`.
+
+You can declare a variable this way `var myName = "Rafael";`
diff --git a/data/wiki/Waypoint Declare String Variables.md b/data/wiki/Waypoint Declare String Variables.md
new file mode 100644
index 0000000..e2042d9
--- /dev/null
+++ b/data/wiki/Waypoint Declare String Variables.md	
@@ -0,0 +1,4 @@
+# Declare String Variables
+A String variable. It is nothing more than a "string" of characters. JavaScript strings are always wrapped in quotes.
+
+`var myFirstName = 'Rafael';`
diff --git a/data/wiki/Waypoint Delete your jQuery Functions.md b/data/wiki/Waypoint Delete your jQuery Functions.md
new file mode 100644
index 0000000..9a5def6
--- /dev/null
+++ b/data/wiki/Waypoint Delete your jQuery Functions.md	
@@ -0,0 +1,2 @@
+# Delete your jQuery Functions
+To delete the functions it is just as any other piece of code that you want to remove, select it and delete with the keyboard.
diff --git a/data/wiki/Waypoint Disable an Element Using jQuery.md b/data/wiki/Waypoint Disable an Element Using jQuery.md
new file mode 100644
index 0000000..e7fa1ea
--- /dev/null
+++ b/data/wiki/Waypoint Disable an Element Using jQuery.md	
@@ -0,0 +1,8 @@
+# Disable an Element Using jQuery
+You can also change the non-CSS properties of HTML elements with jQuery. For example, you can disable buttons.
+
+When you disable a button, it will become grayed-out and can no longer be clicked.
+
+jQuery has a function called `.prop()` that allows you to adjust the properties of elements.
+
+Here's how you would disable all buttons: `$('#button').prop('disabled', true);`
diff --git a/data/wiki/Waypoint Ditch Custom CSS for Bootstrap.md b/data/wiki/Waypoint Ditch Custom CSS for Bootstrap.md
new file mode 100644
index 0000000..48d2d6c
--- /dev/null
+++ b/data/wiki/Waypoint Ditch Custom CSS for Bootstrap.md	
@@ -0,0 +1,4 @@
+# Ditch Custom CSS for Bootstrap
+We can clean up our code and make our Cat Photo App look more conventional by using Bootstrap's built-in styles instead of the custom styles we created earlier.
+
+All you need to know is the built in [classes](http://getbootstrap.com/css/).
diff --git a/data/wiki/Waypoint Divide One Number by Another with JavaScript.md b/data/wiki/Waypoint Divide One Number by Another with JavaScript.md
new file mode 100644
index 0000000..ad49ac9
--- /dev/null
+++ b/data/wiki/Waypoint Divide One Number by Another with JavaScript.md	
@@ -0,0 +1,2 @@
+# Divide One Number by Another with JavaScript
+JavaScript uses use the `/` symbol for division. `var quotient = 66 / 33;`
diff --git a/data/wiki/Waypoint Find Numbers with Regular Expressions.md b/data/wiki/Waypoint Find Numbers with Regular Expressions.md
new file mode 100644
index 0000000..e5b9930
--- /dev/null
+++ b/data/wiki/Waypoint Find Numbers with Regular Expressions.md	
@@ -0,0 +1,6 @@
+# Find Numbers with Regular Expressions
+We can use special selectors in Regular Expressions to select a particular type of value.
+
+One such selector is the digit selector `\d` which is used to grab the numbers in a string.
+
+It is used like this: `/\d+/g`.
diff --git a/data/wiki/Waypoint Find White Space with Regular Expressions.md b/data/wiki/Waypoint Find White Space with Regular Expressions.md
new file mode 100644
index 0000000..cd9ac3b
--- /dev/null
+++ b/data/wiki/Waypoint Find White Space with Regular Expressions.md	
@@ -0,0 +1,6 @@
+# Find White Space with Regular Expressions
+We can also use selectors like`\s` to find spaces in a string.
+
+It is used like this:
+
+`/\s+/g`
diff --git a/data/wiki/Waypoint Generate Random Fractions with JavaScript.md b/data/wiki/Waypoint Generate Random Fractions with JavaScript.md
new file mode 100644
index 0000000..ae7e673
--- /dev/null
+++ b/data/wiki/Waypoint Generate Random Fractions with JavaScript.md	
@@ -0,0 +1,2 @@
+# Generate Random Fractions with JavaScript
+JavaScript has a `Math.random()` function that generates a random decimal number.
diff --git a/data/wiki/Waypoint Generate Random Whole Numbers with JavaScript.md b/data/wiki/Waypoint Generate Random Whole Numbers with JavaScript.md
new file mode 100644
index 0000000..4204e3d
--- /dev/null
+++ b/data/wiki/Waypoint Generate Random Whole Numbers with JavaScript.md	
@@ -0,0 +1,6 @@
+# Generate Random Whole Numbers with JavaScript
+It's great that we can create random decimal numbers, but it's even more useful if we lot more useful to generate a random whole number.
+
+To achieve this we can multiply the random number by ten and use the `Math.floor()` to convert the decimal number to a whole number
+
+`return(Math.floor(Math.random()*10));`
diff --git a/data/wiki/Waypoint Generate Random Whole Numbers within a Range.md b/data/wiki/Waypoint Generate Random Whole Numbers within a Range.md
new file mode 100644
index 0000000..85d5f26
--- /dev/null
+++ b/data/wiki/Waypoint Generate Random Whole Numbers within a Range.md	
@@ -0,0 +1,6 @@
+# Generate Random Whole Numbers within a Range
+We can use a certain mathematical expression to get a random number between two numbers.
+
+`Math.floor(Math.random() * (max - min + 1)) + min`
+
+By using this we can control the output of a random number.
diff --git a/data/wiki/Waypoint Give Each Element a Unique ID.md b/data/wiki/Waypoint Give Each Element a Unique ID.md
new file mode 100644
index 0000000..48a48d1
--- /dev/null
+++ b/data/wiki/Waypoint Give Each Element a Unique ID.md	
@@ -0,0 +1,2 @@
+# Give Each Element a Unique ID
+We will also want to be able to use jQuery to target each button by its unique id. So we add an unique id to each button.
diff --git a/data/wiki/Waypoint Give your JavaScript Slot Machine some stylish images.md b/data/wiki/Waypoint Give your JavaScript Slot Machine some stylish images.md
new file mode 100644
index 0000000..2841a52
--- /dev/null
+++ b/data/wiki/Waypoint Give your JavaScript Slot Machine some stylish images.md	
@@ -0,0 +1,6 @@
+# Give your JavaScript Slot Machine some stylish images
+We've already set up the images for you in an array called images. We can use different indexes to grab each of these.
+
+Here's how we would set the first slot to show a different image depending on which number its random number generates:
+
+`$($('.slot')[0]).html('<img src = "' + images[slotOne-1] + '">');`
diff --git a/data/wiki/Waypoint House our page within a Bootstrap Container Fluid Div.md b/data/wiki/Waypoint House our page within a Bootstrap Container Fluid Div.md
new file mode 100644
index 0000000..2ba35d9
--- /dev/null
+++ b/data/wiki/Waypoint House our page within a Bootstrap Container Fluid Div.md	
@@ -0,0 +1,8 @@
+# House our page within a Bootstrap Container Fluid Div
+To make the content responsive, we use the `container-fluid` class.
+
+```
+<div class="container-fluid">
+<h3 class="text-primary text-center">jQuery Playground</h3>
+</div>
+```
diff --git a/data/wiki/Waypoint Invert Regular Expression Matches with JavaScript.md b/data/wiki/Waypoint Invert Regular Expression Matches with JavaScript.md
new file mode 100644
index 0000000..a762c4a
--- /dev/null
+++ b/data/wiki/Waypoint Invert Regular Expression Matches with JavaScript.md	
@@ -0,0 +1,4 @@
+# Invert Regular Expression Matches with JavaScript
+Use`/\S/gi`; to match everything that isn't a space in the string.
+
+You can invert any match by using the uppercase version of the selector `\s` versus `\S` for example.
diff --git a/data/wiki/Waypoint Iterate with JavaScript While Loops.md b/data/wiki/Waypoint Iterate with JavaScript While Loops.md
new file mode 100644
index 0000000..f119570
--- /dev/null
+++ b/data/wiki/Waypoint Iterate with JavaScript While Loops.md	
@@ -0,0 +1,11 @@
+# Iterate with JavaScript While Loops
+Another type of JavaScript loop is called a `while loop` because it runs `while` something is true, and stops once that something is no longer true.
+
+```
+var ourArray = [];
+var i = 0;
+while(i < 5) {
+  ourArray.push(i);
+  i++;
+}
+```
diff --git a/data/wiki/Waypoint Label Bootstrap Buttons.md b/data/wiki/Waypoint Label Bootstrap Buttons.md
new file mode 100644
index 0000000..f3c595c
--- /dev/null
+++ b/data/wiki/Waypoint Label Bootstrap Buttons.md	
@@ -0,0 +1,2 @@
+# Label Bootstrap Buttons
+Just like we labeled our [wells](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Waypoint-Label-Bootstrap-Wells), we want to label our buttons.
diff --git a/data/wiki/Waypoint Label Bootstrap Wells.md b/data/wiki/Waypoint Label Bootstrap Wells.md
new file mode 100644
index 0000000..83f78f2
--- /dev/null
+++ b/data/wiki/Waypoint Label Bootstrap Wells.md	
@@ -0,0 +1,2 @@
+# Label Bootstrap Wells
+You can add labels to the wells by using the headers `<h4>` above the well divs.
diff --git a/data/wiki/Waypoint Learn how Script Tags and Document Ready Work.md b/data/wiki/Waypoint Learn how Script Tags and Document Ready Work.md
new file mode 100644
index 0000000..22f560b
--- /dev/null
+++ b/data/wiki/Waypoint Learn how Script Tags and Document Ready Work.md	
@@ -0,0 +1,12 @@
+# Learn how Script Tags and Document Ready Work
+For some reason FCC likes to introduce `jQuery` before JavaScript itself.
+
+To add JS to your HTML, you need a `script` tag.  Your browser will run any JavaScript inside a script element, including jQuery.
+
+Inside your script element, add this code: `$(document).ready(function() {` to your script. Then close it on the following line (still inside your script element) with: `});`
+
+```
+<script> $(document).ready(function(){
+
+});</script>
+```
diff --git a/data/wiki/Waypoint Line up Form Elements Responsively with Bootstrap.md b/data/wiki/Waypoint Line up Form Elements Responsively with Bootstrap.md
new file mode 100644
index 0000000..570c45f
--- /dev/null
+++ b/data/wiki/Waypoint Line up Form Elements Responsively with Bootstrap.md	
@@ -0,0 +1,9 @@
+# Line up Form Elements Responsively with Bootstrap
+We line up the form elements the same way we do with others, using divs.
+
+```
+<div class="row">
+<div class="col-xs-7"><input type="text" class="form-control" placeholder="cat photo URL" required></div>
+<div class=col-xs-5><button type="submit" class="btn btn-primary"><i class="fa fa-paper-plane"></i> Submit</button></div>
+</div>
+```
diff --git a/data/wiki/Waypoint Make Images Mobile Responsive.md b/data/wiki/Waypoint Make Images Mobile Responsive.md
new file mode 100644
index 0000000..95c4be6
--- /dev/null
+++ b/data/wiki/Waypoint Make Images Mobile Responsive.md	
@@ -0,0 +1,2 @@
+# Make Images Mobile Responsive
+When using Bootstrap, if you want an image to be responsive, all you have to do is add the class `img-responsive` to it. `<img class="img-responsive" src="http://bit.ly/fcc-running-cats">`
diff --git a/data/wiki/Waypoint Manipulate Arrays With pop().md b/data/wiki/Waypoint Manipulate Arrays With pop().md
new file mode 100644
index 0000000..e361283
--- /dev/null
+++ b/data/wiki/Waypoint Manipulate Arrays With pop().md	
@@ -0,0 +1,6 @@
+# Manipulate Arrays With pop()
+Another way to change the data in an array is with the `.pop()` function.
+
+`.pop()` is used to "pop" a value off of the end of an array. We can retrieve this value by performing `pop()` in a variable declaration.
+
+Any type of variable can be "popped" off of an array.
diff --git a/data/wiki/Waypoint Manipulate Arrays With push().md b/data/wiki/Waypoint Manipulate Arrays With push().md
new file mode 100644
index 0000000..9710da7
--- /dev/null
+++ b/data/wiki/Waypoint Manipulate Arrays With push().md	
@@ -0,0 +1,4 @@
+# Manipulate Arrays With push()
+Not only can you `pop()` data off of the end of an array, you can also `push()` data onto the end of an array.
+
+`myArray.push(["dog", 3]);`
diff --git a/data/wiki/Waypoint Manipulate Arrays With shift().md b/data/wiki/Waypoint Manipulate Arrays With shift().md
new file mode 100644
index 0000000..dee96ff
--- /dev/null
+++ b/data/wiki/Waypoint Manipulate Arrays With shift().md	
@@ -0,0 +1,2 @@
+# Manipulate Arrays With shift()
+`shift()` removes the first element unlike `pop()` which removes the last.
diff --git a/data/wiki/Waypoint Manipulate Arrays With unshift().md b/data/wiki/Waypoint Manipulate Arrays With unshift().md
new file mode 100644
index 0000000..6cad655
--- /dev/null
+++ b/data/wiki/Waypoint Manipulate Arrays With unshift().md	
@@ -0,0 +1,2 @@
+# Manipulate Arrays With unshift()
+`myArray.unshift('Paul');` Basically you call `unshift` and pass what was deleted.
diff --git a/data/wiki/Waypoint Manipulate JavaScript Objects.md b/data/wiki/Waypoint Manipulate JavaScript Objects.md
new file mode 100644
index 0000000..530f07f
--- /dev/null
+++ b/data/wiki/Waypoint Manipulate JavaScript Objects.md	
@@ -0,0 +1,8 @@
+# Manipulate JavaScript Objects
+We can add properties to objects like this:
+
+`myObject.myProperty = "myValue";`
+
+We can also delete them like this:
+
+`delete(myObject.myProperty);`
diff --git a/data/wiki/Waypoint Modify Array Data With Indexes.md b/data/wiki/Waypoint Modify Array Data With Indexes.md
new file mode 100644
index 0000000..f670f23
--- /dev/null
+++ b/data/wiki/Waypoint Modify Array Data With Indexes.md	
@@ -0,0 +1,9 @@
+# Modify Array Data With Indexes
+We can also modify the data stored in arrays by using indexes.
+
+For example:
+
+```
+var ourArray = [3,2,1];
+ourArray[0] = 1; // equals [1,2,1]
+```
diff --git a/data/wiki/Waypoint Multiply Two Numbers with JavaScript.md b/data/wiki/Waypoint Multiply Two Numbers with JavaScript.md
new file mode 100644
index 0000000..cc4071c
--- /dev/null
+++ b/data/wiki/Waypoint Multiply Two Numbers with JavaScript.md	
@@ -0,0 +1,4 @@
+# Multiply Two Numbers with JavaScript
+JavaScript uses use the `*` symbol for multiplication.
+
+`var product = 8 * 10;`
diff --git a/data/wiki/Waypoint Nest one Array within Another Array.md b/data/wiki/Waypoint Nest one Array within Another Array.md
new file mode 100644
index 0000000..acbfa1f
--- /dev/null
+++ b/data/wiki/Waypoint Nest one Array within Another Array.md	
@@ -0,0 +1,2 @@
+# Nest one Array within Another Array
+You can nest arrays within other arrays, like this:`[["Bulls", 43]]`.
diff --git a/data/wiki/Waypoint Perform Arithmetic Operations on Decimals with JavaScript.md b/data/wiki/Waypoint Perform Arithmetic Operations on Decimals with JavaScript.md
new file mode 100644
index 0000000..b9bab53
--- /dev/null
+++ b/data/wiki/Waypoint Perform Arithmetic Operations on Decimals with JavaScript.md	
@@ -0,0 +1,4 @@
+# Perform Arithmetic Operations on Decimals with JavaScript
+In JavaScript, you can perform calculations with decimal numbers, just like whole numbers.
+
+`var quotient = 4.4 / 2.0; // equals 2.2`
diff --git a/data/wiki/Waypoint Remove Classes from an element with jQuery.md b/data/wiki/Waypoint Remove Classes from an element with jQuery.md
new file mode 100644
index 0000000..8952c6b
--- /dev/null
+++ b/data/wiki/Waypoint Remove Classes from an element with jQuery.md	
@@ -0,0 +1,4 @@
+# Remove Classes from an element with jQuery
+The same way we can add classes using jQuery, we an also remove them with `removeClass()`.
+
+`$("button").removeClass("btn-default");`
diff --git a/data/wiki/Waypoint Remove an Element Using jQuery.md b/data/wiki/Waypoint Remove an Element Using jQuery.md
new file mode 100644
index 0000000..469185f
--- /dev/null
+++ b/data/wiki/Waypoint Remove an Element Using jQuery.md	
@@ -0,0 +1,2 @@
+# Remove an Element Using jQuery
+jQuery has a function called `.remove()` that will remove an HTML element entirely. `$("#target4").remove();`
diff --git a/data/wiki/Waypoint Responsively Style Checkboxes.md b/data/wiki/Waypoint Responsively Style Checkboxes.md
new file mode 100644
index 0000000..7fd6c22
--- /dev/null
+++ b/data/wiki/Waypoint Responsively Style Checkboxes.md	
@@ -0,0 +1,4 @@
+# Responsively Style Checkboxes
+You can use Bootstrap's `col-xs-*` classes on form elements, too! This way, our checkboxes will be evenly spread out across the page, regardless of how wide the screen resolution is.
+
+Nest all your checkboxes in a `<div class="row">` element. Then nest each of them in a `<div class="col-xs-4">` element.
diff --git a/data/wiki/Waypoint Responsively Style Radio Buttons.md b/data/wiki/Waypoint Responsively Style Radio Buttons.md
new file mode 100644
index 0000000..c4cc35a
--- /dev/null
+++ b/data/wiki/Waypoint Responsively Style Radio Buttons.md	
@@ -0,0 +1,18 @@
+# Responsively Style Radio Buttons
+You can use Bootstrap's `col-xs-*` classes on `form` elements. That will make radio buttons evenly spread out across the page regardless of how wide the screen might be.
+
+Nest all of your radio buttons within a `<div class="row">` element. Then nest each of them within a `<div class="col-xs-6">` element.
+
+```
+<form action="/submit-cat-photo">
+  <div class="row">
+    <div class="col-xs-6"><label><input type="radio" name="indoor-outdoor"> Indoor</label></div>
+    <div class="col-xs-6"><label><input type="radio" name="indoor-outdoor"> Outdoor</label></div>
+    <div class="col-xs-6"><label><input type="checkbox" name="personality"> Loving</label></div>
+    <div class="col-xs-6"><label><input type="checkbox" name="personality"> Lazy</label></div>
+    <div class="col-xs-6"><label><input type="checkbox" name="personality"> Crazy</label></div>
+  </div>
+  <input type="text" placeholder="cat photo URL" required>
+  <button type="submit">Submit</button>
+</form>
+```
diff --git a/data/wiki/Waypoint Sift through Text with Regular Expressions.md b/data/wiki/Waypoint Sift through Text with Regular Expressions.md
new file mode 100644
index 0000000..7698588
--- /dev/null
+++ b/data/wiki/Waypoint Sift through Text with Regular Expressions.md	
@@ -0,0 +1,13 @@
+# Sift through Text with Regular Expressions
+`Regular expressions` are used to find certain words or patterns inside of strings.
+
+Regular expressions are usually surrounded by `/` symbols.
+
+For example, if we wanted to find the number of times the word the occurred in the string The dog chased the cat, we could use the following regular expression: `/the+/gi`
+
+Let's break this down a bit:
+
+the is the pattern we want to match.
+- `+` means we want to find one or more occurrences of this pattern.
+- `g` means that we want to search the entire string for this pattern.
+- `i` means that we want to ignore the case (uppercase or lowercase) when searching for the pattern.
diff --git a/data/wiki/Waypoint Split your Bootstrap Row.md b/data/wiki/Waypoint Split your Bootstrap Row.md
new file mode 100644
index 0000000..14f92fd
--- /dev/null
+++ b/data/wiki/Waypoint Split your Bootstrap Row.md	
@@ -0,0 +1,12 @@
+# Split your Bootstrap Row
+Create two `div` elements within your row, both with the class `col-xs-6`.
+
+```
+<div class="container-fluid">
+  <h3 class="text-primary text-center">jQuery Playground</h3>
+  <div class="row">
+    <div class="col-xs-6"> </div>
+    <div class="col-xs-6"></div>
+  </div>
+</div>
+```
diff --git a/data/wiki/Waypoint Store Multiple Values in one Variable using JavaScript Arrays.md b/data/wiki/Waypoint Store Multiple Values in one Variable using JavaScript Arrays.md
new file mode 100644
index 0000000..cc593b3
--- /dev/null
+++ b/data/wiki/Waypoint Store Multiple Values in one Variable using JavaScript Arrays.md	
@@ -0,0 +1,6 @@
+# Store Multiple Values in one Variable using JavaScript Arrays
+With JavaScript array variables, we can store several pieces of data in one place.
+
+You start an array declaration with an opening bracket, end it with a closing bracket, and put a comma between each entry, like this: `var sandwich = ["peanut butter", "jelly", "bread"]`.
+
+`myArray = [2,'j'];`
diff --git a/data/wiki/Waypoint Style Text Inputs as Form Controls.md b/data/wiki/Waypoint Style Text Inputs as Form Controls.md
new file mode 100644
index 0000000..39da6d3
--- /dev/null
+++ b/data/wiki/Waypoint Style Text Inputs as Form Controls.md	
@@ -0,0 +1,4 @@
+# Style Text Inputs as Form Controls
+You can add the `fa-paper-plane` Font Awesome icon by adding `<i class="fa fa-paper-plane"></i>` within your submit button element.
+
+`<button type="submit" class="btn btn-primary"><i class="fa fa-paper-plane">Submit</i>`
diff --git a/data/wiki/Waypoint Subtract One Number from Another with JavaScript.md b/data/wiki/Waypoint Subtract One Number from Another with JavaScript.md
new file mode 100644
index 0000000..dcea6d4
--- /dev/null
+++ b/data/wiki/Waypoint Subtract One Number from Another with JavaScript.md	
@@ -0,0 +1,4 @@
+# Subtract One Number from Another with JavaScript
+We can also subtract one number from another.
+
+JavaScript uses use the - symbol for subtraction. `var difference = 45 - 33;`
diff --git a/data/wiki/Waypoint Target Elements by Class Using jQuery.md b/data/wiki/Waypoint Target Elements by Class Using jQuery.md
new file mode 100644
index 0000000..d240ae9
--- /dev/null
+++ b/data/wiki/Waypoint Target Elements by Class Using jQuery.md	
@@ -0,0 +1,4 @@
+# Target Elements by Class Using jQuery
+Just as we did before, we can also target elements by classes.
+
+`$(".well").addClass("animated shake");`
diff --git a/data/wiki/Waypoint Target Elements by ID Using jQuery.md b/data/wiki/Waypoint Target Elements by ID Using jQuery.md
new file mode 100644
index 0000000..8e03a5d
--- /dev/null
+++ b/data/wiki/Waypoint Target Elements by ID Using jQuery.md	
@@ -0,0 +1,4 @@
+# Target Elements by ID Using jQuery
+You can also target elements by their id attributes. Note that, just like with CSS declarations, you type a # before the id's name.
+
+`$("#target3").addClass("animated fadeOut");`
diff --git a/data/wiki/Waypoint Target Even Numbered Elements Using jQuery.md b/data/wiki/Waypoint Target Even Numbered Elements Using jQuery.md
new file mode 100644
index 0000000..84c6fa1
--- /dev/null
+++ b/data/wiki/Waypoint Target Even Numbered Elements Using jQuery.md	
@@ -0,0 +1,6 @@
+# Target Even Numbered Elements Using jQuery
+You can also target all the even-numbered elements.
+
+Here's how you would target all the `odd-numbered` elements with class target and give them classes: `$('.target:odd').addClass('animated shake');`
+
+This will shake all the even ones: `$('.target:even').addClass("shake");`
diff --git a/data/wiki/Waypoint Target HTML Elements with Selectors Using jQuery.md b/data/wiki/Waypoint Target HTML Elements with Selectors Using jQuery.md
new file mode 100644
index 0000000..94c6e84
--- /dev/null
+++ b/data/wiki/Waypoint Target HTML Elements with Selectors Using jQuery.md	
@@ -0,0 +1,14 @@
+# Target HTML Elements with Selectors Using jQuery
+After we have created our `document ready function` we can now have code that will run after the page loads. This will assure that your code does not run before the HTML is rendered to avoid bugs.
+
+jQuery often selects an HTML element with a selector, then does something to that element.
+
+The following code will make the buttons have a bouncy animation on page load.
+
+```
+<script>
+  $(document).ready(function() {
+    $("button").addClass("animated bounce");
+  });
+</script>
+```
diff --git a/data/wiki/Waypoint Target a Specific Child of an Element Using jQuery.md b/data/wiki/Waypoint Target a Specific Child of an Element Using jQuery.md
new file mode 100644
index 0000000..c52ae8d
--- /dev/null
+++ b/data/wiki/Waypoint Target a Specific Child of an Element Using jQuery.md	
@@ -0,0 +1,6 @@
+# Target a Specific Child of an Element Using jQuery
+jQuery uses CSS Selectors to target elements. `target:nth-child(n)` css selector allows you to select all the nth element with the target class or element type.
+
+Here's how you would give the third element in each well bounce: `$(".target:nth-child(3)").addClass("animated bounce");`
+
+`$(".btn:nth-child(2)").addClass("animated bounce");`
diff --git a/data/wiki/Waypoint Target the Children of an Element Using jQuery.md b/data/wiki/Waypoint Target the Children of an Element Using jQuery.md
new file mode 100644
index 0000000..42e7e23
--- /dev/null
+++ b/data/wiki/Waypoint Target the Children of an Element Using jQuery.md	
@@ -0,0 +1,6 @@
+# Target the Children of an Element Using jQuery
+Many HTML elements have children elements from which they inherit properties.
+
+jQuery has a function called `children()` that allows you to access the children of whichever element you've selected.
+
+Here's an example of how you would use the `children()` function: `$("#left-well").children().css("color", "blue");`
diff --git a/data/wiki/Waypoint Target the Parent of an Element Using jQuery.md b/data/wiki/Waypoint Target the Parent of an Element Using jQuery.md
new file mode 100644
index 0000000..aa04a7b
--- /dev/null
+++ b/data/wiki/Waypoint Target the Parent of an Element Using jQuery.md	
@@ -0,0 +1,8 @@
+# Target the Parent of an Element Using jQuery
+Every HTML elements has a parent element from which it inherits properties.
+
+For example, your jQuery Playground `h3` element has the parent element of`<div class="container-fluid">`, which itself has the parent body.
+
+jQuery has a function called `parent()` that allows you to access the parent of whichever element you've selected.
+
+Here's an example of how you would use the `parent()` function: `$("#left-well").parent().css("background-color", "blue")`
diff --git a/data/wiki/Waypoint Target the same element with multiple jQuery Selectors.md b/data/wiki/Waypoint Target the same element with multiple jQuery Selectors.md
new file mode 100644
index 0000000..2bfcf1b
--- /dev/null
+++ b/data/wiki/Waypoint Target the same element with multiple jQuery Selectors.md	
@@ -0,0 +1,15 @@
+# Target the same element with multiple jQuery Selectors
+The multiple jQuery selectors are:
+1. By type: `$("button")`
+2. By class: `$(".btn")`
+3. By id: `$("#target1")`
+
+```
+<script>
+  $(document).ready(function() {
+    $("button").addClass("animated");
+    $(".btn").addClass("shake");
+    $("#target1").addClass("animated shake btn-primary");
+  });
+</script>
+```
diff --git a/data/wiki/Waypoint Taste the Bootstrap Button Color Rainbow.md b/data/wiki/Waypoint Taste the Bootstrap Button Color Rainbow.md
new file mode 100644
index 0000000..6d6d755
--- /dev/null
+++ b/data/wiki/Waypoint Taste the Bootstrap Button Color Rainbow.md	
@@ -0,0 +1,4 @@
+# Taste the Bootstrap Button Color Rainbow
+The `btn-primary` class is the main color you'll use in your app. It is useful for highlighting actions you want your user to take. Note that this button will still need the `btn` and `btn-block` classes.
+
+`<button class="btn btn-block btn-primary">Like</button>`
diff --git a/data/wiki/Waypoint Understand Boolean Values.md b/data/wiki/Waypoint Understand Boolean Values.md
new file mode 100644
index 0000000..e8ff55d
--- /dev/null
+++ b/data/wiki/Waypoint Understand Boolean Values.md	
@@ -0,0 +1,2 @@
+# Understand Boolean Values
+Booleans can only hold the value of either true or false. They are basically little on-off switches.
diff --git a/data/wiki/Waypoint Use Bracket Notation to Find the First Character in a String.md b/data/wiki/Waypoint Use Bracket Notation to Find the First Character in a String.md
new file mode 100644
index 0000000..ec7bad4
--- /dev/null
+++ b/data/wiki/Waypoint Use Bracket Notation to Find the First Character in a String.md	
@@ -0,0 +1,4 @@
+# Use Bracket Notation to Find the First Character in a String
+Bracket notation is a way to get a character at a specific index within a string.
+
+Computers don't start counting at `1` like humans do. They start at `0`. `firstLetterOfLastName = lastName[0];`
diff --git a/data/wiki/Waypoint Use Bracket Notation to Find the Last Character in a String.md b/data/wiki/Waypoint Use Bracket Notation to Find the Last Character in a String.md
new file mode 100644
index 0000000..7b1b315
--- /dev/null
+++ b/data/wiki/Waypoint Use Bracket Notation to Find the Last Character in a String.md	
@@ -0,0 +1,6 @@
+# Use Bracket Notation to Find the Last Character in a String
+In order to get the last letter of a string, you can subtract one from the string's length.
+
+For example, if `var firstName = "Charles"`, you can get the value of the last letter of the string by using `firstName[firstName.length - 1]`.
+
+`var lastLetterOfLastName = lastName[lastName.length -1];`
diff --git a/data/wiki/Waypoint Use Bracket Notation to Find the Nth Character in a String.md b/data/wiki/Waypoint Use Bracket Notation to Find the Nth Character in a String.md
new file mode 100644
index 0000000..2cc8f18
--- /dev/null
+++ b/data/wiki/Waypoint Use Bracket Notation to Find the Nth Character in a String.md	
@@ -0,0 +1,6 @@
+# Use Bracket Notation to Find the Nth Character in a String
+You can also use bracket notation to get the character at other positions within a string.
+
+Remember that computers start counting at `0`, so the first character is actually the zeroth character.
+
+`var thirdLetterOfLastName = lastName[2];`
diff --git a/data/wiki/Waypoint Use Bracket Notation to Find the Nth-to-Last Character in a String.md b/data/wiki/Waypoint Use Bracket Notation to Find the Nth-to-Last Character in a String.md
new file mode 100644
index 0000000..af7705b
--- /dev/null
+++ b/data/wiki/Waypoint Use Bracket Notation to Find the Nth-to-Last Character in a String.md	
@@ -0,0 +1,2 @@
+# Use Bracket Notation to Find the Nth-to-Last Character in a String
+You can get the value of the third-to-last letter of the `var firstName = "Charles"` string by using `firstName[firstName.length - 3]`.
diff --git a/data/wiki/Waypoint Use Comments to Clarify Code.md b/data/wiki/Waypoint Use Comments to Clarify Code.md
new file mode 100644
index 0000000..9faa071
--- /dev/null
+++ b/data/wiki/Waypoint Use Comments to Clarify Code.md	
@@ -0,0 +1,29 @@
+# Use Comments to Clarify Code
+When we start using jQuery, we will modify HTML elements without needing to actually change them in HTML.
+
+This is a great way to make websites with a particular structure. Remember that you can start a comment with `<!-- and end a comment with -->`
+
+```
+<!--You shouldn't need to modify code below this line -->
+<div class="container-fluid">
+ <h3 class="text-primary text-center">jQuery Playground</h3>
+ <div class="row">
+   <div class="col-xs-6">
+     <h4>#left-well</h4>
+     <div class="well" id="left-well">
+       <button class="btn btn-default target" id="target1">#target1</button>
+       <button class="btn btn-default target" id="target2">#target2</button>
+       <button class="btn btn-default target" id="target3">#target3</button>
+     </div>
+   </div>
+   <div class="col-xs-6">
+     <h4>#right-well</h4>
+     <div class="well" id="right-well">
+       <button class="btn btn-default target" id="target4">#target4</button>
+       <button class="btn btn-default target" id="target5">#target5</button>
+       <button class="btn btn-default target" id="target6">#target6</button>
+     </div>
+   </div>
+ </div>
+</div>
+```
diff --git a/data/wiki/Waypoint Use Conditional Logic with If-Else Statements.md b/data/wiki/Waypoint Use Conditional Logic with If-Else Statements.md
new file mode 100644
index 0000000..452378c
--- /dev/null
+++ b/data/wiki/Waypoint Use Conditional Logic with If-Else Statements.md	
@@ -0,0 +1,15 @@
+# Use Conditional Logic with If-Else Statements
+We can use if statements in JavaScript to only execute code if a certain condition is met.
+
+if statements require some sort of `boolean` condition evaluate.
+
+```
+Example:
+
+ if (1 == 2) {
+  return(true);
+}
+else {
+  return(false);
+}
+```
diff --git a/data/wiki/Waypoint Use Responsive Design with Bootstrap Fluid Containers.md b/data/wiki/Waypoint Use Responsive Design with Bootstrap Fluid Containers.md
new file mode 100644
index 0000000..71c4fdb
--- /dev/null
+++ b/data/wiki/Waypoint Use Responsive Design with Bootstrap Fluid Containers.md	
@@ -0,0 +1,6 @@
+# Use Responsive Design with Bootstrap Fluid Containers
+Bootstrap will figure out how wide your screen is and respond by resizing your HTML elements - hence the name Responsive Design.
+
+With responsive design, there is no need to design a mobile version of your website. It will look good on devices with screens of any width.
+
+You can add Bootstrap to any app just by including it with `<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css"/>` at the top of your HTML.
diff --git a/data/wiki/Waypoint Use Spans for Inline Elements.md b/data/wiki/Waypoint Use Spans for Inline Elements.md
new file mode 100644
index 0000000..8933a2c
--- /dev/null
+++ b/data/wiki/Waypoint Use Spans for Inline Elements.md	
@@ -0,0 +1,4 @@
+# Use Spans for Inline Elements
+You can use use spans to create inline elements. By using the span element, you can put several elements together, and even style different parts of the same element differently.
+
+`<p><span class = "text-danger">Things cats love:</span></p>`
diff --git a/data/wiki/Waypoint Use appendTo to Move Elements with jQuery.md b/data/wiki/Waypoint Use appendTo to Move Elements with jQuery.md
new file mode 100644
index 0000000..8a29e35
--- /dev/null
+++ b/data/wiki/Waypoint Use appendTo to Move Elements with jQuery.md	
@@ -0,0 +1,4 @@
+# Use appendTo to Move Elements with jQuery
+jQuery has a function called `appendTo()` that allows you to select HTML elements and append them to another element.
+
+For example, if we wanted to move target4 from our right well to our left well, we would use `$("#target4").appendTo("#left-well");`
diff --git a/data/wiki/Waypoint Use jQuery to Modify the Entire Page.md b/data/wiki/Waypoint Use jQuery to Modify the Entire Page.md
new file mode 100644
index 0000000..875bd0b
--- /dev/null
+++ b/data/wiki/Waypoint Use jQuery to Modify the Entire Page.md	
@@ -0,0 +1,4 @@
+# Use jQuery to Modify the Entire Page
+jQuery can target the body element as well.
+
+Here's how we would make the entire body fade out: `$('body').addClass('animated fadeOut');`
diff --git a/data/wiki/Waypoint Use the Bootstrap Grid to Put Elements Side By Side.md b/data/wiki/Waypoint Use the Bootstrap Grid to Put Elements Side By Side.md
new file mode 100644
index 0000000..c13f469
--- /dev/null
+++ b/data/wiki/Waypoint Use the Bootstrap Grid to Put Elements Side By Side.md	
@@ -0,0 +1,16 @@
+# Use the Bootstrap Grid to Put Elements Side By Side
+Bootstrap uses a responsive grid system that makes it easier to put elements into rows and tell each element's relative width.
+
+![Bootstrap 12 column grid layout](https://www.evernote.com/shard/s116/sh/f0944d97-08b8-4615-8273-a327bf41fb05/de1a3acbceef89ae/deep/0/)
+
+Note that in this illustration, the `col-md-_` class is being used. Here, md means medium, and _ is a number specifying how many columns wide the element should be. In this case, the column width of an element on a medium-sized screen, such as a laptop, is being specified.
+
+```
+<div class="row">
+
+  <div class="col-xs-4"><button class="btn btn-block btn-primary">Like</button></div>
+  <div class="col-xs-4"><button class="btn btn-block btn-info">Info</button></div>
+  <div class="col-xs-4"><button class="btn btn-block btn-danger">Delete</button></div>
+
+</div>
+```
diff --git a/data/wiki/Waypoint Warn your Users of a Dangerous Action.md b/data/wiki/Waypoint Warn your Users of a Dangerous Action.md
new file mode 100644
index 0000000..982068e
--- /dev/null
+++ b/data/wiki/Waypoint Warn your Users of a Dangerous Action.md	
@@ -0,0 +1,4 @@
+# Warn your Users of a Dangerous Action
+The `btn-danger` class is the button color you'll use to notify users that the button performs a destructive action, such as deleting a cat photo. Note that these buttons still need the `btn` and `btn-block` classes.
+
+`<button class="btn btn-block btn-danger">Delete</button>`
diff --git a/data/wiki/Waypoint Write Reusable JavaScript with Functions.md b/data/wiki/Waypoint Write Reusable JavaScript with Functions.md
new file mode 100644
index 0000000..5944d7f
--- /dev/null
+++ b/data/wiki/Waypoint Write Reusable JavaScript with Functions.md	
@@ -0,0 +1,12 @@
+# Write Reusable JavaScript with Functions
+In JavaScript, we can divide up our code into reusable parts called functions.
+
+Here's an example of a function:
+
+```
+function functionName (a, b) {
+  return(a + b);
+}
+```
+
+We can "call" our function like this: `functionName();`, and it will run and return it's return value to us.
diff --git a/data/wiki/Waypoint-Add-Alt-Text-to-an-Image-for-Accessibility.md b/data/wiki/Waypoint-Add-Alt-Text-to-an-Image-for-Accessibility.md
new file mode 100644
index 0000000..50c0956
--- /dev/null
+++ b/data/wiki/Waypoint-Add-Alt-Text-to-an-Image-for-Accessibility.md
@@ -0,0 +1,5 @@
+`alt` attributes, also known as alt text, are what browsers will display if they fail to load the image. alt attributes are also important for blind or visually impaired users to understand what an image portrays. And search engines also look at alt attributes.
+
+In short, every image should have an alt attribute!
+
+You can add an alt attribute right in the img element like this: `<img src="www.your-image-source.com/your-image.jpg" alt="your alt text"/>`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Add-Borders-Around-your-Elements.md b/data/wiki/Waypoint-Add-Borders-Around-your-Elements.md
new file mode 100644
index 0000000..d8491b0
--- /dev/null
+++ b/data/wiki/Waypoint-Add-Borders-Around-your-Elements.md
@@ -0,0 +1,3 @@
+CSS borders have attributes like `style`, `color` and `width`.
+
+For example, if we wanted to create a red, 5 pixel border around an HTML element, we could use this class: `<style> .thin-red-border { border-color: red; border-width: 5px; border-style: solid; } </style>`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Add-Different-Margins-to-Each-Side-of-an-Element.md b/data/wiki/Waypoint-Add-Different-Margins-to-Each-Side-of-an-Element.md
new file mode 100644
index 0000000..bbb3d9a
--- /dev/null
+++ b/data/wiki/Waypoint-Add-Different-Margins-to-Each-Side-of-an-Element.md
@@ -0,0 +1 @@
+CSS allows you to control the margin of an element on all four sides with `margin-top`, `margin-right`, `margin-bottom`, and `margin-left` attributes.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Add-Different-Padding-to-Each-Side-of-an-Element.md b/data/wiki/Waypoint-Add-Different-Padding-to-Each-Side-of-an-Element.md
new file mode 100644
index 0000000..7ddd5fa
--- /dev/null
+++ b/data/wiki/Waypoint-Add-Different-Padding-to-Each-Side-of-an-Element.md
@@ -0,0 +1,11 @@
+CSS allows you to control the padding of an element on all four sides with `padding-top`, `padding-right`, `padding-bottom`, and `padding-left` attributes.
+
+```
+.green-box {
+  background-color: green;
+  padding-top: 40px;
+  padding-right: 20px;
+  padding-bottom: 20px;
+  padding-left: 40px;
+}
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Add-Images-to-your-Website.md b/data/wiki/Waypoint-Add-Images-to-your-Website.md
new file mode 100644
index 0000000..1ee5f85
--- /dev/null
+++ b/data/wiki/Waypoint-Add-Images-to-your-Website.md
@@ -0,0 +1,3 @@
+You can add images to your website by using the `img` element, and point to an specific image's URL using the `src` attribute.
+
+An example of this would be `<img src="www.your-image-source.com/your-image.jpg">`. Note that in most cases, img elements are self-closing.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Add-Placeholder-Text-to-a-Text-Field.md b/data/wiki/Waypoint-Add-Placeholder-Text-to-a-Text-Field.md
new file mode 100644
index 0000000..94e60d5
--- /dev/null
+++ b/data/wiki/Waypoint-Add-Placeholder-Text-to-a-Text-Field.md
@@ -0,0 +1,3 @@
+Your placeholder text is what appears in your text input before your user has inputed anything.
+
+You can create placeholder text like so: `<input type="text" placeholder="this is placeholder text">`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Add-Rounded-Corners-with-a-Border-Radius.md b/data/wiki/Waypoint-Add-Rounded-Corners-with-a-Border-Radius.md
new file mode 100644
index 0000000..25d362e
--- /dev/null
+++ b/data/wiki/Waypoint-Add-Rounded-Corners-with-a-Border-Radius.md
@@ -0,0 +1,12 @@
+To make round corners it is all about `border-radius` and pixels.
+
+You can specify a border-radius with pixels. This will affect how rounded the corners are.
+
+```
+.thick-green-border {
+  border-color: green;
+  border-width: 10px;
+  border-style: solid;
+  border-radius: 10px;
+}
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Add-a-Negative-Margin-to-an-Element.md b/data/wiki/Waypoint-Add-a-Negative-Margin-to-an-Element.md
new file mode 100644
index 0000000..97b5b0b
--- /dev/null
+++ b/data/wiki/Waypoint-Add-a-Negative-Margin-to-an-Element.md
@@ -0,0 +1 @@
+An element's `margin` controls the amount of space between an element's border and surrounding elements. If you set an element's margin to a **negative value**, the element will grow **larger**.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Add-a-Submit-Button-to-a-Form.md b/data/wiki/Waypoint-Add-a-Submit-Button-to-a-Form.md
new file mode 100644
index 0000000..02ac0f6
--- /dev/null
+++ b/data/wiki/Waypoint-Add-a-Submit-Button-to-a-Form.md
@@ -0,0 +1,8 @@
+You will need to create a `button` element. Here's an example submit button: `<button type="submit">this button submits the form</button>`.
+
+```
+<form action="/submit-cat-photo">
+  <input type="text" placeholder="cat photo URL">
+  <button type="submit">Submit</button>
+</form>
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Adjust-the-Margin-of-an-Element.md b/data/wiki/Waypoint-Adjust-the-Margin-of-an-Element.md
new file mode 100644
index 0000000..bbfada8
--- /dev/null
+++ b/data/wiki/Waypoint-Adjust-the-Margin-of-an-Element.md
@@ -0,0 +1,9 @@
+An element's `margin` controls the amount of space between an element's `border` and surrounding elements.
+
+```
+.green-box {
+  background-color: green;
+  padding: 20px;
+  margin: 20px;
+}
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Adjusting-the-Padding-of-an-Element.md b/data/wiki/Waypoint-Adjusting-the-Padding-of-an-Element.md
new file mode 100644
index 0000000..7d32e92
--- /dev/null
+++ b/data/wiki/Waypoint-Adjusting-the-Padding-of-an-Element.md
@@ -0,0 +1,8 @@
+HTML elements are essentially little rectangles. Three important attributes control the space that surrounds each HTML element: `padding`, `margin`, and `border`. An element's padding controls the amount of space between the element and its border.
+
+```
+.green-box {
+  background-color: green;
+  padding: 20px;
+}
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Change-the-Color-of-Text.md b/data/wiki/Waypoint-Change-the-Color-of-Text.md
new file mode 100644
index 0000000..c0c1a9a
--- /dev/null
+++ b/data/wiki/Waypoint-Change-the-Color-of-Text.md
@@ -0,0 +1,3 @@
+CSS allows us to change  many styles. To change the color of an element we use `color`.
+
+Here's how you would set your h2 element's text color to blue: `<h2 style="color: blue">CatPhotoApp</h2>`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Change-the-Font-Size-of-an-Element.md b/data/wiki/Waypoint-Change-the-Font-Size-of-an-Element.md
new file mode 100644
index 0000000..b25ad40
--- /dev/null
+++ b/data/wiki/Waypoint-Change-the-Font-Size-of-an-Element.md
@@ -0,0 +1 @@
+Font size is controlled by the `font-size` CSS attribute, like this: `h1 { font-size: 30px; }`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Check-Radio-Buttons-and-Checkboxes-by-Default.md b/data/wiki/Waypoint-Check-Radio-Buttons-and-Checkboxes-by-Default.md
new file mode 100644
index 0000000..8ce6537
--- /dev/null
+++ b/data/wiki/Waypoint-Check-Radio-Buttons-and-Checkboxes-by-Default.md
@@ -0,0 +1,3 @@
+You can set a checkbox or radio button to be checked by default using the checked attribute.
+
+To do this, just add the word "checked" to the inside of an input element. For example, `<input type="radio" name="test-name" checked>`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Comment-out-HTML.md b/data/wiki/Waypoint-Comment-out-HTML.md
new file mode 100644
index 0000000..396c865
--- /dev/null
+++ b/data/wiki/Waypoint-Comment-out-HTML.md
@@ -0,0 +1,15 @@
+Commenting is a way that you can leave comments within your code without affecting the code itself.
+
+It is also a convenient way to make code inactive without having to delete it entirely.
+
+You can start a comment with `<!-- and end a comment with -->`.
+
+```
+<!--
+<h1>Hello World</h1>
+
+<h2>CatPhotoApp</h2>
+
+<p>Hello Paragraph</p>
+-->
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Create-a-Bulleted-Unordered-List.md b/data/wiki/Waypoint-Create-a-Bulleted-Unordered-List.md
new file mode 100644
index 0000000..67ac4b8
--- /dev/null
+++ b/data/wiki/Waypoint-Create-a-Bulleted-Unordered-List.md
@@ -0,0 +1,14 @@
+HTML has a special element for creating unordered lists, or bullet point-style lists.
+
+Unordered lists start with a `<ul>` element. Then they contain some number of `<li>` elements.
+
+For example:
+
+```
+<ul>
+  <li>milk</li>
+  <li>cheese</li>
+</ul>
+```
+
+would create a bullet point-style list of "milk" and "cheese".
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Create-a-Form-Element.md b/data/wiki/Waypoint-Create-a-Form-Element.md
new file mode 100644
index 0000000..3b9caea
--- /dev/null
+++ b/data/wiki/Waypoint-Create-a-Form-Element.md
@@ -0,0 +1,3 @@
+You can build web forms that actually submit data to a server using nothing more than pure HTML. You can do this by specifying an action on your `form` element. 
+
+For example: `<form action="/url-where-you-want-to-submit-form-data"></form>`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Create-a-Set-of-Checkboxes.md b/data/wiki/Waypoint-Create-a-Set-of-Checkboxes.md
new file mode 100644
index 0000000..adf428a
--- /dev/null
+++ b/data/wiki/Waypoint-Create-a-Set-of-Checkboxes.md
@@ -0,0 +1,5 @@
+Checkboxes are a type of input.
+- Each of your checkboxes should be nested within its own label element.
+- All related checkbox inputs should have the same name attribute.
+
+Here's an example of a checkbox: `<label><input type="checkbox" name="personality"> Loving</label>`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Create-a-Set-of-Radio-Buttons.md b/data/wiki/Waypoint-Create-a-Set-of-Radio-Buttons.md
new file mode 100644
index 0000000..7640203
--- /dev/null
+++ b/data/wiki/Waypoint-Create-a-Set-of-Radio-Buttons.md
@@ -0,0 +1,5 @@
+You can use radio buttons for questions where you want the user to only give you one answer.
+
+Radio buttons are a type of input. They should all be nested in their own label element. Furthermore, all related radio buttons should have the same name attribute.
+
+Here's an example of a radio button: `<label><input type="radio" name="indoor-outdoor"> Indoor</label>`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Create-a-Text-Field.md b/data/wiki/Waypoint-Create-a-Text-Field.md
new file mode 100644
index 0000000..7f75c07
--- /dev/null
+++ b/data/wiki/Waypoint-Create-a-Text-Field.md
@@ -0,0 +1,3 @@
+Text inputs are a convenient way to get input from your user.
+
+You can create one like this: `<input type="text">`. Note that input elements are self-closing.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Create-an-Ordered-List.md b/data/wiki/Waypoint-Create-an-Ordered-List.md
new file mode 100644
index 0000000..f4486aa
--- /dev/null
+++ b/data/wiki/Waypoint-Create-an-Ordered-List.md
@@ -0,0 +1,14 @@
+HTML has a special element for creating ordered lists, or numbered-style lists.
+
+Ordered lists start with a `<ol>` element. Then they contain some number of `<li>` elements.
+
+For example:
+
+```
+<ol>
+  <li>hydrogen</li>
+  <li>helium</li>
+</ol>
+```
+
+would create a numbered list of "hydrogen" and "helium".
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Delete-HTML-Elements.md b/data/wiki/Waypoint-Delete-HTML-Elements.md
new file mode 100644
index 0000000..133e867
--- /dev/null
+++ b/data/wiki/Waypoint-Delete-HTML-Elements.md
@@ -0,0 +1 @@
+Deleting elements is very simple. All you have to do is remove everything from the opening to the closing of the element and it will be removed. No extra code is needed.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Fill-in-the-Blank-with-Placeholder-Text.md b/data/wiki/Waypoint-Fill-in-the-Blank-with-Placeholder-Text.md
new file mode 100644
index 0000000..327c9e2
--- /dev/null
+++ b/data/wiki/Waypoint-Fill-in-the-Blank-with-Placeholder-Text.md
@@ -0,0 +1,11 @@
+Web developers traditionally use **lorem ipsum** text as placeholder text. It's called lorem ipsum text because those are the first two words of a famous passage by Cicero of Ancient Rome.
+
+**lorem ipsum** text has been used as placeholder text by typesetters since the 16th century, and this tradition continues on the web.
+
+```
+<h1>Hello World</h1>
+
+<h2>CatPhotoApp</h2>
+
+<p>Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.</p>
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Give-a-Background-Color-to-a-Div-Element.md b/data/wiki/Waypoint-Give-a-Background-Color-to-a-Div-Element.md
new file mode 100644
index 0000000..485a99e
--- /dev/null
+++ b/data/wiki/Waypoint-Give-a-Background-Color-to-a-Div-Element.md
@@ -0,0 +1,3 @@
+You can set an element's background color with the `background-color` attribute.
+
+For example, if you wanted an element's background color to be green, you'd use `.green-background { background-color: green; }` within your `style` element.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Headline-with-the-h2-Element.md b/data/wiki/Waypoint-Headline-with-the-h2-Element.md
new file mode 100644
index 0000000..ec850b7
--- /dev/null
+++ b/data/wiki/Waypoint-Headline-with-the-h2-Element.md
@@ -0,0 +1,6 @@
+You can create different levels of Heading elements by using **h1, h2, h3, h4, h5, h6** which will result on different sizes.
+
+```
+<h1>Hello World</h1>
+<h2>CatPhotoApp</h2>
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Import-a-Google-Font.md b/data/wiki/Waypoint-Import-a-Google-Font.md
new file mode 100644
index 0000000..4c7e977
--- /dev/null
+++ b/data/wiki/Waypoint-Import-a-Google-Font.md
@@ -0,0 +1 @@
+To import a font from Google or any other site, this is the format that you should follow: `<link href="http://fonts.googleapis.com/css?family=Lobster" rel="stylesheet" type="text/css">`
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Inform-with-the-Paragraph-Element.md b/data/wiki/Waypoint-Inform-with-the-Paragraph-Element.md
new file mode 100644
index 0000000..b6d2352
--- /dev/null
+++ b/data/wiki/Waypoint-Inform-with-the-Paragraph-Element.md
@@ -0,0 +1,9 @@
+`p` elements are the preferred element for normal-sized paragraph text on websites. P is short for "paragraph".
+
+You can create a p element like so: `<p>I'm a p tag!</p>`.
+
+```
+<h1>Hello World</h1>
+<h2>CatPhotoApp</h2>
+<p>Hello Paragraph</p>
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Inherit-Styles-from-the-Body-Element.md b/data/wiki/Waypoint-Inherit-Styles-from-the-Body-Element.md
new file mode 100644
index 0000000..f1a351a
--- /dev/null
+++ b/data/wiki/Waypoint-Inherit-Styles-from-the-Body-Element.md
@@ -0,0 +1,13 @@
+The `body` element can be style just like any other.
+
+```
+<style>
+  body {
+    background-color: black;
+    color: green;
+    font-family: Monospace
+  }
+
+</style>
+<h1>Hello World</h1>
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Iterate-with-JavaScript-For-Loops.md b/data/wiki/Waypoint-Iterate-with-JavaScript-For-Loops.md
new file mode 100644
index 0000000..04d824b
--- /dev/null
+++ b/data/wiki/Waypoint-Iterate-with-JavaScript-For-Loops.md
@@ -0,0 +1,23 @@
+# Iterate with JavaScript For Loops
+The most common type of JavaScript loop is called a `for loop` because it runs `for` a specific number of times.
+
+```
+var ourArray = [];
+for(var i = 0; i < 5; i++) {
+  ourArray.push(i);
+}
+```
+
+ourArray will now contain [0,1,2,3,4]
+
+## More about for loops
+```
+for(var i = 0; i < 5; i++) {  // There are 3 parts here
+```
+There are three parts to for loop.  They are separated by semicolons.  
+
+1. The initialization: `var i = 0;` - This code runs only once at the start of the loop. It's usually used to declare the counter variable (with `var`) and initialize the counter (in this case it is set to 0).   
+
+2. The condition: `i < 5;` - The loop will run as long as this is `true`. That means that as soon as `i` is equal to 5, the loop will stop looping.  Note that the inside of the loop will never see `i` as 5 because it will stop before then.  If this condition is initially `false`, the loop will never execute.  
+
+3. The increment: `i++` - This code is run at the end of each loop. It's usually a simple increment (`++` operator), but can really be any mathematical transformation. It is used to move the counter (`i`) forward (or backwards, or whatever.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Link-to-External-Pages-with-Anchor-Elements.md b/data/wiki/Waypoint-Link-to-External-Pages-with-Anchor-Elements.md
new file mode 100644
index 0000000..2de3127
--- /dev/null
+++ b/data/wiki/Waypoint-Link-to-External-Pages-with-Anchor-Elements.md
@@ -0,0 +1,3 @@
+`a` elements, also known as anchor elements, are used to link to content outside of the current page.
+
+Here's an example: `<p>Here's a <a href="http://freecodecamp.com"> link to Free Code Camp</a> for you to follow.</p>`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Make-Circular-Images-with-a-Border-Radius.md b/data/wiki/Waypoint-Make-Circular-Images-with-a-Border-Radius.md
new file mode 100644
index 0000000..9c257d4
--- /dev/null
+++ b/data/wiki/Waypoint-Make-Circular-Images-with-a-Border-Radius.md
@@ -0,0 +1,10 @@
+You can also use percentage to `border-radius` to make things round.
+
+```
+.thick-green-border {
+  border-color: green;
+  border-width: 10px;
+  border-style: solid;
+  border-radius: 50%;
+}
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Make-Dead-Links-using-the-Hash-Symbol.md b/data/wiki/Waypoint-Make-Dead-Links-using-the-Hash-Symbol.md
new file mode 100644
index 0000000..f349923
--- /dev/null
+++ b/data/wiki/Waypoint-Make-Dead-Links-using-the-Hash-Symbol.md
@@ -0,0 +1,3 @@
+Replace your a element's `href` attribute with a `#`, also known as a hash symbol, to turn it into a dead link. Sometimes you want to add a elements to your website before you know where they will link.
+
+This is also handy when you're changing the behavior of a link using jQuery, which we'll learn about later.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Nest-Many-Elements-within-a-Single-Div-Element.md b/data/wiki/Waypoint-Nest-Many-Elements-within-a-Single-Div-Element.md
new file mode 100644
index 0000000..931ab29
--- /dev/null
+++ b/data/wiki/Waypoint-Nest-Many-Elements-within-a-Single-Div-Element.md
@@ -0,0 +1,23 @@
+The `div` element, also known as a division element, is a general purpose container for other elements.
+
+The div element is probably the most commonly used HTML element of all. It's useful for passing the CSS of its own class declarations down to all the elements that it contains.
+
+Just like any other non-self-closing element, you can open a `div` element with `<div>` and close it on another line with `</div>`.
+
+```
+<div>
+ <p>Things cats love:</p>
+ <ul>
+   <li>cat nip</li>
+   <li>laser pointers</li>
+   <li>lasagna</li>
+ </ul>
+ <p>Top 3 things cats hate:</p>
+ <ol>
+   <li>flea treatment</li>
+   <li>thunder</li>
+   <li>other cats</li>
+ </ol>
+</div>
+>
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Nest-an-Anchor-Element-within-a-Paragraph.md b/data/wiki/Waypoint-Nest-an-Anchor-Element-within-a-Paragraph.md
new file mode 100644
index 0000000..cc4a7f9
--- /dev/null
+++ b/data/wiki/Waypoint-Nest-an-Anchor-Element-within-a-Paragraph.md
@@ -0,0 +1 @@
+Nesting is simple, just add one element inside another: `<p> click here for <a href="http://www.catphotoapp.com">cat photos</a></p>`
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Override-All-Other-Styles-by-using-Important.md b/data/wiki/Waypoint-Override-All-Other-Styles-by-using-Important.md
new file mode 100644
index 0000000..16a4f56
--- /dev/null
+++ b/data/wiki/Waypoint-Override-All-Other-Styles-by-using-Important.md
@@ -0,0 +1,3 @@
+In many situations, you will use CSS libraries. These may accidentally override your own CSS. So when you absolutely need to be sure that an element has specific CSS, you can use !important.
+
+An example of how to do this is: `color: red !important;` This will make sure that we use the wanted property regardless of other overrides.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Override-Class-Declarations-by-Styling-ID-Attributes.md b/data/wiki/Waypoint-Override-Class-Declarations-by-Styling-ID-Attributes.md
new file mode 100644
index 0000000..ff65d8a
--- /dev/null
+++ b/data/wiki/Waypoint-Override-Class-Declarations-by-Styling-ID-Attributes.md
@@ -0,0 +1,19 @@
+We can use `id` to override  styling too.
+
+```
+<style>
+  body {
+    background-color: black;
+    font-family: Monospace;
+    color: green;
+  }
+  .pink-text {
+    color: pink;
+  }
+  .blue-text {
+    color: blue;
+  }
+  #orange-text{color:orange;}
+</style>
+<h1 class="pink-text blue-text" id="orange-text">Hello World!</h1>
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Override-Class-Declarations-with-Inline-Styles.md b/data/wiki/Waypoint-Override-Class-Declarations-with-Inline-Styles.md
new file mode 100644
index 0000000..b88c43f
--- /dev/null
+++ b/data/wiki/Waypoint-Override-Class-Declarations-with-Inline-Styles.md
@@ -0,0 +1 @@
+Remember, in line styles look like this: `<h1 style="color: green">` They will override everything else that was changing the text color of h1.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Override-Styles-in-Subsequent-CSS.md b/data/wiki/Waypoint-Override-Styles-in-Subsequent-CSS.md
new file mode 100644
index 0000000..9c01f34
--- /dev/null
+++ b/data/wiki/Waypoint-Override-Styles-in-Subsequent-CSS.md
@@ -0,0 +1 @@
+Your classes will override the body's CSS, if we add a new class that changes the same property, the last one will be the one applied.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Prioritize-One-Style-Over-Another.md b/data/wiki/Waypoint-Prioritize-One-Style-Over-Another.md
new file mode 100644
index 0000000..ba1e66d
--- /dev/null
+++ b/data/wiki/Waypoint-Prioritize-One-Style-Over-Another.md
@@ -0,0 +1,15 @@
+Classes to individual elements take priority over general styles.
+
+```
+<style>
+  body {
+    background-color: black;
+    font-family: Monospace;
+    color: green;
+  }
+  .pink-text{color: pink;}
+</style>
+<h1 class="pink-text">Hello World!</h1>
+```
+
+This makes for a pink h1 instead of a green one.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Say-Hello-to-HTML-Elements.md b/data/wiki/Waypoint-Say-Hello-to-HTML-Elements.md
new file mode 100644
index 0000000..530565a
--- /dev/null
+++ b/data/wiki/Waypoint-Say-Hello-to-HTML-Elements.md
@@ -0,0 +1,7 @@
+HTML elements are written with a start tag, with an end tag, with the content in between:
+
+`<tagname>content</tagname>` The HTML element is everything from the start tag to the end tag:
+
+`<p>My first HTML paragraph.</p>`
+
+Opening tags look like this: `<h1>`. Closing tags look like this: `</h1>`  Note that the only difference between opening tags and closing tags is that closing tags have a slash after their opening angle bracket.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Set-the-Font-Family-of-an-Element.md b/data/wiki/Waypoint-Set-the-Font-Family-of-an-Element.md
new file mode 100644
index 0000000..4c7e977
--- /dev/null
+++ b/data/wiki/Waypoint-Set-the-Font-Family-of-an-Element.md
@@ -0,0 +1 @@
+To import a font from Google or any other site, this is the format that you should follow: `<link href="http://fonts.googleapis.com/css?family=Lobster" rel="stylesheet" type="text/css">`
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Set-the-ID-of-an-Element.md b/data/wiki/Waypoint-Set-the-ID-of-an-Element.md
new file mode 100644
index 0000000..3253028
--- /dev/null
+++ b/data/wiki/Waypoint-Set-the-ID-of-an-Element.md
@@ -0,0 +1,7 @@
+In addition to classes, each HTML element can also have an `id` attribute.
+
+There are several benefits to using id attributes, and you'll learn more about them once you start using jQuery.
+
+`id` attributes should be unique. Browsers won't enforce this, but it is a widely agreed upon best practice. So please don't give more than one element the same id attribute.
+
+Here's an example of how you give your h2 element the id of cat-photo-app: <h2 id="cat-photo-app">
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Size-your-Images.md b/data/wiki/Waypoint-Size-your-Images.md
new file mode 100644
index 0000000..6b28bf7
--- /dev/null
+++ b/data/wiki/Waypoint-Size-your-Images.md
@@ -0,0 +1,3 @@
+CSS has an attribute called `width` that controls an element's width. Just like with fonts, we'll use `px` (pixels) to specify the image's width.
+
+For example, if we wanted to create a CSS class called larger-image that gave HTML elements a width of 500 pixels, we'd use: `<style> .larger-image { width: 500px; } </style>`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Specify-How-Fonts-Should-Degrade.md b/data/wiki/Waypoint-Specify-How-Fonts-Should-Degrade.md
new file mode 100644
index 0000000..686a5c2
--- /dev/null
+++ b/data/wiki/Waypoint-Specify-How-Fonts-Should-Degrade.md
@@ -0,0 +1,3 @@
+There are several default fonts that are available in all browsers. These include `Monospace`, `Serif` and `Sans-Serif`.
+
+For example, if you wanted an element to use the `Helvetica` font, but also degrade to the `Sans-Serif` font when `Helvetica` wasn't available, you could use this CSS style: `p { font-family: Helvetica, Sans-Serif; }`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Style-the-HTML-Body-Element.md b/data/wiki/Waypoint-Style-the-HTML-Body-Element.md
new file mode 100644
index 0000000..fa51843
--- /dev/null
+++ b/data/wiki/Waypoint-Style-the-HTML-Body-Element.md
@@ -0,0 +1 @@
+Every HTML page has the `body` element. and it is like the main page.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Turn-an-Image-into-a-Link.md b/data/wiki/Waypoint-Turn-an-Image-into-a-Link.md
new file mode 100644
index 0000000..8865eac
--- /dev/null
+++ b/data/wiki/Waypoint-Turn-an-Image-into-a-Link.md
@@ -0,0 +1 @@
+Creating images that link to things is essential and one of the most used things in Web Dev. Nest your image within an `a` element. Here's an example: `<a href="#"><img src="http://bit.ly/fcc-running-cats"/></a>`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Uncomment-HTML.md b/data/wiki/Waypoint-Uncomment-HTML.md
new file mode 100644
index 0000000..7cbc2e3
--- /dev/null
+++ b/data/wiki/Waypoint-Uncomment-HTML.md
@@ -0,0 +1,5 @@
+Given that there are two ways to write comments in JavaScript:
+1. Using `//`
+2. Using `<!-- text -->`
+
+You can easily uncomment by just removing the comment elements.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-Abbreviated-Hex-Code.md b/data/wiki/Waypoint-Use-Abbreviated-Hex-Code.md
new file mode 100644
index 0000000..9e14668
--- /dev/null
+++ b/data/wiki/Waypoint-Use-Abbreviated-Hex-Code.md
@@ -0,0 +1,11 @@
+red, which is `#FF0000` in hex code, can be shortened to `#F00`. That is, one digit for red, one digit for green, one digit for blue.
+
+This reduces the total number of possible colors to around 4,000. But browsers will interpret `#FF0000` and `#F00` as exactly the same color.
+
+```
+<style>
+  body {
+    background-color: #F00;
+  }
+</style>
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-CSS-Selectors-to-Style-Elements.md b/data/wiki/Waypoint-Use-CSS-Selectors-to-Style-Elements.md
new file mode 100644
index 0000000..b39c4d0
--- /dev/null
+++ b/data/wiki/Waypoint-Use-CSS-Selectors-to-Style-Elements.md
@@ -0,0 +1,7 @@
+Instead of giving style attributes one by one, we can do this to multiple elements at the same time.
+
+You can create a style element like this: `<style></style>`.
+
+Inside that style element, you can create a CSS selector for any HTML Elements. For example, if you wanted all h2 elements to be red, your style element would look like this: `<style>h2 {color: red;}</style>`.
+
+Note that it's important to have both opening and closing curly braces `({` and `})` around each element's style. You also need to make sure your element's style is between the opening and closing style tags. Finally, be sure to add the semicolon to the end of each of your element's styles.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-Clockwise-Notation-to-Specify-the-Margin-of-an-Element.md b/data/wiki/Waypoint-Use-Clockwise-Notation-to-Specify-the-Margin-of-an-Element.md
new file mode 100644
index 0000000..7db9504
--- /dev/null
+++ b/data/wiki/Waypoint-Use-Clockwise-Notation-to-Specify-the-Margin-of-an-Element.md
@@ -0,0 +1,10 @@
+Instead of specifying an element's`margin-top`, `margin-right`, `margin-bottom`, and `margin-left` attributes, you can specify them all in one line, like this: `margin: 10px 20px 10px 20px;`.
+
+These four values work like a clock: top, right, bottom, left, and will produce the exact same result as using the side-specific margin instructions.
+
+```
+.green-box {
+  background-color: green;
+  margin: 40px 20px 20px 40px;
+}
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-Clockwise-Notation-to-Specify-the-Padding-of-an-Element.md b/data/wiki/Waypoint-Use-Clockwise-Notation-to-Specify-the-Padding-of-an-Element.md
new file mode 100644
index 0000000..3419028
--- /dev/null
+++ b/data/wiki/Waypoint-Use-Clockwise-Notation-to-Specify-the-Padding-of-an-Element.md
@@ -0,0 +1,10 @@
+Instead of specifying an element's `padding-top`, `padding-right`, `padding-bottom`, and `padding-lef`t attributes, you can specify them all in one line, like this: `padding: 10px 20px 10px 20px;`.
+
+These four values work like a clock: top, right, bottom, left, and will produce the exact same result as using the side-specific padding instructions.
+
+```
+.green-box {
+  background-color: green;
+  padding: 40px 20px 20px 40px
+}
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-HTML5-to-Require-a-Field.md b/data/wiki/Waypoint-Use-HTML5-to-Require-a-Field.md
new file mode 100644
index 0000000..c351dfa
--- /dev/null
+++ b/data/wiki/Waypoint-Use-HTML5-to-Require-a-Field.md
@@ -0,0 +1,10 @@
+You can require specific form fields so that your user will not be able to submit your form until he or she has filled them out.
+
+For example, if you wanted to make a text input field required, you can just add the word required within your input element, you would use: `<input type="text" required>`.
+
+```
+<form action="/submit-cat-photo">
+  <input type="text" placeholder="cat photo URL" required>
+  <button type="submit">Submit</button>
+</form>
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-Hex-Code-for-Specific-Colors.md b/data/wiki/Waypoint-Use-Hex-Code-for-Specific-Colors.md
new file mode 100644
index 0000000..fc7398e
--- /dev/null
+++ b/data/wiki/Waypoint-Use-Hex-Code-for-Specific-Colors.md
@@ -0,0 +1,3 @@
+With CSS, we use 6 hexadecimal number to represent colors. For example, `#000000` is the lowest possible value, and it represents the color black.
+
+This is the same as `#RRGGBB` which can also be simplified to `#RGB`.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-Hex-Code-for-Specific-Shades-of-Gray.md b/data/wiki/Waypoint-Use-Hex-Code-for-Specific-Shades-of-Gray.md
new file mode 100644
index 0000000..50e6970
--- /dev/null
+++ b/data/wiki/Waypoint-Use-Hex-Code-for-Specific-Shades-of-Gray.md
@@ -0,0 +1 @@
+We can also create other shades of gray by evenly mixing all three colors. We can go very close to true black. `background-color: #111111;`
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Blue.md b/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Blue.md
new file mode 100644
index 0000000..428af23
--- /dev/null
+++ b/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Blue.md
@@ -0,0 +1,9 @@
+Just as with [red](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Red) and the others.
+
+```
+<style>
+  body {
+    background-color: #0000FF;
+  }
+</style>
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Gray.md b/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Gray.md
new file mode 100644
index 0000000..fdbe1a2
--- /dev/null
+++ b/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Gray.md
@@ -0,0 +1 @@
+We can also create different shades of gray by evenly mixing all three colors. `background-color: #808080;`
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Green.md b/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Green.md
new file mode 100644
index 0000000..afc5e58
--- /dev/null
+++ b/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Green.md
@@ -0,0 +1,9 @@
+Just as with [red](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Red) and the others.
+
+```
+<style>
+  body {
+    background-color: #00FF00;
+  }
+</style>
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Red.md b/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Red.md
new file mode 100644
index 0000000..d114b7b
--- /dev/null
+++ b/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Red.md
@@ -0,0 +1,3 @@
+Hex code follows the red-green-blue, or rgb format. The first two digits of hex code represent the amount of red in the color. The third and fourth digit represent the amount of green. The fifth and sixth represent the amount of blue.
+
+So to get the absolute brightest red, you would just use `F` for the first and second digits (the highest possible value) and `0` for the third, fourth, fifth and sixth digits (the lowest possible value).
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-White.md b/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-White.md
new file mode 100644
index 0000000..0168eae
--- /dev/null
+++ b/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-White.md
@@ -0,0 +1 @@
+`0` is the lowest number in hex code, and represents a complete absence of color. `F` is the highest number in hex code, and it represents the maximum possible brightness.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-Hex-Code-to-Mix-Colors.md b/data/wiki/Waypoint-Use-Hex-Code-to-Mix-Colors.md
new file mode 100644
index 0000000..9eb089d
--- /dev/null
+++ b/data/wiki/Waypoint-Use-Hex-Code-to-Mix-Colors.md
@@ -0,0 +1,9 @@
+Orange is pure red, mixed with some green, and no blue.
+
+```
+<style>
+  body {
+    background-color: #FFA500;
+  }
+</style>
+```
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Blue.md b/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Blue.md
new file mode 100644
index 0000000..6396043
--- /dev/null
+++ b/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Blue.md
@@ -0,0 +1 @@
+The RGB value blue: `rgb(0, 0, 255)`
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Gray.md b/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Gray.md
new file mode 100644
index 0000000..0dc39f8
--- /dev/null
+++ b/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Gray.md
@@ -0,0 +1 @@
+RGB value for gray: `rgb(128, 128, 128)`
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Green.md b/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Green.md
new file mode 100644
index 0000000..65330d0
--- /dev/null
+++ b/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Green.md
@@ -0,0 +1 @@
+The rgb value green: `rgb(0, 255, 0)`
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Red.md b/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Red.md
new file mode 100644
index 0000000..4705b36
--- /dev/null
+++ b/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Red.md
@@ -0,0 +1 @@
+`background-color: rgb(255, 0, 0)`
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-RGB-to-Color-Elements-White.md b/data/wiki/Waypoint-Use-RGB-to-Color-Elements-White.md
new file mode 100644
index 0000000..a34d6da
--- /dev/null
+++ b/data/wiki/Waypoint-Use-RGB-to-Color-Elements-White.md
@@ -0,0 +1 @@
+`background-color: rgb(255,255,255)`
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-RGB-to-Mix-Colors.md b/data/wiki/Waypoint-Use-RGB-to-Mix-Colors.md
new file mode 100644
index 0000000..f494b7f
--- /dev/null
+++ b/data/wiki/Waypoint-Use-RGB-to-Mix-Colors.md
@@ -0,0 +1 @@
+RGB value orange: `rgb(255, 165, 0)`
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-RGB-values-to-Color-Elements.md b/data/wiki/Waypoint-Use-RGB-values-to-Color-Elements.md
new file mode 100644
index 0000000..65cd00d
--- /dev/null
+++ b/data/wiki/Waypoint-Use-RGB-values-to-Color-Elements.md
@@ -0,0 +1,5 @@
+Another way you can represent colors in CSS is by using `rgb` values.
+
+RGB values look like this: `rgb(0, 0, 0)` for black and `rgb(255, 255, 255)` for white.
+
+Instead of using six hexadecimal digits like you do with hex code, with rbg you specify the brightness of each color with a number between 0 and 255. `background-color: rgb(0,0,0);`
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-a-CSS-Class-to-Style-an-Element.md b/data/wiki/Waypoint-Use-a-CSS-Class-to-Style-an-Element.md
new file mode 100644
index 0000000..be2b659
--- /dev/null
+++ b/data/wiki/Waypoint-Use-a-CSS-Class-to-Style-an-Element.md
@@ -0,0 +1,3 @@
+Classes are reusable styles that can be added to HTML elements. You can apply a class to an HTML element like this: `<h2 class="blue-text">CatPhotoApp</h2>`.
+
+Note that in your CSS style element, classes should start with a period. In your HTML elements' class declarations, classes shouldn't start with a period.
\ No newline at end of file
diff --git a/data/wiki/Waypoint-Use-an-ID-Attribute-to-Style-an-Element.md b/data/wiki/Waypoint-Use-an-ID-Attribute-to-Style-an-Element.md
new file mode 100644
index 0000000..250f01f
--- /dev/null
+++ b/data/wiki/Waypoint-Use-an-ID-Attribute-to-Style-an-Element.md
@@ -0,0 +1,7 @@
+One cool thing about `id` attributes is that, like classes, you can style them using CSS.
+
+Here's an example of how you can take your element with the `id` attribute of cat-photo-element and give it the background color of green.
+
+In your style element: `#cat-photo-element { background-color: green; }`
+
+Note that inside your style element, you always reference classes by putting a `.` in front of their names. You always reference ids by putting a `#` in front of their names.
\ No newline at end of file
diff --git a/data/wiki/What-exactly-Free-Code-Camp-does.md b/data/wiki/What-exactly-Free-Code-Camp-does.md
new file mode 100644
index 0000000..59a5e9f
--- /dev/null
+++ b/data/wiki/What-exactly-Free-Code-Camp-does.md
@@ -0,0 +1,4 @@
+We help our campers (students):
+- Learn full stack JavaScript
+- Build a portfolio of real apps that real people are using
+- Get a coding job
\ No newline at end of file
diff --git a/data/wiki/What-pair-programming-is-and-why-it-is-special.md b/data/wiki/What-pair-programming-is-and-why-it-is-special.md
new file mode 100644
index 0000000..79699cb
--- /dev/null
+++ b/data/wiki/What-pair-programming-is-and-why-it-is-special.md
@@ -0,0 +1,11 @@
+Pair programming is where two people code together on one computer.
+
+![](http://cs10.org/sp15/resources/images/pairprogramming.jpg)
+
+Pair programming encourages you to discuss different approaches to solving problems, and to keep one another other motivated. The result is better code than either of you could have written by yourselves. 
+
+Because of its benefits, many engineers pair program full time. And it's the best way to learn coding. Thanks to tools that allow two people to share mouse and keyboard inputs, you can pair program with a friend without needing to be in the same room.
+
+You can experience these benefits by pair programming with other Free Code Camp students on our coding challenges. Eventually, you'll work with people at nonprofits to build real-life software solutions.
+
+Here's [why you should try pair programming](https://github.com/FreeCodeCamp/freecodecamp/wiki/Why-You-Should-Try-Pair-Programming) and here are some tips on [how to be a good pair programmer](https://github.com/FreeCodeCamp/freecodecamp/wiki/Tips-on-How-To-Become-A-Good-Pair-Programmer).
diff --git a/data/wiki/What-the-main-advantages-of-Free-Code-Camp-are.md b/data/wiki/What-the-main-advantages-of-Free-Code-Camp-are.md
new file mode 100644
index 0000000..e0dcb3b
--- /dev/null
+++ b/data/wiki/What-the-main-advantages-of-Free-Code-Camp-are.md
@@ -0,0 +1,10 @@
+Free Code Camp's main advantages are that we're accessible to busy adults who want to change careers.
+
+Specifically, we're:
+
+* Free
+* Self-paced
+* Browser-based
+
+One of the most noticeable differences in this curriculum than other Code-Camp/School environments is the level of support: Using the chat-rooms for help, guidance, and assisting fellow coders gives you a better understanding of the code, easier access to explanations, and it's in real-time so you can question the confusion.
+
diff --git a/data/wiki/What-the-style-guide-for-Bonfires-is.md b/data/wiki/What-the-style-guide-for-Bonfires-is.md
new file mode 100644
index 0000000..405e0c7
--- /dev/null
+++ b/data/wiki/What-the-style-guide-for-Bonfires-is.md
@@ -0,0 +1,15 @@
+Writing Bonfire challenges is a great way to exercise your own problem solving and testing abilities. Follow this process closely to maximize the chances of us accepting your bonfire.
+
+- Fork the Free Code Camp repository and open `seed_data/bonfires.json` to become familiar with the format of our bonfires.
+- Regardless of your bonfire's difficulty, put it as the last bonfire in the JSON file. Change one of the numbers in the ID to ensure that your bonfire has a unique ID.
+- In the terminal, run `node seed_data/seed.js`. Run `gulp`. You should be able to navigate to your new bonfire in the challenge map. Whenever you make a change to bonfire.json, you'll need to reseed in order to see these changes in the browser.
+- Solve your own Bonfire. Confirm that your tests work as expected and that your instructions are sufficiently clear.
+- Submit a pull request to Free Code Camp's Staging branch and in the pull request body, link to a gist that has your algorithmic solution.
+
+Here is a description of each of the Bonfires' fields.
+- Name - The name of your challenge. It's OK for this to be humorous but it must be brief and relevant to the task.
+- Difficulty - Attempt to rate difficulty compared against existing bonfire challenges. A good proxy for the difficulty of a bonfire is how long it takes you to solve it. For every 15 minutes it takes, increase the difficulty. For example, a one-hour bonfire should probably be a 4.
+- Description- Separate paragraphs with a line break. Only the first paragraph is visible prior to a user before they click the the 'More information' button. All necessary information must be included in the first paragraph. Write this first paragraph as succinctly as possible. Subsequent paragraphs should offer hints or details if needed. If your subject matter warrants deeper understanding, you may link to Wikipedia.
+- Challenge Seed - This is where you set up what will be in the editor when the camper starts the bonfire.
+- Tests - These tests are what bring your challenge to life. Without them, we cannot confirm the accuracy of a user's submitted answer. Choose your tests wisely. Bonfire tests are written using the Chai.js assertion library. Please use the should and expect syntax for end user readability. As an example of what not do to, many of the original Bonfire challenges are written with assert syntax and many of the test cases are difficult to read. If your bonfire question has a lot of edge cases, you will need to write many tests for full coverage. If you find yourself writing more tests than you desire, you may consider simplifying the requirements of your bonfire challenge. For difficulty level 1 through 3, you will generally only need 2 to 4 tests.
+- MDNlinks- Take a look at `seed_data/bonfireMDNlinks.js`. If any of these concepts are relevant to your bonfire, be sure to include them. If you know of an MDN article that isn't linked here, you can add it to the bonfireMDNlinks.js file before adding it to your bonfire.
\ No newline at end of file
diff --git a/data/wiki/What-to-do-if-you-speak-a-language-that-Free-Code-Camp-does-not-yet-support.md b/data/wiki/What-to-do-if-you-speak-a-language-that-Free-Code-Camp-does-not-yet-support.md
new file mode 100644
index 0000000..ccb9114
--- /dev/null
+++ b/data/wiki/What-to-do-if-you-speak-a-language-that-Free-Code-Camp-does-not-yet-support.md
@@ -0,0 +1,7 @@
+Translation is an all-or-nothing proposal.
+
+We won't be able to add new languages to Free Code Camp until all of our challenges are translated into that language.
+
+In addition to translating these initially, we'll also need to maintain the translation as the challenges are gradually updated.
+
+If you're able to help us, you can join our [translation Trello board](https://trello.com/b/m7zhwXka/fcc-translation) by sending @quincylarson your email address in Gitter.
\ No newline at end of file
diff --git a/data/wiki/What-you-will-learn,-and-in-what-sequence-you-will-learn-it.md b/data/wiki/What-you-will-learn,-and-in-what-sequence-you-will-learn-it.md
new file mode 100644
index 0000000..da8ad2b
--- /dev/null
+++ b/data/wiki/What-you-will-learn,-and-in-what-sequence-you-will-learn-it.md
@@ -0,0 +1,12 @@
+- [HTML5](https://developer.mozilla.org/en-US/docs/Web/HTML) - the structure of web pages
+- [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) - the visual style of web pages
+- [Bootstrap](http://getbootstrap.com/) - a "responsive design" tool that helps your websites look great on tablets and phones
+- [jQuery](https://jquery.com/) and [Ajax] (https://developer.mozilla.org/en-US/docs/AJAX) - easy tools for controlling content in the browser
+- [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript) - the one programming language that all web browsers use
+- [Algorithms](https://en.wikipedia.org/wiki/Algorithm) - step-by-step recipes for getting things done
+- [Git](https://git-scm.com/) - a version control system for saving and sharing your projects
+- [MongoDB](https://www.mongodb.org/) - a popular non-relational database
+- [Angular.js](https://angularjs.org/) - a tool for making exciting web interfaces
+- [Express.js](http://expressjs.com/)- a powerful web development framework
+- [Node.js](https://nodejs.org/) - a platform for creating scalable network applications.
+- [Agile](https://en.wikipedia.org/wiki/Agile_software_development) - a set of software development principles that focus the design and production of a project on the needs of its users
\ No newline at end of file
diff --git a/data/wiki/Why-You-Should-Try-Pair-Programming.md b/data/wiki/Why-You-Should-Try-Pair-Programming.md
new file mode 100644
index 0000000..4f109b8
--- /dev/null
+++ b/data/wiki/Why-You-Should-Try-Pair-Programming.md
@@ -0,0 +1,24 @@
+#### When I started working through my first bonfires, I was really scared of speaking to strangers. What would this person think about me? 
+Would I even be able to write good code with someone watching me?
+
+Now, some weeks later I've pair programmed and reviewed code with more than 40 campers and let me tell you: it's not as scary as it seems.
+It's perfectly normal to feel that way. Most of the campers that I've talked to agree that they were nervous too.
+
+**Here are a few good reasons to try pair programming** (I wish I knew this when I started...):
+
+### You can...
+- Build your professional network
+- Meet new friends - develop a support group
+- Improve social skills
+- Get motivation and encouragement from fellow campers
+- See other's coding styles
+- Learn from each other
+- Strengthen your strengths and get help finding and improving your weaknesses
+- Pair with **more** experienced dev to **improve your skills**
+- Pair with **less** experienced dev to **test your knowledge**
+- Gain a new skill that will be useful for interviews and employment down the road
+
+With the right person, pair programming is one of the best ways to learn at the same time as you make new friends!
+[You might also want to know how you could be a good pair programmer!](https://github.com/FreeCodeCamp/freecodecamp/wiki/Tips-on-How-To-Become-A-Good-Pair-Programmer)
+
+// Samuel (gr33n) with help from Ryan (rsprice)
\ No newline at end of file
diff --git a/data/wiki/Why-does-Free-Code-Camp-use-JavaScript-instead-of-Ruby-or-Python.md b/data/wiki/Why-does-Free-Code-Camp-use-JavaScript-instead-of-Ruby-or-Python.md
new file mode 100644
index 0000000..1063c6e
--- /dev/null
+++ b/data/wiki/Why-does-Free-Code-Camp-use-JavaScript-instead-of-Ruby-or-Python.md
@@ -0,0 +1,7 @@
+Like JavaScript, Ruby and Python are high-level scripting languages that can be used for full stack web development.
+
+But even if you learned these languages, you'd still need to learn JavaScript. That's because JavaScript is the only language that runs in web browsers. JavaScript has been around for 20 years, and it is still growing in popularity.
+
+Because of this, JavaScript has more tools and online learning resources than any other language.
+
+![A chart showing the volume of new GitHub repositories by year, with JavaScript growing and most languages declining.](https://s3.amazonaws.com/freecodecamp/github-repo-growth.png)
\ No newline at end of file
diff --git a/data/wiki/Why-you-need-Free-Code-Camp..md b/data/wiki/Why-you-need-Free-Code-Camp..md
new file mode 100644
index 0000000..9f68cb5
--- /dev/null
+++ b/data/wiki/Why-you-need-Free-Code-Camp..md
@@ -0,0 +1,8 @@
+You need Free Code Camp because learning to code is hard.
+
+Most people who successfully learn to code:
+
+- Make friends with people who code
+- Code a little every day
+
+We give you the structure and the community you need so you can successfully learn to code.
\ No newline at end of file
diff --git a/data/wiki/Wiki-Style-Guide.md b/data/wiki/Wiki-Style-Guide.md
new file mode 100644
index 0000000..dedd2be
--- /dev/null
+++ b/data/wiki/Wiki-Style-Guide.md
@@ -0,0 +1,17 @@
+###"Wiki" is a Hawaiian word meaning "quick". Keep this in mind when creating wiki articles.
+
+We are always happy to help new contributors write, edit, and localize our wiki articles. Help us make Free Code Camp the best it can be. 
+
+You can create a new wiki page by clicking the "New Page" button at top right.
+
+Keep your wiki articles short and focused. Your articles should be no longer than this article.  If your article is longer than this, break it up smaller articles that link to each other.
+
+You can include images if they help you better communicate your subject. 
+
+Use descriptive, punctuation-free titles.
+
+Our wiki articles are [written in GitHub-flavor Markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet).
+
+If you have questions about contributing to the Free Code Camp Wiki message [@rafase282](https://gitter.im/rafase282) in [Gitter](https://github.com/FreeCodeCamp/freecodecamp/wiki/Gitter)
+
+We look forward to wiki-ing with you!
\ No newline at end of file
diff --git a/data/wiki/World-Language-Chat-Rooms.md b/data/wiki/World-Language-Chat-Rooms.md
new file mode 100644
index 0000000..5d6f155
--- /dev/null
+++ b/data/wiki/World-Language-Chat-Rooms.md
@@ -0,0 +1,25 @@
+The following are our language-specific chat rooms.
+
+**Please note that all chat rooms listed here are publicly accessible and indexed by search engines, so only share email addresses or other sensitive information in private messages.**
+
+- [Albanian](https://gitter.im/freecodecamp/Albanian)
+- [Arabic](https://gitter.im/freecodecamp/Arabic)
+- [Chinese](https://gitter.im/freecodecamp/Chinese)
+- [German](https://gitter.im/freecodecamp/Deutsch)
+- [Dutch](https://gitter.im/freecodecamp/Dutch)
+- [Spanish](https://gitter.im/freecodecamp/Espanol)
+- [French](https://gitter.im/freecodecamp/Francais)
+- [Japanese](https://gitter.im/freecodecamp/Japanese)
+- [Korean](https://gitter.im/freecodecamp/Korean)
+- [Persian](https://gitter.im/freecodecamp/Persian)
+- [Portugues](https://gitter.im/freecodecamp/Portugues)
+- [Romanian](https://gitter.im/freecodecamp/Romanian)
+- [Russian](https://gitter.im/freecodecamp/Russian)
+- [Swedish](https://gitter.im/freecodecamp/Swedish)
+- [Thai](https://gitter.im/freecodecamp/Thai)
+- [Tagalog](https://gitter.im/freecodecamp/Tagalog)
+- [Vietnamese](https://gitter.im/freecodecamp/Vietnamese)
+
+By joining these chat rooms, you accept our [Code of Conduct](https://github.com/FreeCodeCamp/freecodecamp/wiki/Code-of-Conduct).
+
+[Official Free Code Camp chat rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/Official-Free-Code-Camp-Chat-Rooms)
\ No newline at end of file
diff --git a/data/wiki/Writing-great-git-commit-message.md b/data/wiki/Writing-great-git-commit-message.md
new file mode 100644
index 0000000..dfe869b
--- /dev/null
+++ b/data/wiki/Writing-great-git-commit-message.md
@@ -0,0 +1,34 @@
+### The seven rules of a great git commit message
+
+1. Separate subject from body with a blank line
+2. Limit the subject line to 50 characters
+3. Capitalize the subject line
+4. Do not end the subject line with a period
+5. Use the imperative mood in the subject line
+6. Wrap the body at 72 characters
+7. Use the body to explain what and why vs. how
+
+**A properly formed git commit subject line should always be able to complete the following sentence:**
+
+> If applied, this commit will *`<<your subject line here>>`*
+
+## &nbsp;
+
+**For example:**
+
+* If applied, this commit will ***Refactor subsystem X for readability***
+* If applied, this commit will ***Update getting started documentation***
+* If applied, this commit will ***Remove deprecated methods***
+* If applied, this commit will ***Release version 1.0.0***
+* If applied, this commit will ***Merge pull request #123 from user/branch***
+
+**Notice how this doesn't work for the other non-imperative forms:**
+
+* If applied, this commit will *~~fixed bug with Y~~*
+* If applied, this commit will *~~changing behavior of X~~*
+* If applied, this commit will *~~more fixes for broken stuff~~*
+* If applied, this commit will *~~sweet new API methods~~*
+
+**Remember:** *Use of the imperative is important only in the subject line. You can relax this restriction when you're writing the body.*
+
+**Reference:** http://chris.beams.io/posts/git-commit
\ No newline at end of file
diff --git a/data/wiki/You-will-be-able-to-get-a-software-engineering-job-after-Free-Code-Camp.md b/data/wiki/You-will-be-able-to-get-a-software-engineering-job-after-Free-Code-Camp.md
new file mode 100644
index 0000000..fcddedb
--- /dev/null
+++ b/data/wiki/You-will-be-able-to-get-a-software-engineering-job-after-Free-Code-Camp.md
@@ -0,0 +1,10 @@
+If you complete Free Code Camp, *you will be able to get a coding job.* Dozens of our campers have already gotten coding jobs.
+
+![](https://www.evernote.com/shard/s116/sh/55c128c7-5d99-41cc-b03d-b3de22611c8d/b43e467b3889f646fec34bb4c161e2a2/deep/0/What's-wrong-with-this-picture----Code.org.png)
+
+Here are the facts:
+
+- There are hundreds of thousands of unfilled coding jobs.
+- Employers and the US government have joined together to promote nontraditional coding programs like Free Code Camp.
+- Full stack JavaScript is one of best paying skill sets, and has a ton of job openings.
+- The best proof that you're an employable developer is a portfolio filled with real apps that real people are using.
\ No newline at end of file
diff --git a/data/wiki/_Footer.md b/data/wiki/_Footer.md
new file mode 100644
index 0000000..6fab46c
--- /dev/null
+++ b/data/wiki/_Footer.md
@@ -0,0 +1,7 @@
+We help you learn to code, then practice by building projects for nonprofits. Learn Full-stack JavaScript, build a portfolio, and get a coding job by joining our open source community at http://freecodecamp.com
+
+[Follow Quincy on Quora](http://www.quora.com/Quincy-Larson/answers)  
+[Follow us on Twitter](https://twitter.com/intent/user?screen_name=freecodecamp)  
+[Like us on Facebook](https://www.facebook.com/freecodecamp)  
+[Follow us on Twitch](http://twitch.tv/freecodecamp)  
+And be sure to click the "Star" button in the upper right of this page.
\ No newline at end of file
diff --git a/data/wiki/_Sidebar.md b/data/wiki/_Sidebar.md
new file mode 100644
index 0000000..f28cc72
--- /dev/null
+++ b/data/wiki/_Sidebar.md
@@ -0,0 +1,12 @@
+New to Free Code Camp? Take a few minutes to browse these wiki articles:
+- [What exactly Free Code Camp does](https://github.com/FreeCodeCamp/freecodecamp/wiki/What-exactly-Free-Code-Camp-does)
+- [Why you need Free Code Camp](https://github.com/FreeCodeCamp/freecodecamp/wiki/Why-you-need-Free-Code-Camp.)
+- [What the main advantages of Free Code Camp are](https://github.com/FreeCodeCamp/freecodecamp/wiki/What-the-main-advantages-of-Free-Code-Camp-are)
+- [You will be able to get a software engineering job after Free Code Camp](https://github.com/FreeCodeCamp/freecodecamp/wiki/You-will-be-able-to-get-a-software-engineering-job-after-Free-Code-Camp)
+- [What you will learn, and in what sequence you will learn it](https://github.com/FreeCodeCamp/freecodecamp/wiki/What-you-will-learn,-and-in-what-sequence-you-will-learn-it)
+- [How long Free Code Camp takes to complete](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-long-Free-Code-Camp-takes-to-complete)
+- [What pair programming is and why it is special](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/What-pair-programming-is-and-why-it-is-special)
+- [How to use the Free Code Camp Wiki]
+(https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-use-the-Free-Code-Camp-Wiki)
+- [Official Free Code Camp Chat Rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/Official-Free-Code-Camp-Chat-Rooms)
+- [List of Free Code Camp city based Campsites](https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites)
\ No newline at end of file
diff --git a/data/wiki/beta.md b/data/wiki/beta.md
new file mode 100644
index 0000000..53d7ebd
--- /dev/null
+++ b/data/wiki/beta.md
@@ -0,0 +1,17 @@
+### What happens in betas, stays in betas
+
+![](http://www.hebraico.pro.br/biblia/beta.jpg)
+
+The [beta release](http://beta.freecodecamp.com) is where we ask people to test out new features.
+
+### Your progress on beta.freecodecamp.com will NOT be saved to freecodecamp.com's database! ###
+We really appreciate everyone's help ironing out our Beta Release, but please understand that it's not possible to merge two user databases with completely different sets of content. Think of our beta as just a preview test, to check things work properly. In fact the database maybe reset at any time so we can try out things like the sign-up process.  
+
+Feel free to experiment with our beta site, but note the following:
+- Our beta site is quite buggy. If you notice a bug, please make sure it's a new one before you create an issue.
+- We've removed all authentication options other than GitHub from our beta. Don't worry - you will still be able to sign in using LinkedIn, Twitter, Google and Facebook in the future.
+- Our beta database is an old version of Free Code Camp's database. Your Free Code Camp account may not yet exist on the beta site, so please create one if you want to experiment with it.
+
+Also, please remember that all our Waypoint challenges are optional. **You will not have to go back and complete new waypoints as we add them.**
+
+We plan to merge all these new beta features into freecodecamp.com as soon as we've worked out all the major bugs.
\ No newline at end of file
diff --git a/data/wiki/bonfire-arguments-optional.md b/data/wiki/bonfire-arguments-optional.md
new file mode 100644
index 0000000..73cbe9d
--- /dev/null
+++ b/data/wiki/bonfire-arguments-optional.md
@@ -0,0 +1,101 @@
+# Author
+
+![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
+
+* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
+* CodePed Profile: http://codepen.io/Rafase282/
+* LinkedIn: https://www.linkedin.com/in/rafase282
+
+# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
+
+# Details
+
+* Difficulty: 2/5
+
+Fill in the object constructor with the methods specified in the tests.
+
+Create a function that sums two arguments together. If only one argument is provided, return a
+function that expects one additional argument and will return the sum.
+
+For example, add(2, 3) should return 5, and add(2) should return a function that is waiting for an
+argument so that var sum2And = add(2); return sum2And(3); // 5
+
+If either argument isn't a valid number, return undefined.
+
+Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
+
+# Useful Links
+
+* [Global Function Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function)
+* [Arguments object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments)
+
+# Problem Script:
+
+```
+function add() {
+  return false;
+}
+
+add(2,3);
+```
+## Explanation:
+It can be quite complicated to understand what needs to be done. There is always many ways to do something when coding but regardless of the algorithm used, 
+we have to create a program that does the following:
+
+* It has to add two numbers passed as parameters and return the addition.
+* It has to check if any of the numbers are actual numbers, otherwise return **undefined** and stop the program right there.
+* It has to check if it has one or two arguments passed. More re ignored.
+* If it has only one then it has to return a function that used that number and expects another one, to then add it.
+
+## Hint: 1
+Every time you deal with an argument, you have to check if it is a number or not. For this a function that handles this task will save you repeated code.
+
+## Hint: 2
+When working on the case that it needs to return the function, it is wise to check if the first and only argument is a number again and base the code on that.
+
+## Hint: 3
+In the case that only one argument was passed, do not worry about how to prompt input for the second one, just make the function definition properly and things will work out the way they should.
+
+## My code
+
+```
+function add() {
+
+    var checkNum = function (num) {
+        if (typeof num !== 'number'){
+            return undefined;
+        }else
+            return num;
+    };
+
+    if (arguments.length > 1) {
+        var a = checkNum(arguments[0]);
+        var b = checkNum(arguments[1]);
+        if (a === undefined || b === undefined) {
+            return undefined;
+        } else {return a + b;}
+    } else {
+        var c = arguments[0];
+        if(checkNum(c)){
+            return function(arg2) {
+                if (c === undefined || checkNum(arg2) === undefined) {
+                    return undefined;
+                }else {
+                    return c + arg2;
+                }
+            };
+        }
+    }
+}
+```
+## Code Explanation:
+
+* First, I create a function with the sole purpose of checking if a number is actually a number and returns undefined if it is not. It uses **typeof** to check.
+* Check if we have two parameters, if so, then check if they are numbers or not using the **checkNum** function I created.
+* If they are not **undefined** then add them and return the addition. If they any of them is undefined then return undefined.
+* In the case that we only have one argument, then we return a new function that expects two parameters. For this we store the first argument before going into a new scope to avoid our arguments being overwritten.
+* Still inside the big else, we need to check the argument we saved, if it is a number then we return the function expecting a second argument.
+* Now inside the function we are returning, we have to check for non numbers again just as at the beginning using **checkNum** if undefined then return that, otherwise if numbers add them and return the addition.
+
+
+## [Go Home](https://github.com/Rafase282/My-FreeCodeCamp-Code/wiki)
\ No newline at end of file
diff --git a/data/wiki/bonfire-binary-agents.md b/data/wiki/bonfire-binary-agents.md
new file mode 100644
index 0000000..e664ef4
--- /dev/null
+++ b/data/wiki/bonfire-binary-agents.md
@@ -0,0 +1,80 @@
+# Author
+
+![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
+
+* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
+* CodePed Profile: http://codepen.io/Rafase282/
+* LinkedIn: https://www.linkedin.com/in/rafase282
+
+# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
+
+# Details
+
+* Difficulty: 2/5
+
+Return an English translated sentence of the passed binary string.
+
+The binary string will be space separated.
+
+Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
+
+# Useful Links
+
+* [String.charCodeAt()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt)
+* [String.fromCharCode()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
+
+# Problem Script:
+
+```
+function binaryAgent(str) {
+  return str;
+}
+
+binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111');
+```
+
+## Explanation:
+
+This problem is very straight forward, you will get string that will represent a sentence in binary code, and you need to translate that into words. There is not direct way to do this so you will have to translate twice.
+
+You should first convert from **binary** to **decimal** and from decimal to **ASCII**
+soon
+
+## Hint: 2
+Things are easier when focusing on smaller parts, divide the input to focus on one letter at the time.
+
+## Hint: 3
+Make sure that each time you transcode a character from binary to decimal, that you reset whatever variable you used to keep track of the ones. Also do not forget to turn everything back into one string.
+
+## My code:
+
+```
+function binaryAgent(str) {
+    str = str.split(' ');
+    var power;
+    var decValue = 0;
+    var sentence = '';
+    for (var s in str) {
+        for (var t in str[s]){
+            if (str[s][t] == 1){
+                power = Math.pow(2,+str[s].length - t - 1);
+                decValue+= power;
+            }
+        }
+        sentence+=(String.fromCharCode(decValue));
+        decValue = 0;
+    }
+  return sentence;
+}
+```
+## My Code Explanation:
+
+* Separate the string into an array of strings separated by whitespace.
+* Create some variables that will be needed along the way, the names are self explanatory for the most part.
+* Iterate through each binary string in the new array.
+* For each of these binary strings, check for the ones and ignore the zeroes.
+* For those that are one or active then convert them to decimal, this takes into account the position and the right power it needs to be raised to.
+* Store the power into the **power** variable by adding it to any previous ones on the variable **decValue**. This variable will add and add the powers of the active ones until the end of the loop and then return the decimal number.
+* Convert the final decimal outside of the inner loop and then convert it to ASCII and saving it to **sentence** along with any other text string already converted and stored.
+* Reset the variable **decValue** to avoid getting wrong decimals before continuing to the outer loop.
+* At the end, we return out converted message.
\ No newline at end of file
diff --git a/data/wiki/bonfire-check-for-palindromes.md b/data/wiki/bonfire-check-for-palindromes.md
new file mode 100644
index 0000000..bb14ee4
--- /dev/null
+++ b/data/wiki/bonfire-check-for-palindromes.md
@@ -0,0 +1 @@
+wiki coming soon!
\ No newline at end of file
diff --git a/data/wiki/bonfire-chunky-monkey.md b/data/wiki/bonfire-chunky-monkey.md
new file mode 100644
index 0000000..d9d2ea8
--- /dev/null
+++ b/data/wiki/bonfire-chunky-monkey.md
@@ -0,0 +1,72 @@
+![](http://i.imgur.com/CuXtGin.jpg)
+
+Our goal for this bonfire is to split `arr` (first argument) into smaller chunks of arrays with the length provided by `size` (second argument). There are 4 green checks (objectives) our code needs to pass in order to complete this bonfire:
+
+1. `(['a', 'b', 'c', 'd'], 2)` is expected to be `[['a', 'b'], ['c', 'd']]`
+2. `([0, 1, 2, 3, 4, 5], 3)` is expected to be `[[0, 1, 2], [3, 4, 5]]`
+3. `([0, 1, 2, 3, 4, 5], 2)` is expected to be `[[0, 1], [2, 3], [4, 5]]`
+4. `([0, 1, 2, 3, 4, 5], 4)` is expected to be `[[0, 1, 2, 3], [4, 5]]`
+
+Click **More information** under the bonfire title and read the helpful links if you haven't yet. 
+&nbsp;
+
+## How to approach the bonfire
+
+The helpful links suggest to use `Array.push()` so let's start by first creating a new array to store the smaller arrays we will soon have like this: 
+
+    var newArray = [];
+
+&nbsp;
+Next we'll need a `for loop` to loop through `arr` then finally we need a method to do the actual splitting and we can use `Array.slice()` to do that. The key to this bonfire is understanding how a `for loop`, `size`, `Array.slice()` and `Array.push()` all work together.
+&nbsp;
+
+## How does a for loop and Array.slice() work
+
+**For Loop**
+
+A `for loop` keeps looping until a condition evaluates to false for example if we had: 
+
+    for (var i = 0; i < arr.length; i++) 
+
+&nbsp;
+`i` starts with a value of 0, `i` loops until `i` is no longer less than the length of `arr` and during each repeat loop, the value of `i` increases by 1 (one). If `arr.length` happens to be 4 then the `for loop` stops right before `i` reaches 4.
+&nbsp;
+
+**Array.slice() Method**
+
+`Array.slice()` method extracts a portion of an array and returns a copy into a new array. We can declare which element to start and which element to stop. For example, if `arr` is `['a', 'b', 'c', 'd']` and we used `arr.slice(1, 3);`, the `Array.slice()` method starts at element 1 and stops at element 3 then returns: 
+```js
+["b","c"]
+``` 
+_Notice how it captures the start element but doesn't capture the stop element._
+&nbsp;
+
+## Using a for loop and Array.slice() together
+
+If we use the following `for loop` while `size` is 2 (note: `size` = 2):
+
+    (var i = 0; i < arr.length; i += size)
+
+&nbsp;
+The loop starts at element 0, loops once then `i += 2` which is another way of stating `i = i + 2` so now the new value of `i` becomes 2. What happens if we combine the following `arr.slice()` with the `for loop`?
+```js
+arr.slice(i, i + size)
+```
+&nbsp;
+
+## Push the arrays out 
+
+We can combine the `Array.slice()` method with the `Array.push()` method inside the `for loop` like this:
+
+    for (var i = 0; i < arr.length; i += size) {
+    newArray.push(arr.slice(i, i + size)); 
+    }
+
+&nbsp;
+`arr.slice()` will start at element 0 and stop at element 2. Here's the fun part: once the `for loop`, loops again then the value of `i` becomes 2 while the `i` in the `arr.slice()` will also have a value of 2. The new `arr.slice()` becomes:
+
+    arr.slice(2, 2 + 2)
+
+&nbsp;
+Now `arr.slice()` starts at the element 2 and stops at element 4 and in the next loop, `arr.slice()` will start at element 4 and stop at element 6. `newArray.push()` will push all the elements out into chunks of smaller arrays with the length of `size`.
+&nbsp;
\ No newline at end of file
diff --git a/data/wiki/bonfire-confirm-the-ending.md b/data/wiki/bonfire-confirm-the-ending.md
new file mode 100644
index 0000000..bb14ee4
--- /dev/null
+++ b/data/wiki/bonfire-confirm-the-ending.md
@@ -0,0 +1 @@
+wiki coming soon!
\ No newline at end of file
diff --git a/data/wiki/bonfire-convert-HTML-entities.md b/data/wiki/bonfire-convert-HTML-entities.md
new file mode 100644
index 0000000..bb14ee4
--- /dev/null
+++ b/data/wiki/bonfire-convert-HTML-entities.md
@@ -0,0 +1 @@
+wiki coming soon!
\ No newline at end of file
diff --git a/data/wiki/bonfire-drop-it.md b/data/wiki/bonfire-drop-it.md
new file mode 100644
index 0000000..a9c8eb5
--- /dev/null
+++ b/data/wiki/bonfire-drop-it.md
@@ -0,0 +1,60 @@
+# Author
+
+![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
+
+* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
+* CodePed Profile: http://codepen.io/Rafase282/
+* LinkedIn: https://www.linkedin.com/in/rafase282
+
+# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
+
+# Details
+
+* Difficulty: 2/5
+
+Drop the elements of an array (first argument), starting from the front, until the predicate (second argument) returns true.
+Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
+
+# Useful Links
+
+* [Arguments object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments)
+* [Array.shift()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)
+
+# Problem Script:
+
+```
+function drop(arr, func) {
+  // Drop them elements.
+  return arr;
+}
+
+drop([1, 2, 3], function(n) {return n < 3; });
+```
+
+## Explanation:
+
+Basically while the second argument is not true, you will have to remove the first element from the left of the array that was passed as the first argument.
+
+## Hint: 1
+You can use Array.shift() or filter that you should be more familiar with to solve this problem in a few lines of code.
+
+## Hint: 2
+Shift returns the element that was removed which we don't really need, all we need is the modified array that is left.
+
+## Hint: 3
+If you still can't figure out how to solve it with shift, then try solving it with filter, and check how filter works, if you become familiar with it, then you can make the code with shift.
+
+## My code:
+
+```
+function drop(arr, func) {
+  return arr.filter(func);
+}
+
+drop([1, 2, 3], function(n) {return n < 3; });
+```
+
+## My Code Explanation:
+
+* I used filter as I was more familiar with it.
+* I have it filter the array to remove the elements that needs to be removed.
\ No newline at end of file
diff --git a/data/wiki/bonfire-everything-be-true.md b/data/wiki/bonfire-everything-be-true.md
new file mode 100644
index 0000000..6248b91
--- /dev/null
+++ b/data/wiki/bonfire-everything-be-true.md
@@ -0,0 +1,73 @@
+# Author
+
+![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
+
+* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
+* CodePed Profile: http://codepen.io/Rafase282/
+* LinkedIn: https://www.linkedin.com/in/rafase282
+
+# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
+
+# Details
+
+* Difficulty: 2/5
+
+Check if the predicate (second argument) returns truthy (defined) for all elements of a collection (first argument).
+
+For this, check to see if the property defined in the second argument is present on every element of the collection.
+
+Remember, you can access object properties through either dot notation or [] notation.
+
+Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
+
+# Useful Links
+
+* [Object.hasOwnProperty()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty)
+* [Object.getOwnPropertyNames()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames)
+
+# Problem Script:
+```
+function every(collection, pre) {
+  // Does everyone have one of these?
+  return pre;
+}
+
+every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], 'sex');
+
+```
+## Explanation:
+
+The program needs to check if the second argument is a truthy element, and it must check this for each object in the first argument.
+
+>In JavaScript, a truthy value is a value that translates to true when evaluated in a Boolean context. All values are truthy unless they are defined as falsy (i.e., except for false, 0, "", null, undefined, and NaN).
+
+## Hint: 1
+Remember to iterate through the first argument to check each object.
+
+## Hint: 2
+Only if all of them are truth will we return true, so make sure all of them check.
+
+## Hint: 3
+You could use loops or callbacks functions, there are multiple ways to solve this problem.
+
+## My Code:
+```
+function every(collection, pre) {
+  var counter = 0;
+  for (var c in collection) {
+    if (collection[c].hasOwnProperty(pre) || collection[c][pre] == pre){ counter++;}
+  }
+  if (counter == collection.length) {
+    return true;
+  } else 
+    return false;
+}
+
+every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa',
+'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], 'sex');
+```
+## My Code Explanation:
+
+* First I create a counter to check how many cases are actually true.
+* Then check for each object if it it has the same property or the same property value. If true then add one to the counter.
+* Outside the loop, I check to see if the counter variable has the same value as the length of **collection**, if true then return **true**, otherwise, return **false**
\ No newline at end of file
diff --git a/data/wiki/bonfire-find-the-longest-word-in-a-string.md b/data/wiki/bonfire-find-the-longest-word-in-a-string.md
new file mode 100644
index 0000000..bb14ee4
--- /dev/null
+++ b/data/wiki/bonfire-find-the-longest-word-in-a-string.md
@@ -0,0 +1 @@
+wiki coming soon!
\ No newline at end of file
diff --git a/data/wiki/bonfire-finders-keepers.md b/data/wiki/bonfire-finders-keepers.md
new file mode 100644
index 0000000..2f82186
--- /dev/null
+++ b/data/wiki/bonfire-finders-keepers.md
@@ -0,0 +1,67 @@
+# Author
+
+![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
+
+* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
+* CodePed Profile: http://codepen.io/Rafase282/
+* LinkedIn: https://www.linkedin.com/in/rafase282
+
+# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
+
+# Details
+
+* Difficulty: 2/5
+
+Create a function that looks through an array (first argument) and returns the first element in the array that passes a truth test (second argument).
+
+Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
+
+# Useful Links
+
+* [Array.some()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)
+
+# Problem Script:
+
+```
+function find(arr, func) {
+  var num = 0;
+  return num;
+}
+
+find([1, 2, 3, 4], function(num){ return num % 2 === 0; });
+```
+
+## Explanation:
+
+The problem is quite simple to understand. You will check for each element in the array that is passed in the first argument, if the element plugged in to the function passed as the second argument returns true the first time. We do not care about the second or third one that is true, only the very first one if any. If there are none, then return undefined. This last bit is not explained but it is part of the tests used.
+
+## Hint: 1
+You can use the function directly from the parameter, no need to rename it or anything.
+
+## Hint: 2
+You need to pass an element and record it if the function returns true, for this you just have to pass the element as the parameter for the function.
+
+## Hint: 3
+If no element satisfy the function then you must return **undefined**
+
+## My code:
+
+```
+function find(arr, func) {
+    var num;
+    for (var a in arr) {
+        if (func(arr[a])){
+            num = arr[a];
+            return num;
+        }
+    }
+  return num;
+}
+```
+
+## My Code Explanation:
+
+* To make the code easier, create an undefined variable that will be returned.
+* Loop through the array to check for each element if it satisfy the function. This is done by passing the arr[index of the loop] as the parameter for the function from the second argument.
+* If true, then store the array element, and return it. This will stop the loop. No else needed.
+* If the loop was not broken and it has ended, then return **num** which by default is undefined. This means that none of the elements from the array satisfied the function.
\ No newline at end of file
diff --git a/data/wiki/bonfire-make-a-person.md b/data/wiki/bonfire-make-a-person.md
new file mode 100644
index 0000000..c3f5485
--- /dev/null
+++ b/data/wiki/bonfire-make-a-person.md
@@ -0,0 +1,104 @@
+# Author
+
+![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) 
+submitted by Rafase282 
+
+[Github](https://github.com/Rafase282) |
+[FreeCodeCamp](http://www.freecodecamp.com/rafase282) | 
+[CodePen](http://codepen.io/Rafase282/) |
+[LinkedIn](https://www.linkedin.com/in/rafase282) |
+[My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
+
+## Details
+
+* Difficulty: 3/5
+
+Fill in the object constructor with the methods specified in the tests.
+
+Those methods are:
+
+* getFirstName()
+* getLastName()
+* getFullName()
+* setFirstName(first)
+* setLastName(last)
+* setFullName(firstAndLast)
+
+All functions that take an argument have an arity of 1, and the argument will be a string.
+
+These methods must be the only available means for interacting with the object.
+
+## Useful Links
+
+* [Closures](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures)
+* [Details of the Object Model](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model)
+
+
+## Problem Script:
+
+```
+var Person = function(firstAndLast) {
+    return firstAndLast;
+};
+
+var bob = new Person('Bob Ross');
+bob.getFullName();
+```
+
+## Explanation:
+
+When I started the program I figured I just had to create the six functions mentioned in the details. However, it was not as simple. Creating them as a function was not the right way, I had to create them in a different way to make them a key.
+
+There is also a tricky part as you need six keys no more or less, so at first I had the variable that store the original name as a key too which was wrong. 
+
+As for the usage of array, that is optional, you could also create new variable to hold the separated string if you wish but an array is easier to deal with as strings are immutable.
+
+Read the instructions carefully, it is always a good hint on itself to run the code and check what the test results were so you know what to expect but do not fixate yourself on that. Once you understand what you need to do, this problem is very easy and straightforward.
+
+## Hint: 1
+
+Use the **this** notation to create the keys instead of regular functions: This means instead of ```var varName = function() {/*...*/}``` you should use ``` this.varName = function() {/*...*/}```
+
+## Hint: 2
+
+The program has a test that checks for how many keys you used, they have to be exactly six, the six mentioned in the details section. This means if you need to work with variables, make them local and not a key: ```this.fullName = firstAndLast;```
+
+## Hint: 3
+Often the code would not work the way you expect it due to wrong variable names, make sure to check that you spell them the right way. This happens to all of us at some point.
+
+## My code
+
+Please try hard before you check this solution.
+
+```
+var Person = function(firstAndLast) {
+    
+    var fullName = firstAndLast;
+    var arr = fullName.split(' ');
+    
+    this.getFirstName = function() {
+        return arr[0];
+    };
+    this.getLastName = function() {
+        return arr[1];
+    };
+    this.getFullName = function() {
+        return fullName;
+    };
+    this.setFirstName = function(first) {
+        arr[0] = first;
+    };
+    this.setLastName = function(last) {
+        arr[1] = last;
+    };
+    this.setFullName = function(firstAndLast) {
+        fullName = firstAndLast;
+    };
+};
+```
+## My Code Explanation:
+
+* Create a variable that will make a copy of the full name that was passed as a parameter.
+* Create another variable that will split that full name into first and last name array.
+* Then we can proceed to create the six keys needed and return what is needed.
+* For the setters, we can use the arr array and the right index to change the value to what was passed as a parameter.
\ No newline at end of file
diff --git a/data/wiki/bonfire-map-the-debris.md b/data/wiki/bonfire-map-the-debris.md
new file mode 100644
index 0000000..ba02836
--- /dev/null
+++ b/data/wiki/bonfire-map-the-debris.md
@@ -0,0 +1,92 @@
+# Author
+
+![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
+
+* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
+* CodePed Profile: http://codepen.io/Rafase282/
+* LinkedIn: https://www.linkedin.com/in/rafase282
+
+## [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
+
+# Details
+
+* Difficulty: 3/5
+
+Return a new array that transforms the element's average altitude into their orbital periods.
+
+The array will contain objects in the format {name: 'name', avgAlt: avgAlt}.
+
+You can read about orbital periods on wikipedia.
+
+The values should be rounded to the nearest whole number. The body being orbited is Earth.
+
+The radius of the earth is 6367.4447 kilometers, and the GM value of earth is 398600.4418
+
+Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
+
+
+# Useful Links
+
+* [Math.pow()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow)
+* [orbital periods](http://en.wikipedia.org/wiki/Orbital_period)
+
+## Problem Script:
+
+```
+function orbitalPeriod(arr) {
+  var GM = 398600.4418;
+  var earthRadius = 6367.4447;
+  return arr;
+}
+
+orbitalPeriod([{name : "sputkin", avgAlt : 35873.5553}]);
+```
+
+## Explanation:
+
+The first thing to do is to get familiar with what the program is for, for this I would suggest you check the Wikipedia link as that is very important and from where you can also get the formula for the conversion. The hardest part are finding the formula, implementing it and for some modifying objects by the key. However, something that is not very clear is the fact that your program has to be able to check for any number od objects in the array which is what is tested on the second part.
+
+## Hint: 1
+
+The formula needed is: T = 2*pi * sqrt(earthRadius + avgAlt to the cube / GM)
+
+## Hint: 2
+Use Math.round() to round up to the next whole number as requested. Using Math.ceil() will let you pass the first test but fail the second one.
+
+## Hint: 3
+Find out how to remove and add key to an object
+
+## My code
+
+```
+function orbitalPeriod(arr) {
+	var GM = 398600.4418;
+	var earthRadius = 6367.4447;
+	var a = 2 * Math.PI;
+	var newArr = [];
+	var getOrbPeriod = function (obj) {
+	    var c = Math.pow(earthRadius + obj.avgAlt ,3);
+	    var b = Math.sqrt(c/GM);
+	    var orbPeriod = Math.round(a * b);
+	    delete obj.avgAlt;
+	    obj.orbitalPeriod = orbPeriod;
+	    return obj;
+	};
+	
+	for (var elem in arr){
+	    newArr.push(getOrbPeriod(arr[elem]));
+	}
+	return newArr;
+}
+```
+## Code Explanation:
+
+* The GM and earthRadius is given to us.
+* To make the code easier to edit and read, I separated each part of the equation.
+* Create a new array to store the orbPeriods.
+* a is 2 times pi. The part that is a constant is on the global scope while the rest is part of a function.
+* Create a function that will do the required work for any amount of objects.
+* c is the power of earthRadius + the value of avgAlt to the cube.
+* b is the square root of c divided by GM.
+* Create orbPeriod to store the product of a & b, with the ceiling function applied to round up to the next whole number.
+* Then we delete the key avgAlt, and add the new key and its value.
\ No newline at end of file
diff --git a/data/wiki/bonfire-mutations.md b/data/wiki/bonfire-mutations.md
new file mode 100644
index 0000000..e2c0f19
--- /dev/null
+++ b/data/wiki/bonfire-mutations.md
@@ -0,0 +1,37 @@
+# Problem Explanation:
+- Return true if the string in the first element of the array contains all of the letters of the string in the second element of the array..
+
+## Hint: 1
+- If everything is lowercase it will be easier to compare.
+
+## Hint: 2
+- Our strings might be easier to work with if they were arrays of characters.
+
+## Hint: 3
+- A loop might help.
+
+## Spoiler Alert!
+[![687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/thumb/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)
+
+**Solution ahead!**
+
+## Solution Code:
+
+```
+function mutation(arr) {
+  var test = arr[1].toLowerCase();
+  var target = arr[0].toLowerCase();
+  test = test.split('');
+  target = target.split('');
+  for (i=0;i<test.length;i++) {
+    if (target.indexOf(test[i]) < 0)
+      return false;
+  }
+  return true;
+ }
+```
+
+## Code Explanation:
+- First, we make the to strings in the array lowercase.  
+- Second, we split the individual strings in to 2 separate arrays of characters. test variable holds what we are looking for. target variable is where we are looking.   
+- Third, we loop through our test characters, and if they are not _all_ found we return false.
diff --git a/data/wiki/bonfire-pairwise.md b/data/wiki/bonfire-pairwise.md
new file mode 100644
index 0000000..6598b64
--- /dev/null
+++ b/data/wiki/bonfire-pairwise.md
@@ -0,0 +1,83 @@
+# Author
+
+![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
+
+* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
+* CodePed Profile: http://codepen.io/Rafase282/
+* LinkedIn: https://www.linkedin.com/in/rafase282
+
+# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
+
+# Details
+
+* Difficulty: 3/5
+
+Return the sum of all indices of elements of 'arr' that can be paired with one other element to form a sum that equals the value in the second argument 'arg'. If multiple sums are possible, return the smallest sum. Once an element has been used, it cannot be reused to pair with another.
+
+For example, pairwise([1, 4, 2, 3, 0, 5], 7) should return 11 because 4, 2, 3 and 5 can be paired with each other to equal 7.
+
+pairwise([1, 3, 2, 4], 4) would only equal 1, because only the first two elements can be paired to equal 4, and the first element has an index of 0!
+
+Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
+
+# Useful Links
+
+* [Array.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)
+
+# Problem Script:
+
+```
+function pairwise(arr, arg) {
+  return arg;
+}
+
+pairwise([1,4,2,3,0,5], 7);
+```
+
+## Explanation:
+
+The program should look for the numbers in the array which would add to make the number from the **arg.** Then instead of adding those numbers up, you will add their **indices** which is the reason why you get 11 on the example from detail.
+
+Remember that arrays start at index 0 and go from there so from [1,4,2,3,0,5] if we switch to their indices it would be [0,1,2,3,4,5] then we add indices 1 + 2 + 3 + 5 and we get 11. That is what we need to return.
+
+## Hint: 1
+
+Remember to return the smaller sum if multiple are possible. This mean ```[1,1,1],1 should use 0 + 1 instead of 0+1 & 1 +1 , etc```
+
+## Hint: 2
+Try using an array of indices to track when an index has been used or not.
+
+## Hint: 3
+It is easy to confuse indices as being numbers, but since you will be interacting with them, make sure to work with them as integers to prevent the code from behaving erratically.
+
+# My code
+
+```
+function pairwise(arr, arg) {
+    var index = [];
+    for (var a in arr){
+        var temp = arr[a];
+        for (var i=1; i < arr.length; i++) {
+            var temp2 = arr[i];
+            if (temp + temp2 === arg && i > a && index.indexOf(+a) === -1 && index.indexOf(+i) === -1){
+                index.push (+a,+i);
+            }
+        }
+    }
+    if (index.length >= 1) {
+        return index.reduce(function(a, b){
+          return a + b;
+        });
+    } else {
+        return 0;
+    }
+}
+```
+# Code Explained
+
+* First I create an empty array to store the indices that i will be adding.
+* Then I create an outer loop to get the first number.
+* Then get the second number from another inner loop.
+* Then I check to make sure that the two numbers add to arg that was passed as a parameter to the function; we also have to make sure the index from the second loop is grater than the one from the first loop to avoid adding wrong indices. We also have to check to make sure the indices are not already part of the **index** array.
+* If all that is true, then we add the two indices as integer by using '+' or parseInt(), and then we stop the inner loop since everything else would be redundant and wrong.
+* After all the loops are over, check in **index** is empty, if it is then return 0, otherwise return the addition of all the integers in it using Array.reduce(callbackFunc) to return the sum of the numbers.
\ No newline at end of file
diff --git a/data/wiki/bonfire-repeat-a-string-repeat-a-string.md b/data/wiki/bonfire-repeat-a-string-repeat-a-string.md
new file mode 100644
index 0000000..bb14ee4
--- /dev/null
+++ b/data/wiki/bonfire-repeat-a-string-repeat-a-string.md
@@ -0,0 +1 @@
+wiki coming soon!
\ No newline at end of file
diff --git a/data/wiki/bonfire-return-largest-numbers-in-arrays.md b/data/wiki/bonfire-return-largest-numbers-in-arrays.md
new file mode 100644
index 0000000..bb14ee4
--- /dev/null
+++ b/data/wiki/bonfire-return-largest-numbers-in-arrays.md
@@ -0,0 +1 @@
+wiki coming soon!
\ No newline at end of file
diff --git a/data/wiki/bonfire-roman-numeral-converter.md b/data/wiki/bonfire-roman-numeral-converter.md
new file mode 100644
index 0000000..c0d1fe6
--- /dev/null
+++ b/data/wiki/bonfire-roman-numeral-converter.md
@@ -0,0 +1,4 @@
+placeholder
+
+## hint one
+another hint
\ No newline at end of file
diff --git a/data/wiki/bonfire-slasher-flick.md b/data/wiki/bonfire-slasher-flick.md
new file mode 100644
index 0000000..6770095
--- /dev/null
+++ b/data/wiki/bonfire-slasher-flick.md
@@ -0,0 +1,63 @@
+You should make sure to try hard to solve the Bonfire yourself before reading this!
+# :link: [Original Bonfire](http://www.freecodecamp.com/challenges/bonfire-slasher-flick) :point_right:  
+
+## Author
+
+![Andre](https://avatars2.githubusercontent.com/u/2698441?v=3&amp;s=460) submitted by [Andre - Clint Tecnologia](//freecodecamp.com/clint74) | https://github.com/clint74
+
+## The problem
+Return the remaining elements of an array after chopping off n elements from the head.
+Factorials are often represented with the shorthand notation n!
+
+For example: `slasher([1, 2, 3], 2);` must return [3]
+
+## Analysis
+Since we need only the remaining part of an array we can just remove what we don't.
+
+## Understanding slicing
+Slice allows to get only what you want from an array.
+
+## Understanding the splice
+If you want the **tail** of a snake remove the head first.
+The splice() method changes the content of an array by removing existing elements and/or adding new elements.
+This can be handy. Get an array, remove the first part and return the remaining.
+
+## :construction: My Solution is coming up!
+Don't scroll down if you don't want to see it!
+
+![warning](http://www.yourdrum.com/yourdrum/images/2007/10/10/red_warning_sign_2.gif)        
+
+```
+           ,,,         ,,,
+          ;"   ^;     ;'   ",
+          ;    s$$$$$$$s     ;
+          ,  ss$$$$$$$$$$s  ,'
+          ;s$$$$$$$$$$$$$$$
+          $$$$$$$$$$$$$$$$$$
+         $$$$P""Y$$$Y""W$$$$$      -{ Happy Camping! }
+         $$$$  p"$$$"q  $$$$$
+         $$$$  .$$$$$.  $$$$
+          $$DcaU$$$$$$$$$$
+            "Y$$$"*"$$$Y"    
+                "$b.$$"     
+```
+
+## My solution
+``` javascript
+function slasher(arr, howMany) {
+  // remove the head
+  arr.splice(0,howMany);
+  //return the remaining or the tail  \__/(**)-<
+  return arr;
+}
+slasher([1, 2, 3], 2);
+```
+
+
+
+## References
+- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
+
+## If you enjoyed this guide, then type:
+`thanks @clint74`
+in the chat!
\ No newline at end of file
diff --git a/data/wiki/bonfire-smallest-common-multiple.md b/data/wiki/bonfire-smallest-common-multiple.md
new file mode 100644
index 0000000..6d4dfee
--- /dev/null
+++ b/data/wiki/bonfire-smallest-common-multiple.md
@@ -0,0 +1,21 @@
+placeholder intro to the bonfire
+
+## hint
+Here freeze a multiple candidate starting from the biggest array value - call it J 
+`for (var j = max; j <= 1000000; j++){...}`
+
+## hint
+Now you have to test your candidate
+`//I increase the denominator from min to max
+    for (var k = arr[0]; k <= arr[1]; k++) {
+
+      if (j % k === 0) { // every time the modulus is 0 increase a counting 
+        count++; // variable
+      }`
+
+## final hint
+When your candidate is a multiple???
+`if (count === numbers.length) { 
+      multiple.push(j); 
+    }
+`
\ No newline at end of file
diff --git a/data/wiki/bonfire-steamroller.md b/data/wiki/bonfire-steamroller.md
new file mode 100644
index 0000000..4994fca
--- /dev/null
+++ b/data/wiki/bonfire-steamroller.md
@@ -0,0 +1,71 @@
+# Author
+
+![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
+
+* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
+* CodePed Profile: http://codepen.io/Rafase282/
+* LinkedIn: https://www.linkedin.com/in/rafase282
+
+# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
+
+# Details
+
+* Difficulty: 2/5
+
+Flatten a nested array. You must account for varying levels of nesting.
+
+Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
+
+# Useful Links
+
+* [Array.isArray()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)
+
+# Problem Script:
+
+```
+function steamroller(arr) {
+  // I'm a steamroller, baby
+  return arr;
+}
+
+steamroller([1, [2], [3, [[4]]]]);
+```
+
+## Explanation:
+
+This problem seems simple but you need to make sure to flatten any array, regardless of the level which is what adds a bit of difficulty to the problem.
+
+## Hint: 1
+You need to check if an element is an array or not.
+
+## Hint: 2
+If you are dealing with an array, then you need flatten it by getting the value inside of the array. This means if you have [[4]] then instead of returning [4] you need to return 4. If you get [[[4]]] then the same, you want the 4. You can access it with arr[index1][index2] to go a level deeper.
+
+## Hint: 3
+You will definitely need recursion or another way to go beyond two level arrays to make the code flexible and not hard-coded to the answers needed. Have fun!
+
+## My code:
+
+```
+function steamroller(arr) {
+	var flattenedArray = [];
+	var flatten = function (arg) {
+		if (!Array.isArray(arg)){
+			flattenedArray.push(arg);
+		} else {
+			for (var a in arg) {
+				flatten(arg[a]);
+			}
+		}
+	};
+	arr.forEach(flatten);
+	return flattenedArray;
+}
+```
+## My Code Explanation:
+
+* Create a new variable to keep flattened arrays.
+* Create a function that will add non array elements to the new variable, and for the ones that are array it loops through them to get the element.
+* It does that by using recursion, if the element is an array then call the function again with a layer of array deeper to check if it is an array or not. if it is not then push that non-array element to the variable that gets returned. Otherwise, keep going deeper.
+* Use Array.forEach(callbackFunc) to go element by element of the original array.
+* Return the flattened array.
\ No newline at end of file
diff --git a/data/wiki/bonfire-sum-all-odd-fibonacci-numbers.md b/data/wiki/bonfire-sum-all-odd-fibonacci-numbers.md
new file mode 100644
index 0000000..86f6b49
--- /dev/null
+++ b/data/wiki/bonfire-sum-all-odd-fibonacci-numbers.md
@@ -0,0 +1 @@
+Think about how Fibonacci numbers are defined, and how you would redefine them on each iteration. There are many ways to do this, including using a temp variable and console.log statements to ensure you're on the right track.
\ No newline at end of file
diff --git a/data/wiki/bonfire-sum-all-primes.md b/data/wiki/bonfire-sum-all-primes.md
new file mode 100644
index 0000000..d1104af
--- /dev/null
+++ b/data/wiki/bonfire-sum-all-primes.md
@@ -0,0 +1,82 @@
+# Author
+
+![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
+
+* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
+* CodePed Profile: http://codepen.io/Rafase282/
+* LinkedIn: https://www.linkedin.com/in/rafase282
+
+# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
+
+# Details
+
+* Difficulty: 2/5
+
+Sum all the prime numbers up to and including the provided number.
+
+A prime number is defined as having only two divisors, 1 and itself. For example, 2 is a prime number because it's only divisible by 1 and 2. 1 isn't a prime number, because it's only divisible by itself.
+
+The provided number may not be a prime.
+
+Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
+
+# Useful Links
+
+* [For Loops](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for)
+* [Array.push()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
+
+# Problem Script:
+```
+function sumPrimes(num) {
+  return num;
+}
+
+sumPrimes(10);
+```
+
+## Explanation:
+
+The explanation for this problem is very simple. You will generate a list of prime numbers up to the number you are given as a parameter. Then you need to add them all up and return that value. The tricky part is on generating the list of prime numbers. I suggest you find a code or a good math algorithm that you can turn into code.
+
+## Hint: 1
+Generate a list of all the numbers up to and including the one you got as a parameter. This will be needed to determine which numbers are prime or not.
+
+## Hint: 2
+Check this [link](http://stackoverflow.com/questions/11966520/how-to-find-prime-numbers-between-0-100) if you prefer to find a solution for finding primes, or try learning and implementing your own [Sieve of Eratosthenes](https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes)
+
+## Hint: 3
+This problem is hard if you have to create your own code to check for primes, so don't feel bad if you had to use someone's code for that bit. Either way, you are most likely using array, so once you generate an array of primes, then just add them all up and return the number you get.
+
+## My code:
+
+```
+function sumPrimes(num) {
+    var res = 0;
+    function getPrimes(max) {
+        var sieve = [], i, j, primes = [];
+        for (i = 2; i <= max; ++i) {
+            if (!sieve[i]) {
+                primes.push(i);
+                for (j = i << 1; j <= max; j += i) {
+                    sieve[j] = true;
+                }
+            }
+        }
+    return primes;
+    }
+    var primes = getPrimes(num);
+    for (var p in primes) {
+        res+= primes[p];
+    }
+return res;
+}
+```
+
+## My Code Explanation:
+
+* Create a function that generates the numbers from 1 to **num** and check if they are prime along the way.
+* Declare the variables that will be needed.
+* Start with 2, if it has not been marked and added to the sieve array then it is a prime and we add it to the prime array.
+* Add the others to the sieve array.
+* Return the primes
+* Loop through the returned array and add all the elements to then return the final value.
\ No newline at end of file
diff --git a/data/wiki/bonfire-title-case-a-sentence.md b/data/wiki/bonfire-title-case-a-sentence.md
new file mode 100644
index 0000000..aabab61
--- /dev/null
+++ b/data/wiki/bonfire-title-case-a-sentence.md
@@ -0,0 +1 @@
+wiki coming soon
\ No newline at end of file
diff --git a/data/wiki/bonfire-truncate-a-string.md b/data/wiki/bonfire-truncate-a-string.md
new file mode 100644
index 0000000..af47925
--- /dev/null
+++ b/data/wiki/bonfire-truncate-a-string.md
@@ -0,0 +1,42 @@
+# Instructions
+
+Truncate a string (first argument) if it is longer than the given maximum string length (second argument). Return the truncated string with a '...' ending.
+
+Note that the three dots at the end add to the string length.
+
+# Tests final code needs to pass
+
+1. expect(truncate('A-tisket a-tasket A green and yellow basket', 11)).to.eqls('A-tisket...');
+2. expect(truncate('Peter Piper picked a peck of pickled peppers', 14)).to.eqls('Peter Piper...');
+3. assert(truncate('A-tisket a-tasket A green and yellow basket', 'A-tisket a-tasket A green and yellow basket'.length) === 'A-tisket a-tasket A green and yellow basket', 'should not truncate if string is = length');
+4. assert.strictEqual(truncate('A-tisket a-tasket A green and yellow basket', 'A-tisket a-tasket A green and yellow basket'.length + 2), 'A-tisket a-tasket A green and yellow basket', 'should not truncate if string is < length');
+
+## Hint
+
+Truncate the string to a length equal to the second parameter passed to the function. Remember the added ... is included in the final string length.
+
+## My final code
+
+    function truncate(str, num) {
+      // Clear out that junk in your trunk
+      if (str.length > num) {
+        str = str.slice(0, num-3) + '...';
+      }
+      return str;
+    }
+
+    truncate('A-tisket a-tasket A green and yellow basket', 11);
+
+## Explanation
+
+First we need a conditional if statement to test if the length of the full string passed in as the first argument is greater than the maximum passed in as the second argument.
+
+    if (str.length > num)
+
+Then we need to slice the full string at the length required (second argument). The trick is to minus the length of the ... that needs to be added to get the final truncated string.
+
+    str = str.slice(0, num-3)
+
+Finally, just add the ... to the end of the sliced substring ready to be returned
+
+    str = str.slice(0, num-3) + '...';
\ No newline at end of file
diff --git a/data/wiki/boolean.md b/data/wiki/boolean.md
new file mode 100644
index 0000000..52c053a
--- /dev/null
+++ b/data/wiki/boolean.md
@@ -0,0 +1,39 @@
+The value passed as the first parameter is converted to a boolean value, if necessary. If value is omitted or is 0, -0, null, false, NaN, undefined, or the empty string (""), the object has an initial value of false. All other values, including any object or the string "false", create an object with an initial value of true.
+
+Do not confuse the primitive Boolean values true and false with the true and false values of the Boolean object.
+
+## More Details
+
+Any object whose value is not undefined or null, including a Boolean object whose value is false, evaluates to true when passed to a conditional statement. For example, the condition in the following if statement evaluates to true:
+
+```
+var x = new Boolean(false);
+if (x) {
+  // this code is executed
+}
+```
+This behavior does not apply to Boolean primitives. For example, the condition in the following if statement evaluates to false:
+
+```
+var x = false;
+if (x) {
+  // this code is not executed
+}
+```
+Do not use a Boolean object to convert a non-boolean value to a boolean value. Instead, use Boolean as a function to perform this task:
+
+```
+var x = Boolean(expression);     // preferred
+var x = new Boolean(expression); // don't use
+```
+If you specify any object, including a Boolean object whose value is false, as the initial value of a Boolean object, the new Boolean object has a value of true.
+
+```
+var myFalse = new Boolean(false);   // initial value of false
+var g = new Boolean(myFalse);       // initial value of true
+var myString = new String('Hello'); // string object
+var s = new Boolean(myString);      // initial value of true
+```
+Do not use a Boolean object in place of a Boolean primitive.
+
+[Orininal](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)
\ No newline at end of file
diff --git a/data/wiki/bootstrap.md b/data/wiki/bootstrap.md
new file mode 100644
index 0000000..812ab22
--- /dev/null
+++ b/data/wiki/bootstrap.md
@@ -0,0 +1,5 @@
+A frontend [CSS](https://github.com/bothelpers/kbase/wiki/css) framework.
+
+You can find out more [here](http://getbootstrap.com/)
+
+> related: css, frameworks
diff --git a/data/wiki/bot-announce.md b/data/wiki/bot-announce.md
new file mode 100644
index 0000000..296dd6f
--- /dev/null
+++ b/data/wiki/bot-announce.md
@@ -0,0 +1,20 @@
+## Announcing CamperBot!
+
+CamperBot is our new AI friend who's going to make the FCC chatrooms more fun.
+He can get info from the wiki, share bonfire hints, and help you get brownie points for helping people!
+
+https://twitter.com/FreeCodeCamp/status/627338604134559744
+
+
+### beta testing
+Currently in beta test in the #HelpBonfires channel. Try it out here:
+https://gitter.im/FreeCodeCamp/HelpBonfires
+
+
+### read about what CamperBot features
+https://github.com/FreeCodeCamp/freecodecamp/wiki/camperbot
+
+
+### talk to the Dev Team
+https://gitter.im/dcsan/gitterbot
+
diff --git a/data/wiki/botdemo.md b/data/wiki/botdemo.md
new file mode 100644
index 0000000..51d1fdf
--- /dev/null
+++ b/data/wiki/botdemo.md
@@ -0,0 +1,24 @@
+We've added a bot to some of the chatrooms. We'll be adding more features over time, but these are the starting features. We'd love to hear what you think!
+The main thing is pulling in content from our [brand new wiki](https://github.com/FreeCodeCamp/freecodecamp/wiki), right into the chat.
+
+- `find js` or `find css` or `find html`  
+show a list of matching items.
+
+- `help js ternary`  
+quick definition/help. click through to see more on the wiki
+
+- `help video`  
+inline video
+
+- `help bobbytables`  
+shows inline images
+
+- `explain triphop`
+you can embed soundcloud tracks
+
+- `topics`  
+  show a list of topics
+
+# Join the CamperBot DevTeam!
+we're looking for some people to join the core dev team to work on new features for the bot.
+ping @dcsan on gitter or leave a message in [gitter.com/camperbot/devteam](https://gitter.im/camperbot/devteam)
diff --git a/data/wiki/botideas.md b/data/wiki/botideas.md
new file mode 100644
index 0000000..0152f25
--- /dev/null
+++ b/data/wiki/botideas.md
@@ -0,0 +1,6 @@
+If you have ideas or feature requests for the bot, you can add them to this page.
+Also come hang out in https://gitter.im/camperbot/devteam
+
+- XKCD comic feed  
+show comics inside the feed! 
+from @saintpeter
diff --git a/data/wiki/botintro.md b/data/wiki/botintro.md
new file mode 100644
index 0000000..8f4bb21
--- /dev/null
+++ b/data/wiki/botintro.md
@@ -0,0 +1,33 @@
+Bot is live in beta on gitter
+
+## https://gitter.im/FreeCodeCamp/HelpBonfires
+
+https://twitter.com/FreeCodeCamp/status/627338604134559744
+
+Hay All! We're working on a new CamperBot for FreeCodeCamp. 
+This will make the chat rooms more fun and useful. 
+It will pull in content from our [brand new wiki](https://github.com/FreeCodeCamp/freecodecamp/wiki/) right into the chat room.
+
+# Basic commands
+We're adding more features all the time. But here are some basics
+
+```
+help
+find TOPIC
+wiki TOPIC
+about @user
+thanks @user
+```
+
+## adding to the wiki
+you can add topics to the main wiki, and these will get updated and pulled into the chat.
+Please add material!
+
+## Beta Testing
+https://gitter.im/dcsan/gitterbot
+
+## Repo
+
+
+http://bot.freecodecamp.com/go?room=camperbot/testing&topic=betatesting
+type `help` to get started with basic commands
diff --git a/data/wiki/botpreso.md b/data/wiki/botpreso.md
new file mode 100644
index 0000000..dbb3edf
--- /dev/null
+++ b/data/wiki/botpreso.md
@@ -0,0 +1,9 @@
+# FCC chatbot **CamperBot**
+Now in development. First release today.
+
+to get started:
+# bot help
+
+To talk with the dev team about new features:
+# [https://gitter.im/camperbot/testing](https://gitter.im/camperbot/testing)
+
diff --git a/data/wiki/camperbot.md b/data/wiki/camperbot.md
new file mode 100644
index 0000000..fafe69c
--- /dev/null
+++ b/data/wiki/camperbot.md
@@ -0,0 +1,66 @@
+Hi, I'm **[CamperBot](https://github.com/FreeCodeCamp/freecodecamp/wiki/camperbot)**! I can help you in this chatroom :smile: 
+
+### Basic Commands:
+- ``find TOPIC``  find all entries about topic. ex: `find js`
+- `wiki TOPIC` show contents of topic page
+- `thanks @username`  send brownie points to another user
+- `about @username`   shows info on that user
+- `bonfire BONFIRENAME` info on a bonfire
+
+:speech_balloon: [meet CamperBot in this room!](https://gitter.im/camperbot/testing)
+
+
+## Example Commands
+
+```
+find js   # all JS entries
+wiki muta  # first entry with muta in name
+wiki bobbytables  # showing images
+wiki video  # and video
+rollem    # secret sauce
+bonfire roman   # any bonfire with roman in name
+```
+For playing with CamperBot please use the testing channel:
+[https://gitter.im/camperbot/testing](https://gitter.im/camperbot/testing)
+
+## Help on Bonfires
+Live currently on the HelpBonFires channel on Gitter
+[https://gitter.im/FreeCodeCamp/HelpBonfires](https://gitter.im/FreeCodeCamp/HelpBonfires)
+
+We've added some bonfire specific commands. If you type `bonfire $BONFIRENAME` (where $BONFIRENAME is part of a bonfire name) it will set the chat to be about that bonfire. Then you can use some other bonfire specific commands:
+
+- bf details - more info
+- bf spoiler - show some hints
+
+## More  commands
+- `update`  pulls new wiki edits asap
+- `topics` selected pages from the wiki
+- `rooms`  all rooms the bot is in
+- `archives` show history
+- `music` link to Musare (a music app built by campers)
+- `twitch` show the twitch feed
+
+## Content for the wiki
+Feel free to make new pages, an example entry is here:
+https://github.com/FreeCodeCamp/freecodecamp/wiki/example
+
+## Source Repository
+### [https://github.com/dcsan/gitterbot](https://github.com/dcsan/gitterbot)
+Fork it and have fun!
+
+## Roadmap
+We're looking for ideas for new features to add, and some people to help working on the bot.
+Have a look at Tickets with [help wanted](https://github.com/dcsan/gitterbot/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) on the repo and maybe you can contribute?
+
+In future, we're planning:
+- Bonfire step-by-step tutorials will be available via chat and from the CamperBot
+- realtime tagging and searching of chats by topic
+- a scripting language and natural language processing
+Get involved and let us know what you'd like to see next!
+
+## Developer Chatroom
+- [Join us on our repository chat room](https://gitter.im/dcsan/gitterbot) to discuss new features. Perhaps we can pair up to work on the bot 2.0!
+- [Join this chat room](https://gitter.im/camperbot/testing) to mess around with the CamperBot and try out commands, proofread your edits to wiki content etc.
+
+
+![enjoy](https://avatars1.githubusercontent.com/camperbot?&s=100) Happy Camping!
diff --git a/data/wiki/chai-assert.md b/data/wiki/chai-assert.md
new file mode 100644
index 0000000..3737503
--- /dev/null
+++ b/data/wiki/chai-assert.md
@@ -0,0 +1,13 @@
+# assert(expression, message)
+
+- @param{ Mixed }expressionto test for truthiness
+- @param{ String }messageto display on error
+
+Write your own test expressions.
+
+```js
+assert('foo' !== 'bar', 'foo is not bar');
+assert(Array.isArray([]), 'empty arrays are arrays');
+```
+
+details: http://chaijs.com/api/assert/
diff --git a/data/wiki/chai-cheat.md b/data/wiki/chai-cheat.md
new file mode 100644
index 0000000..aa81f34
--- /dev/null
+++ b/data/wiki/chai-cheat.md
@@ -0,0 +1,126 @@
+# Chai.js
+
+### Assert
+
+    assert(val)
+    assert.fail(actual, expected)
+    assert.ok(val) // is truthy
+    assert.equal(actual, expected) // 'compare with =='
+    assert.strictEqual
+    assert.deepEqual
+
+    assert.isTrue
+    assert.isFalse
+
+    assert.isNull
+    assert.isNotNull
+    assert.isUndefined
+    assert.isDefined
+    assert.isFunction
+    assert.isObject
+    assert.isArray
+    assert.isString
+    assert.isNumber
+    assert.isBoolean
+
+    assert.typeOf(/tea/, 'regexp') // Object.prototype.toString()
+    assert.instanceOf(chai, Tea)
+    assert.include([ a,b,c ], a)
+    assert.match(val, /regexp/)
+    assert.property(obj, 'tea') // 'tea' in object
+    assert.deepProperty(obj, 'tea.green')
+    assert.propertyVal(person, 'name', 'John')
+    assert.deepPropertyVal(post, 'author.name', 'John')
+
+    assert.lengthOf(object, 3)
+    assert.throws(function() { ... })
+    assert.throws(function() { ... }, /reference error/)
+    assert.doesNotThrow
+
+    assert.operator(1, '<', 2)
+    assert.closeTo(actual, expected)
+
+### Should: chains
+
+    .to .be .been .is .that .and .have .with .at .of .same
+
+### Should not
+
+    expect(object).not.equal('x')
+
+### Expectations
+
+    expect(object)
+      .equal(expected)
+      .eql
+      .deep.equal(expected) // same as .eql
+      .be.a('string')
+      .include(val)
+
+      .be.ok(val)
+      .be.true
+      .be.false
+
+      .be.null
+      .be.undefined
+      .be.empty
+      .be.arguments
+      .be.function
+      .be.instanceOf
+
+      .gt(5)  # or .above .greaterThan
+      .gte    # or .at.least
+      .lt(5)  # or .below
+
+      .respondTo('bar')
+      .satisfy (n) -> n > 0
+
+      .have.members([2, 3, 4])
+      .have.keys(['foo'])
+      .have.key('foo')
+
+      .exist
+
+    expect(-> ...)
+      .throw /not a function/
+
+### Chai-jQuery
+
+```js
+    global.jQuery = ...;
+    chai.use(require('chai-jquery'));
+
+    expect($body)
+
+      .have.attr('foo')
+      .have.prop('disabled')
+      .have.css('background')
+      .have.css('background-color', '#ffffff')
+      .have.data('foo')
+
+      .have.class('active')
+      .have.id('id')
+
+      .have.html('<em>hi</em>')
+      .have.text('hello')
+      .have.value('2013')
+
+      .be.visible
+      .be.hidden
+
+      .be.checked
+      .be.selected
+
+      .be.enabled
+      .be.disabled
+
+      .be.empty
+      .to.exist
+      .to.contain('text')
+      .to.have('.selector')
+```
+
+
+> [ricostacruz CheatSheets](https://github.com/rstacruz/cheatsheets)
+
+> [Discuss on gitter](https://gitter.im/bothelp/testing)
diff --git a/data/wiki/chai.md b/data/wiki/chai.md
new file mode 100644
index 0000000..03a4a38
--- /dev/null
+++ b/data/wiki/chai.md
@@ -0,0 +1,5 @@
+# Chai.js
+
+[Chai] (http://chaijs.com/) is a testing framework. More info:
+- `help chai assert`
+- `help chai expectations`
diff --git a/data/wiki/code-formatting.md b/data/wiki/code-formatting.md
new file mode 100644
index 0000000..c20640c
--- /dev/null
+++ b/data/wiki/code-formatting.md
@@ -0,0 +1,38 @@
+### Inline code
+This an inline \``<paste code here>`\` code formatting with a single backtick(\`) at *start* and *end* around the `code`.
+
+### Code Block
+\`\`\` ⇦ Type 3 backticks, then press `[shift + enter ⏎]`
+```text
+<paste your code here>,
+then press [shift + enter ⏎]
+```
+\`\`\` ⇦ Type 3 backticks, then press `[enter ⏎]`
+
+See also: ☛ [**How to type Backticks**](https://github.com/FreeCodeCamp/freecodecamp/wiki/code-formatting#typing-backticks) | ☯ [Compose Mode](https://gitter.zendesk.com/hc/en-us/articles/201302311-Compose-mode) | ❄ [Gitter Formatting Basics](https://gitter.zendesk.com/hc/en-us/articles/200176682-Markdown-basics)
+
+## Typing Backticks[⤴](http://superuser.com/a/254077/122424)
+### QWERTY and QWERTZ (Key that's been marked with red border)
+
+[![QWERTY][2]][3]
+
+### AZERTY France (<kbd>Alt Gr</kbd> + Key that's been marked with red border)
+
+[![AZERTY][4]][5]
+
+### AZERTY Belgium (<kbd>Alt Gr</kbd> + Key that's been marked with red border)
+
+[![enter image description here][6]][7]
+
+### QWERTY Estonian (Key's that have been marked with red border)
+
+![Estonian Keyboard layout](http://i.imgur.com/Ugcflkk.png)
+
+
+  [1]: http://en.wikipedia.org/wiki/Dead_key
+  [2]: http://i.stack.imgur.com/TOn1U.png
+  [3]: http://i.stack.imgur.com/TOn1U.png
+  [4]: http://i.stack.imgur.com/BTBIE.png
+  [5]: http://i.stack.imgur.com/BTBIE.png
+  [6]: http://i.stack.imgur.com/9o9hM.png
+  [7]: http://i.stack.imgur.com/9o9hM.png
\ No newline at end of file
diff --git a/data/wiki/css-selectors.md b/data/wiki/css-selectors.md
new file mode 100644
index 0000000..e098abc
--- /dev/null
+++ b/data/wiki/css-selectors.md
@@ -0,0 +1,26 @@
+In CSS, selectors are patterns used to select DOM elements.
+
+basic selectors like `a` or `h1`
+```css
+a { color: black; }
+h1 { font-size 24px; }
+```
+
+## cheat list of selectors
+```css
+.name            - all items of class 'name'
+#name            - ID of 'name'
+div#container    - all divs with 
+```
+but you can combine them in other ways like:
+```
+li a             -
+li > a           -
+li + a           -
+```
+
+## this is a stub entry! 
+please read up on this stuff from cheat sheets around the web and edit/complete this document!
+
+[Great Reference at CodeTuts](http://code.tutsplus.com/tutorials/the-30-css-selectors-you-must-memorize--net-16048)
+
diff --git a/data/wiki/css.md b/data/wiki/css.md
new file mode 100644
index 0000000..0a97b94
--- /dev/null
+++ b/data/wiki/css.md
@@ -0,0 +1,4 @@
+Cascading Style Sheets [(CSS)] (https://developer.mozilla.org/en-US/docs/Web/CSS) is a style sheet language used for describing the look and formatting of a document written in a markup language.
+
+> tags: css, stylesheets
+
diff --git a/data/wiki/dau.md b/data/wiki/dau.md
new file mode 100644
index 0000000..ac78fa2
--- /dev/null
+++ b/data/wiki/dau.md
@@ -0,0 +1,4 @@
+Daily Active Users
+
+often used in web startups as a core [KPI](kpi)
+see also [MAU](mau).
\ No newline at end of file
diff --git a/data/wiki/debugging.md b/data/wiki/debugging.md
new file mode 100644
index 0000000..abc2660
--- /dev/null
+++ b/data/wiki/debugging.md
@@ -0,0 +1,3 @@
+> Debugging helps you identify and remove errors from (computer hardware or software).
+
+Use [repl.it](http://repl.it/languages/JavaScript) to help you debug your code.  It shows the console output on the right as well as errors and lets you share your code snippets with other people.
diff --git a/data/wiki/demo-trim.md b/data/wiki/demo-trim.md
new file mode 100644
index 0000000..f9d7117
--- /dev/null
+++ b/data/wiki/demo-trim.md
@@ -0,0 +1,13 @@
+The chatwiki only shows up to the first `h2` heading, marked with two # symbols.
+This is a piece of demo content showing embedded scripts. 
+The first paragraph should display inside the chat.
+The second paragraph won't show in wiki chat, but will show if you click through.
+
+```js
+function test(a, b) {
+  return (a+b);
+}
+```
+
+## second paragraph
+This is the 2nd paragraph of content which is "below the fold" and won't be visible in the chat.
diff --git a/data/wiki/emoji.md b/data/wiki/emoji.md
new file mode 100644
index 0000000..be0632f
--- /dev/null
+++ b/data/wiki/emoji.md
@@ -0,0 +1,2 @@
+Gitter IM and GitHub both support a range of cool emoji (emoticons).
+From `:sunny:` :sunny: to `:poop:` :poop: you can express a range of emotions!
diff --git a/data/wiki/example.md b/data/wiki/example.md
new file mode 100644
index 0000000..2bcc9f2
--- /dev/null
+++ b/data/wiki/example.md
@@ -0,0 +1,24 @@
+This is an example wiki entry. Break it up with a `## H2 heading` as content before that will show in the chat, but the [rest is on the wiki](https://github.com/FreeCodeCamp/freecodecamp/wiki/example).
+
+```
+console.log("less is more!");
+```
+
+| ![HappyCamping](https://avatars2.githubusercontent.com/u/13561988?v=3&s=128) | -{ Happy Coding! :+1: } |
+| ------------- |:-------------|
+|      | https://github.com/camperbot|
+
+## anything after this ## heading doesn't show in the chat
+Anything below the first `## Heading` will only be shown in the wiki.
+
+- update
+When you're done editing, type `update`
+
+- For testing your update please use the bot testing channel here:
+https://gitter.im/camperbot/testing
+
+- If you put links [make them full URLs](https://github.com/FreeCodeCamp/freecodecamp/wiki/example) like that.
+
+:star2: :hamster: [emoji look cute! cheat sheet](http://www.emoji-cheat-sheet.com/)
+
+![images](https://s3.amazonaws.com/freecodecamp/landingIcons_connect.svg.gz)
diff --git a/data/wiki/falsey.md b/data/wiki/falsey.md
new file mode 100644
index 0000000..775af37
--- /dev/null
+++ b/data/wiki/falsey.md
@@ -0,0 +1,6 @@
+Something which evaluates to FALSE. There are only five falsey values in JavaScript:
+`undefined`, `null`, `NaN`, `0`, `""` (empty string), and `false` of course.
+
+## see also
+- [truthy](truthy) 
+- [Truthy & Falsey blog post](http://james.padolsey.com/javascript/truthy-falsey/)
\ No newline at end of file
diff --git a/data/wiki/fart.md b/data/wiki/fart.md
new file mode 100644
index 0000000..bdfe191
--- /dev/null
+++ b/data/wiki/fart.md
@@ -0,0 +1 @@
+Real mature.
\ No newline at end of file
diff --git a/data/wiki/help.md b/data/wiki/help.md
new file mode 100644
index 0000000..07d497a
--- /dev/null
+++ b/data/wiki/help.md
@@ -0,0 +1 @@
+this is the help section for the Wiki. Placeholder for now, please edit me!
\ No newline at end of file
diff --git a/data/wiki/higher-order-functions.md b/data/wiki/higher-order-functions.md
new file mode 100644
index 0000000..2698c5f
--- /dev/null
+++ b/data/wiki/higher-order-functions.md
@@ -0,0 +1,4 @@
+Functions that are higher!
+
+https://www.youtube.com/watch?v=BMUiFMZr7vk
+
diff --git a/data/wiki/how-to-post-code.md b/data/wiki/how-to-post-code.md
new file mode 100644
index 0000000..afe0837
--- /dev/null
+++ b/data/wiki/how-to-post-code.md
@@ -0,0 +1,3 @@
+use backticks `
+
+![posting](https://dl.dropboxusercontent.com/u/48751994/code.png)
diff --git a/data/wiki/html-elements.md b/data/wiki/html-elements.md
new file mode 100644
index 0000000..ad57553
--- /dev/null
+++ b/data/wiki/html-elements.md
@@ -0,0 +1,7 @@
+Most HTML elements have an opening tag and a closing tag. Opening tags look like this: `<h1>`. 
+
+Closing tags look like this: `</h1>`. 
+
+Note that the only difference between opening and closing tags is that closing tags have a slash after their opening angle bracket.
+
+Try it here! http://www.freecodecamp.com/challenges/waypoint-say-hello-to-html-elements
\ No newline at end of file
diff --git a/data/wiki/isLoggedInAsync().md b/data/wiki/isLoggedInAsync().md
new file mode 100644
index 0000000..ac046e2
--- /dev/null
+++ b/data/wiki/isLoggedInAsync().md
@@ -0,0 +1,17 @@
+Let's say you have a public page, but if the user is logged in you want to show special information to them. You'll need to detect if a user is logged in before you make an *$http* call, right? It’s not guaranteed that this will work, because *isLoggedIn()* is actually an async call. If you want to force something to wait until after *isLoggedIn()* is successful before it gets called, you should include *Auth.isLoggedInAsync*:
+
+~~~javascript
+$scope.isLoggedInAsync = Auth.isLoggedInAsync;
+~~~	
+
+*isLoggedInAsync* takes a callback function as an input, and passes the callback function a *true* boolean if the user is logged in, and a *false* if the user is not. You can call it like so: 
+
+~~~javascript
+$scope.isLoggedInAsync(callback(bool) {
+	if (bool) { /** do thing if they’re logged in **/ } 
+	else { /** do different thing if they’re not logged in **/ }
+});
+~~~
+
+[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Restrict-a-page-to-authenticated-users)
+[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Bonus:-SocketIO)
\ No newline at end of file
diff --git a/data/wiki/jQuery.md b/data/wiki/jQuery.md
new file mode 100644
index 0000000..a4ed59b
--- /dev/null
+++ b/data/wiki/jQuery.md
@@ -0,0 +1,8 @@
+It's the most used library in JavaScript. Is used to handle events, create animations, etc. to create dynamic web applications and pages. 
+- `$()` -> tells js we'll be using jQuery. 
+- `document` tells jQuery to work with our HTML
+- `.ready` -> makes the jQuery wait untill the page is completely loaded.
+
+## Keep adding 
+placeholder! work in progress!
+please add key notes here, these won't show up in chat.
\ No newline at end of file
diff --git a/data/wiki/js-arguments.md b/data/wiki/js-arguments.md
new file mode 100644
index 0000000..ed62675
--- /dev/null
+++ b/data/wiki/js-arguments.md
@@ -0,0 +1,62 @@
+The arguments object is an **array-like object** *(meaning that it looks like an array but it's not)* that stores all of the arguments that you passed to a function and is proprietary to that function in particular. If you were to pass 3 arguments to a function, say `storeNames()`, those 3 arguments would be stored inside an object called **arguments** and it would look like this when we pass the arguments `storeNames("Mulder", "Scully", "Alex Krycek")` to our function:
+
+- First, we declare a function and make it return the arguments object.
+``` javascript
+function storeNames() { return arguments; }
+```
+
+- Then, when we execute that function with **n arguments**, 3 in this case, it will return the object to us and it will **look like** an array. We can convert it to an array, but more on that later...
+``` javascript
+// If we execute the following line in the console:
+storeNames("Mulder", "Scully", "Alex Kryceck");
+// The output will be: ["Mulder", "Scully", "Alex Kryceck"]
+```
+
+If you want to know more about this, such as converting it to an array or the optimization problem that comes with using the *slice(*) method and how to solve it, click on **read more** (Gitter Chat Only).
+
+## Treat it as an array
+You can invoke arguments by using `arguments[n]` (where *n* is the index of the argument in the array-like object) but if you want to use it as an array for iteration purposes or applying array methods to it, you need to *convert it to an array* by declaring a variable and using the Array.prototype.slice.call method (because *arguments* is not an array):
+
+``` javascript
+var args = Array.prototype.slice.call(arguments)
+```
+
+Since **slice()** has two (the parameter **end** is optional) parameters, you can grab a certain portion of the arguments by specifying (using the *slice.call()* method renders these two parameters optional, not just *end*) the beginning and the ending of your portion; check out the following code:
+
+``` javascript
+function getGrades() {
+	var args = Array.prototype.slice.call(arguments, 1, 3);
+	return args;
+}
+
+// Let's output this!
+console.log(getGrades(90, 100, 75, 40, 89, 95));
+
+// OUTPUT SHOULD BE: //
+// [100, 75] <- Why? Because it started from index 1 and stopped at index 3
+// so, index 3 (40) wasn't taken in consideration.
+//
+// If we remove the '3' parameter, leaving just (arguments, 1) we'd get
+// every argument from index 1: [100, 75, 40, 89, 95].
+```
+
+### Optimization issues with Array.slice()
+
+There is a little problem, it's not recommended to use slice in the arguments object (optimization reasons)...
+
+> **Important**: You should not slice on arguments because it prevents optimizations in JavaScript engines (V8 for example). Instead, try constructing a new array by iterating through the arguments object. 
+
+> *by* ***Mozilla Developer Network***
+
+So, what other method is available to convert *arguments* to an array?
+I recommend the for-loop (not the for-in loop), you can do it like this:
+
+``` javascript
+var args = []; // Empty array, at first.
+for (var i = 0; i < arguments.length; i++) {
+	args.push(arguments[i])
+} // Now 'args' is an array that holds your arguments.
+```
+
+For more information on the optimization issues:  
+[Optimization Killers: Managing Arugments](https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3-managing-arguments)
\ No newline at end of file
diff --git a/data/wiki/js-closures.md b/data/wiki/js-closures.md
new file mode 100644
index 0000000..9a7fd6b
--- /dev/null
+++ b/data/wiki/js-closures.md
@@ -0,0 +1,16 @@
+Closures are functions that refer to independent (free) variables. In other words, the function defined in the closure 'remembers' the environment in which it was created.
+
+```js
+function init() {
+  var name = "Mozilla"; // name is a local variable created by init
+  function displayName() { // displayName() is the inner function, a closure
+    alert(name); // use variable declared in the parent function    
+  }
+  displayName();    
+};
+init();
+```
+
+see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures)
+
+> tags: closure, javascript, js
\ No newline at end of file
diff --git a/data/wiki/js-filter.md b/data/wiki/js-filter.md
new file mode 100644
index 0000000..7e4122f
--- /dev/null
+++ b/data/wiki/js-filter.md
@@ -0,0 +1,57 @@
+The `filter()` method creates a new array with all elements that pass the test implemented by the provided function
+
+```js
+arr.filter(callback[, thisArg])
+```
+
+## parameters
+
+|          | Parameter                           |
+|----------|-------------------------------------|
+| Required | Arr                                 |
+| Required | callback (function with max 3 args) |
+| Optional | thisArg                             |
+
+**Return:** A new array that contains all the values for which the callback function returns true. If the callback function returns false for all elements of array1, the length of the new array is 0.
+
+[MDN link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) | [MSDN link](https://msdn.microsoft.com/library/ff679973%28v=vs.94%29.aspx?f=255&MSPPError=-2147217396)
+
+## Examples
+```js
+// Define a callback function.
+function CheckIfPrime(value, index, ar) {
+    high = Math.floor(Math.sqrt(value)) + 1;
+    
+    for (var div = 2; div <= high; div++) {
+        if (value % div == 0) {
+            return false;
+        }
+    } 
+    return true;
+}
+
+// Create the original array.
+var numbers = [31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53];
+
+// Get the prime numbers that are in the original array. 
+var primes = numbers.filter(CheckIfPrime);
+
+document.write(primes);
+// Output: 31,37,41,43,47,53
+```
+
+```js
+// Create the original array.
+var arr = [5, "element", 10, "the", true];
+
+// Create an array that contains the string
+// values that are in the original array.
+var result = arr.filter(
+    function (value) {
+        return (typeof value === 'string');
+    }
+);
+
+document.write(result);
+// Output: element, the
+```
\ No newline at end of file
diff --git a/data/wiki/js-for-in.md b/data/wiki/js-for-in.md
new file mode 100644
index 0000000..930e976
--- /dev/null
+++ b/data/wiki/js-for-in.md
@@ -0,0 +1,58 @@
+The `for..in` statement iterates over the enumerable properties of an object, in arbitrary order. For each distinct property, statements can be executed.
+
+```js
+for (variable in object) {
+...
+}
+```
+
+| Required/Optional | Parameter | Description                                                          |
+|-------------------|-----------|----------------------------------------------------------------------|
+| Required          | Variable  | A different property name is assigned to variable on each iteration. |
+| Optional          | Object    | Object whose enumerable properties are iterated.                     |
+
+[MDN link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in) | [MSDN link](https://msdn.microsoft.com/library/55wb2d34.aspx)
+
+## Examples
+```js
+// Initialize object.
+a = {"a" : "Athens" , "b" : "Belgrade", "c" : "Cairo"}
+
+// Iterate over the properties.
+var s = ""
+for (var key in a) {
+    s += key + ": " + a[key];
+    s += "<br />";
+    }
+document.write (s);
+
+// Output:
+// a: Athens
+// b: Belgrade
+// c: Cairo
+```
+
+```js
+// Initialize the array.
+var arr = new Array("zero","one","two");
+
+// Add a few expando properties to the array.
+arr["orange"] = "fruit";
+arr["carrot"] = "vegetable";
+
+// Iterate over the properties and elements.
+var s = "";
+for (var key in arr) {
+    s += key + ": " + arr[key];
+    s += "<br />";
+}
+
+document.write (s);
+
+// Output:
+//   0: zero
+//   1: one
+//   2: two
+//   orange: fruit
+//   carrot: vegetable
+```
\ No newline at end of file
diff --git a/data/wiki/js-for-of.md b/data/wiki/js-for-of.md
new file mode 100644
index 0000000..fbdee36
--- /dev/null
+++ b/data/wiki/js-for-of.md
@@ -0,0 +1,43 @@
+The `for..or` statement creates a loop Iterating over iterable objects (including Array, Map, Set, arguments object and so on), invoking a custom iteration hook with statements to be executed for the value of each distinct property.
+
+```js
+for (variable of object) {
+  statement
+}
+```
+
+|          | Description                          |
+|----------|-------------------------------------|
+| variable | On each iteration a value of a different property is assigned to variable.                                 |
+| object | Object whose enumerable properties are iterated. |
+
+[MDN link](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/for...of) | [MSDN link](https://msdn.microsoft.com/library/dn858238%28v=vs.94%29.aspx?f=255&MSPPError=-2147217396)
+
+## Examples
+
+```js
+let arr = [ "fred", "tom", "bob" ];
+
+for (let i of arr) {
+    console.log(i);
+}
+
+// Output:
+// fred
+// tom
+// bob
+```
+
+```js
+var m = new Map();
+m.set(1, "black");
+m.set(2, "red");
+
+for (var n of m) {
+console.log(n);
+}
+
+// Output:
+// 1,black
+// 2,red
+```
\ No newline at end of file
diff --git a/data/wiki/js-for.md b/data/wiki/js-for.md
new file mode 100644
index 0000000..c7cfee9
--- /dev/null
+++ b/data/wiki/js-for.md
@@ -0,0 +1,12 @@
+The javascript `for` command iterates through a list of items.
+
+```js
+for (var i = 0; i < 9; i++) {
+   console.log(i);
+   // more statements
+}
+```
+
+links: [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for)
+
+related: js-loops
diff --git a/data/wiki/js-immutable.md b/data/wiki/js-immutable.md
new file mode 100644
index 0000000..3455c24
--- /dev/null
+++ b/data/wiki/js-immutable.md
@@ -0,0 +1,18 @@
+> Immutable means unchangeable i.e. you can't change.
+
+Javascript has lots of immutable types e.g. `string` primitive type. Try this in your console.
+
+```js
+s = "red";
+console.log(s[1]); //→ "e"
+s[1] = "x";
+console.log(s) //→ "red"
+```
+the `s` didn't change! WAT!
+
+## Details
+Some string methods like `String.replace` returns a new string. 
+
+JavaScript has one complex data type, the Object data type, and it has five simple data types: Number, String, Boolean, Undefined, and Null. These simple (primitive) data types are immutable (cannot be changed), while objects are mutable (can be changed).
+
+tags: js, immutability
\ No newline at end of file
diff --git a/data/wiki/js-indexof.md b/data/wiki/js-indexof.md
new file mode 100644
index 0000000..ce72836
--- /dev/null
+++ b/data/wiki/js-indexof.md
@@ -0,0 +1,42 @@
+## Array.prototype.indexOf()
+
+The `indexOf()` method returns the first index at which a given element can be found in the array, or -1 if it is not present.
+
+```js
+arr.indexOf(searchElement[, fromIndex = 0])
+```
+
+## Parameters
+
+|          | Parameter                           |
+|----------|-------------------------------------|
+| Required | Arr                                 |
+| Required | searchElement |
+| Optional | fromIndex                             |
+
+**Return:** -1 if the element is not found in the array or an integer >=0, the position of the element in the array
+
+[MDN link](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)
+
+## Examples
+**Use Case:** Check to see if there are any apples in the fruit basket (defined as an array)?
+```js
+var basket = ['apple','orange','banana','strawberry'];
+```
+**Without** indexOf()
+```js
+var found = false;
+for(var i= 0, l = basket.length; i< l; i++){
+	if(basket[i] === 'apple'){
+		found = true;
+                break;
+	}
+}
+console.log(found);
+```
+**With** indexOf()
+```js
+console.log(basket.indexOf("apple") != -1);
+```
+
+tags: js, array
\ No newline at end of file
diff --git a/data/wiki/js-loops.md b/data/wiki/js-loops.md
new file mode 100644
index 0000000..6083cd3
--- /dev/null
+++ b/data/wiki/js-loops.md
@@ -0,0 +1,17 @@
+Javascript has a few different ways to control flow, otherwise known as loops
+
+- [for](js-for)
+- [while](js-while)
+- [until](js-until)
+
+you can type `js for` or `js while` to get more info on any of these.
+
+this is a stub entry, please help add to it!
+
+----
+
+> Links: [MDN **for loop**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for)
+
+> related: for, while, for-each, for-of, for-in
+
+> advanced: comprehensions, iterators
diff --git a/data/wiki/js-map.md b/data/wiki/js-map.md
new file mode 100644
index 0000000..8ed08bb
--- /dev/null
+++ b/data/wiki/js-map.md
@@ -0,0 +1,63 @@
+The method `map` of the Array prototype allows you to grab a hold of each element inside an array and apply a function to them. After **map** finishes iterating through the array, it will return a **new array** with the results of applying the function to the aforementioned elements.
+
+#### The syntax is as follows:
+`myAwesomeArray.map(myAwesomeFunction)`
+
+Since **map** doesn't mutate the original array, it should be used as a value, stored inside a variable, passed in as a **returned value** inside a function (the most common case) and many other things.
+Let's learn a little bit of what this powerful function can do! Say we have an array of  names and we want to create a new array with these names but UPPERCASED.
+
+``` javascript
+var names = ["Leia", "Anakin", "Luke", "Obi Wan Kenobi"];
+var uppercaseNames = names.map(function(name) {
+  return name.toUpperCase();
+};
+```
+Now if we `console.log(uppercaseNames)` we will get this:
+> `Array(4) -> ["LEIA", "ANAKIN", "LUKE", "OBI WAN KENOBI"]`
+
+But how does it work? Let's dive more into it.
+
+## Let's talk about the callback parameters
+The callback is the function that the Array.map() method accepts, it can be an anonymous function or an already declared function with the following parameters which, by the way, you can name as you please:
+
+1- **currentValue**: As the name suggest, it's the current element of the array being evaluated and waiting for your function to replace it with a new value in the new array (same index of course).
+
+2- **index**: It equals to the numeric index of currentValue, say you are in "Anakin", that means index, at the time, will equal to **1**.
+
+3- **array**: The array that's calling the method, in this case, it's referring to **names**.
+
+Examples work better than loose explanations, now we can make our callback function turn `["Leia", "Anakin", "Luke", "Obi Wan Kenobi"]` into `["My name is Leia, I'm #1", "My name is Anakin, I'm #2", "My name is Luke, I'm #3", "And last but not less important, I'm #4 Obi Wan Kenobi"]`. Sounds interesting and complex huh? It's actually not if you put the first two parameters to use.
+
+``` javascript
+var jediMasters = ["Leia", "Anakin", "Luke", "Obi Wan Kenobi"];
+var jediMastersSayHi = jediMasters.map(function(jediName, jediIndex) {
+  if (jediName === "Obi Wan Kenobi") {
+    return "And last but not less important, I'm #" + (jediIndex + 1) + " " + jediName;
+  } else {
+    return "My name is " + jediName + ", I'm #" + (jediIndex + 1);
+  }
+}); // We're done mapping, now console.log the whole thing.
+```
+
+If we now console out the values of the two arrays, we get this:
+
+![Map in action](https://www.evernote.com/shard/s539/sh/75d6da94-dd29-4dd6-98b7-9ee7260533ca/21e0ed3c9e391b9507128a42d2b12421/res/77e93999-b27c-46c5-b101-f9ed32d7aee0/skitch.png)
+
+If you are asking why one of the values in the string concatenation is `(jediIndex + 1)`, that's because **indices are 0-based**, we would get 0, 1, 2 and 3 for our Jedi's and that's not cool. Check that IF statement just sitting there, what does it do? Simple, it checks if the current Jedi is Obi Wan, if it is, then the new value of that element of the array (the new one) should be different from the rest.
+
+It's important to note that **we can write the function outside the map method** and call it with the name's function. Let's one more time re-write our code and see how we can achieve this (I think it's cleaner):
+
+``` javascript
+function sayHi(jedi, index) {
+  if (jedi === "Obi Wan Kenobi") {
+    return "And last but not less important, I'm #" + (index + 1) + " " + jedi;
+  } else {
+    return "My name is " + jedi + ", I'm #" + (index + 1);
+  }
+}
+
+var jediMasters = ["Leia", "Anakin", "Luke", "Obi Wan Kenobi"];
+var jediMastersSayHi = jediMasters.map(sayHi); // We're done mapping, now console.log the whole thing.
+```
+
+We can use map in strings and other types of objects if we use `Array.prototype.call(objectToBeMapped, callbackFunction)`, for more examples, go look other sites and practise it.
\ No newline at end of file
diff --git a/data/wiki/js-slice.md b/data/wiki/js-slice.md
new file mode 100644
index 0000000..5e728e8
--- /dev/null
+++ b/data/wiki/js-slice.md
@@ -0,0 +1,37 @@
+> The `slice()` method returns a shallow copy of a portion of an array into a new array object.
+
+```js
+arr.slice([begin[, end]])
+```
+
+| Necessity | Parameter | Description                                                          |
+|-------------------|-----------|----------------------------------------------------------------------|
+| Required          | arr  | An Array object. |
+| Required          | begin    | The beginning of the specified portion of array.                     |
+| Optional          | end  | The end of the specified portion of array. |
+
+**Return:** The slice method returns an *Array object* containing the specified portion of arrayObj.
+
+[MDN link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice) | [MSDN link](https://msdn.microsoft.com/library/tkcsy6fe%28v=vs.94%29.aspx?f=255&MSPPError=-2147217396)
+
+## Examples
+```js
+var origArray = [3, 5, 7, 9];
+var newArray = origArray. slice(0, -1);
+document.write(origArray);
+document.write("<br/>");
+newArray = origArray. slice(-2);
+document.write(newArray);
+
+// Output:
+// 3,5,7,9
+// 7,9
+```
+
+```js
+// Our good friend the citrus from fruits example
+var fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango'];
+var citrus = fruits.slice(1, 3);
+
+// citrus contains ['Orange','Lemon']
+```
\ No newline at end of file
diff --git a/data/wiki/js-ternary.md b/data/wiki/js-ternary.md
new file mode 100644
index 0000000..bef3c3b
--- /dev/null
+++ b/data/wiki/js-ternary.md
@@ -0,0 +1,13 @@
+The Ternary operator replaces an if/then block.
+It's mostly used in one liners for simple tests and replacements, like this:
+
+```js
+var x = false;
+var s = x ? "yes" : "no";
+console.log(s);  //→ "no"
+
+```
+## Description
+If condition is true, the operator returns the value of expr1; otherwise, it returns the value of expr2. For example, to display a different message based on the value of the isMember variable, you could use this statement:
+
+**Read more:** [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator)
\ No newline at end of file
diff --git a/data/wiki/js-undefined.md b/data/wiki/js-undefined.md
new file mode 100644
index 0000000..067e063
--- /dev/null
+++ b/data/wiki/js-undefined.md
@@ -0,0 +1,3 @@
+A primitive value automatically assigned to variables that have just been declared or to formal arguments for which there are no actual arguments.
+
+[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined)
\ No newline at end of file
diff --git a/data/wiki/latex.md b/data/wiki/latex.md
new file mode 100644
index 0000000..07ff752
--- /dev/null
+++ b/data/wiki/latex.md
@@ -0,0 +1,38 @@
+LaTeX is designed for the production of technical and scientific documentation.
+You can create matrix, arrays or several other mathmatical functions.
+
+`` $$ (latex language) $$ ``
+
+You can embed Latex in GitterIM. Examples:
+
+**Array**:
+$$\begin{array} {c c}
+arr11 & arr12\\
+arr21 & arr22\\
+\end{array}$$
+
+**Matrix**:
+$$\begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}$$
+
+**formatting**:
+$$\huge\textstyle\color{#F00}{BigRed}\small\textstyle\color{#0F0}{SmallGreen}$$
+
+[Function Support](https://github.com/Khan/KaTeX/wiki/Function-Support-in-KaTeX)
+## details
+[KaTeX Github Repo](https://github.com/Khan/KaTeX)
+LaTeX is a high-quality typesetting system; it includes features designed for the production of technical and scientific documentation. LaTeX is the de facto standard for the communication and publication of scientific documents.
+His advantages are noticable in long documents like books, papers or thesis.
+
+Gitter uses Katex (an custom implementation of LaTeX) and it can be used introducing the following code:
+
+```latex
+$$\begin{array} {c c}
+item11 & item12\
+item21 & item 22\
+\end{array}
+$$
+```
+
+Text:
+- `$$\huge\textstyle{some text}$$` -> $$\huge\textstyle{some text}$$
+- `$$\color{#F90}{some text}$$` -> $$\color{#F90}{some text}$$
\ No newline at end of file
diff --git a/data/wiki/ooda.md b/data/wiki/ooda.md
new file mode 100644
index 0000000..66feece
--- /dev/null
+++ b/data/wiki/ooda.md
@@ -0,0 +1,6 @@
+The OODA Loop is about how fast you can iterate. Often referenced in Lean Startup circles.
+
+![OODA](https://upload.wikimedia.org/wikipedia/commons/3/3a/OODA.Boyd.svg)
+
+## see also
+https://en.wikipedia.org/wiki/OODA_loop
\ No newline at end of file
diff --git a/data/wiki/promises.md b/data/wiki/promises.md
new file mode 100644
index 0000000..a909ec5
--- /dev/null
+++ b/data/wiki/promises.md
@@ -0,0 +1,11 @@
+A new feature of ES6 to help with async programming.
+
+## syntax
+```javascript
+new Promise(executor);
+new Promise(function(resolve, reject) { ... });
+```
+
+![MDN image](https://mdn.mozillademos.org/files/8633/promises.png)
+
+read more at [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
\ No newline at end of file
diff --git a/data/wiki/quincy-larson.md b/data/wiki/quincy-larson.md
new file mode 100644
index 0000000..c417f6f
--- /dev/null
+++ b/data/wiki/quincy-larson.md
@@ -0,0 +1 @@
+> Founder of [FreeCodeCamp.com](http://freecodecamp.com) !
\ No newline at end of file
diff --git a/data/wiki/random.md b/data/wiki/random.md
new file mode 100644
index 0000000..1c8450b
--- /dev/null
+++ b/data/wiki/random.md
@@ -0,0 +1,4 @@
+my random thing! This is the above the fold content that will be shown in the chat.
+
+## more stuff
+more random stuff. anything below the first ## will only be shown in the wiki.
diff --git a/data/wiki/regex.md b/data/wiki/regex.md
new file mode 100644
index 0000000..157766e
--- /dev/null
+++ b/data/wiki/regex.md
@@ -0,0 +1,29 @@
+> Links to useful RegEx resources. 
+
+* **Getting Started Tutorial:** http://regexone.com (FCC recommended)
+* **RegEx 101:** https://regex101.com
+
+**See also:** Regex [**Tutorials**](https://github.com/FreeCodeCamp/freecodecamp/wiki/regex#regex-tutorial--guides) | [**Testing**](https://github.com/FreeCodeCamp/freecodecamp/wiki/regex#regex-testing-ground) | [Games](https://github.com/FreeCodeCamp/freecodecamp/wiki/regex#regex-gameplay) | [Blogs](https://github.com/FreeCodeCamp/freecodecamp/wiki/regex#regex-blog) | [Software](https://github.com/FreeCodeCamp/freecodecamp/wiki/regex#software-aids-for-regex)
+
+## RegEx Tutorial & Guides
+* **RegEx Tutorial:** http://www.regular-expressions.info/tutorial.html (detailed explanation)
+* **RegEx Cheatsheet:** http://www.cheatography.com/davechild/cheat-sheets/regular-expressions
+* **MDN RegEx Guide:** https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
+* **StackOverflow RegEx FAQ:** http://stackoverflow.com/a/22944075/1262108
+* **RegEx Video Tutorial:** https://www.youtube.com/watch?v=EkluES9Rvak
+
+## RegEx Testing Ground
+* **RegEx Visualizer:** https://www.debuggex.com/?flavor=javascript
+* **RegEx Challenges in Hackerrank:** https://www.hackerrank.com/domains/algorithms/regex (practice)
+* **RegEx Regexplained:** https://leaverou.github.io/regexplained/
+## RegEx Gameplay
+* **RegEx Golf:** http://regex.alf.nu
+* **RegEx Crossword:** http://regexcrossword.com
+
+## RegEx Blog
+* **Rex Egg:** http://www.rexegg.com
+
+### Software Aids for RegEx
+* **RegExBuddy:** http://www.regexbuddy.com (proprietary)
+* **Expresso:** http://www.ultrapico.com/expresso.htm (free)
+* **RegEx Coach:** http://www.weitz.de/regex-coach/ (free)
\ No newline at end of file
diff --git a/data/wiki/scope.md b/data/wiki/scope.md
new file mode 100644
index 0000000..aed5e6e
--- /dev/null
+++ b/data/wiki/scope.md
@@ -0,0 +1,5 @@
+The current context of execution. The context in which values and expressions are "visible," or can be referenced. If a variable or other expression is not "in the current scope," then it is unavailable for use. Scopes can also be layered in a hierarchy, so that child scopes have access to parent scopes, but not vice versa.
+
+## Further Reading
+* [Understanding Scope and Context](http://ryanmorr.com/understanding-scope-and-context-in-javascript/) - Detailed explanation with examples by Ryan Morr
+* [Wikipedia - Scope](https://en.wikipedia.org/wiki/Scope_(computer_science))
\ No newline at end of file
diff --git a/data/wiki/staging.md b/data/wiki/staging.md
new file mode 100644
index 0000000..791e0bd
--- /dev/null
+++ b/data/wiki/staging.md
@@ -0,0 +1 @@
+see beta site.
\ No newline at end of file
diff --git a/data/wiki/test.md b/data/wiki/test.md
new file mode 100644
index 0000000..a459bc2
--- /dev/null
+++ b/data/wiki/test.md
@@ -0,0 +1 @@
+something
\ No newline at end of file
diff --git a/data/wiki/testingjson.md b/data/wiki/testingjson.md
new file mode 100644
index 0000000..821c0af
--- /dev/null
+++ b/data/wiki/testingjson.md
@@ -0,0 +1 @@
+too long
\ No newline at end of file
diff --git a/data/wiki/topic.md b/data/wiki/topic.md
new file mode 100644
index 0000000..19342fd
--- /dev/null
+++ b/data/wiki/topic.md
@@ -0,0 +1,6 @@
+This is an example. You should replace `topic` with the thing you want to find info on.
+For example:
+```text
+wiki css    # find a wiki page on css
+find js     # find all pages related to css
+```
\ No newline at end of file
diff --git a/data/wiki/triphop.md b/data/wiki/triphop.md
new file mode 100644
index 0000000..2c4a1c9
--- /dev/null
+++ b/data/wiki/triphop.md
@@ -0,0 +1,3 @@
+https://soundcloud.com/nasostsolakis/sets/triphop_electronic
+
+embedding a soundcloud track in the wiki!
\ No newline at end of file
diff --git a/data/wiki/troll.md b/data/wiki/troll.md
new file mode 100644
index 0000000..70d5506
--- /dev/null
+++ b/data/wiki/troll.md
@@ -0,0 +1,2 @@
+Defenition: CamperBot
+It will make you want to leave chat forever!
\ No newline at end of file
diff --git a/data/wiki/truthy.md b/data/wiki/truthy.md
new file mode 100644
index 0000000..767fdee
--- /dev/null
+++ b/data/wiki/truthy.md
@@ -0,0 +1,5 @@
+> A **truthy** value is a value that translates to **true** when evaluated in a *Boolean* context.
+
+All values are **truthy** unless they are defined as **falsy** (i.e. except for `false`, `0`, `""`, `null`, `undefined` and `NaN`).
+
+**See Also:** [MDN](https://developer.mozilla.org/en-US/docs/Glossary/Truthy)
\ No newline at end of file
diff --git a/data/wiki/twitch.md b/data/wiki/twitch.md
new file mode 100644
index 0000000..d1abe31
--- /dev/null
+++ b/data/wiki/twitch.md
@@ -0,0 +1,3 @@
+you can see the FCC Twitch Channel from here:
+
+http://www.twitch.tv/freecodecamp
diff --git a/data/wiki/underworld.md b/data/wiki/underworld.md
new file mode 100644
index 0000000..6042479
--- /dev/null
+++ b/data/wiki/underworld.md
@@ -0,0 +1 @@
+https://soundcloud.com/underworld/saved-from-the-cutting-room-floor-mix-underworld-vs-the-misterons-1
\ No newline at end of file
diff --git a/data/wiki/update.md b/data/wiki/update.md
new file mode 100644
index 0000000..435e169
--- /dev/null
+++ b/data/wiki/update.md
@@ -0,0 +1,2 @@
+the update command will pull down any new wiki edits, or new material.
+right now you have to do this manually, sorry! But we will in future automate this process.
diff --git a/data/wiki/video-demo.md b/data/wiki/video-demo.md
new file mode 100644
index 0000000..19ad15f
--- /dev/null
+++ b/data/wiki/video-demo.md
@@ -0,0 +1,3 @@
+you can add inline video to the wiki with just a google link. Inside the chatwiki this will show up as an embedded video.
+
+https://www.youtube.com/watch?v=BMUiFMZr7vk
diff --git a/data/wiki/video.md b/data/wiki/video.md
new file mode 100644
index 0000000..87a53e0
--- /dev/null
+++ b/data/wiki/video.md
@@ -0,0 +1,4 @@
+demoing inline video clips
+
+https://www.youtube.com/watch?v=BMUiFMZr7vk
+
diff --git a/data/wiki/wat.md b/data/wiki/wat.md
new file mode 100644
index 0000000..f08359f
--- /dev/null
+++ b/data/wiki/wat.md
@@ -0,0 +1,3 @@
+A brilliant talk about objects in ruby, javascript and other languages. Funny and insightful.
+
+https://www.destroyallsoftware.com/talks/wat
diff --git a/data/wiki/wiki-js-template.md b/data/wiki/wiki-js-template.md
new file mode 100644
index 0000000..221ecdd
--- /dev/null
+++ b/data/wiki/wiki-js-template.md
@@ -0,0 +1,25 @@
+> This Template helps you build javascript topic wiki's.
+
+### Introduction
+
+```js
+Syntax of the method that you are writing about
+```
+
+| Parameter  |           Description                         |   Necessity   |
+|------------|-----------------------------------------------|---------------|
+|  Variable  | I'm a Description                             |   Required    |
+|  Object    | The position of vertical bar is not important |   Optional    |
+
+[MDN link](URL here) | [MSDN link](URL here)
+
+## Examples
+> You should provide at least 2 different examples
+
+```js
+INSERT EXAMPLE HERE
+```
+
+```js
+INSERT EXAMPLE HERE
+```
\ No newline at end of file
diff --git a/docs/.eslintrc b/docs/.eslintrc
new file mode 100644
index 0000000..3bae635
--- /dev/null
+++ b/docs/.eslintrc
@@ -0,0 +1,23 @@
+{
+  "env": {
+    "browser": 0
+  },
+ 
+  "globals": {
+    "require": 1,
+    "console": 1
+    "module": 1
+  },
+ 
+  "rules": {
+    "quotes": [2, "double"],
+    "strict": [2, "global"],
+    "no-console": 0
+  },
+
+  "ecmaFeatures": {
+    "blockBindings": true,
+    "forOf": true,
+    "jsx": true
+  },
+}
\ No newline at end of file
diff --git a/docs/TODO.txt b/docs/TODO.txt
new file mode 100644
index 0000000..e3eef9e
--- /dev/null
+++ b/docs/TODO.txt
@@ -0,0 +1,112 @@
+TODO
+
+- set room topic on entering the room / for that room?
+  if bonfire flag = true
+
+- call to action at the end "add comments / edit"
+
+-
+
+
+    step through Luis lesson (wikihints)
+    allow users to add hints to bonfires?
+    co-browsing panel
+
+    advanced/other bonfires data
+    disable same message twice
+    volume feature
+
+    test out in main chat?
+
+X bugfix 'unauthorized user' message
+
+
+
+/more command
+
+hook in chatbot engine
+
+'scan' and listen for mentions / send a link?
+redirect to the bonfire help room
+
+lesson tips read from the wiki?
+
+
+------
+
+find / choose from list
+
+better search / help / find
+    choose first matching item?
+    if only one item return content right away
+
+
+thanks archive
+    read history of messages
+    tag
+    write to file?
+    send link to file?
+
+archiving messages?
+after basic thanks/karma system?
+
+karma code API call to FCC
+
+DM system
+
+
+# chatbot script
+integrated for conversation and topics, discussions
+
+# Basic Commands
+    menu - show commands
+    index - all topics
+    help - help page from wiki?
+
+
+# Bot Querying
+    replace spaces in topic names
+    hierarchical search?
+    Helper bot query syntax
+
+thanks @user
+    ask question, fire response?
+    show confirmation "gave a tip to user X!"
+    play animation
+
+
+# direct messaging
+    DMs to the bot, between players
+    send a link to open 1:1 chat
+
+
+what User info do we get?
+
+
+timeout / gambit / opener to keep activity
+
+
+
+
+YAML importer?
+break up room data into a yaml file
+
+
+
+------------
+Questions
+
+running mocha with iojs?
+
+Rooms, RoomData, - classnames?
+ES6 classes or prototypes?
+
+config files for different environments
+
+
+Mongoose wrapper?
+how best to use mongo?
+
+iojs install/version
+
+
diff --git a/docs/credentials.md b/docs/credentials.md
new file mode 100644
index 0000000..0804b1b
--- /dev/null
+++ b/docs/credentials.md
@@ -0,0 +1,46 @@
+# Setting up login credentials
+
+Apologies as this is a bit unclean right now. 
+
+You'll need to get a gitter.im token to use for your bot.
+create a new app here
+https://developer.gitter.im/apps
+
+Now make a copy of the `bin/credentials-example` file.
+Save it as credentials-YOUR_GITHUB_ID
+and fill in the fields.
+
+Look in the file data/RoomData.js
+
+```js
+var BotRoomData = {
+
+    // this controls which rooms you can access
+    YOUR_GITHUB_ID: [
+        // change this to be a room your user is already in
+        {
+            title: "bothelp",
+            name: "YOUR_GITHUB_ID/testing",
+            icon: "question",
+            topics: ["chitchat", "bots", "bot-development", "camperbot"]
+        },
+```
+
+once that's setup you should be able to run the app from this script
+
+    $ bin/run-YOUR_GITHUB_ID.sh
+
+Then access your new room in the web browser
+
+        http://gitter.im/YOUR_GITHUB_ID/testing
+
+Of course in all this, you should change YOUR_GITHUB_ID to your actual github ID!
+(Or better, make a separate github account for purposes of testing the bot)
+
+You can see in this commit as I tagged the areas which needed changing to make this generic.
+https://github.com/dcsan/gitterbot/commit/4af309c3a068d35207ca6be150446e1e059e85cd
+
+When you start the server the default is to run on port 7891
+You don't have to deploy this server anywhere - it will connect to gitter.im 
+
+
diff --git a/docs/eslintrc.yaml b/docs/eslintrc.yaml
new file mode 100644
index 0000000..4c8b9f4
--- /dev/null
+++ b/docs/eslintrc.yaml
@@ -0,0 +1,24 @@
+rules:
+  indent:
+    - 2
+    - 4
+  quotes:
+    - 2
+    - double
+  linebreak-style:
+    - 2
+    - unix
+  semi:
+    - 2
+    - always
+
+  no-unused-vars: 
+    - 2
+    - 
+      vars: "none"
+      args: "after-used"
+
+
+env:
+  es6: true
+  node: true
diff --git a/docs/nap.sublime-project b/docs/nap.sublime-project
new file mode 100644
index 0000000..5941e0d
--- /dev/null
+++ b/docs/nap.sublime-project
@@ -0,0 +1,18 @@
+{
+    "folders":
+    [
+        {
+            "follow_symlinks": true,
+            "path": "../app"
+        },
+
+        {
+            "follow_symlinks": true,
+            "path": "..",
+            "folder_exclude_patterns": ["node_modules"]            
+        }
+
+    ]
+
+}
+
diff --git a/docs/nap.sublime-workspace b/docs/nap.sublime-workspace
new file mode 100644
index 0000000..9710df5
--- /dev/null
+++ b/docs/nap.sublime-workspace
@@ -0,0 +1,2002 @@
+{
+	"auto_complete":
+	{
+		"selected_items":
+		[
+			[
+				"bonfireH",
+				"bonfireHint(input, bot)	bonfire.js"
+			],
+			[
+				"bon",
+				"bonfireHeader()	bonfire.js"
+			],
+			[
+				"bonfire",
+				"bonfireScript(input, bot)	bonfire.js"
+			],
+			[
+				"undefined",
+				"undefined"
+			],
+			[
+				"TEST",
+				"TEST_BF_NAME	BonfiresSpec.js"
+			],
+			[
+				"TE",
+				"TEST_BF_NAME	BonfiresSpec.js"
+			],
+			[
+				"hint",
+				"hintNum"
+			],
+			[
+				"hasPro",
+				"hasProperty(name, obj)	hasProperty.js"
+			],
+			[
+				"serverE",
+				"serverEnv	AppConfig.js"
+			],
+			[
+				"res",
+				"res	GBotSpec.js"
+			],
+			[
+				"KB",
+				"KBase"
+			],
+			[
+				"bot",
+				"bothelp"
+			],
+			[
+				"we",
+				"welcome"
+			],
+			[
+				"out",
+				"output"
+			],
+			[
+				"ma",
+				"makeMessageFromString"
+			],
+			[
+				"check",
+				"checkWiki"
+			],
+			[
+				"list",
+				"listenToRoom"
+			],
+			[
+				"btn",
+				"btn-lg"
+			],
+			[
+				"git",
+				"githubType"
+			],
+			[
+				"GItter",
+				"GitterHelper"
+			],
+			[
+				"gitt",
+				"gitterHelper"
+			],
+			[
+				"init",
+				"initPromise"
+			],
+			[
+				"by",
+				"findByTopic"
+			],
+			[
+				"font-s",
+				"font-size"
+			],
+			[
+				"Gi",
+				"GitterBot"
+			],
+			[
+				"pass",
+				"passportLogin"
+			],
+			[
+				"repl",
+				"replyString"
+			],
+			[
+				"ab",
+				"absolute"
+			],
+			[
+				"pause",
+				"pause-button"
+			],
+			[
+				"im",
+				"improve"
+			],
+			[
+				"font-",
+				"font-face"
+			],
+			[
+				"story",
+				"storyStars"
+			],
+			[
+				"TaskL",
+				"TaskLists"
+			],
+			[
+				"f",
+				"font-size"
+			],
+			[
+				"reset",
+				"resetDrill"
+			],
+			[
+				"tas",
+				"tasklist"
+			],
+			[
+				"Tast",
+				"TaskLists"
+			],
+			[
+				"step",
+				"stepNum"
+			],
+			[
+				"stpe",
+				"stepNum"
+			],
+			[
+				"task",
+				"taskname"
+			],
+			[
+				"prog",
+				"progress"
+			],
+			[
+				"drills",
+				"drills-container"
+			],
+			[
+				"taskli",
+				"tasklist"
+			],
+			[
+				"sta",
+				"starcount"
+			],
+			[
+				"che",
+				"checkPassed"
+			],
+			[
+				"findO",
+				"findOrCreate"
+			],
+			[
+				"max",
+				"maxStars"
+			],
+			[
+				"split",
+				"splitMode"
+			],
+			[
+				"par",
+				"parseBool"
+			],
+			[
+				"mul",
+				"multiChoice"
+			],
+			[
+				"totalS",
+				"totalStars"
+			],
+			[
+				"s",
+				"showInput"
+			],
+			[
+				"font",
+				"font-family"
+			],
+			[
+				"mar",
+				"margin-left"
+			],
+			[
+				"first",
+				"firstLine"
+			],
+			[
+				"skip",
+				"skipReply"
+			],
+			[
+				"err",
+				"error"
+			],
+			[
+				"stor",
+				"storyname"
+			],
+			[
+				"sto",
+				"storyPercent"
+			],
+			[
+				"Player",
+				"PlayerTasks"
+			],
+			[
+				"parse",
+				"parseBool"
+			],
+			[
+				"Pla",
+				"PlayerTasks"
+			],
+			[
+				"stea",
+				"streamImage"
+			],
+			[
+				"sc",
+				"sceneHeight"
+			],
+			[
+				"APP_",
+				"APP_ARG"
+			],
+			[
+				"reply",
+				"replyObj"
+			],
+			[
+				"load",
+				"loadBrainsFromJsonAndCodeDump"
+			],
+			[
+				"brain",
+				"brainPath"
+			],
+			[
+				"brains",
+				"brainsDumpImport"
+			],
+			[
+				"strea",
+				"streamFontMedium"
+			],
+			[
+				"next",
+				"nextUrl"
+			],
+			[
+				"start",
+				"startTime"
+			],
+			[
+				"paris",
+				"pairsdata"
+			],
+			[
+				"pairs",
+				"pairsdata"
+			],
+			[
+				"voca",
+				"vocabAll"
+			],
+			[
+				"chec",
+				"checkActions"
+			],
+			[
+				"margin",
+				"margin-bottom"
+			],
+			[
+				"tile-sec",
+				"tile-section-title"
+			],
+			[
+				"back",
+				"background-image"
+			],
+			[
+				"as",
+				"absolute"
+			],
+			[
+				"marg",
+				"margin-bottom"
+			],
+			[
+				"font-m",
+				"font-medium"
+			],
+			[
+				"arra",
+				"arrayContains"
+			],
+			[
+				"stream",
+				"streamImage"
+			],
+			[
+				"ti",
+				"tileNum"
+			],
+			[
+				"scro",
+				"scrollToLastTile"
+			],
+			[
+				"animat",
+				"animateGrid"
+			],
+			[
+				"fadeInLeft",
+				"fadeInLeftBig"
+			],
+			[
+				"asset",
+				"assetServer"
+			],
+			[
+				"a",
+				"actorR"
+			],
+			[
+				"o",
+				"opacity"
+			],
+			[
+				"cover",
+				"coverTall"
+			],
+			[
+				"do",
+				"doTask"
+			],
+			[
+				"find",
+				"findOrCreate"
+			],
+			[
+				"bac",
+				"background-color"
+			],
+			[
+				"fin",
+				"findOrCreate"
+			],
+			[
+				"b",
+				"background-repeat"
+			],
+			[
+				"tra",
+				"transform"
+			],
+			[
+				"calc",
+				"calcTemplate"
+			],
+			[
+				"unit",
+				"unitNames"
+			],
+			[
+				"book",
+				"bookNames"
+			],
+			[
+				"da",
+				"dayTiles"
+			],
+			[
+				"week",
+				"weekData"
+			],
+			[
+				"c",
+				"console"
+			],
+			[
+				"blok",
+				"blockObj"
+			],
+			[
+				"creat",
+				"createText"
+			],
+			[
+				"block",
+				"blockObj"
+			],
+			[
+				"blo",
+				"blockData"
+			],
+			[
+				"bloc",
+				"blocksGroup"
+			],
+			[
+				"slab",
+				"slabData"
+			],
+			[
+				"Sla",
+				"SlabsController"
+			],
+			[
+				"icon",
+				"iconList"
+			],
+			[
+				"chap",
+				"chapter"
+			],
+			[
+				"use",
+				"useCard"
+			],
+			[
+				"ch",
+				"check"
+			],
+			[
+				"hand",
+				"handleBotsResponse"
+			],
+			[
+				"relo",
+				"reloadAll"
+			],
+			[
+				"tileBx",
+				"tileBoxId"
+			],
+			[
+				"tile",
+				"tilesize"
+			],
+			[
+				"chapt",
+				"chapters"
+			],
+			[
+				"cha",
+				"chapdata"
+			],
+			[
+				"Chat",
+				"Chapters"
+			],
+			[
+				"user",
+				"username"
+			],
+			[
+				"loadF",
+				"loadFromJsonString"
+			],
+			[
+				"border-r",
+				"border-radius"
+			],
+			[
+				"backg",
+				"background-color"
+			],
+			[
+				"messag",
+				"messageObject"
+			],
+			[
+				"re",
+				"reply"
+			]
+		]
+	},
+	"buffers":
+	[
+	],
+	"build_system": "",
+	"build_system_choices":
+	[
+		[
+			[
+				[
+					"Packages/Better CoffeeScript/CoffeeScript.sublime-build",
+					""
+				],
+				[
+					"Packages/Better CoffeeScript/CoffeeScript.sublime-build",
+					"Run"
+				],
+				[
+					"Packages/JavaScript & Coffeescript Build Systems/xCoffee.sublime-build",
+					""
+				],
+				[
+					"Packages/JavaScript & Coffeescript Build Systems/xCoffee.sublime-build",
+					"Compile"
+				],
+				[
+					"Packages/User/coffee-dc.sublime-build",
+					""
+				],
+				[
+					"Packages/User/tns-android-run.sublime-build",
+					""
+				],
+				[
+					"Packages/User/tns-ios.sublime-build",
+					""
+				]
+			],
+			[
+				"Packages/Better CoffeeScript/CoffeeScript.sublime-build",
+				"Run"
+			]
+		],
+		[
+			[
+				[
+					"Packages/JavaScript & Coffeescript Build Systems/xJs.sublime-build",
+					""
+				],
+				[
+					"Packages/JavaScript & Coffeescript Build Systems/xJs.sublime-build",
+					"Compile"
+				],
+				[
+					"Packages/JavaScript & Coffeescript Build Systems/xJs.sublime-build",
+					"Harmony"
+				],
+				[
+					"Packages/User/coffee-dc.sublime-build",
+					""
+				],
+				[
+					"Packages/User/tns-android-run.sublime-build",
+					""
+				],
+				[
+					"Packages/User/tns-ios.sublime-build",
+					""
+				]
+			],
+			[
+				"Packages/User/coffee-dc.sublime-build",
+				""
+			]
+		]
+	],
+	"build_varint": "",
+	"command_palette":
+	{
+		"height": 267.0,
+		"last_filter": "java",
+		"selected_items":
+		[
+			[
+				"java",
+				"Set Syntax: JavaScript Next"
+			],
+			[
+				"form",
+				"Pretty JSON: Format (Pretty Print) JSON"
+			],
+			[
+				"lint",
+				"SublimeLinter: Lint This View"
+			],
+			[
+				"remo",
+				"Package Control: Remove Package"
+			],
+			[
+				"re",
+				"Package Control: Remove Package"
+			],
+			[
+				"rem",
+				"Package Control: Remove Package"
+			],
+			[
+				"pack",
+				"Package Control: Remove Package"
+			],
+			[
+				"inst",
+				"Package Control: Install Package"
+			],
+			[
+				"remove",
+				"Package Control: Remove Package"
+			],
+			[
+				"esl",
+				"Preferences: SublimeLinter Settings – User"
+			],
+			[
+				"js",
+				"JSLint"
+			],
+			[
+				"bea",
+				"Javascript Beautify"
+			],
+			[
+				"jac",
+				"Javascript Beautify"
+			],
+			[
+				"json",
+				"JSON Reindent: reindent file or selection"
+			],
+			[
+				"diff",
+				"Git: Diff Current File"
+			],
+			[
+				"git",
+				"Git: Blame"
+			],
+			[
+				"git bl",
+				"Git: Blame"
+			],
+			[
+				"check",
+				"Git: Checkout Current File"
+			],
+			[
+				"git check",
+				"Git: Checkout Current File"
+			],
+			[
+				"coffee",
+				"Coffee: Compile File"
+			],
+			[
+				"comp",
+				"Coffee: Compile File"
+			],
+			[
+				"coffe",
+				"Build With: CoffeeScript"
+			],
+			[
+				"git hi",
+				"Git: Graph Current File"
+			],
+			[
+				"git lo",
+				"Git: Log Current File"
+			],
+			[
+				"git di",
+				"Git: Diff Current File"
+			],
+			[
+				"insta",
+				"Package Control: Install Package"
+			],
+			[
+				"jva",
+				"Javascript Beautify"
+			],
+			[
+				"instal",
+				"Package Control: Install Package"
+			],
+			[
+				"refor",
+				"JSON Reindent: reindent file or selection"
+			],
+			[
+				"remov",
+				"Package Control: Remove Package"
+			],
+			[
+				"coff",
+				"Coffee: Run Cake Task"
+			],
+			[
+				"goto",
+				"Go To Definition"
+			],
+			[
+				"rela",
+				"Related Files"
+			],
+			[
+				"go to",
+				"Go To Definition"
+			],
+			[
+				"ins",
+				"Package Control: Install Package"
+			],
+			[
+				"iope",
+				"File Navigator: Open"
+			],
+			[
+				"focu",
+				"Focus File on Sidebar"
+			],
+			[
+				"swi",
+				"CTags: Show Symbols (file)"
+			],
+			[
+				"Package Control: ",
+				"Package Control: List Packages"
+			],
+			[
+				"file",
+				"Focus File on Sidebar"
+			],
+			[
+				"ctag",
+				"CTags: Show Symbols (all)"
+			],
+			[
+				"cta",
+				"CTags: Show Symbols (file)"
+			],
+			[
+				"open",
+				"View: Toggle Open Files in Side Bar"
+			],
+			[
+				"refo",
+				"Pretty JSON: Format (Pretty Print) JSON"
+			],
+			[
+				"packa",
+				"Preferences: Package Control Settings – Default"
+			],
+			[
+				"isnta",
+				"Package Control: Install Package"
+			],
+			[
+				"upgr",
+				"Package Control: Upgrade Package"
+			],
+			[
+				"ind",
+				"Indentation: Reindent Lines"
+			],
+			[
+				"",
+				"Coffee: Fast Compile"
+			],
+			[
+				"pac",
+				"Package Control: Install Package"
+			],
+			[
+				"insl",
+				"Package Control: Install Package"
+			],
+			[
+				"uninst",
+				"SublimeLinter: Disable Linter"
+			]
+		],
+		"width": 521.0
+	},
+	"console":
+	{
+		"height": 495.0,
+		"history":
+		[
+			"import urllib2, os;",
+			"import urllib2,os; pf='Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf), 'wb' ).write( urllib2.urlopen( 'http://sublime.wbond.net/' +pf.replace( ' ','%20' )).read()); print( 'Please restart Sublime Text to finish installation')"
+		]
+	},
+	"distraction_free":
+	{
+		"menu_visible": true,
+		"show_minimap": false,
+		"show_open_files": false,
+		"show_tabs": false,
+		"side_bar_visible": true,
+		"status_bar_visible": false
+	},
+	"expanded_folders":
+	[
+		"/Users/dc/dev/fcc/gitterbot/nap",
+		"/Users/dc/dev/fcc/gitterbot/nap/data",
+		"/Users/dc/dev/fcc/gitterbot/nap/data/rooms",
+		"/Users/dc/dev/fcc/gitterbot/nap/data/seed",
+		"/Users/dc/dev/fcc/gitterbot/nap/data/seed/challenges",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot",
+		"/Users/dc/dev/fcc/gitterbot/nap/logs",
+		"/Users/dc/dev/fcc/gitterbot/nap/test"
+	],
+	"file_history":
+	[
+		"/Users/dc/dev/fcc/gitterbot/nap/data/rooms/RoomMessages.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/RoomMessagesSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/data/RoomData.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/docs/TODO.txt",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/pm2-update.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/logs/README.md",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/GBot.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/app/Bonfires.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/BonfiresSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/KBase.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/utils/Utils.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/cmds/wiki.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/deploy.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/TestHelper.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/cmds/bonfire.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/utils/TextLib.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/package.json",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/BotCommands.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/data/seed/challenges/basic-bonfires.json",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/run-bothelp.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/app.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/cmds/about.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/utils/HttpWrap.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/config/AppConfig.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/credentials-bothelp.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/.gitignore",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/credentials-demobot.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/docs/credentials.md",
+		"/Users/dc/dev/fcc/gitterbot/nap/README.md",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/test.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/step-debug.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/run-demobot.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/utils/clog.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/app/routes.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/views/rooms.jade",
+		"/Users/dc/dev/fcc/gitterbot/docs/bonfires/where-art-thou.js",
+		"/Users/dc/dev/fcc/gitterbot/docs/bonfires/seek-and-destroy.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/cmds/update.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/wiki-pull.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/force-update.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/wiki-pull-prod.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/cmds/thanks.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/run-dev-bothelp.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/run-YOUR_GITHUB_ID.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/credentials-example.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/credentials-dc.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/wiki-update.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/HttpWrapSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/SearchSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/WikiSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/IOSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/ParserSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/GBotSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/CommandsSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/TextLibSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/AppConfigSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/pm2-run.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/app/Rooms.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/UtilsSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/camperbot-run.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/test/RoomsSpec.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/vendor/meteor/Match.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/bin/debug.sh",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/gitter/restApi.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/lib/gitter/GitterHelper.js",
+		"/Users/dc/dev/fcc/gitterbot/nap/docs/nap.sublime-project",
+		"/Users/dc/dev/shumi/chatU/docs/chatU.sublime-project",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/docs/TODO.txt",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/.eslintrc",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/bot/GBot.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/RegexSpec.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/bot/BotCommands.js",
+		"/Users/dc/Library/Application Support/Sublime Text 3/Packages/SublimeLinter/SublimeLinter.sublime-settings",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/AppConfigSpec.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/data/RoomData.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/GBotSpec.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/utils/Utils.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/config/AppConfig.js",
+		"/Users/dc/Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter.sublime-settings",
+		"/Users/dc/Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings",
+		"/Users/dc/Library/Application Support/Sublime Text 3/Packages/User/JSON.sublime-settings",
+		"/Users/dc/Library/Application Support/Sublime Text 3/Packages/Default/Preferences.sublime-settings",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/update-wiki.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/run.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/dev.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/credentials.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/bot/KBase.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/runup.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/app/Rooms.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/README.md",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/auth.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/post.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/mocha-debug.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/debug.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/credentials-example.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/.gitignore",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/test.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/app.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/docs/regex.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/docs/questions.txt",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/app/routes.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/views/nav.jade",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/routesSpec.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/BotSpec.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/RoomsSpec.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/views/rooms.jade",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/views/home.jade",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/gitter/GitterHelper.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/gitter/passportModule.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/KBaseSpec.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/package.json",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/util/util.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/Environment.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/gitter/streamApi.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/docs/nap.sublime-project",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/credentials-dc.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/credentials-bothelp.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/bot/bot.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/public/css/app.css",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/topicsSpec.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/docs/questions.txt",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/data/topics.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/hugit/bin/run.sh",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/views/topics.jade",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/views/layout.jade",
+		"/Users/dc/dev/rikai/gitter/gitterbot/oauth/views/home.jade",
+		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/tester.js",
+		"/Users/dc/dev/rikai/gitter/gitterbot/hugit/hubot-scripts.json"
+	],
+	"find":
+	{
+		"height": 35.0
+	},
+	"find_in_files":
+	{
+		"height": 93.0,
+		"where_history":
+		[
+			"*js,/Users/dc/dev/fcc/gitterbot/nap/",
+			"*js,/Users/dc/dev/fcc/gitterbot/nap/lib",
+			"*js",
+			"*coffee",
+			"*code",
+			"*rive",
+			"*coffee",
+			"*rive",
+			"*coffee",
+			"*styl",
+			"",
+			"*coffee",
+			"/Users/dc/dev/shumi/chatU/app/client/widgets",
+			"/Users/dc/dev/shumi/chatU/app/packages/ribot",
+			"/Users/dc/dev/shumi/chatU/app/packages/ribot-editor/assets/brains",
+			"*code",
+			"*coffee",
+			"*styl",
+			"*jade",
+			"*js",
+			"*coffee",
+			"*code",
+			"*coffee",
+			"",
+			"*code",
+			"*coffee",
+			"coffee",
+			"/Users/dc/dev/shumi/chatU/app/packages/ribot-editor/assets",
+			"*coffee",
+			"",
+			"/Users/dc/dev/shumi/chatU/app/client/widgets",
+			"*styl",
+			"*",
+			"*coffee",
+			"",
+			"/Users/dc/dev/shumi/chatU/app/client/widgets",
+			"",
+			"*coffee",
+			"/Users/dc/dev/shumi/chatU/app/client/widgets",
+			"*styl",
+			"styl",
+			"",
+			"*coffee",
+			"coffee",
+			"",
+			"*coffee",
+			"",
+			"*",
+			"*styl",
+			"",
+			"*",
+			"*jade",
+			"*coffee",
+			"*jade",
+			"*coffee",
+			"*jade",
+			"*",
+			"*coffee",
+			"*",
+			"*scss",
+			"*jade",
+			"*coffee",
+			"",
+			"*js",
+			"*coffee",
+			"",
+			"/Users/dc/dev/shumi/chatU/app/client/widgets,*.coffee",
+			"/Users/dc/dev/shumi/chatU/app/client/widgets",
+			"*.coffee",
+			"*.css,",
+			"*css",
+			"*styl",
+			"*jade",
+			"*coffee",
+			"*js",
+			"*coffee",
+			"coffee",
+			"",
+			"coffee",
+			"",
+			"*rive",
+			"*styl",
+			"*coffee",
+			"*rive",
+			"*styl",
+			"",
+			"*.coffee",
+			"coffee",
+			"/Users/dc/dev/shumi/chatU/app/packages/ribot/data/proposal",
+			"/Users/dc/dev/shumi/chatU/app/packages/ribot/data/styleguide",
+			"",
+			"*.rive",
+			"*.coffee",
+			"*.rive",
+			"*.styl",
+			"*.style",
+			"*.coffee",
+			"*.styl",
+			"",
+			"*.coffee",
+			"/Users/dc/dev/shumi/chatU/app/packages/ribot/data",
+			"/Users/dc/dev/shumi/chatU/app/client/widgets",
+			"/Users/dc/dev/shumi/chatU/app/,*.styl",
+			"/Users/dc/dev/shumi/chatU/app/,*.coffee",
+			"/Users/dc/dev/shumi/chatU/app/,*.js",
+			"/Users/dc/dev/shumi/chatU/app/,*.css",
+			"/Users/dc/dev/shumi/chatU/app/,*.styl",
+			"/Users/dc/dev/shumi/chatU/app/client",
+			"/Users/dc/dev/shumi/chatU/client",
+			"/Users/dc/dev/shumi/chatU/,-.meteor/*",
+			"/Users/dc/dev/shumi/chatU/,-.meteor",
+			"/Users/dc/dev/shumi/chatU/",
+			"/Users/dc/dev/shumi/chatU/app/client/widgets",
+			"/Users/dc/dev/shumi/chatU/app/, *styl",
+			"/Users/dc/dev/shumi/chatU/app/, *coffee",
+			"/Users/dc/dev/shumi/chatU/app/",
+			"/Users/dc/dev/shumi/chatU/app/packages/ribot",
+			"/Users/dc/dev/shumi/chatU/app/packages/ribot/data/lost",
+			"/Users/dc/dev/shumi/chatU/,*styl",
+			"/Users/dc/dev/shumi/chatU/",
+			"/Users/dc/dev/shumi/chatU/app/client/widgets",
+			"/Users/dc/dev/shumi/chatU/app/,*.styl",
+			"/Users/dc/dev/shumi/chatU/app/",
+			"/Users/dc/dev/shumi/chatU/app/client/widgets",
+			"",
+			"/Users/dc/dev/shumi/chatU/app/client/widgets",
+			"/Users/dc/dev/shumi/chatU/app/packages/, *.rive",
+			"/Users/dc/dev/shumi/chatU/app/packages/"
+		]
+	},
+	"find_state":
+	{
+		"case_sensitive": false,
+		"find_history":
+		[
+			"cons",
+			"bonfireHeader",
+			"Utils",
+			"`",
+			"<a href",
+			"data/bonfires/basic-bonfires.js",
+			"bonfire",
+			"parseIn",
+			"status",
+			"stackLines",
+			"botname",
+			"envConfigs",
+			"dcsan",
+			"rooms",
+			"showConfig",
+			"botname",
+			"function where(collection, source) {\n  var arr = [];\n  // What's in a name?\n  k = Object.keys(source)[0]; // since we know only one \n  v = source[k];\n  console.log(\"match for:\", k, v);\n  var arr = collection.filter(function(a){\n    console.log(a);\n    return (a[k] === v);\n  });\n  return arr;\n}\n",
+			"ls.",
+			"wikiU",
+			"botzy",
+			"footer",
+			"help",
+			"rooms",
+			"RoomData",
+			"joinKnownRooms",
+			"rooms",
+			"makeInputFromString",
+			"rooms",
+			"makeInputFromString",
+			"message",
+			"makeMessageFromString",
+			"Utils.makeMessageFromString",
+			"mockInput",
+			"Utils",
+			"\"topics\"",
+			"AppConfig.botname",
+			"wikiLink",
+			"botna",
+			"getBotName",
+			"error",
+			"clog",
+			"dmLink",
+			"AppConfig.botname",
+			"RoomData",
+			"BOTNAME",
+			"BOT_APP_HOST",
+			"getBotName",
+			"joinKnownRooms",
+			"joinRoom",
+			"say",
+			"currentBot",
+			"RoomData",
+			"RoomData.rooms",
+			"RoomData.",
+			"RoomData",
+			"botname",
+			"botn",
+			"input.room",
+			"message.room",
+			"scan",
+			"listeTo",
+			"bot.say",
+			"say",
+			"GBot.say",
+			"say",
+			"expect",
+			"KBase.topicList",
+			"topicn",
+			"mainBot",
+			"GITTER_APP_REDIRECT_URL",
+			"\"lodash\"",
+			"join",
+			".log",
+			"clog",
+			"addToRoomList",
+			"hasAlreadyJoined",
+			"hasAl",
+			"assert",
+			"has already",
+			"has al",
+			"checkObject",
+			"'",
+			"stric",
+			"`",
+			"template",
+			"function(",
+			"commands",
+			"Utils",
+			"linki",
+			"function(",
+			"})\n",
+			"function(",
+			"function()",
+			"dmLink",
+			"function(",
+			"beau",
+			"assert",
+			"botCOmm",
+			"roomL",
+			"bothelp",
+			"parseI",
+			"checkThanks",
+			"msg.",
+			"makeMessageFromString",
+			"blob",
+			"message",
+			"text",
+			"findAnyReply",
+			"value",
+			"findAnyReply",
+			"parseInput",
+			"listenToRoom",
+			"joinKnownRooms",
+			"checkThanks",
+			"Utils.cls",
+			"sendReply",
+			"listenToRoom",
+			"getMessage",
+			"parseInput",
+			"findAnyReply",
+			"sendReply",
+			"findAnyReply",
+			"say",
+			"checkWiki",
+			"cleanTopic",
+			"hasAlreadyJoined",
+			"alreadyJoined",
+			"botComm"
+		],
+		"highlight": true,
+		"in_selection": false,
+		"preserve_case": false,
+		"regex": false,
+		"replace_history":
+		[
+			"cmd.",
+			"makeMessageFromString",
+			"input",
+			"makeInputFromString",
+			"TestHelper.makeMessageFromString",
+			"AppConfig.getBotName()",
+			"RoomData.rooms()",
+			"RoomData.rooms.",
+			"input.message.room",
+			"botname",
+			"\"",
+			"function (",
+			"});\n",
+			"function (",
+			"message.",
+			"Utils.makeMessageFromString",
+			"input",
+			"getAnnounceMessage",
+			"hasAlreadyJoined",
+			"alreadyJoined",
+			"isRoomInList",
+			"GBot.gitter",
+			"checkWiki",
+			"oneRoomData",
+			"name:",
+			"GBot",
+			"AppConfig",
+			"listname=",
+			"listname",
+			"stepNum",
+			".coffee\"",
+			".coffee",
+			"\"client",
+			"blankData",
+			"drills",
+			"drill",
+			"TaskLists",
+			"tiles",
+			"calcUrl",
+			"clog",
+			"dclib.userId()",
+			"gameOver",
+			"findTaskName",
+			"findOrCreate",
+			"ptask",
+			"@numSteps",
+			"checkpoint",
+			"namedStep",
+			"screenwords=",
+			"toonFont",
+			"tpl",
+			"pulseSize",
+			"bigPulse",
+			"totalpairs=4",
+			"screenword=5",
+			"&duration=30",
+			"totalpairs=3",
+			"DEFAULT_TOTAL_PAIRS",
+			"totalpairs",
+			"that",
+			"screenwords",
+			"screenWords",
+			"",
+			"fa-diamond",
+			"checkUserCommands",
+			"buildIsotope",
+			"Meteor",
+			"clog",
+			"buildGrid",
+			"backImage",
+			"bottomLine",
+			"tileNum",
+			"starBar",
+			"taskname",
+			"fixed",
+			"safeParams",
+			"gridQuery",
+			"obj.",
+			"Units",
+			"units",
+			"slideTiles",
+			"unit",
+			"days",
+			"chapters",
+			"questions",
+			"totalQuestions",
+			"@sprite.",
+			"@sprite",
+			"@data",
+			"@group",
+			"@state",
+			"\"0x",
+			"slabDefault",
+			"tiledata",
+			"@config",
+			"slab",
+			"Slab",
+			"slabs",
+			"Slab",
+			"slabs",
+			"slasb",
+			"lesson",
+			"task",
+			"numQuestions",
+			"userInput",
+			"input",
+			"Drills",
+			"skip",
+			"text",
+			"broadway",
+			"grammar",
+			"sizex",
+			"24",
+			"@clog",
+			"cardsRight",
+			"taskListLesson",
+			"/i)",
+			"text",
+			"witResponse",
+			"",
+			" ",
+			"",
+			"@import \"../layouts/shared/shared.styl\"",
+			"lastInput",
+			"userCards",
+			"SERVER_ENV",
+			"SERVERENV",
+			"botPlayer"
+		],
+		"reverse": false,
+		"show_context": false,
+		"use_buffer2": false,
+		"whole_word": false,
+		"wrap": true
+	},
+	"groups":
+	[
+		{
+			"sheets":
+			[
+			]
+		}
+	],
+	"incremental_find":
+	{
+		"height": 23.0
+	},
+	"input":
+	{
+		"height": 31.0
+	},
+	"layout":
+	{
+		"cells":
+		[
+			[
+				0,
+				0,
+				1,
+				1
+			]
+		],
+		"cols":
+		[
+			0.0,
+			1.0
+		],
+		"rows":
+		[
+			0.0,
+			1.0
+		]
+	},
+	"menu_visible": true,
+	"output.exec":
+	{
+		"height": 341.0
+	},
+	"output.find_results":
+	{
+		"height": 458.0
+	},
+	"pinned_build_system": "Packages/User/node.sublime-build",
+	"project": "nap.sublime-project",
+	"replace":
+	{
+		"height": 64.0
+	},
+	"save_all_on_build": true,
+	"select_file":
+	{
+		"height": 0.0,
+		"last_filter": "",
+		"selected_items":
+		[
+			[
+				"tod",
+				"nap/docs/TODO.txt"
+			],
+			[
+				"gb",
+				"nap/lib/bot/GBot.js"
+			],
+			[
+				"pm2",
+				"nap/bin/pm2-update.sh"
+			],
+			[
+				"bonfi",
+				"nap/lib/app/Bonfires.js"
+			],
+			[
+				"kba",
+				"nap/lib/bot/KBase.js"
+			],
+			[
+				"roomd",
+				"nap/data/RoomData.js"
+			],
+			[
+				"uti",
+				"nap/lib/utils/Utils.js"
+			],
+			[
+				"wiki",
+				"nap/lib/bot/cmds/wiki.js"
+			],
+			[
+				"depl",
+				"nap/bin/deploy.sh"
+			],
+			[
+				"deplo",
+				"nap/bin/deploy.sh"
+			],
+			[
+				"gbo",
+				"nap/lib/bot/GBot.js"
+			],
+			[
+				"test",
+				"nap/test/TestHelper.js"
+			],
+			[
+				"bonf",
+				"nap/lib/app/Bonfires.js"
+			],
+			[
+				"kbas",
+				"nap/lib/bot/KBase.js"
+			],
+			[
+				"util",
+				"nap/lib/utils/Utils.js"
+			],
+			[
+				"run",
+				"nap/bin/run-bothelp.sh"
+			],
+			[
+				"pack",
+				"nap/package.json"
+			],
+			[
+				"text",
+				"nap/lib/utils/TextLib.js"
+			],
+			[
+				"basic",
+				"nap/data/seed/challenges/basic-bonfires.json"
+			],
+			[
+				"bon",
+				"nap/data/seed/challenges/basic-bonfires.json"
+			],
+			[
+				"botco",
+				"nap/lib/bot/BotCommands.js"
+			],
+			[
+				"app.",
+				"nap/app.js"
+			],
+			[
+				"about",
+				"nap/lib/bot/cmds/about.js"
+			],
+			[
+				"utils",
+				"nap/lib/utils/Utils.js"
+			],
+			[
+				"room",
+				"nap/data/RoomData.js"
+			],
+			[
+				"http",
+				"nap/lib/utils/HttpWrap.js"
+			],
+			[
+				"appc",
+				"nap/config/AppConfig.js"
+			],
+			[
+				"both",
+				"nap/bin/credentials-bothelp.sh"
+			],
+			[
+				"botc",
+				"nap/lib/bot/BotCommands.js"
+			],
+			[
+				"demob",
+				"nap/bin/credentials-demobot.sh"
+			],
+			[
+				"read",
+				"nap/README.md"
+			],
+			[
+				"crebo",
+				"nap/bin/credentials-bothelp.sh"
+			],
+			[
+				"step",
+				"nap/bin/step-debug.sh"
+			],
+			[
+				"rooms.",
+				"nap/views/rooms.jade"
+			],
+			[
+				"route",
+				"nap/lib/app/routes.js"
+			],
+			[
+				"cred",
+				"nap/bin/credentials-demobot.sh"
+			],
+			[
+				"appcon",
+				"nap/config/AppConfig.js"
+			],
+			[
+				"update.",
+				"nap/lib/bot/cmds/update.js"
+			],
+			[
+				"forc",
+				"nap/bin/force-update.sh"
+			],
+			[
+				"",
+				"nap/lib/bot/BotCommands.js"
+			],
+			[
+				"tha",
+				"nap/lib/bot/cmds/thanks.js"
+			],
+			[
+				"abo",
+				"nap/lib/bot/cmds/about.js"
+			],
+			[
+				"than",
+				"nap/lib/bot/cmds/thanks.js"
+			],
+			[
+				"app",
+				"nap/app.js"
+			],
+			[
+				"httw",
+				"nap/test/HttpWrapSpec.js"
+			],
+			[
+				"httpw",
+				"nap/test/HttpWrapSpec.js"
+			],
+			[
+				"romd",
+				"nap/data/RoomData.js"
+			],
+			[
+				"botcom",
+				"nap/lib/bot/BotCommands.js"
+			],
+			[
+				"thanks",
+				"nap/lib/bot/cmds/thanks.js"
+			],
+			[
+				"wikis",
+				"nap/test/WikiSpec.js"
+			],
+			[
+				"searc",
+				"nap/test/SearchSpec.js"
+			],
+			[
+				"ioc",
+				"nap/test/IOSpec.js"
+			],
+			[
+				"pars",
+				"nap/test/ParserSpec.js"
+			],
+			[
+				"io",
+				"nap/test/IOSpec.js"
+			],
+			[
+				"gbots",
+				"nap/test/GBotSpec.js"
+			],
+			[
+				"gbot",
+				"nap/lib/bot/GBot.js"
+			],
+			[
+				"testh",
+				"nap/test/TestHelper.js"
+			],
+			[
+				"botcomm",
+				"nap/lib/bot/BotCommands.js"
+			],
+			[
+				"ut",
+				"nap/lib/utils/Utils.js"
+			],
+			[
+				"g",
+				"nap/lib/bot/GBot.js"
+			],
+			[
+				"gbtosp",
+				"nap/test/GBotSpec.js"
+			],
+			[
+				"tes",
+				"nap/bin/test.sh"
+			],
+			[
+				"p2",
+				"nap/bin/pm2-run.sh"
+			],
+			[
+				"tes.",
+				"nap/bin/test.sh"
+			],
+			[
+				"appcons",
+				"nap/test/AppConfigSpec.js"
+			],
+			[
+				"thank",
+				"nap/lib/bot/cmds/thanks.js"
+			],
+			[
+				"rooms",
+				"nap/lib/app/Rooms.js"
+			],
+			[
+				"to",
+				"nap/docs/TODO.txt"
+			],
+			[
+				"appco",
+				"nap/config/AppConfig.js"
+			],
+			[
+				"cur",
+				"nap/bin/camperbot-run.sh"
+			],
+			[
+				"cam",
+				"nap/bin/camperbot-run.sh"
+			],
+			[
+				"ios",
+				"nap/test/IOSpec.js"
+			],
+			[
+				"roos",
+				"nap/test/RoomsSpec.js"
+			],
+			[
+				"comma",
+				"nap/test/CommandsSpec.js"
+			],
+			[
+				"abou",
+				"nap/lib/bot/cmds/about.js"
+			],
+			[
+				"dev",
+				"nap/bin/run-dev-bothelp.sh"
+			],
+			[
+				"pac",
+				"nap/package.json"
+			],
+			[
+				"cre",
+				"nap/bin/credentials-example.sh"
+			],
+			[
+				"rout",
+				"nap/lib/app/routes.js"
+			],
+			[
+				"deb",
+				"nap/bin/debug.sh"
+			],
+			[
+				"gitter",
+				"nap/lib/gitter/restApi.js"
+			],
+			[
+				"gitterh",
+				"nap/lib/gitter/GitterHelper.js"
+			],
+			[
+				"reg",
+				"test/RegexSpec.js"
+			],
+			[
+				"rege",
+				"test/RegexSpec.js"
+			],
+			[
+				"regexsp",
+				"test/RegexSpec.js"
+			],
+			[
+				"upd",
+				"bin/update-wiki.sh"
+			],
+			[
+				"bots",
+				"test/GBotSpec.js"
+			],
+			[
+				"kb",
+				"lib/bot/KBase.js"
+			],
+			[
+				"te",
+				"bin/test.sh"
+			],
+			[
+				"ques",
+				"docs/questions.txt"
+			],
+			[
+				"bot",
+				"lib/bot/GBot.js"
+			],
+			[
+				"nav",
+				"views/nav.jade"
+			],
+			[
+				"roo",
+				"lib/app/Rooms.js"
+			],
+			[
+				"ap",
+				"app.js"
+			],
+			[
+				"routes",
+				"lib/app/routes.js"
+			],
+			[
+				"botsp",
+				"test/BotSpec.js"
+			],
+			[
+				"pas",
+				"lib/gitter/passportModule.js"
+			],
+			[
+				"todo",
+				"docs/TODO.txt"
+			],
+			[
+				"pass",
+				"lib/gitter/passportModule.js"
+			],
+			[
+				"run.",
+				"bin/run.sh"
+			],
+			[
+				"home",
+				"views/home.jade"
+			],
+			[
+				"routess",
+				"test/routesSpec.js"
+			],
+			[
+				"rou",
+				"lib/app/routes.js"
+			],
+			[
+				"quest",
+				"docs/questions.txt"
+			],
+			[
+				"topics",
+				"nap/data/topics.js"
+			],
+			[
+				"passp",
+				"lib/gitter/passportLogin.js"
+			],
+			[
+				"msgp",
+				"app/packages/streamer/lib/MsgParser.coffee"
+			],
+			[
+				"font",
+				"app/client/layouts/shared/font-loader.js"
+			],
+			[
+				"playerac",
+				"app/packages/mpgames/lib/PlayerActions.coffee"
+			],
+			[
+				"msgpar",
+				"app/packages/streamer/lib/MsgParser.coffee"
+			],
+			[
+				"playert",
+				"app/packages/mpgames/lib/PlayerTasks.coffee"
+			],
+			[
+				"taskli",
+				"app/client/widgets/tasklist.jade"
+			],
+			[
+				"stream",
+				"app/packages/streamer/client/stream/stream.coffee"
+			],
+			[
+				"dcli",
+				"package-dev/dclib/lib/dclib.coffee"
+			],
+			[
+				"story",
+				"app/packages/u-menu/client/views/storyTop.coffee"
+			],
+			[
+				"widget",
+				"app/client/widgets/widgets.styl"
+			],
+			[
+				"questi",
+				"app/client/widgets/question.styl"
+			],
+			[
+				"slider",
+				"app/client/widgets/slider.jade"
+			],
+			[
+				"slider.j",
+				"app/client/widgets/slider.jade"
+			],
+			[
+				"shared.",
+				"app/client/layouts/shared/shared.styl"
+			],
+			[
+				"narra",
+				"app/client/widgets/narrator.styl"
+			],
+			[
+				"exam",
+				"app/client/widgets/example.styl"
+			],
+			[
+				"thunk",
+				"app/packages/wit/server/Thunk.coffee"
+			],
+			[
+				"cst",
+				"app/packages/streamer/lib/CStreamer.coffee"
+			],
+			[
+				"local",
+				"app/private/config/local.json"
+			],
+			[
+				"stream.c",
+				"app/packages/streamer/client/stream/stream.coffee"
+			],
+			[
+				"msgpa",
+				"app/packages/streamer/lib/MsgParser.coffee"
+			],
+			[
+				"stre",
+				"app/packages/streamer/client/stream/stream.coffee"
+			]
+		],
+		"width": 0.0
+	},
+	"select_project":
+	{
+		"height": 500.0,
+		"last_filter": "",
+		"selected_items":
+		[
+			[
+				"",
+				"~/dev/shumi/chatU/docs/chatU.sublime-project"
+			]
+		],
+		"width": 380.0
+	},
+	"select_symbol":
+	{
+		"height": 392.0,
+		"last_filter": "",
+		"selected_items":
+		[
+			[
+				"",
+				"BuildAndroid"
+			]
+		],
+		"width": 602.0
+	},
+	"selected_group": 0,
+	"settings":
+	{
+	},
+	"show_minimap": false,
+	"show_open_files": false,
+	"show_tabs": true,
+	"side_bar_visible": true,
+	"side_bar_width": 216.0,
+	"status_bar_visible": true,
+	"template_settings":
+	{
+	}
+}
diff --git a/docs/questions.txt b/docs/questions.txt
new file mode 100644
index 0000000..bb3cb5a
--- /dev/null
+++ b/docs/questions.txt
@@ -0,0 +1,29 @@
+# questions
+
+passing objects down into modules
+eg global "logger" module
+
+using ES6 by default?
+what about client?
+
+good logger module
+shows line nums etc.
+
+simple testing of a node app and classes
+
+free license of editor?
+
+## variable names
+mixing Objects and plain data
+using Obj as suffix?
+eg  topic="room"
+    topicObj = { name: room}
+
+## content
+
+what content to expose through the bot?
+
+-------------------------------------------------------------
+# Tech
+
+CI tool used?
diff --git a/dot-EXAMPLE.env b/dot-EXAMPLE.env
new file mode 100644
index 0000000..76457a6
--- /dev/null
+++ b/dot-EXAMPLE.env
@@ -0,0 +1,11 @@
+# make a copy of this file and rename it to "dot.env"
+SERVER_ENV=demobot
+GITTER_USER_TOKEN=1ac342045f5a57d99fe537e58da78f6cba94f7db
+FCC_API_KEY=TESTAPIKEY
+
+# get these from oauth later
+GITTER_APP_KEY=63ece8ac0eeed9b17b1cc9867f65d4857ec6e5fc
+GITTER_APP_SECRET=9026e3b3a74357035ee15a9591f31b2de5cfd3a6
+GITTER_APP_REDIRECT_URL=http://localhost:7891/login/callback
+LOG_LEVEL=10
+PORT=7891
diff --git a/gulpfile.js b/gulpfile.js
new file mode 100644
index 0000000..6ec5145
--- /dev/null
+++ b/gulpfile.js
@@ -0,0 +1,33 @@
+const gulp = require('gulp'),
+      eslint = require('gulp-eslint'),
+      tape = require('gulp-tape'),
+      faucet = require('faucet'),
+      env = require('gulp-env');
+
+require('dotenv').config({path: 'dot.env'});
+
+gulp.task('lint', () => {
+    return gulp.src(['**/*.js', '!node_modules/**'])
+        .pipe(eslint())
+        .pipe(eslint.format())
+        .pipe(eslint.failAfterError());
+});
+
+gulp.task('test', () => {
+  return gulp.src('test/*.spec.js')
+    .pipe(tape({
+      reporter: faucet()
+    }));
+});
+
+gulp.task('set-env', () => {
+  env({
+    vars: {
+      SERVER_ENV: 'test'
+    }
+  });
+});
+
+gulp.task('default', ['set-env', 'test'], () => {
+
+});
diff --git a/lib/app/Bonfires.js b/lib/app/Bonfires.js
new file mode 100644
index 0000000..321d8ad
--- /dev/null
+++ b/lib/app/Bonfires.js
@@ -0,0 +1,270 @@
+'use strict';
+
+const fs = require('fs'),
+      Utils = require('../../lib/utils/Utils'),
+      InputWrap = require('../../lib/bot/InputWrap'),
+      KBase = require('../../lib/bot/KBase'),
+      TextLib = require('../../lib/utils/TextLib');
+
+const newline = '\n';
+
+const Bonfires = {
+  data: null,
+  fixed: {
+    hintWarning: '## :construction: ** After this are possible spoiler hints.' +
+      '**\nMake sure you\'ve tried to hard to solve it yourself before ' +
+      'proceeding. :construction:',
+    menu: '\n- `bonfire info` for more info ' +
+      '\n- `bonfire links` ' +
+      '\n- `bonfire script` for the script',
+    askName: 'give the name of the bonfire and I\'ll try to look it up!',
+    setName: 'Set a bonfire to talk about with `bonfire name`',
+    comingSoon: 'Coming Soon! We\'re working on it!',
+    nameHint: 'no, type part of the name of the bonfire! eg `bonfire roman`',
+    alert: '\n - :construction: **spoiler alert** :construction:',
+
+    bfRoomLink: function(name) {
+      return '[spoiler chatroom](https://gitter.im/camperbot/' + name + ')';
+    },
+    footer: function() {
+      return '\n\n> more info:&nbsp;&nbsp;`bf details` | ' +
+        '`bf links` | `hint` ';
+    },
+    reminder: function(name) {
+      return 'we\'re talking about bonfire :fire: ' + name;
+    },
+    cantFind: function(name) {
+      return '> Sorry, can\'t find a bonfire called ' + name +
+        '. [ [Check the map?]' +
+        '(http://www.freecodecamp.com/map#Basic-Algorithm-Scripting) ]';
+    },
+    roomLink: function(name) {
+      return ':construction: **spoiler alert** ' + this.bfRoomLink(name) +
+        ' :arrow_forward:';
+    },
+    goToBonfireRoom: function(bf) {
+      const link = Utils.linkify(bf.dashedName,
+                                 'camperbot', 'Bonfire\'s Custom Room');
+      return '> :construction: Spoilers are only in the ' + link +
+        ' :point_right: ';
+    },
+    pleaseContribute: function(bf) {
+      const link = Utils.linkify(bf.dashedName,
+                                 'wiki', 'Bonfire\'s Wiki Hints Page');
+      return 'These hints depend on people like you! ' +
+        'Please add to this :point_right: ' + link;
+    }
+  },
+
+  load: function() {
+    // Get document, or throw exception on error
+    try {
+      const bfDataFiles = [
+        'basic-bonfires.json',
+        'intermediate-bonfires.json',
+        'advanced-bonfires.json',
+        'expert-bonfires.json'
+      ];
+
+      let allData = {
+        challenges: []
+      };
+
+      bfDataFiles.map(fname => {
+        const raw = fs.readFileSync('./data/seed/challenges/' + fname, 'utf8'),
+              thisData = JSON.parse(raw);
+        allData.challenges = allData.challenges.concat(thisData.challenges);
+      });
+
+      this.data = allData;
+
+      Bonfires.loadWikiHints();
+
+      // TODO - convert the embedded HTML to markdown tags
+      // this.data = Utils.toMarkdown(this.data);
+    } catch (e) {
+      Utils.error('can\'t load bonfire data', e);
+    }
+    return this;
+  },
+
+  loadWikiHints: function() {
+    this.data.challenges = this.data.challenges.map(bf => {
+      bf.hints = [Bonfires.fixed.hintWarning];
+      const wikiHints = KBase.getWikiHints(bf.dashedName);
+      if (wikiHints) {
+        bf.hints = bf.hints.concat(wikiHints);
+      } else {
+        Utils.tlog('bf.wikiHints not found', bf.dashedName);
+      }
+      return bf;
+    });
+  },
+
+  findBonfire: function(bfName) {
+    let flag;
+    bfName = TextLib.dashedName(bfName);
+    const bfs = this.data.challenges.filter(item => {
+      flag = (item.dashedName.indexOf(bfName) >= 0);
+      return flag;
+    });
+    const bf = bfs[0];
+    if (!bf) {
+      Utils.warn('can\'t find bonfire for ' + bfName);
+      return null;
+    } else {
+      return bf;
+    }
+  },
+
+
+  getNextHint: function(bonfire, input) {
+    let hint,
+        hintNum = parseInt(input.params, 10);
+
+    if (isNaN(hintNum)) {
+      hintNum = bonfire.currentHint || 0;
+    }
+    hint = bonfire.hints[hintNum];
+
+    if (hintNum < bonfire.hints.length) {
+      const hintCounter = hintNum + 1;
+      hint = '`hint [' + hintCounter + '/' +
+        bonfire.hints.length + ']`\n## ' + hint;
+      bonfire.currentHint = hintNum + 1;
+      hint += this.wikiLinkFooter(bonfire);
+      return hint;
+    } else {
+      bonfire.currentHint = 0;
+      return Bonfires.fixed.pleaseContribute(bonfire);
+    }
+  },
+
+  toMarkdown: function() {
+    this.data.challenges = this.data.challenges.map(item => {
+      item.description = item.description.map(desc => Utils.toMarkdown(desc));
+    });
+  },
+
+  allDashedNames: function() {
+    return this.fieldList('dashedName');
+  },
+
+  allNames: function() {
+    return this.fieldList('name');
+  },
+
+  fieldList: function(field) {
+    return this.data.challenges.map(item => item[field]);
+  },
+
+  fromInput: function(input) {
+    const roomName = InputWrap.roomShortName(input),
+          bf = this.findBonfire(roomName);
+    Utils.checkNotNull(bf, 'cant find bonfire for ' + roomName);
+    return (bf);
+  },
+
+
+  wikiLinkFooter: function(bonfire) {
+    let str = '\n\n> type `hint` for next hint  :pencil: ';
+    const text = '[Contribute at the FCC Wiki]';
+
+    return str + Utils.linkify(bonfire.dashedName, 'wiki', text);
+  },
+
+  getDescription: function(bonfire) {
+    return bonfire.description.join('\n');
+  },
+
+  getLinks: function(bonfire) {
+    return 'links: \n' + Utils.makeMdnLinks(bonfire.MDNlinks, 'mdn');
+  },
+
+  getLinksFromInput: function(input) {
+    const bf = Bonfires.fromInput(input);
+
+    if (!bf || !bf.MDNlinks) {
+      const msg = ('no links found for: ' + input.params);
+      Utils.error('Bonfires>', msg, bf);
+      return msg;
+    }
+    return this.getLinks(bf);
+  },
+
+  getSeed: function(bonfire) {
+    const seed = bonfire.challengeSeed.join('\n');
+    return '```js ' + newline + seed + '```';
+  },
+
+  getChallengeSeedFromInput: function(input) {
+    const bf = Bonfires.fromInput(input);
+
+    if (!bf || !bf.challengeSeed) {
+      const msg = ('no challengeSeed found for: ' + input.params);
+      Utils.error('Bonfires>', msg, bf);
+      return msg;
+    }
+
+    const seed = bf.challengeSeed.join('\n');
+
+    return '```js ' + newline + seed + '```';
+  },
+
+  // methods that describe a bonfire that accept/expect a bonfire parameter
+  bonfireInfo: function(bonfire) {
+    if (!bonfire) {
+      Utils.error('Bonfires.bonfireInfo', 'no bonfire');
+    }
+
+    return this.bonfireHeader(bonfire) + newline +
+      this.bonfireScript(bonfire) + newline +
+      this.bonfireDescription(bonfire) + newline +
+      newline + this.fixed.footer(bonfire.dashedName);
+  },
+
+  bonfireStatus: function(bonfire) {
+    return '\n- hints: ' + bonfire.hints.length;
+  },
+
+  bonfireHeader: function(bonfire) {
+    return '## :fire:' + TextLib.mdLink(bonfire.name,
+      'www.freecodecamp.com/challenges/' + bonfire.dashedName) + ' :link:';
+  },
+
+  bonfireDetails: function(bonfire) {
+    return this.bonfireHeader(bonfire) + newline +
+      this.bonfireScript(bonfire) + newline +
+      this.bonfireDescription(bonfire, 50) + newline +
+      this.bonfireLinks(bonfire);
+  },
+
+  bonfireDescription: function(bonfire, lines) {
+    if (lines) {
+      const desc = bonfire.description.slice(0, lines);
+      return desc.join('\n');
+    } else {
+      return bonfire.description[0];
+    }
+  },
+
+  bonfireLinks: function(bonfire) {
+    return Bonfires.getLinks(bonfire);
+  },
+
+  bonfireScript: function(bonfire) {
+    return Bonfires.getSeed(bonfire);
+  },
+
+  bonfireWiki: function() {
+    const link = Utils.linkify(this.currentBonfire.name);
+    return '> :fire: wiki: ' + link;
+  }
+};
+
+// ideally KBase should be loaded first,
+// though in theory it will load itself before data is needed ...?
+
+Bonfires.load();
+
+module.exports = Bonfires;
diff --git a/lib/app/Rooms.js b/lib/app/Rooms.js
new file mode 100644
index 0000000..9ec6202
--- /dev/null
+++ b/lib/app/Rooms.js
@@ -0,0 +1,50 @@
+'use strict';
+
+const RoomData = require('../../data/RoomData'),
+      _ = require('lodash'),
+      Utils = require('../utils/Utils');
+
+const Rooms = {
+
+  findByTopic: function(topic) {
+    const rooms = RoomData.rooms().filter(rm => {
+      const topics = rm.topics;
+      if (topics && topics.indexOf(topic) !== -1) {
+        return true;
+      }
+      return false;
+    });
+
+    return (this.checkRoom(rooms[0], 'findByTopic', topic));
+  },
+
+  findByName: function(name) {
+    const room = _.findWhere(RoomData.rooms(), { name: name });
+    if (room) {
+      return room;
+    }
+    Utils.error('cant find room name:', name);
+  },
+
+  isBonfire: function(name) {
+    const room = this.findByName(name);
+    if (room) {
+      return room.isBonfire;
+    }
+    return false;
+  },
+
+  names: function() {
+    this.roomList = RoomData.rooms().map(room => room.name);
+    return this.roomList;
+  },
+
+  checkRoom: function(room, how, tag) {
+    if (room) {
+      return room;
+    }
+    Utils.error('Rooms.checkRoom> failed', how, tag);
+  }
+};
+
+module.exports = Rooms;
diff --git a/lib/app/routes.js b/lib/app/routes.js
new file mode 100644
index 0000000..8410b57
--- /dev/null
+++ b/lib/app/routes.js
@@ -0,0 +1,151 @@
+'use strict';
+
+// TODO - FIXME this seems a bit hacky?
+// should be a passed in object?
+// but needed for tests too so want this class self contained
+
+const AppConfig = require('../../config/AppConfig'),
+      Rooms = require('../../lib/app/Rooms.js'),
+      Utils = require('../../lib/utils/Utils'),
+      Bonfires = require('./Bonfires'),
+      RoomData = require('../../data/RoomData'),
+      GitterHelper = require('../../lib/gitter/GitterHelper');
+
+function clog(msg, obj) {
+  Utils.clog('Routes>', msg, obj);
+}
+
+const Router = {
+  // query can include a room or a topic
+  findRedirect: function(query) {
+    Utils.isObject(query);
+    query.org = AppConfig.getOrg();
+
+    if (query.dm === 'y') {
+      query.room = query.room || AppConfig.getBotName();
+    }
+
+    if (query.room) {
+      // need to make a roomObj for other handling
+      query.roomObj = {
+        title: query.room,
+        name: query.room
+      };
+    } else if (query.topic) {
+      query.roomObj = Rooms.findByTopic(query.topic);
+    }
+    Utils.isObject(query.roomObj, 'could not find room object');
+    query.url = 'https://gitter.im/' + query.roomObj.name;
+    clog('findRedirect:', query);
+    return query;
+  },
+
+  init: function(app, gbot, passport) {
+    Router.gbot = gbot;
+    const that = this;
+
+    app.get('/test', (req, res) => {
+      res.send('test');
+    });
+
+    app.get('/go', (req, res) => {
+      const redir = that.findRedirect(req.query);
+      gbot.announce(redir);
+      res.redirect(redir.url);
+    });
+
+    app.get('/api/v1/msg', (req, res) => {
+      const redir = that.findRedirect(req.query);
+      gbot.announce(redir);
+      res.send('OK');
+    });
+
+    app.get('/login', passport.authenticate('oauth2'));
+
+    app.get('/login/callback',
+      passport.authenticate('oauth2', {
+        successRedirect: '/home',
+        failureRedirect: '/'
+      })
+    );
+
+    app.get('/logout', (req, res) => {
+      req.session.destroy();
+      res.redirect('/');
+    });
+
+    app.get('/', (req, res) => {
+      res.render('landing');
+    });
+
+    // after login home show token
+    app.get('/home2', (req, res) => {
+      if (!req.user) {
+        return res.redirect('/');
+      }
+
+      res.render('home', {
+        user: req.user,
+        sessionToken: req.session.token,
+        rooms: []
+      });
+    });
+
+
+    app.get('/rooms', (req, res) => {
+      // for now force login so we dont get webspammed by crawlers
+      if (!req.user) {
+        return res.redirect('/');
+      }
+      console.log('req.user', req.user);
+
+      const rooms = RoomData.rooms('camperbot').filter(rm => {
+        return rm.isBonfire;
+      });
+      console.log(rooms);
+
+      res.render('rooms', {
+        user: req.user,
+        who: AppConfig.who(req),
+        token: req.session.token,
+        rooms: rooms,
+        bonfires: Bonfires.data.challenges,
+        topicDmUri: AppConfig.topicDmUri()
+      });
+    });
+
+    app.get('/rooms/update', (req, res) => {
+      Router.gbot.scanRooms(req.user, req.session.token);
+      res.redirect('/home');
+    });
+
+    app.get('/home', (req, res) => {
+      if (!req.user) {
+        return res.redirect('/');
+      }
+
+      GitterHelper.fetchRooms(req.user, req.session.token, (err, rooms) => {
+        if (err) {
+          return res.send(500);
+        }
+        const blob = {
+          user: req.user,
+          token: req.session.token,
+          rooms: rooms,
+          topicDmUri: AppConfig.topicDmUri()
+        };
+        clog('rooms.blob', blob);
+        res.render('home', blob);
+      });
+    });
+
+    // Alive Status - returns 200/OK on GET
+    app.get('/status', (req, res) => {
+      // To disable etag/cache/304 response
+      req.method = 'NONE';
+      res.status(200).send('OK');
+    });
+  }
+};
+
+module.exports = Router;
diff --git a/lib/bot/BotCommands.js b/lib/bot/BotCommands.js
new file mode 100644
index 0000000..904604b
--- /dev/null
+++ b/lib/bot/BotCommands.js
@@ -0,0 +1,204 @@
+'use strict';
+
+const KBase = require('../bot/KBase'),
+      Utils = require('../../lib/utils/Utils'),
+      AppConfig = require('../../config/AppConfig'),
+      InputWrap = require('../bot/InputWrap'),
+      _ = require('lodash'),
+      stringy = require('stringy');
+
+const newline = '\n';
+
+const BotCommands = {
+  isCommand: function(input) {
+    let res;
+
+    const cmds = BotCommands.cmdList.filter(c => {
+      return (c === input.keyword);
+    });
+
+    const one = cmds[0];
+    if (one) {
+      res = true;
+    } else {
+      res = false;
+      Utils.warn('isCommand', 'not command', input);
+      Utils.warn('isCommand',
+        '[ isCommand: ' + input.keyword + ' one: ' + one + ' res: ' + res );
+    }
+    return res;
+  },
+
+  cbot: function(input, bot) {
+    switch (input.params) {
+      case 'version':
+        return this.botversion(input, bot);
+      case 'status':
+        Utils.log('input', input);
+        const status = this.botstatus(input, bot);
+        Utils.clog('status', status);
+        return status;
+      default:
+        return 'you called?';
+    }
+  },
+
+  // very simple example function showing how to parse a message and respond
+  // 'echo' is already a botCommand
+  echo: function(input) {
+    const username = input.message.model.fromUser.username;
+    return '@' + username + ' said: ' + input.message.model.text;
+  },
+
+  echojson: function(input) {
+    // avoid circular refs
+    const jsonString = stringy.stringify(input);
+    console.log(jsonString);
+    const safeObj = JSON.parse(jsonString);
+    console.log(safeObj);
+    const pretty = JSON.stringify(safeObj, null, 2);
+
+    return '```json' + pretty + '```';
+  },
+
+  botversion: function() {
+    return 'botVersion: ' + AppConfig.botVersion;
+  },
+
+  botstatus: function() {
+    return 'All bot systems are go!  \n' + this.botversion() + newline +
+      this.botenv() + newline + 'botname: ' + AppConfig.getBotName() + newline;
+  },
+
+  botenv: function() {
+    return 'env: ' + AppConfig.serverEnv;
+  },
+
+  archive: function(input) {
+    const roomName = input.message.room.name,
+          shortName = InputWrap.roomShortName(input),
+          roomUri = AppConfig.gitterHost + roomName + '/archives/',
+          timeStamp = Utils.timeStamp('yesterday');
+
+    return 'Archives for **' + shortName + '**' + newline +
+      '\n- [All Time](' + roomUri + 'all)' +
+      '\n- [Yesterday](' + roomUri + timeStamp + ')';
+  },
+
+  init: function(bot) {
+    // TODO - FIXME this is sketchy storing references like a global
+    // called from the bot where we don't always have an instance
+    BotCommands.bot = bot;
+  },
+
+  tooNoisy: function() {
+    // if this.room.name
+    return false;
+  },
+
+  // help on its own we return `help bothelp`
+  help: function(input, bot) {
+    if (this.tooNoisy(input, bot)) {
+      return null;
+    }
+
+    if (input.params) {
+      return this.wiki(input, bot);
+    } else {
+      const keyword = 'camperbot',
+            topicData = KBase.getTopicData(keyword);
+      return topicData.shortData + this.wikiFooter(keyword);
+    }
+  },
+
+  menu: function() {
+    return 'type help for a list of things the bot can do';
+  },
+
+  // TODO - sort alphabetically
+  rooms: function() {
+    return '## rooms\nSee all the FreeCodeCamp rooms at ' +
+      '[gitter.im/FreeCodeCamp/rooms](https://gitter.im/orgs/FreeCodeCamp/' +
+      'rooms)\nOr check [this wiki article](https://github.com/freecodecamp/' +
+      'freecodecamp/wiki/official-free-code-camp-chat-rooms) for a shortlist';
+  },
+
+  find: function(input, bot) {
+    const shortList = KBase.getTopicsAsList(input.params);
+
+    bot.context = {
+        state: 'finding',
+        commands: shortList.commands
+    };
+
+    const str = 'find **' + input.params + '**\n' + shortList;
+    bot.makeListOptions(str);
+    return str;
+  },
+
+  commands: function() {
+    return '## commands:\n- ' + BotCommands.cmdList.join('\n- ');
+  },
+
+  // TODO - FIXME this isn't working it seems
+  // rejoin: function (input, bot) {
+  //     clog('GBot', GBot);
+  //     BotCommands.bot.scanRooms();
+  //     return 'rejoined';
+  // },
+
+  music: function() {
+    return '## Music!\n http://musare.com/';
+  },
+
+  announce: function(input) {
+    const parts = input.params.split(' '),
+          roomName = parts[0],
+          text = parts.join(' ');
+    this.bot.sayToRoom(text, roomName);
+  },
+
+  rollem: function(input) {
+    const fromUser = '@' + input.message.model.fromUser.username;
+    return fromUser + ' says enjoy!' +
+      'https://www.youtube.com/watch?v=dQw4w9WgXcQ';
+  },
+
+  camperCount: function() {
+    return 'WIP camperCount';
+  },
+
+  welcome: function(input) {
+    if (input.params && input.params.match(/world/i)) {
+      return '## welcome to FreeCodeCamp @' +
+        input.message.model.fromUser.username + '!';
+    }
+  },
+
+  hello: function(input, bot) {
+    return (this.welcome(input, bot) );
+  }
+};
+
+
+// TODO - iterate and read all files in /cmds
+const wiki = require('./cmds/wiki'),
+      thanks = require('./cmds/thanks'),
+      update = require('./cmds/update'),
+      bonfire = require('./cmds/bonfire');
+
+_.merge(BotCommands, wiki, thanks, update, bonfire);
+
+// aliases
+BotCommands.explain = BotCommands.wiki;
+BotCommands.bot = BotCommands.wiki;
+BotCommands.hi = BotCommands.welcome;
+BotCommands.index = BotCommands.topics;
+BotCommands.thank = BotCommands.thanks;
+BotCommands.log = BotCommands.archive;
+BotCommands.archives = BotCommands.archive;
+
+// TODO - some of these should be filtered/as private
+BotCommands.cmdList = Object.keys(BotCommands);
+
+module.exports = BotCommands;
diff --git a/lib/bot/GBot.js b/lib/bot/GBot.js
new file mode 100644
index 0000000..5664aa2
--- /dev/null
+++ b/lib/bot/GBot.js
@@ -0,0 +1,350 @@
+'use strict';
+
+const AppConfig = require('../../config/AppConfig'),
+      RoomData = require('../../data/RoomData'),
+      Utils = require('../../lib/utils/Utils'),
+      KBase = require('../../lib/bot/KBase'),
+      BotCommands = require('../../lib/bot/BotCommands'),
+      Bonfires = require('../app/Bonfires'),
+      Gitter = require('node-gitter'),
+      GitterHelper = require('../../lib/gitter/GitterHelper'),
+      RoomMessages = require('../../data/rooms/RoomMessages');
+
+function clog(msg, obj) {
+    Utils.clog('GBot>', msg, obj);
+}
+
+let apiWait = 0;
+let apiDelay = 1000;
+
+const GBot = {
+
+  init: function() {
+    // TODO refresh and add oneToOne rooms
+    KBase.initSync();
+    this.roomList = [];
+    this.listReplyOptions = [];
+    this.gitter = new Gitter(AppConfig.token);
+    this.joinKnownRooms();
+
+    // listen to other rooms for 1:1
+    if (AppConfig.supportDmRooms) {
+      this.gitter.currentUser().then(user => {
+        this.scanRooms(user, AppConfig.token);
+      }, err => {
+        Utils.error('GBot.currentUser>', 'failed', err);
+      });
+    }
+    BotCommands.init(this);
+  },
+
+  getName: function() {
+    return AppConfig.botlist[0];
+  },
+
+  // listen to a known room
+  // does a check to see if not already joined according to internal data
+  listenToRoom: function(room) {
+    if (this.addToRoomList(room) === false) {
+      return;
+    }
+
+    const chats = room.streaming().chatMessages();
+
+    // The 'chatMessages' event is emitted on each new message
+    chats.on('chatMessages', message => {
+      if (message.operation !== 'create') {
+        return;
+      }
+      if (GBot.isBot(message.model.fromUser.username)) {
+        return;
+      }
+
+      message.room = room;
+      GBot.handleReply(message);
+    });
+  },
+
+  handleReply: function(message) {
+    clog(message.room.uri + ' @' + message.model.fromUser.username + ':');
+    clog(' in|', message.model.text);
+    const output = this.findAnyReply(message);
+    if (output) {
+      clog('out| ', output);
+      GBot.say(output, message.room);
+    }
+    // for debugging
+    return output;
+  },
+
+  // using a callback to get roomId
+  sayToRoom: function(text, roomName) {
+    const sayIt = () => {
+      console.log('sayIt', text, roomName);
+      GBot.say(text, roomName);
+    };
+    GitterHelper.findRoomByName(roomName, sayIt);
+  },
+
+  say: function(text, room) {
+    // did we get a room
+    Utils.hasProperty(room, 'path', 'expected room object');
+    if (!text) {
+      console.warn('tried to say with no text');
+    }
+    try {
+      GitterHelper.sayToRoomName(text, room.uri);
+    } catch (err) {
+      Utils.warn('GBot.say>', 'failed', err);
+      Utils.warn('GBot.say>', 'room', room);
+    }
+  },
+
+  // search all reply methods
+  // returns a string to send
+  // handleReply takes care of sending to chat system
+  findAnyReply: function(message) {
+    const input = this.parseInput(message),
+          listReplyOptionsAvailable = this.findListOption(input);
+    let output;
+
+    if (input.command) {
+      // this looks up a command and calls it
+      output = BotCommands[input.keyword](input, this);
+    } else if (listReplyOptionsAvailable !== false) {
+      // if a list exists and user chose an option
+      output = listReplyOptionsAvailable;
+    } else {
+      // non-command keywords like 'troll'
+      const scanCommand = RoomMessages.scanInput(input, input.message.room.name,
+                                                 AppConfig.botNoiseLevel);
+      if (scanCommand) {
+        if (scanCommand.text) {
+          output = (scanCommand.text);
+        }
+        if (scanCommand.func) {
+          output = scanCommand.func(input, this);
+        }
+      }
+    }
+    // TODO - check its a string or nothing
+    return output;
+  },
+
+  // save a list of options
+  // when the bot sends out a list
+  makeListOptions: function(output) {
+    let matches = [];
+    // find what is between [] brackets in the list of links
+    // example [bonfire arguments optional]
+    output.replace(/\[([a-zA-Z ]+)\]/g, (g0, g1) => {
+      matches.push(g1);
+    });
+    // stores 'bonfire arguments optional' and the like in an array
+    this.listReplyOptions = matches;
+    return matches;
+  },
+
+  // reply option to user
+  // if they chose an option from the list
+  findListOption: function(input) {
+    const parsedInput = parseInt(input.cleanText, 10);
+
+    if (!this.listReplyOptions || this.listReplyOptions.length === 0) {
+      return false;
+    } else if (input.cleanText.match(/^[0-9]+$/i) === null) {
+      // check if input is not a number
+      return false;
+    } else if (typeof this.listReplyOptions[parsedInput] === 'undefined') {
+      return false;
+    }
+
+    // get chosen wiki or bonfire article to output
+    input.params = this.listReplyOptions[parsedInput];
+    let output;
+    if (input.params.split(' ')[0] === 'bonfire') {
+      output = BotCommands['bonfire'](input, this);
+    } else {
+      output = BotCommands['wiki'](input, this);
+    }
+
+    this.listReplyOptions = [];
+    return output;
+  },
+
+  // turns raw text input into a json format
+  parseInput: function(message) {
+    Utils.hasProperty(message, 'model');
+
+    let cleanText = message.model.text;
+    cleanText = Utils.sanitize(cleanText);
+
+    let input = Utils.splitParams(cleanText);
+    input = this.cleanInput(input);
+    input.message = message;
+    input.cleanText = cleanText;
+
+    if (BotCommands.isCommand(input)) {
+      input.command = true;
+    }
+    return input;
+  },
+
+  cleanInput: function(input) {
+    // 'bot' keyword is an object = bad things happen when called as a command
+    if (input.keyword === 'bot') {
+      input.keyword = 'help';
+    }
+    return input;
+  },
+
+  announce: function(opts) {
+    clog('announce', opts);
+    this.joinRoom(opts, true);
+  },
+
+  joinRoom: function(opts) {
+    const roomUrl = opts.roomObj.name;
+
+    GBot.gitter.rooms.join(roomUrl, (err, room) => {
+      if (err) {
+        console.warn('Not possible to join the room: ', err, roomUrl);
+      }
+      GBot.roomList.push(room);
+      // have to stagger this for gitter rate limit
+      GBot.listenToRoom(room);
+      const text = GBot.getAnnounceMessage(opts);
+      GBot.say(text, room);
+
+      return room;
+    });
+
+    return false;
+  },
+
+  // checks if joined already, otherwise adds
+  addToRoomList: function(room) {
+    // check for dupes
+    this.roomList = this.roomList || [];
+    if (this.hasAlreadyJoined(room, this.roomList)) {
+      return false;
+    }
+
+    this.roomList.push(room);
+    return true;
+  },
+
+  // checks if a room is already in bots internal list of joined rooms
+  // this is to avoid listening twice
+  // see https://github.com/gitterHQ/node-gitter/issues/15
+  // note this is only the bots internal tracking
+  // it has no concept if the gitter API/state already thinks
+  // you're joined/listening
+  hasAlreadyJoined: function(room) {
+    const checks = this.roomList.filter(rm => {
+      return (rm.name === room.name);
+    });
+
+    const oneRoom = checks[0];
+    if (oneRoom) {
+      Utils.warn('GBot', 'hasAlreadyJoined:', oneRoom.url);
+      return true;
+    }
+
+    return false;
+  },
+
+  getAnnounceMessage: function() {
+    return '';
+  },
+
+  // dont reply to bots or you'll get a feedback loop
+  isBot: function(who) {
+    // 'of' IS correct even tho ES6Lint doesn't get it
+    for (let bot of AppConfig.botlist) {
+      if (who === bot) {
+        return true;
+      }
+    }
+    return false;
+  },
+
+  // this joins rooms contained in the data/RoomData.js file
+  // ie a set of bot specific discussion rooms
+  joinKnownRooms: function() {
+    clog('botname on rooms', AppConfig.getBotName());
+
+    RoomData.rooms().map(oneRoomData => {
+      const roomUrl = oneRoomData.name;
+      this.delayedJoin(roomUrl);
+    });
+  },
+
+
+  delayedJoin: function(roomUrl) {
+    apiWait += apiDelay;
+    setTimeout(() => {
+      this.gitter.rooms.join(roomUrl, (err, room) => {
+        if (err) {
+          Utils.warn('Not possible to join the room:', roomUrl, err);
+          return;
+        }
+        clog('joined> ', room.name);
+        this.listenToRoom(room);
+      });
+    }, apiWait);
+  },
+
+  joinBonfireRooms: function() {
+    Bonfires.allDashedNames().map(name => {
+      const roomUrl = AppConfig.getBotName() + '/' + name;
+      this.delayedJoin(roomUrl);
+    });
+  },
+
+  // uses gitter helper to fetch the list of rooms this user is 'in'
+  // and then tries to listen to them
+  // this is mainly to pick up new oneOnOne conversations
+  // when a user DMs the bot
+  // as I can't see an event the bot would get to know about that
+  // so its kind of like 'polling' and currently only called from the webUI
+  scanRooms: function(user, token) {
+    clog('user', user);
+    clog('token', token);
+    GitterHelper.fetchRooms(user, token, (err, rooms) => {
+      if (err) {
+        Utils.warn('GBot', 'fetchRooms', err);
+      }
+      if (!rooms) {
+        Utils.warn('cant scanRooms');
+        return;
+      }
+      clog('scanRooms.rooms', rooms);
+      rooms.map(room => {
+        if (room.oneToOne) {
+          clog('oneToOne', room.name);
+          this.gitter.rooms.find(room.id)
+            .then(roomObj => {
+              this.listenToRoom(roomObj);
+            });
+        }
+      });
+    });
+  },
+
+  // TODO - FIXME doesnt work for some reason >.<
+  // needs different type of token?
+  updateRooms: function() {
+    GBot.gitter.currentUser()
+      .then(user => {
+        const list = user.rooms((err, obj) => {
+          clog('rooms', err, obj);
+        });
+        clog('user', user);
+        clog('list', list);
+        return list;
+      });
+  }
+};
+
+module.exports = GBot;
diff --git a/lib/bot/InputWrap.js b/lib/bot/InputWrap.js
new file mode 100644
index 0000000..5877fe2
--- /dev/null
+++ b/lib/bot/InputWrap.js
@@ -0,0 +1,32 @@
+'use strict';
+
+const Utils = require('../utils/Utils');
+
+const InputWrap = {
+  roomShortName: function(input) {
+    let name = input.message.room.name;
+    name = name.split('/');
+    name = name[1] || name[0];
+    return name;
+  },
+
+  fromUser: function(input) {
+    try {
+      return '@' + input.message.model.fromUser.username;
+    } catch (e) {
+      Utils.error('InputWrap', 'no fromUser', input);
+    }
+  },
+
+  mentioned: function(input) {
+    const mentions = input.message.model.mentions;
+    let names;
+    if (mentions) {
+      // TODO - build a list
+      return names;
+    }
+    return null;
+  }
+};
+
+module.exports = InputWrap;
diff --git a/lib/bot/KBase.js b/lib/bot/KBase.js
new file mode 100644
index 0000000..66e085a
--- /dev/null
+++ b/lib/bot/KBase.js
@@ -0,0 +1,150 @@
+'use strict';
+
+const TextLib = require('../utils/TextLib'),
+      fs = require('fs'),
+      path = require('path'),
+      Utils = require('../utils/Utils');
+
+// topicNameList - list of individual topic keywords eg 'chai-cheat'
+// topics    - Hash full data of all topics
+
+//  example topic:
+//
+// 'js-for':
+//  { path: '/Users/dc/dev/fcc/gitterbot/nap/data/wiki/js-for.md',
+//    topic: 'js-for',
+//    fname: 'js-for.md',
+//    data: 'The javascript `for` command iterates through a list of items.\n\n
+//           ```js\nfor (var i = 0; i < 9; i++) {\n   console.log(i);\n
+//               // more statements\n}\n```\n\n----',
+//    shortData: 'The javascript `for` command iterates through a list of items.
+//                \n\n```js\nfor (var i = 0; i < 9; i++) {\n   console.log(i);\n
+//                   // more statements\n}\n```\n\n----' },
+
+const KBase = {
+  files: [],
+  topics: null,
+  findMoreResults: [],
+
+  initSync: function() {
+    // TODO - FIXME works relative?
+    const wikiDataDir = path.join(__dirname, '/../../data/wiki');
+
+    KBase.allData = [];
+    fs.readdirSync(wikiDataDir).forEach(name => {
+      if ((/md$/).test(name)) {
+        const filePath = path.join(wikiDataDir, name),
+              arr = filePath.split(path.sep),
+              fileName = arr[arr.length - 1].toLowerCase(),
+              topicName = fileName.replace('.md', ''),
+              data = fs.readFileSync(filePath, 'utf8');
+
+        const blob = {
+            path: filePath,
+            displayName: Utils.namify(topicName),
+            fileName: fileName,
+            data: data,
+            shortData: TextLib.trimLines(data),
+            dashedName: TextLib.dashedName(topicName)
+        };
+
+        KBase.allData.push(blob);
+      }
+    });
+    return KBase.allData;
+  },
+
+  getWikiHints: function(bfName) {
+    const topicData = this.getTopicData(bfName);
+    if (topicData) {
+      return topicData.data.split('##');
+    } else {
+      return null;
+    }
+  },
+
+  getTopicData: function(params) {
+    const searchDashName = TextLib.dashedName(params);
+
+    if (!KBase.allData) {
+      KBase.initSync();
+    } else {
+      const shortList = KBase.allData.filter(t => {
+        return (t.dashedName.includes(searchDashName));
+      });
+      if (shortList) {
+        return shortList[0];
+      } else {
+        Utils.warn('KBase', 'cant find topicData for', params);
+        Utils.warn('Kbase', 'allData', KBase.allData);
+        return null;
+      }
+    }
+  },
+
+  getTopics: function(keyword) {
+    // TODO - refac and use function above
+    const searchDashName = TextLib.dashedName(keyword);
+    const shortList = this.allData.filter(t => {
+      return (t.dashedName.includes(searchDashName));
+    });
+    return shortList;
+  },
+
+  //    return topics as markdown links
+  getTopicsAsList: function(keyword) {
+    const shortList = this.getTopics(keyword);
+    let findResults;
+    if (shortList.length === 0) {
+      return 'nothing found';
+    }
+    if (this.findMoreResults[0] === keyword) {
+      // continue list of enteries after limit
+      findResults = this.findMoreResults[1];
+      this.findMoreResults = [];
+      return '> more enteries: \n ' + findResults;
+    }
+    this.findMoreResults = [];
+    // else
+    Utils.log('shortList', shortList);
+
+    const emojiList = [':zero:', ':one:', ':two:', ':three:', ':four:',
+                        ':five:', ':six:', ':seven:', ':eight:', ':nine:'];
+    const listLimit = 20;
+
+    findResults = '';
+    for (let i = 0; i < shortList.length; i++) {
+      let topicData = shortList[i],
+          link = Utils.linkify(topicData.dashedName, 'wiki',
+                                 topicData.displayName);
+      let line;
+      if (i < 10) {
+        line = '\n ' + emojiList[i] + ' ' + link;
+      } else if (i < 100) {
+        let iSplit = i.toString().split('');
+        line = '\n ' + emojiList[iSplit[0]] +
+               emojiList[iSplit[1]] + ' ' + link;
+      }
+
+      if (i === listLimit) {
+        // meets limit
+        findResults += '\n > limited to first ' + listLimit + ' entries.' +
+                       '\n > type `find ' + keyword +
+                       '` again for more enteries.';
+        this.findMoreResults[0] = keyword;
+        this.findMoreResults[1] = '' + line;
+      } else if (i > listLimit) {
+        // exceeds limit
+        this.findMoreResults[1] += line;
+      } else {
+        // below limit
+        findResults += line;
+      }
+    }
+    return findResults;
+  }
+};
+
+KBase.initSync();
+
+module.exports = KBase;
diff --git a/lib/bot/cmds/bonfire.js b/lib/bot/cmds/bonfire.js
new file mode 100644
index 0000000..73afe2c
--- /dev/null
+++ b/lib/bot/cmds/bonfire.js
@@ -0,0 +1,118 @@
+'use strict';
+
+const Bonfires = require('../../../lib/app/Bonfires'),
+      Rooms = require('../../../lib/app/Rooms'),
+      Utils = require('../../../lib/utils/Utils');
+
+const commands = {
+
+  // commands to bonfire with a parameter
+  bonfire: function(input, bot, blob) {
+
+    const bonfire = this.checkHasBonfire(input, bot);
+    let foundCmd = false;
+
+    const opts = {
+      bonfire: bonfire,
+      input: input,
+      bot: bot,
+      blob: blob
+    };
+
+    if (bonfire) {
+      foundCmd = this.checkBonfireCommands(opts);
+      if (foundCmd) {
+        return foundCmd;
+      }
+    }
+    if (!foundCmd) {
+      return this.searchBonfire(input, bot);
+    }
+  },
+
+  checkBonfireCommands: function(opts) {
+    const bonfire = opts.bonfire;
+    switch (opts.input.params) {
+      // no params just return status
+      /* eslint-disable no-undefined */
+      case undefined:
+        return Bonfires.fixed.reminder(bonfire.name);
+      /* eslint-enable no-undefined */
+      case 'info':
+        return Bonfires.bonfireInfo(bonfire);
+      case 'details':
+        return Bonfires.bonfireDetails(bonfire);
+      case 'links':
+        return Bonfires.bonfireLinks(bonfire);
+      case 'spoiler':
+      case 'hint':
+        return this.hint(opts.input, opts.bot);
+      case 'script':
+        return Bonfires.bonfireScript(bonfire);
+      case 'wiki':
+        return Bonfires.bonfireWiki(bonfire);
+      case 'name':
+        return Bonfires.fixed.nameHint;
+      case 'status':
+        return Bonfires.bonfireStatus(bonfire);
+      default:
+        return false;
+    }
+  },
+
+  searchBonfire: function(input) {
+    if (!input.params) {
+      return Bonfires.fixed.askName;
+    }
+
+    Utils.log('params ', input.params);
+    const newBonfire = Bonfires.findBonfire(input.params);
+
+    if (newBonfire) {
+      this.currentBonfire = newBonfire;
+      return Bonfires.bonfireInfo(newBonfire);
+    } else {
+      // TODO - only send this messsage if at the start of a line
+      return Bonfires.fixed.cantFind(input.params);
+    }
+  },
+
+  // TODO - FIXME this is a bit sketchy, return type is 'bonfire name' or true.
+  checkHasBonfire: function(input) {
+    const roomName = input.message.room.name;
+    if (Rooms.isBonfire(roomName)) {
+      const bfName = roomName.split('/')[1];
+      return Bonfires.findBonfire(bfName);
+    }
+
+    if (!this.currentBonfire) {
+      return false;
+    }
+
+    return this.currentBonfire;
+  },
+
+  inBonfireRoom: function(input) {
+    const roomName = input.message.room.name;
+    return !!Rooms.isBonfire(roomName);
+  },
+
+  // this is a naked command
+  hint: function(input, bot) {
+    const bonfire = this.checkHasBonfire(input, bot);
+    if (!bonfire) {
+      return Bonfires.fixed.setName;
+    }
+
+    if (!this.inBonfireRoom(input, bot)) {
+      return Bonfires.fixed.goToBonfireRoom(bonfire);
+    }
+    // all good so:
+    return Bonfires.getNextHint(bonfire, input);
+  }
+};
+
+// alias
+commands.bf = commands.bonfire;
+
+module.exports = commands;
diff --git a/lib/bot/cmds/thanks.js b/lib/bot/cmds/thanks.js
new file mode 100644
index 0000000..b67f371
--- /dev/null
+++ b/lib/bot/cmds/thanks.js
@@ -0,0 +1,124 @@
+/*jslint todo: true */
+'use strict';
+
+const GBot = require('../../../lib/bot/GBot.js'),
+      Utils = require('../../../lib/utils/Utils'),
+      HttpWrap = require('../../../lib/utils/HttpWrap'),
+      TextLib = require('../../../lib/utils/TextLib');
+
+const thanksCommands = {
+
+  messages: {
+    wikiHint: function(fromUser) {
+      const wikiUrl = '(https://github.com/freecodecamp/' +
+                    'freecodecamp/wiki/wiki-style-guide)';
+
+      return '\n> hey @' + fromUser + ' if you found this info helpful ' +
+        ':point_right: *[consider adding a wiki article!]' + wikiUrl + '*';
+    }
+  },
+
+  thanks: function(input, bot) {
+    Utils.hasProperty(input, 'message', 'thanks expects an object');
+    let mentions, fromUser, toUser, toUserMessage;
+
+    mentions = input.message.model.mentions;
+    // just 'thanks' in a message
+    if (mentions && mentions.length === 0) {
+      Utils.warn('thanks', 'without any mentions', input.message.model);
+      return null;
+    }
+
+    fromUser = input.message.model.fromUser.username.toLowerCase();
+    const options = {
+      method: 'POST',
+      input: input,
+      bot: bot
+    };
+
+    const namesList = mentions.map(m => {
+      toUser = m.screenName.toLowerCase();
+      if (toUser !== fromUser) {
+        const apiPath = '/api/users/give-brownie-points?receiver=' + toUser +
+                        '&giver=' + fromUser;
+        HttpWrap.callApi(apiPath, options, thanksCommands.showInfoCallback);
+        return toUser;
+      } else {
+        return null;
+      }
+    });
+
+    if (namesList[0]) {
+      toUserMessage = namesList.join(' and @');
+      return '> ' + fromUser + ' sends brownie points to @' + toUserMessage +
+        ' :sparkles: :thumbsup: :sparkles: ';
+    } else {
+      return '> sorry ' + fromUser + ', you can\'t send brownie points to ' +
+        'yourself! :sparkles: :sparkles: ';
+    }
+  },
+
+  about: function(input, bot) {
+    const mentions = input.message.model.mentions,
+          them = mentions[0];
+
+    if (!them) {
+      Utils.warn('about without any mentions', input.message.model);
+      return 'you need to ask about @someone!';
+    }
+    const name = them.screenName.toLowerCase();
+    const options = {
+      method: 'GET',
+      input: input,
+      bot: bot
+    };
+
+    const apiPath = '/api/users/about?username=' + name;
+    HttpWrap.callApi(apiPath, options, thanksCommands.showInfoCallback);
+  },
+
+  // called back from apiCall so can't use Global GBot here
+  // blob:
+  //      response
+  //      bot
+  //      input
+  showInfoCallback: function(blob) {
+    // in case we want to filter the message
+    const cleanMessage = message => {
+      // return message;
+      if (message.match(/^FCC: no user/)) {
+        message = 'hmm, can\'t find that user on the beta site. wait til ' +
+                  'we release new version!';
+      }
+      message = '> :warning: ' + message;
+      return message;
+    };
+
+    if (blob.response.error) {
+      const message = cleanMessage(blob.response.error.message);
+
+      Utils.warn('WARN @thanks>', blob.response.error.message,
+                 blob.response.error);
+
+      // show the error to the user
+      blob.bot.say(message, blob.input.message.room);
+      return false;
+    }
+
+    let str;
+    try {
+      const username = blob.response.about.username,
+            about = blob.response.about,
+            uri = 'http://www.freecodecamp.com/' + username;
+      str = '> :star: ' + about.browniePoints + ' | @' + username + ' | ';
+      str += TextLib.mdLink(uri, uri);
+    } catch (err) {
+      Utils.error('can\'t create response from API callback', err);
+      Utils.warn('thanks>', 'blob>', blob);
+      str = 'api offline';
+    }
+    blob.bot.say(str, blob.input.message.room);
+  }
+};
+
+module.exports = thanksCommands;
diff --git a/lib/bot/cmds/update.js b/lib/bot/cmds/update.js
new file mode 100644
index 0000000..21e36d3
--- /dev/null
+++ b/lib/bot/cmds/update.js
@@ -0,0 +1,42 @@
+'use strict';
+
+const spawn = require('child_process').spawn,
+      KBase = require('../../bot/KBase'),
+      Bonfires = require('../../../lib/app/Bonfires');
+
+const commands = {
+  update: function(input, bot) {
+    const cmdPath = 'bin/wiki-pull.sh';
+
+    if (input.params && input.params !== 'wiki') {
+      // has to be exact command
+      return;
+    }
+
+    let cmd = spawn('sh', [ cmdPath ], {
+      cwd: process.cwd()
+    });
+
+    // these throw errors if you're already on a branch
+    cmd.stdout.on('data', data => {
+      const piped = '\n```' + data + '```\n';
+      bot.say(piped, input.message.room);
+    });
+
+    cmd.stderr.on('data', data => {
+      console.log('stderr: ' + data);
+    });
+
+    cmd.on('close', code => {
+      KBase.initSync();
+      Bonfires.load();
+      const output = '\n`done code: ' + code + '`' + '\n :computer: ';
+      bot.say(output, input.message.room);
+    });
+    /* eslint-disable consistent-return */
+    return 'updating wiki...';
+    /* eslint-enable consistent-return */
+  }
+};
+
+module.exports = commands;
diff --git a/lib/bot/cmds/wiki.js b/lib/bot/cmds/wiki.js
new file mode 100644
index 0000000..684a0e3
--- /dev/null
+++ b/lib/bot/cmds/wiki.js
@@ -0,0 +1,44 @@
+'use strict';
+
+const KBase = require('../../bot/KBase'),
+    Utils = require('../../../lib/utils/Utils');
+
+const commands = {
+
+  wikiFooter: function(params) {
+    const text = ('read more about ' + params + ' on the FCC Wiki'),
+          link = Utils.linkify(params, 'wiki', text);
+
+    return '\n:pencil: ' + link;
+  },
+
+  wikiUsage: function() {
+    return 'usage:\n    `wiki $topic`   info on that topic';
+  },
+
+  wikiCantFind: function(input) {
+    Utils.warn('wiki.js', 'cant find topic for', input.params);
+    return 'no wiki entry for: `' + input.params + '`';
+  },
+
+  wiki: function(input) {
+    if (!input.params) {
+      return this.wikiUsage();
+    }
+
+    const topicData = KBase.getTopicData(input.params);
+    if (!topicData) {
+      Utils.warn('cant find topic for ', input.params);
+      return this.wikiCantFind(input);
+    }
+
+    Utils.log('topicData', topicData);
+    const link = Utils.linkify(topicData.dashedName, 'wiki',
+                               topicData.displayName + '  [wiki]');
+
+    return '## :point_right: ' + link + '\n' + topicData.shortData +
+      this.wikiFooter(topicData.dashedName);
+  }
+};
+
+module.exports = commands;
diff --git a/lib/gitter/GitterHelper.js b/lib/gitter/GitterHelper.js
new file mode 100644
index 0000000..42f4905
--- /dev/null
+++ b/lib/gitter/GitterHelper.js
@@ -0,0 +1,133 @@
+'use strict';
+
+const gitterHost = process.env.HOST || 'https://gitter.im',
+      AppConfig = require('../../config/AppConfig'),
+      Utils = require('../../lib/utils/Utils'),
+      request = require('request'),
+      _ = require('lodash');
+
+// Gitter API client helper
+const GitterHelper = {
+
+  roomDataCache: {},
+
+  fetch: function(path, callback, options) {
+    options = options || {};
+
+    const defaultOptions = {
+      uri: gitterHost + '/api/v1' + path,
+      headers: {
+        'Content-Type': 'application/json',
+        'Accept': 'application/json',
+        'Authorization': 'Bearer ' + AppConfig.token
+      }
+    };
+    // opts takes priority
+    _.extend(defaultOptions, options);
+
+    request(defaultOptions, (err, res, body) => {
+      if (err) {
+        Utils.error('GitterHelper.fetch', err);
+        Utils.error('GitterHelper.fetch.options', defaultOptions);
+        return callback(err);
+      }
+      /* eslint-disable consistent-return */
+      if (!callback) { return; }
+      /* eslint-enable consistent-return */
+
+      if (res.statusCode === 200) {
+        let data;
+        // TODO - FIXME sometimes we get JSON back (from POST requests)
+        // sometimes we just get a string
+        if (typeof body === 'string') {
+          data = JSON.parse(body);
+        } else {
+          // hope its json!
+          data = body;
+        }
+        return callback(null, data);
+      } else {
+        Utils.warn('GitterHelper', 'non 200 response from', defaultOptions);
+        Utils.warn('GitterHelper', 'body', body);
+        return callback('err' + res.statusCode);
+      }
+    });
+  },
+
+  postMessage: function(text, roomId, callback, opts) {
+    const data = { 'text': text };
+    opts = {
+      method: 'POST',
+      body: data,
+      json: true
+    };
+
+    this.fetch(
+      '/rooms/' + roomId + '/chatMessages',
+      callback,
+      opts
+    );
+  },
+
+  fetchCurrentUser: function(token, cb) {
+    this.fetch('/user/', (err, user) => {
+      cb(err, user[0]);
+    });
+  },
+
+  // TODO - refactor not to take a token on each req
+  fetchRooms: function(user, token, cb) {
+    this.fetch('/user/' + user.id + '/rooms', (err, rooms) => {
+      cb(err, rooms);
+    });
+  },
+
+  findRoomByName: function(roomUri, callback, cbParams) {
+    cbParams = cbParams || {};
+
+    // avoid doing rest calls if we're posting to a known room
+    const cached = GitterHelper.roomDataCache[roomUri];
+    if (cached) {
+      cbParams.gitterRoom = cached;
+      return callback(cbParams);
+    } else {
+      this.fetch('/rooms', (err, rooms) => {
+        if (err) {
+          return callback(err);
+        }
+        if (!rooms) {
+          Utils.error('can\'t find rooms with roomUri', roomUri);
+          /* eslint-disable consistent-return */
+          return;
+          /* eslint-enable consistent-return */
+        }
+        const roomList = rooms.filter(rm => {
+          return rm.uri === roomUri;
+        });
+        if (roomList.length > 0) {
+          const room = roomList[0];
+          GitterHelper.roomDataCache[roomUri] = room;
+          cbParams.gitterRoom = room;
+          return callback(cbParams);
+        }
+      });
+    }
+  },
+
+  responseCallback: function() {
+    Utils.clog('GitterHelper.response callback');
+  },
+
+  sayToRoomObj: function(text, opts) {
+    GitterHelper.postMessage(text, opts.id);
+  },
+
+  sayToRoomName: function(text, roomUri) {
+    GitterHelper.findRoomByName(roomUri, opts => {
+      GitterHelper.sayToRoomObj(text, opts.gitterRoom);
+    });
+  }
+};
+
+
+module.exports = GitterHelper;
diff --git a/lib/gitter/passportModule.js b/lib/gitter/passportModule.js
new file mode 100644
index 0000000..a480dd0
--- /dev/null
+++ b/lib/gitter/passportModule.js
@@ -0,0 +1,38 @@
+'use strict';
+
+const passport = require('passport'),
+      OAuth2Strategy = require('passport-oauth2'),
+      gitterHost = process.env.HOST || 'https://gitter.im',
+      clientId = process.env.GITTER_APP_KEY,
+      clientSecret = process.env.GITTER_APP_SECRET,
+      GitterHelper = require('./GitterHelper');
+
+const opts = {
+    authorizationURL: gitterHost + '/login/oauth/authorize',
+    tokenURL: gitterHost + '/login/oauth/token',
+    clientID: clientId,
+    clientSecret: clientSecret,
+    callbackURL: '/login/callback',
+    passReqToCallback: true
+};
+
+passport.use(new OAuth2Strategy(
+  opts,
+  (req, accessToken, refreshToken, profile, done) => {
+    console.log('set access token', accessToken);
+    req.session.token = accessToken;
+    GitterHelper.fetchCurrentUser(accessToken, (err, user) => {
+      return (err ? done(err) : done(null, user));
+    });
+  }
+));
+
+passport.serializeUser((user, done) => {
+  done(null, JSON.stringify(user));
+});
+
+passport.deserializeUser((user, done) => {
+  done(null, JSON.parse(user));
+});
+
+module.exports = passport;
diff --git a/lib/gitter/restApi.js b/lib/gitter/restApi.js
new file mode 100644
index 0000000..6cffc26
--- /dev/null
+++ b/lib/gitter/restApi.js
@@ -0,0 +1,102 @@
+'use strict';
+
+const gitterHost = process.env.HOST || 'https://gitter.im',
+      _ = require('underscore'),
+      request = require('request'),
+      AppConfig = require('../../../config/AppConfig');
+
+function handleCallback(err) {
+  if (err) {
+    console.error('ERROR \n');
+  }
+}
+
+// Gitter API client helper
+const gitter = {
+  stashToken: function(token) {
+    if (token) {
+      AppConfig.token = token;
+    } else {
+      console.error('tried to stash null token:', token);
+    }
+    console.log('stashToken AppConfig:', AppConfig);
+    token = token || AppConfig.token;
+    return token;
+  },
+
+  checkUser: function(user) {
+    if (user === '[') {
+      console.error('WTF user is [');
+      user = AppConfig.user;
+    }
+    return user;
+  },
+
+  fetch: function(path, token, cb, opts) {
+    token = token || AppConfig.token;
+    const options = {
+      url: gitterHost + path,
+      headers: {
+        'Content-Type': 'application/json',
+        'Accept': 'application/json',
+        'Authorization': 'Bearer ' + token
+      }
+    };
+
+    opts = opts || {};
+    // opts takes priority
+    _.extend(options, opts);
+
+    request(options, (err, res, body) => {
+      if (err) { return cb(err); }
+
+      if (res.statusCode === 200) {
+        cb(null, body);
+      } else {
+        cb('err ' + res.statusCode);
+      }
+    });
+  },
+
+  fetchCurrentUser: function(token, cb) {
+    this.fetch('/api/v1/user/', token, (err, user) => {
+      cb(err, user[0]);
+    });
+  },
+
+  fetchRooms: function(user, token, cb) {
+    // TODO - FIXME
+    user = this.checkUser(user);
+    token = this.stashToken(token);
+    this.fetch('/api/v1/user/' + user.id + '/rooms', token, (err, rooms) => {
+      cb(err, rooms);
+    });
+  },
+
+  postMessage: function(text, roomId) {
+    const token = this.stashToken();
+    roomId = roomId || AppConfig.roomId;
+    const data = { 'text': text };
+    const opts = {
+      method: 'POST',
+      // body: JSON.stringify(data),
+      body: data,
+      json: true
+    };
+
+    this.fetch(
+      '/api/v1/rooms/' + roomId + '/chatMessages',
+      token,
+      handleCallback,
+      opts
+    );
+  }
+};
+
+
+gitter.currentUser().then(user => {
+  console.log('---- You are logged in as:', user.username);
+});
+
+
+module.exports = gitter;
diff --git a/lib/gitter/streamApi.js b/lib/gitter/streamApi.js
new file mode 100644
index 0000000..cd2f566
--- /dev/null
+++ b/lib/gitter/streamApi.js
@@ -0,0 +1,41 @@
+'use strict';
+
+const https = require('https');
+
+function listenToRoom(roomId, bot) {
+  const token = process.env.GITTER_USER_TOKEN,
+        heartbeat = ' \n';
+
+  console.log('listenToRoom', roomId);
+
+  const options = {
+    hostname: 'stream.gitter.im',
+    port: 443,
+    path: '/v1/rooms/' + roomId + '/chatMessages',
+    method: 'GET',
+    headers: {
+      'Authorization': 'Bearer ' + token
+    }
+  };
+
+  const req = https.request(options, res => {
+    res.on('data', chunk => {
+      const msg = chunk.toString();
+      if (msg !== heartbeat) {
+        const blob = JSON.parse(msg);
+        blob.roomId = roomId;
+        bot.reply(blob);
+      }
+    });
+  });
+
+  req.on('error', e => {
+    console.log('Something went wrong: ' + e.message);
+  });
+
+  req.end();
+}
+
+module.exports = {
+  'listenToRoom': listenToRoom
+};
diff --git a/lib/utils/HttpWrap.js b/lib/utils/HttpWrap.js
new file mode 100644
index 0000000..ace5e8b
--- /dev/null
+++ b/lib/utils/HttpWrap.js
@@ -0,0 +1,57 @@
+'use strict';
+
+const http = require('http'),
+      _ = require('lodash'),
+      AppConfig = require('../../config/AppConfig'),
+      Utils = require('./Utils');
+
+const HttpWrap = {
+  defaultOptions: {
+    host: AppConfig.apiServer,
+    timeout: 5000,
+    debug: false,
+    headers: {
+      'Authorization': AppConfig.apiKey
+    }
+  },
+
+  callApi: function(apiPath, options, callback) {
+
+    _.merge(this.defaultOptions, options);
+
+    // TODO add authorisation to header
+    this.defaultOptions.path = apiPath;
+
+    const handleResponse = response => {
+      let str = '';
+
+      // another chunk of data has been received, so append it to `str`
+      response.on('data', chunk => {
+        str += chunk;
+      });
+
+      // the whole response has been recieved, so we just print it out here
+      response.on('end', () => {
+        try {
+          const blob = JSON.parse(str);
+          options.response = blob;
+        } catch (err) {
+          Utils.error('cant parse API response', str);
+          Utils.error('error>', err);
+          options.response = 'api offline';
+        }
+        callback(options);
+      });
+    };
+
+    const handleTimeout = err => {
+      Utils.error('HttpWrap', 'timeout', err);
+    };
+
+    const request = http.request(this.defaultOptions, handleResponse);
+    request.setTimeout(3000, handleTimeout);
+    request.end();
+  }
+};
+
+module.exports = HttpWrap;
diff --git a/lib/utils/TextLib.js b/lib/utils/TextLib.js
new file mode 100644
index 0000000..df113ac
--- /dev/null
+++ b/lib/utils/TextLib.js
@@ -0,0 +1,34 @@
+'use strict';
+
+const AppConfig = require('../../config/AppConfig');
+
+const TextLib = {
+  // we only show the first para
+  // and limit to 20 lines
+  trimLines: function(data, lines) {
+    const part = data.split('\n## ')[0];
+    lines = lines || AppConfig.MAX_WIKI_LINES;
+    let subset = part.split('\n');
+    subset = subset.slice(0, lines).join('\n');
+    return subset;
+  },
+
+  mdLink: function(text, uri) {
+    return '[' + text + '](' + uri + ')';
+  },
+
+  dashedName: function(str) {
+    if (!str) { return; }
+    str = str.replace(/\s/g, '-');
+    str = str.toLowerCase();
+    // in case of doubles
+    str = str.replace('--', '-');
+    str = str.replace('.md', '');
+    str = str.replace(/([^a-z0-9áéíóúñü_@\-\s]|[\t\n\f\r\v\0])/gim, '');
+    /* eslint-disable consistent-return */
+    return str;
+    /* eslint-enable consistent-return */
+  }
+};
+
+module.exports = TextLib;
diff --git a/lib/utils/Utils.js b/lib/utils/Utils.js
new file mode 100644
index 0000000..5035745
--- /dev/null
+++ b/lib/utils/Utils.js
@@ -0,0 +1,244 @@
+'use strict';
+
+require('dotenv').config({path: 'dot.env'});
+
+const assert = require('chai').assert,
+      clc = require('cli-color'),
+      _ = require('lodash'),
+      AppConfig = require('../../config/AppConfig'),
+      MDNlinks = require('../../data/seed/bonfireMDNlinks');
+
+const LOG_LEVEL_ERROR = 2,
+      LOG_LEVEL_WARN = 3,
+      LOG_LEVEL_INFO = 5;
+
+const Utils = {
+
+  cols: {
+    error: clc.bgRedBright.white.bold,
+    warn: clc.black.bgYellow.bold,
+    info: clc.black.cyanBright,
+    info2: clc.black.bgCyan,
+    notice: clc.blue,
+    bright: clc.xterm(237).bgXterm(195),
+    dimmed: clc.xterm(232).bgXterm(253),
+    warning: clc.xterm(232).bgXterm(215),
+    errorColors: clc.xterm(232).bgRedBright
+  },
+
+  // default
+  logLevel: 10,
+
+  log: function(msg, obj) {
+    let where = '';
+    if (this.logLevel > LOG_LEVEL_INFO) {
+      where = this.stackLines(3, 4);
+    }
+    Utils.clog(where, msg, obj);
+  },
+
+  clog: function(where, msg, obj) {
+    if (process.env.SERVER_ENV || this.logLevel < LOG_LEVEL_INFO) {
+      return;
+    }
+    obj = obj || '';
+    console.log(this.cols.info(where), this.cols.info(msg), obj);
+  },
+
+  // log during test
+  tlog: function() {
+    if (process.env.SERVER_ENV) { return; }
+    const args = Array.prototype.slice.call(arguments);
+    const p1 = args.shift() || '_',
+          p2 = args.shift() || '_',
+          p3 = args.shift() || '_';
+    console.log(this.cols.bright(p1), p2, p3);
+    args.forEach(p => {
+      if (p) { console.log(p); }
+    });
+  },
+
+  warn: function(where, msg, obj) {
+    if (process.env.SERVER_ENV || this.logLevel < LOG_LEVEL_WARN) {
+      return;
+    }
+    obj = obj || '';
+    console.warn(this.cols.warn(where), this.cols.warn(msg), obj);
+  },
+
+  stackTrace: function() {
+    const err = new Error();
+    console.log(err);
+    return err.stack;
+  },
+
+  stackLines: function(from, to) {
+    const err = new Error(),
+          lines = err.stack.split('\n');
+    return lines.slice(from, to).join('\n');
+  },
+
+  error: function(where, msg, obj) {
+    if (process.env.SERVER_ENV || this.logLevel < LOG_LEVEL_ERROR) {
+        return;
+    }
+    obj = obj || '';
+    console.error(this.cols.error(where), this.cols.error(msg), obj);
+
+    const stackLines = this.stackLines(3, 10);
+    where = 'ERROR: ' + stackLines + '\n / ' + where;
+    console.log(stackLines);
+  },
+
+  // move to TextLib
+  // does ~same as dashedName() method so remove this one
+  sanitize: function(str, opts) {
+    if (opts && opts.spaces) {
+      str = str.replace(/\s/g, '-');
+    }
+    str = str.toLowerCase();
+    str = str.replace('.md', '');
+    str = str.replace(/([^a-z0-9áéíóúñü_@\-\s]|[\t\n\f\r\v\0])/gim, '');
+    return str;
+  },
+
+  // display filenames replace the - with a space
+  namify: function(str) {
+    str = str.replace(/-/g, ' ');
+    return str;
+  },
+
+  asFileName: function(str) {
+    if (str) {
+      str = str.replace(/ /g, '-');
+    }
+    str = str.toLowerCase();
+    return str;
+  },
+
+  // text is optional if we want URL to be different from displayed text
+  linkify: function(path, where, text) {
+    let host;
+
+    where = where || 'wiki';
+    text = text || path;
+    if (!path) {
+      Utils.error('tried to linkify an empty item');
+      return '-----';
+    }
+    // not URL encoded
+    path = path.replace('?', '%3F');
+
+    switch (where) {
+      case 'gitter':
+      case 'camperbot':
+        host = AppConfig.gitterHost + AppConfig.getBotName() + '/';
+        break;
+      case 'wiki':
+        host = AppConfig.wikiHost;
+        break;
+      default:
+        break;
+    }
+
+    const uri = host + path,
+          name = Utils.namify(text),
+          link = '[' + name + '](' + uri + ')';
+    Utils.clog('Utils.linkify>', 'link', link);
+    return link;
+  },
+
+  splitParams: function(text) {
+    assert.isString(text);
+    let params;
+    const parts = text.split(' '),
+          keyword = parts.shift();
+
+    if (parts.length > 0) {
+      params = parts.join(' ');
+    }
+    const res = {
+      keyword: keyword,
+      params: params
+    };
+
+    return res;
+  },
+
+  checkNotNull: function(item, msg) {
+    if (item) {
+      // means OK
+      return true;
+    } else {
+      Utils.error(msg);
+      return false;
+    }
+  },
+
+  isObject: function(obj, errmsg) {
+    errmsg = errmsg || 'not an object';
+    return true;
+
+    if (typeof obj === 'object') {
+      // means OK
+      return true;
+    } else {
+      this.error(errmsg, obj);
+      return false;
+    }
+  },
+
+
+  makeMdnLinks: function(items) {
+    let out = '';
+    if (!items) {
+      Utils.error('tried to makeMdnLinks for no items');
+      return '';
+    }
+    items.forEach(one => {
+      out += '\n- [' + one + '](' + MDNlinks[one] + ')';
+    });
+    return out;
+  },
+
+  timeStamp: function(when, baseDate) {
+    let month, day;
+    baseDate = baseDate || new Date();
+    const d1 = new Date();
+
+    switch (when) {
+      case 'yesterday':
+      default:
+        d1.setDate(baseDate.getDate() - 1);
+    }
+
+    month = d1.getMonth() + 1;
+    month = _.padLeft(month, 2, '0');
+
+    day = d1.getDate();
+    day = _.padLeft(day, 2, '0');
+
+    const timestamp = d1.getFullYear() + '/' + month + '/' + day;
+    return timestamp;
+  },
+
+  hasProperty: function(obj, prop, msg) {
+    if (obj && obj.hasOwnProperty(prop)) {
+      return true;
+    }
+    msg = msg || 'ERROR';
+    Utils.error(msg);
+    Utils.error('missing property', prop, obj);
+    return false;
+  },
+
+  betaFooter: function() {
+    return '\n\n >this feature is linked to our [beta site](beta.freecodecamp' +
+      '.com), so it may not have all users til we go live with the new ' +
+      'release. Also check that FCC ID matches githubID!';
+  }
+};
+
+Utils.logLevel = parseInt(process.env.LOG_LEVEL || 4, 10);
+
+module.exports = Utils;
diff --git a/logs/README.md b/logs/README.md
new file mode 100644
index 0000000..feeed59
--- /dev/null
+++ b/logs/README.md
@@ -0,0 +1 @@
+this file keeps the directory even if contents are ignored
\ No newline at end of file
diff --git a/nap/.eslintrc b/nap/.eslintrc
deleted file mode 100644
index 92fad47..0000000
--- a/nap/.eslintrc
+++ /dev/null
@@ -1,241 +0,0 @@
-{
-  "ecmaFeatures": {
-    "jsx": true
-  },
-  "env": {
-    "browser": true,
-    "mocha": true,
-    "node": true
-  },
-  "parser": "babel-eslint",
-  "plugins": [
-    "react"
-  ],
-  "globals": {
-    "window": true,
-    "$": true,
-    "ga": true,
-    "jQuery": true,
-    "router": true
-  },
-  "rules": {
-    "comma-dangle": 2,
-    "no-cond-assign": 2,
-    "no-console": 0,
-    "no-constant-condition": 2,
-    "no-control-regex": 2,
-    "no-debugger": 2,
-    "no-dupe-keys": 2,
-    "no-empty": 2,
-    "no-empty-character-class": 2,
-    "no-ex-assign": 2,
-    "no-extra-boolean-cast": 2,
-    "no-extra-parens": 0,
-    "no-extra-semi": 2,
-    "no-func-assign": 2,
-    "no-inner-declarations": 2,
-    "no-invalid-regexp": 2,
-    "no-irregular-whitespace": 2,
-    "no-negated-in-lhs": 2,
-    "no-obj-calls": 2,
-    "no-regex-spaces": 2,
-    "no-reserved-keys": 0,
-    "no-sparse-arrays": 2,
-    "no-unreachable": 2,
-    "use-isnan": 2,
-    "valid-jsdoc": 2,
-    "valid-typeof": 2,
-
-    "block-scoped-var": 0,
-    "complexity": 0,
-    "consistent-return": 2,
-    "curly": 2,
-    "default-case": 1,
-    "dot-notation": 0,
-    "eqeqeq": 1,
-    "guard-for-in": 1,
-    "no-alert": 1,
-    "no-caller": 2,
-    "no-div-regex": 2,
-    "no-else-return": 0,
-    "no-empty-label": 2,
-    "no-eq-null": 1,
-    "no-eval": 2,
-    "no-extend-native": 2,
-    "no-extra-bind": 2,
-    "no-fallthrough": 2,
-    "no-floating-decimal": 2,
-    "no-implied-eval": 2,
-    "no-iterator": 2,
-    "no-labels": 2,
-    "no-lone-blocks": 2,
-    "no-loop-func": 1,
-    "no-multi-spaces": 1,
-    "no-multi-str": 2,
-    "no-native-reassign": 2,
-    "no-new": 2,
-    "no-new-func": 2,
-    "no-new-wrappers": 2,
-    "no-octal": 2,
-    "no-octal-escape": 2,
-    "no-process-env": 0,
-    "no-proto": 2,
-    "no-redeclare": 1,
-    "no-return-assign": 2,
-    "no-script-url": 2,
-    "no-self-compare": 2,
-    "no-sequences": 2,
-    "no-unused-expressions": 2,
-    "no-void": 1,
-    "no-warning-comments": [
-      1,
-      {
-        "terms": [
-          "fixme"
-        ],
-        "location": "start"
-      }
-    ],
-    "no-with": 2,
-    "radix": 2,
-    "vars-on-top": 0,
-    "wrap-iife": [2, "any"],
-    "yoda": 0,
-
-    "strict": 0,
-
-    "no-catch-shadow": 2,
-    "no-delete-var": 2,
-    "no-label-var": 2,
-    "no-shadow": 0,
-    "no-shadow-restricted-names": 2,
-    "no-undef": 2,
-    "no-undef-init": 2,
-    "no-undefined": 1,
-    "no-unused-vars": 2,
-    "no-use-before-define": 0,
-
-    "handle-callback-err": 2,
-    "no-mixed-requires": 0,
-    "no-new-require": 2,
-    "no-path-concat": 2,
-    "no-process-exit": 2,
-    "no-restricted-modules": 0,
-    "no-sync": 0,
-
-    "brace-style": [
-      2,
-      "1tbs",
-      { "allowSingleLine": true }
-    ],
-    "camelcase": 1,
-    "comma-spacing": [
-      2,
-      {
-        "before": false,
-        "after": true
-      }
-    ],
-    "comma-style": [
-      2, "last"
-    ],
-    "consistent-this": 0,
-    "eol-last": 2,
-    "func-names": 0,
-    "func-style": 0,
-    "key-spacing": [
-      2,
-      {
-        "beforeColon": false,
-        "afterColon": true
-      }
-    ],
-    "max-nested-callbacks": 0,
-    "new-cap": 0,
-    "new-parens": 2,
-    "no-array-constructor": 2,
-    "no-inline-comments": 1,
-    "no-lonely-if": 1,
-    "no-mixed-spaces-and-tabs": 2,
-    "no-multiple-empty-lines": [
-      1,
-      { "max": 2 }
-    ],
-    "no-nested-ternary": 2,
-    "no-new-object": 2,
-    "semi-spacing": [2, { "before": false, "after": true }],
-    "no-spaced-func": 2,
-    "no-ternary": 0,
-    "no-trailing-spaces": 1,
-    "no-underscore-dangle": 0,
-    "one-var": 0,
-    "operator-assignment": 0,
-    "padded-blocks": 0,
-    "quote-props": 0,
-    "quotes": [
-      2,
-      "single",
-      "avoid-escape"
-    ],
-    "semi": [
-      2,
-      "always"
-    ],
-    "sort-vars": 0,
-    "space-after-keywords": [
-      2,
-      "always"
-    ],
-    "space-before-function-paren": [
-      2,
-      "never"
-    ],
-    "space-before-blocks": [
-      2,
-      "always"
-    ],
-    "space-in-brackets": 0,
-    "space-in-parens": 0,
-    "space-infix-ops": 2,
-    "space-return-throw-case": 2,
-    "space-unary-ops": [
-      1,
-      {
-        "words": true,
-        "nonwords": false
-      }
-    ],
-    "spaced-comment": [
-      2,
-      "always",
-      { "exceptions": ["-"] }
-    ],
-    "wrap-regex": 1,
-
-    "max-depth": 0,
-    "max-len": [
-      1,
-      80,
-      2
-    ],
-    "max-params": 0,
-    "max-statements": 0,
-    "no-bitwise": 1,
-    "no-plusplus": 0,
-
-    "react/display-name": 1,
-    "react/jsx-boolean-value": [1, "always"],
-    "jsx-quotes": [1, "prefer-single"],
-    "react/jsx-no-undef": 1,
-    "react/jsx-sort-props": 1,
-    "react/jsx-uses-react": 1,
-    "react/jsx-uses-vars": 1,
-    "react/no-did-mount-set-state": 2,
-    "react/no-did-update-set-state": 2,
-    "react/no-multi-comp": 2,
-    "react/prop-types": 2,
-    "react/react-in-jsx-scope": 1,
-    "react/self-closing-comp": 1,
-    "react/wrap-multilines": 1
-  }
-}
diff --git a/nap/.jsbeautifyrc b/nap/.jsbeautifyrc
deleted file mode 100644
index 226c92a..0000000
--- a/nap/.jsbeautifyrc
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-    "indent_size": 4,
-    "indent_char": " ",
-    "eol": "\n",
-    "indent_level": 0,
-    "indent_with_tabs": false,
-    "preserve_newlines": true,
-    "max_preserve_newlines": 2,
-    "jslint_happy": true,
-    "space_after_anon_function": false,
-    "brace_style": "end-expand",
-    "keep_array_indentation": false,
-    "keep_function_indentation": false,
-    "space_before_conditional": true,
-    "break_chained_methods": false,
-    "eval_code": false,
-    "unescape_strings": false,
-    "wrap_line_length": 80,
-    "wrap_attributes": "auto",
-    "wrap_attributes_indent_size": 4,
-    "end_with_newline": false
-}
diff --git a/nap/app.js b/nap/app.js
deleted file mode 100644
index 8455021..0000000
--- a/nap/app.js
+++ /dev/null
@@ -1,40 +0,0 @@
-'use strict';
-
-require('dotenv').config({path: 'dot.env'});
-
-console.log('--------------- startup ------------------');
-
-if (typeof Map !== 'function' ) {
-  throw new Error('ES6 is required; add --harmony');
-}
-
-const express = require('express'),
-      port = process.env.PORT || 7891,
-      passport = require('./lib/gitter/passportModule'),
-      GBot = require('./lib/bot/GBot'),
-      routes = require('./lib/app/routes.js'),
-      path = require('path');
-
-const app = express();
-
-// Middlewares
-app.set('view engine', 'jade');
-app.set('views', path.join(__dirname, '/views'));
-app.use(express.json());
-app.use(express.urlencoded());
-app.use(express.static(path.join(__dirname, '/public')));
-app.use(express.bodyParser());
-app.use(express.methodOverride());
-app.use(express.cookieParser());
-app.use(express.session({
-  secret: 'keyboard cat'
-}));
-app.use(passport.initialize());
-app.use(passport.session());
-app.use(app.router);
-
-GBot.init();
-routes.init(app, GBot, passport);
-
-app.listen(port);
-console.log('Demo app running at http://localhost:' + port);
diff --git a/nap/bin/.gitignore b/nap/bin/.gitignore
deleted file mode 100644
index b9ac4fa..0000000
--- a/nap/bin/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-credentials*
-!credentials-example.sh
-!credentials-demobot.sh
diff --git a/nap/bin/auth.sh b/nap/bin/auth.sh
deleted file mode 100755
index 2dbb524..0000000
--- a/nap/bin/auth.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-source bin/credentials.sh
-
-# this doesnt seem to work
-# https://developer.gitter.im/docs/authentication
-
-
-set -x
-echo "client_id=${GITTER_APP_KEY}\n"
-
-curl -i -X POST https://gitter.im/login/oauth/token \
-  -d"client_id=${GITTER_APP_KEY}" \
-  -d"client_secret=${GITTER_APP_SECRET}" \
-  -d"code=CODE" \
-  -d"grant_type=authorization_code" \
-  -d"redirect_uri=${GITTER_APP_REDIRECT_URL}"
\ No newline at end of file
diff --git a/nap/bin/camperbot-run.sh b/nap/bin/camperbot-run.sh
deleted file mode 100755
index d816f35..0000000
--- a/nap/bin/camperbot-run.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-source bin/credentials-camperbot.sh
-
-set -x
-
-SERVER_ENV=prod \
-BOT_APP_HOST=bot.freecodecamp.com \
-GITTER_USER_TOKEN=${GITTER_USER_TOKEN} \
-GITTER_APP_KEY=${GITTER_APP_KEY} \
-GITTER_APP_SECRET=${GITTER_APP_SECRET} \
-LOG_LEVEL=10 \
-PORT=7891 \
-    nodemon -x iojs app.js
diff --git a/nap/bin/credentials-demobot.sh b/nap/bin/credentials-demobot.sh
deleted file mode 100644
index 12684ad..0000000
--- a/nap/bin/credentials-demobot.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-# get these keys from here
-# https://developer.gitter.im/apps
-
-# Personal Access Token
-GITTER_USER_TOKEN=1ac342045f5a57d99fe537e58da78f6cba94f7db
-
-# Your Apps
-# OAUTH KEY
-GITTER_APP_KEY=63ece8ac0eeed9b17b1cc9867f65d4857ec6e5fc
-
-# OAUTH SECRET
-GITTER_APP_SECRET=9026e3b3a74357035ee15a9591f31b2de5cfd3a6
-# REDIRECT URL
-GITTER_APP_REDIRECT_URL=http://localhost:7891/login/callback
diff --git a/nap/bin/credentials-example.sh b/nap/bin/credentials-example.sh
deleted file mode 100644
index e1047a7..0000000
--- a/nap/bin/credentials-example.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-# edit this file and save it as credentials.sh
-# 
-# or, create a new file like credentials-ENV.sh
-# and symlink it
-# $ ln -s credentials-ENV.sh credentials.sh
-# this file is included in other run commands
-
-GITTER_APP_KEY=XXXX
-GITTER_APP_SECRET=XXXX
-GITTER_APP_REDIRECT_URL=http://localhost:7000/login/callback
-
-GITTER_USER_TOKEN=XXXX
diff --git a/nap/bin/debug.sh b/nap/bin/debug.sh
deleted file mode 100755
index 0f43fcf..0000000
--- a/nap/bin/debug.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-open "http://localhost:8080/?ws=localhost:8080&port=5858" &
-
-source bin/credentials-bothelp.sh
-
-set -x
-
-SERVER_ENV=${SERVER_ENV} \
-GITTER_USER_TOKEN=${GITTER_USER_TOKEN} \
-GITTER_APP_KEY=${GITTER_APP_KEY} \
-GITTER_APP_SECRET=${GITTER_APP_SECRET} \
-LOG_LEVEL=10 \
-PORT=7891 \
-    node-debug -x iojs app.js
-
-    # iojs debug app.js
-
-    # node-debug --harmony app.js
-    # nodemon -x iojs app.js
-    # nodemon --harmony app.js
-    # node-debug --harmony app.js
-
diff --git a/nap/bin/deploy.sh b/nap/bin/deploy.sh
deleted file mode 100755
index 7bf6829..0000000
--- a/nap/bin/deploy.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/usr/bin/env bash
-
-set -x
-bin/wiki-update.sh
-ssh freecodecamp@104.131.2.16 "cd /home/freecodecamp/www/gitterbot/nap && \
-    git clean -f && \
-    git checkout . && \
-    git pull && \
-    pm2 restart all"
-
-
-    # bin/pm2-update.sh"
diff --git a/nap/bin/force-update.sh b/nap/bin/force-update.sh
deleted file mode 100755
index aadeaf8..0000000
--- a/nap/bin/force-update.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-git checkout .
-git clean -f
-git reset --hard HEAD
-
-# we need to remove the /wiki directory
-# to avoid git conflicts
-rm -rf data/wiki/*md
-
-git pull
diff --git a/nap/bin/git-clean.sh b/nap/bin/git-clean.sh
deleted file mode 100755
index bddf79c..0000000
--- a/nap/bin/git-clean.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-git reset --hard HEAD
-git clean -f
diff --git a/nap/bin/mocha-debug.sh b/nap/bin/mocha-debug.sh
deleted file mode 100755
index 204f691..0000000
--- a/nap/bin/mocha-debug.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-open "http://localhost:8080/?ws=localhost:8080&port=5858" &
-
-source bin/credentials.sh
-
-set -x
-
-GITTER_USER_TOKEN=${GITTER_USER_TOKEN} \
-    GITTER_APP_KEY=${GITTER_APP_KEY} \
-    GITTER_APP_SECRET=${GITTER_APP_SECRET} \
-    mocha --debug-brk --harmony
-
diff --git a/nap/bin/pm2-run.sh b/nap/bin/pm2-run.sh
deleted file mode 100755
index 685db93..0000000
--- a/nap/bin/pm2-run.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-source bin/credentials-camperbot.sh
-
-set -x
-
-SERVER_ENV=prod \
-GITTER_USER_TOKEN=${GITTER_USER_TOKEN} \
-GITTER_APP_KEY=${GITTER_APP_KEY} \
-GITTER_APP_SECRET=${GITTER_APP_SECRET} \
-LOG_LEVEL=10 \
-PORT=7891 \
-    pm2 start --name bot --interpreter iojs  app.js
-
-    # iojs app.js
-    # node --harmony app.js
-    # nodemon -x iojs app.js
-
-pm2 list
-pm2 logs all
diff --git a/nap/bin/pm2-update.sh b/nap/bin/pm2-update.sh
deleted file mode 100755
index a93bc10..0000000
--- a/nap/bin/pm2-update.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-set -x
-
-approot="/home/freecodecamp/www/gitterbot/nap"
-logpath="${approot}/logs/bot.log"
-
-git pull && pm2 restart all && pm2 logs > $logpath &&
-tail -f $logpath
diff --git a/nap/bin/post.sh b/nap/bin/post.sh
deleted file mode 100755
index 80918b6..0000000
--- a/nap/bin/post.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-source bin/credentials.sh
-
-BOTZYROOM="55b1a9030fc9f982beaac901"
-
-curl -X POST -i -H "Content-Type: application/json" \
-    -H "Accept: application/json" \
-    -H "Authorization: Bearer ${GITTER_USER_TOKEN}" \
-    "https://api.gitter.im/v1/rooms/${BOTZYROOM}/chatMessages" \
-    -d '{"text":"curl test"}'
diff --git a/nap/bin/run.sh b/nap/bin/run.sh
deleted file mode 100755
index b8a0fd9..0000000
--- a/nap/bin/run.sh
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-# bin/update-wiki.sh
-
-#source bin/credentials-bothelp.sh
-
-#set -x
-#
-#SERVER_ENV=local \
-#GITTER_USER_TOKEN=${GITTER_USER_TOKEN} \
-#GITTER_APP_KEY=${GITTER_APP_KEY} \
-#GITTER_APP_SECRET=${GITTER_APP_SECRET} \
-#LOG_LEVEL=10 \
-#PORT=7891 \
-
-# nodemon -x --harmony iojs app.js
-
-    # nodemon --harmony app.js
-
-nodemon --harmony app.js
\ No newline at end of file
diff --git a/nap/bin/step-debug.sh b/nap/bin/step-debug.sh
deleted file mode 100755
index e77733a..0000000
--- a/nap/bin/step-debug.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-# open "http://localhost:8080/?ws=localhost:8080&port=5858" &
-
-source bin/credentials-bothelp.sh
-
-set -x
-
-SERVER_ENV=${SERVER_ENV} \
-GITTER_USER_TOKEN=${GITTER_USER_TOKEN} \
-GITTER_APP_KEY=${GITTER_APP_KEY} \
-GITTER_APP_SECRET=${GITTER_APP_SECRET} \
-LOG_LEVEL=10 \
-PORT=7891 \
-    node-debug --harmony app.js
-    # iojs debug app.js
-    # nodemon -x iojs app.js
-    # nodemon --harmony app.js
-
diff --git a/nap/bin/update-run-dev.sh b/nap/bin/update-run-dev.sh
deleted file mode 100755
index 7454d4e..0000000
--- a/nap/bin/update-run-dev.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-# 
-bin/update-wiki.sh
-bin/run-dev-bothelp.sh
\ No newline at end of file
diff --git a/nap/bin/wiki-pull-prod.sh b/nap/bin/wiki-pull-prod.sh
deleted file mode 100755
index 203c617..0000000
--- a/nap/bin/wiki-pull-prod.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-# pull down wiki files
-# don't commit them back
-# just used on prod server
-# 
-# used on the production server only
-
-APPDIR=/home/freecodecamp/www/gitterbot/nap
-
-GITPATH=/usr/bin/git
-
-
-cd $APPDIR/data/fcc.wiki
-$GITPATH fetch
-$GITPATH checkout master
-$GITPATH pull origin master
-cd $APPDIR
-
-rm $APPDIR/data/wiki/*
-
-cp $APPDIR/data/fcc.wiki/*md $APPDIR/data/wiki
-
-
diff --git a/nap/bin/wiki-pull.sh b/nap/bin/wiki-pull.sh
deleted file mode 100755
index c24f7ec..0000000
--- a/nap/bin/wiki-pull.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-# pull down wiki files
-# don't commit them back
-# just used on prod server
-
-# set -x
-
-cd data/fcc.wiki
-git fetch
-# git checkout master
-git pull origin master
-cd ../..
-
-rm data/wiki/*
-
-cp data/fcc.wiki/*md data/wiki
-
-
diff --git a/nap/bin/wiki-update.sh b/nap/bin/wiki-update.sh
deleted file mode 100755
index e5ca66e..0000000
--- a/nap/bin/wiki-update.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-# pull down wiki files
-
-cd data/fcc.wiki
-git fetch
-git checkout master
-git pull origin master
-cd ../..
-
-rm data/wiki/*
-
-cp data/fcc.wiki/*md data/wiki
-
-git add data/wiki
-git commit -am "wiki update and merge"
-git fetch 
-git push -u
-
diff --git a/nap/config/AppConfig.js b/nap/config/AppConfig.js
deleted file mode 100644
index 3c0cab8..0000000
--- a/nap/config/AppConfig.js
+++ /dev/null
@@ -1,141 +0,0 @@
-'use strict';
-
-const _ = require('lodash');
-
-const AppConfig = {
-  clientId: process.env.GITTER_APP_KEY,
-  token: process.env.GITTER_USER_TOKEN,
-  apiKey: process.env.FCC_API_KEY,
-  supportDmRooms: false,
-  botname: null,
-  roomId: '55b1a9030fc9f982beaac901',
-  org: 'bothelp',
-  testUser: 'bothelp',
-  // so bot doesnt get in a loop replying itself
-  botlist: ['bothelp', 'camperbot', 'YOUR_GITHUB_ID', 'demobot'],
-  webuser: 'webuser',
-  wikiHost: 'https://github.com/freecodecamp/freecodecamp/wiki/',
-  gitterHost: 'https://gitter.im/',
-  botVersion: '0.0.11',
-  MAX_WIKI_LINES: 20,
-  botNoiseLevel: 1,
-
-  init: function() {
-    const serverEnv = process.env.SERVER_ENV;
-    AppConfig.serverEnv = serverEnv;
-    this.warn('AppConfig.init serverEnv:', serverEnv);
-
-    const thisConfig = envConfigs[serverEnv];
-    if (!thisConfig) {
-      const msg = ('FATAL ERROR! cant find serverEnv: ' + serverEnv);
-      console.error(msg);
-      throw new Error(msg);
-    }
-    _.merge(AppConfig, thisConfig);
-  },
-
-  showConfig: function() {
-    console.log('AppConfig');
-    Object.keys(AppConfig)
-    .sort()
-    .forEach(v => {
-      if (typeof AppConfig[v] !== 'function') {
-        console.log('\t', v, ':\t\t', AppConfig[v]);
-      }
-    });
-  },
-
-  warn: function(msg, obj) {
-    console.warn('WARN> AppConfig', msg, obj);
-  },
-
-  // TODO cleanup
-  // use as a function so it can be set at startup
-  // before other code calls it at runtime
-  getBotName: function() {
-    if (!AppConfig.botname) {
-      AppConfig.init();
-      this.warn('getBotName()', AppConfig.botname );
-      console.log('tried to call botname before it was set');
-    }
-    return AppConfig.botname;
-  },
-
-  who: function(req) {
-    let who;
-
-    if (req.user) {
-      console.warn('got a user in the request but ignoring');
-    } else if (req.who) {
-      who = req.who;
-    } else {
-      who = AppConfig.webuser;
-    }
-    return who;
-  },
-
-  // TODO read from config file for dev/live modes and running env
-  getOrg: function() {
-    return AppConfig.org;
-  },
-
-  topicDmUri: function(topic) {
-    let uri = AppConfig.appHost + '/go?dm=y&room=' + AppConfig.getBotName();
-    if (topic) {
-        uri += '&topic=' + topic;
-    }
-    return uri;
-  },
-
-  dmLink: function() {
-    return 'https://gitter.im/' + AppConfig.getBotName();
-  }
-};
-
-const envConfigs = {
-
-  // replace this with your own ID
-  YOUR_GITHUB_ID: {
-    botname: 'YOUR_GITHUB_ID',
-    appHost: 'http://localhost:7000',
-    apiServer: 'freecodecamp.com',
-    appRedirectUrl: 'http://localhost:7891/login/callback'
-  },
-
-  demobot: {
-    botname: 'demobot',
-    appHost: 'http://localhost:7000',
-    apiServer: 'www.freecodecamp.com',
-    appRedirectUrl: 'http://localhost:7891/login/callback'
-  },
-
-  test: {
-    botname: 'bothelp',
-    appHost: 'http://localhost:7000',
-    apiServer: 'www.freecodecamp.com',
-    appRedirectUrl: 'http://localhost:7891/login/callback'
-  },
-
-  local: {
-    botname: 'bothelp',
-    appHost: 'http://localhost:7000',
-    apiServer: 'www.freecodecamp.com',
-    appRedirectUrl: 'http://localhost:7891/login/callback'
-  },
-  beta: {
-    botname: 'bothelp',
-    appHost: 'http://localhost:7000',
-    apiServer: 'beta.freecodecamp.com',
-    appRedirectUrl: 'http://localhost:7891/login/callback'
-  },
-  prod: {
-    botname: 'camperbot',
-    appHost: 'http://bot.freecodecamp.com',
-    apiServer: 'www.freecodecamp.com',
-    appRedirectUrl: 'http://bot.freecodecamp.com/login/callback'
-  }
-};
-
-AppConfig.init();
-
-module.exports = AppConfig;
diff --git a/nap/config/Settings.js b/nap/config/Settings.js
deleted file mode 100644
index abb0776..0000000
--- a/nap/config/Settings.js
+++ /dev/null
@@ -1,7 +0,0 @@
-'use strict';
-
-const Settings = {
-  MAX_WIKI_LINES: 10
-};
-
-module.exports = Settings;
diff --git a/nap/data/RoomData.js b/nap/data/RoomData.js
deleted file mode 100644
index 6443321..0000000
--- a/nap/data/RoomData.js
+++ /dev/null
@@ -1,231 +0,0 @@
-'use strict';
-
-// This file needs to be edited to comment out
-// rooms you want to join
-
-// TODO - move to lib/ dir?
-
-const AppConfig = require('../config/AppConfig');
-
-// from the webapp
-// users enter the rooms with a topic=XXX url
-// we find a matching room here with that topic
-// and redirect them
-
-// TODO - read this from the JSON file
-const bonfireTopics = [
-  'bonfires',
-  'Pair Program on Bonfires',
-  'Meet Bonfire',
-  'Reverse a String',
-  'Factorialize a Number',
-  'Check for Palindromes',
-  'Find the Longest Word in a String',
-  'Title Case a Sentence',
-  'Return Largest Numbers in Arrays',
-  'Confirm the Ending',
-  'Repeat a string repeat a string',
-  'Truncate a string',
-  'Chunky Monkey',
-  'Slasher Flick',
-  'Mutations',
-  'Falsey Bouncer',
-  'Where art thou',
-  'Seek and Destroy',
-  'Where do I belong',
-  'Sum All Numbers in a Range',
-  'Diff Two Arrays',
-  'Roman Numeral Converter',
-  'Search and Replace',
-  'Pig Latin',
-  'DNA Pairing',
-  'Missing letters',
-  'Boo who',
-  'Sorted Union',
-  'Convert HTML Entities',
-  'Spinal Tap Case',
-  'Sum All Odd Fibonacci Numbers',
-  'Sum All Primes',
-  'Smallest Common Multiple',
-  'Finders Keepers',
-  'Drop it',
-  'Steamroller',
-  'Binary Agents',
-  'Everything Be True',
-  'Arguments Optional'
-];
-
-const bonfireDashedNames = [
-  'bonfire-meet-bonfire',
-  'bonfire-reverse-a-string',
-  'bonfire-factorialize-a-number',
-  'bonfire-check-for-palindromes',
-  'bonfire-find-the-longest-word-in-a-string',
-  'bonfire-title-case-a-sentence',
-  'bonfire-return-largest-numbers-in-arrays',
-  'bonfire-confirm-the-ending',
-  'bonfire-repeat-a-string-repeat-a-string',
-  'bonfire-truncate-a-string',
-  'bonfire-chunky-monkey',
-  'bonfire-slasher-flick',
-  'bonfire-mutations',
-  'bonfire-falsey-bouncer',
-  'bonfire-where-art-thou',
-  'bonfire-seek-and-destroy',
-  'bonfire-where-do-i-belong',
-  'bonfire-sum-all-numbers-in-a-range',
-  'bonfire-diff-two-arrays',
-  'bonfire-roman-numeral-converter',
-  'bonfire-search-and-replace',
-  'bonfire-pig-latin',
-  'bonfire-dna-pairing',
-  'bonfire-missing-letters',
-  'bonfire-boo-who',
-  'bonfire-sorted-union',
-  'bonfire-convert-html-entities',
-  'bonfire-spinal-tap-case',
-  'bonfire-sum-all-odd-fibonacci-numbers',
-  'bonfire-sum-all-primes',
-  'bonfire-smallest-common-multiple',
-  'bonfire-finders-keepers',
-  'bonfire-drop-it',
-  'bonfire-steamroller',
-  'bonfire-binary-agents',
-  'bonfire-everything-be-true',
-  'bonfire-arguments-optional',
-  'bonfire-make-a-person',
-  'bonfire-map-the-debris',
-  'bonfire-pairwise',
-  'bonfire-validate-us-telephone-numbers',
-  'bonfire-symmetric-difference',
-  'bonfire-exact-change',
-  'bonfire-inventory-update',
-  'bonfire-no-repeats-please',
-  'bonfire-friendly-date-ranges'
-];
-
-var camperBotChatRooms = [
-    'FreeCodeCamp/admin',
-    'FreeCodeCamp/camperbot',
-    'FreeCodeCamp/camperbotPlayground',
-    'FreeCodeCamp/Casual',
-    'FreeCodeCamp/CodeReview',
-    'FreeCodeCamp/CodingJobs',
-    'FreeCodeCamp/CurriculumDevelopment',
-    'FreeCodeCamp/DataScience',
-    'FreeCodeCamp/FreeCodeCamp',
-    'FreeCodeCamp/HalfWayClub',
-    'FreeCodeCamp/Help',
-    'FreeCodeCamp/HelpBasejumps',
-    'FreeCodeCamp/HelpBonfires',
-    'FreeCodeCamp/HelpContributors',
-    'FreeCodeCamp/HelpZiplines',
-    'FreeCodeCamp/LiveCoding',
-    'FreeCodeCamp/PairProgrammingWomen',
-    'FreeCodeCamp/Wiki',
-    'FreeCodeCamp/YouCanDoThis'
-];
-
-// @TODO Refactor into a room generator function
-const camperBotRooms = [camperBotChatRooms]
-  .reduce((rooms, currRooms) => rooms.concat(currRooms))
-  .map(room => { return {name: room}; });
-
-const BotRoomData = {
-  // this controls which rooms you can access
-  YOUR_GITHUB_ID: [
-    // change this to be a room your user is already in
-    {
-      title: 'bothelp',
-      name: 'YOUR_GITHUB_ID/testing',
-      icon: 'question',
-      topics: ['chitchat', 'bots', 'bot-development', 'camperbot']
-    },
-    {
-      title: 'bothelp',
-      name: 'bothelp/testing',
-      icon: 'question',
-      topics: ['chitchat', 'bots', 'bot-development', 'camperbot']
-    }
-  ],
-  // this is the demobot that ships with the app
-  demobot: [{
-    title: 'demobot',
-    name: 'demobot/test',
-    icon: 'star',
-    topics: ['getting started']
-  }],
-  // developer bot
-  bothelp: [
-    {
-      title: 'bothelp',
-      name: 'bothelp/testing',
-      icon: 'question',
-      topics: ['chitchat', 'bots', 'bot-development', 'camperbot']
-    },
-    {
-      title: 'HelpBonfires',
-      icon: 'fire',
-      name: 'bothelp/HelpBonfires',
-      topics: bonfireTopics
-    },
-    {
-      title: 'camperbot/localdev',
-      name: 'camperbot/localdev'
-    },
-    {
-      title: 'bothelpDM',
-      name: 'bothelp'
-    },
-    {
-      title: 'GeneralChat',
-      name: 'bothelp/GeneralChat'
-    },
-    {
-      title: 'PrivateRoomTest',
-      name: 'bothelp/PrivateRoomTest',
-      topics: ['general', 'intros']
-    },
-    {
-      title: 'EdaanDemo',
-      name: 'egetzel/demo',
-      topics: ['egdemo']
-    },
-    // Bonfire single rooms
-    {
-      name: 'bothelp/bonfire-factorialize-a-number',
-      topics: ['bonfire factorialize a number'],
-      isBonfire: true
-    }
-  ],
-  camperbot: camperBotRooms
-};
-
-bonfireDashedNames.map(bfName => {
-  const room = {
-    name: 'camperbot/' + bfName,
-    isBonfire: true
-  };
-  BotRoomData.camperbot.push(room);
-});
-
-BotRoomData.camperbot.map(room => {
-  room.title = room.title || room.name.split('/')[1];
-  if (room.isBonfire) {
-    room.entry = 'camperbot/testing';
-    room.topic = room.title;
-  }
-});
-
-const RoomData = {
-  rooms: function(botname) {
-    botname = botname || AppConfig.getBotName();
-    return BotRoomData[botname];
-  },
-
-  defaultRoom: function() {
-    return RoomData.rooms().rooms[0];
-  }
-};
-
-module.exports = RoomData;
diff --git a/nap/data/fcc.wiki b/nap/data/fcc.wiki
deleted file mode 160000
index 85ff415..0000000
--- a/nap/data/fcc.wiki
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 85ff415adb93209458fd284c176da3221e5253f7
diff --git a/nap/data/kbase.wiki b/nap/data/kbase.wiki
deleted file mode 160000
index d3213fe..0000000
--- a/nap/data/kbase.wiki
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit d3213fef3e9b5b3ce9d7bb63c0b4f76aa9edd30f
diff --git a/nap/data/rooms/RoomMessages.js b/nap/data/rooms/RoomMessages.js
deleted file mode 100644
index 2fbc9bd..0000000
--- a/nap/data/rooms/RoomMessages.js
+++ /dev/null
@@ -1,107 +0,0 @@
-'use strict';
-
-// the users input is scanned for these keywords
-// and can trigger the messages below
-// chance controls the frequency the result will be echoed back by the camper
-
-// using js rather than json so we can have functions and comments
-
-const BotCommands = require('../../lib/bot/BotCommands'),
-      _ = require('lodash'),
-      Utils = require('../../lib/utils/Utils');
-
-
-// TODO - add these to all of the rooms
-// this is easier for people to add content to
-// as they don't have to add to two lists
-const AllRoomMessages = [
-  {
-    regex: /.*help.*bonfire:?s?/i,
-    text: ' > type `bonfire name` to get some info on that bonfire. ' +
-          'And check [HelpBonfires chatroom]' +
-          '(https://gitter.im/FreeCodeCamp/HelpBonfires)',
-    not: 'freecodecamp/HelpBonfires'
-  },
-
-  {
-    regex: /botx/i,
-    text: '> you called?'
-  },
-
-  {
-    regex: /\btroll\b/i,
-    text: '> :trollface: troll problems? [notify admins here]' +
-          '(https://gitter.im/freecodecamp/admins)'
-  },
-  {
-    regex: /allyourbase/,
-    text: '![all your base]' +
-          '(https://files.gitter.im/FreeCodeCamp/CoreTeam/Bw51/imgres.jpg)'
-  },
-  {
-    regex: /'''/,
-    text: '> :bulb: to format code use backticks! ``` [more info]' +
-          '(https://github.com/freecodecamp/freecodecamp/wiki/code-formatting)'
-  },
-  {
-    regex: /holler/i,
-    text: '> holler back!',
-    // only say this 50% of the time
-    chance: 1
-  },
-  {
-    regex: /\bth?a?n?[xk]s?q?\b/gim,
-    func: BotCommands.thanks
-  }
-];
-
-const RoomMessages = {
-  scanInput: function(input, roomName, chance) {
-    if (Math.random() > chance) {
-       // dont always reply
-      return null;
-    }
-    const chat = input.message.model.text.toLowerCase();
-    chance = chance || 1;
-    roomName = roomName.toLowerCase();
-
-    // some messages are only for certain rooms so exclude them here
-    const thisRoomMessages = AllRoomMessages.filter(msg => {
-      if (msg.not) {
-        return (msg.not !== roomName);
-      } else {
-        return true;
-      }
-    });
-    if (!thisRoomMessages) { return false; }
-
-    const msgList = thisRoomMessages.filter(item => {
-      if (!item) { return null; }
-
-      if (item.regex) {
-        var flag = item.regex.test(chat);
-      }
-
-      if (flag) {
-        Utils.clog(chat, item.word, 'flag:' + flag);
-      }
-      return flag;
-    });
-
-    // now check if chance is high enough
-    if (msgList.length > 0) {
-      // if we have multiple messages, make sure to choose just one
-      const oneMessage = _.sample(msgList);
-      // check if the chance is high enough so we can have % of time messages
-      chance = oneMessage.chance || 1;
-      if (Math.random() < (chance)) {
-        // we have a winner!
-        return oneMessage;
-      }
-    } else {
-      return null;
-    }
-  }
-};
-
-module.exports = RoomMessages;
diff --git a/nap/data/seed/bonfireMDNlinks.js b/nap/data/seed/bonfireMDNlinks.js
deleted file mode 100644
index e367a71..0000000
--- a/nap/data/seed/bonfireMDNlinks.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/* eslint-disable */
-// Copied from
-// https://github.com/FreeCodeCamp/freecodecamp/blob/staging/seed/bonfireMDNlinks.js
-
-// MDN Links
-
-/* These links are for Bonfires. Each key/value pair is used to render a Bonfire with appropriate links.
-
-
- The text of the key is what the link text will be, e.g. <a href="https://developer ...">Global Array Object</a>
- General convention is to use the page title of the MDN reference page.
- */
-var links = {
-  // ========= NON MDN REFS
-  "Currying": "https://leanpub.com/javascript-allonge/read#pabc",
-  "Smallest Common Multiple": "https://www.mathsisfun.com/least-common-multiple.html",
-  "Permutations": "https://www.mathsisfun.com/combinatorics/combinations-permutations.html",
-  "HTML Entities": "http://dev.w3.org/html5/html-author/charref",
-  "Symmetric Difference": "https://www.youtube.com/watch?v=PxffSUQRkG4",
-
-  // ========= GLOBAL OBJECTS
-  "Global Array Object": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array",
-  "Global Object": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object",
-  "Global String Object": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String",
-  "Boolean Objects": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean",
-  "RegExp": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp",
-  "Global Function Object": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function",
-  "Arguments object": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments",
-  "Closures": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures",
-
-  // ========= GLOBAL OBJECT METHODS
-  "parseInt()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt",
-
-  // =========  PROPERTIES/MISC
-  "String.length": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length",
-
-  // ========== OBJECT METHODS
-  "Object.getOwnPropertyNames()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames",
-  "Object.keys()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys",
-  "Object.hasOwnProperty()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty",
-
-  // ======== STRING METHODS
-  "String.charAt()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt",
-  "String.charCodeAt()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt",
-  "String.concat()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/concat",
-  "String.indexOf()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf",
-  "String.fromCharCode()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode",
-  "String.lastIndexOf()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf",
-  "String.match()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match",
-  "String.replace()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace",
-  "String.slice()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice",
-  "String.split()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split",
-  "String.substring()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring",
-  "String.substr()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr",
-  "String.toLowerCase()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLowerCase",
-  "String.toString()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toString",
-  "String.toUpperCase()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase",
-
-  // ======== ARRAY METHODS
-  "Array.concat()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat",
-  "Array.every()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every",
-  "Array.filter()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter",
-  "Array.forEach()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach",
-  "Array.indexOf()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf",
-  "Array.isArray()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray",
-  "Array.join()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join",
-  "Array.lastIndexOf()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/lastIndexOf",
-  "Array.map()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map",
-  "Array.pop()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/pop",
-  "Array.push()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push",
-  "Array.reduce()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce",
-  "Array.reverse()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse",
-  "Array.shift()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift",
-  "Array.slice()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice",
-  "Array.some()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some",
-  "Array.sort()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort",
-  "Array.splice()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice",
-  "Array.toString()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toString",
-
-  // ======== MATH METHODS
-  "Math.max()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max",
-  "Math.min()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min",
-  "Math.pow()": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow",
-  "Remainder": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Remainder_(.25)",
-
-  // ======== GENERAL JAVASCRIPT REFERENCES
-  "Arithmetic Operators": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators",
-  "Comparison Operators": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators",
-  "Details of the Object Model": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model",
-  "For Loops": "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for"
-};
-
-module.exports = links;
diff --git a/nap/data/seed/challenges/advanced-bonfires.json b/nap/data/seed/challenges/advanced-bonfires.json
deleted file mode 100644
index c071bfb..0000000
--- a/nap/data/seed/challenges/advanced-bonfires.json
+++ /dev/null
@@ -1,139 +0,0 @@
-{
-  "name": "Advanced Algorithm Scripting",
-  "order": 0.011,
-  "challenges": [
-    {
-      "id": "a2f1d72d9b908d0bd72bb9f6",
-      "name": "Bonfire: Make a Person",
-      "dashedName": "bonfire-make-a-person",
-      "difficulty": "3.01",
-      "description": [
-        "Fill in the object constructor with the methods specified in the tests.",
-        "Those methods are getFirstName(), getLastName(), getFullName(), setFirstName(first), setLastName(last), and setFullName(firstAndLast).",
-        "All functions that take an argument have an arity of 1, and the argument will be a string.",
-        "These methods must be the only available means for interacting with the object.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "var Person = function(firstAndLast) {",
-        "    return firstAndLast;",
-        "};",
-        "",
-        "var bob = new Person('Bob Ross');",
-        "bob.getFullName();"
-      ],
-      "tests": [
-        "expect(Object.keys(bob).length).to.eql(6);",
-        "expect(bob instanceof Person).to.be.true;",
-        "expect(bob.firstName).to.be.undefined();",
-        "expect(bob.lastName).to.be.undefined();",
-        "expect(bob.getFirstName()).to.eql('Bob');",
-        "expect(bob.getLastName()).to.eql('Ross');",
-        "expect(bob.getFullName()).to.eql('Bob Ross');",
-        "bob.setFirstName('Happy');",
-        "expect(bob.getFirstName()).to.eql('Happy');",
-        "bob.setLastName('Trees');",
-        "expect(bob.getLastName()).to.eql('Trees');",
-        "bob.setFullName('George Carlin');",
-        "expect(bob.getFullName()).to.eql('George Carlin');",
-        "bob.setFullName('Bob Ross');"
-      ],
-      "MDNlinks": [
-        "Closures",
-        "Details of the Object Model"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "af4afb223120f7348cdfc9fd",
-      "name": "Bonfire: Map the Debris",
-      "dashedName": "bonfire-map-the-debris",
-      "difficulty": "3.02",
-      "description": [
-        "Return a new array that transforms the element's average altitude into their orbital periods.",
-        "The array will contain objects in the format <code>{name: 'name', avgAlt: avgAlt}</code>.",
-        "You can read about orbital periods <a href=\"http://en.wikipedia.org/wiki/Orbital_period\" target='_blank'>on wikipedia</a>.",
-        "The values should be rounded to the nearest whole number. The body being orbited is Earth.",
-        "The radius of the earth is 6367.4447 kilometers, and the GM value of earth is 398600.4418",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function orbitalPeriod(arr) {",
-        "  var GM = 398600.4418;",
-        "  var earthRadius = 6367.4447;",
-        "  return arr;",
-        "}",
-        "",
-        "orbitalPeriod([{name : \"sputnik\", avgAlt : 35873.5553}]);"
-      ],
-      "tests": [
-        "expect(orbitalPeriod([{name : \"sputnik\", avgAlt : 35873.5553}])).to.eqls([{name: \"sputnik\", orbitalPeriod: 86400}]);",
-        "expect(orbitalPeriod([{name: \"iss\", avgAlt: 413.6}, {name: \"hubble\", avgAlt: 556.7}, {name: \"moon\", avgAlt: 378632.553}])).to.eqls([{name : \"iss\", orbitalPeriod: 5557}, {name: \"hubble\", orbitalPeriod: 5734}, {name: \"moon\", orbitalPeriod: 2377399}]);"
-      ],
-      "MDNlinks": [
-        "Math.pow()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a3f503de51cfab748ff001aa",
-      "name": "Bonfire: Pairwise",
-      "dashedName": "bonfire-pairwise",
-      "difficulty": "3.03",
-      "description": [
-        "Return the sum of all indices of elements of 'arr' that can be paired with one other element to form a sum that equals the value in the second argument 'arg'. If multiple sums are possible, return the smallest sum. Once an element has been used, it cannot be reused to pair with another.",
-        "For example, pairwise([1, 4, 2, 3, 0, 5], 7) should return 11 because 4, 2, 3 and 5 can be paired with each other to equal 7.",
-        "pairwise([1, 3, 2, 4], 4) would only equal 1, because only the first two elements can be paired to equal 4, and the first element has an index of 0!",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function pairwise(arr, arg) {",
-        "  return arg;",
-        "}",
-        "",
-        "pairwise([1,4,2,3,0,5], 7);"
-      ],
-      "tests": [
-        "expect(pairwise([1, 4, 2, 3, 0, 5], 7)).to.equal(11);",
-        "expect(pairwise([1, 3, 2, 4], 4)).to.equal(1);",
-        "expect(pairwise([1,1,1], 2)).to.equal(1);",
-        "expect(pairwise([0, 0, 0, 0, 1, 1], 1)).to.equal(10);",
-        "expect(pairwise([], 100)).to.equal(0);"
-      ],
-      "MDNlinks": [
-        "Array.reduce()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    }
-  ]
-}
diff --git a/nap/data/seed/challenges/basejumps.json b/nap/data/seed/challenges/basejumps.json
deleted file mode 100644
index 137e679..0000000
--- a/nap/data/seed/challenges/basejumps.json
+++ /dev/null
@@ -1,240 +0,0 @@
-{
-  "name": "Full Stack JavaScript Projects",
-  "order": 0.019,
-  "challenges": [
-    {
-      "id": "bd7158d8c443eddfaeb5bcef",
-      "name": "Waypoint: Get Set for Basejumps",
-      "dashedName": "waypoint-get-set-for-basejumps",
-      "difficulty": 2.00,
-      "challengeSeed": ["128451852"],
-      "description": [
-        "<span class='text-info'>Objective:</span> Get the MEAN stack running on Cloud 9, push your code to GitHub, and deploy it to Heroku.",
-        "We'll build our Basejumps on Cloud 9, a powerful online code editor with a full Ubuntu Linux workspace, all running in the cloud.",
-        "If you don't already have Cloud 9 account, create one now at <a href='http://c9.io' target='_blank'>http://c9.io</a>.",
-        "Now let's get your development environment ready for a new Angular-Fullstack application provided by Yeoman.",
-        "Open up <a href='http://c9.io' target='_blank'>http://c9.io</a> and sign in to your account.",
-        "Click on Create New Workspace at the top right of the c9.io page, then click on the \"Create a new workspace\" popup that appears below it the button after you click on it.",
-        "Give your workspace a name.",
-        "Choose Node.js in the selection area below the name field.",
-        "Click the Create button. Then click into your new workspace.",
-        "In the lower right hand corner you should see a terminal window. In this window use the following commands. You don't need to know what these mean at this point.",
-        "Never run this command on your local machine. But in your Cloud 9 terminal window, run: <code>rm -rf * && echo \"export NODE_PATH=$NODE_PATH:/home/ubuntu/.nvm/v0.10.35/lib/node_modules\" >> ~/.bashrc && source ~/.bashrc && npm install -g yo grunt grunt-cli generator-angular-fullstack && yo angular-fullstack</code>",
-        "Yeoman will prompt you to answer some questions. Answer them like this:",
-        "What would you like to write scripts with? <span class='text-success'>JavaScript</span>",
-        "What would you like to write markup with? <span class='text-success'>HTML</span>",
-        "What would you like to write stylesheets with? <span class='text-success'>CSS</span>",
-        "What Angular router would you like to use? <span class='text-success'>ngRoute</span>",
-        "Would you like to include Bootstrap? <span class='text-success'>Yes</span>",
-        "Would you like to include UI Bootstrap? <span class='text-success'>Yes</span>",
-        "Would you like to use MongoDB with Mongoose for data modeling? <span class='text-success'>Yes</span>",
-        "Would you scaffold out an authentication boilerplate? <span class='text-success'>Yes</span>",
-        "Would you like to include additional oAuth strategies? <span class='text-success'>Twitter</span>",
-        "Would you like to use socket.io? <span class='text-success'>No</span>",
-        "May bower anonymously report usage statistics to improve the tool over time? (Y/n) <span class='text-success'>Y</span>",
-        "You may get an error similar to <code> ERR! EEXIST, open ‘/home/ubuntu/.npm</code>. This is caused when Cloud9 runs out of memory and kills an install. If you get this, simply re-run this process with the command <code>yo angular-fullstack</code>. You will then be asked a few questions regarding the re-install. Answer them as follows:",
-        "Existing .yo-rc configuration found, would you like to use it? (Y/n) <span class='text-success'>Y</span>",
-        "Overwrite client/favicon.ico? (Ynaxdh) <span class='text-success'>Y</span>",
-        "To finish the installation run the commands: <code>bower install && npm install</code>",
-        "To start MongoDB, run the following commands in your terminal: <code>mkdir data && echo 'mongod --bind_ip=$IP --dbpath=data --nojournal --rest \"$@\"' > mongod && chmod a+x mongod && ./mongod</code>",
-        "You will want to open up a new terminal to work from by clicking on the + icon and select New Terminal",
-        "Start the application by running the following command in your new terminal window: <code>grunt serve</code>",
-        "Wait for the following message to appear: <code>xdg-open: no method available for opening 'http://localhost:8080' </code>. Now you can open the internal Cloud9 browser. To launch the browser select Preview in the toolbar then select the dropdown option Preview Running Application.",
-        "Turn the folder in which your application is running into a Git repository by running the following commands: <code>git init && git add . && git commit -am 'initial commit'</code>.",
-        "Now we need to add your GitHub SSH key to c9.io. Click the \"Add-on Services\" button in the lower left of your C9 dashboard. Click \"activate\" next to the GitHub icon.",
-        "A pop up will appear. Allow access to your account.",
-        "While still on the dashboard, under “Account Settings”, click the link for \"Show your SSH key\". Copy the key to you clipboard.",
-        "Sign in to <a href='http://github.com' target='_blank'>http://github.com</a> and navigate to the GitHub SSH settings page. Click the \"Add SSH Key\". Give your key the title \"cloud 9\". Paste your SSH Key into the \"Key\" box, then click \"Add Key\".",
-        "Create a new GitHub repository by  and clicking on the + button next to your username in the upper-right hand side of your screen, then selecting \"New Repository\".",
-        "Enter a project name, then click the \"Create Repository\" button.",
-        "Find the \"...or push an existing repository from the command line\" section and click the Copy to Clipboard button beside it.",
-        "Paste the commands from your clipboard into the Cloud9 terminal prompt. This will push your changes to your repository on Cloud 9 up to GitHub.",
-        "Check back on your GitHub profile to verify the changes were successfully pushed up to GitHub.",
-        "Now let's push your code to Heroku. If you don't already have a Heroku account, create one at <a href='http://heroku.com' target='_blank'>http://heroku.com</a>. You shouldn't be charged for anything, but you will need to add your credit card information to your Heroku before you will be able to use Heroku's free MongoLab add on.",
-        "Before you publish to Heroku, you should free up as much memory as possible on Cloud9. In each of the Cloud9 terminal prompt tabs where MongoDB and Grunt are running, press the <code>control + c</code> hotkey to shut down these processes.",
-        "Run the following command in a Cloud9 terminal prompt tab: <code>npm install grunt-contrib-imagemin --save-dev && npm install --save-dev && heroku login</code>. At this point, the terminal will prompt you to log in to Heroku from the command line.",
-        "Now run <code>yo angular-fullstack:heroku</code>. You can choose a name for your Heroku project, or Heroku will create a random one for you. You can choose whether you want to deploy to servers the US or the EU.",
-        "Set the config flag for your Heroku environment and add MongoLab for your MongoDB instance by running the following command: <code>cd ~/workspace/dist && heroku config:set NODE_ENV=production && heroku addons:create mongolab</code>.",
-        "As you build your app, you should frequently commit changes to your codebase. Make sure you're in the <code>~/workspace</code> directory by running <code>cd ~/workspace</code>. Then you can this code to stage the changes to your changes and commit them: <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a short summary of the changes you made to your code, such as \"added a records controller and corresponding routes\".",
-        "You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
-        "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
-        "Now you're ready to move on to your first Basejump. Click the \"I've completed this challenge\" and move on."
-      ],
-      "challengeType": 2,
-      "tests": []
-    },
-    {
-      "id": "bd7158d8c443eddfaeb5bdef",
-      "name": "Basejump: Build a Voting App",
-      "dashedName": "basejump-build-a-voting-app",
-      "difficulty": 2.01,
-      "challengeSeed": ["133315786"],
-      "description": [
-        "<span class='text-info'>Objective:</span> Build a full stack JavaScript app that successfully reverse-engineers this: <a href='http://votingapp.herokuapp.com/' target='_blank'>http://votingapp.herokuapp.com/</a> and deploy it to Heroku.",
-        "Note that for each Basejump, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-basejumps'>http://freecodecamp.com/challenges/get-set-for-basejumps</a>.",
-        "As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.",
-        "You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
-        "Here are the specific User Stories you should implement for this Basejump:",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can keep my polls and come back later to access them.",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can share my polls with my friends.",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can see the aggregate results of my polls.",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can delete polls that I decide I don't want anymore.",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can create a poll with any number of possible items.",
-        "<span class='text-info'>Bonus User Story:</span> As an unauthenticated user, I can see everyone's polls, but I can't vote on anything.",
-        "<span class='text-info'>Bonus User Story:</span> As an unauthenticated or authenticated user, I can see the results of polls in chart form. (This could be implemented using Chart.js or Google Charts.)",
-        "<span class='text-info'>Bonus User Story:</span> As an authenticated user, if I don't like the options on a poll, I can create a new option.",
-        "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
-        "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
-        "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
-      ],
-      "challengeType": 4,
-      "tests": [],
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "bd7158d8c443eddfaeb5bdff",
-      "name": "Basejump: Build a Nightlife Coordination App",
-      "dashedName": "basejump-build-a-nightlife-coordination-app",
-      "difficulty": 2.02,
-      "challengeSeed": ["133315781"],
-      "description": [
-        "<span class='text-info'>Objective:</span> Build a full stack JavaScript app that successfully reverse-engineers this: <a href='http://whatsgoinontonight.herokuapp.com/' target='_blank'>http://whatsgoinontonight.herokuapp.com/</a> and deploy it to Heroku.",
-        "Note that for each Basejump, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-basejumps'>http://freecodecamp.com/challenges/get-set-for-basejumps</a>.",
-        "As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.",
-        "You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
-        "Here are the specific User Stories you should implement for this Basejump:",
-        "<span class='text-info'>User Story:</span> As an unauthenticated user, I can view all bars in my area.",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can add myself to a bar to indicate I am going there tonight.",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can remove myself from a bar if I no longer want to go there.",
-        "<span class='text-info'>Bonus User Story:</span> As an unauthenticated user, when I login I should not have to search again.",
-        "<span class='text-info'>Hint:</span> Try using the <a href='https://www.yelp.com/developers/documentation/v2/overview' target='_blank'>Yelp API</a> to find venues in the cities your users search for.",
-        "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
-        "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
-        "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
-      ],
-      "challengeType": 4,
-      "tests": [],
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "bd7158d8c443eddfaeb5bd0e",
-      "name": "Basejump: Chart the Stock Market",
-      "dashedName": "basejump-chart-the-stock-market",
-      "difficulty": 2.03,
-      "challengeSeed": ["133315787"],
-      "description": [
-        "<span class='text-info'>Objective:</span> Build a full stack JavaScript app that successfully reverse-engineers this: <a href='http://stockstream.herokuapp.com/' target='_blank'>http://stockstream.herokuapp.com/</a> and deploy it to Heroku.",
-        "Note that for each Basejump, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-basejumps'>http://freecodecamp.com/challenges/get-set-for-basejumps</a>.",
-        "As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.",
-        "You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
-        "Here are the specific User Stories you should implement for this Basejump:",
-        "<span class='text-info'>User Story:</span> As a user, I can view a graph displaying the recent trend lines for each added stock.",
-        "<span class='text-info'>User Story:</span> As a user, I can add new stocks by their symbol name.",
-        "<span class='text-info'>User Story:</span> As a user, I can remove stocks.",
-        "<span class='text-info'>Bonus User Story:</span> As a user, I can see changes in real-time when any other user adds or removes a stock.",
-        "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
-        "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
-        "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
-      ],
-      "challengeType": 4,
-      "tests": [],
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "bd7158d8c443eddfaeb5bd0f",
-      "name": "Basejump: Manage a Book Trading Club",
-      "dashedName": "basejump-manage-a-book-trading-club",
-      "difficulty": 2.04,
-      "challengeSeed": ["133316032"],
-      "description": [
-        "<span class='text-info'>Objective:</span> Build a full stack JavaScript app that successfully reverse-engineers this: <a href='http://bookjump.herokuapp.com/' target='_blank'>http://bookjump.herokuapp.com/</a> and deploy it to Heroku.",
-        "Note that for each Basejump, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-basejumps'>http://freecodecamp.com/challenges/get-set-for-basejumps</a>.",
-        "As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.",
-        "You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
-        "Here are the specific User Stories you should implement for this Basejump:",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can view all books posted by every user.",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can add a new book.",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can update my settings to store my full name, city, and state.",
-        "<span class='text-info'>Bonus User Story:</span> As an authenticated user, I can propose a trade and wait for the other user to accept the trade.",
-        "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
-        "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
-        "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
-      ],
-      "challengeType": 4,
-      "tests": [],
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "bd7158d8c443eddfaeb5bdee",
-      "name": "Basejump: Build a Pinterest Clone",
-      "dashedName": "basejump-build-a-pinterest-clone",
-      "difficulty": 2.05,
-      "challengeSeed": ["133315784"],
-      "description": [
-        "<span class='text-info'>Objective:</span> Build a full stack JavaScript app that successfully reverse-engineers this: <a href='http://stark-lowlands-3680.herokuapp.com/' target='_blank'>http://stark-lowlands-3680.herokuapp.com/</a> and deploy it to Heroku.",
-        "Note that for each Basejump, you should create a new GitHub repository and a new Heroku project. If you can't remember how to do this, revisit <a href='/challenges/get-set-for-basejumps'>http://freecodecamp.com/challenges/get-set-for-basejumps</a>.",
-        "As you build your app, you should frequently commit changes to your codebase. You can do this by running <code>git commit -am \"your commit message\"</code>. Note that you should replace \"your commit message\" with a brief summary of the changes you made to your code.",
-        "You can push these new commits to GitHub by running <code>git push origin master</code>, and to Heroku by running <code>grunt --force && grunt buildcontrol:heroku</code>.",
-        "Here are the specific User Stories you should implement for this Basejump:",
-        "<span class='text-info'>User Story:</span> As an unauthenticated user, I can login with Twitter.",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can link to images.",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can delete images that I've linked to.",
-        "<span class='text-info'>User Story:</span> As an authenticated user, I can see a Pinterest-style wall of all the images I've linked to.",
-        "<span class='text-info'>User Story:</span> As an unauthenticated user, I can browse other users' walls of images.",
-        "<span class='text-info'>Bonus User Story:</span> As an authenticated user, if I upload an image that is broken, it will be replaced by a placeholder image. (can use jQuery broken image detection)",
-        "<span class='text-info'>Hint:</span> <a href='http://masonry.desandro.com/' target='_blank'>Masonry.js</a> is a library that allows for Pinterest-style image grids.",
-        "If you need further guidance on using Yeoman Angular-Fullstack Generator, check out: <a href='https://github.com/clnhll/guidetobasejumps' target='_blank'>https://github.com/clnhll/guidetobasejumps</a>.",
-        "Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your GitHub repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
-        "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
-      ],
-      "challengeType": 4,
-      "tests": [],
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    }
-  ]
-}
diff --git a/nap/data/seed/challenges/basic-bonfires.json b/nap/data/seed/challenges/basic-bonfires.json
deleted file mode 100644
index 767b1e8..0000000
--- a/nap/data/seed/challenges/basic-bonfires.json
+++ /dev/null
@@ -1,1529 +0,0 @@
-{
-  "name": "Basic Algorithm Scripting",
-  "order": 0.007,
-  "challenges": [
-    {
-      "id": "bd7139d8c441eddfaeb5bdef",
-      "name": "Waypoint: Pair Program on Bonfires",
-      "dashedName": "waypoint-pair-program-on-bonfires",
-      "difficulty": 0.44,
-      "challengeSeed": ["119657641"],
-      "description": [
-        "Please note that the video for this challenge is a little outdated, and doesn't perfectly match these steps. We plan to record a new video soon.",
-        "OK, we're finally ready to start pair programming!",
-        "Pair Programming is where two people code together on the same computer. It is an efficient way to collaborate, and widely practiced at software companies. Pair Programming is one of the core concepts of \"Agile\" Software Development, which you will hear more about later.",
-        "Many people use Skype or Google Hangouts to pair program, but if you talk with professional software engineers, they will tell you that it's not really pair programming unless both people have the ability to use the keyboard and mouse.",
-        "The most popular tool for pair programming is Screenhero. You can download Screenhero for <a href='http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjowLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLnppcD9zb3VyY2U9d2ViIn0=' target='_blank'>Mac</a> or <a href='http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjoxLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLXNldHVwLmV4ZSJ9' target='_blank'>Windows</a>. Create your new user account from within the app.",
-        "We have a special chat room for people ready to pair program. Go to our <a href='//gitter.im/FreeCodeCamp/LetsPair' target='_blank'>LetsPair chatroom on Gitter</a> and type \"Hello Pair Programmers!\"",
-        "If someone is available, they will be your \"pair\" - the person you pair programming with.",
-        "If no one gets back to you in the first few minutes, don't worry. There will be lots of opportunities to pair program in the future.",
-        "If someone does get back to you, private message them and ask for the email address they used to register Screenhero.",
-        "Add them as a new contact in Screenhero, then click the monitor-looking button to attempt to share your screen with them.",
-        "Once the Screenhero session starts, your screen's margins will glow orange. You are now sharing your screen.",
-        "Your pair will have their own cursor, and will be able to type text on his or her keyboard.",
-        "Now it's time to tackle our Bonfires. You can begin them by advancing to the next challenge.",
-        "Once you you finish pair programming, end the session in Screenhero session.",
-        "Congratulations! You have completed your first pair programming session.",
-        "Pair program as much as possible with different campers until you've completed all the Bonfire challenges. This is a big time investment, but the JavaScript practice you get will be well worth it!",
-        "Mark this Waypoint complete and move on."
-      ],
-      "challengeType": 2,
-      "tests": [],
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "ad7123c8c441eddfaeb5bdef",
-      "name": "Bonfire: Meet Bonfire",
-      "dashedName": "bonfire-meet-bonfire",
-      "difficulty": "0",
-      "description": [
-        "Your goal is to fix the failing test.",
-        "First, run all the tests by clicking \"Run code\" or by pressing Control + Enter.",
-        "The failing test is in red. Fix the code so that all tests pass. Then you can move on to the next Bonfire.",
-        "Make this function return true no matter what."
-      ],
-      "tests": [
-        "expect(meetBonfire()).to.be.a(\"boolean\");",
-        "expect(meetBonfire()).to.be.true;"
-      ],
-      "challengeSeed": [
-        "function meetBonfire(argument) {",
-        "  // Good luck!",
-        "  console.log(\"you can read this function's argument in the developer tools\", argument);",
-        "",
-        "  return false;",
-        "}",
-        "",
-        "",
-        "",
-        "meetBonfire(\"You can do this!\");"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a202eed8fc186c8434cb6d61",
-      "name": "Bonfire: Reverse a String",
-      "dashedName": "bonfire-reverse-a-string",
-      "difficulty": "1.01",
-      "tests": [
-        "expect(reverseString('hello')).to.be.a('String');",
-        "expect(reverseString('hello')).to.equal('olleh');",
-        "expect(reverseString('Howdy')).to.equal('ydwoH');",
-        "expect(reverseString('Greetings from Earth')).to.equal('htraE morf sgniteerG');"
-      ],
-      "description": [
-        "Reverse the provided string.",
-        "You may need to turn the string into an array before you can reverse it.",
-        "Your result must be a string.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function reverseString(str) {",
-        "  return str;",
-        "}",
-        "",
-        "reverseString('hello');"
-      ],
-      "MDNlinks": [
-        "Global String Object",
-        "String.split()",
-        "Array.reverse()",
-        "Array.join()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a302f7aae1aa3152a5b413bc",
-      "name": "Bonfire: Factorialize a Number",
-      "dashedName": "bonfire-factorialize-a-number",
-      "tests": [
-        "expect(factorialize(5)).to.be.a(\"Number\");",
-        "expect(factorialize(5)).to.equal(120);",
-        "expect(factorialize(10)).to.equal(3628800);",
-        "expect(factorialize(20)).to.equal(2432902008176640000);"
-      ],
-      "difficulty": "1.02",
-      "description": [
-        "Return the factorial of the provided integer.",
-        "If the integer is represented with the letter n, a factorial is the product of all positive integers less than or equal to n.",
-        "Factorials are often represented with the shorthand notation n!",
-        "For example: 5! = 1 * 2 * 3 * 4 * 5 = 120f",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function factorialize(num) {",
-        "  return num;",
-        "}",
-        "",
-        "factorialize(5);"
-      ],
-      "MDNlinks": [
-        "Arithmetic Operators"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "aaa48de84e1ecc7c742e1124",
-      "name": "Bonfire: Check for Palindromes",
-      "dashedName": "bonfire-check-for-palindromes",
-      "difficulty": "1.03",
-      "description": [
-        "Return true if the given string is a palindrome. Otherwise, return false.",
-        "A palindrome is a word or sentence that's spelled the same way both forward and backward, ignoring punctuation, case, and spacing.",
-        "You'll need to remove punctuation and turn everything lower case in order to check for palindromes.",
-        "We'll pass strings with varying formats, such as \"racecar\", \"RaceCar\", and \"race CAR\" among others.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "tests": [
-        "expect(palindrome(\"eye\")).to.be.a(\"boolean\");",
-        "assert.deepEqual(palindrome(\"eye\"), true);",
-        "assert.deepEqual(palindrome(\"race car\"), true);",
-        "assert.deepEqual(palindrome(\"not a palindrome\"), false);",
-        "assert.deepEqual(palindrome(\"A man, a plan, a canal. Panama\"), true);",
-        "assert.deepEqual(palindrome(\"never odd or even\"), true);",
-        "assert.deepEqual(palindrome(\"nope\"), false);",
-        "assert.deepEqual(palindrome(\"almostomla\"), false);"
-      ],
-      "challengeSeed": [
-        "function palindrome(str) {",
-        "  // Good luck!",
-        "  return true;",
-        "}",
-        "",
-        "",
-        "",
-        "palindrome(\"eye\");"
-      ],
-      "MDNlinks": [
-        "String.replace()",
-        "String.toLowerCase()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a26cbbe9ad8655a977e1ceb5",
-      "name": "Bonfire: Find the Longest Word in a String",
-      "dashedName": "bonfire-find-the-longest-word-in-a-string",
-      "difficulty": "1.04",
-      "description": [
-        "Return the length of the longest word in the provided sentence.",
-        "Your response should be a number.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function findLongestWord(str) {",
-        "  return str.length;",
-        "}",
-        "",
-        "findLongestWord('The quick brown fox jumped over the lazy dog');"
-      ],
-      "tests": [
-        "expect(findLongestWord('The quick brown fox jumped over the lazy dog')).to.be.a('Number');",
-        "expect(findLongestWord('The quick brown fox jumped over the lazy dog')).to.equal(6);",
-        "expect(findLongestWord('May the force be with you')).to.equal(5);",
-        "expect(findLongestWord('Google do a barrel roll')).to.equal(6);",
-        "expect(findLongestWord('What is the average airspeed velocity of an unladen swallow')).to.equal(8);"
-      ],
-      "MDNlinks": [
-        "String.split()",
-        "String.length"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "ab6137d4e35944e21037b769",
-      "name": "Bonfire: Title Case a Sentence",
-      "dashedName": "bonfire-title-case-a-sentence",
-      "difficulty": "1.05",
-      "description": [
-        "Return the provided string with the first letter of each word capitalized.",
-        "For the purpose of this exercise, you should also capitalize connecting words like 'the' and 'of'.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function titleCase(str) {",
-        "  return str;",
-        "}",
-        "",
-        "titleCase(\"I'm a little tea pot\");"
-      ],
-      "tests": [
-        "expect(titleCase(\"I'm a little tea pot\")).to.be.a('String');",
-        "expect(titleCase(\"I'm a little tea pot\")).to.equal(\"I'm A Little Tea Pot\");",
-        "expect(titleCase(\"sHoRt AnD sToUt\")).to.equal(\"Short And Stout\");",
-        "expect(titleCase(\"HERE IS MY HANDLE HERE IS MY SPOUT\")).to.equal(\"Here Is My Handle Here Is My Spout\");"
-      ],
-      "MDNlinks": [
-        "String.charAt()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a789b3483989747d63b0e427",
-      "name": "Bonfire: Return Largest Numbers in Arrays",
-      "dashedName": "bonfire-return-largest-numbers-in-arrays",
-      "difficulty": "1.06",
-      "description": [
-        "Return an array consisting of the largest number from each provided sub-array. For simplicity, the provided array will contain exactly 4 sub-arrays.",
-        "Remember, you can iterate through an array with a simple for loop, and access each member with array syntax arr[i] .",
-        "If you are writing your own Chai.js tests, be sure to use a deep equal statement instead of an equal statement when comparing arrays.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function largestOfFour(arr) {",
-        "  // You can do this!",
-        "  return arr;",
-        "}",
-        "",
-        "largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);"
-      ],
-      "tests": [
-        "expect(largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]])).to.be.a('array');",
-        "(largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]])).should.eql([27,5,39,1001]);",
-        "assert(largestOfFour([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]).should.eql([9,35,97,1000000]));"
-      ],
-      "MDNlinks": [
-        "Comparison Operators"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "acda2fb1324d9b0fa741e6b5",
-      "name": "Bonfire: Confirm the Ending",
-      "dashedName": "bonfire-confirm-the-ending",
-      "difficulty": "1.07",
-      "description": [
-        "Check if a string (first argument) ends with the given target string (second argument).",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function end(str, target) {",
-        "  // \"Never give up and good luck will find you.\"",
-        "  // -- Falcor",
-        "  return str;",
-        "}",
-        "",
-        "end('Bastian', 'n');"
-      ],
-      "tests": [
-        "assert.strictEqual(end('Bastian', 'n'), true, 'should equal true if target equals end of string');",
-        "assert.strictEqual(end('Connor', 'n'), false, 'should equal false if target does not equal end of string');",
-        "assert.strictEqual(end('Walking on water and developing software from a specification are easy if both are frozen.', 'specification'), false, 'should equal false if target does not equal end of string');",
-        "assert.strictEqual(end('He has to give me a new name', 'name'), true, 'should equal true if target equals end of string');",
-        "assert.strictEqual(end('If you want to save our world, you must hurry. We dont know how much longer we can withstand the nothing', 'mountain'), false, 'should equal false if target does not equal end of string');"
-      ],
-      "MDNlinks": [
-        "String.substr()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "afcc8d540bea9ea2669306b6",
-      "name": "Bonfire: Repeat a string repeat a string",
-      "dashedName": "bonfire-repeat-a-string-repeat-a-string",
-      "difficulty": "1.08",
-      "description": [
-        "Repeat a given string (first argument) n times (second argument). Return an empty string if n is a negative number.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function repeat(str, num) {",
-        "  // repeat after me",
-        "  return str;",
-        "}",
-        "",
-        "repeat('abc', 3);"
-      ],
-      "tests": [
-        "assert.strictEqual(repeat('*', 3), '***', 'should repeat a string n times');",
-        "assert.strictEqual(repeat('abc', 3), 'abcabcabc', 'should repeat a string n times');",
-        "assert.strictEqual(repeat('abc', -2), '', 'should return an empty string for negative numbers');"
-      ],
-      "MDNlinks": [
-        "Global String Object"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "ac6993d51946422351508a41",
-      "name": "Bonfire: Truncate a string",
-      "dashedName": "bonfire-truncate-a-string",
-      "difficulty": "1.09",
-      "description": [
-        "Truncate a string (first argument) if it is longer than the given maximum string length (second argument). Return the truncated string with a '...' ending.",
-        "Note that the three dots at the end add to the string length.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function truncate(str, num) {",
-        "  // Clear out that junk in your trunk",
-        "  return str;",
-        "}",
-        "",
-        "truncate('A-tisket a-tasket A green and yellow basket', 11);"
-      ],
-      "tests": [
-        "expect(truncate('A-tisket a-tasket A green and yellow basket', 11)).to.eqls('A-tisket...');",
-        "expect(truncate('Peter Piper picked a peck of pickled peppers', 14)).to.eqls('Peter Piper...');",
-        "assert(truncate('A-tisket a-tasket A green and yellow basket', 'A-tisket a-tasket A green and yellow basket'.length) === 'A-tisket a-tasket A green and yellow basket', 'should not truncate if string is = length');",
-        "assert.strictEqual(truncate('A-tisket a-tasket A green and yellow basket', 'A-tisket a-tasket A green and yellow basket'.length + 2), 'A-tisket a-tasket A green and yellow basket', 'should not truncate if string is < length');"
-      ],
-      "MDNlinks": [
-        "String.slice()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a9bd25c716030ec90084d8a1",
-      "name": "Bonfire: Chunky Monkey",
-      "dashedName": "bonfire-chunky-monkey",
-      "difficulty": "1.10",
-      "description": [
-        "Write a function that splits an array (first argument) into groups the length of size (second argument) and returns them as a multidimensional array.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function chunk(arr, size) {",
-        "  // Break it up.",
-        "  return arr;",
-        "}",
-        "",
-        "chunk(['a', 'b', 'c', 'd'], 2);"
-      ],
-      "tests": [
-        "assert.deepEqual(chunk(['a', 'b', 'c', 'd'], 2), [['a', 'b'], ['c', 'd']], 'should return chunked arrays');",
-        "assert.deepEqual(chunk([0, 1, 2, 3, 4, 5], 3), [[0, 1, 2], [3, 4, 5]], 'should return chunked arrays');",
-        "assert.deepEqual(chunk([0, 1, 2, 3, 4, 5], 2), [[0, 1], [2, 3], [4, 5]], 'should return chunked arrays');",
-        "assert.deepEqual(chunk([0, 1, 2, 3, 4, 5], 4), [[0, 1, 2, 3], [4, 5]], 'should return the last chunk as remaining elements');"
-      ],
-      "MDNlinks": [
-        "Array.push()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "ab31c21b530c0dafa9e241ee",
-      "name": "Bonfire: Slasher Flick",
-      "dashedName": "bonfire-slasher-flick",
-      "difficulty": "1.11",
-      "description": [
-        "Return the remaining elements of an array after chopping off n elements from the head.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function slasher(arr, howMany) {",
-        "  // it doesn't always pay to be first",
-        "  return arr;",
-        "}",
-        "",
-        "slasher([1, 2, 3], 2);"
-      ],
-      "tests": [
-        "assert.deepEqual(slasher([1, 2, 3], 2), [3], 'should drop the first two elements');",
-        "assert.deepEqual(slasher([1, 2, 3], 0), [1, 2, 3], 'should return all elements when n < 1');",
-        "assert.deepEqual(slasher([1, 2, 3], 9), [], 'should return an empty array when n >= array.length');"
-      ],
-      "MDNlinks": [
-        "Array.slice()",
-        "Array.splice()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "af2170cad53daa0770fabdea",
-      "name": "Bonfire: Mutations",
-      "dashedName": "bonfire-mutations",
-      "difficulty": "1.12",
-      "description": [
-        "Return true if the string in the first element of the array contains all of the letters of the string in the second element of the array.",
-        "For example, ['hello', 'Hello'], should return true because all of the letters in the second string are present in the first, ignoring case.",
-        "The arguments ['hello', 'hey'] should return false because the string 'hello' does not contain a 'y'.",
-        "Lastly, ['Alien', 'line'], should return true because all of the letters in 'line' are present in 'Alien'.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function mutation(arr) {",
-        "  return arr;",
-        "}",
-        "",
-        "mutation(['hello', 'hey']);"
-      ],
-      "tests": [
-        "expect(mutation(['hello', 'hey'])).to.be.false;",
-        "expect(mutation(['hello', 'Hello'])).to.be.true;",
-        "expect(mutation(['zyxwvutsrqponmlkjihgfedcba', 'qrstu'])).to.be.true;",
-        "expect(mutation(['Mary', 'Army'])).to.be.true;",
-        "expect(mutation(['Mary', 'Aarmy'])).to.be.true;",
-        "expect(mutation(['Alien', 'line'])).to.be.true;",
-        "expect(mutation(['floor', 'for'])).to.be.true;"
-      ],
-      "MDNlinks": [
-        "Array.indexOf()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "adf08ec01beb4f99fc7a68f2",
-      "name": "Bonfire: Falsy Bouncer",
-      "dashedName": "bonfire-falsy-bouncer",
-      "difficulty": "1.50",
-      "description": [
-        "Remove all falsy values from an array.",
-        "Falsy values in javascript are false, null, 0, \"\", undefined, and NaN.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function bouncer(arr) {",
-        "  // Don't show a false ID to this bouncer.",
-        "  return arr;",
-        "}",
-        "",
-        "bouncer([7, 'ate', '', false, 9]);"
-      ],
-      "tests": [
-        "assert.deepEqual(bouncer([7, 'ate', '', false, 9]), [7, 'ate', 9], 'should remove falsy values');",
-        "assert.deepEqual(bouncer(['a', 'b', 'c']), ['a', 'b', 'c'], 'should return full array if no falsy elements');",
-        "assert.deepEqual(bouncer([false, null, 0]), [], 'should return empty array if all elements are falsy');"
-      ],
-      "MDNlinks": [
-        "Boolean Objects",
-        "Array.filter()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a8e512fbe388ac2f9198f0fa",
-      "name": "Bonfire: Where art thou",
-      "dashedName": "bonfire-where-art-thou",
-      "difficulty": "1.55",
-      "description": [
-        "Make a function that looks through a list (first argument) and returns an array of all objects that have equivalent property values (second argument).",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function where(collection, source) {",
-        "  var arr = [];",
-        "  // What's in a name?",
-        "  return arr;",
-        "}",
-        "",
-        "where([{ first: 'Romeo', last: 'Montague' }, { first: 'Mercutio', last: null }, { first: 'Tybalt', last: 'Capulet' }], { last: 'Capulet' });"
-      ],
-      "tests": [
-        "assert.deepEqual(where([{ first: 'Romeo', last: 'Montague' }, { first: 'Mercutio', last: null }, { first: 'Tybalt', last: 'Capulet' }], { last: 'Capulet' }), [{ first: 'Tybalt', last: 'Capulet' }], 'should return an array of objects');",
-        "assert.deepEqual(where([{ 'a': 1 }, { 'a': 1 }, { 'a': 1, 'b': 2 }], { 'a': 1 }), [{ 'a': 1 }, { 'a': 1 }, { 'a': 1, 'b': 2 }], 'should return with multiples');"
-      ],
-      "MDNlinks": [
-        "Global Object",
-        "Object.hasOwnProperty()",
-        "Object.keys()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a39963a4c10bc8b4d4f06d7e",
-      "name": "Bonfire: Seek and Destroy",
-      "dashedName": "bonfire-seek-and-destroy",
-      "difficulty": "1.60",
-      "description": [
-        "You will be provided with an initial array (the first argument in the destroyer function), followed by one or more arguments. Remove all elements from the initial array that are of the same value as these arguments.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function destroyer(arr) {",
-        "  // Remove all the values",
-        "  return arr;",
-        "}",
-        "",
-        "destroyer([1, 2, 3, 1, 2, 3], 2, 3);"
-      ],
-      "tests": [
-        "assert.deepEqual(destroyer([1, 2, 3, 1, 2, 3], 2, 3), [1, 1], 'should remove correct values from an array');",
-        "assert.deepEqual(destroyer([1, 2, 3, 5, 1, 2, 3], 2, 3), [1, 5, 1], 'should remove correct values from an array');",
-        "assert.deepEqual(destroyer([3, 5, 1, 2, 2], 2, 3, 5), [1], 'should accept more than two additional arguments');",
-        "assert.deepEqual(destroyer([2, 3, 2, 3], 2, 3), [], 'should remove correct values from an array');",
-        "assert.deepEqual(destroyer(['tree', 'hamburger', 53], 'tree', 53), ['hamburger'], 'should handle NaN-elements');"
-      ],
-      "MDNlinks": [
-        "Arguments object",
-        "Array.filter()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a24c1a4622e3c05097f71d67",
-      "name": "Bonfire: Where do I belong",
-      "dashedName": "bonfire-where-do-i-belong",
-      "difficulty": "1.61",
-      "description": [
-        "Return the lowest index at which a value (second argument) should be inserted into a sorted array (first argument).",
-        "For example, where([1,2,3,4], 1.5) should return 1 because it is greater than 1 (0th index), but less than 2 (1st index).",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function where(arr, num) {",
-        "  // Find my place in this sorted array.",
-        "  return num;",
-        "}",
-        "",
-        "where([40, 60], 50);"
-      ],
-      "MDNlinks": [
-        "Array.sort()"
-      ],
-      "tests": [
-        "expect(where([10, 20, 30, 40, 50], 35)).to.equal(3);",
-        "expect(where([10, 20, 30, 40, 50], 30)).to.equal(2);"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a3566b1109230028080c9345",
-      "name": "Bonfire: Sum All Numbers in a Range",
-      "dashedName": "bonfire-sum-all-numbers-in-a-range",
-      "difficulty": "2.00",
-      "description": [
-        "We'll pass you an array of two numbers. Return the sum of those two numbers and all numbers between them.",
-        "The lowest number will not always come first.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function sumAll(arr) {",
-        "  return(1);",
-        "}",
-        "",
-        "sumAll([1, 4]);"
-      ],
-      "tests": [
-        "expect(sumAll([1, 4])).to.be.a('Number');",
-        "expect(sumAll([1, 4])).to.equal(10);",
-        "expect(sumAll([4, 1])).to.equal(10);",
-        "expect(sumAll([5, 10])).to.equal(45);",
-        "expect(sumAll([10, 5])).to.equal(45);"
-      ],
-      "MDNlinks": [
-        "Math.max()",
-        "Math.min()",
-        "Array.reduce()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a5de63ebea8dbee56860f4f2",
-      "name": "Bonfire: Diff Two Arrays",
-      "dashedName": "bonfire-diff-two-arrays",
-      "difficulty": "2.01",
-      "description": [
-        "Compare two arrays and return a new array with any items not found in both of the original arrays.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function diff(arr1, arr2) {",
-        "  var newArr = [];",
-        "  // Same, same; but different.",
-        "  return newArr;",
-        "}",
-        "",
-        "diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);"
-      ],
-      "tests": [
-        "expect(diff([1, 2, 3, 5], [1, 2, 3, 4, 5])).to.be.a('array');",
-        "assert.deepEqual(diff(['diorite', 'andesite', 'grass', 'dirt', 'pink wool', 'dead shrub'], ['diorite', 'andesite', 'grass', 'dirt', 'dead shrub']), ['pink wool'], 'arrays with only one difference');",
-        "assert.includeMembers(diff(['andesite', 'grass', 'dirt', 'pink wool', 'dead shrub'], ['diorite', 'andesite', 'grass', 'dirt', 'dead shrub']), ['diorite', 'pink wool'], 'arrays with more than one difference');",
-        "assert.deepEqual(diff(['andesite', 'grass', 'dirt', 'dead shrub'], ['andesite', 'grass', 'dirt', 'dead shrub']), [], 'arrays with no difference');",
-        "assert.deepEqual(diff([1, 2, 3, 5], [1, 2, 3, 4, 5]), [4], 'arrays with numbers');",
-        "assert.includeMembers(diff([1, 'calf', 3, 'piglet'], [1, 'calf', 3, 4]), ['piglet', 4], 'arrays with numbers and strings');",
-        "assert.deepEqual(diff([], ['snuffleupagus', 'cookie monster', 'elmo']), ['snuffleupagus', 'cookie monster', 'elmo'], 'empty array');"
-      ],
-      "MDNlinks": [
-        "Comparison Operators",
-        "String.slice()",
-        "Array.filter()",
-        "Array.indexOf()",
-        "String.concat()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a7f4d8f2483413a6ce226cac",
-      "name": "Bonfire: Roman Numeral Converter",
-      "dashedName": "bonfire-roman-numeral-converter",
-      "tests": [
-        "expect(convert(12)).to.equal(\"XII\");",
-        "expect(convert(5)).to.equal(\"V\");",
-        "expect(convert(9)).to.equal(\"IX\");",
-        "expect(convert(29)).to.equal(\"XXIX\");",
-        "expect(convert(16)).to.equal(\"XVI\");"
-      ],
-      "difficulty": "2.02",
-      "description": [
-        "Convert the given number into a roman numeral.",
-        "All <a href=\"http://www.mathsisfun.com/roman-numerals.html\">roman numerals</a> answers should be provided in upper-case.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function convert(num) {",
-        " return num;",
-        "}",
-        "",
-        "convert(36);"
-      ],
-      "MDNlinks": [
-        "Array.splice()",
-        "Array.indexOf()",
-        "Array.join()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a0b5010f579e69b815e7c5d6",
-      "name": "Bonfire: Search and Replace",
-      "dashedName": "bonfire-search-and-replace",
-      "tests": [
-        "expect(replace(\"Let us go to the store\", \"store\", \"mall\")).to.equal(\"Let us go to the mall\");",
-        "expect(replace(\"He is Sleeping on the couch\", \"Sleeping\", \"sitting\")).to.equal(\"He is Sitting on the couch\");",
-        "expect(replace(\"This has a spellngi error\", \"spellngi\", \"spelling\")).to.equal(\"This has a spelling error\");",
-        "expect(replace(\"His name is Tom\", \"Tom\", \"john\")).to.equal(\"His name is John\");",
-        "expect(replace(\"Let us get back to more Coding\", \"Coding\", \"bonfires\")).to.equal(\"Let us get back to more Bonfires\");"
-      ],
-      "difficulty": "2.03",
-      "description": [
-        "Perform a search and replace on the sentence using the arguments provided and return the new sentence.",
-        "First argument is the sentence to perform the search and replace on.",
-        "Second argument is the word that you will be replacing (before).",
-        "Third argument is what you will be replacing the second argument with (after).",
-        "NOTE: Preserve the case of the original word when you are replacing it. For example if you mean to replace the word 'Book' with the word 'dog', it should be replaced as 'Dog'",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function replace(str, before, after) {",
-        " return str;",
-        "}",
-        "",
-        "replace(\"A quick brown fox jumped over the lazy dog\", \"jumped\", \"leaped\");"
-      ],
-      "MDNlinks": [
-        "Array.splice()",
-        "String.replace()",
-        "Array.join()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "aa7697ea2477d1316795783b",
-      "name": "Bonfire: Pig Latin",
-      "dashedName": "bonfire-pig-latin",
-      "tests": [
-        "expect(translate(\"california\")).to.equal(\"aliforniacay\");",
-        "expect(translate(\"paragraphs\")).to.equal(\"aragraphspay\");",
-        "expect(translate(\"glove\")).to.equal(\"oveglay\");",
-        "expect(translate(\"algorithm\")).to.equal(\"algorithmway\");",
-        "expect(translate(\"eight\")).to.equal(\"eightway\");"
-      ],
-      "difficulty": "2.04",
-      "description": [
-        "Translate the provided string to pig latin.",
-        "<a href=\"http://en.wikipedia.org/wiki/Pig_Latin\">Pig Latin</a> takes the first consonant (or consonant cluster) of an English word, moves it to the end of the word and suffixes an \"ay\".",
-        "If a word begins with a vowel you just add \"way\" to the end.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function translate(str) {",
-        " return str;",
-        "}",
-        "",
-        "translate(\"consonant\");"
-      ],
-      "MDNlinks": [
-        "Array.indexOf()",
-        "Array.push()",
-        "Array.join()",
-        "String.substr()",
-        "String.split()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "afd15382cdfb22c9efe8b7de",
-      "name": "Bonfire: DNA Pairing",
-      "dashedName": "bonfire-dna-pairing",
-      "tests": [
-        "assert.deepEqual(pair(\"ATCGA\"),[['A','T'],['T','A'],['C','G'],['G','C'],['A','T']], 'should return the dna pair');",
-        "assert.deepEqual(pair(\"TTGAG\"),[['T','A'],['T','A'],['G','C'],['A','T'],['G','C']], 'should return the dna pair');",
-        "assert.deepEqual(pair(\"CTCTA\"),[['C','G'],['T','A'],['C','G'],['T','A'],['A','T']], 'should return the dna pair');"
-      ],
-      "difficulty": "2.05",
-      "description": [
-        "The DNA strand is missing the pairing element. Match each character with the missing element and return the results as a 2d array.",
-        "<a href=\"http://en.wikipedia.org/wiki/Base_pair\">Base pairs</a> are a pair of AT and CG. Match the missing element to the provided character.",
-        "Return the provided character as the first element in each array.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function pair(str) {",
-        " return str;",
-        "}",
-        "",
-        "pair(\"GCG\");"
-      ],
-      "MDNlinks": [
-        "Array.push()",
-        "String.split()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "af7588ade1100bde429baf20",
-      "name": "Bonfire: Missing letters",
-      "dashedName": "bonfire-missing-letters",
-      "difficulty": "2.05",
-      "description": [
-        "Find the missing letter in the passed letter range and return it.",
-        "If all letters are present in the range, return undefined.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function fearNotLetter(str) {",
-        "  return str;",
-        "}",
-        "",
-        "fearNotLetter('abce');"
-      ],
-      "tests": [
-        "expect(fearNotLetter('abce')).to.equal('d');",
-        "expect(fearNotLetter('bcd')).to.be.undefined;",
-        "expect(fearNotLetter('abcdefghjklmno')).to.equal('i');",
-        "expect(fearNotLetter('yz')).to.be.undefined;"
-      ],
-      "MDNlinks": [
-        "String.charCodeAt()",
-        "String.fromCharCode()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a77dbc43c33f39daa4429b4f",
-      "name": "Bonfire: Boo who",
-      "dashedName": "bonfire-boo-who",
-      "difficulty": "2.06",
-      "description": [
-        "Check if a value is classified as a boolean primitive. Return true or false.",
-        "Boolean primitives are true and false.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function boo(bool) {",
-        "  // What is the new fad diet for ghost developers? The Boolean.",
-        "  return bool;",
-        "}",
-        "",
-        "boo(null);"
-      ],
-      "tests": [
-        "assert.strictEqual(boo(true), true);",
-        "assert.strictEqual(boo(false), true);",
-        "assert.strictEqual(boo([1, 2, 3]), false);",
-        "assert.strictEqual(boo([].slice), false);",
-        "assert.strictEqual(boo({ 'a': 1 }), false);",
-        "assert.strictEqual(boo(1), false);",
-        "assert.strictEqual(boo(NaN), false);",
-        "assert.strictEqual(boo('a'), false);"
-      ],
-      "MDNlinks": [
-        "Boolean Objects"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a105e963526e7de52b219be9",
-      "name": "Bonfire: Sorted Union",
-      "dashedName": "bonfire-sorted-union",
-      "difficulty": "2.07",
-      "description": [
-        "Write a function that takes two or more arrays and returns a new array of unique values in the order of the original provided arrays.",
-        "In other words, all values present from all arrays should be included in their original order, but with no duplicates in the final array.",
-        "The unique numbers should be sorted by their original order, but the final array should not be sorted in numerical order.",
-        "Check the assertion tests for examples.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function unite(arr1, arr2, arr3) {",
-        "  return arr1;",
-        "}",
-        "",
-        "unite([1, 2, 3], [5, 2, 1, 4], [2, 1]);"
-      ],
-      "tests": [
-        "assert.deepEqual(unite([1, 3, 2], [5, 2, 1, 4], [2, 1]), [1, 3, 2, 5, 4], 'should return the union of the given arrays');",
-        "assert.deepEqual(unite([1, 3, 2], [1, [5]], [2, [4]]), [1, 3, 2, [5], [4]], 'should not flatten nested arrays');",
-        "assert.deepEqual(unite([1, 2, 3], [5, 2, 1]), [1, 2, 3, 5], 'should correctly handle exactly two arguments');",
-        "assert.deepEqual(unite([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8]), [ 1, 2, 3, 5, 4, 6, 7, 8 ], 'should correctly handle higher numbers of arguments');"
-      ],
-      "MDNlinks": [
-        "Arguments object",
-        "Array.reduce()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a6b0bb188d873cb2c8729495",
-      "name": "Bonfire: Convert HTML Entities",
-      "dashedName": "bonfire-convert-html-entities",
-      "difficulty": "2.07",
-      "description": [
-        "Convert the characters \"&\", \"<\", \">\", '\"' (double quote), and \"'\" (apostrophe), in a string to their corresponding HTML entities.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function convert(str) {",
-        "  // &colon;&rpar;",
-        "  return str;",
-        "}",
-        "",
-        "convert('Dolce & Gabbana');"
-      ],
-      "tests": [
-        "assert.strictEqual(convert('Dolce & Gabbana'), 'Dolce &amp; Gabbana', 'should escape characters');",
-        "assert.strictEqual(convert('Hamburgers < Pizza < Tacos'), 'Hamburgers &lt; Pizza &lt; Tacos', 'should escape characters');",
-        "assert.strictEqual(convert('Sixty > twelve'), 'Sixty &gt; twelve', 'should escape characters');",
-        "assert.strictEqual(convert('Stuff in \"quotation marks\"'), 'Stuff in &quot;quotation marks&quot;', 'should escape characters');",
-        "assert.strictEqual(convert(\"Shindler's List\"), 'Shindler&apos;s List', 'should escape characters');",
-        "assert.strictEqual(convert('<>'), '&lt;&gt;', 'should escape characters');",
-        "assert.strictEqual(convert('abc'), 'abc', 'should handle strings with nothing to escape');"
-      ],
-      "MDNlinks": [
-        "RegExp",
-        "HTML Entities"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a103376db3ba46b2d50db289",
-      "name": "Bonfire: Spinal Tap Case",
-      "dashedName": "bonfire-spinal-tap-case",
-      "difficulty": "2.08",
-      "description": [
-        "Convert a string to spinal case. Spinal case is all-lowercase-words-joined-by-dashes.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function spinalCase(str) {",
-        "  // \"It's such a fine line between stupid, and clever.\"",
-        "  // --David St. Hubbins",
-        "  return str;",
-        "}",
-        "",
-        "spinalCase('This Is Spinal Tap');"
-      ],
-      "tests": [
-        "assert.strictEqual(spinalCase('This Is Spinal Tap'), 'this-is-spinal-tap', 'should return spinal case from string with spaces');",
-        "assert.strictEqual(spinalCase('thisIsSpinalTap'), 'this-is-spinal-tap', 'should return spinal case from string with camel case');",
-        "assert.strictEqual(spinalCase('The_Andy_Griffith_Show'), 'the-andy-griffith-show', 'should return spinal case from string with snake case');",
-        "assert.strictEqual(spinalCase('Teletubbies say Eh-oh'), 'teletubbies-say-eh-oh', 'should return spinal case from string with spaces and hyphens');"
-      ],
-      "MDNlinks": [
-        "RegExp",
-        "String.replace()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a5229172f011153519423690",
-      "name": "Bonfire: Sum All Odd Fibonacci Numbers",
-      "dashedName": "bonfire-sum-all-odd-fibonacci-numbers",
-      "difficulty": "2.09",
-      "description": [
-        "Return the sum of all odd Fibonacci numbers up to and including the passed number if it is a Fibonacci number.",
-        "The first few numbers of the Fibonacci sequence are 1, 1, 2, 3, 5 and 8, and each subsequent number is the sum of the previous two numbers.",
-        "As an example, passing 4 to the function should return 5 because all the odd Fibonacci numbers under 4 are 1, 1, and 3.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function sumFibs(num) {",
-        "  return num;",
-        "}",
-        "",
-        "sumFibs(4);"
-      ],
-      "tests": [
-        "expect(sumFibs(1)).to.be.a('number');",
-        "expect(sumFibs(1000)).to.equal(1785);",
-        "expect(sumFibs(4000000)).to.equal(4613732);",
-        "expect(sumFibs(4)).to.equal(5);",
-        "expect(sumFibs(75024)).to.equal(60696);",
-        "expect(sumFibs(75025)).to.equal(135721);"
-      ],
-      "MDNlinks": [
-        "Remainder"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a3bfc1673c0526e06d3ac698",
-      "name": "Bonfire: Sum All Primes",
-      "dashedName": "bonfire-sum-all-primes",
-      "difficulty": "2.10",
-      "description": [
-        "Sum all the prime numbers up to and including the provided number.",
-        "A prime number is defined as having only two divisors, 1 and itself. For example, 2 is a prime number because it's only divisible by 1 and 2. 1 isn't a prime number, because it's only divisible by itself.",
-        "The provided number may not be a prime.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function sumPrimes(num) {",
-        "  return num;",
-        "}",
-        "",
-        "sumPrimes(10);"
-      ],
-      "tests": [
-        "expect(sumPrimes(10)).to.be.a('number');",
-        "expect(sumPrimes(10)).to.equal(17);",
-        "expect(sumPrimes(977)).to.equal(73156);"
-      ],
-      "MDNlinks": [
-        "For Loops",
-        "Array.push()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "ae9defd7acaf69703ab432ea",
-      "name": "Bonfire: Smallest Common Multiple",
-      "dashedName": "bonfire-smallest-common-multiple",
-      "difficulty": "2.11",
-      "description": [
-        "Find the smallest number that is evenly divisible by all numbers in the provided range.",
-        "The range will be an array of two numbers that will not necessarily be in numerical order.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function smallestCommons(arr) {",
-        "  return arr;",
-        "}",
-        "",
-        "",
-        "smallestCommons([1,5]);"
-      ],
-      "tests": [
-        "expect(smallestCommons([1,5])).to.be.a('number');",
-        "expect(smallestCommons([1,5])).to.equal(60);",
-        "expect(smallestCommons([5,1])).to.equal(60);",
-        "expect(smallestCommons([1,13])).to.equal(360360);"
-      ],
-      "MDNlinks": [
-        "Smallest Common Multiple"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a6e40f1041b06c996f7b2406",
-      "name": "Bonfire: Finders Keepers",
-      "dashedName": "bonfire-finders-keepers",
-      "difficulty": "2.12",
-      "description": [
-        "Create a function that looks through an array (first argument) and returns the first element in the array that passes a truth test (second argument).",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function find(arr, func) {",
-        "  var num = 0;",
-        "  return num;",
-        "}",
-        "",
-        "find([1, 2, 3, 4], function(num){ return num % 2 === 0; });"
-      ],
-      "tests": [
-        "assert.strictEqual(find([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; }), 8, 'should return first found value');",
-        "assert.strictEqual(find([1, 3, 5, 9], function(num) { return num % 2 === 0; }), undefined, 'should return undefined if not found');"
-      ],
-      "MDNlinks": [
-        "Array.some()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a5deed1811a43193f9f1c841",
-      "name": "Bonfire: Drop it",
-      "dashedName": "bonfire-drop-it",
-      "difficulty": "2.13",
-      "description": [
-        "Drop the elements of an array (first argument), starting from the front, until the predicate (second argument) returns true.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function drop(arr, func) {",
-        "  // Drop them elements.",
-        "  return arr;",
-        "}",
-        "",
-        "drop([1, 2, 3], function(n) {return n < 3; });"
-      ],
-      "tests": [
-        "expect(drop([1, 2, 3, 4], function(n) {return n >= 3; })).to.eqls([3, 4]);",
-        "expect(drop([1, 2, 3], function(n) {return n > 0; })).to.eqls([1, 2, 3]);",
-        "expect(drop([1, 2, 3, 4], function(n) {return n > 5; })).to.eqls([]);"
-      ],
-      "MDNlinks": [
-        "Arguments object",
-        "Array.shift()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "ab306dbdcc907c7ddfc30830",
-      "name": "Bonfire: Steamroller",
-      "dashedName": "bonfire-steamroller",
-      "difficulty": "2.14",
-      "description": [
-        "Flatten a nested array. You must account for varying levels of nesting.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function steamroller(arr) {",
-        "  // I'm a steamroller, baby",
-        "  return arr;",
-        "}",
-        "",
-        "steamroller([1, [2], [3, [[4]]]]);"
-      ],
-      "tests": [
-        "assert.deepEqual(steamroller([[['a']], [['b']]]), ['a', 'b'], 'should flatten nested arrays');",
-        "assert.deepEqual(steamroller([1, [2], [3, [[4]]]]), [1, 2, 3, 4], 'should flatten nested arrays');",
-        "assert.deepEqual(steamroller([1, [], [3, [[4]]]]), [1, 3, 4], 'should work with empty arrays');"
-      ],
-      "MDNlinks": [
-        "Array.isArray()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a8d97bd4c764e91f9d2bda01",
-      "name": "Bonfire: Binary Agents",
-      "dashedName": "bonfire-binary-agents",
-      "difficulty": "2.15",
-      "description": [
-        "Return an English translated sentence of the passed binary string.",
-        "The binary string will be space separated.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function binaryAgent(str) {",
-        "  return str;",
-        "}",
-        "",
-        "binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111');"
-      ],
-      "tests": [
-        "expect(binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111')).to.equal(\"Aren't bonfires fun!?\");",
-        "expect(binaryAgent('01001001 00100000 01101100 01101111 01110110 01100101 00100000 01000110 01110010 01100101 01100101 01000011 01101111 01100100 01100101 01000011 01100001 01101101 01110000 00100001')).to.equal(\"I love FreeCodeCamp!\");"
-      ],
-      "MDNlinks": [
-        "String.charCodeAt()",
-        "String.fromCharCode()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a10d2431ad0c6a099a4b8b52",
-      "name": "Bonfire: Everything Be True",
-      "dashedName": "bonfire-everything-be-true",
-      "difficulty": "2.21",
-      "description": [
-        "Check if the predicate (second argument) returns truthy (defined) for all elements of a collection (first argument).",
-        "For this, check to see if the property defined in the second argument is present on every element of the collection.",
-        "Remember, you can access object properties through either dot notation or [] notation.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function every(collection, pre) {",
-        "  // Does everyone have one of these?",
-        "  return pre;",
-        "}",
-        "",
-        "every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], 'sex');"
-      ],
-      "tests": [
-        "assert.strictEqual(every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], 'sex'), true, 'should return true if predicate returns truthy for all elements in the collection');",
-        "assert.strictEqual(every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], {'sex': 'female'}), false, 'should return false if predicate returns falsey for any element in the collection');",
-        "assert.strictEqual(every([{'user': 'Tinky-Winky', 'sex': 'female'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], {'sex': 'female'}), false, 'should return false if predicate returns falsey for any element in the collection');"
-
-      ],
-      "MDNlinks": [
-        "Object.hasOwnProperty()",
-        "Object.getOwnPropertyNames()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a97fd23d9b809dac9921074f",
-      "name": "Bonfire: Arguments Optional",
-      "dashedName": "bonfire-arguments-optional",
-      "difficulty": "2.22",
-      "description": [
-        "Create a function that sums two arguments together. If only one argument is provided, return a function that expects one additional argument and will return the sum.",
-        "For example, add(2, 3) should return 5, and add(2) should return a function that is waiting for an argument so that <code>var sum2And = add(2); return sum2And(3); // 5</code>",
-        "If either argument isn't a valid number, return undefined.",
-        "Remember to use [RSAP](//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck) if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function add() {",
-        "  return false;",
-        "}",
-        "",
-        "add(2,3);"
-      ],
-      "tests": [
-        "expect(add(2, 3)).to.equal(5);",
-        "expect(add(2)(3)).to.equal(5);",
-        "expect(add('http://bit.ly/IqT6zt')).to.be.undefined;",
-        "expect(add(2, '3')).to.be.undefined;",
-        "expect(add(2)([3])).to.be.undefined;"
-      ],
-      "MDNlinks": [
-        "Global Function Object",
-        "Arguments object"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    }
-  ]
-}
diff --git a/nap/data/seed/challenges/basic-ziplines.json b/nap/data/seed/challenges/basic-ziplines.json
deleted file mode 100644
index e6418a3..0000000
--- a/nap/data/seed/challenges/basic-ziplines.json
+++ /dev/null
@@ -1,210 +0,0 @@
-{
-  "name": "Basic Front End Development Projects",
-  "order": 0.008,
-  "challenges": [
-    {
-      "id": "bd7158d8c442eddfbeb5bd1f",
-      "name": "Waypoint: Get Set for Ziplines",
-      "dashedName": "waypoint-get-set-for-ziplines",
-      "difficulty": 1.00,
-      "challengeSeed": ["125658022"],
-      "description": [
-        "Now you're ready to start our Zipline challenges. These front-end development challenges will give you many opportunities to apply the HTML, CSS, jQuery and JavaScript you've learned to build static (database-less) applications.",
-        "For many of these challenges, you will be using JSON data from external API endpoints, such as Twitch.tv and Twitter. Note that you don't need to have a database to use these data.",
-        "The easiest way to manipulate these data is with <a href='http://api.jquery.com/jquery.getjson/' target='_blank'>jQuery $.getJSON()</a>.",
-        "Whatever you do, don't get discouraged! Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck.",
-        "We'll build these challenges using CodePen, a popular tool for creating, sharing, and discovering static web applications.",
-        "Go to <a href='http://codepen.io' target='_blank'>http://codepen.io</a> and create an account.",
-        "Click your user image in the top right corner, then click the \"New pen\" button that drops down.",
-        "Drag the windows around and press the buttons in the lower-right hand corner to change the orientation to suit your preference.",
-        "Click the gear next to CSS. Click the \"Quick-add...\" select box and choose Bootstrap.",
-        "Verify that bootstrap is active by adding the following code to your HTML: <code>&lt;h1 class='text-primary'&gt;Hello CodePen!&lt;/h1&gt;</code>. The text's color should be Bootstrap blue.",
-        "Click the gear next to JavaScript. Click the \"Quick-add...\" select box and choose jQuery.",
-        "Now add the following code to your JavaScript: <code>$(document).ready(function() { $('.text-primary').text('Hi CodePen!') });</code>. Click the \"Save\" button at the top. Your \"Hello CodePen!\" should change to \"Hi CodePen!\". This means that jQuery is working.",
-        "You can use this CodePen that you've just created as a starting point for your Ziplines. Just click the \"fork\" button at the top of your CodePen and it will create a duplicate CodePen.",
-        "Now you're ready for your first Zipline. Click the \"I've completed this challenge\" button."
-      ],
-      "challengeType": 2,
-      "tests": [],
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "bd7158d8c242eddfaeb5bd13",
-      "name": "Zipline: Build a Personal Portfolio Webpage",
-      "dashedName": "zipline-build-a-personal-portfolio-webpage",
-      "difficulty": 1.01,
-      "challengeSeed": ["133315782"],
-      "description": [
-        "<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/ThiagoFerreir4/full/eNMxEp' target='_blank'>http://codepen.io/ThiagoFerreir4/full/eNMxEp</a>.",
-        "<span class='text-info'>Rule #1:</span> Don't look at the example project's code on CodePen. Figure it out for yourself.",
-        "<span class='text-info'>Rule #2:</span> You may use whichever libraries or APIs you need.",
-        "<span class='text-info'>Rule #3:</span> Reverse engineer the example project's functionality, and also feel free to personalize it.",
-        "Here are the <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a> you must enable, and optional bonus user stories:",
-        "<span class='text-info'>User Story:</span> As a user, I can access all of the portfolio webpage's content just by scrolling.",
-        "<span class='text-info'>User Story:</span> As a user, I can click different buttons that will take me to the portfolio creator's different social media pages.",
-        "<span class='text-info'>User Story:</span> As a user, I can see thumbnail images of different projects the portfolio creator has built (if you don't haven't built any websites before, use placeholders.)",
-        "<span class='text-info'>Bonus User Story:</span> As a user, I navigate to different sections of the webpage by clicking buttons in the navigation.",
-        "Don't worry if you don't have anything to showcase on your portfolio yet - you will build several several apps on the next few CodePen challenges, and can come back and update your portfolio later.",
-        "There are many great portfolio templates out there, but for this challenge, you'll need to build a portfolio page yourself. Using Bootstrap will make this much easier for you.",
-        "Note that CodePen.io overrides the Window.open() function, so if you want to open windows using jquery, you will need to target invisible anchor elements like this one: <code>&lt;a target='_blank'&rt;</a>.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck.",
-        "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
-        "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
-      ],
-      "challengeType": 3,
-      "tests": [],
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "bd7158d8c442eddfaeb5bd13",
-      "name": "Zipline: Build a Random Quote Machine",
-      "dashedName": "zipline-build-a-random-quote-machine",
-      "difficulty": 1.02,
-      "challengeSeed": ["126415122"],
-      "description": [
-        "<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/AdventureBear/full/vEoVMw' target='_blank'>http://codepen.io/AdventureBear/full/vEoVMw</a>.",
-        "<span class='text-info'>Rule #1:</span> Don't look at the example project's code on CodePen. Figure it out for yourself.",
-        "<span class='text-info'>Rule #2:</span> You may use whichever libraries or APIs you need.",
-        "<span class='text-info'>Rule #3:</span> Reverse engineer the example project's functionality, and also feel free to personalize it.",
-        "Here are the <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a> you must enable, and optional bonus user stories:",
-        "<span class='text-info'>User Story:</span> As a user, I can click a button to show me a new random quote.",
-        "<span class='text-info'>Bonus User Story:</span> As a user, I can press a button to tweet out a quote.",
-        "Note that you can either put your quotes into an array and show them at random, or use an API to get quotes, such as <a href='http://forismatic.com/en/api/'>http://forismatic.com/en/api/</a>.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck.",
-        "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
-        "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
-      ],
-      "challengeType": 3,
-      "tests": [],
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "bd7158d8c442eddfaeb5bd10",
-      "name": "Zipline: Show the Local Weather",
-      "dashedName": "zipline-show-the-local-weather",
-      "difficulty": 1.03,
-      "challengeSeed": ["126415127"],
-      "description": [
-        "<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/AdventureBear/full/yNBJRj' target='_blank'>http://codepen.io/AdventureBear/full/yNBJRj</a>.",
-        "<span class='text-info'>Rule #1:</span> Don't look at the example project's code on CodePen. Figure it out for yourself.",
-        "<span class='text-info'>Rule #2:</span> You may use whichever libraries or APIs you need.",
-        "<span class='text-info'>Rule #3:</span> Reverse engineer the example project's functionality, and also feel free to personalize it.",
-        "Here are the <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a> you must enable, and optional bonus user stories:",
-        "<span class='text-info'>User Story:</span> As a user, I can see the weather in my current location.",
-        "<span class='text-info'>Bonus User Story:</span> As a user, I can see an icon depending on the temperature..",
-        "<span class='text-info'>Bonus User Story:</span> As a user, I see a different background image depending on the temperature (e.g. snowy mountain, hot desert).",
-        "<span class='text-info'>Bonus User Story:</span> As a user, I can push a button to toggle between Fahrenheit and Celsius.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck.",
-        "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
-        "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
-      ],
-      "challengeType": 3,
-      "tests": [],
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "bd7158d8c442eddfaeb5bd0f",
-      "name": "Zipline: Build a Pomodoro Clock",
-      "dashedName": "zipline-build-a-pomodoro-clock",
-      "difficulty": 1.04,
-      "challengeSeed": ["126411567"],
-      "description": [
-        "<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/GeoffStorbeck/full/RPbGxZ/' target='_blank'>http://codepen.io/GeoffStorbeck/full/RPbGxZ/</a>.",
-        "<span class='text-info'>Rule #1:</span> Don't look at the example project's code on CodePen. Figure it out for yourself.",
-        "<span class='text-info'>Rule #2:</span> You may use whichever libraries or APIs you need.",
-        "<span class='text-info'>Rule #3:</span> Reverse engineer the example project's functionality, and also feel free to personalize it.",
-        "Here are the <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a> you must enable, and optional bonus user stories:",
-        "<span class='text-info'>User Story:</span> As a user, I can start a 25 minute pomodoro, and the timer will go off once 25 minutes has elapsed.",
-        "<span class='text-info'>Bonus User Story:</span> As a user, I can reset the clock for my next pomodoro.",
-        "<span class='text-info'>Bonus User Story:</span> As a user, I can customize the length of each pomodoro.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck.",
-        "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
-        "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
-      ],
-      "challengeType": 3,
-      "tests": [],
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "bd7158d8c442eddfaeb5bd1f",
-      "name": "Zipline: Use the Twitch.tv JSON API",
-      "dashedName": "zipline-use-the-twitchtv-json-api",
-      "difficulty": 1.05,
-      "challengeSeed": ["126411564"],
-      "description": [
-        "<span class='text-info'>Objective:</span> Build a <a href='http://codepen.io' target='_blank'>CodePen.io</a> app that successfully reverse-engineers this: <a href='http://codepen.io/GeoffStorbeck/full/GJKRxZ' target='_blank'>http://codepen.io/GeoffStorbeck/full/GJKRxZ</a>.",
-        "<span class='text-info'>Rule #1:</span> Don't look at the example project's code on CodePen. Figure it out for yourself.",
-        "<span class='text-info'>Rule #2:</span> You may use whichever libraries or APIs you need.",
-        "<span class='text-info'>Rule #3:</span> Reverse engineer the example project's functionality, and also feel free to personalize it.",
-        "Here are the <a href='http://en.wikipedia.org/wiki/User_story' target='_blank'>user stories</a> you must enable, and optional bonus user stories:",
-        "<span class='text-info'>User Story:</span> As a user, I can see whether Free Code Camp is currently streaming on Twitch.tv.",
-        "<span class='text-info'>User Story:</span> As a user, I can click the status output and be sent directly to the Free Code Camp's Twitch.tv channel.",
-        "<span class='text-info'>User Story:</span> As a user, if Free Code Camp is streaming, I can see additional details about what they are streaming.",
-        "<span class='text-info'>Bonus User Story:</span> As a user, I can search through the streams listed.",
-        "<span class='text-info'>Hint:</span> Here's an example call to Twitch.tv's JSON API: <code>https://api.twitch.tv/kraken/streams/freecodecamp</code>.",
-        "<span class='text-info'>Hint:</span> The relevant documentation about this API call is here: <a href='https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel' target='_blank'>https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel</a>.",
-        "<span class='text-info'>Hint:</span> Here's an array of the Twitch.tv usernames of people who regularly stream coding: <code>[\"freecodecamp\", \"storbeck\", \"terakilobyte\", \"habathcx\",\"RobotCaleb\",\"comster404\",\"brunofin\",\"thomasballinger\",\"noobs2ninjas\",\"beohoff\"]</code>",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck.",
-        "When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
-        "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.<br><br><a class='btn btn-primary btn-block' href='https://twitter.com/intent/tweet?text=Check%20out%20the%20project%20I%20just%20built%20with%20%40FreeCodeCamp:%20%0A%20%23LearnToCode%20%23JavaScript' target='_blank'>Click here then add your link to your tweet's text</a>"
-      ],
-      "challengeType": 3,
-      "tests": [],
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    }
-  ]
-}
diff --git a/nap/data/seed/challenges/expert-bonfires.json b/nap/data/seed/challenges/expert-bonfires.json
deleted file mode 100644
index 50bbe89..0000000
--- a/nap/data/seed/challenges/expert-bonfires.json
+++ /dev/null
@@ -1,304 +0,0 @@
-{
-  "name": "Expert Algorithm Scripting",
-  "order": 0.013,
-  "challenges": [
-    {
-      "id": "aff0395860f5d3034dc0bfc9",
-      "name": "Bonfire: Validate US Telephone Numbers",
-      "dashedName": "bonfire-validate-us-telephone-numbers",
-      "difficulty": "4.01",
-      "description": [
-        "Return true if the passed string is a valid US phone number",
-        "The user may fill out the form field any way they choose as long as it is a valid US number. The following are all valid formats for US numbers:",
-        "555-555-5555, (555)555-5555, (555) 555-5555, 555 555 5555, 5555555555, 1 555 555 5555",
-        "For this challenge you will be presented with a string such as \"800-692-7753\" or \"8oo-six427676;laskdjf\". Your job is to validate or reject the US phone number based on any combination of the formats provided above. The area code is required. If the country code is provided, you must confirm that the country code is \"1\". Return true if the string is a valid US phone number; otherwise false.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "tests": [
-        "expect(telephoneCheck(\"555-555-5555\")).to.be.a(\"boolean\");",
-        "assert.deepEqual(telephoneCheck(\"1 555-555-5555\"), true);",
-        "assert.deepEqual(telephoneCheck(\"1 (555) 555-5555\"), true);",
-        "assert.deepEqual(telephoneCheck(\"5555555555\"), true);",
-        "assert.deepEqual(telephoneCheck(\"555-555-5555\"), true);",
-        "assert.deepEqual(telephoneCheck(\"(555)555-5555\"), true);",
-        "assert.deepEqual(telephoneCheck(\"1(555)555-5555\"), true);",
-        "assert.deepEqual(telephoneCheck(\"1 555 555 5555\"), true);",
-        "assert.deepEqual(telephoneCheck(\"555-555-5555\"), true);",
-        "assert.deepEqual(telephoneCheck(\"1 456 789 4444\"), true);",
-        "assert.deepEqual(telephoneCheck(\"123**&!!asdf#\"), false);",
-        "assert.deepEqual(telephoneCheck(\"55555555\"), false);",
-        "assert.deepEqual(telephoneCheck(\"(6505552368)\"), false);",
-        "assert.deepEqual(telephoneCheck(\"2 (757) 622-7382\"), false);",
-        "assert.deepEqual(telephoneCheck(\"0 (757) 622-7382\"), false);",
-        "assert.deepEqual(telephoneCheck(\"-1 (757) 622-7382\"), false);",
-        "assert.deepEqual(telephoneCheck(\"2 757 622-7382\"), false);",
-        "assert.deepEqual(telephoneCheck(\"10 (757) 622-7382\"), false);",
-        "assert.deepEqual(telephoneCheck(\"27576227382\"), false);",
-        "assert.deepEqual(telephoneCheck(\"(275)76227382\"), false);",
-        "assert.deepEqual(telephoneCheck(\"2(757)6227382\"), false);",
-        "assert.deepEqual(telephoneCheck(\"2(757)622-7382\"), false);"
-      ],
-      "challengeSeed": [
-        "function telephoneCheck(str) {",
-        "  // Good luck!",
-        "  return true;",
-        "}",
-        "",
-        "",
-        "",
-        "telephoneCheck(\"555-555-5555\");"
-      ],
-      "MDNlinks": [
-        "RegExp"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a3f503de51cf954ede28891d",
-      "name": "Bonfire: Symmetric Difference",
-      "dashedName": "bonfire-symmetric-difference",
-      "difficulty": "4.02",
-      "description": [
-        "Create a function that takes two or more arrays and returns an array of the symmetric difference of the provided arrays.",
-        "The mathematical term symmetric difference refers to the elements in two sets that are in either the first or second set, but not in both.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function sym(args) {",
-        "  return arguments;",
-        "}",
-        "",
-        "sym([1, 2, 3], [5, 2, 1, 4]);"
-      ],
-      "tests": [
-        "expect(sym([1, 2, 3], [5, 2, 1, 4])).to.equal([3, 5, 4]);",
-        "assert.deepEqual(sym([1, 2, 5], [2, 3, 5], [3, 4, 5]), [1, 4, 5], 'should return the symmetric difference of the given arrays');",
-        "assert.deepEqual(sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5]), [1, 4, 5], 'should return an array of unique values');",
-        "assert.deepEqual(sym([1, 1]), [1], 'should return an array of unique values');"
-      ],
-      "MDNlinks": [
-        "Array.reduce()",
-        "Symmetric Difference"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "aa2e6f85cab2ab736c9a9b24",
-      "name": "Bonfire: Exact Change",
-      "dashedName": "bonfire-exact-change",
-      "difficulty": "4.03",
-      "description": [
-        "Design a cash register drawer function that accepts purchase price as the first argument, payment as the second argument, and cash-in-drawer (cid) as the third argument.",
-        "cid is a 2d array listing available currency.",
-        "Return the string \"Insufficient Funds\" if cash-in-drawer is less than the change due. Return the string \"Closed\" if cash-in-drawer is equal to the change due.",
-        "Otherwise, return change in coin and bills, sorted in highest to lowest order.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function drawer(price, cash, cid) {",
-        "  var change;",
-        "  // Here is your change, ma'am.",
-        "  return change;",
-        "}",
-        "",
-        "// Example cash-in-drawer array:",
-        "// [['PENNY', 1.01],",
-        "// ['NICKEL', 2.05],",
-        "// ['DIME', 3.10],",
-        "// ['QUARTER', 4.25],",
-        "// ['ONE', 90.00],",
-        "// ['FIVE', 55.00],",
-        "// ['TEN', 20.00],",
-        "// ['TWENTY', 60.00],",
-        "// ['ONE HUNDRED', 100.00]]",
-        "",
-        "drawer(19.50, 20.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]]);"
-      ],
-      "tests": [
-        "expect(drawer(19.50, 20.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]])).to.be.a('array');",
-        "expect(drawer(19.50, 20.00, [['PENNY', 0.01], ['NICKEL', 0], ['DIME', 0], ['QUARTER', 0], ['ONE', 0], ['FIVE', 0], ['TEN', 0], ['TWENTY', 0], ['ONE HUNDRED', 0]])).to.be.a('string');",
-        "expect(drawer(19.50, 20.00, [['PENNY', 0.50], ['NICKEL', 0], ['DIME', 0], ['QUARTER', 0], ['ONE', 0], ['FIVE', 0], ['TEN', 0], ['TWENTY', 0], ['ONE HUNDRED', 0]])).to.be.a('string');",
-        "assert.deepEqual(drawer(19.50, 20.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]]), [['QUARTER', 0.50]], 'return correct change');",
-        "assert.deepEqual(drawer(3.26, 100.00, [['PENNY', 1.01], ['NICKEL', 2.05], ['DIME', 3.10], ['QUARTER', 4.25], ['ONE', 90.00], ['FIVE', 55.00], ['TEN', 20.00], ['TWENTY', 60.00], ['ONE HUNDRED', 100.00]]), [['TWENTY', 60.00], ['TEN', 20.00], ['FIVE', 15], ['ONE', 1], ['QUARTER', 0.50], ['DIME', 0.20], ['PENNY', 0.04] ], 'return correct change with multiple coins and bills');",
-        "assert.deepEqual(drawer(19.50, 20.00, [['PENNY', 0.01], ['NICKEL', 0], ['DIME', 0], ['QUARTER', 0], ['ONE', 0], ['FIVE', 0], ['TEN', 0], ['TWENTY', 0], ['ONE HUNDRED', 0]]), 'Insufficient Funds', 'insufficient funds');",
-        "assert.deepEqual(drawer(19.50, 20.00, [['PENNY', 0.50], ['NICKEL', 0], ['DIME', 0], ['QUARTER', 0], ['ONE', 0], ['FIVE', 0], ['TEN', 0], ['TWENTY', 0], ['ONE HUNDRED', 0]]), \"Closed\", 'cash-in-drawer equals change');"
-      ],
-      "MDNlinks": [
-        "Global Object"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a56138aff60341a09ed6c480",
-      "name": "Bonfire: Inventory Update",
-      "dashedName": "bonfire-inventory-update",
-      "difficulty": "4.04",
-      "description": [
-        "Compare and update inventory stored in a 2d array against a second 2d array of a fresh delivery. Update current inventory item quantity, and if an item cannot be found, add the new item and quantity into the inventory array in alphabetical order.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function inventory(arr1, arr2) {",
-        "    // All inventory must be accounted for or you're fired!",
-        "    return arr1;",
-        "}",
-        "",
-        "// Example inventory lists",
-        "var curInv = [",
-        "    [21, 'Bowling Ball'],",
-        "    [2, 'Dirty Sock'],",
-        "    [1, 'Hair Pin'],",
-        "    [5, 'Microphone']",
-        "];",
-        "",
-        "var newInv = [",
-        "    [2, 'Hair Pin'],",
-        "    [3, 'Half-Eaten Apple'],",
-        "    [67, 'Bowling Ball'],",
-        "    [7, 'Toothpaste']",
-        "];",
-        "",
-        "inventory(curInv, newInv);"
-      ],
-      "tests": [
-        "expect(inventory([[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair Pin'], [5, 'Microphone']], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']])).to.be.a('array');",
-        "assert.equal(inventory([[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair Pin'], [5, 'Microphone']], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']]).length, 6);",
-        "assert.deepEqual(inventory([[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair Pin'], [5, 'Microphone']], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']]), [[88, 'Bowling Ball'], [2, 'Dirty Sock'], [3, 'Hair Pin'], [3, 'Half-Eaten Apple'], [5, 'Microphone'], [7, 'Toothpaste']]);",
-        "assert.deepEqual(inventory([[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair Pin'], [5, 'Microphone']], []), [[21, 'Bowling Ball'], [2, 'Dirty Sock'], [1, 'Hair Pin'], [5, 'Microphone']]);",
-        "assert.deepEqual(inventory([], [[2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [67, 'Bowling Ball'], [7, 'Toothpaste']]), [[67, 'Bowling Ball'], [2, 'Hair Pin'], [3, 'Half-Eaten Apple'], [7, 'Toothpaste']]);",
-        "assert.deepEqual(inventory([[0, 'Bowling Ball'], [0, 'Dirty Sock'], [0, 'Hair Pin'], [0, 'Microphone']], [[1, 'Hair Pin'], [1, 'Half-Eaten Apple'], [1, 'Bowling Ball'], [1, 'Toothpaste']]), [[1, 'Bowling Ball'], [0, 'Dirty Sock'], [1, 'Hair Pin'], [1, 'Half-Eaten Apple'], [0, 'Microphone'], [1, 'Toothpaste']]);"
-      ],
-      "MDNlinks": [
-        "Global Array Object"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a7bf700cd123b9a54eef01d5",
-      "name": "Bonfire: No repeats please",
-      "dashedName": "bonfire-no-repeats-please",
-      "difficulty": "4.05",
-      "description": [
-        "Return the number of total permutations of the provided string that don't have repeated consecutive letters.",
-        "For example, 'aab' should return 2 because it has 6 total permutations, but only 2 of them don't have the same letter (in this case 'a') repeating.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function permAlone(str) {",
-        "  return str;",
-        "}",
-        "",
-        "permAlone('aab');"
-      ],
-      "tests": [
-        "expect(permAlone('aab')).to.be.a('number');",
-        "expect(permAlone('aab')).to.equal(2);",
-        "expect(permAlone('aaa')).to.equal(0);",
-        "expect(permAlone('aabb')).to.equal(8);",
-        "expect(permAlone('abcdefa')).to.equal(3600);",
-        "expect(permAlone('abfdefa')).to.equal(2640);",
-        "expect(permAlone('zzzzzzzz')).to.equal(0);"
-      ],
-      "MDNlinks": [
-        "Permutations",
-        "RegExp"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a19f0fbe1872186acd434d5a",
-      "name": "Bonfire: Friendly Date Ranges",
-      "dashedName": "bonfire-friendly-date-ranges",
-      "difficulty": "4.06",
-      "description": [
-        "Implement a way of converting two dates into a more friendly date range that could be presented to a user.",
-        "It must not show any redundant information in the date range.",
-        "For example, if the year and month are the same then only the day range should be displayed.",
-        "Secondly, if the starting year is the current year, and the ending year can be inferred by the reader, the year should be omitted.",
-        "Input date is formatted as YYYY-MM-DD",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function friendly(str) {",
-        "  return str;",
-        "}",
-        "",
-        "friendly(['2015-07-01', '2015-07-04']);"
-      ],
-      "tests": [
-        "assert.deepEqual(friendly(['2015-07-01', '2015-07-04']), ['July 1st','4th'], 'ending month should be omitted since it is already mentioned');",
-        "assert.deepEqual(friendly(['2015-12-01', '2016-02-03']), ['December 1st','February 3rd'], 'two months apart can be inferred if it is the next year');",
-        "assert.deepEqual(friendly(['2015-12-01', '2017-02-03']), ['December 1st, 2015','February 3rd, 2017']);",
-        "assert.deepEqual(friendly(['2016-03-01', '2016-05-05']), ['March 1st','May 5th'], 'one month apart can be inferred it is the same year');",
-        "assert.deepEqual(friendly(['2017-01-01', '2017-01-01']), ['January 1st, 2017'], 'since we do not duplicate only return once');",
-        "assert.deepEqual(friendly(['2022-09-05', '2023-09-04']), ['September 5th, 2022','September 4th, 2023']);"
-      ],
-      "MDNlinks": [
-        "String.split()",
-        "String.substr()",
-        "parseInt()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    }
-  ]
-}
diff --git a/nap/data/seed/challenges/intermediate-bonfires.json b/nap/data/seed/challenges/intermediate-bonfires.json
deleted file mode 100644
index 184a648..0000000
--- a/nap/data/seed/challenges/intermediate-bonfires.json
+++ /dev/null
@@ -1,816 +0,0 @@
-{
-  "name": "Intermediate Algorithm Scripting",
-  "order": 0.009,
-  "challenges": [
-    {
-      "id": "a3566b1109230028080c9345",
-      "name": "Bonfire: Sum All Numbers in a Range",
-      "dashedName": "bonfire-sum-all-numbers-in-a-range",
-      "difficulty": "2.00",
-      "description": [
-        "We'll pass you an array of two numbers. Return the sum of those two numbers and all numbers between them.",
-        "The lowest number will not always come first.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function sumAll(arr) {",
-        "  return(1);",
-        "}",
-        "",
-        "sumAll([1, 4]);"
-      ],
-      "tests": [
-        "expect(sumAll([1, 4])).to.be.a('Number');",
-        "expect(sumAll([1, 4])).to.equal(10);",
-        "expect(sumAll([4, 1])).to.equal(10);",
-        "expect(sumAll([5, 10])).to.equal(45);",
-        "expect(sumAll([10, 5])).to.equal(45);"
-      ],
-      "MDNlinks": [
-        "Math.max()",
-        "Math.min()",
-        "Array.reduce()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a5de63ebea8dbee56860f4f2",
-      "name": "Bonfire: Diff Two Arrays",
-      "dashedName": "bonfire-diff-two-arrays",
-      "difficulty": "2.01",
-      "description": [
-        "Compare two arrays and return a new array with any items not found in both of the original arrays.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function diff(arr1, arr2) {",
-        "  var newArr = [];",
-        "  // Same, same; but different.",
-        "  return newArr;",
-        "}",
-        "",
-        "diff([1, 2, 3, 5], [1, 2, 3, 4, 5]);"
-      ],
-      "tests": [
-        "expect(diff([1, 2, 3, 5], [1, 2, 3, 4, 5])).to.be.a('array');",
-        "assert.deepEqual(diff(['diorite', 'andesite', 'grass', 'dirt', 'pink wool', 'dead shrub'], ['diorite', 'andesite', 'grass', 'dirt', 'dead shrub']), ['pink wool'], 'arrays with only one difference');",
-        "assert.includeMembers(diff(['andesite', 'grass', 'dirt', 'pink wool', 'dead shrub'], ['diorite', 'andesite', 'grass', 'dirt', 'dead shrub']), ['diorite', 'pink wool'], 'arrays with more than one difference');",
-        "assert.deepEqual(diff(['andesite', 'grass', 'dirt', 'dead shrub'], ['andesite', 'grass', 'dirt', 'dead shrub']), [], 'arrays with no difference');",
-        "assert.deepEqual(diff([1, 2, 3, 5], [1, 2, 3, 4, 5]), [4], 'arrays with numbers');",
-        "assert.includeMembers(diff([1, 'calf', 3, 'piglet'], [1, 'calf', 3, 4]), ['piglet', 4], 'arrays with numbers and strings');",
-        "assert.deepEqual(diff([], ['snuffleupagus', 'cookie monster', 'elmo']), ['snuffleupagus', 'cookie monster', 'elmo'], 'empty array');"
-      ],
-      "MDNlinks": [
-        "Comparison Operators",
-        "String.slice()",
-        "Array.filter()",
-        "Array.indexOf()",
-        "String.concat()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a7f4d8f2483413a6ce226cac",
-      "name": "Bonfire: Roman Numeral Converter",
-      "dashedName": "bonfire-roman-numeral-converter",
-      "tests": [
-        "expect(convert(12)).to.equal(\"XII\");",
-        "expect(convert(5)).to.equal(\"V\");",
-        "expect(convert(9)).to.equal(\"IX\");",
-        "expect(convert(29)).to.equal(\"XXIX\");",
-        "expect(convert(16)).to.equal(\"XVI\");"
-      ],
-      "difficulty": "2.02",
-      "description": [
-        "Convert the given number into a roman numeral.",
-        "All <a href=\"http://www.mathsisfun.com/roman-numerals.html\" target=\"_blank\">roman numerals</a> answers should be provided in upper-case.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function convert(num) {",
-        " return num;",
-        "}",
-        "",
-        "convert(36);"
-      ],
-      "MDNlinks": [
-        "Array.splice()",
-        "Array.indexOf()",
-        "Array.join()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a0b5010f579e69b815e7c5d6",
-      "name": "Bonfire: Search and Replace",
-      "dashedName": "bonfire-search-and-replace",
-      "tests": [
-        "expect(replace(\"Let us go to the store\", \"store\", \"mall\")).to.equal(\"Let us go to the mall\");",
-        "expect(replace(\"He is Sleeping on the couch\", \"Sleeping\", \"sitting\")).to.equal(\"He is Sitting on the couch\");",
-        "expect(replace(\"This has a spellngi error\", \"spellngi\", \"spelling\")).to.equal(\"This has a spelling error\");",
-        "expect(replace(\"His name is Tom\", \"Tom\", \"john\")).to.equal(\"His name is John\");",
-        "expect(replace(\"Let us get back to more Coding\", \"Coding\", \"bonfires\")).to.equal(\"Let us get back to more Bonfires\");"
-      ],
-      "difficulty": "2.03",
-      "description": [
-        "Perform a search and replace on the sentence using the arguments provided and return the new sentence.",
-        "First argument is the sentence to perform the search and replace on.",
-        "Second argument is the word that you will be replacing (before).",
-        "Third argument is what you will be replacing the second argument with (after).",
-        "NOTE: Preserve the case of the original word when you are replacing it. For example if you mean to replace the word 'Book' with the word 'dog', it should be replaced as 'Dog'",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function replace(str, before, after) {",
-        " return str;",
-        "}",
-        "",
-        "replace(\"A quick brown fox jumped over the lazy dog\", \"jumped\", \"leaped\");"
-      ],
-      "MDNlinks": [
-        "Array.splice()",
-        "String.replace()",
-        "Array.join()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "aa7697ea2477d1316795783b",
-      "name": "Bonfire: Pig Latin",
-      "dashedName": "bonfire-pig-latin",
-      "tests": [
-        "expect(translate(\"california\")).to.equal(\"aliforniacay\");",
-        "expect(translate(\"paragraphs\")).to.equal(\"aragraphspay\");",
-        "expect(translate(\"glove\")).to.equal(\"oveglay\");",
-        "expect(translate(\"algorithm\")).to.equal(\"algorithmway\");",
-        "expect(translate(\"eight\")).to.equal(\"eightway\");"
-      ],
-      "difficulty": "2.04",
-      "description": [
-        "Translate the provided string to pig latin.",
-        "<a href=\"http://en.wikipedia.org/wiki/Pig_Latin\">Pig Latin</a> takes the first consonant (or consonant cluster) of an English word, moves it to the end of the word and suffixes an \"ay\".",
-        "If a word begins with a vowel you just add \"way\" to the end.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function translate(str) {",
-        " return str;",
-        "}",
-        "",
-        "translate(\"consonant\");"
-      ],
-      "MDNlinks": [
-        "Array.indexOf()",
-        "Array.push()",
-        "Array.join()",
-        "String.substr()",
-        "String.split()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "afd15382cdfb22c9efe8b7de",
-      "name": "Bonfire: DNA Pairing",
-      "dashedName": "bonfire-dna-pairing",
-      "tests": [
-        "assert.deepEqual(pair(\"ATCGA\"),[['A','T'],['T','A'],['C','G'],['G','C'],['A','T']], 'should return the dna pair');",
-        "assert.deepEqual(pair(\"TTGAG\"),[['T','A'],['T','A'],['G','C'],['A','T'],['G','C']], 'should return the dna pair');",
-        "assert.deepEqual(pair(\"CTCTA\"),[['C','G'],['T','A'],['C','G'],['T','A'],['A','T']], 'should return the dna pair');"
-      ],
-      "difficulty": "2.05",
-      "description": [
-        "The DNA strand is missing the pairing element. Match each character with the missing element and return the results as a 2d array.",
-        "<a href=\"http://en.wikipedia.org/wiki/Base_pair\">Base pairs</a> are a pair of AT and CG. Match the missing element to the provided character.",
-        "Return the provided character as the first element in each array.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function pair(str) {",
-        " return str;",
-        "}",
-        "",
-        "pair(\"GCG\");"
-      ],
-      "MDNlinks": [
-        "Array.push()",
-        "String.split()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "af7588ade1100bde429baf20",
-      "name": "Bonfire: Missing letters",
-      "dashedName": "bonfire-missing-letters",
-      "difficulty": "2.05",
-      "description": [
-        "Find the missing letter in the passed letter range and return it.",
-        "If all letters are present in the range, return undefined.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function fearNotLetter(str) {",
-        "  return str;",
-        "}",
-        "",
-        "fearNotLetter('abce');"
-      ],
-      "tests": [
-        "expect(fearNotLetter('abce')).to.equal('d');",
-        "expect(fearNotLetter('bcd')).to.be.undefined;",
-        "expect(fearNotLetter('abcdefghjklmno')).to.equal('i');",
-        "expect(fearNotLetter('yz')).to.be.undefined;"
-      ],
-      "MDNlinks": [
-        "String.charCodeAt()",
-        "String.fromCharCode()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a77dbc43c33f39daa4429b4f",
-      "name": "Bonfire: Boo who",
-      "dashedName": "bonfire-boo-who",
-      "difficulty": "2.06",
-      "description": [
-        "Check if a value is classified as a boolean primitive. Return true or false.",
-        "Boolean primitives are true and false.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function boo(bool) {",
-        "  // What is the new fad diet for ghost developers? The Boolean.",
-        "  return bool;",
-        "}",
-        "",
-        "boo(null);"
-      ],
-      "tests": [
-        "assert.strictEqual(boo(true), true);",
-        "assert.strictEqual(boo(false), true);",
-        "assert.strictEqual(boo([1, 2, 3]), false);",
-        "assert.strictEqual(boo([].slice), false);",
-        "assert.strictEqual(boo({ 'a': 1 }), false);",
-        "assert.strictEqual(boo(1), false);",
-        "assert.strictEqual(boo(NaN), false);",
-        "assert.strictEqual(boo('a'), false);"
-      ],
-      "MDNlinks": [
-        "Boolean Objects"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a105e963526e7de52b219be9",
-      "name": "Bonfire: Sorted Union",
-      "dashedName": "bonfire-sorted-union",
-      "difficulty": "2.07",
-      "description": [
-        "Write a function that takes two or more arrays and returns a new array of unique values in the order of the original provided arrays.",
-        "In other words, all values present from all arrays should be included in their original order, but with no duplicates in the final array.",
-        "The unique numbers should be sorted by their original order, but the final array should not be sorted in numerical order.",
-        "Check the assertion tests for examples.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function unite(arr1, arr2, arr3) {",
-        "  return arr1;",
-        "}",
-        "",
-        "unite([1, 3, 2], [5, 2, 1, 4], [2, 1]);"
-      ],
-      "tests": [
-        "assert.deepEqual(unite([1, 3, 2], [5, 2, 1, 4], [2, 1]), [1, 3, 2, 5, 4], 'should return the union of the given arrays');",
-        "assert.deepEqual(unite([1, 3, 2], [1, [5]], [2, [4]]), [1, 3, 2, [5], [4]], 'should not flatten nested arrays');",
-        "assert.deepEqual(unite([1, 2, 3], [5, 2, 1]), [1, 2, 3, 5], 'should correctly handle exactly two arguments');",
-        "assert.deepEqual(unite([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8]), [ 1, 2, 3, 5, 4, 6, 7, 8 ], 'should correctly handle higher numbers of arguments');"
-      ],
-      "MDNlinks": [
-        "Arguments object",
-        "Array.reduce()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a6b0bb188d873cb2c8729495",
-      "name": "Bonfire: Convert HTML Entities",
-      "dashedName": "bonfire-convert-html-entities",
-      "difficulty": "2.07",
-      "description": [
-        "Convert the characters \"&\", \"<\", \">\", '\"' (double quote), and \"'\" (apostrophe), in a string to their corresponding HTML entities.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function convert(str) {",
-        "  // &colon;&rpar;",
-        "  return str;",
-        "}",
-        "",
-        "convert('Dolce & Gabbana');"
-      ],
-      "tests": [
-        "assert.strictEqual(convert('Dolce & Gabbana'), 'Dolce &amp; Gabbana', 'should escape characters');",
-        "assert.strictEqual(convert('Hamburgers < Pizza < Tacos'), 'Hamburgers &lt; Pizza &lt; Tacos', 'should escape characters');",
-        "assert.strictEqual(convert('Sixty > twelve'), 'Sixty &gt; twelve', 'should escape characters');",
-        "assert.strictEqual(convert('Stuff in \"quotation marks\"'), 'Stuff in &quot;quotation marks&quot;', 'should escape characters');",
-        "assert.strictEqual(convert(\"Shindler's List\"), 'Shindler&apos;s List', 'should escape characters');",
-        "assert.strictEqual(convert('<>'), '&lt;&gt;', 'should escape characters');",
-        "assert.strictEqual(convert('abc'), 'abc', 'should handle strings with nothing to escape');"
-      ],
-      "MDNlinks": [
-        "RegExp",
-        "HTML Entities"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a103376db3ba46b2d50db289",
-      "name": "Bonfire: Spinal Tap Case",
-      "dashedName": "bonfire-spinal-tap-case",
-      "difficulty": "2.08",
-      "description": [
-        "Convert a string to spinal case. Spinal case is all-lowercase-words-joined-by-dashes.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function spinalCase(str) {",
-        "  // \"It's such a fine line between stupid, and clever.\"",
-        "  // --David St. Hubbins",
-        "  return str;",
-        "}",
-        "",
-        "spinalCase('This Is Spinal Tap');"
-      ],
-      "tests": [
-        "assert.strictEqual(spinalCase('This Is Spinal Tap'), 'this-is-spinal-tap', 'should return spinal case from string with spaces');",
-        "assert.strictEqual(spinalCase('thisIsSpinalTap'), 'this-is-spinal-tap', 'should return spinal case from string with camel case');",
-        "assert.strictEqual(spinalCase('The_Andy_Griffith_Show'), 'the-andy-griffith-show', 'should return spinal case from string with snake case');",
-        "assert.strictEqual(spinalCase('Teletubbies say Eh-oh'), 'teletubbies-say-eh-oh', 'should return spinal case from string with spaces and hyphens');"
-      ],
-      "MDNlinks": [
-        "RegExp",
-        "String.replace()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a5229172f011153519423690",
-      "name": "Bonfire: Sum All Odd Fibonacci Numbers",
-      "dashedName": "bonfire-sum-all-odd-fibonacci-numbers",
-      "difficulty": "2.09",
-      "description": [
-        "Return the sum of all odd Fibonacci numbers up to and including the passed number if it is a Fibonacci number.",
-        "The first few numbers of the Fibonacci sequence are 1, 1, 2, 3, 5 and 8, and each subsequent number is the sum of the previous two numbers.",
-        "As an example, passing 4 to the function should return 5 because all the odd Fibonacci numbers under 4 are 1, 1, and 3.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function sumFibs(num) {",
-        "  return num;",
-        "}",
-        "",
-        "sumFibs(4);"
-      ],
-      "tests": [
-        "expect(sumFibs(1)).to.be.a('number');",
-        "expect(sumFibs(1000)).to.equal(1785);",
-        "expect(sumFibs(4000000)).to.equal(4613732);",
-        "expect(sumFibs(4)).to.equal(5);",
-        "expect(sumFibs(75024)).to.equal(60696);",
-        "expect(sumFibs(75025)).to.equal(135721);"
-      ],
-      "MDNlinks": [
-        "Remainder"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a3bfc1673c0526e06d3ac698",
-      "name": "Bonfire: Sum All Primes",
-      "dashedName": "bonfire-sum-all-primes",
-      "difficulty": "2.10",
-      "description": [
-        "Sum all the prime numbers up to and including the provided number.",
-        "A prime number is defined as having only two divisors, 1 and itself. For example, 2 is a prime number because it's only divisible by 1 and 2. 1 isn't a prime number, because it's only divisible by itself.",
-        "The provided number may not be a prime.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function sumPrimes(num) {",
-        "  return num;",
-        "}",
-        "",
-        "sumPrimes(10);"
-      ],
-      "tests": [
-        "expect(sumPrimes(10)).to.be.a('number');",
-        "expect(sumPrimes(10)).to.equal(17);",
-        "expect(sumPrimes(977)).to.equal(73156);"
-      ],
-      "MDNlinks": [
-        "For Loops",
-        "Array.push()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "ae9defd7acaf69703ab432ea",
-      "name": "Bonfire: Smallest Common Multiple",
-      "dashedName": "bonfire-smallest-common-multiple",
-      "difficulty": "2.11",
-      "description": [
-        "Find the smallest number that is evenly divisible by all numbers in the provided range.",
-        "The range will be an array of two numbers that will not necessarily be in numerical order.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function smallestCommons(arr) {",
-        "  return arr;",
-        "}",
-        "",
-        "",
-        "smallestCommons([1,5]);"
-      ],
-      "tests": [
-        "expect(smallestCommons([1,5])).to.be.a('number');",
-        "expect(smallestCommons([1,5])).to.equal(60);",
-        "expect(smallestCommons([5,1])).to.equal(60);",
-        "expect(smallestCommons([1,13])).to.equal(360360);"
-      ],
-      "MDNlinks": [
-        "Smallest Common Multiple"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a6e40f1041b06c996f7b2406",
-      "name": "Bonfire: Finders Keepers",
-      "dashedName": "bonfire-finders-keepers",
-      "difficulty": "2.12",
-      "description": [
-        "Create a function that looks through an array (first argument) and returns the first element in the array that passes a truth test (second argument).",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function find(arr, func) {",
-        "  var num = 0;",
-        "  return num;",
-        "}",
-        "",
-        "find([1, 2, 3, 4], function(num){ return num % 2 === 0; });"
-      ],
-      "tests": [
-        "assert.strictEqual(find([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; }), 8, 'should return first found value');",
-        "assert.strictEqual(find([1, 3, 5, 9], function(num) { return num % 2 === 0; }), undefined, 'should return undefined if not found');"
-      ],
-      "MDNlinks": [
-        "Array.some()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a5deed1811a43193f9f1c841",
-      "name": "Bonfire: Drop it",
-      "dashedName": "bonfire-drop-it",
-      "difficulty": "2.13",
-      "description": [
-        "Drop the elements of an array (first argument), starting from the front, until the predicate (second argument) returns true.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function drop(arr, func) {",
-        "  // Drop them elements.",
-        "  return arr;",
-        "}",
-        "",
-        "drop([1, 2, 3], function(n) {return n < 3; });"
-      ],
-      "tests": [
-        "expect(drop([1, 2, 3, 4], function(n) {return n >= 3; })).to.eqls([3, 4]);",
-        "expect(drop([1, 2, 3], function(n) {return n > 0; })).to.eqls([1, 2, 3]);",
-        "expect(drop([1, 2, 3, 4], function(n) {return n > 5; })).to.eqls([]);"
-      ],
-      "MDNlinks": [
-        "Arguments object",
-        "Array.shift()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "ab306dbdcc907c7ddfc30830",
-      "name": "Bonfire: Steamroller",
-      "dashedName": "bonfire-steamroller",
-      "difficulty": "2.14",
-      "description": [
-        "Flatten a nested array. You must account for varying levels of nesting.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function steamroller(arr) {",
-        "  // I'm a steamroller, baby",
-        "  return arr;",
-        "}",
-        "",
-        "steamroller([1, [2], [3, [[4]]]]);"
-      ],
-      "tests": [
-        "assert.deepEqual(steamroller([[['a']], [['b']]]), ['a', 'b'], 'should flatten nested arrays');",
-        "assert.deepEqual(steamroller([1, [2], [3, [[4]]]]), [1, 2, 3, 4], 'should flatten nested arrays');",
-        "assert.deepEqual(steamroller([1, [], [3, [[4]]]]), [1, 3, 4], 'should work with empty arrays');",
-        "assert.deepEqual(steamroller([1, {}, [3, [[4]]]]), [1, {}, 3, 4], 'should work with actual objects');"
-      ],
-      "MDNlinks": [
-        "Array.isArray()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a8d97bd4c764e91f9d2bda01",
-      "name": "Bonfire: Binary Agents",
-      "dashedName": "bonfire-binary-agents",
-      "difficulty": "2.15",
-      "description": [
-        "Return an English translated sentence of the passed binary string.",
-        "The binary string will be space separated.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function binaryAgent(str) {",
-        "  return str;",
-        "}",
-        "",
-        "binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111');"
-      ],
-      "tests": [
-        "expect(binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111')).to.equal(\"Aren't bonfires fun!?\");",
-        "expect(binaryAgent('01001001 00100000 01101100 01101111 01110110 01100101 00100000 01000110 01110010 01100101 01100101 01000011 01101111 01100100 01100101 01000011 01100001 01101101 01110000 00100001')).to.equal(\"I love FreeCodeCamp!\");"
-      ],
-      "MDNlinks": [
-        "String.charCodeAt()",
-        "String.fromCharCode()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a10d2431ad0c6a099a4b8b52",
-      "name": "Bonfire: Everything Be True",
-      "dashedName": "bonfire-everything-be-true",
-      "difficulty": "2.21",
-      "description": [
-        "Check if the predicate (second argument) returns truthy (defined) for all elements of a collection (first argument).",
-        "For this, check to see if the property defined in the second argument is present on every element of the collection.",
-        "Remember, you can access object properties through either dot notation or [] notation.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function every(collection, pre) {",
-        "  // Does everyone have one of these?",
-        "  return pre;",
-        "}",
-        "",
-        "every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], 'sex');"
-      ],
-      "tests": [
-        "assert.strictEqual(every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], 'sex'), true, 'should return true if predicate returns truthy for all elements in the collection');",
-        "assert.strictEqual(every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], {'sex': 'female'}), false, 'should return false if predicate returns falsey for any element in the collection');",
-        "assert.strictEqual(every([{'user': 'Tinky-Winky', 'sex': 'female'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], {'sex': 'female'}), false, 'should return false if predicate returns falsey for any element in the collection');"
-
-      ],
-      "MDNlinks": [
-        "Object.hasOwnProperty()",
-        "Object.getOwnPropertyNames()"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    },
-    {
-      "id": "a97fd23d9b809dac9921074f",
-      "name": "Bonfire: Arguments Optional",
-      "dashedName": "bonfire-arguments-optional",
-      "difficulty": "2.22",
-      "description": [
-        "Create a function that sums two arguments together. If only one argument is provided, return a function that expects one additional argument and will return the sum.",
-        "For example, add(2, 3) should return 5, and add(2) should return a function that is waiting for an argument so that <code>var sum2And = add(2); return sum2And(3); // 5</code>",
-        "If either argument isn't a valid number, return undefined.",
-        "Remember to use <a href='//github.com/FreeCodeCamp/freecodecamp/wiki/How-to-get-help-when-you-get-stuck' target='_blank'>RSAP</a> if you get stuck. Try to pair program. Write your own code."
-      ],
-      "challengeSeed": [
-        "function add() {",
-        "  return false;",
-        "}",
-        "",
-        "add(2,3);"
-      ],
-      "tests": [
-        "expect(add(2, 3)).to.equal(5);",
-        "expect(add(2)(3)).to.equal(5);",
-        "expect(add('http://bit.ly/IqT6zt')).to.be.undefined;",
-        "expect(add(2, '3')).to.be.undefined;",
-        "expect(add(2)([3])).to.be.undefined;"
-      ],
-      "MDNlinks": [
-        "Global Function Object",
-        "Arguments object"
-      ],
-      "challengeType": 5,
-      "nameCn": "",
-      "descriptionCn": [],
-      "nameFr": "",
-      "descriptionFr": [],
-      "nameRu": "",
-      "descriptionRu": [],
-      "nameEs": "",
-      "descriptionEs": [],
-      "namePt": "",
-      "descriptionPt": []
-    }
-  ]
-}
diff --git a/nap/data/wiki/5-Steps-to-organizing-a-successful-Campsite-event..md b/nap/data/wiki/5-Steps-to-organizing-a-successful-Campsite-event..md
deleted file mode 100644
index 13def03..0000000
--- a/nap/data/wiki/5-Steps-to-organizing-a-successful-Campsite-event..md
+++ /dev/null
@@ -1,18 +0,0 @@
-# In-person group programming sessions and events are fun! 
-
-## This Wiki will help you with organizing a successful Campsite event.
-
-### With a little planning and communication having a successful Campsite event can be easy! Here are some steps to help you in doing this.
-###  
-
-* Determine the topic for the event (code and coffee, hack session, invite campers to another organization's event).
-
-* Find a suitable location. Campsite events should always take place in a public space (library, cafe, hackerspace).
-
-* Create an event on your Campsite's Facebook page for the event, and link to it on your Campsite Facebook Group page.
-
-* Follow-up with reminder posts for the event 1 week prior to the event and then again the day before the event.
-
-* On the day of the event arrive early, get setup, greet members, and kick the event off. Don't forget to thank everyone afterwards and extend invites to future meetups.
-
-**Try to take some pictures and post them on your Campsite's Facebook group page.**
diff --git a/nap/data/wiki/Accessing-the-database-from-your-frontend.md b/nap/data/wiki/Accessing-the-database-from-your-frontend.md
deleted file mode 100644
index fe66434..0000000
--- a/nap/data/wiki/Accessing-the-database-from-your-frontend.md
+++ /dev/null
@@ -1,13 +0,0 @@
-You must have noticed in **main.controller.js** how *things* were retrieved from the database and displayed:
-  
-~~~javascript
- $http.get('/api/things').success(function(awesomeThings){  
-	$scope.awesomeThings = awesomeThings;  
-});
-
-~~~  
-
-What this does is call the api with a “get” request, which is then routed by **/server/api/thing/index.js** to the *exports.index* function in **thing.controller.js**. You’ll also notice in **main.controller.js** that there are included examples of *$http.post* and *$http.delete* functions too! How nice!  
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Fixing-exports.update)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Seed-data)
\ No newline at end of file
diff --git a/nap/data/wiki/Adding-Environment-Variables.md b/nap/data/wiki/Adding-Environment-Variables.md
deleted file mode 100644
index ba03c81..0000000
--- a/nap/data/wiki/Adding-Environment-Variables.md
+++ /dev/null
@@ -1,9 +0,0 @@
-1. Download [Varpanel](http://implbits.com/products/varpanel/).
-2. Open Varpanel.
-3. In PATH variable, add the relevant path.
-
-![](http://i.imgur.com/RqgGcf5.gif)
-
-## []()
-
-Easy Launch Programs using [Launchy](http://www.launchy.net/) App.
\ No newline at end of file
diff --git a/nap/data/wiki/Angular-Resources.md b/nap/data/wiki/Angular-Resources.md
deleted file mode 100644
index b7e7cbf..0000000
--- a/nap/data/wiki/Angular-Resources.md
+++ /dev/null
@@ -1,14 +0,0 @@
-A collection of helpful Angular resources
-
-### General Pages
-* [Angular JS](https://angularjs.org/) - The Angular JS Homepage
-* [Angular Style Guide](https://github.com/johnpapa/angular-styleguide) - Detailed best practices for Angular Development
-
-### Specific-topic Pages
-* [Directives](http://www.sitepoint.com/practical-guide-angularjs-directives/) - Excellent guide going into detail on Angular Directives (Part 1)
-* [Directives](http://www.sitepoint.com/practical-guide-angularjs-directives-part-two/) - Excellent guide going into detail on Angular Directives (Part 2)
-
-### Videos
-* [Routing in Angular JS](https://www.youtube.com/watch?v=5uhZCc0j9RY) - Client Side Routing in 15 minutes
-* [Angular ToDo App](https://www.youtube.com/watch?v=WuiHuZq_cg4) - An Angular ToDo app in 12 minutes
-* [Shaping Up with Angular.JS](https://www.codeschool.com/courses/shaping-up-with-angular-js) - A free Angular.JS tutorial
\ No newline at end of file
diff --git a/nap/data/wiki/August-2015-Improvements.md b/nap/data/wiki/August-2015-Improvements.md
deleted file mode 100644
index c4670e6..0000000
--- a/nap/data/wiki/August-2015-Improvements.md
+++ /dev/null
@@ -1,28 +0,0 @@
-### Email login and password reset is fixed!
-
-If you have any issues with Free Code Camp, please let us know: https://github.com/freecodecamp/freecodecamp/issues/new
-
-## Sunday's Improvements
-* replaced our getting-started videos with a simple 10-minute process (using GIFs instead of videos)
-* doubled the number of our HTML5 and Bootstrap challenges
-* replaced Codecademy's JavaScript and jQuery challenges with our own challenges
-* added our own Object-oriented Programming and Functional Programming challenges
-* added two new Zipline front end challenges (Personal Portfolio and Simon game), and moved our Ziplines to much earlier in our curriculum
-* completely replaced our Field Guide with a searchable, and easily-editable open-source wiki
-* made it so your Bonfire code is stored in your browser, so if you leave the page, your code will be there when you come back
-* simplified our portfolio pages. You can now click a single button to mirror your Free Code Camp profile with your GitHub profile. Bonfire solutions are no longer shown here, but they'll eventually be accessible through our API.
-* fixed some issues with Brownie Points and Streaks
-* improved our Camper News page by removing the (mostly unused) comments and adding one-click upvoting
-* added a Creative Commons license to literally all of our images and text
-* thanks to Loopback, everything is now an API, and we will soon publish cool ways to interact with Free Code Camp's (non-sensitive) data
-
-## FAQ
-
-### The challenge I was most recently doing disappeared.
-You can just keep going. If you have time to go back and try our new challenges, they should be a quick review for you. Otherwise, keep moving forward.
-
-### Why are you deploying all these improvements at once?
-We've been working on some of the features for months on our Staging branch. Most of them were held up by a single task: our transition to [Loopback](http://loopback.io/). @BerkeleyTrue started working on this back in March. 
-
-### Was deploying everything at once necessary?
-Probably not. Going forward, we will deploy new code several times a day (as we did prior to the Loopback feature). We plan to start using a [continuous integration](https://en.wikipedia.org/wiki/Continuous_integration) and other agile best practices as we reduce our [technical debt](https://en.wikipedia.org/wiki/Technical_debt).
diff --git a/nap/data/wiki/August-Live-Stream.md b/nap/data/wiki/August-Live-Stream.md
deleted file mode 100644
index af64e12..0000000
--- a/nap/data/wiki/August-Live-Stream.md
+++ /dev/null
@@ -1,20 +0,0 @@
-### Free Code Camp's [August Live Stream] (https://youtu.be/UhoxoYrJ6Qs) was the largest yet.
-
-## The agenda included:
-
-- Opening words Michael
-- New front end challenges [3:00] (https://youtu.be/UhoxoYrJ6Qs?t=3m)
-- Newly configured full-stack challenges
-- New Nonprofit Projects [12:32] (https://youtu.be/UhoxoYrJ6Qs?t=12m32s)
-- Wiki [22:49] (https://youtu.be/UhoxoYrJ6Qs?t=22m49s)
-- New chat rooms [29:40] (https://youtu.be/UhoxoYrJ6Qs?t=29m40s)
-- New Live Streams [35:34] (https://youtu.be/UhoxoYrJ6Qs?t=35m34s)
-- New Internet Radio Station DJ'd by campers [36:30] (https://youtu.be/UhoxoYrJ6Qs?t=36m30s)
-- FCC Bot [39:24] (https://youtu.be/UhoxoYrJ6Qs?t=39m24s)
-- Matt Yamamoto Zipline Demo [54:24] (https://youtu.be/UhoxoYrJ6Qs?t=54m24s)
-- Closing from Quincy [1:04:15] (https://youtu.be/UhoxoYrJ6Qs?t=1h4m15s)
-- [Pull Request After Party with Quincy] (https://youtu.be/r0lCJ_TFYlI)
-
-<a href="http://www.youtube.com/watch?feature=player_embedded&v=UhoxoYrJ6Qs
-" target="_blank"><img src="https://www.evernote.com/l/AnvmsUWWNeJFNbfm7fDa7SRLmnbn7jafRL4B/image.png" 
-alt="Screen shot from our twitch feed on August 1 2015" width="560" height="315"border="10" /></a>
\ No newline at end of file
diff --git a/nap/data/wiki/Backend-file-structure.md b/nap/data/wiki/Backend-file-structure.md
deleted file mode 100644
index 1124170..0000000
--- a/nap/data/wiki/Backend-file-structure.md
+++ /dev/null
@@ -1,9 +0,0 @@
-Your app’s backend api that interacts with your database is located in **/server/api**  
-Let’s take a look at **/server/api/thing**: 
-
-1. **index.js**:  this file routes the $http API requests made from your app’s front-end to the appropriate function in **thing.controller.js ** 
-2. **thing.controller.js**: Here is where we actually deal with the database! Take a minute to look through here and figure out what’s going on. These functions will: return all items in a collection, return a single item from a collection when passed its id, post an item to a collection, update an item in the collection (this doesn’t really work as intended out of the box, we're going to fix that in a minute), and of course, delete an item from the collection.  
-3. **thing.model.js**: Here, the actual structure of a *thing* object is defined. You can add or remove any fields you want from the *thing* model, and as long as they’re syntactically correct they won’t break anything, even if there are *things* with different schemas in your database already. But! You don’t just have to edit the *thing* model to make a new type of collection, because generator-angular-fullstack can do it for you!
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Grunt)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-API-endpoint)
\ No newline at end of file
diff --git a/nap/data/wiki/Basejump-Resources.md b/nap/data/wiki/Basejump-Resources.md
deleted file mode 100644
index 217dd98..0000000
--- a/nap/data/wiki/Basejump-Resources.md
+++ /dev/null
@@ -1,30 +0,0 @@
-The curriculum lead-up to the first Basejump is not very comprehensive.  Here are a number of common resources which other campers have found helpful.
-
-### Getting Started with Yeoman
-* https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Intro-to-Yeoman-Angular-Fullstack-Basejumps - Lots of helpful tips and tricks for the Yeoman Angular Fullstack setup
-* https://github.com/DaftMonk/generator-angular-fullstack#generators - Generator used by Yeoman, you can find syntax and what files it creates
-
-### APIs
-* API for Charting the stock market: https://www.quandl.com/help/api
-
-### MEAN Stack Videos
-* https://www.youtube.com/watch?v=kHV7gOHvNdk - 5 Part Series on setting up a MEAN stack
-
-### MEAN Stack Tutorials
-* Clementine is a stripped down MEAN stack, great for learning the fundamentals.  
-https://johnstonbl01.github.io/clementinejs/tutorials/tutorial-beginner.html
-
-* Authentication with Passport for the MEAN stack:
-https://vickev.com/#!/article/authentication-in-single-page-applications-node-js-passportjs-angularjs
-
-* An amazing list of resources for learning the MEAN stack:
-https://github.com/ericdouglas/MEAN-Learning
-
-### Scotch IO Tutorials
-* https://scotch.io/tutorials/setting-up-a-mean-stack-single-page-application   
-* https://scotch.io/tutorials/node-and-angular-to-do-app-application-organization-and-structure
-
-### Cloud 9 Tricks
-##### Speed up browser reloads
-1. Open gruntfile.js and edit both instances of `livereload: true` to `livereload: false`.
-2. Open server/config/express.js and comment out the line `app.use(require('connect-livereload')());`
\ No newline at end of file
diff --git a/nap/data/wiki/Bobby-Tables.md b/nap/data/wiki/Bobby-Tables.md
deleted file mode 100644
index 12c93b4..0000000
--- a/nap/data/wiki/Bobby-Tables.md
+++ /dev/null
@@ -1,2 +0,0 @@
-![Her daughter is named Help I'm trapped in a driver's license factory](https://imgs.xkcd.com/comics/exploits_of_a_mom.png)  
-*Source:[xkcd](https://xkcd.com/327/)*
diff --git a/nap/data/wiki/Bonfire Meet Bonfire.md b/nap/data/wiki/Bonfire Meet Bonfire.md
deleted file mode 100644
index dac0aac..0000000
--- a/nap/data/wiki/Bonfire Meet Bonfire.md	
+++ /dev/null
@@ -1,32 +0,0 @@
-# Explanation:
-This is very simple, they just want you to get familiar with how their Bonfires work.
-
-## Hint: 1
-Read details.
-
-## Hint: 2
-Did you read all the details?
-
-## Hint: 3
-You need to change the return statement to what they ask.
-
-## Spoiler Alert!
-[![687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/thumb/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)
-
-**Solution ahead!**
-
-## Solution Code:
-
-```
-function meetBonfire(argument) {
-  // Good luck!
-  console.log("you can read this function's argument in the developer tools", argument);
-
-  return true;
-}
-
-meetBonfire("You can do this!");
-```
-
-## Code Explanation:
-All you had to do was change from false to true.
diff --git a/nap/data/wiki/Bonfire-Factorialize-a-Number.md b/nap/data/wiki/Bonfire-Factorialize-a-Number.md
deleted file mode 100644
index d48b3d8..0000000
--- a/nap/data/wiki/Bonfire-Factorialize-a-Number.md
+++ /dev/null
@@ -1,93 +0,0 @@
-You should make sure to try hard to solve the Bonfire yourself before reading this!
-# :link: [Original Bonfire](http://www.freecodecamp.com/challenges/bonfire-factorialize-a-number) :point_right:  
-
-## Author
-![Luis](https://avatars3.githubusercontent.com/u/6039444?v=3&s=96) submitted by [luishendrix92](//freecodecamp.com/luishendrix92) | https://github.com/luishendrix92
-
-## The problem
-Return the factorial of the provided integer.
-If the integer is represented with the letter n, a factorial is the product of all positive integers less than or equal to n.
-
-Factorials are often represented with the shorthand notation n!
-
-For example: `5! = 1 * 2 * 3 * 4 * 5 = 120f`
-
-## Analysis
-Return the factorial of the provided integer.
-If the integer is represented with the letter n, a factorial is the product of all positive integers less than or equal to n.
-Factorials are often represented with the shorthand notation n!
-For example: 5! = 1 * 2 * 3 * 4 * 5 = 120
-
-## Outline
-This one is simple, since the factorials of both 0 and 1 is just 1, you can go ahead and return 1. The IF function here is responsible for breaking the loop I created using a **recursive function**, first it checks if the number you gave the function is 0 or 1 and then returns 1 if the condition passed; since there's no ELSE, the rest of the function is executed.
-
-## Understanding recursion
-Now, I put the references I studied to understand a *little bit* of how recursion works, and it's when a function repeats itself. The first time I did this challenge I used a short but effective **while loop** but I wanted to make it shorter and more efficient, you know... because of reasons ;).
-Basically what this does is return the number you gave multiplied by the function itself but this time the value passed to the *num* parameter is `num-1` which ultimately translates to 4. The very function is going to **run inside itself** haha, funny eh? It's like having functions that run inside themselves until they reach a very deep level (depends on how many times it runs itself).
-
-## Visualizing the flow
-![Recursion](http://i61.tinypic.com/28auvsw.jpg)
-
-The first **returned** value can be visualised better if you think about those parenthesis operations you did in secondary school where you do the math inside every parenthesis, bracket and square bracket until you get a final result (a total). This time it's the same thing, look at the program flow:
-
-## During the first execution of the function:
-[**num** = 5]
-
-Is 5 *equal* to 1 or 0? **No** ---> Oki doki, let's continue...
-
-**Returns:**
-
-(**5** * (*second execution*: **4** * (*third execution*: **3** * (*fourth execution*: **2** * *fifth execution*: **1**))))
-
-What it returns can be viewed as `(5*(4*(3*(2*1))))` or just `5 * 4 * 3 * 2 * 1`, and the function will return the result of that operation: `120`.
-Now, let's check whhat the rest of the executions do:
-
-## During the rest of the executions:
-- **Second Execution**: *num* = 5-1 = **4** -> is *num* 0 or 1? No --> return the multiplication between 4 and the next result when *num* is now 4-1.
-
-- **Third Execution**: *num* = 4 - 1 = **3** -> is *num* 0 or 1? No --> return the multiplication between 3 and the next result when *num* is now 3-1.
-
-- **Fourth Execution**: *num* = 3-1 = **2** -> is *num* 0 or 1? No --> return the multiplication between 2 and the next result when *num* is now 2-1.
-
-- **Fifth Execution**: *num* = 2-1 = **1** -> is *num* 0 or 1? Yep --> return **1**. And this is where the recursion stops because there are no more executions.
-
-## :construction: My Solution is coming up!
-Don't scroll down if you don't want to see it!
-
-![warning](http://www.yourdrum.com/yourdrum/images/2007/10/10/red_warning_sign_2.gif)        
-
-```
-           ,,,         ,,,
-          ;"   ^;     ;'   ",
-          ;    s$$$$$$$s     ;
-          ,  ss$$$$$$$$$$s  ,'
-          ;s$$$$$$$$$$$$$$$
-          $$$$$$$$$$$$$$$$$$
-         $$$$P""Y$$$Y""W$$$$$      -{ Happy Camping! }
-         $$$$  p"$$$"q  $$$$$
-         $$$$  .$$$$$.  $$$$
-          $$DcaU$$$$$$$$$$
-            "Y$$$"*"$$$Y"    
-                "$b.$$"     
-```
-
-## My solution
-``` javascript
-function factorialize(num) {
-  if (num === 0 || num == 1) { return 1; }
-  return num * factorialize(num-1);
-}
-
-factorialize(5);
-```
-
-
-
-## References
-- **Recursion**: https://www.codecademy.com/es/courses/javascript-lesson-205/0/1
-- **Factorialization**: https://en.wikipedia.org/wiki/Factorial
-- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators
-
-## If you enjoyed this guide, then type:
-`thanks @luishendrix92`
-in the chat!
diff --git a/nap/data/wiki/Bonfire-Reverse-a-String.md b/nap/data/wiki/Bonfire-Reverse-a-String.md
deleted file mode 100644
index bf2c1d4..0000000
--- a/nap/data/wiki/Bonfire-Reverse-a-String.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# Problem Explanation:
-You need to take the string and reverse it so if you had originally 'hello', it will turn into 'olleh'. Because you will need to split it, you will be working with Arrays too.
-
-# Hint: 1
-- You should split the string by characters.
-
-# Hint: 2
-- Find out about the built in function to reverse a string.
-
-# Hint: 3
-- Once you have split and reversed, do not forget to join them back into one string.
-
-# Spoiler Alert!
-[![687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/thumb/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)
-
-**Solution ahead!**
-
-# Solution Code:
-
-```
-function reverseString(str) {
-  var strReverse = str.split('').reverse().join('');
-
-  return strReverse;
-}
-```
-
-# Code Explanation:
-This is a straightforward code. We create a variable that will hold the string split by characters, and then reversed and put back together.
diff --git a/nap/data/wiki/Bonfire-Style-Guide.md b/nap/data/wiki/Bonfire-Style-Guide.md
deleted file mode 100644
index 61e4702..0000000
--- a/nap/data/wiki/Bonfire-Style-Guide.md
+++ /dev/null
@@ -1,43 +0,0 @@
-*work in progress*
-
-# Bonfire Style Guide
-
-Writing Bonfire challenges is a great way to exercise your own problem solving and testing abilities. It is a simple three step process.
-
-1. Fill out the generator form and test your challenge: http://www.freecodecamp.com/bonfire-challenge-generator
-2. Once you have confirmed a working bonfire challenge in the generator, copy and paste the the fields into the JSON generator: http://www.freecodecamp.com/bonfire-json-generator
-3. Copy the JSON, fork the freecodecamp repository, and submit a pull request with your addition to the bonfires.json: https://github.com/FreeCodeCamp/freecodecamp/blob/master/seed_data/bonfires.json
-
-## Name
-
-Name your challenge
-
-## Difficulty
-
-Attempt to rate difficulty compared against existing bonfire challenges.
-
-*TODO: add basic quantifiers for each difficulty level*
-
-## Description
-
-Separate paragraphs with a line break. Only the first paragraph is visible prior to a user clicking the "More information" button.
-
-All necessary information must be included in the first paragraph. Write this first paragraph as succinct as possible. Subsequent paragraphs should offer hints or details if needed.
-
-If your subject matter warrants deeper understanding, you may link to Wikipedia.
-
-## Challenge Seed
-
-This is important.
-
-## ~~Challenge Entry Point~~ (deprecated)
-
-*Leave this field blank. It will soon be removed from the generator.*
-
-## Tests
-
-These tests are what bring your challenge to life. Without them, we cannot confirm the accuracy of a user's submitted answer. Choose your tests wisely.
-
-Bonfire tests are written using the [Chai.js](http://chaijs.com/) assertion library. Please use the `should` and `expect` syntax for end user readability. As an example of what not do to, many of the original Bonfire challenges are written with `assert` syntax and many of the test cases are difficult to read.
-
-If your bonfire question has a lot of edge cases, you will need to write many tests for full coverage. If you find yourself writing more tests than you desire, you may consider simplifying the requirements of your bonfire challenge. For difficulty level 1 through 3, you will generally only need 2 to 4 tests.
\ No newline at end of file
diff --git a/nap/data/wiki/Bonfire-Symmetric-Difference.md b/nap/data/wiki/Bonfire-Symmetric-Difference.md
deleted file mode 100644
index 4226406..0000000
--- a/nap/data/wiki/Bonfire-Symmetric-Difference.md
+++ /dev/null
@@ -1,21 +0,0 @@
-Symmetric Difference is the difference between **two** sets.
-
-So in the Symmetric Difference Bonfire you would work through the arrays of numbers something like this - 
-
-`sym(A, B, C)`
-Translates to
-`sym(sym(A,B),C)`
-
-Or in plain English - First find the Symmetric Difference of Set A and Set B. Then find the Symmetric Difference of this new set and Set C.
-
-So - 
-
-`sym([1, 2, 5], [2, 3, 5], [3, 4, 5])`
-
-would equal
-
-`[1,4,5]`
-
-Here's a nice video tutorial (with an awful fake British accent!) -
-
-[YouTube - Symmetric Difference](https://www.youtube.com/watch?v=PxffSUQRkG4)
\ No newline at end of file
diff --git a/nap/data/wiki/Bonfire-Wiki-Template.md b/nap/data/wiki/Bonfire-Wiki-Template.md
deleted file mode 100644
index b557f0b..0000000
--- a/nap/data/wiki/Bonfire-Wiki-Template.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Problem Explanation:
-- Explain what is asked in an easy to understand way.
-
-## Hint: 1
-- Add hint here.
-
-## Hint: 2
-- Add hint here.
-
-## Hint: 3
-- Add hint here.
-
-## Spoiler Alert!
-[![687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/thumb/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)
-
-**Solution ahead!**
-
-## Solution Code:
-
-```
-code here
-```
-
-## Code Explanation:
-- Explain your code here
diff --git a/nap/data/wiki/Bonus-SocketIO.md b/nap/data/wiki/Bonus-SocketIO.md
deleted file mode 100644
index 9239114..0000000
--- a/nap/data/wiki/Bonus-SocketIO.md
+++ /dev/null
@@ -1,9 +0,0 @@
-If you've gotten to the Stock Charting basejump you may have noticed that the bonus criteria is to have your stock list live update across clients. This can be accomplished with SocketIO, but that’s not all SocketIO can do. Remember earlier, I mentioned that when using *$http.post* you had to update your local array with the database's version of the item you were posting? SocketIO keeps a user’s browser environment synced with your database in realtime. This has two practical upshots:  
-
-1. You no longer have to manually update your local data with database data; it is all managed automatically
-2. You can push database changes live to users on different machines all at the same time  
-
-Even better, if you just include SocketIO when prompted during the yeoman angular-fullstack setup, there is absolutely no work involved to include it. It works out of the box, has a working demo on the **main/** route, and you can learn how to use it yourself by simply looking at how they include it in **main.controller.js** (so I won’t go any further into detail).
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/isLoggedInAsync())
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Epilogue)
\ No newline at end of file
diff --git a/nap/data/wiki/Brownie-Points.md b/nap/data/wiki/Brownie-Points.md
deleted file mode 100644
index 923ed70..0000000
--- a/nap/data/wiki/Brownie-Points.md
+++ /dev/null
@@ -1,13 +0,0 @@
-The number beside your picture on Free Code Camp tells you how many Brownie Points you have.
-
-![A user profile picture next to a with Brownie Points score](http://i.imgur.com/SsvbkDH.png)
-
-There are three ways you can get Brownie Points:
-
-1. Complete challenges - you get one point per challenge you complete    
-1. Post relevant links on [Camper News](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Camper-News) - you get 1 point for posting a link, and another point for each upvote your link gets    
-1. Help other campers in chat - each time you help another camper and they thank you (by typing "thanks @yourname"), you will get a point    
-
-Brownie Points help you look like the kind of person who codes a lot, shares relevant links, and helps people. 
-
-They also add to your [Streak](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/streak/).
\ No newline at end of file
diff --git a/nap/data/wiki/Camper-News.md b/nap/data/wiki/Camper-News.md
deleted file mode 100644
index c8b8b2a..0000000
--- a/nap/data/wiki/Camper-News.md
+++ /dev/null
@@ -1,11 +0,0 @@
-Camper News is a link sharing tool, based on popular collaborative filtering systems like Reddit and Hacker News.
-
-![Screenshot of Camper News](https://www.evernote.com/l/AlwvYXoOf89EbYXWEXRfUw-_yHdBwx2jLr8B/image.png)
-
-Camper News is intentionally simple. You can:
-
-1. Browse and search through the camper-submitted links
-1. Upvote links
-1. Submit links of your own
-
-Our links are ranked in order of "hotness", which is a combination of each link's upvote count, and how recently the link was submitted.
\ No newline at end of file
diff --git a/nap/data/wiki/Casual-Chat-Rooms.md b/nap/data/wiki/Casual-Chat-Rooms.md
deleted file mode 100644
index 6017daa..0000000
--- a/nap/data/wiki/Casual-Chat-Rooms.md
+++ /dev/null
@@ -1,20 +0,0 @@
-The following are our casual chat rooms.
-
-**Please note that all chat rooms listed here are publicly accessible and indexed by search engines, so only share email addresses or other sensitive information in private messages.**
-
-| Chat Room | Description |
-| --- | --- |
-| [Hardware](https://gitter.im/freecodecamp/Hardware) | chat about computer hardware and Internet of Things | 
-| [GameDev](https://gitter.im/freecodecamp/GameDev) | chat about designing and developing video games | 
-| [Gaming](https://gitter.im/freecodecamp/Gaming) | chat about gaming of all kinds, such as video games and table top games | 
-| [TVandMovies](https://gitter.im/freecodecamp/TVandMovies) | chat about TV shows and movies | 
-| [Sports](https://gitter.im/freecodecamp/Sports) | chat about sports | 
-| [Music](https://gitter.im/freecodecamp/Music) | chat about music | 
-| [Art and Photography](https://gitter.im/freecodecamp/Photography) | chat about art, photography and videography | 
-| [Business](https://gitter.im/freecodecamp/Business) | chat about business and entrepreneurship | 
-| [Saving](https://gitter.im/freecodecamp/Saving) | chat about saving, investing, and home economics | 
-| [SelfImprovement](https://gitter.im/freecodecamp/SelfImprovement) | chat about productivity, self improvement and quantified self |
-
-By joining these chat rooms, you accept our [Code of Conduct](https://github.com/FreeCodeCamp/freecodecamp/wiki/Code-of-Conduct). If you think we should add a chat room, please [message @quincylarson in Gitter](https://gitter.im/QuincyLarson).
-
-[Official Free Code Camp chat rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/Official-Free-Code-Camp-Chat-Rooms)
\ No newline at end of file
diff --git a/nap/data/wiki/Clear-Your-Browser's-Local-Storage.md b/nap/data/wiki/Clear-Your-Browser's-Local-Storage.md
deleted file mode 100644
index cee7e28..0000000
--- a/nap/data/wiki/Clear-Your-Browser's-Local-Storage.md
+++ /dev/null
@@ -1,14 +0,0 @@
-Removing all your locally stored challenges will solve many problems related to the browser crashing on FreeCodeCamp
-
-In Chrome:
-* On 'freecodecamp.com' open your console
- * Windows: Ctrl + Shift + J
- * Mac OS: Cmd + Opt + J
-* Go to resources tab(chrome). 
- * There click on the localStorate link in the nav bar on the right.
-* Delete all the entries on the right side. 
-* See if this solves your issue
-
-![](https://cloud.githubusercontent.com/assets/6775919/9448820/911626ee-4a53-11e5-98c9-b2bf4ca50816.png)
-
-Alternatively, if you are having issue's with a specific challenge freezing your browser find the name of that challenge in local storage and delete just that one.
\ No newline at end of file
diff --git a/nap/data/wiki/Code-Style-Guide.md b/nap/data/wiki/Code-Style-Guide.md
deleted file mode 100644
index 7d0192e..0000000
--- a/nap/data/wiki/Code-Style-Guide.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# Free Code Camp Style Guide
-<small>or How Cool People Write JavaScript.</small>
-
-
-## indent
-  #alwaysUseTwoSpaces
-
-  no hard tabs, ever. No really, just don't do it.
-
-## curly braces
- #curlyBracesEverywhere!
-
-## space after `function` keyword expect in anonymous functions.
-Good:
-```js
-var foo = function() {
-  // ...
-};
-
-function foo() {
-}
-
-```
-Bad: 
-```js
-var foo = function () {
-  // ...
-};
-
-function foo ()
-{
-  // ...
-}
-```
-## comments
-
- * no inline comments
- * single space after `//`
- * Do not use multiline comment `/* */`, we are reserving these for use with jsDocs.
-
-## keywords
-
- * space immediately after if, else, while, etc
- * opening curly brace should always be on the same line.
-
-Good:
-```js
-if (true) {
- // do the thing
-}
-```
-
-Bad:
-```js
-if(true)
-{
- // do the thing
-}
-```
-...more to come
\ No newline at end of file
diff --git a/nap/data/wiki/Code-of-Conduct.md b/nap/data/wiki/Code-of-Conduct.md
deleted file mode 100644
index c6884a2..0000000
--- a/nap/data/wiki/Code-of-Conduct.md
+++ /dev/null
@@ -1,20 +0,0 @@
-Free Code Camp is friendly place to learn to code. We're committed to keeping it that way.
-
-All campers are required to agree with the following code of conduct. We'll enforce this code. We're expecting cooperation from all campers in ensuring a friendly environment for everybody.
-
-In short: be nice to your fellow campers.
-
-Remember these 3 things and your fellow campers will like you:
-- Compliment your fellow campers when they do good work. Congratulate them when they accomplish something (like finishing a nonprofit project or getting a job).
-- Critique the work, not the camper doing it.
-- Only argue about something if it's important to the greater discussion.
-
-Free Code Camp should be a harassment-free experience for everyone, regardless of gender, gender identity and expression, age, sexual orientation, disability, physical appearance, body size, race, national origin, or religion (or lack thereof).
-
-We do not tolerate harassment of campers in any form, anywhere on Free Code Camp's online media (Gitter, Twitch, etc.) or during pair programming. Harassment includes sexual language and imagery, deliberate intimidation, stalking, unwelcome sexual attention, libel, and any malicious hacking or social engineering.
-
-If a camper engages in harassing behavior, our team will take any action we deem appropriate, up to and including banning them from Free Code Camp.
-
-We want everyone to feel safe and respected. If you are being harassed or notice that someone else is being harassed, say something! Message @quincylarson, @brianamarie and @codenonprofit in Gitter (preferably with a screen shot of the offending language) so we can take fast action.
-
-If you have questions about this code of conduct, email us at [team@freecodecamp.com](mailto:team@freecodecamp.com).
\ No newline at end of file
diff --git a/nap/data/wiki/Coding-Help.md b/nap/data/wiki/Coding-Help.md
deleted file mode 100644
index f811934..0000000
--- a/nap/data/wiki/Coding-Help.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Coding Help
-I started this list while doing bonfires, noticing a few things that were common issues / questions but I think most of them are going to be useful to people coding in general. If you've got some tips to help people code I'd love to hear them.
-
-1. If you don't know where to start, write some pseudocode. Plan out the logic you're trying to implement in your native language before you try to put it into code.
-
-2. Comment your code! Can't stress that one enough, if you get lost or take a break then come back you need to know what your code is trying to do. It will also reinforce what the code means to you, and help other people understand what your code does if you get stuck and ask for help. If you've got a any other tips for campers I'd love to see them!
-
-3. Use the chrome javascript debugger console in conjunction with something like netbeans IDE or sublime text to write your code. Both are free to download. <br />
-The free code camp window is great but you can get a lot more feedback on your code's behaviour by using chrome's JS debugger and a bunch of **console.log(myVariableGoesHere);** <br />
-https://developer.chrome.com/devtools/docs/console <br />
-http://www.sublimetext.com/ <br />
-https://netbeans.org/downloads/
-
-4. Posting your code in gitter is as simple as adding a line consisting of only
-> \`\`\`
->     
-> Then your code on the next lines, followed by a final
->     
-> \`\`\`
-
-5. Ask for help in gitter! I can personally relate to staring at a problem for hours, then seeing the solution as soon as I try to explain it to someone, or having someone say something like "typo on line 6" as soon as they see it.
\ No newline at end of file
diff --git a/nap/data/wiki/Create,-Upload-and-Link-Animated-GIF-Image.md b/nap/data/wiki/Create,-Upload-and-Link-Animated-GIF-Image.md
deleted file mode 100644
index 61e6139..0000000
--- a/nap/data/wiki/Create,-Upload-and-Link-Animated-GIF-Image.md
+++ /dev/null
@@ -1,7 +0,0 @@
-1. Download [LICEcap](http://www.cockos.com/licecap/) and install.
-2. Open and start recording to create animated GIF.
-3. Upload the `.gif` file in [EZGIF.com](http://ezgif.com/optimize).
-   - Crop, Resize and Optimize as many times or as required.
-4. Download animated GIF.
-5. Upload image to [imgur.com](http://imgur.com).
-6. Link image using `![image title](http://i.imgur.com/RqgGcf5.gif)`.
\ No newline at end of file
diff --git a/nap/data/wiki/Creating-a-New-Github-Issue.md b/nap/data/wiki/Creating-a-New-Github-Issue.md
deleted file mode 100644
index 08edf1a..0000000
--- a/nap/data/wiki/Creating-a-New-Github-Issue.md
+++ /dev/null
@@ -1,14 +0,0 @@
-Before submitting an issue try [Searching for Your Issue on Github](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Searching-for-Your-Issue-on-Github)
-
-Crafting a good issue will make it much easier for the dev team to replicate and resolve your problem. Follow these steps to do it right:
-
-1. Go to FreeCodeCamp's [Github Issues](https://github.com/FreeCodeCamp/FreeCodeCamp/issues) page and click on `New Issue`.
-* **Have a useful title**
- * Write a meaningful title that describes the issue. Some good examples are `Logging in from the News and Field Guide pages doesn't redirect properly (using e-mail)` and `Typo: "for" instead of "while" loop`; bad examples include `A bug, HELP!!!11` and `I found this bug in a waypoint`.
- * Keep the title relatively short, the description is for further information. One example is to shorten long waypoint names, so instead of writing `Test case bug in 'Waypoint: Check Radio Buttons and Checkboxes by Default'`, you might want to write `Test case bug in 'Radio Buttons' waypoint`.
-* In the body, **provide a link** to the page on which you encountered this issue.
-* **Describe the problem** and **provide steps** so that a developer can try to replicate the issue.  Include your operating system and browser version.
- * When referencing other issues or pull requests, simply write #issue/pr-number.
-* Paste in any relevant code using proper [Code Formatting](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/code-formatting.)
-* **Take a screenshot** of the issue and include it in the post.
-* Click `Submit New Issue` and you are done! You will be automatically subscribed to notifications for any updates or future comments.
\ No newline at end of file
diff --git a/nap/data/wiki/Creating-a-new-API-endpoint.md b/nap/data/wiki/Creating-a-new-API-endpoint.md
deleted file mode 100644
index 7860dde..0000000
--- a/nap/data/wiki/Creating-a-new-API-endpoint.md
+++ /dev/null
@@ -1,5 +0,0 @@
-	>> yo angular-fullstack:endpoint whatsit
- Using this line, you get Yeoman to automatically generate another API endpoint and new kind of collection for your database. Now we have *things* as well as *whatsits*! Feel free to open up **/server/api/whatsit/whatsit.model.js** and define your whatsit however you like.
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Backend-file-structure)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Fixing-exports.update)
\ No newline at end of file
diff --git a/nap/data/wiki/Creating-a-new-directive.md b/nap/data/wiki/Creating-a-new-directive.md
deleted file mode 100644
index f58ddb9..0000000
--- a/nap/data/wiki/Creating-a-new-directive.md
+++ /dev/null
@@ -1,12 +0,0 @@
-Do you remember custom directives from the shaping up with angular course? You can also make a custom directive!
-
-	>> yo angular-fullstack:directive newdirective
-
-And if you need an html template for your custom directive (maybe you’re just making a directive to clean up your HTML code), tell it to make an html file when it prompts you to and you'll be able to include the contents of that template anywhere in your app with:
-
-~~~html
-<newdirective></newdirective>
-~~~
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-route)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Grunt)
\ No newline at end of file
diff --git a/nap/data/wiki/Creating-a-new-route.md b/nap/data/wiki/Creating-a-new-route.md
deleted file mode 100644
index ae7760c..0000000
--- a/nap/data/wiki/Creating-a-new-route.md
+++ /dev/null
@@ -1,10 +0,0 @@
-	>> yo angular-fullstack:route newpage 
-   Typing the above into your command-line will generate a **newpage/** route for your app! It automatically generates all the necessary files within your **/client/app/newpage** folder, like your **/client/app/main** folder, with a **newpage.controller.js**, **newpage.controller.spec.js**, **newpage.js**, and **newpage.html**. These all pretty much behave like the ones in the **main/** route. If you’re accessing the database in your newpage controller, you’ll want to add *$http* to the list of dependencies in **newpage.controller.js** the same way it’s included in **main.controller.js**: 
-
-~~~javascript
-angular.module('myApp')
-  .controller('MainCtrl', function ($scope, $http) { ...
-~~~
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Frontend-file-structure)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-directive)
\ No newline at end of file
diff --git a/nap/data/wiki/Dynamic-URLs-using-$routeParams.md b/nap/data/wiki/Dynamic-URLs-using-$routeParams.md
deleted file mode 100644
index f09508e..0000000
--- a/nap/data/wiki/Dynamic-URLs-using-$routeParams.md
+++ /dev/null
@@ -1,30 +0,0 @@
-What if you have a lot of users posting *things* to your website? Maybe your users want to have a profile, or a wall, of the *things* they’ve posted, and they want to be able to share it with their friends with a url? You can do that, no biggie!
-
-Let’s say you used 
-
-	>> yo angular-fullstack:route wall
-
-to generate a <a href="#">http://myapp.wherever.com/wall/</a> route for your users. You want a link to <a href="#">http://myapp.wherever.com/wall/someUsername</a> to show a specific user’s *things*.  
-Browse to **/client/app/wall/wall.js** and notice that it detects what URL the user is requesting before acting on it:  
-
-~~~javascript
-$routeProvider.when('/wall', …
-~~~
-You can customize that path to catch when a user is trying to see a profile associated with a specific username like so:  
-
-~~~javascript
-$routeProvider.when('/wall/:username', …
-~~~
-The colon before "username" indicates that this is a variable, which is then passed to the *$routeParams* module. In **wall.controller.js**, include *$routeParams*:  
-
-~~~javascript
-.controller('WallCtrl', function ($scope, $routeParams) { …
-~~~
-Then later on in **wall.controller.js**, you can see what username was requested in the URL by referring to the variable generated by *$routeProvider* using something like  
-
-~~~javascript
-var wallOwner = $routeParams.username;
-~~~
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Quick-tip:-keep-data-in-sync)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/More-useful-APIs)
\ No newline at end of file
diff --git a/nap/data/wiki/Edit-or-Delete-message.md b/nap/data/wiki/Edit-or-Delete-message.md
deleted file mode 100644
index 1f480db..0000000
--- a/nap/data/wiki/Edit-or-Delete-message.md
+++ /dev/null
@@ -1,3 +0,0 @@
-> Editing or Deleting a previous message within 5 mins. of posting
-
-![How to delete message](http://i.imgur.com/gDivlLJ.gif)
\ No newline at end of file
diff --git a/nap/data/wiki/Epilogue.md b/nap/data/wiki/Epilogue.md
deleted file mode 100644
index ed91e40..0000000
--- a/nap/data/wiki/Epilogue.md
+++ /dev/null
@@ -1,13 +0,0 @@
-If you have any issues not covered in this guide: 
-
-1. google google google google duckduckgo
-2. bug @freecodecamp and me (@clnhll) on twitter
-3. did you miss a semicolon? a comma? 
-4. make a big loud stink in the freecodecamp help gitter.
-
-If you notice any inaccuracies or bad coding practices in this guide, please let me know ASAP! 
-
-I believe in you!
--[clnhll](https://github.com/clnhll)
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Bonus:-SocketIO)
\ No newline at end of file
diff --git a/nap/data/wiki/Fixing-exports.update.md b/nap/data/wiki/Fixing-exports.update.md
deleted file mode 100644
index 0cd449c..0000000
--- a/nap/data/wiki/Fixing-exports.update.md
+++ /dev/null
@@ -1,14 +0,0 @@
-As it turns out, in **thing.controller.js** as well as in any other endpoints you may generate, the *exports.update* function that is called when you make an *$http.put* call from your frontend to modify an existing database object is broken. This is a <a href="https://github.com/DaftMonk/generator-angular-fullstack/issues/310">known issue</a>, and can be fixed by changing the following line:
- 
-~~~javascript
-// Updates an existing thing in the DB.
-exports.update = function(req, res) { 
-...    
-    var updated = _.extend(thing, req.body); 
-    // change _.merge to _.extend
-... 
- };
-~~~
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-API-endpoint)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Accessing-the-database-from-your-frontend)
\ No newline at end of file
diff --git a/nap/data/wiki/Free-Code-Camp's-Privacy-Policy.md b/nap/data/wiki/Free-Code-Camp's-Privacy-Policy.md
deleted file mode 100644
index 620ee0e..0000000
--- a/nap/data/wiki/Free-Code-Camp's-Privacy-Policy.md
+++ /dev/null
@@ -1,53 +0,0 @@
-Free Code Camp is committed to respecting the privacy of visitors to our web sites and web applications. The guidelines below explain how we protect the privacy of visitors to FreeCodeCamp.com and its features.
-
-### Personally Identifiable Information
-
-Free Code Camp protects the identity of visitors to FreeCodeCamp.com by limiting the collection of personally identifiable information.
-
-Free Code Camp does not knowingly collect or solicit personally identifiable information from or about children under 13, except as permitted by law. If we discover we have received any information from a child under 13 in violation of this policy, we will delete that information immediately. If you believe Free Code Camp has any information from or about anyone under 13, please email us at [team@freecodecamp.com](mailto:team@freecodecamp.com).
-
-All personally identifiable information you provide to us is used by Free Code Camp and its team to process and manage your account, analyze the demographic of our users, or to deliver services through the site. 
-
-If you choose to provide personally identifiable information to us, you may receive occasional emails from us that are relevant to Free Code Camp, getting a job, or learning to code in general.
-Free Code Camp may also use other third-party providers to facilitate the delivery of the services described above, and these third-party providers may be supplied with or have access to personally identifiable information for the sole purpose of providing these services, to you on behalf of Free Code Camp.
-
-Free Code Camp may also disclose personally identifiable information in special legal circumstances. For instance, such information may be used where it is necessary to protect our copyright or intellectual property rights, or if the law requires us to do so.
-
-### Anonymous Information
-Anonymous aggregated data may be provided to other organizations we associate with for statistical purposes. For example, we may report to an organization that a certain percentage of our site's visitors are adults between the ages of 25 and 35.
-
-### Cookies and Beacons—Use by Free Code Camp; Opting Out
-We use cookies and software logs to monitor the use of FreeCodeCamp.com and to gather non-personal information about visitors to the site. Cookies are small files that Free Code Camp transfers to the hard drives of visitors for record-keeping purposes. These monitoring systems allow us to track general information about our visitors, such as the type of browsers (for example, Firefox or Internet Explorer), the operating systems (for instance, Windows or Macintosh), or the Internet providers (for instance, Comcast) they use. This information is used for statistical and market research purposes to tailor content to usage patterns and to provide services requested by our customers. To delete these cookies, please see your browser's privacy settings.
-
-A beacon is an electronic file object (typically a transparent image) placed in the code of a Web page. We use third party beacons to monitor the traffic patterns of visitors from one Free Code Camp.com page to another and to improve site performance.
-None of the information we gather in this way can be used to identify any individual who visits our site.
-
-### Security
-
-Any personally identifiable information collected through this site is stored on limited-access servers. We will maintain safeguards to protect these servers and the information they store.
-
-### Surveys
-We may occasionally conduct on-line surveys. All surveys are voluntary and you may decline to participate.
-
-### Copyright
-All of the content on FreeCodeCamp.com is copyrighted by Free Code Camp. If you'd like to redistribute it beyond simply sharing it through social media, please contact us at [team@freecodecamp.com](mailto:team@freecodecamp.com).
-
-### Contacting Us
-If you have questions about Free Code Camp, or to correct, update, or remove personally identifiable information, please email us at [team@freecodecamp.com](mailto:team@freecodecamp.com).
-
-### Links to Other Web sites
-Free Code Camp's sites each contain links to other Web sites. Free Code Camp is not responsible for the privacy practices or content of these third-party Web sites. We urge all FreeCodeCamp.com visitors to follow safe Internet practices: Do not supply Personally Identifiable Information to these Web sites unless you have verified their security and privacy policies.
-
-### Data Retention
-We retain your information for as long as necessary to permit us to use it for the purposes that we have communicated to you and comply with applicable law or regulations.
-
-### Business Transfers
-As we continue to develop our business, we might sell or buy subsidiaries, or business units. In such transactions, customer information generally is one of the transferred business assets but remains subject to the promises made in any pre-existing Privacy Policy (unless, of course, the customer consents otherwise). Also, in the unlikely event that Free Code Camp, or substantially all of its assets are acquired, customer information will be one of the transferred assets, and will remain subject to our Privacy Policy.
-
-### Your California Privacy Rights
-If you are a California resident, you are entitled to prevent sharing of your personal information with third parties for their own marketing purposes through a cost-free means. If you send a request to the address above, Free Code Camp will provide you with a California Customer Choice Notice that you may use to opt-out of such information sharing. To receive this notice, submit a written request to <a href="mailto:team@freecodecamp.com" target="_blank">team@freecodecamp.com</a>, specifying that you seek your &quot;California Customer Choice Notice.&quot; Please allow at least thirty (30) days for a response.
-
-### Acceptance of Privacy Policy Terms and Conditions
-By using this site, you signify your agreement to the terms and conditions of this FreeCodeCamp.com Privacy Policy. If you do not agree to these terms, please do not use this site. We reserve the right, at our sole discretion, to change, modify, add, or remove portions of this policy at any time. All amended terms automatically take effect 30 days after they are initially posted on the site. Please check this page periodically for any modifications. Your continued use of FreeCodeCamp.com following the posting of any changes to these terms shall mean that you have accepted those changes.
-
-If you have any questions or concerns, please send an email to [team@freecodecamp.com](mailto:team@freecodecamp.com).
\ No newline at end of file
diff --git a/nap/data/wiki/Free-Code-Camp-Front-End-Development-Certificate.md b/nap/data/wiki/Free-Code-Camp-Front-End-Development-Certificate.md
deleted file mode 100644
index 723381b..0000000
--- a/nap/data/wiki/Free-Code-Camp-Front-End-Development-Certificate.md
+++ /dev/null
@@ -1,19 +0,0 @@
-We're creating a free Front End Development Certificate.
-
-Here are the challenges that will make up our Basic Front End Development Certificate Program:
-
-- HTML5 and CSS
-- Responsive Design with Bootstrap
-- jQuery
-- Basic JavaScript
-- Basic Bonfires
-- Ajax and JSON APIs (not available in the current version of the [Map](http://www.freecodecamp.com/map))
-- Zipline: Build a Personal Portfolio Webpage
-- Zipline: Build a Random Quote Machine
-- Zipline: Show the Local Weather
-- Zipline: Build a Pomodoro Clock
-- Zipline: Zipline: Use the Twitch.tv JSON API
-
-This won't be a new curriculum - it will just be the first 400 hours of our full stack JavaScript curriculum.
-
-All campers who have already completed these challenges will retroactively be eligible for the certificate.
\ No newline at end of file
diff --git a/nap/data/wiki/Free-Code-Camp-Full-Stack-Developent-Certificate.md b/nap/data/wiki/Free-Code-Camp-Full-Stack-Developent-Certificate.md
deleted file mode 100644
index 915f69f..0000000
--- a/nap/data/wiki/Free-Code-Camp-Full-Stack-Developent-Certificate.md
+++ /dev/null
@@ -1,8 +0,0 @@
-We're creating a free Full Stack Development Certificate.
-
-In order to qualify for this verified certificate, you must:
-
-- Complete the first 800 hours of Free Code Camp (all Bonfires, Ziplines and Basejumps)
-- Complete 4 nonprofit projects or complete at least 1 nonprofit project before getting a coding job.
-
-All campers who have already completed these challenges are retroactively be eligible for the certificate.
\ No newline at end of file
diff --git a/nap/data/wiki/Free-Code-Camp-completion-language-requirements.md b/nap/data/wiki/Free-Code-Camp-completion-language-requirements.md
deleted file mode 100644
index bc864f7..0000000
--- a/nap/data/wiki/Free-Code-Camp-completion-language-requirements.md
+++ /dev/null
@@ -1,7 +0,0 @@
-The last 800 hours of free code camp involve building projects for nonprofits. These nonprofit projects will involve lots of meetings, correspondence, and pair programming, all of which will be conducted in English.
-
-You will need to be good enough with English to be able to participate in these meetings.
-
-We are translating our challenges into native languages so that you can focus on learning to code, rather than focusing on learning English.
-
-Many non-native English speakers have succeeded in our nonprofit project program. With some effort, you can, too.
\ No newline at end of file
diff --git a/nap/data/wiki/Free-Code-Camp-logo.md b/nap/data/wiki/Free-Code-Camp-logo.md
deleted file mode 100644
index 9a04918..0000000
--- a/nap/data/wiki/Free-Code-Camp-logo.md
+++ /dev/null
@@ -1,9 +0,0 @@
-### Free Code Camp's logo
-
-![Free Code Camp's logo](https://i.vimeocdn.com/video/520129377_1280x720.jpg)
-
-It uses the typeface 'saxmono'.
-
-Like most of Free Code Camp's design assets, it was created by [@rybar](https://gitter.im/rybar) with help from [@iheartkode](https://gitter.im/iheartkode).
-
-You can download all of our assets, which are Creative Commons licensed, from our [Free Code Camp Assets repository](https://github.com/FreeCodeCamp/FCCAssets).
diff --git a/nap/data/wiki/Frontend-file-structure.md b/nap/data/wiki/Frontend-file-structure.md
deleted file mode 100644
index a3e0317..0000000
--- a/nap/data/wiki/Frontend-file-structure.md
+++ /dev/null
@@ -1,11 +0,0 @@
-First things first: All your user-facing files and angular files are in **/client/app/**  
-
-1. **app.js**: defines your app and includes some basic app-wide functions, you probably don’t really need to mess with it unless you’re trying to add more dependencies to your app. We’re not gonna worry about that right now.  
-2. **app.css**: an app-wide stylesheet, you can put styles here if you want but I’d recommend you put them in **main/main.css**, as these styles are also app-wide.  
-3. **main/**: this folder contains what the user sees first when they load up your site. **main.html** is the page template, **main.js** routes the user to **main.html** when the user goes to the top level directory of your website—that is, <a href="#">http://yourapp.wherever.itis/</a> with no <a href="#">/other/url/hierarchy</a>. You’ll also learn soon that you can define your app’s <a href="#">/url/heirarchy/fairly/arbitrarily</a>. You won’t really need to edit **main.js** or **main.controller.spec.js**, so let's not worry about those right now. If you look through the **main.html** file you’ll see it uses *ng-repeat* to show *things* in *awesomeThings*. Where does it get *awesomeThings*?  
-4. **main/main.controller.js**: all of the javascript functions you want to use to interact directly with the user go here! You’ll put functions here to interact with your API, refresh views for your user, etc. Here, *awesomeThings* are pulled from your database and added to the local scope so your HTML view can display them! How cool! We’ll get to adding custom objects to your database in a minute.
-
-Great! Now you know how to interact with the user! But what if you want your app to have another page that does something else? Maybe **main.html** shows the home page, but you want a page that shows a form to add a poll? maybe <a href="#">http://yourapp.wherever.itis/newpage</a>? This is where the yeoman generator comes in handy.
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Guide-to-Basejumps-Table-of-Contents/)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-route)
\ No newline at end of file
diff --git a/nap/data/wiki/Functional-Programming---Higher-Order-Functions.md b/nap/data/wiki/Functional-Programming---Higher-Order-Functions.md
deleted file mode 100644
index dcc7774..0000000
--- a/nap/data/wiki/Functional-Programming---Higher-Order-Functions.md
+++ /dev/null
@@ -1,9 +0,0 @@
-### Links to help with functional programming!
-
-####Workshops
-(https://github.com/timoxley/functional-javascript-workshop)
-
-A node package workshop. More can be found at [nodeschool](http://nodeschool.io/)
-
-####Reading and videos
-(https://github.com/timoxley/functional-javascript-workshop)
\ No newline at end of file
diff --git a/nap/data/wiki/Get-info-about-the-current-user.md b/nap/data/wiki/Get-info-about-the-current-user.md
deleted file mode 100644
index 98ed297..0000000
--- a/nap/data/wiki/Get-info-about-the-current-user.md
+++ /dev/null
@@ -1,15 +0,0 @@
-You may have noticed if you opened up **/client/app/admin/admin.controller.js** that it calls the *Auth* module like so:
-
-~~~javascript
-.controller('AdminCtrl', function ($scope, $http, Auth …
-~~~
-You can include Auth in your other controllers the same way. It’s pretty useful to have *Auth* available in your controller to detect if a user is logged in, or to get information about the current user. In the body of your controller you can add 
-
-~~~javascript
-$scope.getCurrentUser = Auth.getCurrentUser;
-$scope.isLoggedIn = Auth.isLoggedIn;
-~~~
-And then you can use *isLoggedIn()* or *getCurrentUser()* in the HTML view for your controller!  
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/More-useful-APIs)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Restrict-a-page-to-authenticated-users)
\ No newline at end of file
diff --git a/nap/data/wiki/Git-Blame.md b/nap/data/wiki/Git-Blame.md
deleted file mode 100644
index 97f63d5..0000000
--- a/nap/data/wiki/Git-Blame.md
+++ /dev/null
@@ -1,9 +0,0 @@
-> Shows what revision and author last modified each line of a file and blame them.
-
-:point_right: :no_good: — :see_no_evil: :hear_no_evil: :speak_no_evil: 
-
-![](http://i.imgur.com/Ywpucz6.png)
-
-**Reference:** https://git-scm.com/docs/git-blame
-
-## [](http://i.imgur.com/xancoby.png)
\ No newline at end of file
diff --git a/nap/data/wiki/Gitter.md b/nap/data/wiki/Gitter.md
deleted file mode 100644
index 1a00a44..0000000
--- a/nap/data/wiki/Gitter.md
+++ /dev/null
@@ -1,9 +0,0 @@
-### Gitter is a chat room system popular with open source projects.
-
-![A screenshot from Gitter](https://www.evernote.com/l/AntJzLbImEFNbaLfG7YQnWWBbqLliTKTYeoB/image.png)
-
-[Gitter.im](https://gitter.im) is a rapidly growing startup based in London.
-
-Free Code Camp has hundreds of Gitter rooms. These are accessible through Gitter's website, as well as [desktop and mobile apps](https://gitter.im/apps).
-
-Gitter allows you to share [formatted code](https://github.com/FreeCodeCamp/freecodecamp/wiki/Pasting-Code-in-Gitter) with fellow campers.
\ No newline at end of file
diff --git a/nap/data/wiki/Grunt.md b/nap/data/wiki/Grunt.md
deleted file mode 100644
index a344322..0000000
--- a/nap/data/wiki/Grunt.md
+++ /dev/null
@@ -1,4 +0,0 @@
-Whenever you create a new route or directive, you have to use `control+c` in your *grunt* terminal window to quit the grunt process and re-run `grunt serve` for your new route/directive to be included in your project's **index.html**. Sometimes *grunt* can be a little finnicky and refuses to run if it thinks something is wrong with your project. Obviously you should try to fix the problem, but grunt's errors aren't very helpful so don't worry too much—grunt usually will still run totally fine with the command `grunt serve --force`.
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-directive)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Backend-file-structure)
\ No newline at end of file
diff --git a/nap/data/wiki/Guide-to-Basejumps-Table-of-Contents.md b/nap/data/wiki/Guide-to-Basejumps-Table-of-Contents.md
deleted file mode 100644
index 024ca56..0000000
--- a/nap/data/wiki/Guide-to-Basejumps-Table-of-Contents.md
+++ /dev/null
@@ -1,31 +0,0 @@
-###Table of contents
-* Part 1: Frontend
-    - [Frontend file structure](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Frontend-file-structure)
-    - [Creating a new route](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-route)
-    - [Creating a new directive](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-directive)
-    - [Grunt](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Grunt)
-* Part 2: Backend
-    - [Backend file structure](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Backend-file-structure)
-    - [Creating a new API endpoint](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-new-API-endpoint)
-    - [Fixing exports.update](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Fixing-exports.update)
-* Part 3: Interfacing Between Frontend & Backend
-    - [Accessing the database from your frontend](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Accessing-the-database-from-your-frontend)
-    - [Seed Data](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Seed-data)
-    - [Quick tip: keep data in sync](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Quick-tip:-keep-data-in-sync)
-* Part 4: Dynamic URLs using $routeParams, more useful APIs
-    - [Dynamic URLS using $routeParams](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Dynamic-URLs-using-$routeParams)
-    - [More Useful APIs](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/More-useful-APIs)
-* Part 5: Auth, isLoggedInAsync()
-    - [Get info about the current user](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Get-info-about-the-current-user)
-    - [Restrict a page to authenticated users](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Restrict-a-page-to-authenticated-users)
-    - [isLoggedInAsync()](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/isLoggedInAsync())
-* [Bonus: SocketIO](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Bonus:-SocketIO)
-* [Epilogue](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Epilogue)
-
-###Legend
-**/bolded/names/with.extensions** are directories and files in the project file structure  
-<a href="#">highlighted.items/are/hypothetical</a> URLs that allow access to different pages in your app  
-*italicizedItems* are function and object names within your code
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Intro-to-Yeoman-Angular-Fullstack-Basejumps)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Frontend-file-structure)
\ No newline at end of file
diff --git a/nap/data/wiki/Help-I've-Found-a-Bug.md b/nap/data/wiki/Help-I've-Found-a-Bug.md
deleted file mode 100644
index a1e1973..0000000
--- a/nap/data/wiki/Help-I've-Found-a-Bug.md
+++ /dev/null
@@ -1,12 +0,0 @@
-Thank you for taking the effort to report an issue with FreeCodeCamp.
-
-If you think you've found a bug on FreeCodeCamp, please follow these steps to resolve your problem:
-
-1. If the page seems broken in any way, try to do a [Hard Refresh](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Refresh-Your-Browser-Cache) of the page.  This will update any old code that may have been cached in your browser.  
- * If your code crashes your browser, also try [Clearing Your Browser's Local Storage](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Clear-Your-Browser's-Local-Storage).
-
-2. [Ask for Help on Gitter](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-to-Get-Help-on-Gitter).  You can usually get a quick response from a helpful community member there.
-
-3. If your problem has baffled everyone in Gitter, try [Searching for Your Issue on GitHub](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Searching-for-Your-Issue-on-Github) for anyone who has posted about a similar issue. If someone has, you can upvote the issue by replying to it with "+1" as your message.
-
-3. If you can't find any relevant issues on GitHub, then [Create a New Issue](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-New-Github-Issue) and our development team will take a look at your problem.
\ No newline at end of file
diff --git a/nap/data/wiki/Home.md b/nap/data/wiki/Home.md
deleted file mode 100644
index dd8ed36..0000000
--- a/nap/data/wiki/Home.md
+++ /dev/null
@@ -1,16 +0,0 @@
-##Welcome to the Free Code Camp Wiki!
-
-Our open source community's Wiki focuses on answering your questions about learning to code and getting a coding job. We also cover in detail our:
-- Curriculum
-- Local Campsite Communities
-- Nonprofit Projects
-
-"Wiki" is a Hawaiian word meaning "quick", and that is a good mindset to have when creating a Wiki. Please reference our [Wiki style guide] ([https://github.com/FreeCodeCamp/freecodecamp/wiki/Wiki-Style-Guide](https://github.com/FreeCodeCamp/freecodecamp/wiki/Wiki-Style-Guide)) for more direction regarding styling.  <img align="right" src="https://avatars1.githubusercontent.com/camperbot?&s=100">
-
-The best way to access this wiki is via [CamperBot](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/camperbot), located in our Gitter channels. CamperBot is a community designed tool useful for accessing our wiki content without ever leaving Gitter.
-
-To contribute a wiki article for any of the bonfires, please use this [template.](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Bonfire-Wiki-Template) This is essential for [@CamperBot](https://github.com/camperbot) to retrieve the article. Bonfire articles that do not use this template will be removed.
-
-If you have questions about contributing to the Free Code Camp Wiki message [@Rafase282 in Gitter](https://gitter.im/Rafase282).
-
-We look forward to collaborating with you on expanding and improving this wiki!
\ No newline at end of file
diff --git a/nap/data/wiki/How-Free-Code-Camp-works.md b/nap/data/wiki/How-Free-Code-Camp-works.md
deleted file mode 100644
index 5146c59..0000000
--- a/nap/data/wiki/How-Free-Code-Camp-works.md
+++ /dev/null
@@ -1,15 +0,0 @@
-Free Code Camp offers you a free, self-paced, browser-based program that takes about 1,600 hours to complete.
-
-![An image of a table showing the different segments of Free Code Camp](https://s3.amazonaws.com/freecodecamp/curriculum-diagram-waypoints.jpg)
-
-## how it works
-![An image of a table showing the different segments of Free Code Camp](https://s3.amazonaws.com/freecodecamp/curriculum-diagram-bonfires.jpg)
-
-![An image of a table showing the different segments of Free Code Camp](https://s3.amazonaws.com/freecodecamp/curriculum-diagram-ziplines.jpg)
-
-![An image of a table showing the different segments of Free Code Camp](https://s3.amazonaws.com/freecodecamp/curriculum-diagram-basejumps.jpg)
-
-![An image of a table showing the different segments of Free Code Camp](https://s3.amazonaws.com/freecodecamp/curriculum-diagram-nonprofit-projects.jpg)
-
-![An image of a table showing the different segments of Free Code Camp](https://s3.amazonaws.com/freecodecamp/curriculum-diagram-full.jpg)
-
diff --git a/nap/data/wiki/How-FreeCodeCamp-Nonprofit-Projects-work.md b/nap/data/wiki/How-FreeCodeCamp-Nonprofit-Projects-work.md
deleted file mode 100644
index 39e11c6..0000000
--- a/nap/data/wiki/How-FreeCodeCamp-Nonprofit-Projects-work.md
+++ /dev/null
@@ -1,87 +0,0 @@
-Building nonprofit projects is the main way that our campers learn full stack JavaScript and agile software development. Once you complete the Free Code Camp Waypoints, Bonfires, Ziplines and Basejumps, you'll begin this process.
-
-## Starting with the end in mind
-
-Our goal at Free Code Camp is to help you land a job as a junior software developer (or, if you prefer, a 'pivot job' that leads your current career in a more technical direction).
-
-You'll continue to work on nonprofit projects until you've built a sufficiently impressive portfolio and references to start your job search. Your portfolio will ultimately have four nonprofit projects. We estimate that the 800 hours of nonprofit projects you're going to complete, in addition to the 800 hours of challenges you've already completed, will be enough to qualify you for your first coding job. This will produce a much broader portfolio than a traditional coding bootcamp, which generally only has one or two capstone projects.
-
-## Choosing your first Nonprofit Project
-
-We've categorized all the nonprofit projects by estimated time investment per camper: 100 hours, 200 hours, and 300 hours. These are only rough estimates.
-
-Example: if you and the camper you're paired up with (your pair) each stated you could work 20 hours per week. If the project is a 100 hour per camper project, you should be able to complete it in about 5 weeks.
-Our Nonprofit Project team will match you and your pair based on:
-
-- Your estimated time commitment (10, 20 or 40 hours per week)
-- Your time zone
-- The nonprofit projects you've chosen
-- Prior coding experience (we'd like both campers to be able to contribute equally)
-
-
-We won't take age or gender into account. This will provide you with valuable experience in meshing with diverse teams, which is a reality of the contemporary workplace.
-
-You'll only work on one project at a time. Once you start a nonprofit project, we'll remove you from all other nonprofit project you've expressed interest in. There's a good chance those projects will no longer be available when you finish your current project, anyway. Don't worry, though - we get new nonprofit project requests every day, so there will be plenty more projects for you to consider after you finish your current one.
-
-### Finalizing the Project
-
-Before you can start working on the project, our team of Nonprofit Project Coordinators will go through the following process:
-
-- We'll wait until there are two campers who have chosen the same project and look like they're a good match for one another based on the factors mentioned above.
-- We'll call the stakeholder to confirm once again that he or she agrees with our [terms](http://freecodecamp.com/nonprofits) and has signed our [Nonprofit Project Stakeholder Pledge] (http://goo.gl/forms/0YKkd9bpcR).
-- We'll set an initial meeting with representatives from Free Code Camp, the two campers, and the stakeholder.
-- If the stakeholder and both campers shows up promptly, and seem enthusiastic and professional, we'll start the project.
-
-This lengthy process serves an important purpose: it reduces the likelihood that any of our campers or stakeholders will waste their precious time.
-
-### Nonprofit Stakeholders
-
-Each nonprofit project was submitted by a nonprofit. A representative from this nonprofit has agreed to serve as a "stakeholder" - an authorative person who understands the organization and its needs for this particular project.
-
-Stakeholders have a deep understanding of their organizations' needs. Campers will work with them to figure out the best solutions to these needs.
-
-When you and your pair first speak with your nonprofit stakeholder, you'll:
-
-- talk at length to better understand their needs.
-- create a new Trello board and use it to prioritize what needs to be built.
-- and establish deadlines based on your weekly time commitment, and how long you think each task will take.
-
-It's notoriously difficult to estimate how long building software projects will take, so feel free to ask our volunteer team for help.
-
-You'll continue to meet with your stakeholder at least twice a month in your project's Gitter channel.
-You should also ask questions in your project's Gitter channel as they come up throughout the week, and your stakeholder can answer them asynchronously.
-
-Getting "blocked" on a task can take away your sense of forward momentum, so be sure to proactively seek answers to any ambiguities you encounter.
-
-Ultimately, the project will be considered complete once both the stakeholder's needs have been met, and you and your pair are happy with the project. Then you can add it to your portfolio!
-
-### Working with your Pair
-
-You and your pair will pair program (code together on the same computer virtually) about half of the time, and work independently the other half of the time.
-
-Here are our recommended ways of collaborating:
-
-- Gitter has robust private messaging functionality. It's the main way our team communicates, and we recommend it over email.
-- Trello is great for managing projects. Work with your stakeholder to create Trello cards, and update these cards regularly as you make progress on them.
-- Screen Hero or Team Viewer - These are the ideal way to pair program. Tools like TMUX are good, but difficult to use. We discourage you from using screen sharing tools where only one person has control of the keyboard and mouse - that isn't real pair programming.
-- Write clear and readable code, commit messages, branch names, and pull request messages.
-
-### Hosting Apps
-
-Unless your stakeholder has an existing modern host (AWS, Digital Ocean), you'll need to transition them over to a new platform. We believe Heroku is the best choice for a vast majority of web projects. It's free, easy to use, and has both browser and command line interfaces. It's owned by Salesforce and used by a ton of companies, so it's accountable and unlikely to go away.
-
-If you need help convincing your stakeholder that Heroku is the ideal platform, we'll be happy to talk with them.
-
-### Maintaining Apps
-
-Once you complete a nonprofit project, your obligation to its stakeholder is finished. Your goal is to leave behind a well documented solution that can be easily maintained by a contract JavaScript developer (or even a less-technical "super user").
-
-While you will no longer need to help with feature development, we encourage you to consider helping your stakeholder with occasional patches down the road. After all, this project will be an important piece of your portfolio, and you'll want it to remain in good shape for curious future employers.
-
-### Pledging to finish the project
-
-Your nonprofit stakeholder, your pair, and our volunteer team are all counting on you to finish your nonprofit project. If you walk away from an unfinished nonprofit project, you'll become ineligible to ever be assigned another one.
-
-To confirm that you understand the seriousness of this commitment, we require that all campers [sign this pledge](http://goo.gl/forms/ZMn96z2QqY) before starting on their nonprofit projects.
-
-There will likely be times of confusion or frustration. This is normal in software development. The most important thing is that you do not give up and instead persevere through these setbacks. As Steve Jobs famously said, "Real artists ship." And you are going to ship one successful nonprofit project after another until you feel ready to take the next step in your promising career.
\ No newline at end of file
diff --git a/nap/data/wiki/How-GitHub-Issue-Moderators-AKA-Issue-Mods-Work.md b/nap/data/wiki/How-GitHub-Issue-Moderators-AKA-Issue-Mods-Work.md
deleted file mode 100644
index 0716695..0000000
--- a/nap/data/wiki/How-GitHub-Issue-Moderators-AKA-Issue-Mods-Work.md
+++ /dev/null
@@ -1,11 +0,0 @@
-GitHub Issue Moderators, or "issue mods", have the ability to close issues and accept or deny pull requests.
-
-In order to become an issue mod, you must first prove your helpfulness by leaving useful comments on outstanding issues, and submitting pull requests of your own to fix these issues.
-
-If you've been doing these things, and want the additional power/responsibility that comes with helping Free Code Camp as an issue mod, please contact [@berkeleytrue](https://gitter.im/berkeleytrue) in Gitter.
-
-If you are approved, we will add you to a GitHub Team.
-
-Though you will have write access to Free Code Camp's repository, **you should never write directly to the Free Code Camp repository**. All code should enter Free Code Camp's codebase in the form of a pull request.
-
-Please note that we will frequently remove issue mods whom we think are inactive. If you are removed, please do not take this personally - we can add you back to the team. Just message us and let us know you're still active.
\ No newline at end of file
diff --git a/nap/data/wiki/How-long-Free-Code-Camp-takes-to-complete.md b/nap/data/wiki/How-long-Free-Code-Camp-takes-to-complete.md
deleted file mode 100644
index 854504c..0000000
--- a/nap/data/wiki/How-long-Free-Code-Camp-takes-to-complete.md
+++ /dev/null
@@ -1,10 +0,0 @@
-It takes about 1,600 hours of coding to develop the skills you'll need to get an entry level software engineering job.
-
-Most coding bootcamps try to jam all this into 3 or 4 months of intensive study. Free Code Camp is fully online, and there will always be other people at your skill level that you can pair program with, so you can learn at your own pace. Here are some example coding schedules:
-
-Time budgeted | Hours per week | Weeks to complete
---- | --- | ---
-Weekends | 10 hours/week | 160 weeks (36 months)
-Nights and Weekends | 20 hours/week | 80 weeks (18 months)
-Full time | 40 hours/week | 40 weeks (9 months)
-Traditional Bootcamp Pacing | 80 hours/week | 20 weeks (5 months)
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-Get-Help-on-Gitter.md b/nap/data/wiki/How-to-Get-Help-on-Gitter.md
deleted file mode 100644
index 9b81dec..0000000
--- a/nap/data/wiki/How-to-Get-Help-on-Gitter.md
+++ /dev/null
@@ -1,9 +0,0 @@
-Sorry that you are stuck. Luckily there are many campers who hang out on Gitter and can help you resolve most issues! Follow these simple steps to get help fast:
-
-1. Go to the [Help Room](https://gitter.im/FreeCodeCamp/Help)
- *  If the problem is code related, paste the problematic code in the chat room with the [Proper Formatting](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/code-formatting) and a description of the issue.
- * If the problem seems to be with the site itself, post a screenshot of the issue or describe it well.
-
-2. Remember that the people there are campers just like you, so be courteous!
-
-3. If your problem has baffled everyone in Gitter, try [Searching for Your Issue on Github](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Searching-for-Your-Issue-on-Github) for anyone who has posted about a similar issue.  
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-add-Free-Code-Camp-to-my-LinkedIn-profile.md b/nap/data/wiki/How-to-add-Free-Code-Camp-to-my-LinkedIn-profile.md
deleted file mode 100644
index b9a545e..0000000
--- a/nap/data/wiki/How-to-add-Free-Code-Camp-to-my-LinkedIn-profile.md
+++ /dev/null
@@ -1,10 +0,0 @@
-LinkedIn recognizes Free Code Camp as a university.
-
-You can explore our alumni activity [here](https://www.linkedin.com/edu/school?id=166029).
-
-You should add Free Code Camp to your LinkedIn profile. Here's how:
-
-- Follow this link: [https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp](https://www.linkedin.com/profile/edit-education?school=Free+Code+Camp)
-- Follow these instructions:![](https://www.evernote.com/l/AHRnpH-PN-JPQa9_u8FSOzejNG-tX40h1fkB/image.png)
-
-Once you complete our curriculum (or complete at least one Nonprofit Project and then get a coding job), we will issue you an official Full Stack Web Development certificate that you can also add to your LinkedIn profile.
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-best-use-the-Global-Control-Shortcuts-for-Mac.md b/nap/data/wiki/How-to-best-use-the-Global-Control-Shortcuts-for-Mac.md
deleted file mode 100644
index e25fd05..0000000
--- a/nap/data/wiki/How-to-best-use-the-Global-Control-Shortcuts-for-Mac.md
+++ /dev/null
@@ -1,15 +0,0 @@
-These Global Control Shortcuts for Mac will save you hours by speeding up your typing.
-
-https://player.vimeo.com/video/107073108
-
-These global shortcuts work everywhere on a Mac:
-
-- Control + F = Forward
-- Control + B = Backward
-- Control + N = Next Line
-- Control + P = Previous Line
-- Control + H = Backspace
-- Control + D = Delete
-- Control + A = Beginning of Line
-- Control + E = End of Line
-- Control + K = Kill line
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-clone-the-FreeCodeCamp-website-on-a-Windows-pc.md b/nap/data/wiki/How-to-clone-the-FreeCodeCamp-website-on-a-Windows-pc.md
deleted file mode 100644
index 22afc0c..0000000
--- a/nap/data/wiki/How-to-clone-the-FreeCodeCamp-website-on-a-Windows-pc.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# How to clone and setup the FreeCodeCamp website on a Windows pc
-This list works with the FreeCodeCamp site and have been tested on this Angular tutorial [https://docs.angularjs.org/tutorial](https://docs.angularjs.org/tutorial) as well. Setting up the dev environment on a Windows pc is easy although it will give a ton of errors first in the process. The important part is to correct these errors.
-## Toolchain
-1. Git bash [https://msysgit.github.io/](https://msysgit.github.io/)
-2. Node.js [https://nodejs.org/](https://nodejs.org/)
-3. MongoDB [https://www.mongodb.org/downloads](https://www.mongodb.org/downloads)
-4. Python 2.7.10 [https://www.python.org/downloads/release/python-2710/](https://www.python.org/downloads/release/python-2710/)
-
-Install the 4 downloaded prerequsites. When installing Python and Node it is important to check
- the option add to the path variable. The Node installer does that by default. It is optional to add Mongo to the path. Python should be installed in a subfolder in %programfiles%
- 
-1. Open a command prompt with admin rights
-2. Verify that Node is in th path with node -v
-3. Verify that npm is in the path with npm -v
-5. `npm install npm -g`
-	`npm install bower -g`  
-	`npm install gulp -g`
-	`npm install node-gyp -g` 
-	`npm install babel -g`  
-6. If you want to spare the time in explorer finding Mongo when it has to be started create a .cmd file on your desktop and write the path to Mongo. Probably  %programfiles%\MongoDB\Server\3.0\bin\mongod.exe. 
-7. Create the default folder for mongo to store databases: C:\data\db
-
-**Every command from now on has to be executed from Git Bash. npm install and bower install is downloading components from Git repos and MUST have access to the Git commands**
-
-1. Follow the instructions here [https://github.com/FreeCodeCamp/freecodecamp](https://github.com/FreeCodeCamp/freecodecamp) and clone the project.
-2. Run `npm install` This will produce some warnings and maybe some errors. The warnings and some of the errors can be disregarded. Stackoverflow has large 
-resources to solve the errors if they still come up the 2. time you run npm install.
-3. Run `bower install`, `npm install` again and `bower install`again
-4. Start mongo from the desktop shortcut and run `node seed`. You should now see a lot of activity in the window where you started mongo.
-5. Run `gulp` and note what port it starts the site on. (Should be 3000) Open localhost:3000 (or whatever port it started)
-
-**you're good to go**
diff --git a/nap/data/wiki/How-to-create-a-Campsite-for-your-city.md b/nap/data/wiki/How-to-create-a-Campsite-for-your-city.md
deleted file mode 100644
index 6bf31f5..0000000
--- a/nap/data/wiki/How-to-create-a-Campsite-for-your-city.md
+++ /dev/null
@@ -1,38 +0,0 @@
-If you didn't see your city on [our list of Campsites](https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites), you should create your own Facebook group for your city.
- 
-Please follow these steps: 
-- Sign in to Facebook. 
-- Click the down arrow in the upper right corner of the screen, then choose "Create Group" from the options.
-
-![A screenshot of Facebook showing the drop down menu that appears when you click the down arrow, with an arrow pointing to the "Create Group" option](https://www.evernote.com/shard/s116/sh/d01bb2bc-6260-4987-bedf-b2ce4c31972f/3eecbcff3109036cf90b69589360f407/deep/0/Facebook.png)
-- Set the group name as "Free Code Camp" plus the proper name of your city. Avoid using slang terms such as "Philly" for "Philadelphia". If your city is not the biggest city that uses its name, also include the state or province. For example, the Free Code Camp group in Paris, France should be called "Free Code Camp Paris". The Free Code Camp group in Paris, Texas should be called "Free Code Camp Paris, Texas". 
-- Set your group to public. 
-- You'll need to add at least one friend from your city to this group in order to create the group. 
-
-![A screenshot of the Facebook group creation modal saying that your group name should be Free Code Camp plus your city name, that your group should be public, and that you need to invite at least one Facebook friend.](https://www.evernote.com/shard/s116/sh/4ed3197c-db1b-4103-a040-b42482ad232a/6c34948ebe12c57f0b7a54d7b2222ab3/deep/0/Facebook.png)
-- Choose the graduation cap icon to indicate that this group is related to a school. 
-
-![a screenshot telling you to choose the graduation icon, which is on the forth row of icons, seven icons from the left.](https://www.evernote.com/shard/s116/sh/00e461b3-e0a8-4ecd-9cbf-8b0ae9de75d1/59c4e9f25672b1b2ca2d7e6b06d55e0b/deep/0/Facebook.png)
-- Click the "..." menu, then click "Edit group settings" in the dropdown menu. 
-
-![a screenshot telling you to click the "..." button then choose the "Edit group settings" option](https://www.evernote.com/shard/s116/sh/ae9a22e2-19a5-4309-b46c-f05a6be5644c/0870b25572d37d4d650cca1a0d59e407/deep/0/Free-Code-Camp-Testland.png)
-- Set the group's privacy setting to public. 
-- Set your group's membership approval to where any member can add or approve members ![a screenshot showing the Facebook settings panel and where you can click to set the group to public and allow all members to be able to add or approve members>
-- Click the "Customize Address" button.
-
-![A screen shot showing you the group description box on the Facebook page.](https://www.evernote.com/l/AHTs6Ec_hylKyYWVhpZonOHPn8j8I5ydgv4B/image.png)
-- Enter "free.code.camp.your.city.name" with each word separated by periods. 
-
-![a screenshot telling you to enter free.code.camp.your.city.name with each word seperated by periods.](https://www.evernote.com/shard/s116/sh/357b1bd9-7c40-4f72-8a9a-d918e632a5e8/c4714ca59360b2517dfffe90c60b1556/deep/0/Free-Code-Camp-Testland.png)
-- Please feel free to personalize your city's group description, but be sure to include a link to Free Code Camp: "http://www.freecodecamp.com". 
-
-![A screen shot showing you the group description box on the Facebook page.](https://www.evernote.com/shard/s116/sh/e13808ea-f084-46f1-95bc-63db524383d5/0586484d44360e73e9acda956dad7f6a/deep/0/Free-Code-Camp-Testland.png)
-- Click the "Upload a photo button. To start out, you'll probably just want to use Free Code Camp's banner (download it [here](https://s3.amazonaws.com/freecodecamp/wide-social-banner.png)), or a scenic shot of your city. Later you can update this with a picture from one of your city's Free Code Camp events. 
-
-![A screenshot showing the "Upload a photo" button.](https://www.evernote.com/shard/s116/sh/fabe226a-5a26-4508-b015-1dac35192a21/37f8119dc57845a31e972217714b038b/deep/0/Free-Code-Camp-Testland.png)
-- [message @quincylarson in Gitter](https://gitter.im/QuincyLarson) with a link to your city's group page. He'll include it on this list and also create a Gitter room for you. 
-- Join our [Local Leaders Facebook group](https://www.facebook.com/groups/freecodecampers/), where we share ideas about involving campers in your city. 
-
-If you don't have a Facebook account, we strongly recommend you create one, even if it's just for the purpose of coordinating with campers in your city through this group. 
-
-If Facebook is blocked in your country, feel free to use social network with a similar group functionality that's popular in your region.
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-deploy-a-website-without-writing-any-code-at-all.md b/nap/data/wiki/How-to-deploy-a-website-without-writing-any-code-at-all.md
deleted file mode 100644
index c3ed849..0000000
--- a/nap/data/wiki/How-to-deploy-a-website-without-writing-any-code-at-all.md
+++ /dev/null
@@ -1,12 +0,0 @@
-It's possible to build dynamic, mobile-responsive websites without writing any code at all, in just a few minutes.
-
-https://player.vimeo.com/video/115194017
-
-Here are the technologies we used here:
-
-- [atom.io](http://www.atom.io/) a free code editor 
-- [startbootstrap.com](http://www.startbootstrap.com/) a collection of free responsive (Bootstrap) templates 
-- [powr.io](http://www.powr.io/) a collection of free JavaScript plugins 
-- [bitballoon.com](http://www.bitballoon.com/) a tool for drag and drop website deployment
-
-You will quickly reach the limits of what you can do without actually coding, but it's nice to be able to rapidly build working prototype websites like this.
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-get-help-when-you-get-stuck.md b/nap/data/wiki/How-to-get-help-when-you-get-stuck.md
deleted file mode 100644
index 55eacfe..0000000
--- a/nap/data/wiki/How-to-get-help-when-you-get-stuck.md
+++ /dev/null
@@ -1,13 +0,0 @@
-When you get stuck, remember: Read-Search-Ask.
-
-1) **Read** the documentation or error    
-2) **Search** Google    
-3) **Ask** your friends for help    
-
-This is the most time-efficient way to handle being stuck, and it's the most respectful of other people's time, too.
-
-Most of the time, you'll solve your problem after just one or two steps of this algorithm.
-
-We have a special chat room just for getting help: <a href='https://gitter.im/freecodecamp/help/' target='_blank'>https://gitter.im/freecodecamp/help/</a>
-
-Learning to code is hard. But it's a lot easier if you ask for help when you need it!
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-help-with-the-Free-Code-Camp-translation-effort.md b/nap/data/wiki/How-to-help-with-the-Free-Code-Camp-translation-effort.md
deleted file mode 100644
index bcddc03..0000000
--- a/nap/data/wiki/How-to-help-with-the-Free-Code-Camp-translation-effort.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Our translation effort is driven by bilingual campers like you.
-
-If you're able to help us, you can join our [translation Trello board](https://trello.com/b/m7zhwXka/fcc-translation) by sending @quincylarson your email address in Gitter.
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-install-Screenhero.md b/nap/data/wiki/How-to-install-Screenhero.md
deleted file mode 100644
index 212558c..0000000
--- a/nap/data/wiki/How-to-install-Screenhero.md
+++ /dev/null
@@ -1,7 +0,0 @@
-[Download for Mac](http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjowLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLnppcD9zb3VyY2U9d2ViIn0=) 
-
-[Download for Windows](http://links.screenhero.com/e/c/eyJlbWFpbF9pZCI6Ik1qQTNNem9XQkNJQ1pBQUNjd0FYQVZrVEdnRkxNamtfX0JWZEdGVEpSZkVCWlRwbFpXRTBNamM0WVMxaE56SmlMVEV4WlRRdE9HUXpZUzFpWXpVNE1HRTJNalkxTldNNk1UUTJNVEEyQUE9PSIsInBvc2l0aW9uIjoxLCJocmVmIjoiaHR0cDovL2RsLnNjcmVlbmhlcm8uY29tL3NtYXJ0ZG93bmxvYWQvZklYQU1UUUJBTEtQQkhQTC9TY3JlZW5oZXJvLXNldHVwLmV4ZSJ9) 
-
-Linux users should use TeamViewer as an alternative.
-
-You'll use Screen Hero to pair program starting with [our Zipline challenges](http://www.freecodecamp.com/challenges/waypoint-get-set-for-ziplines)
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-know-who-is-in-charge-of-your-Campsite-on-Facebook.md b/nap/data/wiki/How-to-know-who-is-in-charge-of-your-Campsite-on-Facebook.md
deleted file mode 100644
index 3d3959f..0000000
--- a/nap/data/wiki/How-to-know-who-is-in-charge-of-your-Campsite-on-Facebook.md
+++ /dev/null
@@ -1,13 +0,0 @@
-Each Campsite has members that are designated as Admins who can approve new members and also designate other Admins for the group. The steps below will show you how to find out who is an Admin for your Campsite.
-
-* First, click the Members tab below the cover photo. Then the click on the dropdown box that says "all members"**
-
-![](http://i.imgur.com/qLx6kVZ.png?1)
-
-* Next, use the drop down box to select "Admins"**
-
-![](http://i.imgur.com/pfB2pDP.png?1)
-
-* You should now be able to see who is designated as an Admin for your Campsite.
-
-![](http://i.imgur.com/AwoYT01.png?1)
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-share-your-workspace-selfie-with-FreeCodeCamp-on-instagram.md b/nap/data/wiki/How-to-share-your-workspace-selfie-with-FreeCodeCamp-on-instagram.md
deleted file mode 100644
index 07cd5eb..0000000
--- a/nap/data/wiki/How-to-share-your-workspace-selfie-with-FreeCodeCamp-on-instagram.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# FreeCodecamp is on instagram! Here is how to take a workspace selfie and share it with us.
-
-## Take a selfie of you at your workspace with Free Code Camp open.
-
-![](https://www.evernote.com/l/AkpdrY2nGrtBO69RoxdNq8rluri5K7B367YB/image.png)
-
-## Share it on Instagram, Twitter or Facebook with the hashtag #freecodecamp.
-
-## Social media not your thing? No problem! Email your workspace selfie to team@freecodecamp.com
diff --git a/nap/data/wiki/How-to-start-when-you-are-stuck-(I).md b/nap/data/wiki/How-to-start-when-you-are-stuck-(I).md
deleted file mode 100644
index 1d5b136..0000000
--- a/nap/data/wiki/How-to-start-when-you-are-stuck-(I).md
+++ /dev/null
@@ -1,21 +0,0 @@
-**[How to start when you are stuck (II)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(II))**
-
-**[How to start when you are stuck (III)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(III))**
-
-You are a camper just like me, you get to an exercise and you get stuck … just like anyone else. You have no idea how to start, you stare at your editor and you think you must have a problem, surely you are not developer material … well you’re wrong!  Perhaps you are just like me? I’m a visual person, I like a drawing better than a text. Everytime the same problem put down in a schema makes more sense to me than if you gave me a text. So … what do I do when I have problems solving/understanding an exercise? I start to draw. After I have my drawing in place if I need more to translate it to code I can also write it in pseudocode. After that transposing it to code should not be very hard. 
-
-### So what are this flowcharts (the drawings) and pseudocode?
-
-During my first semester in college, we had a course about introduction to algorithms. This is where we first learned about this stuff. We learned that a good algorithm and good logical programing is developed using flowcharts and pseudocode.
-
-A **flowchart** represents your program flow from top to bottom. Each command is represented on this. Depending on the nature of the command there are different shapes you can use. A few of them that I mostly use (you can google more on this, google is your friend when you know what to google for) are:
-
-![](http://biancamihai.github.io/img/flowchart-theory.png)
-
-More information about this you can find here https://en.wikipedia.org/wiki/Flowchart.
-
-**Pseudocode** is an informal language that helps developers write algorithms. It is a text-based design tool and it uses a human readable language. It’s a structured english text that describes an algorithm. 
-
-Every bonfire in Free Code Camp curriculum can be solved using pseudocode and after that translated using javascript in a functional javascript code.
-
-**[How to start when you are stuck (II)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(II))**
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-start-when-you-are-stuck-(II).md b/nap/data/wiki/How-to-start-when-you-are-stuck-(II).md
deleted file mode 100644
index b0034eb..0000000
--- a/nap/data/wiki/How-to-start-when-you-are-stuck-(II).md
+++ /dev/null
@@ -1,30 +0,0 @@
-**[How to start when you are stuck (I)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(I))**
-
-**[How to start when you are stuck (III)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(III))**
-
-Let’s try an example. If we take a look at one of the Free Code Camp exercices, and let’s choose a more simple one: [find the longest word in a string](http://www.freecodecamp.com/challenges/bonfire-find-the-longest-word-in-a-string). We can start and draw a flowchart for it and write a first solution in pseudocode.
-
-![](http://biancamihai.github.io/img/bonfire-1.png)
-
-So what does Free Code Camp want from us with this problem? Well it wants as to create a function that gets a string as a parameter and returns an integer. This integer should represent the length of the longest word in this string. Usually you can solve a problem on Free Code Camp by just looking at the **More information** text. In this case Free code camp is giving us some very good tips:
-    
-    Return the length of the longest word in the provided sentence.
-    Your response should be a number.
-    Remember to use RSAP if you get stuck. Try to pair program. Write your own code.
-    Here are some helpful links: String.split(), String.length
-
-If we take a look at the Free Code Camp suggestions we’ll see that String.split() can be used to split a string into an array and String.length gives us the length of a string. This helps us think of an algorithm. What if we split the string into an array, we loop through it and using the length attribute we find out the length of the longest word. Hmm, doesn’t seem very complicated but how to start this? Well ... take a look at the image below. 
-
-![](http://biancamihai.github.io/img/flowchart.png)
-
-If we follow the schema AND/OR the pseudocode, writing the function that gives us the length of the longest word in a string shouldn’t be very hard now … in any language … not just in javascript.
-
-![](http://biancamihai.github.io/img/bonfire-2.png)
-
-Now that we have this first working version, we can try and rewrite it using a for loop. Or we can take a look at forEach and if we really want to go wild we can rewrite this using the functional programming way. So let’s challenge ourselves to write a “one line” solution for the problem. 
-
-Searching through the MDN documentation you’ll find out that you can use the max function on arrays and that there is a map function that helps us change the current array. Hmm … that should should help us … right? Yes! the idea remains the same, you get a string, split it into an array and you return an integer but here is how:
-
-![](http://biancamihai.github.io/img/bonfire-3.png)
-
-**[How to start when you are stuck (III)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(III))**
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-start-when-you-are-stuck-(III).md b/nap/data/wiki/How-to-start-when-you-are-stuck-(III).md
deleted file mode 100644
index 0471b7d..0000000
--- a/nap/data/wiki/How-to-start-when-you-are-stuck-(III).md
+++ /dev/null
@@ -1,14 +0,0 @@
-**[How to start when you are stuck (I)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(I))**
-
-**[How to start when you are stuck (II)](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-start-when-you-are-stuck-(II))**
-
-### Tips
-
-* Always look at your logs, keep your console open. You can spot errors faster this way. To open the console log on chrome: click right -> inspect -> console There are so many errors that come from typos and so much time lost that you can save just by developing this very simple habit 
-* Pair with other programmers as much as you can
-* Read the documentation. You can install a very helpful [MDN Chrome Extension](https://chrome.google.com/webstore/detail/mdn-search/ffpifaemeofjmncjdbegmbpcdaemkeoc) and use it as much and often as you need to
-* Follow the help tips provided by Free Code Camp in the “More informations” section. The answer is there!
-* Try to solve the problem in more than one way, always try to make it better, more readable, a lower complexity time, less memory
-* If none of the above steps work, ask for help :)
-
-![](http://biancamihai.github.io/img/console.png)
\ No newline at end of file
diff --git a/nap/data/wiki/How-to-use-the-Free-Code-Camp-Wiki.md b/nap/data/wiki/How-to-use-the-Free-Code-Camp-Wiki.md
deleted file mode 100644
index ed004b1..0000000
--- a/nap/data/wiki/How-to-use-the-Free-Code-Camp-Wiki.md
+++ /dev/null
@@ -1,18 +0,0 @@
-The Free Code Camp wiki strives to provide clear answers to common questions about Free Code Camp, learning to code, and getting a coding job.
-
-Individual Wiki's can be accessed from the main page, or from other linked Wiki pages.  
-
-You can also access them from Gitter using Camperbot 
-
-- #### **`help $topic`**  
-  find related materials to that topic, usually a page from the [wiki]
-  (https://github.com/bothelpers/kbase/wiki/)  
-  examples: `help css` `help bootstrap`
-
-- #### `topics`
-  show the list of topics.
-
-- #### `find $topic` 
-  this will search for entries that include `$topic` in the title. We'll add fulltext search in    
-  future.  
-  examples: `find wiki`
diff --git a/nap/data/wiki/How-you-can-get-to-Inbox-Zero-with-Gmail-shortcuts.md b/nap/data/wiki/How-you-can-get-to-Inbox-Zero-with-Gmail-shortcuts.md
deleted file mode 100644
index b07d7ab..0000000
--- a/nap/data/wiki/How-you-can-get-to-Inbox-Zero-with-Gmail-shortcuts.md
+++ /dev/null
@@ -1,21 +0,0 @@
-> These Gmail Shortcuts will save you hours and help you get to Inbox Zero.
-
-See https://player.vimeo.com/video/115194016
-
-### Gmail Shortcuts
-| shortcut 	| description 	|
-|----------	|------------:	|
-| j        	|   move down 	|
-| k        	|     move up 	|
-| o        	|        open 	|
-| r        	|       reply 	|
-| a        	|   reply all 	|
-| f        	|     forward 	|
-| c        	|     compose 	|
-| x        	|      select 	|
-| e        	|     archive 	|
-| !        	|   mark spam 	|
-| z        	|        undo 	|
-| \#       	|     *delete 	|
-
-\* This may not work on some EU Mac keyboards where # is accessed with, `ALT + 3`. Workaround [here](http://toodlepip.co.uk/2010/blog-2010-09-gmail-delete-key-shortcut-uk-apple-users/).
\ No newline at end of file
diff --git a/nap/data/wiki/How-you-can-help-to-stimulate-your-city's-Campsite-on-Facebook.md b/nap/data/wiki/How-you-can-help-to-stimulate-your-city's-Campsite-on-Facebook.md
deleted file mode 100644
index 997b61a..0000000
--- a/nap/data/wiki/How-you-can-help-to-stimulate-your-city's-Campsite-on-Facebook.md
+++ /dev/null
@@ -1,10 +0,0 @@
-
-## A great way to stimulate your Campsite is by asking questions.     
-**You can ask questions like**
-* What is everyone working on this week?
-* How did you approach a specific waypoint, bonfire, zipline, basejump?
-* Would anyone be interested in meeting up to pair program together this week?
-* Did everyone hear about "insert recent announcement"
-* What are some parts of free code camp you'd like to give additional focus to?
-
-**You can also provide useful links for other members to relevant resources that you find helpful.**
\ No newline at end of file
diff --git a/nap/data/wiki/How-you-can-reach-the-Free-Code-Camp-team-to-interview-them-for-your-publication.md b/nap/data/wiki/How-you-can-reach-the-Free-Code-Camp-team-to-interview-them-for-your-publication.md
deleted file mode 100644
index 345bc0b..0000000
--- a/nap/data/wiki/How-you-can-reach-the-Free-Code-Camp-team-to-interview-them-for-your-publication.md
+++ /dev/null
@@ -1,8 +0,0 @@
-We're happy to do a quick interview for your publication or show. Here's whom you should contact about what, and how to best reach them:
-
-- Want to talk to about Free Code Camp's curriculum or long-term vision? Reach out to Quincy Larson. He's [@ossia on Twitter](https://twitter.com/ossia)</a> and @quincylarson on Gitter.
-- Want to talk about Free Code Camp's open source codebase, infrastructure, or JavaScript in general? Talk to Berkeley Martinez. He's [@berkeleytrue on Twitter](https://twitter.com/berkeleytrue) and @berkeleytrue on Gitter.
-- Want to explore our efforts to empower nonprofits with code? Michael D. Johnson eats, sleeps and breathes that. He's [@figitalboy on Twitter](https://twitter.com/figitalboy) and @codenonprofit on Gitter.
-- Want to get a camper's perspective on our community? Talk with Bianca Mihai. She's [@bubuslubu on Twitter](https://twitter.com/bubuslubu) and @biancamihai on Gitter. Or you can talk with Suzanne Atkinson. She's [@steelcitycoach on Twitter](https://twitter.com/SteelCityCoach) and @adventurebear on Gitter.
-
-We strive to be helpful and transparent in everything we do. We'll do what we can to help you share our community with your audience.
\ No newline at end of file
diff --git a/nap/data/wiki/How-you-can-stream-your-live-coding-sessions-on-the-Free-Code-Camp-Twitch.tv-channel.md b/nap/data/wiki/How-you-can-stream-your-live-coding-sessions-on-the-Free-Code-Camp-Twitch.tv-channel.md
deleted file mode 100644
index 107f7fc..0000000
--- a/nap/data/wiki/How-you-can-stream-your-live-coding-sessions-on-the-Free-Code-Camp-Twitch.tv-channel.md
+++ /dev/null
@@ -1,19 +0,0 @@
-If you're interested in coding JavaScript live in front of dozens of people on our popular [twitch.tv channel](http://twitch.tv/freecodecamp), we'd love to have you.
-
-Please follow these steps to get started:
-
-- Follow [this tutorial](http://www.hdpvrcapture.com/wordpress/?p=5951) to set up your computer for streaming.
-- Contact [Wesley](https://gitter.im/septimus). He's in charge of our Twitch.tv channel. Tell him what you'd like to stream, and when you're available to stream.
-- Wesley will pair with you using [Screen Hero](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-install-Screenhero) to verify your computer is configured properly to stream.
-
-Be respectful of your audience. Everything you stream should be related to coding JavaScript, and should be safe-for-work.
-
-While you're streaming, keep the chat room open so you can respond to questions from your viewers. If we get a new follower, try to thank them.
-
-Play our [camper-DJ'd radio station](http://plug.dj/freecodecamp) in the background.
-
-Use a webcam. If viewers can see your face while you're talking, it will help them feel more connected to you.
-
-Think out-loud as much as possible so that your viewers can understand what you're thinking and doing.
-
-If you do a good job, we'll invite you back to stream some more. Who knows, you might become one of our regular streamers!
\ No newline at end of file
diff --git a/nap/data/wiki/IIFE.md b/nap/data/wiki/IIFE.md
deleted file mode 100644
index ba36059..0000000
--- a/nap/data/wiki/IIFE.md
+++ /dev/null
@@ -1,9 +0,0 @@
-> IIFE — initialism for Immediately Invoked Function Expression
-
-Keep your data inside the [closure](https://github.com/freecodecamp/freecodecamp/wiki/js-closures)!
-
-```js
-(function(){
-  //add your magic here
-})();
-```
\ No newline at end of file
diff --git a/nap/data/wiki/If-Free-Code-Camp-is-free,-how-does-it-make-money.md b/nap/data/wiki/If-Free-Code-Camp-is-free,-how-does-it-make-money.md
deleted file mode 100644
index 60e5aa5..0000000
--- a/nap/data/wiki/If-Free-Code-Camp-is-free,-how-does-it-make-money.md
+++ /dev/null
@@ -1,7 +0,0 @@
-We will always be completely free for both students and for nonprofits.
-
-Our name is Free Code Camp. We are a free code camp. If you had to pay us (or sign over future earnings), we'd have to change our name. And we are not going to do that.
-
-Everyone working on our community and our open source projects is a volunteer.
-
-We plan to eventually cover our operational costs by earning job placement bonuses from companies who hire our graduates. Note that we will not actually garnish any wages from our graduates - employers are already paying recruiters thousands of dollars to find successful candidates. Employers will simply pay the recruitment bonus to Free Code Camp instead of paying a recruiter.
\ No newline at end of file
diff --git a/nap/data/wiki/Intro-to-Yeoman-Angular-Fullstack-Basejumps.md b/nap/data/wiki/Intro-to-Yeoman-Angular-Fullstack-Basejumps.md
deleted file mode 100644
index e484c12..0000000
--- a/nap/data/wiki/Intro-to-Yeoman-Angular-Fullstack-Basejumps.md
+++ /dev/null
@@ -1,9 +0,0 @@
-> Hey FreeCodeCampers! This guide is here to help you navigate creating your first basejump. When I encountered the first basejump, I had no idea what was going on and spent weeks learning all of these things myself. Everything here is stuff I wish I had known coming into the basejumps. Oh and by the way, if you have a question that isn't answered by this guide, that's an issue, and you should report it as an issue to this repository! —[@clnhll](http://twitter.com/clnhll)
-
-Yeoman is a tool that allows you to generate barebones apps based on different software stacks using “generator” packages made by developers who want to make your life easier. These packages streamline your time developing and deploying websites using your platform of choice. We’re using a full-stack MEAN (MongoDB, ExpressJS, AngularJS, NodeJS) generator called generator-angular-fullstack by DaftMonk (https://github.com/DaftMonk/generator-angular-fullstack).
-
-Once you’ve completed the Waypoint: Get Set for Basejumps, use this guide to navigate the base structure of your new app and learn how to interact with the database as well as the user.
-
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Guide-to-Basejumps-Table-of-Contents)
-
-Sourced from (https://github.com/clnhll/guidetobasejumps) with permission.
\ No newline at end of file
diff --git a/nap/data/wiki/JavaScript-Truth-Table.md b/nap/data/wiki/JavaScript-Truth-Table.md
deleted file mode 100644
index e9ea3d1..0000000
--- a/nap/data/wiki/JavaScript-Truth-Table.md
+++ /dev/null
@@ -1,5 +0,0 @@
-![A table showing which JavaScript arguments are true and false.](http://i.stack.imgur.com/35MpY.png)
-
-This is why you should always use `===` and `!==`.
-
-Source: https://dorey.github.io/JavaScript-Equality-Table/
\ No newline at end of file
diff --git a/nap/data/wiki/Javascript-Links.md b/nap/data/wiki/Javascript-Links.md
deleted file mode 100644
index 87bcff5..0000000
--- a/nap/data/wiki/Javascript-Links.md
+++ /dev/null
@@ -1,9 +0,0 @@
-> Links to Javascript Resources
-
-### Challenges
-- [Code Wars](http://codewars.com)
-- [Hacker Rank](https://hackerrank.com)
-- [Coding Game](http://codingame.com)
-
-### Exercises
-- [Codility](https://codility.com/programmers/lessons/)
\ No newline at end of file
diff --git a/nap/data/wiki/Linking-Your-Account-with-GitHub.md b/nap/data/wiki/Linking-Your-Account-with-GitHub.md
deleted file mode 100644
index 78a84ea..0000000
--- a/nap/data/wiki/Linking-Your-Account-with-GitHub.md
+++ /dev/null
@@ -1,8 +0,0 @@
-In August 2015, we pushed some changes that caused trouble for many of our campers.
-
-If you are unable to link your GitHub account to your current account, here is what we recommend doing: 
-
-1) Sign out with your current account and try signing in with GitHub. 
-2) Check your challenge map. Your account should have no progress. Delete that account here: http://freecodecamp.com/account
-3) Sign into Free Code Camp the way you normally do (Facebook, email, etc). You should see your original progress. 
-3) Now add GitHub to that account, and you should be all set.
\ No newline at end of file
diff --git a/nap/data/wiki/List-of-Free-Code-Camp-city-based-Campsites-and-Chat-rooms.md b/nap/data/wiki/List-of-Free-Code-Camp-city-based-Campsites-and-Chat-rooms.md
deleted file mode 100644
index 643bd01..0000000
--- a/nap/data/wiki/List-of-Free-Code-Camp-city-based-Campsites-and-Chat-rooms.md
+++ /dev/null
@@ -1,428 +0,0 @@
-| City | Facebook | Gitter |
-| --- | --- | --- | 
-| Aarhus | [Facebook](https://www.facebook.com/groups/FreeCodeCampAarhus) | [Gitter](//gitter.im/freecodecamp/Aarhus) |
-| Abu Dhabi | [Facebook](https://www.facebook.com/groups/free.code.camp.abu.dhabi/) | [Gitter](//gitter.im/freecodecamp/AbuDhabi) |
-| Accra | [Facebook](//www.facebook.com/groups/free.code.camp.accra/) | [Gitter](//gitter.im/freecodecamp/Accra) |
-| Adelaide | [Facebook](//www.facebook.com/groups/free.code.camp.adelaide/) | [Gitter](//gitter.im/freecodecamp/Adelaide) |
-| Ahmedabad | [Facebook](//www.facebook.com/groups/free.code.camp.ahmedabad/) | [Gitter](//gitter.im/freecodecamp/Ahmedabad) |
-| Aichi | [Facebook](//www.facebook.com/groups/free.code.camp.aichi/) | [Gitter](//gitter.im/freecodecamp/Aichi) |
-| Alameda | [Facebook](//www.facebook.com/groups/free.code.camp.berkeley/) | [Gitter](//gitter.im/freecodecamp/EastBay) |
-| Albany | [Facebook](//www.facebook.com/groups/free.code.camp.albany.ny/) | [Gitter](//gitter.im/freecodecamp/Albany) |
-| Albuquerque | [Facebook](https://www.facebook.com/groups/free.code.camp.albuquerque/) | [Gitter](//gitter.im/freecodecamp/Albuquerque) |
-| Algiers | [Facebook](https://www.facebook.com/groups/free.code.camp.Algiers/) | [Gitter](//gitter.im/freecodecamp/Algiers) |
-| Allahabad | [Facebook](https://www.facebook.com/groups/free.code.camp.allahabad/) | [Gitter](//gitter.im/freecodecamp/Allahabad) |
-| Almeria | [Facebook](https://www.facebook.com/groups/free.code.camp.almeria/) | [Gitter](//gitter.im/freecodecamp/Almeria) |
-| Amman | [Facebook](//www.facebook.com/groups/free.code.camp.amman/) | [Gitter](//gitter.im/freecodecamp/Amman) |
-| Amsterdam | [Facebook](//www.facebook.com/groups/free.code.camp.amsterdam/) | [Gitter](//gitter.im/freecodecamp/Amsterdam) |
-| Anacortes | [Facebook](https://www.facebook.com/groups/free.code.camp.anacortes/) | [Gitter](//gitter.im/freecodecamp/Anacortes) |
-| Ankara | [Facebook](//www.facebook.com/groups/free.code.camp.ankara/) | [Gitter](//gitter.im/freecodecamp/Ankara) |
-| Ann Arbor | [Facebook](//www.facebook.com/groups/free.code.camp.ann.arbor/) | [Gitter](//gitter.im/freecodecamp/AnnArbor) |
-| Apucarana | [Facebook](//www.facebook.com/groups/free.code.camp.your.apucarana.parana/) | [Gitter](//gitter.im/freecodecamp/Apucarana) |
-| Aracaju | [Facebook](//www.facebook.com/groups/free.code.camp.aracaju/) | [Gitter](//gitter.im/freecodecamp/Aracaju) |
-| Asheville | [Facebook](//www.facebook.com/groups/free.code.camp.asheville/) | [Gitter](//gitter.im/freecodecamp/Asheville) |
-| Asuncion | [Facebook](//www.facebook.com/groups/free.code.camp.asuncion/) | [Gitter](//gitter.im/freecodecamp/Asuncion) |
-| Athens | [Facebook](https://www.facebook.com/groups/free.code.camp.athens.greece/) | [Gitter](//gitter.im/freecodecamp/Athens) |
-| Athens, Ohio | [Facebook](https://www.facebook.com/groups/free.code.camp.athens.ohio/) | [Gitter](//gitter.im/freecodecamp/AthensOH) |
-| Atlanta | [Facebook](//www.facebook.com/groups/free.code.camp.atlanta/) | [Gitter](//gitter.im/freecodecamp/Atlanta) |
-| Auburn, ME| [Facebook]( https://www.facebook.com/groups/free.code.camp.auburn.maine/) | [Gitter](//gitter.im/freecodecamp/AuburnME) |
-| Auckland | [Facebook](//www.facebook.com/groups/awesome.code.camp/) | [Gitter](//gitter.im/freecodecamp/Auckland) |
-| Aurora | [Facebook](https://www.facebook.com/groups/free.code.camp.aurora/) | [Gitter](//gitter.im/freecodecamp/Aurora) |
-| Austin | [Facebook](//www.facebook.com/groups/free.code.camp.austin/) | [Gitter](//gitter.im/freecodecamp/Austin) |
-| Bacau | [Facebook](https://www.facebook.com/groups/free.code.camp.bacau/) | [Gitter](//gitter.im/freecodecamp/Bacau) |
-| Bakersfield | [Facebook](https://www.facebook.com/groups/free.code.camp.bakersfield.california/) | [Gitter](//gitter.im/freecodecamp/Bakersfield) |
-| Baku | [Facebook](https://www.facebook.com/groups/free.code.camp.baku/) | [Gitter](//gitter.im/freecodecamp/Baku) |
-| Baltimore | [Facebook](//www.facebook.com/groups/free.code.camp.baltimore/) | [Gitter](//gitter.im/freecodecamp/Baltimore) |
-| Bandung | [Facebook](//www.facebook.com/groups/free.code.camp.bandung/) | [Gitter](//gitter.im/freecodecamp/Bandung) |
-| Bangkok | [Facebook](//www.facebook.com/groups/free.code.camp.bangkok/) | [Gitter](//gitter.im/freecodecamp/Bangkok) |
-| Barcelona | [Facebook](https://www.facebook.com/groups/free.code.camp.barcelona/) | [Gitter](//gitter.im/freecodecamp/Barcelona) |
-| Barranquilla | [Facebook](https://www.facebook.com/groups/free.code.camp.barranquilla.co/) | [Gitter](//gitter.im/freecodecamp/Barranquilla) |
-| Batticaloa | [Facebook](https://www.facebook.com/groups/free.code.camp.batticaloa/) | [Gitter](//gitter.im/freecodecamp/Batticaloa) |
-| Beirut | [Facebook](https://www.facebook.com/groups/free.code.camp.beirut/) | [Gitter](//gitter.im/freecodecamp/Beirut) |
-| Belem | [Facebook](//www.facebook.com/groups/free.code.camp.belem/) | [Gitter](//gitter.im/freecodecamp/Belem) |
-| Belgrade | [Facebook](//www.facebook.com/groups/free.code.camp.belgrade/) | [Gitter](//gitter.im/freecodecamp/Belgrade) |
-| Belize City | [Facebook](https://www.facebook.com/groups/free.code.camp.belize.city/) | [Gitter](//gitter.im/freecodecamp/BelizeCity) |
-| Belize | [Facebook](//www.facebook.com/groups/free.code.camp.belize/) | [Gitter](//gitter.im/freecodecamp/Belize) |
-| Bellingham | [Facebook](//www.facebook.com/groups/free.code.camp.bellingham/) | [Gitter](//gitter.im/freecodecamp/Bellingham) |
-| Belo Horizonte | [Facebook](//www.facebook.com/groups/free.code.camp.belo.horizonte/) | [Gitter](//gitter.im/freecodecamp/BeloHorizonte) |
-| Bengaluru | [Facebook](//www.facebook.com/groups/free.code.camp.bengaluru/) | [Gitter](//gitter.im/freecodecamp/Bengaluru) |
-| Berkeley | [Facebook](//www.facebook.com/groups/free.code.camp.berkeley/) | [Gitter](//gitter.im/freecodecamp/EastBay) |
-| Berlin | [Facebook](//www.facebook.com/groups/free.code.camp.berlin/) | [Gitter](//gitter.im/freecodecamp/Berlin) |
-| Bhaktapur | [Facebook](//www.facebook.com/groups/free.code.camp.bhaktapur/) | [Gitter](//gitter.im/freecodecamp/Bhaktapur) |
-| Bhubaneswar | [Facebook](//www.facebook.com/groups/free.code.camp.bhubaneswar/) | [Gitter](//gitter.im/freecodecamp/Bhubaneswar) |
-| Bijeljina | [Facebook](//www.facebook.com/groups/free.code.camp.bijeljina/) | [Gitter](//gitter.im/freecodecamp/Bijeljina) |
-| Birmingham | [Facebook](//www.facebook.com/groups/free.code.camp.birmingham.uk/) | [Gitter](//gitter.im/freecodecamp/Birmingham) |
-| Birmingham, Alabama | [Facebook](//www.facebook.com/groups/free.code.camp.oxford.al/) | [Gitter](//gitter.im/freecodecamp/BirminghamAlabama) |
-| Bishkek | [Facebook](//www.facebook.com/groups/free.code.camp.bishkek/) | [Gitter](//gitter.im/freecodecamp/Bishkek) |
-| Bismarck, ND | [Facebook](//www.facebook.com/groups/free.code.camp.bismarck.north.dakota/) | [Gitter](//gitter.im/freecodecamp/Bismarck) |
-| Bloomington, IL | [Facebook](//www.facebook.com/groups/free.code.camp.bloomington.normal/) | [Gitter](//gitter.im/freecodecamp/BloomingtonNormal) |
-| Bloomington, IN | [Facebook](//www.facebook.com/groups/free.code.camp.bloomington.in/) | [Gitter](//gitter.im/freecodecamp/BloomingtonIN) |
-| Bogota | [Facebook](//www.facebook.com/groups/free.code.camp.bogota/) | [Gitter](//gitter.im/freecodecamp/Bogota) |
-| Boise | [Facebook](//www.facebook.com/groups/free.code.camp.boise) | [Gitter](//gitter.im/freecodecamp/Boise) |
-| Boston | [Facebook](//www.facebook.com/groups/free.code.camp.boston/) | [Gitter](//gitter.im/freecodecamp/Boston) |
-| Boulder | [Facebook](//www.facebook.com/groups/free.code.camp.boulder/) | [Gitter](//gitter.im/freecodecamp/Boulder) |
-| Brasilia | [Facebook](//www.facebook.com/groups/free.code.camp.brasilia/) | [Gitter](//gitter.im/freecodecamp/Brasilia) |
-| Brasov | [Facebook](https://www.facebook.com/groups/free.code.camp.brasov) | [Gitter](//gitter.im/freecodecamp/Brasov) |
-| Bratislava | [Facebook](//www.facebook.com/groups/free.code.camp.bratislava/) | [Gitter](//gitter.im/freecodecamp/Bratislava) |
-| Brighton | [Facebook](//www.facebook.com/groups/free.code.camp.brighton/) | [Gitter](//gitter.im/freecodecamp/Brighton) |
-| Brisbane | [Facebook](https://www.facebook.com/groups/free.code.camp.brisbane/) | [Gitter](//gitter.im/freecodecamp/Brisbane) |
-| Brno | [Facebook](//www.facebook.com/groups/free.code.camp.brno/) | [Gitter](//gitter.im/freecodecamp/Brno) |
-| Brussels | [Facebook](//www.facebook.com/groups/free.code.camp.brussels/) | [Gitter](//gitter.im/freecodecamp/Brussels) |
-| Bryan College Station | [Facebook](https://www.facebook.com/groups/free.code.camp.bryan.college.station/) | [Gitter](//gitter.im/freecodecamp/BryanCollegeStation) |
-| Bucaramanga | [Facebook](//www.facebook.com/groups/free.code.camp.bucaramanga/) | [Gitter](//gitter.im/freecodecamp/Bucaramanga) |
-| Bucharest | [Facebook](//www.facebook.com/groups/free.code.camp.bucharest/) | [Gitter](//gitter.im/freecodecamp/Bucharest) |
-| Budapest | [Facebook](//www.facebook.com/groups/free.code.camp.budapest/) | [Gitter](//gitter.im/freecodecamp/Budapest) |
-| Buenos Aires | [Facebook](//www.facebook.com/groups/free.code.camp.buenos.aires/) | [Gitter](//gitter.im/freecodecamp/BuenosAires) |
-| Buffalo | [Facebook](https://www.facebook.com/groups/free.code.camp.buffalo/) | [Gitter](//gitter.im/freecodecamp/Buffalo) |
-| Bury St Edmunds | [Facebook](//www.facebook.com/groups/free.code.camp.Bury.St.Edmunds/) | [Gitter](//gitter.im/freecodecamp/BuryStEdmunds) |
-| Busan | [Facebook](https://www.facebook.com/groups/free.code.camp.busan/) | [Gitter](//gitter.im/freecodecamp/Busan) |
-| Butte, MN| [Facebook]( https://www.facebook.com/groups/free.code.camp.butte.montana/) | [Gitter](//gitter.im/freecodecamp/ButteMN) |
-| Bydgoszcz | [Facebook](//www.facebook.com/groups/free.code.camp.bydgoszcz/) | [Gitter](//gitter.im/freecodecamp/Bydgoszcz) |
-| Cairo | [Facebook](//www.facebook.com/groups/free.code.camp.cairo/) | [Gitter](//gitter.im/freecodecamp/Cairo) |
-| Calgary | [Facebook](//www.facebook.com/groups/free.code.camp.calgary/) | [Gitter](//gitter.im/freecodecamp/Calgary) |
-| Cali | [Facebook](https://www.facebook.com/groups/free.code.camp.cali/) | [Gitter](//gitter.im/freecodecamp/Cali) |
-| Campinas | [Facebook](//www.facebook.com/groups/free.code.camp.campinas/) | [Gitter](//gitter.im/freecodecamp/Campinas) |
-| Canberra | [Facebook](https://www.facebook.com/groups/free.code.camp.canberra/) | [Gitter](//gitter.im/freecodecamp/Canberra) |
-| Cape Cod | [Facebook](//www.facebook.com/groups/free.code.camp.cape.cod/) | [Gitter](//gitter.im/freecodecamp/CapeCod) |
-| Cape Town | [Facebook](//www.facebook.com/groups/free.code.camp.cape.town/) | [Gitter](//gitter.im/freecodecamp/CapeTown) |
-| Caracas | [Facebook](//www.facebook.com/groups/free.code.camp.caracas/) | [Gitter](//gitter.im/freecodecamp/Caracas) |
-| Cardiff | [Facebook](https://www.facebook.com/groups/free.code.camp.cardiff/) | [Gitter](//gitter.im/freecodecamp/Cardiff) |
-| Casablanca | [Facebook](https://www.facebook.com/groups/free.code.camp.casablanca/) | [Gitter](//gitter.im/freecodecamp/Casablanca) |
-| Central Mississippi | [Facebook](https://www.facebook.com/groups/free.code.camp.central.mississippi/) | [Gitter](//gitter.im/freecodecamp/CentralMississippi) |
-| Champaign-Urbana | [Facebook](https://www.facebook.com/groups/free.code.camp.champaign.urbana/) | [Gitter](//gitter.im/freecodecamp/ChampaignUrbana) |
-| Charlotte | [Facebook](//www.facebook.com/groups/free.code.camp.charlotte.nc/) | [Gitter](//gitter.im/freecodecamp/Charlotte) |
-| Chattanooga | [Facebook](//www.facebook.com/groups/free.code.camp.chattanooga/) | [Gitter](//gitter.im/freecodecamp/Chattanooga) |
-| Chennai | [Facebook](//www.facebook.com/groups/free.code.camp.chennai/) | [Gitter](//gitter.im/freecodecamp/Chennai) |
-| Chernivtsi | [Facebook](https://www.facebook.com/groups/free.code.camp.chernivtsi.chernivetska.oblast.u/) | [Gitter](//gitter.im/freecodecamp/Chernivtsi) |
-| Chiang Mai | [Facebook](//www.facebook.com/groups/free.code.camp.chiang.mai/) | [Gitter](//gitter.im/freecodecamp/ChiangMai) |
-| Chicago | [Facebook](//www.facebook.com/groups/free.code.camp.chicago/) | [Gitter](//gitter.im/freecodecamp/Chicago) |
-| Christchurch | [Facebook](//www.facebook.com/groups/free.code.camp.christchurch/) | [Gitter](//gitter.im/freecodecamp/Christchurch) |
-| Cincinnati | [Facebook](//www.facebook.com/groups/free.code.camp.cincinnati/) | [Gitter](//gitter.im/freecodecamp/Cincinnati) |
-| Clarksville | [Facebook](//www.facebook.com/groups/free.code.camp.clarksville.TN/) | [Gitter](//gitter.im/freecodecamp/Clarksville) |
-| Cleveland | [Facebook](//www.facebook.com/groups/free.code.camp.cleveland/) | [Gitter](//gitter.im/freecodecamp/Cleveland) |
-| Cluj | [Facebook](//www.facebook.com/groups/free.code.camp.cluj) | [Gitter](//gitter.im/freecodecamp/Cluj) |
-| Coimbatore | [Facebook](//www.facebook.com/groups/free.code.camp.coimbatore) | [Gitter](//gitter.im/freecodecamp/Coimbatore) |
-| Colombo | [Facebook](https://www.facebook.com/groups/free.code.camp.colombo/) | [Gitter](//gitter.im/freecodecamp/Colombo) |
-| Colorado Springs | [Facebook](//www.facebook.com/groups/freecodecampcoloradosprings/) | [Gitter](//gitter.im/freecodecamp/ColoradoSprings) |
-| Columbus | [Facebook](https://www.facebook.com/groups/free.code.camp.columbus/) | [Gitter](//gitter.im/freecodecamp/Columbus) |
-| Coventry | [Facebook](//www.facebook.com/groups/free.code.camp.coventry/) | [Gitter](//gitter.im/freecodecamp/Coventry) |
-| Cuenca | [Facebook](//www.facebook.com/groups/free.code.camp.cuenca/) | [Gitter](//gitter.im/freecodecamp/Cuenca) |
-| Curitiba | [Facebook](//www.facebook.com/groups/free.code.camp.curitiba/) | [Gitter](//gitter.im/freecodecamp/Curitiba) |
-| Dallas | [Facebook](//www.facebook.com/groups/free.code.camp.dallas/) | [Gitter](//gitter.im/freecodecamp/DallasFortWorth) |
-| Delhi | [Facebook](//www.facebook.com/groups/free.code.camp.delhi/) | [Gitter](//gitter.im/freecodecamp/Delhi) |
-| Denver | [Facebook](//www.facebook.com/groups/free.code.camp.denver/) | [Gitter](//gitter.im/freecodecamp/Denver) |
-| Derby | [Facebook](//www.facebook.com/groups/free.code.camp.derby/) | [Gitter](//gitter.im/freecodecamp/Derby) |
-| Des Moines | [Facebook](//www.facebook.com/groups/free.code.camp.des.moines/) | [Gitter](//gitter.im/freecodecamp/DesMoines) |
-| Detroit | [Facebook](//www.facebook.com/groups/free.code.camp.detroit/) | [Gitter](//gitter.im/freecodecamp/Detroit) |
-| Dhaka | [Facebook](//www.facebook.com/groups/free.code.camp.dhaka/) | [Gitter](//gitter.im/freecodecamp/Dhaka) |
-| Dnipropetrovsk | [Facebook](//www.facebook.com/groups/free.code.camp.dnipropetrovsk) | [Gitter](//gitter.im/freecodecamp/Dnipropetrovsk) |
-| Doha | [Facebook](//www.facebook.com/groups/free.code.camp.doha/) | [Gitter](//gitter.im/freecodecamp/Doha) |
-| Dubai | [Facebook](//www.facebook.com/groups/free.code.camp.dubai/) | [Gitter](//gitter.im/freecodecamp/Dubai) |
-| Dublin | [Facebook](//www.facebook.com/groups/free.code.camp.dublin/) | [Gitter](//gitter.im/freecodecamp/Dublin) |
-| Duluth | [Facebook](https://www.facebook.com/groups/free.code.camp.duluth/) | [Gitter](//gitter.im/freecodecamp/Duluth) |
-| Durango | [Facebook](//www.facebook.com/groups/free.code.camp.durango/) | [Gitter](//gitter.im/freecodecamp/Durango) |
-| Edinburgh | [Facebook](https://www.facebook.com/groups/free.code.camp.edinburgh/) | [Gitter](//gitter.im/freecodecamp/Edinburgh) |
-| Edmonton | [Facebook](//www.facebook.com/groups/free.code.camp.edmonton/) | [Gitter](//gitter.im/freecodecamp/Edmonton) |
-| El Paso | [Facebook](https://www.facebook.com/groups/free.code.camp.el.paso) | [Gitter](//gitter.im/freecodecamp/ElPaso) |
-| Evansville | [Facebook](https://www.facebook.com/groups/free.code.camp.evansville.in/) | [Gitter](//gitter.im/freecodecamp/Evansville) |
-| Farmville | [Facebook](https://www.facebook.com/groups/free.code.camp.farmville.va/) | [Gitter](//gitter.im/freecodecamp/Farmville) |
-| Fayetteville | [Facebook](https://www.facebook.com/groups/free.code.camp.fayetteville.arkansas/) | [Gitter](//gitter.im/freecodecamp/Fayetteville) |
-| Ferizaj | [Facebook](https://www.facebook.com/groups/free.code.camp.ferizaj/) | [Gitter](//gitter.im/freecodecamp/Ferizaj) |
-| Firenze | [Facebook](//www.facebook.com/groups/free.code.camp.firenze/) | [Gitter](//gitter.im/freecodecamp/Firenze) |
-| Flagstaff | [Facebook](//www.facebook.com/groups/free.code.camp.northern.arizona/) | [Gitter](//gitter.im/freecodecamp/NorthernArizona) |
-| Florianopolis | [Facebook](//www.facebook.com/groups/free.code.camp.florianopolis/) | [Gitter](//gitter.im/freecodecamp/Florianopolis) |
-| Folsom | [Facebook](https://www.facebook.com/groups/free.code.camp.folsom) | [Gitter](//gitter.im/freecodecamp/Folsom) |
-| Fort Collins | [Facebook](https://www.facebook.com/groups/free.code.camp.fort.collins/) | [Gitter](//gitter.im/freecodecamp/FortCollins) |
-| Fort Worth | [Facebook](//www.facebook.com/groups/free.code.camp.dallas/) | [Gitter](//gitter.im/freecodecamp/DallasFortWorth) |
-| Fortaleza | [Facebook](https://www.facebook.com/groups/free.code.group.fortaleza/) | [Gitter](//gitter.im/freecodecamp/Fortaleza) |
-| Frankfort | [Facebook](//www.facebook.com/groups/free.code.camp.frankfort.kentucky/) | [Gitter](//gitter.im/freecodecamp/Frankfort) |
-| Frankfurt | [Facebook](//www.facebook.com/groups/free.code.camp.frankfurt.main/) | [Gitter](//gitter.im/freecodecamp/Frankfurt) |
-| Freehold | [Facebook](//www.facebook.com/groups/free.code.camp.freehold/) | [Gitter](//gitter.im/freecodecamp/Freehold) |
-| Fremont | [Facebook](https://www.facebook.com/groups/free.code.camp.fremont/) | [Gitter](//gitter.im/freecodecamp/Fremont) |
-| Fresno | [Facebook](//www.facebook.com/groups/free.code.camp.fresno/) | [Gitter](//gitter.im/freecodecamp/Fresno) |
-| Fuengirola | [Facebook](//www.facebook.com/groups/free.code.camp.fuengirola/) | [Gitter](//gitter.im/freecodecamp/Fuengirola) |
-| Gainesville, FL | [Facebook](//www.facebook.com/groups/free.code.camp.gainesville.fla/) | [Gitter](//gitter.im/freecodecamp/GainesvilleFL) |
-| Galveston | [Facebook](//www.facebook.com/groups/free.code.camp.galveston/) | [Gitter](//gitter.im/freecodecamp/Galveston) |
-| Gdańsk | [Facebook](//www.facebook.com/groups/free.code.camp.trojmiasto/) | [Gitter](//gitter.im/freecodecamp/Trojmiasto) |
-| Gdynia | [Facebook](//www.facebook.com/groups/free.code.camp.trojmiasto) | [Gitter](//gitter.im/freecodecamp/Trojmiasto) |
-| Geneva | [Facebook](//www.facebook.com/groups/free.code.camp.geneva/) | [Gitter](//gitter.im/freecodecamp/Geneva) |
-| Glendora | [Facebook](//www.facebook.com/groups/free.code.camp.Glendora.California/) | [Gitter](//gitter.im/freecodecamp/Glendora) |
-| Goiania | [Facebook](https://www.facebook.com/groups/free.code.camp.goiania/) | [Gitter](//gitter.im/freecodecamp/Goiania) |
-| Granada | [Facebook](//www.facebook.com/groups/free.code.camp.granada/) | [Gitter](//gitter.im/freecodecamp/Granada) |
-| Grand Rapids | [Facebook](//www.facebook.com/groups/free.code.camp.grand.rapids/) | [Gitter](//gitter.im/freecodecamp/GrandRapids) |
-| Guadalajara | [Facebook](//www.facebook.com/groups/fcc.guadalajara) | [Gitter](//gitter.im/freecodecamp/Guadalajara) |
-| Guarapuava | [Facebook](//www.facebook.com/groups/free.code.camp.guarapuava/) | [Gitter](//gitter.im/freecodecamp/Guarapuava) |
-| Guatemala City | [Facebook](https://www.facebook.com/groups/free.code.camp.guatemala/) | [Gitter](//gitter.im/freecodecamp/GuatemalaCity) |
-| Guntur | [Facebook](//www.facebook.com/groups/free.code.camp.guntur/) | [Gitter](//gitter.im/freecodecamp/Guntur) |
-| Gurgaon | [Facebook](https://www.facebook.com/groups/free.code.camp.gurgaon/) | [Gitter](//gitter.im/freecodecamp/Gurgaon) |
-| Göttingen | [Facebook](https://www.facebook.com/groups/free.code.camp.goettingen/) | [Gitter](//gitter.im/freecodecamp/Goettingen) |
-| Hagerstown | [Facebook](//www.facebook.com/groups/free.code.camp.hagerstown/) | [Gitter](//gitter.im/freecodecamp/Hagerstown) |
-| Haifa | [Facebook]( //www.facebook.com/groups/free.code.camp.Haifa/) | [Gitter](//gitter.im/freecodecamp/Christchurch) |
-| Halifax | [Facebook](https://www.facebook.com/groups/free.code.camp.halifax/) | [Gitter](//gitter.im/freecodecamp/Halifax) |
-| Hamburg | [Facebook](//www.facebook.com/groups/free.code.camp.hamburg/) | [Gitter](//gitter.im/freecodecamp/Hamburg) |
-| Hampton Roads | [Facebook](//www.facebook.com/groups/free.code.camp.hamptonroads/) | [Gitter](//gitter.im/freecodecamp/HamptonRoads) |
-| Hanoi | [Facebook](//www.facebook.com/groups/free.code.camp.hanoi/) | [Gitter](//gitter.im/freecodecamp/Hanoi) |
-| Hartford | [Facebook](//www.facebook.com/groups/free.code.camp.hartford.connecticut/) | [Gitter](//gitter.im/freecodecamp/Hartford) |
-| Hermosillo | [Facebook](//www.facebook.com/groups/free.code.camp.Hermosillo/) | [Gitter](//gitter.im/freecodecamp/Hermosillo) |
-| Hickory | [Facebook](//www.facebook.com/groups/free.code.camp.hickory.nc) | [Gitter](//gitter.im/freecodecamp/Hickory) |
-| Ho Chi Minh City | [Facebook](//www.facebook.com/groups/free.code.camp.hochiminhcity/) | [Gitter](//gitter.im/freecodecamp/HoChiMinhCity) |
-| Hobart | [Facebook](https://www.facebook.com/groups/free.code.camp.hobart/) | [Gitter](//gitter.im/freecodecamp/Hobart) |
-| Hong Kong | [Facebook](//www.facebook.com/groups/free.code.camp.hk/) | [Gitter](//gitter.im/freecodecamp/HongKong) |
-| Houston | [Facebook](//www.facebook.com/groups/free.code.camp.houston/) | [Gitter](//gitter.im/freecodecamp/Houston) |
-| Hove | [Facebook](//www.facebook.com/groups/free.code.camp.hove) | [Gitter](//gitter.im/freecodecamp/Hove) |
-| Huntsville | [Facebook](https://www.facebook.com/groups/free.code.camp.huntsville/) | [Gitter](//gitter.im/freecodecamp/Huntsville) |
-| Hyderabad | [Facebook](//www.facebook.com/groups/free.code.camp.hyderabad/) | [Gitter](//gitter.im/freecodecamp/Hyderabad) |
-| Iasi | [Facebook](//www.facebook.com/groups/free.code.camp.iasi.romania/) | [Gitter](//gitter.im/freecodecamp/Iasi) |
-| idaho Falls | [Facebook](https://www.facebook.com/groups/free.code.camp.idaho.falls.idaho/) | [Gitter](//gitter.im/freecodecamp/IdahoFalls) |
-| Indianapolis | [Facebook](//www.facebook.com/groups/free.code.camp.indianapolis.in/) | [Gitter](//gitter.im/freecodecamp/Indianapolis) |
-| Ipswich | [Facebook](https://www.facebook.com/groups/free.code.camp.ipswich.qld/) | [Gitter](//gitter.im/freecodecamp/Ipswich) |
-| Irkutsk | [Facebook](//www.facebook.com/groups/free.code.camp.irkutsk/) | [Gitter](//gitter.im/freecodecamp/Irkutsk) |
-| Isfahan | [Facebook](https://www.facebook.com/groups/free.code.camp.isfahan/) | [Gitter](//gitter.im/freecodecamp/Isfahan) |
-| Islamabad | [Facebook](//www.facebook.com/groups/free.code.camp.islamabad/) | [Gitter](//gitter.im/freecodecamp/Islamabad) |
-| Istanbul | [Facebook](//www.facebook.com/groups/free.code.camp.istanbul/) | [Gitter](//gitter.im/freecodecamp/Istanbul) |
-| Ivano Frankivsk | [Facebook](//www.facebook.com/groups/free.code.camp.ivano.frankivsk/) | [Gitter](//gitter.im/freecodecamp/IvanoFrankivsk) |
-| Izmir | [Facebook](https://www.facebook.com/groups/free.code.camp.izmir) | [Gitter](//gitter.im/freecodecamp/Izmir) |
-| Jacarei | [Facebook](https://www.facebook.com/groups/free.code.camp.sao.paulo.jacarei/) | [Gitter](//gitter.im/freecodecamp/Jacarei) |
-| Jackson, MS | [Facebook](https://www.facebook.com/groups/free.code.camp.jackson.ms) | [Gitter](//gitter.im/freecodecamp/JacksonMS) |
-| Jacksonville | [Facebook](//www.facebook.com/groups/free.code.camp.jacksonville/) | [Gitter](//gitter.im/freecodecamp/Jacksonville) |
-| Jaffna | [Facebook](https://www.facebook.com/groups/free.code.camp.jaffna/) | [Gitter](//gitter.im/freecodecamp/Jaffna) |
-| Jaipur | [Facebook](//www.facebook.com/groups/free.code.camp.jaipur/) | [Gitter](//gitter.im/freecodecamp/Jaipur) |
-| Jakarta | [Facebook](//www.facebook.com/groups/free.code.camp.jakarta/) | [Gitter](//gitter.im/freecodecamp/Jakarta) |
-| Jamnagar | [Facebook](https://www.facebook.com/groups/free.code.camp.jamnagar.guj.in/) | [Gitter](//gitter.im/freecodecamp/) |
-| Jerusalem | [Facebook](https://www.facebook.com/groups/free.code.camp.jerusalem/) | [Gitter](//gitter.im/freecodecamp/Jerusalem) |
-| Joao Pessoa | [Facebook](//www.facebook.com/groups/free.code.camp.joao.pessoa/) | [Gitter](//gitter.im/freecodecamp/JoaoPessoa) |
-| Johannesburg | [Facebook](//www.facebook.com/groups/free.code.camp.johannesburg/) | [Gitter](//gitter.im/freecodecamp/Johannesburg) |
-| Johor | [Facebook](//facebook.com/groups/free.code.camp.nusajaya.malaysia/) | [Gitter](//gitter.im/FreeCodeCamp/Nusajaya) |
-| Juarezchi | [Facebook](https://www.facebook.com/groups/free.code.camp.juarezchi/) | [Gitter](//gitter.im/freecodecamp/Juarezchi) |
-| Kaduna | [Facebook](//www.facebook.com/groups/free.code.camp.kaduna/) | [Gitter](//gitter.im/freecodecamp/Kaduna) |
-| Kalamazoo | [Facebook](//www.facebook.com/groups/free.code.camp.kalamazoo/) | [Gitter](//gitter.im/freecodecamp/Kalamazoo) |
-| Kampala | [Facebook](//www.facebook.com/groups/free.code.camp.kampala/) | [Gitter](//gitter.im/freecodecamp/Kampala) |
-| Kansas City | [Facebook](//www.facebook.com/groups/free.code.camp.kansascity/) | [Gitter](//gitter.im/freecodecamp/KansasCity) |
-| Karachi | [Facebook](//www.facebook.com/groups/free.code.camp.karachi/) | [Gitter](//gitter.im/freecodecamp/Karachi) |
-| Kathmandu | [Facebook](//www.facebook.com/groups/free.code.camp.kathmandu/) | [Gitter](//gitter.im/freecodecamp/Kathmandu) |
-| Kemerovo | [Facebook](//www.facebook.com/groups/free.code.camp.kemerovo/) | [Gitter](//gitter.im/freecodecamp/Kemerovo) |
-| Kerch | [Facebook](//www.facebook.com/groups/free.code.camp.kerch/) | [Gitter](//gitter.im/freecodecamp/Kerch) |
-| Kiev | [Facebook](//www.facebook.com/groups/free.code.camp.kiev/) | [Gitter](//gitter.im/freecodecamp/Kiev) |
-| Killeen | [Facebook](https://www.facebook.com/groups/free.code.camp.killeen.texas/) | [Gitter](//gitter.im/freecodecamp/Killeen) |
-| Kingston, ON | [Facebook](//www.facebook.com/groups/free.code.camp.kingston.ontario/) | [Gitter](//gitter.im/freecodecamp/KingstonON) |
-| Knoxville | [Facebook](//www.facebook.com/groups/free.code.camp.knoxville.tn/) | [Gitter](//gitter.im/freecodecamp/Knoxville) |
-| Koeln | [Facebook](//www.facebook.com/groups/free.code.camp.koeln/) | [Gitter](//gitter.im/freecodecamp/Koeln) |
-| Kolkata | [Facebook](//www.facebook.com/groups/free.code.camp.kolkata/) | [Gitter](//gitter.im/freecodecamp/Kolkata) |
-| Kosovo | [Facebook](https://www.facebook.com/groups/free.code.camp.kosovo/) | [Gitter](//gitter.im/freecodecamp/Kosovo) |
-| Kozhikode | [Facebook](https://www.facebook.com/groups/free.code.camp.kozhikode/) | [Gitter](//gitter.im/freecodecamp/Kozhikode) |
-| Krasnodar | [Facebook](//www.facebook.com/groups/free.code.camp.krasnodar/) | [Gitter](//gitter.im/freecodecamp/Krasnodar) |
-| Kryvyi Rih | [Facebook](//www.facebook.com/groups/free.code.camp.kryvyi.rih/) | [Gitter](//gitter.im/freecodecamp/KryvyiRih) |
-| Kuala Lumpur | [Facebook](//www.facebook.com/groups/free.code.camp.malaysia.kl/) | [Gitter](//gitter.im/freecodecamp/KualaLumpur) |
-| La Crosse | [Facebook](//www.facebook.com/groups/free.code.camp.la.crosse) | [Gitter](//gitter.im/freecodecamp/LaCrosse) |
-| La Paz | [Facebook](//www.facebook.com/groups/free.code.camp.La.Paz/) | [Gitter](//gitter.im/freecodecamp/LaPaz) |
-| Lae | [Facebook](https://www.facebook.com/groups/free.code.camp.papua.new.guinea.lae/) | [Gitter](//gitter.im/freecodecamp/Lae) |
-| Lagos | [Facebook](//www.facebook.com/groups/free.code.camp.lagos/) | [Gitter](//gitter.im/freecodecamp/Lagos) |
-| Lahore | [Facebook](//www.facebook.com/groups/free.code.camp.lahore/) | [Gitter](//gitter.im/freecodecamp/Lahore) |
-| Lakeland | [Facebook](https://www.facebook.com/groups/Free.Code.Camp.Lakeland.Florida/) | [Gitter](//gitter.im/freecodecamp/Lakeland) |
-| Las Cruces | [Facebook](//www.facebook.com/groups/free.code.camp.lc.nm/) | [Gitter](//gitter.im/freecodecamp/LasCruces) |
-| Las Vegas | [Facebook](https://www.facebook.com/groups/free.code.camp.las.vegas.nv/) | [Gitter](//gitter.im/freecodecamp/LasVegas) |
-| Lawrence | [Facebook](https://www.facebook.com/groups/free.code.camp.lawrence) | [Gitter](//gitter.im/freecodecamp/Lawrence) |
-| Leesburg | [Facebook](//www.facebook.com/groups/free.code.camp.leesburg/) | [Gitter](//gitter.im/freecodecamp/Leesburg) |
-| Leesville | [Facebook](//www.facebook.com/groups/free.code.camp.leesville.la/) | [Gitter](//gitter.im/freecodecamp/Leesville) |
-| Lehi | [Facebook](//www.facebook.com/groups/free.code.camp.lehi/) | [Gitter](//gitter.im/freecodecamp/Lehi) |
-| Lexington | [Facebook](//www.facebook.com/groups/free.code.camp.lexington/) | [Gitter](//gitter.im/freecodecamp/Lexington) |
-| Lima | [Facebook](//www.facebook.com/groups/Free.Code.Camp.Lima/) | [Gitter](//gitter.im/freecodecamp/Lima) |
-| Limassol | [Facebook](//www.facebook.com/groups/free.code.camp.limassol/) | [Gitter](//gitter.im/freecodecamp/Limassol) |
-| Lindsay | [Facebook](//www.facebook.com/groups/free.code.camp.lindsay/) | [Gitter](//gitter.im/freecodecamp/Lindsay) |
-| Lisbon | [Facebook](//www.facebook.com/groups/free.code.camp.lisbon/) | [Gitter](//gitter.im/freecodecamp/Lisbon) |
-| Little Rock | [Facebook](https://www.facebook.com/groups/free.code.camp.little.rock/) | [Gitter](//gitter.im/freecodecamp/LittleRock) |
-| London | [Facebook](//www.facebook.com/groups/free.code.camp.london/) | [Gitter](//gitter.im/freecodecamp/London) |
-| London, ON | [Facebook](https://www.facebook.com/groups/free.code.camp.london.on/) | [Gitter](//gitter.im/freecodecamp/LondonON) |
-| Los Alamos | [Facebook](//www.facebook.com/groups/free.code.camp.los.alamos.nm/) | [Gitter](//gitter.im/freecodecamp/LosAlamos) |
-| Los Angeles | [Facebook](//www.facebook.com/groups/free.code.camp.los.angeles/) | [Gitter](//gitter.im/freecodecamp/FCCLosAngeles) |
-| Louisville | [Facebook](https://www.facebook.com/groups/free.code.camp.Louisville) | [Gitter](//gitter.im/freecodecamp/Louisville) |
-| Luanda | [Facebook](https://www.facebook.com/groups/free.code.camp.luanda/) | [Gitter](//gitter.im/freecodecamp/Luanda) |
-| Lubbock | [Facebook](//www.facebook.com/groups/free.code.camp.lubbock/) | [Gitter](//gitter.im/freecodecamp/Lubbock) |
-| Lviv | [Facebook](//www.facebook.com/groups/free.code.camp.lviv/) | [Gitter](//gitter.im/freecodecamp/Lviv) |
-| Madison | [Facebook](//www.facebook.com/groups/free.code.camp.madison.wisconsin/) | [Gitter](//gitter.im/freecodecamp/Madison) |
-| Madrid | [Facebook](//www.facebook.com/groups/free.code.camp.madrid/) | [Gitter](//gitter.im/freecodecamp/Madrid) |
-| Manchester, UK | [Facebook](//www.facebook.com/groups/free.code.camp.manchester/) | [Gitter](//gitter.im/freecodecamp/Manchester) |
-| Manila | [Facebook](//www.facebook.com/groups/free.code.camp.manila/) | [Gitter](//gitter.im/freecodecamp/Manila) |
-| Melbourne | [Facebook](//www.facebook.com/groups/free.code.camp.Melbourne/) | [Gitter](//gitter.im/freecodecamp/Melbourne) |
-| Mexico City | [Facebook](//www.facebook.com/groups/free.code.camp.mexico.df/) | [Gitter](//gitter.im/freecodecamp/MexicoCity) |
-| Miami | [Facebook](//www.facebook.com/groups/free.code.camp.miami/) | [Gitter](//gitter.im/freecodecamp/Miami) |
-| Mianwali | [Facebook](https://www.facebook.com/groups/free.code.camp.mianwali/) | [Gitter](//gitter.im/freecodecamp/Mianwali) |
-| Milan | [Facebook](https://www.facebook.com/groups/free.code.camp.milan/) | [Gitter](//gitter.im/freecodecamp/Milan) |
-| Milwaukee | [Facebook](//www.facebook.com/groups/free.code.camp.milwaukee/) | [Gitter](//gitter.im/freecodecamp/Milwaukee) |
-| Minneapolis | [Facebook](//www.facebook.com/groups/free.code.camp.minneapolis/) | [Gitter](//gitter.im/freecodecamp/Minneapolis) |
-| Minsk | [Facebook](//www.facebook.com/groups/free.code.camp.Minsk/) | [Gitter](//gitter.im/freecodecamp/Minsk) |
-| Mississippi Gulf Coast | [Facebook](//www.facebook.com/groups/free.code.camp.msgulfcoast/) | [Gitter](//gitter.im/freecodecamp/MississippiGulfCoast) |
-| Missoula | [Facebook](//www.facebook.com/groups/free.code.camp.missoula/) | [Gitter](//gitter.im/freecodecamp/Missoula) |
-| Modesto | [Facebook](https://www.facebook.com/groups/free.code.camp.modesto/) | [Gitter](//gitter.im/freecodecamp/Modesto) |
-| Monterrey | [Facebook](//www.facebook.com/groups/free.code.camp.monterrey/) | [Gitter](//gitter.im/freecodecamp/Monterrey) |
-| Montevideo | [Facebook](https://www.facebook.com/groups/free.code.camp.montevideo/) | [Gitter](//gitter.im/freecodecamp/Montevideo) |
-| Montgomery | [Facebook](//www.facebook.com/groups/free.code.camp.montgomery.alabama/) | [Gitter](//gitter.im/freecodecamp/Montgomery) |
-| Montreal | [Facebook](//www.facebook.com/groups/free.code.camp.montreal/) | [Gitter](//gitter.im/freecodecamp/Montreal) |
-| Moosejaw | [Facebook](//www.facebook.com/groups/free.code.camp.moosejaw) | [Gitter](//gitter.im/freecodecamp/Moosejaw) |
-| Morgan City | [Facebook](//www.facebook.com/groups/free.code.camp.morgan.ciry.la/) | [Gitter](//gitter.im/freecodecamp/MorganCity) |
-| Moscow | [Facebook](//www.facebook.com/groups/free.code.camp.moscow/) | [Gitter](//gitter.im/freecodecamp/Moscow) |
-| Moss Point | [Facebook](https://www.facebook.com/groups/free.code.camp.moss.point.mississippi/) | [Gitter](//gitter.im/freecodecamp/MossPoint) |
-| Multan | [Facebook](//www.facebook.com/groups/free.code.camp.multan) | [Gitter](//gitter.im/freecodecamp/Multan) |
-| Mumbai | [Facebook](https://www.facebook.com/groups/frre.code.camp.mumbai/) | [Gitter](//gitter.im/freecodecamp/Mumbai) |
-| Munich | [Facebook](//www.facebook.com/groups/free.code.camp.munich/) | [Gitter](//gitter.im/freecodecamp/Munich) |
-| Mysore | [Facebook](//www.facebook.com/groups/free.code.camp.mysore/) | [Gitter](//gitter.im/freecodecamp/Mysore) |
-| Nairobi | [Facebook](//www.facebook.com/groups/free.code.camp.nairobi/) | [Gitter](//gitter.im/freecodecamp/Nairobi) |
-| Napoli | [Facebook](https://www.facebook.com/groups/free.code.camp.napoli) | [Gitter](//gitter.im/freecodecamp/Napoli) |
-| Nashik | [Facebook](//www.facebook.com/groups/free.code.camp.your.nashik/) | [Gitter](//gitter.im/freecodecamp/Nashik) |
-| Nashville | [Facebook](//www.facebook.com/groups/free.code.camp.nashville/) | [Gitter](//gitter.im/freecodecamp/Nashville) |
-| New Brunswick | [Facebook](https://www.facebook.com/groups/free.code.camp.new.brunswick.new.jersey/) | [Gitter](//gitter.im/freecodecamp/NewBrunswick) |
-| New Haven | [Facebook](//www.facebook.com/groups/free.code.camp.new.haven/) | [Gitter](//gitter.im/freecodecamp/NewHaven) |
-| New Orleans | [Facebook](//www.facebook.com/groups/free.code.camp.neworleans/) | [Gitter](//gitter.im/freecodecamp/NewOrleans) |
-| New Paltz | [Facebook](//www.facebook.com/groups/free.code.camp.new.paltz/) | [Gitter](//gitter.im/freecodecamp/NewPaltz) |
-| New Westminster | [Facebook](//www.facebook.com/groups/free.code.camp.new.westminster/) | [Gitter](//gitter.im/freecodecamp/NewWestminster) |
-| New York City | [Facebook](//www.facebook.com/groups/free.code.camp.new.york.city/) | [Gitter](//gitter.im/freecodecamp/NewYorkCity) |
-| Nicosia | [Facebook](//www.facebook.com/groups/free.code.camp.nicosia/) | [Gitter](//gitter.im/freecodecamp/Nicosia) |
-| Noida | [Facebook](//www.facebook.com/groups/free.code.camp.noida/) | [Gitter](//gitter.im/freecodecamp/Noida) |
-| Norfolk | [Facebook](https://www.facebook.com/groups/free.code.camp.norfolk) | [Gitter](//gitter.im/freecodecamp/Norfolk) |
-| Normal | [Facebook](//www.facebook.com/groups/free.code.camp.bloomington.normal/) | [Gitter](//gitter.im/freecodecamp/BloomingtonNormal) |
-| North Mississippi | [Facebook](https://www.facebook.com/groups/free.code.camp.north.mississippi/) | [Gitter](//gitter.im/freecodecamp/NorthMississippi) |
-| North Platte | [Facebook](//www.facebook.com/groups/free.code.camp.north.platte/) | [Gitter](//gitter.im/freecodecamp/NorthPlatte) |
-| Nusajaya | [Facebook](//facebook.com/groups/free.code.camp.nusajaya.malaysia//) | [Gitter](//gitter.im/FreeCodeCamp/Nusajaya) |
-| Oakland | [Facebook](//www.facebook.com/groups/free.code.camp.berkeley/) | [Gitter](//gitter.im/freecodecamp/EastBay) |
-| Oklahoma City | [Facebook](//www.facebook.com/groups/free.code.camp.oklahoma.city/) | [Gitter](//gitter.im/freecodecamp/OklahomaCity) |
-| Olympia | [Facebook](//www.facebook.com/groups/free.code.camp.olympia/) | [Gitter](//gitter.im/FreeCodeCamp/Olympia) |
-| Omaha | [Facebook](//www.facebook.com/groups/free.code.camp.omaha/) | [Gitter](//gitter.im/freecodecamp/Omaha) |
-| Orange County | [Facebook](//www.facebook.com/groups/free.code.camp.orange.county/) | [Gitter](//gitter.im/freecodecamp/OrangeCounty) |
-| Orlando | [Facebook](//www.facebook.com/groups/free.code.camp.orlando/) | [Gitter](//gitter.im/freecodecamp/Orlando) |
-| Ottawa | [Facebook](https://www.facebook.com/groups/free.code.camp.ottawa/) | [Gitter](//gitter.im/freecodecamp/Ottawa) |
-| Panama City | [Facebook](https://www.facebook.com/groups/free.code.camp.panama.city) | [Gitter](//gitter.im/freecodecamp/PanamaCity) |
-| Parana | [Facebook](//www.facebook.com/groups/free.code.camp.your.apucarana.parana/) | [Gitter](//gitter.im/freecodecamp/Parana) |
-| Paris | [Facebook](//www.facebook.com/groups/free.code.camp.paris/) | [Gitter](//gitter.im/freecodecamp/Paris) |
-| Pasadena | [Facebook](//www.facebook.com/groups/free.code.camp.pasadena.ca/) | [Gitter](//gitter.im/freecodecamp/Pasadena) |
-| Pasto | [Facebook](//www.facebook.com/groups/free.code.camp.pasto/) | [Gitter](//gitter.im/freecodecamp/Pasto) |
-| Penang | [Facebook](//www.facebook.com/groups/free.code.camp.penang/) | [Gitter](//gitter.im/freecodecamp/Penang) |
-| Perth | [Facebook](//www.facebook.com/groups/free.code.camp.perth/) | [Gitter](//gitter.im/freecodecamp/Perth) |
-| Perugia | [Facebook](//www.facebook.com/groups/free.code.camp.perugia.it/) | [Gitter](//gitter.im/freecodecamp/Perugia) |
-| Philadelphia | [Facebook](//www.facebook.com/groups/free.code.camp.philadelphia/) | [Gitter](//gitter.im/freecodecamp/Philadelphia) |
-| Phoenix | [Facebook](//www.facebook.com/groups/free.code.camp.tempe.phoenix.scottsdale/) | [Gitter](//gitter.im/freecodecamp/Phoenix) |
-| Pittsburgh | [Facebook](//www.facebook.com/groups/free.code.camp.pittsburgh.pa/) | [Gitter](//gitter.im/freecodecamp/Pittsburgh) |
-| Poitiers | [Facebook](//www.facebook.com/groups/free.code.camp.poitiers/) | [Gitter](//gitter.im/freecodecamp/Poitiers) |
-| Pondicherry | [Facebook](https://www.facebook.com/groups/free.code.camp.pondicherry/) | [Gitter](//gitter.im/freecodecamp/Pondicherry) |
-| Port Harcourt | [Facebook](//www.facebook.com/groups/free.code.camp.port.harcourt/) | [Gitter](//gitter.im/freecodecamp/Harcourt) |
-| Portland | [Facebook](//www.facebook.com/groups/free.code.camp.portland/) | [Gitter](//gitter.im/freecodecamp/Portland) |
-| Porto Alegre | [Facebook](https://www.facebook.com/groups/free.code.camp.porto.alegre.rs/) | [Gitter](//gitter.im/freecodecamp/PortoAlegre) |
-| Porto | [Facebook](//www.facebook.com/groups/free.code.camp.porto/) | [Gitter](//gitter.im/freecodecamp/Porto) |
-| Prague | [Facebook](https://www.facebook.com/groups/free.code.camp.prague/) | [Gitter](//gitter.im/freecodecamp/Prague) |
-| Prescott | [Facebook](//www.facebook.com/groups/free.code.camp.northern.arizona/) | [Gitter](//gitter.im/freecodecamp/NorthernArizona) |
-| Pristina | [Facebook](//www.facebook.com/groups/free.code.camp.pristina/) | [Gitter](//gitter.im/freecodecamp/Pristina) |
-| Providence | [Facebook](//www.facebook.com/groups/free.code.camp.providence/) | [Gitter](//gitter.im/freecodecamp/Providence) |
-| Provo | [Facebook](//www.facebook.com/groups/free.code.camp.provo/) | [Gitter](//gitter.im/freecodecamp/Provo) |
-| Puebla | [Facebook](https://www.facebook.com/groups/free.code.camp.pueblaMX/) | [Gitter](//gitter.im/freecodecamp/Puebla) |
-| Pune | [Facebook](//www.facebook.com/groups/free.code.camp.pune/) | [Gitter](//gitter.im/freecodecamp/Pune) |
-| Quibdo | [Facebook](//www.facebook.com/groups/free.code.camp.quibdo/) | [Gitter](//gitter.im/freecodecamp/Quibdo) |
-| Raleigh | [Facebook](//www.facebook.com/groups/free.code.camp.raleigh/) | [Gitter](//gitter.im/freecodecamp/Raleigh) |
-| Ranchi | [Facebook](//www.facebook.com/groups/free.code.camp.ranchi/) | [Gitter](//gitter.im/freecodecamp/Ranchi) |
-| Reading | [Facebook](https://www.facebook.com/groups/free.code.camp.reading/) | [Gitter](//gitter.im/freecodecamp/Reading) |
-| Recife | [Facebook](//www.facebook.com/groups/free.code.camp.recife) | [Gitter](//gitter.im/freecodecamp/Recife) |
-| Redmond, OR | [Facebook](//www.facebook.com/groups/free.code.camp.remond.oregon/) | [Gitter](//gitter.im/freecodecamp/RedmondOR) |
-| Reno | [Facebook](https://www.facebook.com/groups/free.code.camp.reno/) | [Gitter](//gitter.im/freecodecamp/Reno) |
-| Reykjavik | [Facebook](https://www.facebook.com/groups/free.code.camp.reykjavik/) | [Gitter](//gitter.im/freecodecamp/Reykjavik) |
-| Rice Lake | [Facebook](//www.facebook.com/groups/free.code.camp.rice.lake.wi/) | [Gitter](//gitter.im/freecodecamp/RiceLake) |
-| Richmond | [Facebook](//www.facebook.com/groups/free.code.camp.richmond/) | [Gitter](//gitter.im/freecodecamp/Richmond) |
-| Rio de Janeiro | [Facebook](//www.facebook.com/groups/free.code.camp.rio.de.janeiro/) | [Gitter](//gitter.im/freecodecamp/RiodeJaneiro) |
-| Riverside, CA | [Facebook](https://www.facebook.com/groups/free.code.camp.riverside.ca/) | [Gitter](//gitter.im/freecodecamp/RiversideCA) |
-| Rochester, NY | [Facebook](//www.facebook.com/groups/free.code.camp.Rochester.New.York/) | [Gitter](//gitter.im/freecodecamp/RochesterNY) |
-| Roma | [Facebook](//www.facebook.com/groups/free.code.camp.roma/) | [Gitter](//gitter.im/freecodecamp/Roma) |
-| Rotterdam | [Facebook](//www.facebook.com/groups/free.code.camp.rotterdam/) | [Gitter](//gitter.im/freecodecamp/Rotterdam) |
-| Sacramento | [Facebook](//www.facebook.com/groups/free.code.camp.sacramento/) | [Gitter](//gitter.im/freecodecamp/Sacramento) |
-| Saint George | [Facebook](//www.facebook.com/groups/free.code.camp.saint.george/) | [Gitter](//gitter.im/freecodecamp/SaintGeorge) |
-| Saint Louis | [Facebook](//www.facebook.com/groups/free.code.camp.saint.louis/) | [Gitter](//gitter.im/freecodecamp/SaintLouis) |
-| Saint Paul | [Facebook](//www.facebook.com/groups/free.code.camp.saint.paul.mn/) | [Gitter](//gitter.im/freecodecamp/SaintPaul) |
-| Salamanca | [Facebook](//www.facebook.com/groups/free.code.camp.salamanca/) | [Gitter](//gitter.im/freecodecamp/Salamanca) |
-| Salisbury, MD | [Facebook](https://www.facebook.com/groups/free.code.camp.salisbury.maryland/) | [Gitter](//gitter.im/freecodecamp/SalisburyMD) |
-| Salt Lake City | [Facebook](//www.facebook.com/groups/free.code.camp.salt.lake.city/) | [Gitter](//gitter.im/freecodecamp/SaltLakeCity) |
-| Salvador | [Facebook](//www.facebook.com/groups/free.code.camp.salvador/) | [Gitter](//gitter.im/freecodecamp/Salvador) |
-| San Antonio | [Facebook](https://www.facebook.com/groups/free.code.camp.san.antonio) | [Gitter](//gitter.im/freecodecamp/SanAntonio) |
-| San Bernardino | [Facebook](//www.facebook.com/groups/free.code.camp.san.bernardino/) | [Gitter](//gitter.im/freecodecamp/SanBernardino) |
-| San Diego | [Facebook](//www.facebook.com/groups/free.code.camp.san.diego/) | [Gitter](//gitter.im/freecodecamp/SanDiego) |
-| San Francisco | [Facebook](//www.facebook.com/groups/free.code.camp.san.francisco) | [Gitter](//gitter.im/freecodecamp/SanFrancisco) |
-| San Jose | [Facebook](//www.facebook.com/groups/free.code.camp.san.jose) | [Gitter](//gitter.im/freecodecamp/SanJose) |
-| San Jose, Costa Rica | [Facebook](https://www.facebook.com/groups/free.code.camp.san.jose.costa.rica/) | [Gitter](//gitter.im/freecodecamp/SanJoseCostaRica) |
-| San Juan | [Facebook](//www.facebook.com/groups/free.code.camp.sanjuan.pr/) | [Gitter](//gitter.im/freecodecamp/SanJuan) |
-| Santa Barbara | [Facebook](//www.facebook.com/groups/free.code.camp.santa.barbara/) | [Gitter](//gitter.im/freecodecamp/SantaBarbara) |
-| Santa Cruz | [Facebook](//www.facebook.com/groups/free.code.camp.SC/) | [Gitter](//gitter.im/freecodecamp/SantaCruz) |
-| Santa Luis Obispo | [Facebook](//www.facebook.com/groups/free.code.camp.SLO/) | [Gitter](//gitter.im/freecodecamp/SanLuisObispo) |
-| Santiago | [Facebook](https://www.facebook.com/groups/free.code.camp.santiago/) | [Gitter](//gitter.im/freecodecamp/Santiago) |
-| Santo Domingo | [Facebook](//www.facebook.com/groups/free.code.camp.dr/) | [Gitter](//gitter.im/freecodecamp/SantoDomingo) |
-| Sao Paulo | [Facebook](//www.facebook.com/groups/free.code.camp.sao.paulo/) | [Gitter](//gitter.im/freecodecamp/SaoPaulo) |
-| Savannah | [Facebook](//www.facebook.com/groups/free.code.camp.savannah/) | [Gitter](//gitter.im/freecodecamp/Savannah) |
-| Scottsdale | [Facebook](//www.facebook.com/groups/free.code.camp.tempe.phoenix.scottsdale/) | [Gitter](//gitter.im/freecodecamp/Phoenix) |
-| Seattle | [Facebook](//www.facebook.com/groups/free.code.camp.seattle/) | [Gitter](//gitter.im/freecodecamp/Seattle) |
-| Sedona | [Facebook](//www.facebook.com/groups/free.code.camp.northern.arizona/) | [Gitter](//gitter.im/freecodecamp/NorthernArizona) |
-| Seoul | [Facebook](//www.facebook.com/groups/free.code.camp.seoul/) | [Gitter](//gitter.im/freecodecamp/Seoul) |
-| Shanghai | [Facebook](https://www.facebook.com/groups/free.code.camp.Shanghai/) | [Gitter](//gitter.im/freecodecamp/Shanghai) |
-| Sheffield | [Facebook](//www.facebook.com/groups/free.code.camp.sheffield/) | [Gitter](//gitter.im/freecodecamp/Sheffield) |
-| Shenzhen | [Facebook](https://www.facebook.com/groups/free.code.camp.shenzhen/) | [Gitter](//gitter.im/freecodecamp/Shenzhen) |
-| Sidoarjo | [Facebook](//www.facebook.com/groups/free.code.camp.sidoarjo/) | [Gitter](//gitter.im/freecodecamp/Sidoarjo) |
-| Sierra Vista | [Facebook](//www.facebook.com/groups/free.code.camp.sierra.vista/) | [Gitter](//gitter.im/freecodecamp/SierraVista) |
-| Singapore | [Facebook](//www.facebook.com/groups/free.code.camp.singapore/) | [Gitter](//gitter.im/freecodecamp/Singapore) |
-| Skopje | [Facebook](//www.facebook.com/groups/free.code.camp.skopje/) | [Gitter](//gitter.im/freecodecamp/Skopje) |
-| Solo | [Facebook](//www.facebook.com/groups/free.code.camp.solo/) | [Gitter](//gitter.im/freecodecamp/Solo) |
-| Sopot | [Facebook](//www.facebook.com/groups/free.code.camp.trojmiasto/) | [Gitter](//gitter.im/freecodecamp/Trojmiasto) |
-| South Bend | [Facebook](//www.facebook.com/groups/free.code.camp.south.bend/) | [Gitter](//gitter.im/freecodecamp/SouthBend) |
-| Spartanburg | [Facebook](https://www.facebook.com/groups/free.code.camp.spartanburg/) | [Gitter](//gitter.im/freecodecamp/Spartanburg) |
-| Srinagar | [Facebook](https://www.facebook.com/groups/free.code.camp.srinagar/) | [Gitter](//gitter.im/freecodecamp/Srinagar) |
-| St Cloud | [Facebook](//www.facebook.com/groups/free.code.camp.stcloud/) | [Gitter](//gitter.im/freecodecamp/StCloud) |
-| Stockholm | [Facebook](https://www.facebook.com/groups/free.code.camp.stockholm.sweden/) | [Gitter](//gitter.im/freecodecamp/Stockholm) |
-| Stroke-on-Trent | [Facebook](https://www.facebook.com/groups/free.code.camp.stoke.on.trent/) | [Gitter](//gitter.im/freecodecamp/StrokeOnTrent) |
-| Struga | [Facebook](//www.facebook.com/groups/free.code.camp.struga/) | [Gitter](//gitter.im/freecodecamp/Struga) |
-| Stuttgart | [Facebook](//www.facebook.com/groups/free.code.camp.stuttgart/) | [Gitter](//gitter.im/freecodecamp/Stuttgart) |
-| Surabaya | [Facebook](https://www.facebook.com/groups/free.code.camp.surabaya/) | [Gitter](//gitter.im/freecodecamp/Surabaya) |
-| Surrey | [Facebook](https://www.facebook.com/groups/free.code.camp.surrey/) | [Gitter](//gitter.im/freecodecamp/Surrey) |
-| Sydney | [Facebook](//www.facebook.com/groups/free.code.camp.sydney.au/) | [Gitter](//gitter.im/freecodecamp/Sydney) |
-| Sydney, Nova Scotia | [Facebook](https://www.facebook.com/groups/free.code.camp.sydney.ns/) | [Gitter](//gitter.im/freecodecamp/SydneyNS) |
-| Taipei | [Facebook](//www.facebook.com/groups/free.code.camp.taipei/) | [Gitter](//gitter.im/freecodecamp/Taipei) |
-| Tallahassee | [Facebook](https://www.facebook.com/groups/free.code.camp.tallahassee.florida/) | [Gitter](//gitter.im/freecodecamp/Tallahassee) |
-| Tallinn | [Facebook](https://www.facebook.com/groups/free.code.camp.tallinn/) | [Gitter](//gitter.im/freecodecamp/Tallinn) |
-| Tampa Bay | [Facebook](//www.facebook.com/groups/free.code.camp.tampa/) | [Gitter](//gitter.im/freecodecamp/Tampa) |
-| Tashkent | [Facebook](https://www.facebook.com/groups/free.code.camp.tashkent/) | [Gitter](//gitter.im/freecodecamp/Tashkent) |
-| Tegucigalpa | [Facebook](https://www.facebook.com/groups/free.code.camp.Honduras/) | [Gitter](//gitter.im/freecodecamp/Tegucigalpa) |
-| Tehran | [Facebook](https://www.facebook.com/groups/free.code.camp.tehran/) | [Gitter](//gitter.im/freecodecamp/Tehran) |
-| Tel Aviv | [Facebook](//www.facebook.com/groups/free.code.camp.Tel.Aviv/) | [Gitter](//gitter.im/freecodecamp/TelAviv) |
-| Temecula | [Facebook](//www.facebook.com/groups/free.code.camp.temecula/) | [Gitter](//gitter.im/freecodecamp/Temecula) |
-| Tempe | [Facebook](//www.facebook.com/groups/free.code.camp.tempe.phoenix.scottsdale/) | [Gitter](//gitter.im/freecodecamp/Phoenix) |
-| Thessaloniki | [Facebook](https://www.facebook.com/groups/free.code.camp.thessaloniki/) | [Gitter](//gitter.im/freecodecamp/Thessaloniki) |
-| Ticino | [Facebook](https://www.facebook.com/groups/free.code.camp.ticino/) | [Gitter](//gitter.im/freecodecamp/Ticino) |
-| Tijuana | [Facebook](//www.facebook.com/groups/free.code.camp.tijuana/) | [Gitter](//gitter.im/freecodecamp/Tijuana) |
-| Timisoara | [Facebook](https://www.facebook.com/groups/free.code.camp.timisoara/) | [Gitter](//gitter.im/freecodecamp/Timisoara) |
-| Tirana | [Facebook](//www.facebook.com/groups/free.code.camp.tirana/) | [Gitter](//gitter.im/freecodecamp/Tirana) |
-| Tokyo | [Facebook](https://www.facebook.com/groups/free.code.camp.tokyo/) | [Gitter](//gitter.im/freecodecamp/Tokyo) |
-| Tom's River | [Facebook](https://www.facebook.com/groups/free.code.camp.toms.river/) | [Gitter](//gitter.im/freecodecamp/TomsRiver) |
-| Torino | [Facebook](//www.facebook.com/groups/free.code.camp.torino/) | [Gitter](//gitter.im/freecodecamp/Torino) |
-| Toronto | [Facebook](//www.facebook.com/groups/free.code.camp.to/) | [Gitter](//gitter.im/freecodecamp/Toronto) |
-| Tri-Cities Washington | [Facebook](https://www.facebook.com/groups/free.code.camp.tricitieswa/) | [Gitter](//gitter.im/freecodecamp/TriCitiesWashington) |
-| Trivandrum | [Facebook](https://www.facebook.com/groups/freecodecamp.trivandrum/) | [Gitter](//gitter.im/freecodecamp/Trivandrum) |
-| Tucson | [Facebook](//www.facebook.com/groups/free.code.camp.tucson/) | [Gitter](//gitter.im/freecodecamp/Tucson) |
-| Tulsa | [Facebook](//www.facebook.com/groups/free.code.camp.tulsa/) | [Gitter](//gitter.im/freecodecamp/Tulsa) |
-| Tunis | [Facebook](https://www.facebook.com/groups/free.code.camp.tunisia/) | [Gitter](//gitter.im/freecodecamp/Tunis) |
-| University Center | [Facebook](https://www.facebook.com/groups/free.code.camp.university.center/) | [Gitter](//gitter.im/freecodecamp/UniversityCenter) |
-| Valdosta | [Facebook](https://www.facebook.com/groups/free.code.camp.valdosta/) | [Gitter](//gitter.im/freecodecamp/Valdosta) |
-| Valencia | [Facebook](//www.facebook.com/groups/free.code.camp.vlc/) | [Gitter](//gitter.im/freecodecamp/Valencia) |
-| Vancouver | [Facebook](//www.facebook.com/groups/free.code.camp.vancouver.bc.canada/) | [Gitter](//gitter.im/freecodecamp/Vancouver) |
-| Verde Valley | [Facebook](//www.facebook.com/groups/free.code.camp.northern.arizona/) | [Gitter](//gitter.im/freecodecamp/NorthernArizona) |
-| Victoria | [Facebook](//www.facebook.com/groups/free.code.camp.victoria.bc/) | [Gitter](//gitter.im/freecodecamp/Victoria) |
-| Vilnius | [Facebook](//www.facebook.com/groups/free.code.camp.vilnius.lt/) | [Gitter](//gitter.im/freecodecamp/Vilnius) |
-| Virginia Beach | [Facebook](//www.facebook.com/groups/free.code.camp.virginia.beach/) | [Gitter](//gitter.im/freecodecamp/VirginiaBeach) |
-| Vitória | [Facebook](//www.facebook.com/groups/free.code.camp.vitoria.e.regiao.metropolitana.es/) | [Gitter](//gitter.im/freecodecamp/Vitoria) |
-| Vladivostok | [Facebook](https://www.facebook.com/groups/free.code.camp.vladivostok/) | [Gitter](//gitter.im/freecodecamp/Vladivostok) |
-| Warrington | [Facebook](https://www.facebook.com/groups/free.code.camp.warrington/) | [Gitter](//gitter.im/freecodecamp/Warrington) |
-| Warsaw | [Facebook](https://www.facebook.com/groups/free.code.camp.warsaw/) | [Gitter](//gitter.im/freecodecamp/Warsaw) |
-| Washington, DC | [Facebook](//www.facebook.com/groups/free.code.camp.washington.dc/) | [Gitter](//gitter.im/freecodecamp/WashingtonDC) |
-| Waterford | [Facebook](//www.facebook.com/groups/free.code.camp.waterford/) | [Gitter](//gitter.im/freecodecamp/Waterford) |
-| Wichita | [Facebook](//www.facebook.com/groups/free.code.camp.wichita/) | [Gitter](//gitter.im/freecodecamp/Wichita) |
-| Winnipeg | [Facebook](//www.facebook.com/groups/free.code.camp.winnipeg/) | [Gitter](//gitter.im/freecodecamp/Winnipeg) |
-| Wuerzburg | [Facebook](https://www.facebook.com/groups/free.code.camp.wuerzburg/) | [Gitter](//gitter.im/freecodecamp/Wuerzburg) |
-| Yangon | [Facebook](//www.facebook.com/groups/free.code.camp.myanmar) | [Gitter](//gitter.im/freecodecamp/Yangon) |
-| Yaounde | [Facebook](//www.facebook.com/groups/free.code.camp.yaounde) | [Gitter](//gitter.im/freecodecamp/Yaounde) |
-| Yaroslavl | [Facebook](https://www.facebook.com/groups/free.code.camp.yaroslavl/) | [Gitter](//gitter.im/freecodecamp/Yaroslavl) |
-| Yekaterinburg | [Facebook](//www.facebook.com/groups/free.code.camp.yekaterinburg) | [Gitter](//gitter.im/freecodecamp/Yekaterinburg) |
-| Yerevan | [Facebook](//www.facebook.com/groups/free.code.camp.armenia/) | [Gitter](//gitter.im/freecodecamp/Yerevan) |
-| Zagreb | [Facebook](//www.facebook.com/groups/free.code.camp.zagreb/) | [Gitter](//gitter.im/freecodecamp/Zagreb) |
-| Znojmo | [Facebook](//www.facebook.com/groups/free.code.camp.znojmo/) | [Gitter](//gitter.im/freecodecamp/Znojmo) |
-| Zurich | [Facebook](//www.facebook.com/groups/free.code.camp.zurich/) | [Gitter](//gitter.im/freecodecamp/Zurich) |
-
-If your city isn't listed here, you should [create a Campsite for your city](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-create-a-Campsite-for-your-city).
\ No newline at end of file
diff --git a/nap/data/wiki/More-useful-APIs.md b/nap/data/wiki/More-useful-APIs.md
deleted file mode 100644
index 5f33f37..0000000
--- a/nap/data/wiki/More-useful-APIs.md
+++ /dev/null
@@ -1,31 +0,0 @@
-There are two more things you have to do before this to be useful to you, however. Say you want to show all the *things* associated with the username requested with that page: you must first  
- 
-1. Have a “username” or “owner” field in your *thing* schema at **/server/api/thing/thing.model.js**  
-2. Write a custom route in **/server/api/thing/index.js** to catch a request for a specific username. The request from your frontend might look something like:
-
-~~~javascript
- $http.get('/api/things/' + username).success( … 
-
-~~~
-so you’ll add a line into your **index.js** like:
-
-```javascript
-
-router.get('/:user', controller.indexUser);
-```  
-  and then in **thing.controller.js** you’ll write an *exports.indexUser* function like so:
-
-~~~javascript
-exports.indexUser = function(req, res) {
-	Thing.find({owner:req.params.user}, function (err, things) {
-		if(err) return res.send(500, err);
-		res.json(200, things);
-	});
-};
-~~~
-
-
-Warning!!! this method only works right if usernames are absolutely unique between users. The default authentication system that comes with the angular-fullstack generator does not have unique usernames, so you’re probably better off using the *user._id* field to determine unique users in your database for now, unless you want to implement unique user names yourself by altering your **/api/user/user.model.js**, **/api/user/user.controller.js**, and your **/app/client/account/signup/signup.controller.js**. Thankfully, you should know how to go about doing all that after reading this guide!
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Dynamic-URLs-using-%24routeParams)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Get-info-about-the-current-user)
\ No newline at end of file
diff --git a/nap/data/wiki/Official-Free-Code-Camp-Chat-Rooms.md b/nap/data/wiki/Official-Free-Code-Camp-Chat-Rooms.md
deleted file mode 100644
index adfa954..0000000
--- a/nap/data/wiki/Official-Free-Code-Camp-Chat-Rooms.md
+++ /dev/null
@@ -1,38 +0,0 @@
-The following are our official chat rooms.
-
-**Please note that all chat rooms listed here are publicly accessible and indexed by search engines, so only share email addresses or other sensitive information in private messages.**
-
-| Chat Room | Description |
-| --- | --- |
-| [FreeCodeCamp](https://gitter.im/freecodecamp/FreeCodeCamp) | our main chat room - hang out and chat about life and learning to code | 
-| [Help](https://gitter.im/freecodecamp/Help) | get help with our Waypoint challenges from your fellow campers | 
-| [HelpZiplines](https://gitter.im/freecodecamp/HelpZiplines) | get help with our Zipline challenges from your fellow campers | 
-| [HelpBonfires](https://gitter.im/freecodecamp/HelpBonfires) | get help with our Bonfire challenges from your fellow campers | 
-| [HelpBasejumps](https://gitter.im/freecodecamp/HelpBasejumps) | get help with our Basejump challenges from your fellow campers | 
-| [NonprofitProjects](https://gitter.im/freecodecamp/NonprofitProjects) | get help with your Nonprofit Projects from your fellow campers | 
-| [CodingJobs](https://gitter.im/freecodecamp/CodingJobs) | chat about the process of getting a coding job, such as portfolios, networking, and interviewing | 
-| [YouCanDoThis](https://gitter.im/freecodecamp/YouCanDoThis) | learning to code is hard - share your feelings and get moral support here | 
-| [News](https://gitter.im/freecodecamp/News) | chat about stories trending on [Camper News](http://freecodecamp.com/news) | 
-| [LetsPair](https://gitter.im/freecodecamp/LetsPair) | find fellow campers to pair program with using [Screen Hero](/field-guide/how-do-i-install-screenhero) | 
-| [TeamViewer](https://gitter.im/freecodecamp/TeamViewer) | find fellow campers who use Linux and pair program using [Team Viewer](https:https://www.teamviewer.com/en/download/linux.aspx) | 
-| [PairProgrammingWomen](https://gitter.im/freecodecamp/PairProgrammingWomen) | this women-only chat room helps women pair program with other women if they so desire |
-| [40PlusDevs](https://gitter.im/freecodecamp/40PlusDevs) | campers who are over 40+ years old can chat here if they so desire |
-| [LiveCoding](https://gitter.im/freecodecamp/LiveCoding) | chat about streaming webdev and gamedev on [Twitch.tv](https://twitch.tv/freecodecamp) and [LiveCoding.tv](https://www.livecoding.tv/freecodecamp) |
-| [CodeReview](https://gitter.im/freecodecamp/CodeReview) | give and receive constructive feedback from your fellow campers on Bonfires Solutions, Zipline apps and Basejump apps | 
-| [HalfWayClub](https://gitter.im/freecodecamp/HalfWayClub) | this room is only for campers who have finished all the Bonfires, Ziplines and Basejumps |
-| [Beta](https://gitter.im/freecodecamp/Beta) | chat about experimental changes that are live on [beta.freecodecamp.com](http://beta.freecodecamp.com) | 
-| [CurriculumDevelopment](https://gitter.im/FreeCodeCamp/CurriculumDevelopment) | discuss the current and future Curriculum for FreeCodeCamp |
-| [Wiki](https://gitter.im/freecodecamp/Wiki) | propose new articles and coordinate improvements to this wiki | 
-| [Issues](https://gitter.im/freecodecamp/Issues) | this is the place to discuss issues with our open source codebase and coordinate pull requests | 
-| [DataScience](https://gitter.im/freecodecamp/DataScience) | let's measure and improve our community's efficacy by studying Free Code Camp's open data | 
-| [Design](https://gitter.im/freecodecamp/Design) | chat about design theory and practice | 
-| [BookClub](https://gitter.im/freecodecamp/BookClub) | chat about [these free coding books](http://blog.freecodecamp.com/2015/06/25-free-resources-for-new-javascript-developers.html) and more | 
-
-[World Language chat rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/World-Language-Chat-Rooms)
-
-
-[World Language chat rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/World-Language-Chat-Rooms)
-[Casual chat rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/Casual-Chat-Rooms)
-[Campsite chat rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites/)
-
-By joining these chat rooms, you accept our [Code of Conduct](https://github.com/FreeCodeCamp/freecodecamp/wiki/Code-of-Conduct).
\ No newline at end of file
diff --git a/nap/data/wiki/Other-resources-that-Free-Code-Camp-recommends-to-nonprofits.md b/nap/data/wiki/Other-resources-that-Free-Code-Camp-recommends-to-nonprofits.md
deleted file mode 100644
index 53bbae9..0000000
--- a/nap/data/wiki/Other-resources-that-Free-Code-Camp-recommends-to-nonprofits.md
+++ /dev/null
@@ -1,40 +0,0 @@
-Please note that Free Code Camp is not partnered with, nor do we receive a referral fee from, any of the following providers. We simply want to help guide you towards a solution for your organization.
-
-### Skills-based Volunteer Organizations:
-- [http://www.volunteermatch.com](http://www.volunteermatch.com) 
-- [http://www.catchafire.org](http://www.catchafire.org) 
-
-###Building a website: 
-- [http://www.wix.com/](http://www.wix.com/) 
-- [https://wordpress.com/](https://wordpress.com/) 
-- [Build it yourself for free with no code](http://www.freecodecamp.com/field-guide/how-can-i-deploy-a-website-without-writing-any-code-at-all) 
-
-### Donor and Volunteer Management Systems 
-- [http://causesignal.com](http://causesignal.com) 
-- [https://www.thedatabank.com/](https://www.thedatabank.com/) 
-- [http://www.donorsnap.com/](http://www.donorsnap.com/) 
-- [http://www.donorperfect.com/](http://www.donorperfect.com/) 
-- [https://www.blackbaud.com/fundraising-crm/etapestry-donor-management](https://www.blackbaud.com/fundraising-crm/etapestry-donor-management) 
-- [http://www.z2systems.com](http://www.z2systems.com/) 
-- [http://www.regpacks.com/volunteer-management](http://www.regpacks.com/volunteer-management/) 
-- [http://sumac.com](http://sumac.com/) 
-- [http://www.volgistics.com](http://www.volgistics.com) 
-
-### Inventory Management Systems 
-- [https://www.ezofficeinventory.com/industries/non-profits](https://www.ezofficeinventory.com/industries/non-profits) 
-- [https://www.ordoro.com](https://www.ordoro.com) 
-- [http://www.unleashedsoftware.com](http://www.unleashedsoftware.com) 
-
-### E-Learning platforms 
-- [http://www.dokeos.com](http://www.dokeos.com/) 
-- [http://www.efrontlearning.net/](http://www.efrontlearning.net/) 
-- [https://moodle.org/](https://moodle.org/) 
-- [https://sakaiproject.org/](https://sakaiproject.org/) 
-
-### Community Management 
-- [https://civicrm.org/](https://civicrm.org/) 
-- [http://tcmgr.com/](http://tcmgr.com/) 
-
-### Electronic Forms 
-- [http://www.google.com/forms](http://www.google.com/forms) 
-- [http://www.typeform.com](http://www.typeform.com)
\ No newline at end of file
diff --git a/nap/data/wiki/Pair-programming-and-why-it-is-special.md b/nap/data/wiki/Pair-programming-and-why-it-is-special.md
deleted file mode 100644
index cd457ff..0000000
--- a/nap/data/wiki/Pair-programming-and-why-it-is-special.md
+++ /dev/null
@@ -1,13 +0,0 @@
-Pair Programming is an Agile Development practice that was born out of the **Extreme Programming** movement.
-
-Working as a team of [exactly] two, at a single computer, the pair will slide the keyboard and mouse back-and-forth throughout a "pairing session".  This increases the code quality by providing a "greater than the sum of its parts" effect of two developers working on a single problem domain.
-
-The increase in quality of the code, combined with the effect of knowledge and understanding on the project being spread across multiple developers, can produce a large savings in cost on the project as a whole.
-
-In a Test Driven Development (TDD) shop, it is most common for each member of the pair to take turns a) writing a test and b) writing code to pass the test.  This "ping pong" yields a cumulative effect on the overall quality of the final product.
-
-
-To be most effective it is important that pairs are intermixed; not the same couple of developers **always** working together. 
-
-Pair programming is considered to be very "social". It can be akin to a marriage because you learn to cooperate with a peer in a close, give-and-take relationship.  As such it is often very difficult to become comfortable with pair programming.  Some developers simply NEVER feel quite at-home.  In the end, the willingness to share, be a bit vulnerable and work cooperatively toward a better product will make you a far better developer (and a better person overall).
- 
\ No newline at end of file
diff --git a/nap/data/wiki/Pseudoclassical-class-definition-OOp.md b/nap/data/wiki/Pseudoclassical-class-definition-OOp.md
deleted file mode 100644
index 37e2cf5..0000000
--- a/nap/data/wiki/Pseudoclassical-class-definition-OOp.md
+++ /dev/null
@@ -1,38 +0,0 @@
-###Overview
-
-Pseudoclassical class definition happens in 2 code blocks instead of one, which happens in other languages like Python and PHP.
-
-The first block is called the "Constructor Function" which is where attributes of the class is declared. These are the aspects of the class that are unique to each new instance. Example with cars is that brand, color, and location can differ. In the second block of code you declare the methods that will be shared by each instance of the class. Examples are things the car can do, drive forward, stop, open door.
-
-### Example
-
-```javascript
-var Car = function(brand, color, location) {
- this.brand = brand;
- this.color = color;
- this.location = location
-};
-
-Car.prototype = {
- move: function() { this.location++; },
- stop: function() { this.location = 0; },
-};
-```
-
-###Explanation
-
-The reason for declaring the entire class in 2 blocks is to save on memory when you start creating instances of the class. If the class declaration was "Functional" style then there is a new copy of the method(s) made for **each** instance. By declaring the class "Pseudoclassical" style only a *single* of copy of the methods are stored in memory.
-
-When a instance of the class attempt to access a method:
-
-```javascript
-var x_car = new Car('lexus', 'white', 0);
-x_car.move();
-```
-
-The interpreter will actually *first* fail to find the called method in the object itself since it was made from the Car constructor function. As you can see above there is no reference to any of the methods in the Car constructor function. From there the interpreter searches to the `Car.prototype` which is now shared between all instances. There the interpreter find the method that was called!
-
-####Further reading: 
-[Natac's Blog](https://natacseanc.wordpress.com/2015/08/04/javascript-object-create-and-classes/)
-
-[MDN Classes](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript)
\ No newline at end of file
diff --git a/nap/data/wiki/Pull-Request-Contribute.md b/nap/data/wiki/Pull-Request-Contribute.md
deleted file mode 100644
index b06df3b..0000000
--- a/nap/data/wiki/Pull-Request-Contribute.md
+++ /dev/null
@@ -1,22 +0,0 @@
-> A (PR)pull request is a method of submitting contributions to an open source project. It is often the preferred way of submitting contributions to a project using a Distributed Version Control System (DVCS) such as Git.
-
-FreeCodeCamp is an Open Source project and all of the contents are freely editable.
-
-- [Fork](https://help.github.com/articles/fork-a-repo/) the project on GitHub.
-- [Clone](https://help.github.com/articles/cloning-a-repository/) it to a local machine.  Do not edit online in github.com, as the editor may cause issues with JSON formatted data.
-- [Create a branch](https://help.github.com/articles/creating-and-deleting-branches-within-your-repository/) and make your changes in that branch and commit them.
-- [Push](https://help.github.com/articles/pushing-to-a-remote/) the branch online (if editing locally).
-- [Create a pull request](https://help.github.com/articles/creating-a-pull-request/) against the **"staging"** branch.
-- The title (also called the subject) of your PR should be descriptive of your changes. i.e. `fix typo in basic-javascript challenge` 
-- If the PR is meant to fix a specific issue, append to the end of your PR's commit message `closes #1337`. This tells GitHub to close that issue if the PR is merged.
-- Do NOT add issue numbers to the title.
-
-These are general guidelines for PR's that work across most projects. It gives everyone a quick guide to your changes when looking at the commit history of a project. 
-
-*Note:  Not all pull requests are accepted. FCC project maintainers will explain the reason of non-acceptance.*
-
-## Further Reading
-* [GitHub & Git Foundations Training](https://www.youtube.com/playlist?list=PLg7s6cbtAD15G8lNyoaYDuKZSKyJrgwB-) - How to use Git and GitHub
-* [FreeCodeCamp Contribution Guidelines](https://github.com/FreeCodeCamp/FreeCodeCamp#contributing)
-* [How to write Git commit messages](http://chris.beams.io/posts/git-commit/)
-* [How to Clone FCC to a Windows PC](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-to-clone-the-FreeCodeCamp-website-on-a-Windows-pc)
\ No newline at end of file
diff --git a/nap/data/wiki/Quick-tip-keep-data-in-sync.md b/nap/data/wiki/Quick-tip-keep-data-in-sync.md
deleted file mode 100644
index 1e930f7..0000000
--- a/nap/data/wiki/Quick-tip-keep-data-in-sync.md
+++ /dev/null
@@ -1,27 +0,0 @@
-Say you want something to show up on the user view when you add it to the database. A new *thing* object will instantly show up in an *ng-repeat* loop in your HTML view if you simply add it to your local array with  
-
-~~~javascript
-
-$scope.awesomeThings.push(newThing);
-~~~
-
-But you’ll still need to add it to your database collection. Add it to your collection with  
-
-~~~javascript
-
-$http.post('/api/things', newThing);	
-
-~~~
-But wait! You’ll soon realize that while all the other things in your *$scope.awesomeThings* array have unique ids assigned by MongoDB (under the *thing.\_id* property), your *newThing* object will not, which will make it hard for you at some point to make database actions on it (deleting it from your database requires you to use its *._id* property). So what you’ll want to do after you add it to your *$scope.awesomeThings* array (because we want it to show up on the user’s page immediately). Altogether, your code to add a newThing to your local array and database will look like:
-
-~~~javascript
-$scope.awesomeThings.push(newThing);
-$http.post('/api/things', newThing).success(function(thatThingWeJustAdded) {
-	$scope.awesomeThings.pop(); // let's lose that id-lacking newThing 
-	$scope.awesomeThings.push(thatThingWeJustAdded); // and add the id-having newThing!
-};
-~~~
-This updates the local array for seemingly instant results for your user and then syncs it to your database and updates the local array in the background with the database’s version of your *newThing* object, unique *._id* and all. Notice the callback we pass to the *success* function receives the new *thing* back from the database as an argument! This way you can easily add it back to your local scope without too much overhead.
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Seed-data)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Dynamic-URLs-using-$routeParams)
\ No newline at end of file
diff --git a/nap/data/wiki/RTFM.md b/nap/data/wiki/RTFM.md
deleted file mode 100644
index 3664618..0000000
--- a/nap/data/wiki/RTFM.md
+++ /dev/null
@@ -1,11 +0,0 @@
-> RTFM is an initialism for the expression "Read The F**king Manual"
-
-![RTFM Comic](http://i.imgur.com/UxbHkrB.png)
-
-## Urban Dictionary
-
-> "Read The F**king Manual" — a term showing the frustration of being bothered with questions so trivial that the asker could have quickly figured out the answer on their own with minimal effort, usually by reading readily-available documents. People who say "RTFM!" might be considered rude, but the true rude ones are the annoying people who take absolutely no self-responsibility and expect to have all the answers handed to them personally.
-
-*"Damn, that's the twelveth time that somebody posted this question to the message board today! RTFM, already!"*
-
-https://www.youtube.com/watch?v=Bumx4AerJUQ
\ No newline at end of file
diff --git a/nap/data/wiki/Refresh-Your-Browser-Cache.md b/nap/data/wiki/Refresh-Your-Browser-Cache.md
deleted file mode 100644
index 9fdfbca..0000000
--- a/nap/data/wiki/Refresh-Your-Browser-Cache.md
+++ /dev/null
@@ -1,10 +0,0 @@
-You may have to do a "hard refresh" of a page in your browser if you have an out of date, cached version of that website.
-
-While on the problematic site use the key combination below to trigger a hard refresh depending on your operating system:
-* Windows: CTRL + F5
-* Mac/Apple: Apple + R or command + R
-* Linux: F5
-
-To learn more about this read: http://refreshyourcache.com/en/cache/
-
-If a hard refresh doesn't work, try opening the problematic page in your browser's private browsing mode.
\ No newline at end of file
diff --git a/nap/data/wiki/Restrict-a-page-to-authenticated-users.md b/nap/data/wiki/Restrict-a-page-to-authenticated-users.md
deleted file mode 100644
index 2608f63..0000000
--- a/nap/data/wiki/Restrict-a-page-to-authenticated-users.md
+++ /dev/null
@@ -1,15 +0,0 @@
-Let's say you have a route that you want to restrict to logged-in users; maybe you have a <a href="#">/profile</a> page that lets your users fill in some information about themselves, but it wouldn't work if they weren't logged in. Open **/client/app/profile/profile.js**, and add `authenticate: true` to the options passed to *$routeProvider.when* like so:
-
-~~~javascript 
-    $routeProvider
-      .when('/profile', {
-        templateUrl: 'app/profile/profile.html',
-        controller: 'ProfileCtrl',
-        authenticate: true // restrict to authenticated users
-      });
-~~~
-
-This way, if the user isn't authenticated when they try to access the <A href="#">/profile</a> page, they'll be redirected to your login screen to authenticate before continuing to their profile page.
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Get-info-about-the-current-user)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/isLoggedInAsync())
\ No newline at end of file
diff --git a/nap/data/wiki/Searching-for-Your-Issue-on-Github.md b/nap/data/wiki/Searching-for-Your-Issue-on-Github.md
deleted file mode 100644
index 0965ab7..0000000
--- a/nap/data/wiki/Searching-for-Your-Issue-on-Github.md
+++ /dev/null
@@ -1,9 +0,0 @@
-If you still see problems after [Getting Help on Gitter](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/How-to-Get-Help-on-Gitter), you will want to try to see if anyone else has posted about a similar problem.
-
-![gif walking through the subsequent steps to search GitHub for the issue](http://i.imgur.com/MdrSdQW.gif)
-
-1. Go to FreeCodeCamp's [Github Issues](https://github.com/FreeCodeCamp/FreeCodeCamp/issues) page.
-
-2. Use the search bar to search for already filed issues that may be related to your problem.
- * If you find one, read it! You can subscribe to get updates about that specific issue by clicking on `Subscribe` in the sidebar.  You can also comment on the issue if you have something to add.
- * If you cannot find any relevant issues you should [Create a New Github Issue](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Creating-a-New-Github-Issue).
\ No newline at end of file
diff --git a/nap/data/wiki/Seed-data.md b/nap/data/wiki/Seed-data.md
deleted file mode 100644
index dedb17e..0000000
--- a/nap/data/wiki/Seed-data.md
+++ /dev/null
@@ -1,6 +0,0 @@
-The *things* that show up on your app's main view are part of some seed data that is added to your database (including your test and admin users) every time you restart your app (by running `grunt serve` in the command line). This data is defined in **/server/config/seed.js**.  
-
-You can add, remove, or change data in this file, and it will be written to your database, overwriting any duplicates the next time you run `grunt serve`. If an object defined in **seed.js** is overwritten, the database will assign a new *.\_id* property to it (we'll cover *.\_id* properties in the next section), which may give you some issues later on in testing. To avoid this, you can turn off seeding by setting `seedDB: false` in **/server/config/environment/development.js**.
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Accessing-the-database-from-your-frontend)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Quick-tip:-keep-data-in-sync)
\ No newline at end of file
diff --git a/nap/data/wiki/Slack.md b/nap/data/wiki/Slack.md
deleted file mode 100644
index ab84076..0000000
--- a/nap/data/wiki/Slack.md
+++ /dev/null
@@ -1,9 +0,0 @@
-### Slack is a popular chatroom service that Free Code Camp outgrew
-
-![Free Code Camp's Slack usage stats](https://www.evernote.com/l/AHRvSgBsEqZMBqugb3gWNG9jSKhPT8Dj5FAB/image.png)
-
-As much as we enjoyed using this service, it is a poor fit for large open source communities. This said, many open source communities still use Slack, and Slack does nothing to discourage this practice.
-
-If you're curious, you can read about [Slack's false advertising and the debacle this caused in June 2015](http://blog.freecodecamp.com/2015/06/so-yeah-we-tried-slack-and-we-deeply-regretted-it.html).
-
-Free Code Camp now uses [Gitter](https://github.com/FreeCodeCamp/freecodecamp/wiki/Gitter).
\ No newline at end of file
diff --git a/nap/data/wiki/Spanish-Translation-Terminology.md b/nap/data/wiki/Spanish-Translation-Terminology.md
deleted file mode 100644
index ae9257d..0000000
--- a/nap/data/wiki/Spanish-Translation-Terminology.md
+++ /dev/null
@@ -1,59 +0,0 @@
-#Spanish terminology alignment
-
-Para evitar confusión para otros Campers necesitamos alinearnos todos los traductores con la misma terminología. Para ello, hemos creado una lista con las palabras más comúnes y las traducciones que hemos estado utilizando hasta ahora.
-
-Vale recalcar que todos los términos están abiertos a discusión. En caso se tenga que hacer algún cambio, nos pueden enviar un mensaje directo a través de Slack a @miya o @eabedrapo.
-
-##FCC terminology
-
-###Untranslated
-* Free Code Camp
-* Waypoint
-* Bonfire
-* Zipline
-* Basejump
-* Top menu buttons.
-* Camper
-* Full Stack
-* Bug
-
-
-##CS terminology
-
-###Untranslated
-* Hardware
-* Software
-* Bit
-* Byte
-* Front-end
-* Link
-* Framework
-* Query
-
-###Translated
-* Boolean Logic: Lógica Booleana
-* Loop: Búcle
-* Computer Science: Informática
-* Run (a program): Ejecutar
-* Click: Darle click
-* Responsive: Adaptable
-
-##General terminology
-
-###Translated
-* Non-profit: Empresas sin fines de lucro
-* Self-paced: Manejados a tu propio ritmo
-
-##HTML / CSS terminology
-
-###Non-Traslated
-* Web
-* Tests & challengeSeeds (they shouldn't be translated, at least for this first version).
-
-
-####To do
-Video para mostrar a otras personas como colaborar con la traducción y revisión de los archivos.
-
-####To discuss
-Género a usar? ejem: "Una de las mejores maneras de mantenerte **motivado** cuando estás aprendiendo..."
-* "motivado o motivada" (ambos?)
\ No newline at end of file
diff --git a/nap/data/wiki/Streaks.md b/nap/data/wiki/Streaks.md
deleted file mode 100644
index e4ad4ca..0000000
--- a/nap/data/wiki/Streaks.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Your user profile displays your recent activity. If you get [Brownie Points](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Brownie-Points/) on several consecutive days, you will start a streak.
-
-![A picture of a camper's streak readout showing a 21-day streak](https://www.evernote.com/l/AlyDvfhZplROUZxyMN8dIGGd-DQT7Bn8S9oB/image.png)
-
-This shows everyone that you are highly active in our community, and that you code a lot. When you're learning to code, it's important that you [code at least some everyday](http://www.quora.com/How-does-one-become-a-great-coder/answer/Quincy-Larson).
\ No newline at end of file
diff --git a/nap/data/wiki/The-main-advantages-of-Free-Code-Camp.md b/nap/data/wiki/The-main-advantages-of-Free-Code-Camp.md
deleted file mode 100644
index 606e865..0000000
--- a/nap/data/wiki/The-main-advantages-of-Free-Code-Camp.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Free Code Camp's main advantages are that we're accessible to busy adults who want to change careers. 
-
-Specifically, we're:
-
-- Free
-- Self-paced
-- Browser-based
\ No newline at end of file
diff --git a/nap/data/wiki/Tips-on-How-To-Become-A-Good-Pair-Programmer.md b/nap/data/wiki/Tips-on-How-To-Become-A-Good-Pair-Programmer.md
deleted file mode 100644
index 969b462..0000000
--- a/nap/data/wiki/Tips-on-How-To-Become-A-Good-Pair-Programmer.md
+++ /dev/null
@@ -1,12 +0,0 @@
-Pair programming is a great way to learn programming! [Read why.](https://github.com/FreeCodeCamp/freecodecamp/wiki/Why-You-Should-Try-Pair-Programming)
-
-1. **Communicate well with your partner.** Voice chat will make communication easy, let you focus on learning, and will allow you to use your time effectively.
-
-2. **Before you start coding:** decide together with your partner how your workflow should look so that both you and your partner can benefit from the time spent coding. An example of a good workflow:
-    - Read through and discuss the problem to make sure you understand it.
-    - Solve the problem with pseudo-code by identifying the steps you need to take in order to get from the given inputs to the expected result.
-    - Create your actual solution
-
-3. **When explaining things:** Ask questions to guide your partner's thoughts instead of just showing the answer right away. This will let him or her think about the problem and make it easier for them to learn.
-
-4. **Finally**, be *open to your partner's ideas*, *respect each other* and **have fun! :)**
\ No newline at end of file
diff --git a/nap/data/wiki/Trying-to-understand-the-solution-for-FCCs-sorted-union-using-callback-function.md b/nap/data/wiki/Trying-to-understand-the-solution-for-FCCs-sorted-union-using-callback-function.md
deleted file mode 100644
index 107ccef..0000000
--- a/nap/data/wiki/Trying-to-understand-the-solution-for-FCCs-sorted-union-using-callback-function.md
+++ /dev/null
@@ -1,24 +0,0 @@
-Hopefully the following post is appropriate for this forum...
-
-      function unite(arr1, arr2, arr3) {
-        var merge = function(coll,item) {
-          if (coll.indexOf(item) < 0)
-            coll.push(item);
-          return coll;
-        };
-        //TODO this can be simplified
-        arr1 = arr2.reduce(merge, arr1);
-        arr1 = arr3.reduce(merge, arr1);
-        return arr1;
-      }
-      unite([1, 2, 3], [5, 2, 1, 4], [2, 1]);
-
-I've already submitted an answer for "Sorted Union" but it was without using "reduce", which uses a "callback function". The answer that I've found, shown above uses it.  
-
-I've spent several hours so far trying to understand where "merge" gets its arguments. I understand from reduce's prototype that its first argument is a callback function (which is merge in this case), and I get what a callback function is. And the callback function's arguments are supposedly: (previousValue, currentValue, index, array) when being called by "reduce", which steps, one-by-one, through the arrays somehow using merge. Maybe "item" matches up with being currentValue, but that's it.  
-
-I don't know where someone's supposed to learn this type of programming because there are no examples like it in "prototypes" and "callback functions" where arguments required seem to change depending on context.  
-
-I would greatly appreciate someone explaining the above example to me or at least where the heck I would learn to do what's apparently been done in this example.  
-
-**chris dot r dot lafave at gmail dot com**
diff --git a/nap/data/wiki/Waypoint Access Array Data with Indexes.md b/nap/data/wiki/Waypoint Access Array Data with Indexes.md
deleted file mode 100644
index 36a3d40..0000000
--- a/nap/data/wiki/Waypoint Access Array Data with Indexes.md	
+++ /dev/null
@@ -1,12 +0,0 @@
-# Access Array Data with Indexes
-We can access the data inside arrays using indexes.
-
-Array indexes are written in the same bracket notation that strings use, except that instead of specifying a character, they are specifying an entry in the array.
-
-For example:
-
-```
-var array = [1,2,3];
-array[0]; //equals 1
-var data = array[1];
-```
diff --git a/nap/data/wiki/Waypoint Add Elements within your Bootstrap Wells.md b/nap/data/wiki/Waypoint Add Elements within your Bootstrap Wells.md
deleted file mode 100644
index fe97df1..0000000
--- a/nap/data/wiki/Waypoint Add Elements within your Bootstrap Wells.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Add Elements within your Bootstrap Wells
-Once you have gone deep enough in `divs` you can start adding your Bootstrap buttons.
diff --git a/nap/data/wiki/Waypoint Add Font Awesome Icons to all of our Buttons.md b/nap/data/wiki/Waypoint Add Font Awesome Icons to all of our Buttons.md
deleted file mode 100644
index af9d1db..0000000
--- a/nap/data/wiki/Waypoint Add Font Awesome Icons to all of our Buttons.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Add Font Awesome Icons to all of our Buttons
-`<i class="fa fa-trash"></i>` Will add a trash can icon.
-
-`<i class="fa fa-info-circle"></i>` Will add an info icon.
diff --git a/nap/data/wiki/Waypoint Add Font Awesome Icons to our Buttons.md b/nap/data/wiki/Waypoint Add Font Awesome Icons to our Buttons.md
deleted file mode 100644
index b544309..0000000
--- a/nap/data/wiki/Waypoint Add Font Awesome Icons to our Buttons.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Add Font Awesome Icons to our Buttons
-Font Awesome is a convenient library of icons. These icons are vector graphics, stored in the .svg file format. These icons are treated just like fonts. You can specify their size using pixels, and they will assume the font size of their parent HTML elements.
-
-`<i class="fa fa-thumbs-up"><button class="btn btn-block btn-primary">Like</i></button>`
diff --git a/nap/data/wiki/Waypoint Add ID Attributes to Bootstrap Elements.md b/nap/data/wiki/Waypoint Add ID Attributes to Bootstrap Elements.md
deleted file mode 100644
index 9b332af..0000000
--- a/nap/data/wiki/Waypoint Add ID Attributes to Bootstrap Elements.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Add ID Attributes to Bootstrap Elements
-Recall that in addition to class attributes, you can give each of your elements an id attribute.
-
-Each id should be unique to a specific element. Remember that you can give an element an id like this: `<div class="well" id="center-well">`
diff --git a/nap/data/wiki/Waypoint Add Two Numbers with JavaScript.md b/nap/data/wiki/Waypoint Add Two Numbers with JavaScript.md
deleted file mode 100644
index 3c6f938..0000000
--- a/nap/data/wiki/Waypoint Add Two Numbers with JavaScript.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Add Two Numbers with JavaScript
-JavaScript uses the `+` symbol for addition. It can also be used instead of `parseInt()` but that is beyond this.
-
-`var sum = 10 + 10;`
diff --git a/nap/data/wiki/Waypoint Add your JavaScript Slot Machine Slots.md b/nap/data/wiki/Waypoint Add your JavaScript Slot Machine Slots.md
deleted file mode 100644
index 4415212..0000000
--- a/nap/data/wiki/Waypoint Add your JavaScript Slot Machine Slots.md	
+++ /dev/null
@@ -1,10 +0,0 @@
-# Add your JavaScript Slot Machine Slots
-For this part we should notify if they same number is returned three times or return `null` otherwise.
-
-```
-if(slotOne !== slotTwo || slotTwo !== slotThree){
-      return (null);
-    }
-```
-
-If slot one and to are different, or slot two and three are not the same, then return `null`.
diff --git a/nap/data/wiki/Waypoint Apply the Default Bootstrap Button Style.md b/nap/data/wiki/Waypoint Apply the Default Bootstrap Button Style.md
deleted file mode 100644
index 79f9072..0000000
--- a/nap/data/wiki/Waypoint Apply the Default Bootstrap Button Style.md	
+++ /dev/null
@@ -1,23 +0,0 @@
-# Apply the Default Bootstrap Button Style
-Bootstrap has a button class called `btn-default`
-
-```
-<div class="container-fluid">
-  <h3 class="text-primary text-center">jQuery Playground</h3>
-  <div class="row">
-    <div class="col-xs-6">
-      <div class="well">
-        <button class="btn btn-default"></button>
-        <button class="btn btn-default"></button>
-        <button class="btn btn-default"></button>
-      </div>
-    </div>
-    <div class="col-xs-6">
-      <div class="well">
-        <button class="btn btn-default"></button>
-        <button class="btn btn-default"></button>
-        <button class="btn btn-default"></button>
-      </div>
-    </div>
-  </div>
-</div>
diff --git a/nap/data/wiki/Waypoint Bring your JavaScript Slot Machine to Life.md b/nap/data/wiki/Waypoint Bring your JavaScript Slot Machine to Life.md
deleted file mode 100644
index 0cbb08e..0000000
--- a/nap/data/wiki/Waypoint Bring your JavaScript Slot Machine to Life.md	
+++ /dev/null
@@ -1,10 +0,0 @@
-# Bring your JavaScript Slot Machine to Life
-Let's use the jQuery selector `$(".slot")` to select all of the slots.
-
-Once they are all selected, we can use bracket notation to access each individual slot:
-
-```
-$($(".slot")[0]).html(slotOne);
-$($(".slot")[1]).html(slotTwo);
-$($(".slot")[2]).html(slotThree);
-```
diff --git a/nap/data/wiki/Waypoint Build JavaScript Objects.md b/nap/data/wiki/Waypoint Build JavaScript Objects.md
deleted file mode 100644
index 27bf627..0000000
--- a/nap/data/wiki/Waypoint Build JavaScript Objects.md	
+++ /dev/null
@@ -1,15 +0,0 @@
-# Build JavaScript Objects
-Objects are similar to arrays, except that instead of using indexes to access and modify their data, you access the data in objects through what are called properties.
-
-Here's a sample object:
-
-```
-var cat = {
- "name": "Whiskers",
- "legs": 4,
- "tails": 1,
- "enemies": ["Water", "Dogs"]
-};
-```
-
-Objects are useful for storing data in a structured way, and can represents real world objects, like a cats.
diff --git a/nap/data/wiki/Waypoint Call out Optional Actions with Button Info.md b/nap/data/wiki/Waypoint Call out Optional Actions with Button Info.md
deleted file mode 100644
index 292641d..0000000
--- a/nap/data/wiki/Waypoint Call out Optional Actions with Button Info.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Call out Optional Actions with Button Info
-Bootstrap comes with several pre-defined colors for buttons. The `btn-info` class is used to call attention to optional actions that the user can take. Note that these buttons still need the `btn` and`btn-block` classes.
-
-`<button class= "btn btn-block btn-info">Info</button>`
diff --git a/nap/data/wiki/Waypoint Center Text with Bootstrap.md b/nap/data/wiki/Waypoint Center Text with Bootstrap.md
deleted file mode 100644
index c7683d6..0000000
--- a/nap/data/wiki/Waypoint Center Text with Bootstrap.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Center Text with Bootstrap
-Now that we're using Bootstrap, we can center our heading elements to make them look better. All we need to do is add the class text-center to our h1 and h2 elements.
-
-Remember that you can add several classes to the same element by separating each of them with a space, like this: `<h2 class="text-red text-center">your text</h2>`.
diff --git a/nap/data/wiki/Waypoint Change the CSS of an Element Using jQuery.md b/nap/data/wiki/Waypoint Change the CSS of an Element Using jQuery.md
deleted file mode 100644
index 4adb4fd..0000000
--- a/nap/data/wiki/Waypoint Change the CSS of an Element Using jQuery.md	
+++ /dev/null
@@ -1,13 +0,0 @@
-# Change the CSS of an Element Using jQuery
-We can also change the CSS of an HTML element directly with jQuery.
-
-Query has a function called `.css()` that allows you to change the CSS of an element.
-
-```
-<script>
-  $(document).ready(function() {
-    $("#target1").css("color", "red");
-
-  });
-</script>
-```
diff --git a/nap/data/wiki/Waypoint Check the Length Property of a String Variable.md b/nap/data/wiki/Waypoint Check the Length Property of a String Variable.md
deleted file mode 100644
index 922c2bc..0000000
--- a/nap/data/wiki/Waypoint Check the Length Property of a String Variable.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Check the Length Property of a String Variable
-Data structures have properties. For example, strings have a property called `.length` that will tell you how many characters are in the string.
-
-`lastNameLength = lastName.length;`
diff --git a/nap/data/wiki/Waypoint Clone an Element Using jQuery.md b/nap/data/wiki/Waypoint Clone an Element Using jQuery.md
deleted file mode 100644
index 3cc267c..0000000
--- a/nap/data/wiki/Waypoint Clone an Element Using jQuery.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Clone an Element Using jQuery
-jQuery has a function called`clone()` that makes a copy of an element.
-
-For example, if we wanted to copy target2 from our left-well to our right-well, we would use `$("#target2").clone().appendTo("#right-well");`
diff --git a/nap/data/wiki/Waypoint Comment your JavaScript Code.md b/nap/data/wiki/Waypoint Comment your JavaScript Code.md
deleted file mode 100644
index 66a4ddb..0000000
--- a/nap/data/wiki/Waypoint Comment your JavaScript Code.md	
+++ /dev/null
@@ -1,10 +0,0 @@
-# Comment your JavaScript Code
-Comments are a great way to leave notes to yourself and to other people who will later need to figure out what it does. Any code in it will be ignored.
-
-Let's take a look at the two ways you can write comments in JavaScript.
-- The double-slash comment will comment out the remainder of the text on the current line:
-
-`// This is a comment.`
-- The slash-star-star-slash comment will comment out everything between the `/*` and the `*/` characters:
-
-`/* This is also a comment */`
diff --git a/nap/data/wiki/Waypoint Create Bootstrap Wells.md b/nap/data/wiki/Waypoint Create Bootstrap Wells.md
deleted file mode 100644
index 5538b97..0000000
--- a/nap/data/wiki/Waypoint Create Bootstrap Wells.md	
+++ /dev/null
@@ -1,26 +0,0 @@
-# Create Bootstrap Wells
-Bootstrap has a class called `well` that can create a visual sense of depth for your columns.
-
-Nest one div element with the class well within each of your `col-xs-6 div` elements.
-
-```
-<div class="container-fluid">
-  <h3 class="text-primary text-center">jQuery Playground</h3>
-  <div class="row">
-    <div class="col-xs-6">
-      <div class="well">
-
-
-
-      </div>
-    </div>
-    <div class="col-xs-6">
-      <div class="well">
-
-
-
-      </div>
-    </div>
-  </div>
-</div>
-```
diff --git a/nap/data/wiki/Waypoint Create Decimal Numbers with JavaScript.md b/nap/data/wiki/Waypoint Create Decimal Numbers with JavaScript.md
deleted file mode 100644
index 9567d1f..0000000
--- a/nap/data/wiki/Waypoint Create Decimal Numbers with JavaScript.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Create Decimal Numbers with JavaScript
-JavaScript number variables can have decimals. `var myDecimal = 2.8;`
diff --git a/nap/data/wiki/Waypoint Create a Block Element Bootstrap Button.md b/nap/data/wiki/Waypoint Create a Block Element Bootstrap Button.md
deleted file mode 100644
index ec74f3c..0000000
--- a/nap/data/wiki/Waypoint Create a Block Element Bootstrap Button.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Create a Block Element Bootstrap Button
-Normally, your button elements are only as wide as the text that they contain. By making them block elements, your button will stretch to fill your page's entire horizontal space. Note that these buttons still need the `btn` class.
-
-`<button class="btn btn-block">Like</button>`
diff --git a/nap/data/wiki/Waypoint Create a Bootstrap Button.md b/nap/data/wiki/Waypoint Create a Bootstrap Button.md
deleted file mode 100644
index c46a1cb..0000000
--- a/nap/data/wiki/Waypoint Create a Bootstrap Button.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Create a Bootstrap Button
-Bootstrap has its own styles for button elements, which look much better than the plain HTML ones.
-
-`<button type="submit" class="btn">Like</button>`
diff --git a/nap/data/wiki/Waypoint Create a Bootstrap Headline.md b/nap/data/wiki/Waypoint Create a Bootstrap Headline.md
deleted file mode 100644
index 9f9f518..0000000
--- a/nap/data/wiki/Waypoint Create a Bootstrap Headline.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Create a Bootstrap Headline
-`<h3 class="text-primary text-center"> jQuery Playground </h3>`
diff --git a/nap/data/wiki/Waypoint Create a Bootstrap Row.md b/nap/data/wiki/Waypoint Create a Bootstrap Row.md
deleted file mode 100644
index ea17b35..0000000
--- a/nap/data/wiki/Waypoint Create a Bootstrap Row.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Create a Bootstrap Row
-Create a div element with the class row. `<div class="row"></div>`
diff --git a/nap/data/wiki/Waypoint Create a Class to Target with jQuery Selectors.md b/nap/data/wiki/Waypoint Create a Class to Target with jQuery Selectors.md
deleted file mode 100644
index 461fe66..0000000
--- a/nap/data/wiki/Waypoint Create a Class to Target with jQuery Selectors.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Create a Class to Target with jQuery Selectors
-Not every class needs to have corresponding CSS. Sometimes we create classes just for the purpose of selecting these elements more easily using jQuery.
-
-For this we use the `target` class on the `button` elements.
diff --git a/nap/data/wiki/Waypoint Create a Custom Heading.md b/nap/data/wiki/Waypoint Create a Custom Heading.md
deleted file mode 100644
index 50b84d7..0000000
--- a/nap/data/wiki/Waypoint Create a Custom Heading.md	
+++ /dev/null
@@ -1,12 +0,0 @@
-# Create a Custom Heading
-Using `div` and the custom grid layout we can create our own heading.
-
-```
-<div class="row">
-   <div class="col-xs-8">
-     <h2 class="text-primary text-center">CatPhotoApp</h2>
-   </div>
-   <div class="col-xs-4">
-     <a href="#"><img class="img-responsive thick-green-border" src="https://bit.ly/fcc-relaxing-cat"></a>
-   </div>
-```
diff --git a/nap/data/wiki/Waypoint Create a JavaScript Slot Machine.md b/nap/data/wiki/Waypoint Create a JavaScript Slot Machine.md
deleted file mode 100644
index 08977cc..0000000
--- a/nap/data/wiki/Waypoint Create a JavaScript Slot Machine.md	
+++ /dev/null
@@ -1,8 +0,0 @@
-# Create a JavaScript Slot Machine
-For this we have to generate three random numbers using the formula they give us and not the general one. `Math.floor(Math.random() * (3 - 1 + 1)) + 1;`
-
-```
-slotOne = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
-slotTwo = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
-slotThree = Math.floor(Math.random() * (3 - 1 + 1)) + 1;
-```
diff --git a/nap/data/wiki/Waypoint Declare JavaScript Variables.md b/nap/data/wiki/Waypoint Declare JavaScript Variables.md
deleted file mode 100644
index 2811568..0000000
--- a/nap/data/wiki/Waypoint Declare JavaScript Variables.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Declare JavaScript Variables
-When we store data in a data structure, we call it a variable. JavaScript variables are written in `camel case`. An example of camel case is: `camelCase`.
-
-You can declare a variable this way `var myName = "Rafael";`
diff --git a/nap/data/wiki/Waypoint Declare String Variables.md b/nap/data/wiki/Waypoint Declare String Variables.md
deleted file mode 100644
index e2042d9..0000000
--- a/nap/data/wiki/Waypoint Declare String Variables.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Declare String Variables
-A String variable. It is nothing more than a "string" of characters. JavaScript strings are always wrapped in quotes.
-
-`var myFirstName = 'Rafael';`
diff --git a/nap/data/wiki/Waypoint Delete your jQuery Functions.md b/nap/data/wiki/Waypoint Delete your jQuery Functions.md
deleted file mode 100644
index 9a5def6..0000000
--- a/nap/data/wiki/Waypoint Delete your jQuery Functions.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Delete your jQuery Functions
-To delete the functions it is just as any other piece of code that you want to remove, select it and delete with the keyboard.
diff --git a/nap/data/wiki/Waypoint Disable an Element Using jQuery.md b/nap/data/wiki/Waypoint Disable an Element Using jQuery.md
deleted file mode 100644
index e7fa1ea..0000000
--- a/nap/data/wiki/Waypoint Disable an Element Using jQuery.md	
+++ /dev/null
@@ -1,8 +0,0 @@
-# Disable an Element Using jQuery
-You can also change the non-CSS properties of HTML elements with jQuery. For example, you can disable buttons.
-
-When you disable a button, it will become grayed-out and can no longer be clicked.
-
-jQuery has a function called `.prop()` that allows you to adjust the properties of elements.
-
-Here's how you would disable all buttons: `$('#button').prop('disabled', true);`
diff --git a/nap/data/wiki/Waypoint Ditch Custom CSS for Bootstrap.md b/nap/data/wiki/Waypoint Ditch Custom CSS for Bootstrap.md
deleted file mode 100644
index 48d2d6c..0000000
--- a/nap/data/wiki/Waypoint Ditch Custom CSS for Bootstrap.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Ditch Custom CSS for Bootstrap
-We can clean up our code and make our Cat Photo App look more conventional by using Bootstrap's built-in styles instead of the custom styles we created earlier.
-
-All you need to know is the built in [classes](http://getbootstrap.com/css/).
diff --git a/nap/data/wiki/Waypoint Divide One Number by Another with JavaScript.md b/nap/data/wiki/Waypoint Divide One Number by Another with JavaScript.md
deleted file mode 100644
index ad49ac9..0000000
--- a/nap/data/wiki/Waypoint Divide One Number by Another with JavaScript.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Divide One Number by Another with JavaScript
-JavaScript uses use the `/` symbol for division. `var quotient = 66 / 33;`
diff --git a/nap/data/wiki/Waypoint Find Numbers with Regular Expressions.md b/nap/data/wiki/Waypoint Find Numbers with Regular Expressions.md
deleted file mode 100644
index e5b9930..0000000
--- a/nap/data/wiki/Waypoint Find Numbers with Regular Expressions.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Find Numbers with Regular Expressions
-We can use special selectors in Regular Expressions to select a particular type of value.
-
-One such selector is the digit selector `\d` which is used to grab the numbers in a string.
-
-It is used like this: `/\d+/g`.
diff --git a/nap/data/wiki/Waypoint Find White Space with Regular Expressions.md b/nap/data/wiki/Waypoint Find White Space with Regular Expressions.md
deleted file mode 100644
index cd9ac3b..0000000
--- a/nap/data/wiki/Waypoint Find White Space with Regular Expressions.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Find White Space with Regular Expressions
-We can also use selectors like`\s` to find spaces in a string.
-
-It is used like this:
-
-`/\s+/g`
diff --git a/nap/data/wiki/Waypoint Generate Random Fractions with JavaScript.md b/nap/data/wiki/Waypoint Generate Random Fractions with JavaScript.md
deleted file mode 100644
index ae7e673..0000000
--- a/nap/data/wiki/Waypoint Generate Random Fractions with JavaScript.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Generate Random Fractions with JavaScript
-JavaScript has a `Math.random()` function that generates a random decimal number.
diff --git a/nap/data/wiki/Waypoint Generate Random Whole Numbers with JavaScript.md b/nap/data/wiki/Waypoint Generate Random Whole Numbers with JavaScript.md
deleted file mode 100644
index 4204e3d..0000000
--- a/nap/data/wiki/Waypoint Generate Random Whole Numbers with JavaScript.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generate Random Whole Numbers with JavaScript
-It's great that we can create random decimal numbers, but it's even more useful if we lot more useful to generate a random whole number.
-
-To achieve this we can multiply the random number by ten and use the `Math.floor()` to convert the decimal number to a whole number
-
-`return(Math.floor(Math.random()*10));`
diff --git a/nap/data/wiki/Waypoint Generate Random Whole Numbers within a Range.md b/nap/data/wiki/Waypoint Generate Random Whole Numbers within a Range.md
deleted file mode 100644
index 85d5f26..0000000
--- a/nap/data/wiki/Waypoint Generate Random Whole Numbers within a Range.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Generate Random Whole Numbers within a Range
-We can use a certain mathematical expression to get a random number between two numbers.
-
-`Math.floor(Math.random() * (max - min + 1)) + min`
-
-By using this we can control the output of a random number.
diff --git a/nap/data/wiki/Waypoint Give Each Element a Unique ID.md b/nap/data/wiki/Waypoint Give Each Element a Unique ID.md
deleted file mode 100644
index 48a48d1..0000000
--- a/nap/data/wiki/Waypoint Give Each Element a Unique ID.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Give Each Element a Unique ID
-We will also want to be able to use jQuery to target each button by its unique id. So we add an unique id to each button.
diff --git a/nap/data/wiki/Waypoint Give your JavaScript Slot Machine some stylish images.md b/nap/data/wiki/Waypoint Give your JavaScript Slot Machine some stylish images.md
deleted file mode 100644
index 2841a52..0000000
--- a/nap/data/wiki/Waypoint Give your JavaScript Slot Machine some stylish images.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Give your JavaScript Slot Machine some stylish images
-We've already set up the images for you in an array called images. We can use different indexes to grab each of these.
-
-Here's how we would set the first slot to show a different image depending on which number its random number generates:
-
-`$($('.slot')[0]).html('<img src = "' + images[slotOne-1] + '">');`
diff --git a/nap/data/wiki/Waypoint House our page within a Bootstrap Container Fluid Div.md b/nap/data/wiki/Waypoint House our page within a Bootstrap Container Fluid Div.md
deleted file mode 100644
index 2ba35d9..0000000
--- a/nap/data/wiki/Waypoint House our page within a Bootstrap Container Fluid Div.md	
+++ /dev/null
@@ -1,8 +0,0 @@
-# House our page within a Bootstrap Container Fluid Div
-To make the content responsive, we use the `container-fluid` class.
-
-```
-<div class="container-fluid">
-<h3 class="text-primary text-center">jQuery Playground</h3>
-</div>
-```
diff --git a/nap/data/wiki/Waypoint Invert Regular Expression Matches with JavaScript.md b/nap/data/wiki/Waypoint Invert Regular Expression Matches with JavaScript.md
deleted file mode 100644
index a762c4a..0000000
--- a/nap/data/wiki/Waypoint Invert Regular Expression Matches with JavaScript.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Invert Regular Expression Matches with JavaScript
-Use`/\S/gi`; to match everything that isn't a space in the string.
-
-You can invert any match by using the uppercase version of the selector `\s` versus `\S` for example.
diff --git a/nap/data/wiki/Waypoint Iterate with JavaScript While Loops.md b/nap/data/wiki/Waypoint Iterate with JavaScript While Loops.md
deleted file mode 100644
index f119570..0000000
--- a/nap/data/wiki/Waypoint Iterate with JavaScript While Loops.md	
+++ /dev/null
@@ -1,11 +0,0 @@
-# Iterate with JavaScript While Loops
-Another type of JavaScript loop is called a `while loop` because it runs `while` something is true, and stops once that something is no longer true.
-
-```
-var ourArray = [];
-var i = 0;
-while(i < 5) {
-  ourArray.push(i);
-  i++;
-}
-```
diff --git a/nap/data/wiki/Waypoint Label Bootstrap Buttons.md b/nap/data/wiki/Waypoint Label Bootstrap Buttons.md
deleted file mode 100644
index f3c595c..0000000
--- a/nap/data/wiki/Waypoint Label Bootstrap Buttons.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Label Bootstrap Buttons
-Just like we labeled our [wells](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Waypoint-Label-Bootstrap-Wells), we want to label our buttons.
diff --git a/nap/data/wiki/Waypoint Label Bootstrap Wells.md b/nap/data/wiki/Waypoint Label Bootstrap Wells.md
deleted file mode 100644
index 83f78f2..0000000
--- a/nap/data/wiki/Waypoint Label Bootstrap Wells.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Label Bootstrap Wells
-You can add labels to the wells by using the headers `<h4>` above the well divs.
diff --git a/nap/data/wiki/Waypoint Learn how Script Tags and Document Ready Work.md b/nap/data/wiki/Waypoint Learn how Script Tags and Document Ready Work.md
deleted file mode 100644
index 22f560b..0000000
--- a/nap/data/wiki/Waypoint Learn how Script Tags and Document Ready Work.md	
+++ /dev/null
@@ -1,12 +0,0 @@
-# Learn how Script Tags and Document Ready Work
-For some reason FCC likes to introduce `jQuery` before JavaScript itself.
-
-To add JS to your HTML, you need a `script` tag.  Your browser will run any JavaScript inside a script element, including jQuery.
-
-Inside your script element, add this code: `$(document).ready(function() {` to your script. Then close it on the following line (still inside your script element) with: `});`
-
-```
-<script> $(document).ready(function(){
-
-});</script>
-```
diff --git a/nap/data/wiki/Waypoint Line up Form Elements Responsively with Bootstrap.md b/nap/data/wiki/Waypoint Line up Form Elements Responsively with Bootstrap.md
deleted file mode 100644
index 570c45f..0000000
--- a/nap/data/wiki/Waypoint Line up Form Elements Responsively with Bootstrap.md	
+++ /dev/null
@@ -1,9 +0,0 @@
-# Line up Form Elements Responsively with Bootstrap
-We line up the form elements the same way we do with others, using divs.
-
-```
-<div class="row">
-<div class="col-xs-7"><input type="text" class="form-control" placeholder="cat photo URL" required></div>
-<div class=col-xs-5><button type="submit" class="btn btn-primary"><i class="fa fa-paper-plane"></i> Submit</button></div>
-</div>
-```
diff --git a/nap/data/wiki/Waypoint Make Images Mobile Responsive.md b/nap/data/wiki/Waypoint Make Images Mobile Responsive.md
deleted file mode 100644
index 95c4be6..0000000
--- a/nap/data/wiki/Waypoint Make Images Mobile Responsive.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Make Images Mobile Responsive
-When using Bootstrap, if you want an image to be responsive, all you have to do is add the class `img-responsive` to it. `<img class="img-responsive" src="http://bit.ly/fcc-running-cats">`
diff --git a/nap/data/wiki/Waypoint Manipulate Arrays With pop().md b/nap/data/wiki/Waypoint Manipulate Arrays With pop().md
deleted file mode 100644
index e361283..0000000
--- a/nap/data/wiki/Waypoint Manipulate Arrays With pop().md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Manipulate Arrays With pop()
-Another way to change the data in an array is with the `.pop()` function.
-
-`.pop()` is used to "pop" a value off of the end of an array. We can retrieve this value by performing `pop()` in a variable declaration.
-
-Any type of variable can be "popped" off of an array.
diff --git a/nap/data/wiki/Waypoint Manipulate Arrays With push().md b/nap/data/wiki/Waypoint Manipulate Arrays With push().md
deleted file mode 100644
index 9710da7..0000000
--- a/nap/data/wiki/Waypoint Manipulate Arrays With push().md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Manipulate Arrays With push()
-Not only can you `pop()` data off of the end of an array, you can also `push()` data onto the end of an array.
-
-`myArray.push(["dog", 3]);`
diff --git a/nap/data/wiki/Waypoint Manipulate Arrays With shift().md b/nap/data/wiki/Waypoint Manipulate Arrays With shift().md
deleted file mode 100644
index dee96ff..0000000
--- a/nap/data/wiki/Waypoint Manipulate Arrays With shift().md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Manipulate Arrays With shift()
-`shift()` removes the first element unlike `pop()` which removes the last.
diff --git a/nap/data/wiki/Waypoint Manipulate Arrays With unshift().md b/nap/data/wiki/Waypoint Manipulate Arrays With unshift().md
deleted file mode 100644
index 6cad655..0000000
--- a/nap/data/wiki/Waypoint Manipulate Arrays With unshift().md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Manipulate Arrays With unshift()
-`myArray.unshift('Paul');` Basically you call `unshift` and pass what was deleted.
diff --git a/nap/data/wiki/Waypoint Manipulate JavaScript Objects.md b/nap/data/wiki/Waypoint Manipulate JavaScript Objects.md
deleted file mode 100644
index 530f07f..0000000
--- a/nap/data/wiki/Waypoint Manipulate JavaScript Objects.md	
+++ /dev/null
@@ -1,8 +0,0 @@
-# Manipulate JavaScript Objects
-We can add properties to objects like this:
-
-`myObject.myProperty = "myValue";`
-
-We can also delete them like this:
-
-`delete(myObject.myProperty);`
diff --git a/nap/data/wiki/Waypoint Modify Array Data With Indexes.md b/nap/data/wiki/Waypoint Modify Array Data With Indexes.md
deleted file mode 100644
index f670f23..0000000
--- a/nap/data/wiki/Waypoint Modify Array Data With Indexes.md	
+++ /dev/null
@@ -1,9 +0,0 @@
-# Modify Array Data With Indexes
-We can also modify the data stored in arrays by using indexes.
-
-For example:
-
-```
-var ourArray = [3,2,1];
-ourArray[0] = 1; // equals [1,2,1]
-```
diff --git a/nap/data/wiki/Waypoint Multiply Two Numbers with JavaScript.md b/nap/data/wiki/Waypoint Multiply Two Numbers with JavaScript.md
deleted file mode 100644
index cc4071c..0000000
--- a/nap/data/wiki/Waypoint Multiply Two Numbers with JavaScript.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Multiply Two Numbers with JavaScript
-JavaScript uses use the `*` symbol for multiplication.
-
-`var product = 8 * 10;`
diff --git a/nap/data/wiki/Waypoint Nest one Array within Another Array.md b/nap/data/wiki/Waypoint Nest one Array within Another Array.md
deleted file mode 100644
index acbfa1f..0000000
--- a/nap/data/wiki/Waypoint Nest one Array within Another Array.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Nest one Array within Another Array
-You can nest arrays within other arrays, like this:`[["Bulls", 43]]`.
diff --git a/nap/data/wiki/Waypoint Perform Arithmetic Operations on Decimals with JavaScript.md b/nap/data/wiki/Waypoint Perform Arithmetic Operations on Decimals with JavaScript.md
deleted file mode 100644
index b9bab53..0000000
--- a/nap/data/wiki/Waypoint Perform Arithmetic Operations on Decimals with JavaScript.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Perform Arithmetic Operations on Decimals with JavaScript
-In JavaScript, you can perform calculations with decimal numbers, just like whole numbers.
-
-`var quotient = 4.4 / 2.0; // equals 2.2`
diff --git a/nap/data/wiki/Waypoint Remove Classes from an element with jQuery.md b/nap/data/wiki/Waypoint Remove Classes from an element with jQuery.md
deleted file mode 100644
index 8952c6b..0000000
--- a/nap/data/wiki/Waypoint Remove Classes from an element with jQuery.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Remove Classes from an element with jQuery
-The same way we can add classes using jQuery, we an also remove them with `removeClass()`.
-
-`$("button").removeClass("btn-default");`
diff --git a/nap/data/wiki/Waypoint Remove an Element Using jQuery.md b/nap/data/wiki/Waypoint Remove an Element Using jQuery.md
deleted file mode 100644
index 469185f..0000000
--- a/nap/data/wiki/Waypoint Remove an Element Using jQuery.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Remove an Element Using jQuery
-jQuery has a function called `.remove()` that will remove an HTML element entirely. `$("#target4").remove();`
diff --git a/nap/data/wiki/Waypoint Responsively Style Checkboxes.md b/nap/data/wiki/Waypoint Responsively Style Checkboxes.md
deleted file mode 100644
index 7fd6c22..0000000
--- a/nap/data/wiki/Waypoint Responsively Style Checkboxes.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Responsively Style Checkboxes
-You can use Bootstrap's `col-xs-*` classes on form elements, too! This way, our checkboxes will be evenly spread out across the page, regardless of how wide the screen resolution is.
-
-Nest all your checkboxes in a `<div class="row">` element. Then nest each of them in a `<div class="col-xs-4">` element.
diff --git a/nap/data/wiki/Waypoint Responsively Style Radio Buttons.md b/nap/data/wiki/Waypoint Responsively Style Radio Buttons.md
deleted file mode 100644
index c4cc35a..0000000
--- a/nap/data/wiki/Waypoint Responsively Style Radio Buttons.md	
+++ /dev/null
@@ -1,18 +0,0 @@
-# Responsively Style Radio Buttons
-You can use Bootstrap's `col-xs-*` classes on `form` elements. That will make radio buttons evenly spread out across the page regardless of how wide the screen might be.
-
-Nest all of your radio buttons within a `<div class="row">` element. Then nest each of them within a `<div class="col-xs-6">` element.
-
-```
-<form action="/submit-cat-photo">
-  <div class="row">
-    <div class="col-xs-6"><label><input type="radio" name="indoor-outdoor"> Indoor</label></div>
-    <div class="col-xs-6"><label><input type="radio" name="indoor-outdoor"> Outdoor</label></div>
-    <div class="col-xs-6"><label><input type="checkbox" name="personality"> Loving</label></div>
-    <div class="col-xs-6"><label><input type="checkbox" name="personality"> Lazy</label></div>
-    <div class="col-xs-6"><label><input type="checkbox" name="personality"> Crazy</label></div>
-  </div>
-  <input type="text" placeholder="cat photo URL" required>
-  <button type="submit">Submit</button>
-</form>
-```
diff --git a/nap/data/wiki/Waypoint Sift through Text with Regular Expressions.md b/nap/data/wiki/Waypoint Sift through Text with Regular Expressions.md
deleted file mode 100644
index 7698588..0000000
--- a/nap/data/wiki/Waypoint Sift through Text with Regular Expressions.md	
+++ /dev/null
@@ -1,13 +0,0 @@
-# Sift through Text with Regular Expressions
-`Regular expressions` are used to find certain words or patterns inside of strings.
-
-Regular expressions are usually surrounded by `/` symbols.
-
-For example, if we wanted to find the number of times the word the occurred in the string The dog chased the cat, we could use the following regular expression: `/the+/gi`
-
-Let's break this down a bit:
-
-the is the pattern we want to match.
-- `+` means we want to find one or more occurrences of this pattern.
-- `g` means that we want to search the entire string for this pattern.
-- `i` means that we want to ignore the case (uppercase or lowercase) when searching for the pattern.
diff --git a/nap/data/wiki/Waypoint Split your Bootstrap Row.md b/nap/data/wiki/Waypoint Split your Bootstrap Row.md
deleted file mode 100644
index 14f92fd..0000000
--- a/nap/data/wiki/Waypoint Split your Bootstrap Row.md	
+++ /dev/null
@@ -1,12 +0,0 @@
-# Split your Bootstrap Row
-Create two `div` elements within your row, both with the class `col-xs-6`.
-
-```
-<div class="container-fluid">
-  <h3 class="text-primary text-center">jQuery Playground</h3>
-  <div class="row">
-    <div class="col-xs-6"> </div>
-    <div class="col-xs-6"></div>
-  </div>
-</div>
-```
diff --git a/nap/data/wiki/Waypoint Store Multiple Values in one Variable using JavaScript Arrays.md b/nap/data/wiki/Waypoint Store Multiple Values in one Variable using JavaScript Arrays.md
deleted file mode 100644
index cc593b3..0000000
--- a/nap/data/wiki/Waypoint Store Multiple Values in one Variable using JavaScript Arrays.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Store Multiple Values in one Variable using JavaScript Arrays
-With JavaScript array variables, we can store several pieces of data in one place.
-
-You start an array declaration with an opening bracket, end it with a closing bracket, and put a comma between each entry, like this: `var sandwich = ["peanut butter", "jelly", "bread"]`.
-
-`myArray = [2,'j'];`
diff --git a/nap/data/wiki/Waypoint Style Text Inputs as Form Controls.md b/nap/data/wiki/Waypoint Style Text Inputs as Form Controls.md
deleted file mode 100644
index 39da6d3..0000000
--- a/nap/data/wiki/Waypoint Style Text Inputs as Form Controls.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Style Text Inputs as Form Controls
-You can add the `fa-paper-plane` Font Awesome icon by adding `<i class="fa fa-paper-plane"></i>` within your submit button element.
-
-`<button type="submit" class="btn btn-primary"><i class="fa fa-paper-plane">Submit</i>`
diff --git a/nap/data/wiki/Waypoint Subtract One Number from Another with JavaScript.md b/nap/data/wiki/Waypoint Subtract One Number from Another with JavaScript.md
deleted file mode 100644
index dcea6d4..0000000
--- a/nap/data/wiki/Waypoint Subtract One Number from Another with JavaScript.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Subtract One Number from Another with JavaScript
-We can also subtract one number from another.
-
-JavaScript uses use the - symbol for subtraction. `var difference = 45 - 33;`
diff --git a/nap/data/wiki/Waypoint Target Elements by Class Using jQuery.md b/nap/data/wiki/Waypoint Target Elements by Class Using jQuery.md
deleted file mode 100644
index d240ae9..0000000
--- a/nap/data/wiki/Waypoint Target Elements by Class Using jQuery.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Target Elements by Class Using jQuery
-Just as we did before, we can also target elements by classes.
-
-`$(".well").addClass("animated shake");`
diff --git a/nap/data/wiki/Waypoint Target Elements by ID Using jQuery.md b/nap/data/wiki/Waypoint Target Elements by ID Using jQuery.md
deleted file mode 100644
index 8e03a5d..0000000
--- a/nap/data/wiki/Waypoint Target Elements by ID Using jQuery.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Target Elements by ID Using jQuery
-You can also target elements by their id attributes. Note that, just like with CSS declarations, you type a # before the id's name.
-
-`$("#target3").addClass("animated fadeOut");`
diff --git a/nap/data/wiki/Waypoint Target Even Numbered Elements Using jQuery.md b/nap/data/wiki/Waypoint Target Even Numbered Elements Using jQuery.md
deleted file mode 100644
index 84c6fa1..0000000
--- a/nap/data/wiki/Waypoint Target Even Numbered Elements Using jQuery.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Target Even Numbered Elements Using jQuery
-You can also target all the even-numbered elements.
-
-Here's how you would target all the `odd-numbered` elements with class target and give them classes: `$('.target:odd').addClass('animated shake');`
-
-This will shake all the even ones: `$('.target:even').addClass("shake");`
diff --git a/nap/data/wiki/Waypoint Target HTML Elements with Selectors Using jQuery.md b/nap/data/wiki/Waypoint Target HTML Elements with Selectors Using jQuery.md
deleted file mode 100644
index 94c6e84..0000000
--- a/nap/data/wiki/Waypoint Target HTML Elements with Selectors Using jQuery.md	
+++ /dev/null
@@ -1,14 +0,0 @@
-# Target HTML Elements with Selectors Using jQuery
-After we have created our `document ready function` we can now have code that will run after the page loads. This will assure that your code does not run before the HTML is rendered to avoid bugs.
-
-jQuery often selects an HTML element with a selector, then does something to that element.
-
-The following code will make the buttons have a bouncy animation on page load.
-
-```
-<script>
-  $(document).ready(function() {
-    $("button").addClass("animated bounce");
-  });
-</script>
-```
diff --git a/nap/data/wiki/Waypoint Target a Specific Child of an Element Using jQuery.md b/nap/data/wiki/Waypoint Target a Specific Child of an Element Using jQuery.md
deleted file mode 100644
index c52ae8d..0000000
--- a/nap/data/wiki/Waypoint Target a Specific Child of an Element Using jQuery.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Target a Specific Child of an Element Using jQuery
-jQuery uses CSS Selectors to target elements. `target:nth-child(n)` css selector allows you to select all the nth element with the target class or element type.
-
-Here's how you would give the third element in each well bounce: `$(".target:nth-child(3)").addClass("animated bounce");`
-
-`$(".btn:nth-child(2)").addClass("animated bounce");`
diff --git a/nap/data/wiki/Waypoint Target the Children of an Element Using jQuery.md b/nap/data/wiki/Waypoint Target the Children of an Element Using jQuery.md
deleted file mode 100644
index 42e7e23..0000000
--- a/nap/data/wiki/Waypoint Target the Children of an Element Using jQuery.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Target the Children of an Element Using jQuery
-Many HTML elements have children elements from which they inherit properties.
-
-jQuery has a function called `children()` that allows you to access the children of whichever element you've selected.
-
-Here's an example of how you would use the `children()` function: `$("#left-well").children().css("color", "blue");`
diff --git a/nap/data/wiki/Waypoint Target the Parent of an Element Using jQuery.md b/nap/data/wiki/Waypoint Target the Parent of an Element Using jQuery.md
deleted file mode 100644
index aa04a7b..0000000
--- a/nap/data/wiki/Waypoint Target the Parent of an Element Using jQuery.md	
+++ /dev/null
@@ -1,8 +0,0 @@
-# Target the Parent of an Element Using jQuery
-Every HTML elements has a parent element from which it inherits properties.
-
-For example, your jQuery Playground `h3` element has the parent element of`<div class="container-fluid">`, which itself has the parent body.
-
-jQuery has a function called `parent()` that allows you to access the parent of whichever element you've selected.
-
-Here's an example of how you would use the `parent()` function: `$("#left-well").parent().css("background-color", "blue")`
diff --git a/nap/data/wiki/Waypoint Target the same element with multiple jQuery Selectors.md b/nap/data/wiki/Waypoint Target the same element with multiple jQuery Selectors.md
deleted file mode 100644
index 2bfcf1b..0000000
--- a/nap/data/wiki/Waypoint Target the same element with multiple jQuery Selectors.md	
+++ /dev/null
@@ -1,15 +0,0 @@
-# Target the same element with multiple jQuery Selectors
-The multiple jQuery selectors are:
-1. By type: `$("button")`
-2. By class: `$(".btn")`
-3. By id: `$("#target1")`
-
-```
-<script>
-  $(document).ready(function() {
-    $("button").addClass("animated");
-    $(".btn").addClass("shake");
-    $("#target1").addClass("animated shake btn-primary");
-  });
-</script>
-```
diff --git a/nap/data/wiki/Waypoint Taste the Bootstrap Button Color Rainbow.md b/nap/data/wiki/Waypoint Taste the Bootstrap Button Color Rainbow.md
deleted file mode 100644
index 6d6d755..0000000
--- a/nap/data/wiki/Waypoint Taste the Bootstrap Button Color Rainbow.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Taste the Bootstrap Button Color Rainbow
-The `btn-primary` class is the main color you'll use in your app. It is useful for highlighting actions you want your user to take. Note that this button will still need the `btn` and `btn-block` classes.
-
-`<button class="btn btn-block btn-primary">Like</button>`
diff --git a/nap/data/wiki/Waypoint Understand Boolean Values.md b/nap/data/wiki/Waypoint Understand Boolean Values.md
deleted file mode 100644
index e8ff55d..0000000
--- a/nap/data/wiki/Waypoint Understand Boolean Values.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Understand Boolean Values
-Booleans can only hold the value of either true or false. They are basically little on-off switches.
diff --git a/nap/data/wiki/Waypoint Use Bracket Notation to Find the First Character in a String.md b/nap/data/wiki/Waypoint Use Bracket Notation to Find the First Character in a String.md
deleted file mode 100644
index ec7bad4..0000000
--- a/nap/data/wiki/Waypoint Use Bracket Notation to Find the First Character in a String.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Use Bracket Notation to Find the First Character in a String
-Bracket notation is a way to get a character at a specific index within a string.
-
-Computers don't start counting at `1` like humans do. They start at `0`. `firstLetterOfLastName = lastName[0];`
diff --git a/nap/data/wiki/Waypoint Use Bracket Notation to Find the Last Character in a String.md b/nap/data/wiki/Waypoint Use Bracket Notation to Find the Last Character in a String.md
deleted file mode 100644
index 7b1b315..0000000
--- a/nap/data/wiki/Waypoint Use Bracket Notation to Find the Last Character in a String.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Use Bracket Notation to Find the Last Character in a String
-In order to get the last letter of a string, you can subtract one from the string's length.
-
-For example, if `var firstName = "Charles"`, you can get the value of the last letter of the string by using `firstName[firstName.length - 1]`.
-
-`var lastLetterOfLastName = lastName[lastName.length -1];`
diff --git a/nap/data/wiki/Waypoint Use Bracket Notation to Find the Nth Character in a String.md b/nap/data/wiki/Waypoint Use Bracket Notation to Find the Nth Character in a String.md
deleted file mode 100644
index 2cc8f18..0000000
--- a/nap/data/wiki/Waypoint Use Bracket Notation to Find the Nth Character in a String.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Use Bracket Notation to Find the Nth Character in a String
-You can also use bracket notation to get the character at other positions within a string.
-
-Remember that computers start counting at `0`, so the first character is actually the zeroth character.
-
-`var thirdLetterOfLastName = lastName[2];`
diff --git a/nap/data/wiki/Waypoint Use Bracket Notation to Find the Nth-to-Last Character in a String.md b/nap/data/wiki/Waypoint Use Bracket Notation to Find the Nth-to-Last Character in a String.md
deleted file mode 100644
index af7705b..0000000
--- a/nap/data/wiki/Waypoint Use Bracket Notation to Find the Nth-to-Last Character in a String.md	
+++ /dev/null
@@ -1,2 +0,0 @@
-# Use Bracket Notation to Find the Nth-to-Last Character in a String
-You can get the value of the third-to-last letter of the `var firstName = "Charles"` string by using `firstName[firstName.length - 3]`.
diff --git a/nap/data/wiki/Waypoint Use Comments to Clarify Code.md b/nap/data/wiki/Waypoint Use Comments to Clarify Code.md
deleted file mode 100644
index 9faa071..0000000
--- a/nap/data/wiki/Waypoint Use Comments to Clarify Code.md	
+++ /dev/null
@@ -1,29 +0,0 @@
-# Use Comments to Clarify Code
-When we start using jQuery, we will modify HTML elements without needing to actually change them in HTML.
-
-This is a great way to make websites with a particular structure. Remember that you can start a comment with `<!-- and end a comment with -->`
-
-```
-<!--You shouldn't need to modify code below this line -->
-<div class="container-fluid">
- <h3 class="text-primary text-center">jQuery Playground</h3>
- <div class="row">
-   <div class="col-xs-6">
-     <h4>#left-well</h4>
-     <div class="well" id="left-well">
-       <button class="btn btn-default target" id="target1">#target1</button>
-       <button class="btn btn-default target" id="target2">#target2</button>
-       <button class="btn btn-default target" id="target3">#target3</button>
-     </div>
-   </div>
-   <div class="col-xs-6">
-     <h4>#right-well</h4>
-     <div class="well" id="right-well">
-       <button class="btn btn-default target" id="target4">#target4</button>
-       <button class="btn btn-default target" id="target5">#target5</button>
-       <button class="btn btn-default target" id="target6">#target6</button>
-     </div>
-   </div>
- </div>
-</div>
-```
diff --git a/nap/data/wiki/Waypoint Use Conditional Logic with If-Else Statements.md b/nap/data/wiki/Waypoint Use Conditional Logic with If-Else Statements.md
deleted file mode 100644
index 452378c..0000000
--- a/nap/data/wiki/Waypoint Use Conditional Logic with If-Else Statements.md	
+++ /dev/null
@@ -1,15 +0,0 @@
-# Use Conditional Logic with If-Else Statements
-We can use if statements in JavaScript to only execute code if a certain condition is met.
-
-if statements require some sort of `boolean` condition evaluate.
-
-```
-Example:
-
- if (1 == 2) {
-  return(true);
-}
-else {
-  return(false);
-}
-```
diff --git a/nap/data/wiki/Waypoint Use Responsive Design with Bootstrap Fluid Containers.md b/nap/data/wiki/Waypoint Use Responsive Design with Bootstrap Fluid Containers.md
deleted file mode 100644
index 71c4fdb..0000000
--- a/nap/data/wiki/Waypoint Use Responsive Design with Bootstrap Fluid Containers.md	
+++ /dev/null
@@ -1,6 +0,0 @@
-# Use Responsive Design with Bootstrap Fluid Containers
-Bootstrap will figure out how wide your screen is and respond by resizing your HTML elements - hence the name Responsive Design.
-
-With responsive design, there is no need to design a mobile version of your website. It will look good on devices with screens of any width.
-
-You can add Bootstrap to any app just by including it with `<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css"/>` at the top of your HTML.
diff --git a/nap/data/wiki/Waypoint Use Spans for Inline Elements.md b/nap/data/wiki/Waypoint Use Spans for Inline Elements.md
deleted file mode 100644
index 8933a2c..0000000
--- a/nap/data/wiki/Waypoint Use Spans for Inline Elements.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Use Spans for Inline Elements
-You can use use spans to create inline elements. By using the span element, you can put several elements together, and even style different parts of the same element differently.
-
-`<p><span class = "text-danger">Things cats love:</span></p>`
diff --git a/nap/data/wiki/Waypoint Use appendTo to Move Elements with jQuery.md b/nap/data/wiki/Waypoint Use appendTo to Move Elements with jQuery.md
deleted file mode 100644
index 8a29e35..0000000
--- a/nap/data/wiki/Waypoint Use appendTo to Move Elements with jQuery.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Use appendTo to Move Elements with jQuery
-jQuery has a function called `appendTo()` that allows you to select HTML elements and append them to another element.
-
-For example, if we wanted to move target4 from our right well to our left well, we would use `$("#target4").appendTo("#left-well");`
diff --git a/nap/data/wiki/Waypoint Use jQuery to Modify the Entire Page.md b/nap/data/wiki/Waypoint Use jQuery to Modify the Entire Page.md
deleted file mode 100644
index 875bd0b..0000000
--- a/nap/data/wiki/Waypoint Use jQuery to Modify the Entire Page.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Use jQuery to Modify the Entire Page
-jQuery can target the body element as well.
-
-Here's how we would make the entire body fade out: `$('body').addClass('animated fadeOut');`
diff --git a/nap/data/wiki/Waypoint Use the Bootstrap Grid to Put Elements Side By Side.md b/nap/data/wiki/Waypoint Use the Bootstrap Grid to Put Elements Side By Side.md
deleted file mode 100644
index c13f469..0000000
--- a/nap/data/wiki/Waypoint Use the Bootstrap Grid to Put Elements Side By Side.md	
+++ /dev/null
@@ -1,16 +0,0 @@
-# Use the Bootstrap Grid to Put Elements Side By Side
-Bootstrap uses a responsive grid system that makes it easier to put elements into rows and tell each element's relative width.
-
-![Bootstrap 12 column grid layout](https://www.evernote.com/shard/s116/sh/f0944d97-08b8-4615-8273-a327bf41fb05/de1a3acbceef89ae/deep/0/)
-
-Note that in this illustration, the `col-md-_` class is being used. Here, md means medium, and _ is a number specifying how many columns wide the element should be. In this case, the column width of an element on a medium-sized screen, such as a laptop, is being specified.
-
-```
-<div class="row">
-
-  <div class="col-xs-4"><button class="btn btn-block btn-primary">Like</button></div>
-  <div class="col-xs-4"><button class="btn btn-block btn-info">Info</button></div>
-  <div class="col-xs-4"><button class="btn btn-block btn-danger">Delete</button></div>
-
-</div>
-```
diff --git a/nap/data/wiki/Waypoint Warn your Users of a Dangerous Action.md b/nap/data/wiki/Waypoint Warn your Users of a Dangerous Action.md
deleted file mode 100644
index 982068e..0000000
--- a/nap/data/wiki/Waypoint Warn your Users of a Dangerous Action.md	
+++ /dev/null
@@ -1,4 +0,0 @@
-# Warn your Users of a Dangerous Action
-The `btn-danger` class is the button color you'll use to notify users that the button performs a destructive action, such as deleting a cat photo. Note that these buttons still need the `btn` and `btn-block` classes.
-
-`<button class="btn btn-block btn-danger">Delete</button>`
diff --git a/nap/data/wiki/Waypoint Write Reusable JavaScript with Functions.md b/nap/data/wiki/Waypoint Write Reusable JavaScript with Functions.md
deleted file mode 100644
index 5944d7f..0000000
--- a/nap/data/wiki/Waypoint Write Reusable JavaScript with Functions.md	
+++ /dev/null
@@ -1,12 +0,0 @@
-# Write Reusable JavaScript with Functions
-In JavaScript, we can divide up our code into reusable parts called functions.
-
-Here's an example of a function:
-
-```
-function functionName (a, b) {
-  return(a + b);
-}
-```
-
-We can "call" our function like this: `functionName();`, and it will run and return it's return value to us.
diff --git a/nap/data/wiki/Waypoint-Add-Alt-Text-to-an-Image-for-Accessibility.md b/nap/data/wiki/Waypoint-Add-Alt-Text-to-an-Image-for-Accessibility.md
deleted file mode 100644
index 50c0956..0000000
--- a/nap/data/wiki/Waypoint-Add-Alt-Text-to-an-Image-for-Accessibility.md
+++ /dev/null
@@ -1,5 +0,0 @@
-`alt` attributes, also known as alt text, are what browsers will display if they fail to load the image. alt attributes are also important for blind or visually impaired users to understand what an image portrays. And search engines also look at alt attributes.
-
-In short, every image should have an alt attribute!
-
-You can add an alt attribute right in the img element like this: `<img src="www.your-image-source.com/your-image.jpg" alt="your alt text"/>`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Add-Borders-Around-your-Elements.md b/nap/data/wiki/Waypoint-Add-Borders-Around-your-Elements.md
deleted file mode 100644
index d8491b0..0000000
--- a/nap/data/wiki/Waypoint-Add-Borders-Around-your-Elements.md
+++ /dev/null
@@ -1,3 +0,0 @@
-CSS borders have attributes like `style`, `color` and `width`.
-
-For example, if we wanted to create a red, 5 pixel border around an HTML element, we could use this class: `<style> .thin-red-border { border-color: red; border-width: 5px; border-style: solid; } </style>`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Add-Different-Margins-to-Each-Side-of-an-Element.md b/nap/data/wiki/Waypoint-Add-Different-Margins-to-Each-Side-of-an-Element.md
deleted file mode 100644
index bbb3d9a..0000000
--- a/nap/data/wiki/Waypoint-Add-Different-Margins-to-Each-Side-of-an-Element.md
+++ /dev/null
@@ -1 +0,0 @@
-CSS allows you to control the margin of an element on all four sides with `margin-top`, `margin-right`, `margin-bottom`, and `margin-left` attributes.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Add-Different-Padding-to-Each-Side-of-an-Element.md b/nap/data/wiki/Waypoint-Add-Different-Padding-to-Each-Side-of-an-Element.md
deleted file mode 100644
index 7ddd5fa..0000000
--- a/nap/data/wiki/Waypoint-Add-Different-Padding-to-Each-Side-of-an-Element.md
+++ /dev/null
@@ -1,11 +0,0 @@
-CSS allows you to control the padding of an element on all four sides with `padding-top`, `padding-right`, `padding-bottom`, and `padding-left` attributes.
-
-```
-.green-box {
-  background-color: green;
-  padding-top: 40px;
-  padding-right: 20px;
-  padding-bottom: 20px;
-  padding-left: 40px;
-}
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Add-Images-to-your-Website.md b/nap/data/wiki/Waypoint-Add-Images-to-your-Website.md
deleted file mode 100644
index 1ee5f85..0000000
--- a/nap/data/wiki/Waypoint-Add-Images-to-your-Website.md
+++ /dev/null
@@ -1,3 +0,0 @@
-You can add images to your website by using the `img` element, and point to an specific image's URL using the `src` attribute.
-
-An example of this would be `<img src="www.your-image-source.com/your-image.jpg">`. Note that in most cases, img elements are self-closing.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Add-Placeholder-Text-to-a-Text-Field.md b/nap/data/wiki/Waypoint-Add-Placeholder-Text-to-a-Text-Field.md
deleted file mode 100644
index 94e60d5..0000000
--- a/nap/data/wiki/Waypoint-Add-Placeholder-Text-to-a-Text-Field.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Your placeholder text is what appears in your text input before your user has inputed anything.
-
-You can create placeholder text like so: `<input type="text" placeholder="this is placeholder text">`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Add-Rounded-Corners-with-a-Border-Radius.md b/nap/data/wiki/Waypoint-Add-Rounded-Corners-with-a-Border-Radius.md
deleted file mode 100644
index 25d362e..0000000
--- a/nap/data/wiki/Waypoint-Add-Rounded-Corners-with-a-Border-Radius.md
+++ /dev/null
@@ -1,12 +0,0 @@
-To make round corners it is all about `border-radius` and pixels.
-
-You can specify a border-radius with pixels. This will affect how rounded the corners are.
-
-```
-.thick-green-border {
-  border-color: green;
-  border-width: 10px;
-  border-style: solid;
-  border-radius: 10px;
-}
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Add-a-Negative-Margin-to-an-Element.md b/nap/data/wiki/Waypoint-Add-a-Negative-Margin-to-an-Element.md
deleted file mode 100644
index 97b5b0b..0000000
--- a/nap/data/wiki/Waypoint-Add-a-Negative-Margin-to-an-Element.md
+++ /dev/null
@@ -1 +0,0 @@
-An element's `margin` controls the amount of space between an element's border and surrounding elements. If you set an element's margin to a **negative value**, the element will grow **larger**.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Add-a-Submit-Button-to-a-Form.md b/nap/data/wiki/Waypoint-Add-a-Submit-Button-to-a-Form.md
deleted file mode 100644
index 02ac0f6..0000000
--- a/nap/data/wiki/Waypoint-Add-a-Submit-Button-to-a-Form.md
+++ /dev/null
@@ -1,8 +0,0 @@
-You will need to create a `button` element. Here's an example submit button: `<button type="submit">this button submits the form</button>`.
-
-```
-<form action="/submit-cat-photo">
-  <input type="text" placeholder="cat photo URL">
-  <button type="submit">Submit</button>
-</form>
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Adjust-the-Margin-of-an-Element.md b/nap/data/wiki/Waypoint-Adjust-the-Margin-of-an-Element.md
deleted file mode 100644
index bbfada8..0000000
--- a/nap/data/wiki/Waypoint-Adjust-the-Margin-of-an-Element.md
+++ /dev/null
@@ -1,9 +0,0 @@
-An element's `margin` controls the amount of space between an element's `border` and surrounding elements.
-
-```
-.green-box {
-  background-color: green;
-  padding: 20px;
-  margin: 20px;
-}
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Adjusting-the-Padding-of-an-Element.md b/nap/data/wiki/Waypoint-Adjusting-the-Padding-of-an-Element.md
deleted file mode 100644
index 7d32e92..0000000
--- a/nap/data/wiki/Waypoint-Adjusting-the-Padding-of-an-Element.md
+++ /dev/null
@@ -1,8 +0,0 @@
-HTML elements are essentially little rectangles. Three important attributes control the space that surrounds each HTML element: `padding`, `margin`, and `border`. An element's padding controls the amount of space between the element and its border.
-
-```
-.green-box {
-  background-color: green;
-  padding: 20px;
-}
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Change-the-Color-of-Text.md b/nap/data/wiki/Waypoint-Change-the-Color-of-Text.md
deleted file mode 100644
index c0c1a9a..0000000
--- a/nap/data/wiki/Waypoint-Change-the-Color-of-Text.md
+++ /dev/null
@@ -1,3 +0,0 @@
-CSS allows us to change  many styles. To change the color of an element we use `color`.
-
-Here's how you would set your h2 element's text color to blue: `<h2 style="color: blue">CatPhotoApp</h2>`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Change-the-Font-Size-of-an-Element.md b/nap/data/wiki/Waypoint-Change-the-Font-Size-of-an-Element.md
deleted file mode 100644
index b25ad40..0000000
--- a/nap/data/wiki/Waypoint-Change-the-Font-Size-of-an-Element.md
+++ /dev/null
@@ -1 +0,0 @@
-Font size is controlled by the `font-size` CSS attribute, like this: `h1 { font-size: 30px; }`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Check-Radio-Buttons-and-Checkboxes-by-Default.md b/nap/data/wiki/Waypoint-Check-Radio-Buttons-and-Checkboxes-by-Default.md
deleted file mode 100644
index 8ce6537..0000000
--- a/nap/data/wiki/Waypoint-Check-Radio-Buttons-and-Checkboxes-by-Default.md
+++ /dev/null
@@ -1,3 +0,0 @@
-You can set a checkbox or radio button to be checked by default using the checked attribute.
-
-To do this, just add the word "checked" to the inside of an input element. For example, `<input type="radio" name="test-name" checked>`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Comment-out-HTML.md b/nap/data/wiki/Waypoint-Comment-out-HTML.md
deleted file mode 100644
index 396c865..0000000
--- a/nap/data/wiki/Waypoint-Comment-out-HTML.md
+++ /dev/null
@@ -1,15 +0,0 @@
-Commenting is a way that you can leave comments within your code without affecting the code itself.
-
-It is also a convenient way to make code inactive without having to delete it entirely.
-
-You can start a comment with `<!-- and end a comment with -->`.
-
-```
-<!--
-<h1>Hello World</h1>
-
-<h2>CatPhotoApp</h2>
-
-<p>Hello Paragraph</p>
--->
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Create-a-Bulleted-Unordered-List.md b/nap/data/wiki/Waypoint-Create-a-Bulleted-Unordered-List.md
deleted file mode 100644
index 67ac4b8..0000000
--- a/nap/data/wiki/Waypoint-Create-a-Bulleted-Unordered-List.md
+++ /dev/null
@@ -1,14 +0,0 @@
-HTML has a special element for creating unordered lists, or bullet point-style lists.
-
-Unordered lists start with a `<ul>` element. Then they contain some number of `<li>` elements.
-
-For example:
-
-```
-<ul>
-  <li>milk</li>
-  <li>cheese</li>
-</ul>
-```
-
-would create a bullet point-style list of "milk" and "cheese".
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Create-a-Form-Element.md b/nap/data/wiki/Waypoint-Create-a-Form-Element.md
deleted file mode 100644
index 3b9caea..0000000
--- a/nap/data/wiki/Waypoint-Create-a-Form-Element.md
+++ /dev/null
@@ -1,3 +0,0 @@
-You can build web forms that actually submit data to a server using nothing more than pure HTML. You can do this by specifying an action on your `form` element. 
-
-For example: `<form action="/url-where-you-want-to-submit-form-data"></form>`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Create-a-Set-of-Checkboxes.md b/nap/data/wiki/Waypoint-Create-a-Set-of-Checkboxes.md
deleted file mode 100644
index adf428a..0000000
--- a/nap/data/wiki/Waypoint-Create-a-Set-of-Checkboxes.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Checkboxes are a type of input.
-- Each of your checkboxes should be nested within its own label element.
-- All related checkbox inputs should have the same name attribute.
-
-Here's an example of a checkbox: `<label><input type="checkbox" name="personality"> Loving</label>`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Create-a-Set-of-Radio-Buttons.md b/nap/data/wiki/Waypoint-Create-a-Set-of-Radio-Buttons.md
deleted file mode 100644
index 7640203..0000000
--- a/nap/data/wiki/Waypoint-Create-a-Set-of-Radio-Buttons.md
+++ /dev/null
@@ -1,5 +0,0 @@
-You can use radio buttons for questions where you want the user to only give you one answer.
-
-Radio buttons are a type of input. They should all be nested in their own label element. Furthermore, all related radio buttons should have the same name attribute.
-
-Here's an example of a radio button: `<label><input type="radio" name="indoor-outdoor"> Indoor</label>`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Create-a-Text-Field.md b/nap/data/wiki/Waypoint-Create-a-Text-Field.md
deleted file mode 100644
index 7f75c07..0000000
--- a/nap/data/wiki/Waypoint-Create-a-Text-Field.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Text inputs are a convenient way to get input from your user.
-
-You can create one like this: `<input type="text">`. Note that input elements are self-closing.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Create-an-Ordered-List.md b/nap/data/wiki/Waypoint-Create-an-Ordered-List.md
deleted file mode 100644
index f4486aa..0000000
--- a/nap/data/wiki/Waypoint-Create-an-Ordered-List.md
+++ /dev/null
@@ -1,14 +0,0 @@
-HTML has a special element for creating ordered lists, or numbered-style lists.
-
-Ordered lists start with a `<ol>` element. Then they contain some number of `<li>` elements.
-
-For example:
-
-```
-<ol>
-  <li>hydrogen</li>
-  <li>helium</li>
-</ol>
-```
-
-would create a numbered list of "hydrogen" and "helium".
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Delete-HTML-Elements.md b/nap/data/wiki/Waypoint-Delete-HTML-Elements.md
deleted file mode 100644
index 133e867..0000000
--- a/nap/data/wiki/Waypoint-Delete-HTML-Elements.md
+++ /dev/null
@@ -1 +0,0 @@
-Deleting elements is very simple. All you have to do is remove everything from the opening to the closing of the element and it will be removed. No extra code is needed.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Fill-in-the-Blank-with-Placeholder-Text.md b/nap/data/wiki/Waypoint-Fill-in-the-Blank-with-Placeholder-Text.md
deleted file mode 100644
index 327c9e2..0000000
--- a/nap/data/wiki/Waypoint-Fill-in-the-Blank-with-Placeholder-Text.md
+++ /dev/null
@@ -1,11 +0,0 @@
-Web developers traditionally use **lorem ipsum** text as placeholder text. It's called lorem ipsum text because those are the first two words of a famous passage by Cicero of Ancient Rome.
-
-**lorem ipsum** text has been used as placeholder text by typesetters since the 16th century, and this tradition continues on the web.
-
-```
-<h1>Hello World</h1>
-
-<h2>CatPhotoApp</h2>
-
-<p>Kitty ipsum dolor sit amet, shed everywhere shed everywhere stretching attack your ankles chase the red dot, hairball run catnip eat the grass sniff.</p>
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Give-a-Background-Color-to-a-Div-Element.md b/nap/data/wiki/Waypoint-Give-a-Background-Color-to-a-Div-Element.md
deleted file mode 100644
index 485a99e..0000000
--- a/nap/data/wiki/Waypoint-Give-a-Background-Color-to-a-Div-Element.md
+++ /dev/null
@@ -1,3 +0,0 @@
-You can set an element's background color with the `background-color` attribute.
-
-For example, if you wanted an element's background color to be green, you'd use `.green-background { background-color: green; }` within your `style` element.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Headline-with-the-h2-Element.md b/nap/data/wiki/Waypoint-Headline-with-the-h2-Element.md
deleted file mode 100644
index ec850b7..0000000
--- a/nap/data/wiki/Waypoint-Headline-with-the-h2-Element.md
+++ /dev/null
@@ -1,6 +0,0 @@
-You can create different levels of Heading elements by using **h1, h2, h3, h4, h5, h6** which will result on different sizes.
-
-```
-<h1>Hello World</h1>
-<h2>CatPhotoApp</h2>
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Import-a-Google-Font.md b/nap/data/wiki/Waypoint-Import-a-Google-Font.md
deleted file mode 100644
index 4c7e977..0000000
--- a/nap/data/wiki/Waypoint-Import-a-Google-Font.md
+++ /dev/null
@@ -1 +0,0 @@
-To import a font from Google or any other site, this is the format that you should follow: `<link href="http://fonts.googleapis.com/css?family=Lobster" rel="stylesheet" type="text/css">`
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Inform-with-the-Paragraph-Element.md b/nap/data/wiki/Waypoint-Inform-with-the-Paragraph-Element.md
deleted file mode 100644
index b6d2352..0000000
--- a/nap/data/wiki/Waypoint-Inform-with-the-Paragraph-Element.md
+++ /dev/null
@@ -1,9 +0,0 @@
-`p` elements are the preferred element for normal-sized paragraph text on websites. P is short for "paragraph".
-
-You can create a p element like so: `<p>I'm a p tag!</p>`.
-
-```
-<h1>Hello World</h1>
-<h2>CatPhotoApp</h2>
-<p>Hello Paragraph</p>
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Inherit-Styles-from-the-Body-Element.md b/nap/data/wiki/Waypoint-Inherit-Styles-from-the-Body-Element.md
deleted file mode 100644
index f1a351a..0000000
--- a/nap/data/wiki/Waypoint-Inherit-Styles-from-the-Body-Element.md
+++ /dev/null
@@ -1,13 +0,0 @@
-The `body` element can be style just like any other.
-
-```
-<style>
-  body {
-    background-color: black;
-    color: green;
-    font-family: Monospace
-  }
-
-</style>
-<h1>Hello World</h1>
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Iterate-with-JavaScript-For-Loops.md b/nap/data/wiki/Waypoint-Iterate-with-JavaScript-For-Loops.md
deleted file mode 100644
index 04d824b..0000000
--- a/nap/data/wiki/Waypoint-Iterate-with-JavaScript-For-Loops.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Iterate with JavaScript For Loops
-The most common type of JavaScript loop is called a `for loop` because it runs `for` a specific number of times.
-
-```
-var ourArray = [];
-for(var i = 0; i < 5; i++) {
-  ourArray.push(i);
-}
-```
-
-ourArray will now contain [0,1,2,3,4]
-
-## More about for loops
-```
-for(var i = 0; i < 5; i++) {  // There are 3 parts here
-```
-There are three parts to for loop.  They are separated by semicolons.  
-
-1. The initialization: `var i = 0;` - This code runs only once at the start of the loop. It's usually used to declare the counter variable (with `var`) and initialize the counter (in this case it is set to 0).   
-
-2. The condition: `i < 5;` - The loop will run as long as this is `true`. That means that as soon as `i` is equal to 5, the loop will stop looping.  Note that the inside of the loop will never see `i` as 5 because it will stop before then.  If this condition is initially `false`, the loop will never execute.  
-
-3. The increment: `i++` - This code is run at the end of each loop. It's usually a simple increment (`++` operator), but can really be any mathematical transformation. It is used to move the counter (`i`) forward (or backwards, or whatever.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Link-to-External-Pages-with-Anchor-Elements.md b/nap/data/wiki/Waypoint-Link-to-External-Pages-with-Anchor-Elements.md
deleted file mode 100644
index 2de3127..0000000
--- a/nap/data/wiki/Waypoint-Link-to-External-Pages-with-Anchor-Elements.md
+++ /dev/null
@@ -1,3 +0,0 @@
-`a` elements, also known as anchor elements, are used to link to content outside of the current page.
-
-Here's an example: `<p>Here's a <a href="http://freecodecamp.com"> link to Free Code Camp</a> for you to follow.</p>`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Make-Circular-Images-with-a-Border-Radius.md b/nap/data/wiki/Waypoint-Make-Circular-Images-with-a-Border-Radius.md
deleted file mode 100644
index 9c257d4..0000000
--- a/nap/data/wiki/Waypoint-Make-Circular-Images-with-a-Border-Radius.md
+++ /dev/null
@@ -1,10 +0,0 @@
-You can also use percentage to `border-radius` to make things round.
-
-```
-.thick-green-border {
-  border-color: green;
-  border-width: 10px;
-  border-style: solid;
-  border-radius: 50%;
-}
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Make-Dead-Links-using-the-Hash-Symbol.md b/nap/data/wiki/Waypoint-Make-Dead-Links-using-the-Hash-Symbol.md
deleted file mode 100644
index f349923..0000000
--- a/nap/data/wiki/Waypoint-Make-Dead-Links-using-the-Hash-Symbol.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Replace your a element's `href` attribute with a `#`, also known as a hash symbol, to turn it into a dead link. Sometimes you want to add a elements to your website before you know where they will link.
-
-This is also handy when you're changing the behavior of a link using jQuery, which we'll learn about later.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Nest-Many-Elements-within-a-Single-Div-Element.md b/nap/data/wiki/Waypoint-Nest-Many-Elements-within-a-Single-Div-Element.md
deleted file mode 100644
index 931ab29..0000000
--- a/nap/data/wiki/Waypoint-Nest-Many-Elements-within-a-Single-Div-Element.md
+++ /dev/null
@@ -1,23 +0,0 @@
-The `div` element, also known as a division element, is a general purpose container for other elements.
-
-The div element is probably the most commonly used HTML element of all. It's useful for passing the CSS of its own class declarations down to all the elements that it contains.
-
-Just like any other non-self-closing element, you can open a `div` element with `<div>` and close it on another line with `</div>`.
-
-```
-<div>
- <p>Things cats love:</p>
- <ul>
-   <li>cat nip</li>
-   <li>laser pointers</li>
-   <li>lasagna</li>
- </ul>
- <p>Top 3 things cats hate:</p>
- <ol>
-   <li>flea treatment</li>
-   <li>thunder</li>
-   <li>other cats</li>
- </ol>
-</div>
->
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Nest-an-Anchor-Element-within-a-Paragraph.md b/nap/data/wiki/Waypoint-Nest-an-Anchor-Element-within-a-Paragraph.md
deleted file mode 100644
index cc4a7f9..0000000
--- a/nap/data/wiki/Waypoint-Nest-an-Anchor-Element-within-a-Paragraph.md
+++ /dev/null
@@ -1 +0,0 @@
-Nesting is simple, just add one element inside another: `<p> click here for <a href="http://www.catphotoapp.com">cat photos</a></p>`
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Override-All-Other-Styles-by-using-Important.md b/nap/data/wiki/Waypoint-Override-All-Other-Styles-by-using-Important.md
deleted file mode 100644
index 16a4f56..0000000
--- a/nap/data/wiki/Waypoint-Override-All-Other-Styles-by-using-Important.md
+++ /dev/null
@@ -1,3 +0,0 @@
-In many situations, you will use CSS libraries. These may accidentally override your own CSS. So when you absolutely need to be sure that an element has specific CSS, you can use !important.
-
-An example of how to do this is: `color: red !important;` This will make sure that we use the wanted property regardless of other overrides.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Override-Class-Declarations-by-Styling-ID-Attributes.md b/nap/data/wiki/Waypoint-Override-Class-Declarations-by-Styling-ID-Attributes.md
deleted file mode 100644
index ff65d8a..0000000
--- a/nap/data/wiki/Waypoint-Override-Class-Declarations-by-Styling-ID-Attributes.md
+++ /dev/null
@@ -1,19 +0,0 @@
-We can use `id` to override  styling too.
-
-```
-<style>
-  body {
-    background-color: black;
-    font-family: Monospace;
-    color: green;
-  }
-  .pink-text {
-    color: pink;
-  }
-  .blue-text {
-    color: blue;
-  }
-  #orange-text{color:orange;}
-</style>
-<h1 class="pink-text blue-text" id="orange-text">Hello World!</h1>
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Override-Class-Declarations-with-Inline-Styles.md b/nap/data/wiki/Waypoint-Override-Class-Declarations-with-Inline-Styles.md
deleted file mode 100644
index b88c43f..0000000
--- a/nap/data/wiki/Waypoint-Override-Class-Declarations-with-Inline-Styles.md
+++ /dev/null
@@ -1 +0,0 @@
-Remember, in line styles look like this: `<h1 style="color: green">` They will override everything else that was changing the text color of h1.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Override-Styles-in-Subsequent-CSS.md b/nap/data/wiki/Waypoint-Override-Styles-in-Subsequent-CSS.md
deleted file mode 100644
index 9c01f34..0000000
--- a/nap/data/wiki/Waypoint-Override-Styles-in-Subsequent-CSS.md
+++ /dev/null
@@ -1 +0,0 @@
-Your classes will override the body's CSS, if we add a new class that changes the same property, the last one will be the one applied.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Prioritize-One-Style-Over-Another.md b/nap/data/wiki/Waypoint-Prioritize-One-Style-Over-Another.md
deleted file mode 100644
index ba1e66d..0000000
--- a/nap/data/wiki/Waypoint-Prioritize-One-Style-Over-Another.md
+++ /dev/null
@@ -1,15 +0,0 @@
-Classes to individual elements take priority over general styles.
-
-```
-<style>
-  body {
-    background-color: black;
-    font-family: Monospace;
-    color: green;
-  }
-  .pink-text{color: pink;}
-</style>
-<h1 class="pink-text">Hello World!</h1>
-```
-
-This makes for a pink h1 instead of a green one.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Say-Hello-to-HTML-Elements.md b/nap/data/wiki/Waypoint-Say-Hello-to-HTML-Elements.md
deleted file mode 100644
index 530565a..0000000
--- a/nap/data/wiki/Waypoint-Say-Hello-to-HTML-Elements.md
+++ /dev/null
@@ -1,7 +0,0 @@
-HTML elements are written with a start tag, with an end tag, with the content in between:
-
-`<tagname>content</tagname>` The HTML element is everything from the start tag to the end tag:
-
-`<p>My first HTML paragraph.</p>`
-
-Opening tags look like this: `<h1>`. Closing tags look like this: `</h1>`  Note that the only difference between opening tags and closing tags is that closing tags have a slash after their opening angle bracket.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Set-the-Font-Family-of-an-Element.md b/nap/data/wiki/Waypoint-Set-the-Font-Family-of-an-Element.md
deleted file mode 100644
index 4c7e977..0000000
--- a/nap/data/wiki/Waypoint-Set-the-Font-Family-of-an-Element.md
+++ /dev/null
@@ -1 +0,0 @@
-To import a font from Google or any other site, this is the format that you should follow: `<link href="http://fonts.googleapis.com/css?family=Lobster" rel="stylesheet" type="text/css">`
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Set-the-ID-of-an-Element.md b/nap/data/wiki/Waypoint-Set-the-ID-of-an-Element.md
deleted file mode 100644
index 3253028..0000000
--- a/nap/data/wiki/Waypoint-Set-the-ID-of-an-Element.md
+++ /dev/null
@@ -1,7 +0,0 @@
-In addition to classes, each HTML element can also have an `id` attribute.
-
-There are several benefits to using id attributes, and you'll learn more about them once you start using jQuery.
-
-`id` attributes should be unique. Browsers won't enforce this, but it is a widely agreed upon best practice. So please don't give more than one element the same id attribute.
-
-Here's an example of how you give your h2 element the id of cat-photo-app: <h2 id="cat-photo-app">
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Size-your-Images.md b/nap/data/wiki/Waypoint-Size-your-Images.md
deleted file mode 100644
index 6b28bf7..0000000
--- a/nap/data/wiki/Waypoint-Size-your-Images.md
+++ /dev/null
@@ -1,3 +0,0 @@
-CSS has an attribute called `width` that controls an element's width. Just like with fonts, we'll use `px` (pixels) to specify the image's width.
-
-For example, if we wanted to create a CSS class called larger-image that gave HTML elements a width of 500 pixels, we'd use: `<style> .larger-image { width: 500px; } </style>`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Specify-How-Fonts-Should-Degrade.md b/nap/data/wiki/Waypoint-Specify-How-Fonts-Should-Degrade.md
deleted file mode 100644
index 686a5c2..0000000
--- a/nap/data/wiki/Waypoint-Specify-How-Fonts-Should-Degrade.md
+++ /dev/null
@@ -1,3 +0,0 @@
-There are several default fonts that are available in all browsers. These include `Monospace`, `Serif` and `Sans-Serif`.
-
-For example, if you wanted an element to use the `Helvetica` font, but also degrade to the `Sans-Serif` font when `Helvetica` wasn't available, you could use this CSS style: `p { font-family: Helvetica, Sans-Serif; }`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Style-the-HTML-Body-Element.md b/nap/data/wiki/Waypoint-Style-the-HTML-Body-Element.md
deleted file mode 100644
index fa51843..0000000
--- a/nap/data/wiki/Waypoint-Style-the-HTML-Body-Element.md
+++ /dev/null
@@ -1 +0,0 @@
-Every HTML page has the `body` element. and it is like the main page.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Turn-an-Image-into-a-Link.md b/nap/data/wiki/Waypoint-Turn-an-Image-into-a-Link.md
deleted file mode 100644
index 8865eac..0000000
--- a/nap/data/wiki/Waypoint-Turn-an-Image-into-a-Link.md
+++ /dev/null
@@ -1 +0,0 @@
-Creating images that link to things is essential and one of the most used things in Web Dev. Nest your image within an `a` element. Here's an example: `<a href="#"><img src="http://bit.ly/fcc-running-cats"/></a>`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Uncomment-HTML.md b/nap/data/wiki/Waypoint-Uncomment-HTML.md
deleted file mode 100644
index 7cbc2e3..0000000
--- a/nap/data/wiki/Waypoint-Uncomment-HTML.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Given that there are two ways to write comments in JavaScript:
-1. Using `//`
-2. Using `<!-- text -->`
-
-You can easily uncomment by just removing the comment elements.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-Abbreviated-Hex-Code.md b/nap/data/wiki/Waypoint-Use-Abbreviated-Hex-Code.md
deleted file mode 100644
index 9e14668..0000000
--- a/nap/data/wiki/Waypoint-Use-Abbreviated-Hex-Code.md
+++ /dev/null
@@ -1,11 +0,0 @@
-red, which is `#FF0000` in hex code, can be shortened to `#F00`. That is, one digit for red, one digit for green, one digit for blue.
-
-This reduces the total number of possible colors to around 4,000. But browsers will interpret `#FF0000` and `#F00` as exactly the same color.
-
-```
-<style>
-  body {
-    background-color: #F00;
-  }
-</style>
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-CSS-Selectors-to-Style-Elements.md b/nap/data/wiki/Waypoint-Use-CSS-Selectors-to-Style-Elements.md
deleted file mode 100644
index b39c4d0..0000000
--- a/nap/data/wiki/Waypoint-Use-CSS-Selectors-to-Style-Elements.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Instead of giving style attributes one by one, we can do this to multiple elements at the same time.
-
-You can create a style element like this: `<style></style>`.
-
-Inside that style element, you can create a CSS selector for any HTML Elements. For example, if you wanted all h2 elements to be red, your style element would look like this: `<style>h2 {color: red;}</style>`.
-
-Note that it's important to have both opening and closing curly braces `({` and `})` around each element's style. You also need to make sure your element's style is between the opening and closing style tags. Finally, be sure to add the semicolon to the end of each of your element's styles.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-Clockwise-Notation-to-Specify-the-Margin-of-an-Element.md b/nap/data/wiki/Waypoint-Use-Clockwise-Notation-to-Specify-the-Margin-of-an-Element.md
deleted file mode 100644
index 7db9504..0000000
--- a/nap/data/wiki/Waypoint-Use-Clockwise-Notation-to-Specify-the-Margin-of-an-Element.md
+++ /dev/null
@@ -1,10 +0,0 @@
-Instead of specifying an element's`margin-top`, `margin-right`, `margin-bottom`, and `margin-left` attributes, you can specify them all in one line, like this: `margin: 10px 20px 10px 20px;`.
-
-These four values work like a clock: top, right, bottom, left, and will produce the exact same result as using the side-specific margin instructions.
-
-```
-.green-box {
-  background-color: green;
-  margin: 40px 20px 20px 40px;
-}
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-Clockwise-Notation-to-Specify-the-Padding-of-an-Element.md b/nap/data/wiki/Waypoint-Use-Clockwise-Notation-to-Specify-the-Padding-of-an-Element.md
deleted file mode 100644
index 3419028..0000000
--- a/nap/data/wiki/Waypoint-Use-Clockwise-Notation-to-Specify-the-Padding-of-an-Element.md
+++ /dev/null
@@ -1,10 +0,0 @@
-Instead of specifying an element's `padding-top`, `padding-right`, `padding-bottom`, and `padding-lef`t attributes, you can specify them all in one line, like this: `padding: 10px 20px 10px 20px;`.
-
-These four values work like a clock: top, right, bottom, left, and will produce the exact same result as using the side-specific padding instructions.
-
-```
-.green-box {
-  background-color: green;
-  padding: 40px 20px 20px 40px
-}
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-HTML5-to-Require-a-Field.md b/nap/data/wiki/Waypoint-Use-HTML5-to-Require-a-Field.md
deleted file mode 100644
index c351dfa..0000000
--- a/nap/data/wiki/Waypoint-Use-HTML5-to-Require-a-Field.md
+++ /dev/null
@@ -1,10 +0,0 @@
-You can require specific form fields so that your user will not be able to submit your form until he or she has filled them out.
-
-For example, if you wanted to make a text input field required, you can just add the word required within your input element, you would use: `<input type="text" required>`.
-
-```
-<form action="/submit-cat-photo">
-  <input type="text" placeholder="cat photo URL" required>
-  <button type="submit">Submit</button>
-</form>
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-Hex-Code-for-Specific-Colors.md b/nap/data/wiki/Waypoint-Use-Hex-Code-for-Specific-Colors.md
deleted file mode 100644
index fc7398e..0000000
--- a/nap/data/wiki/Waypoint-Use-Hex-Code-for-Specific-Colors.md
+++ /dev/null
@@ -1,3 +0,0 @@
-With CSS, we use 6 hexadecimal number to represent colors. For example, `#000000` is the lowest possible value, and it represents the color black.
-
-This is the same as `#RRGGBB` which can also be simplified to `#RGB`.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-Hex-Code-for-Specific-Shades-of-Gray.md b/nap/data/wiki/Waypoint-Use-Hex-Code-for-Specific-Shades-of-Gray.md
deleted file mode 100644
index 50e6970..0000000
--- a/nap/data/wiki/Waypoint-Use-Hex-Code-for-Specific-Shades-of-Gray.md
+++ /dev/null
@@ -1 +0,0 @@
-We can also create other shades of gray by evenly mixing all three colors. We can go very close to true black. `background-color: #111111;`
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Blue.md b/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Blue.md
deleted file mode 100644
index 428af23..0000000
--- a/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Blue.md
+++ /dev/null
@@ -1,9 +0,0 @@
-Just as with [red](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Red) and the others.
-
-```
-<style>
-  body {
-    background-color: #0000FF;
-  }
-</style>
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Gray.md b/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Gray.md
deleted file mode 100644
index fdbe1a2..0000000
--- a/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Gray.md
+++ /dev/null
@@ -1 +0,0 @@
-We can also create different shades of gray by evenly mixing all three colors. `background-color: #808080;`
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Green.md b/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Green.md
deleted file mode 100644
index afc5e58..0000000
--- a/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Green.md
+++ /dev/null
@@ -1,9 +0,0 @@
-Just as with [red](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Red) and the others.
-
-```
-<style>
-  body {
-    background-color: #00FF00;
-  }
-</style>
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Red.md b/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Red.md
deleted file mode 100644
index d114b7b..0000000
--- a/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-Red.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Hex code follows the red-green-blue, or rgb format. The first two digits of hex code represent the amount of red in the color. The third and fourth digit represent the amount of green. The fifth and sixth represent the amount of blue.
-
-So to get the absolute brightest red, you would just use `F` for the first and second digits (the highest possible value) and `0` for the third, fourth, fifth and sixth digits (the lowest possible value).
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-White.md b/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-White.md
deleted file mode 100644
index 0168eae..0000000
--- a/nap/data/wiki/Waypoint-Use-Hex-Code-to-Color-Elements-White.md
+++ /dev/null
@@ -1 +0,0 @@
-`0` is the lowest number in hex code, and represents a complete absence of color. `F` is the highest number in hex code, and it represents the maximum possible brightness.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-Hex-Code-to-Mix-Colors.md b/nap/data/wiki/Waypoint-Use-Hex-Code-to-Mix-Colors.md
deleted file mode 100644
index 9eb089d..0000000
--- a/nap/data/wiki/Waypoint-Use-Hex-Code-to-Mix-Colors.md
+++ /dev/null
@@ -1,9 +0,0 @@
-Orange is pure red, mixed with some green, and no blue.
-
-```
-<style>
-  body {
-    background-color: #FFA500;
-  }
-</style>
-```
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Blue.md b/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Blue.md
deleted file mode 100644
index 6396043..0000000
--- a/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Blue.md
+++ /dev/null
@@ -1 +0,0 @@
-The RGB value blue: `rgb(0, 0, 255)`
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Gray.md b/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Gray.md
deleted file mode 100644
index 0dc39f8..0000000
--- a/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Gray.md
+++ /dev/null
@@ -1 +0,0 @@
-RGB value for gray: `rgb(128, 128, 128)`
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Green.md b/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Green.md
deleted file mode 100644
index 65330d0..0000000
--- a/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Green.md
+++ /dev/null
@@ -1 +0,0 @@
-The rgb value green: `rgb(0, 255, 0)`
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Red.md b/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Red.md
deleted file mode 100644
index 4705b36..0000000
--- a/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-Red.md
+++ /dev/null
@@ -1 +0,0 @@
-`background-color: rgb(255, 0, 0)`
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-White.md b/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-White.md
deleted file mode 100644
index a34d6da..0000000
--- a/nap/data/wiki/Waypoint-Use-RGB-to-Color-Elements-White.md
+++ /dev/null
@@ -1 +0,0 @@
-`background-color: rgb(255,255,255)`
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-RGB-to-Mix-Colors.md b/nap/data/wiki/Waypoint-Use-RGB-to-Mix-Colors.md
deleted file mode 100644
index f494b7f..0000000
--- a/nap/data/wiki/Waypoint-Use-RGB-to-Mix-Colors.md
+++ /dev/null
@@ -1 +0,0 @@
-RGB value orange: `rgb(255, 165, 0)`
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-RGB-values-to-Color-Elements.md b/nap/data/wiki/Waypoint-Use-RGB-values-to-Color-Elements.md
deleted file mode 100644
index 65cd00d..0000000
--- a/nap/data/wiki/Waypoint-Use-RGB-values-to-Color-Elements.md
+++ /dev/null
@@ -1,5 +0,0 @@
-Another way you can represent colors in CSS is by using `rgb` values.
-
-RGB values look like this: `rgb(0, 0, 0)` for black and `rgb(255, 255, 255)` for white.
-
-Instead of using six hexadecimal digits like you do with hex code, with rbg you specify the brightness of each color with a number between 0 and 255. `background-color: rgb(0,0,0);`
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-a-CSS-Class-to-Style-an-Element.md b/nap/data/wiki/Waypoint-Use-a-CSS-Class-to-Style-an-Element.md
deleted file mode 100644
index be2b659..0000000
--- a/nap/data/wiki/Waypoint-Use-a-CSS-Class-to-Style-an-Element.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Classes are reusable styles that can be added to HTML elements. You can apply a class to an HTML element like this: `<h2 class="blue-text">CatPhotoApp</h2>`.
-
-Note that in your CSS style element, classes should start with a period. In your HTML elements' class declarations, classes shouldn't start with a period.
\ No newline at end of file
diff --git a/nap/data/wiki/Waypoint-Use-an-ID-Attribute-to-Style-an-Element.md b/nap/data/wiki/Waypoint-Use-an-ID-Attribute-to-Style-an-Element.md
deleted file mode 100644
index 250f01f..0000000
--- a/nap/data/wiki/Waypoint-Use-an-ID-Attribute-to-Style-an-Element.md
+++ /dev/null
@@ -1,7 +0,0 @@
-One cool thing about `id` attributes is that, like classes, you can style them using CSS.
-
-Here's an example of how you can take your element with the `id` attribute of cat-photo-element and give it the background color of green.
-
-In your style element: `#cat-photo-element { background-color: green; }`
-
-Note that inside your style element, you always reference classes by putting a `.` in front of their names. You always reference ids by putting a `#` in front of their names.
\ No newline at end of file
diff --git a/nap/data/wiki/What-exactly-Free-Code-Camp-does.md b/nap/data/wiki/What-exactly-Free-Code-Camp-does.md
deleted file mode 100644
index 59a5e9f..0000000
--- a/nap/data/wiki/What-exactly-Free-Code-Camp-does.md
+++ /dev/null
@@ -1,4 +0,0 @@
-We help our campers (students):
-- Learn full stack JavaScript
-- Build a portfolio of real apps that real people are using
-- Get a coding job
\ No newline at end of file
diff --git a/nap/data/wiki/What-pair-programming-is-and-why-it-is-special.md b/nap/data/wiki/What-pair-programming-is-and-why-it-is-special.md
deleted file mode 100644
index 79699cb..0000000
--- a/nap/data/wiki/What-pair-programming-is-and-why-it-is-special.md
+++ /dev/null
@@ -1,11 +0,0 @@
-Pair programming is where two people code together on one computer.
-
-![](http://cs10.org/sp15/resources/images/pairprogramming.jpg)
-
-Pair programming encourages you to discuss different approaches to solving problems, and to keep one another other motivated. The result is better code than either of you could have written by yourselves. 
-
-Because of its benefits, many engineers pair program full time. And it's the best way to learn coding. Thanks to tools that allow two people to share mouse and keyboard inputs, you can pair program with a friend without needing to be in the same room.
-
-You can experience these benefits by pair programming with other Free Code Camp students on our coding challenges. Eventually, you'll work with people at nonprofits to build real-life software solutions.
-
-Here's [why you should try pair programming](https://github.com/FreeCodeCamp/freecodecamp/wiki/Why-You-Should-Try-Pair-Programming) and here are some tips on [how to be a good pair programmer](https://github.com/FreeCodeCamp/freecodecamp/wiki/Tips-on-How-To-Become-A-Good-Pair-Programmer).
diff --git a/nap/data/wiki/What-the-main-advantages-of-Free-Code-Camp-are.md b/nap/data/wiki/What-the-main-advantages-of-Free-Code-Camp-are.md
deleted file mode 100644
index e0dcb3b..0000000
--- a/nap/data/wiki/What-the-main-advantages-of-Free-Code-Camp-are.md
+++ /dev/null
@@ -1,10 +0,0 @@
-Free Code Camp's main advantages are that we're accessible to busy adults who want to change careers.
-
-Specifically, we're:
-
-* Free
-* Self-paced
-* Browser-based
-
-One of the most noticeable differences in this curriculum than other Code-Camp/School environments is the level of support: Using the chat-rooms for help, guidance, and assisting fellow coders gives you a better understanding of the code, easier access to explanations, and it's in real-time so you can question the confusion.
-
diff --git a/nap/data/wiki/What-the-style-guide-for-Bonfires-is.md b/nap/data/wiki/What-the-style-guide-for-Bonfires-is.md
deleted file mode 100644
index 405e0c7..0000000
--- a/nap/data/wiki/What-the-style-guide-for-Bonfires-is.md
+++ /dev/null
@@ -1,15 +0,0 @@
-Writing Bonfire challenges is a great way to exercise your own problem solving and testing abilities. Follow this process closely to maximize the chances of us accepting your bonfire.
-
-- Fork the Free Code Camp repository and open `seed_data/bonfires.json` to become familiar with the format of our bonfires.
-- Regardless of your bonfire's difficulty, put it as the last bonfire in the JSON file. Change one of the numbers in the ID to ensure that your bonfire has a unique ID.
-- In the terminal, run `node seed_data/seed.js`. Run `gulp`. You should be able to navigate to your new bonfire in the challenge map. Whenever you make a change to bonfire.json, you'll need to reseed in order to see these changes in the browser.
-- Solve your own Bonfire. Confirm that your tests work as expected and that your instructions are sufficiently clear.
-- Submit a pull request to Free Code Camp's Staging branch and in the pull request body, link to a gist that has your algorithmic solution.
-
-Here is a description of each of the Bonfires' fields.
-- Name - The name of your challenge. It's OK for this to be humorous but it must be brief and relevant to the task.
-- Difficulty - Attempt to rate difficulty compared against existing bonfire challenges. A good proxy for the difficulty of a bonfire is how long it takes you to solve it. For every 15 minutes it takes, increase the difficulty. For example, a one-hour bonfire should probably be a 4.
-- Description- Separate paragraphs with a line break. Only the first paragraph is visible prior to a user before they click the the 'More information' button. All necessary information must be included in the first paragraph. Write this first paragraph as succinctly as possible. Subsequent paragraphs should offer hints or details if needed. If your subject matter warrants deeper understanding, you may link to Wikipedia.
-- Challenge Seed - This is where you set up what will be in the editor when the camper starts the bonfire.
-- Tests - These tests are what bring your challenge to life. Without them, we cannot confirm the accuracy of a user's submitted answer. Choose your tests wisely. Bonfire tests are written using the Chai.js assertion library. Please use the should and expect syntax for end user readability. As an example of what not do to, many of the original Bonfire challenges are written with assert syntax and many of the test cases are difficult to read. If your bonfire question has a lot of edge cases, you will need to write many tests for full coverage. If you find yourself writing more tests than you desire, you may consider simplifying the requirements of your bonfire challenge. For difficulty level 1 through 3, you will generally only need 2 to 4 tests.
-- MDNlinks- Take a look at `seed_data/bonfireMDNlinks.js`. If any of these concepts are relevant to your bonfire, be sure to include them. If you know of an MDN article that isn't linked here, you can add it to the bonfireMDNlinks.js file before adding it to your bonfire.
\ No newline at end of file
diff --git a/nap/data/wiki/What-to-do-if-you-speak-a-language-that-Free-Code-Camp-does-not-yet-support.md b/nap/data/wiki/What-to-do-if-you-speak-a-language-that-Free-Code-Camp-does-not-yet-support.md
deleted file mode 100644
index ccb9114..0000000
--- a/nap/data/wiki/What-to-do-if-you-speak-a-language-that-Free-Code-Camp-does-not-yet-support.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Translation is an all-or-nothing proposal.
-
-We won't be able to add new languages to Free Code Camp until all of our challenges are translated into that language.
-
-In addition to translating these initially, we'll also need to maintain the translation as the challenges are gradually updated.
-
-If you're able to help us, you can join our [translation Trello board](https://trello.com/b/m7zhwXka/fcc-translation) by sending @quincylarson your email address in Gitter.
\ No newline at end of file
diff --git a/nap/data/wiki/What-you-will-learn,-and-in-what-sequence-you-will-learn-it.md b/nap/data/wiki/What-you-will-learn,-and-in-what-sequence-you-will-learn-it.md
deleted file mode 100644
index da8ad2b..0000000
--- a/nap/data/wiki/What-you-will-learn,-and-in-what-sequence-you-will-learn-it.md
+++ /dev/null
@@ -1,12 +0,0 @@
-- [HTML5](https://developer.mozilla.org/en-US/docs/Web/HTML) - the structure of web pages
-- [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) - the visual style of web pages
-- [Bootstrap](http://getbootstrap.com/) - a "responsive design" tool that helps your websites look great on tablets and phones
-- [jQuery](https://jquery.com/) and [Ajax] (https://developer.mozilla.org/en-US/docs/AJAX) - easy tools for controlling content in the browser
-- [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript) - the one programming language that all web browsers use
-- [Algorithms](https://en.wikipedia.org/wiki/Algorithm) - step-by-step recipes for getting things done
-- [Git](https://git-scm.com/) - a version control system for saving and sharing your projects
-- [MongoDB](https://www.mongodb.org/) - a popular non-relational database
-- [Angular.js](https://angularjs.org/) - a tool for making exciting web interfaces
-- [Express.js](http://expressjs.com/)- a powerful web development framework
-- [Node.js](https://nodejs.org/) - a platform for creating scalable network applications.
-- [Agile](https://en.wikipedia.org/wiki/Agile_software_development) - a set of software development principles that focus the design and production of a project on the needs of its users
\ No newline at end of file
diff --git a/nap/data/wiki/Why-You-Should-Try-Pair-Programming.md b/nap/data/wiki/Why-You-Should-Try-Pair-Programming.md
deleted file mode 100644
index 4f109b8..0000000
--- a/nap/data/wiki/Why-You-Should-Try-Pair-Programming.md
+++ /dev/null
@@ -1,24 +0,0 @@
-#### When I started working through my first bonfires, I was really scared of speaking to strangers. What would this person think about me? 
-Would I even be able to write good code with someone watching me?
-
-Now, some weeks later I've pair programmed and reviewed code with more than 40 campers and let me tell you: it's not as scary as it seems.
-It's perfectly normal to feel that way. Most of the campers that I've talked to agree that they were nervous too.
-
-**Here are a few good reasons to try pair programming** (I wish I knew this when I started...):
-
-### You can...
-- Build your professional network
-- Meet new friends - develop a support group
-- Improve social skills
-- Get motivation and encouragement from fellow campers
-- See other's coding styles
-- Learn from each other
-- Strengthen your strengths and get help finding and improving your weaknesses
-- Pair with **more** experienced dev to **improve your skills**
-- Pair with **less** experienced dev to **test your knowledge**
-- Gain a new skill that will be useful for interviews and employment down the road
-
-With the right person, pair programming is one of the best ways to learn at the same time as you make new friends!
-[You might also want to know how you could be a good pair programmer!](https://github.com/FreeCodeCamp/freecodecamp/wiki/Tips-on-How-To-Become-A-Good-Pair-Programmer)
-
-// Samuel (gr33n) with help from Ryan (rsprice)
\ No newline at end of file
diff --git a/nap/data/wiki/Why-does-Free-Code-Camp-use-JavaScript-instead-of-Ruby-or-Python.md b/nap/data/wiki/Why-does-Free-Code-Camp-use-JavaScript-instead-of-Ruby-or-Python.md
deleted file mode 100644
index 1063c6e..0000000
--- a/nap/data/wiki/Why-does-Free-Code-Camp-use-JavaScript-instead-of-Ruby-or-Python.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Like JavaScript, Ruby and Python are high-level scripting languages that can be used for full stack web development.
-
-But even if you learned these languages, you'd still need to learn JavaScript. That's because JavaScript is the only language that runs in web browsers. JavaScript has been around for 20 years, and it is still growing in popularity.
-
-Because of this, JavaScript has more tools and online learning resources than any other language.
-
-![A chart showing the volume of new GitHub repositories by year, with JavaScript growing and most languages declining.](https://s3.amazonaws.com/freecodecamp/github-repo-growth.png)
\ No newline at end of file
diff --git a/nap/data/wiki/Why-you-need-Free-Code-Camp..md b/nap/data/wiki/Why-you-need-Free-Code-Camp..md
deleted file mode 100644
index 9f68cb5..0000000
--- a/nap/data/wiki/Why-you-need-Free-Code-Camp..md
+++ /dev/null
@@ -1,8 +0,0 @@
-You need Free Code Camp because learning to code is hard.
-
-Most people who successfully learn to code:
-
-- Make friends with people who code
-- Code a little every day
-
-We give you the structure and the community you need so you can successfully learn to code.
\ No newline at end of file
diff --git a/nap/data/wiki/Wiki-Style-Guide.md b/nap/data/wiki/Wiki-Style-Guide.md
deleted file mode 100644
index dedd2be..0000000
--- a/nap/data/wiki/Wiki-Style-Guide.md
+++ /dev/null
@@ -1,17 +0,0 @@
-###"Wiki" is a Hawaiian word meaning "quick". Keep this in mind when creating wiki articles.
-
-We are always happy to help new contributors write, edit, and localize our wiki articles. Help us make Free Code Camp the best it can be. 
-
-You can create a new wiki page by clicking the "New Page" button at top right.
-
-Keep your wiki articles short and focused. Your articles should be no longer than this article.  If your article is longer than this, break it up smaller articles that link to each other.
-
-You can include images if they help you better communicate your subject. 
-
-Use descriptive, punctuation-free titles.
-
-Our wiki articles are [written in GitHub-flavor Markdown](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet).
-
-If you have questions about contributing to the Free Code Camp Wiki message [@rafase282](https://gitter.im/rafase282) in [Gitter](https://github.com/FreeCodeCamp/freecodecamp/wiki/Gitter)
-
-We look forward to wiki-ing with you!
\ No newline at end of file
diff --git a/nap/data/wiki/World-Language-Chat-Rooms.md b/nap/data/wiki/World-Language-Chat-Rooms.md
deleted file mode 100644
index 5d6f155..0000000
--- a/nap/data/wiki/World-Language-Chat-Rooms.md
+++ /dev/null
@@ -1,25 +0,0 @@
-The following are our language-specific chat rooms.
-
-**Please note that all chat rooms listed here are publicly accessible and indexed by search engines, so only share email addresses or other sensitive information in private messages.**
-
-- [Albanian](https://gitter.im/freecodecamp/Albanian)
-- [Arabic](https://gitter.im/freecodecamp/Arabic)
-- [Chinese](https://gitter.im/freecodecamp/Chinese)
-- [German](https://gitter.im/freecodecamp/Deutsch)
-- [Dutch](https://gitter.im/freecodecamp/Dutch)
-- [Spanish](https://gitter.im/freecodecamp/Espanol)
-- [French](https://gitter.im/freecodecamp/Francais)
-- [Japanese](https://gitter.im/freecodecamp/Japanese)
-- [Korean](https://gitter.im/freecodecamp/Korean)
-- [Persian](https://gitter.im/freecodecamp/Persian)
-- [Portugues](https://gitter.im/freecodecamp/Portugues)
-- [Romanian](https://gitter.im/freecodecamp/Romanian)
-- [Russian](https://gitter.im/freecodecamp/Russian)
-- [Swedish](https://gitter.im/freecodecamp/Swedish)
-- [Thai](https://gitter.im/freecodecamp/Thai)
-- [Tagalog](https://gitter.im/freecodecamp/Tagalog)
-- [Vietnamese](https://gitter.im/freecodecamp/Vietnamese)
-
-By joining these chat rooms, you accept our [Code of Conduct](https://github.com/FreeCodeCamp/freecodecamp/wiki/Code-of-Conduct).
-
-[Official Free Code Camp chat rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/Official-Free-Code-Camp-Chat-Rooms)
\ No newline at end of file
diff --git a/nap/data/wiki/Writing-great-git-commit-message.md b/nap/data/wiki/Writing-great-git-commit-message.md
deleted file mode 100644
index dfe869b..0000000
--- a/nap/data/wiki/Writing-great-git-commit-message.md
+++ /dev/null
@@ -1,34 +0,0 @@
-### The seven rules of a great git commit message
-
-1. Separate subject from body with a blank line
-2. Limit the subject line to 50 characters
-3. Capitalize the subject line
-4. Do not end the subject line with a period
-5. Use the imperative mood in the subject line
-6. Wrap the body at 72 characters
-7. Use the body to explain what and why vs. how
-
-**A properly formed git commit subject line should always be able to complete the following sentence:**
-
-> If applied, this commit will *`<<your subject line here>>`*
-
-## &nbsp;
-
-**For example:**
-
-* If applied, this commit will ***Refactor subsystem X for readability***
-* If applied, this commit will ***Update getting started documentation***
-* If applied, this commit will ***Remove deprecated methods***
-* If applied, this commit will ***Release version 1.0.0***
-* If applied, this commit will ***Merge pull request #123 from user/branch***
-
-**Notice how this doesn't work for the other non-imperative forms:**
-
-* If applied, this commit will *~~fixed bug with Y~~*
-* If applied, this commit will *~~changing behavior of X~~*
-* If applied, this commit will *~~more fixes for broken stuff~~*
-* If applied, this commit will *~~sweet new API methods~~*
-
-**Remember:** *Use of the imperative is important only in the subject line. You can relax this restriction when you're writing the body.*
-
-**Reference:** http://chris.beams.io/posts/git-commit
\ No newline at end of file
diff --git a/nap/data/wiki/You-will-be-able-to-get-a-software-engineering-job-after-Free-Code-Camp.md b/nap/data/wiki/You-will-be-able-to-get-a-software-engineering-job-after-Free-Code-Camp.md
deleted file mode 100644
index fcddedb..0000000
--- a/nap/data/wiki/You-will-be-able-to-get-a-software-engineering-job-after-Free-Code-Camp.md
+++ /dev/null
@@ -1,10 +0,0 @@
-If you complete Free Code Camp, *you will be able to get a coding job.* Dozens of our campers have already gotten coding jobs.
-
-![](https://www.evernote.com/shard/s116/sh/55c128c7-5d99-41cc-b03d-b3de22611c8d/b43e467b3889f646fec34bb4c161e2a2/deep/0/What's-wrong-with-this-picture----Code.org.png)
-
-Here are the facts:
-
-- There are hundreds of thousands of unfilled coding jobs.
-- Employers and the US government have joined together to promote nontraditional coding programs like Free Code Camp.
-- Full stack JavaScript is one of best paying skill sets, and has a ton of job openings.
-- The best proof that you're an employable developer is a portfolio filled with real apps that real people are using.
\ No newline at end of file
diff --git a/nap/data/wiki/_Footer.md b/nap/data/wiki/_Footer.md
deleted file mode 100644
index 6fab46c..0000000
--- a/nap/data/wiki/_Footer.md
+++ /dev/null
@@ -1,7 +0,0 @@
-We help you learn to code, then practice by building projects for nonprofits. Learn Full-stack JavaScript, build a portfolio, and get a coding job by joining our open source community at http://freecodecamp.com
-
-[Follow Quincy on Quora](http://www.quora.com/Quincy-Larson/answers)  
-[Follow us on Twitter](https://twitter.com/intent/user?screen_name=freecodecamp)  
-[Like us on Facebook](https://www.facebook.com/freecodecamp)  
-[Follow us on Twitch](http://twitch.tv/freecodecamp)  
-And be sure to click the "Star" button in the upper right of this page.
\ No newline at end of file
diff --git a/nap/data/wiki/_Sidebar.md b/nap/data/wiki/_Sidebar.md
deleted file mode 100644
index f28cc72..0000000
--- a/nap/data/wiki/_Sidebar.md
+++ /dev/null
@@ -1,12 +0,0 @@
-New to Free Code Camp? Take a few minutes to browse these wiki articles:
-- [What exactly Free Code Camp does](https://github.com/FreeCodeCamp/freecodecamp/wiki/What-exactly-Free-Code-Camp-does)
-- [Why you need Free Code Camp](https://github.com/FreeCodeCamp/freecodecamp/wiki/Why-you-need-Free-Code-Camp.)
-- [What the main advantages of Free Code Camp are](https://github.com/FreeCodeCamp/freecodecamp/wiki/What-the-main-advantages-of-Free-Code-Camp-are)
-- [You will be able to get a software engineering job after Free Code Camp](https://github.com/FreeCodeCamp/freecodecamp/wiki/You-will-be-able-to-get-a-software-engineering-job-after-Free-Code-Camp)
-- [What you will learn, and in what sequence you will learn it](https://github.com/FreeCodeCamp/freecodecamp/wiki/What-you-will-learn,-and-in-what-sequence-you-will-learn-it)
-- [How long Free Code Camp takes to complete](https://github.com/FreeCodeCamp/freecodecamp/wiki/How-long-Free-Code-Camp-takes-to-complete)
-- [What pair programming is and why it is special](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/What-pair-programming-is-and-why-it-is-special)
-- [How to use the Free Code Camp Wiki]
-(https://github.com/FreeCodeCamp/freecodecamp/wiki/How-to-use-the-Free-Code-Camp-Wiki)
-- [Official Free Code Camp Chat Rooms](https://github.com/FreeCodeCamp/freecodecamp/wiki/Official-Free-Code-Camp-Chat-Rooms)
-- [List of Free Code Camp city based Campsites](https://github.com/FreeCodeCamp/freecodecamp/wiki/List-of-Free-Code-Camp-city-based-Campsites)
\ No newline at end of file
diff --git a/nap/data/wiki/beta.md b/nap/data/wiki/beta.md
deleted file mode 100644
index 53d7ebd..0000000
--- a/nap/data/wiki/beta.md
+++ /dev/null
@@ -1,17 +0,0 @@
-### What happens in betas, stays in betas
-
-![](http://www.hebraico.pro.br/biblia/beta.jpg)
-
-The [beta release](http://beta.freecodecamp.com) is where we ask people to test out new features.
-
-### Your progress on beta.freecodecamp.com will NOT be saved to freecodecamp.com's database! ###
-We really appreciate everyone's help ironing out our Beta Release, but please understand that it's not possible to merge two user databases with completely different sets of content. Think of our beta as just a preview test, to check things work properly. In fact the database maybe reset at any time so we can try out things like the sign-up process.  
-
-Feel free to experiment with our beta site, but note the following:
-- Our beta site is quite buggy. If you notice a bug, please make sure it's a new one before you create an issue.
-- We've removed all authentication options other than GitHub from our beta. Don't worry - you will still be able to sign in using LinkedIn, Twitter, Google and Facebook in the future.
-- Our beta database is an old version of Free Code Camp's database. Your Free Code Camp account may not yet exist on the beta site, so please create one if you want to experiment with it.
-
-Also, please remember that all our Waypoint challenges are optional. **You will not have to go back and complete new waypoints as we add them.**
-
-We plan to merge all these new beta features into freecodecamp.com as soon as we've worked out all the major bugs.
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-arguments-optional.md b/nap/data/wiki/bonfire-arguments-optional.md
deleted file mode 100644
index 73cbe9d..0000000
--- a/nap/data/wiki/bonfire-arguments-optional.md
+++ /dev/null
@@ -1,101 +0,0 @@
-# Author
-
-![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
-
-* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
-* CodePed Profile: http://codepen.io/Rafase282/
-* LinkedIn: https://www.linkedin.com/in/rafase282
-
-# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
-
-# Details
-
-* Difficulty: 2/5
-
-Fill in the object constructor with the methods specified in the tests.
-
-Create a function that sums two arguments together. If only one argument is provided, return a
-function that expects one additional argument and will return the sum.
-
-For example, add(2, 3) should return 5, and add(2) should return a function that is waiting for an
-argument so that var sum2And = add(2); return sum2And(3); // 5
-
-If either argument isn't a valid number, return undefined.
-
-Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
-
-# Useful Links
-
-* [Global Function Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function)
-* [Arguments object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments)
-
-# Problem Script:
-
-```
-function add() {
-  return false;
-}
-
-add(2,3);
-```
-## Explanation:
-It can be quite complicated to understand what needs to be done. There is always many ways to do something when coding but regardless of the algorithm used, 
-we have to create a program that does the following:
-
-* It has to add two numbers passed as parameters and return the addition.
-* It has to check if any of the numbers are actual numbers, otherwise return **undefined** and stop the program right there.
-* It has to check if it has one or two arguments passed. More re ignored.
-* If it has only one then it has to return a function that used that number and expects another one, to then add it.
-
-## Hint: 1
-Every time you deal with an argument, you have to check if it is a number or not. For this a function that handles this task will save you repeated code.
-
-## Hint: 2
-When working on the case that it needs to return the function, it is wise to check if the first and only argument is a number again and base the code on that.
-
-## Hint: 3
-In the case that only one argument was passed, do not worry about how to prompt input for the second one, just make the function definition properly and things will work out the way they should.
-
-## My code
-
-```
-function add() {
-
-    var checkNum = function (num) {
-        if (typeof num !== 'number'){
-            return undefined;
-        }else
-            return num;
-    };
-
-    if (arguments.length > 1) {
-        var a = checkNum(arguments[0]);
-        var b = checkNum(arguments[1]);
-        if (a === undefined || b === undefined) {
-            return undefined;
-        } else {return a + b;}
-    } else {
-        var c = arguments[0];
-        if(checkNum(c)){
-            return function(arg2) {
-                if (c === undefined || checkNum(arg2) === undefined) {
-                    return undefined;
-                }else {
-                    return c + arg2;
-                }
-            };
-        }
-    }
-}
-```
-## Code Explanation:
-
-* First, I create a function with the sole purpose of checking if a number is actually a number and returns undefined if it is not. It uses **typeof** to check.
-* Check if we have two parameters, if so, then check if they are numbers or not using the **checkNum** function I created.
-* If they are not **undefined** then add them and return the addition. If they any of them is undefined then return undefined.
-* In the case that we only have one argument, then we return a new function that expects two parameters. For this we store the first argument before going into a new scope to avoid our arguments being overwritten.
-* Still inside the big else, we need to check the argument we saved, if it is a number then we return the function expecting a second argument.
-* Now inside the function we are returning, we have to check for non numbers again just as at the beginning using **checkNum** if undefined then return that, otherwise if numbers add them and return the addition.
-
-
-## [Go Home](https://github.com/Rafase282/My-FreeCodeCamp-Code/wiki)
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-binary-agents.md b/nap/data/wiki/bonfire-binary-agents.md
deleted file mode 100644
index e664ef4..0000000
--- a/nap/data/wiki/bonfire-binary-agents.md
+++ /dev/null
@@ -1,80 +0,0 @@
-# Author
-
-![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
-
-* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
-* CodePed Profile: http://codepen.io/Rafase282/
-* LinkedIn: https://www.linkedin.com/in/rafase282
-
-# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
-
-# Details
-
-* Difficulty: 2/5
-
-Return an English translated sentence of the passed binary string.
-
-The binary string will be space separated.
-
-Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
-
-# Useful Links
-
-* [String.charCodeAt()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt)
-* [String.fromCharCode()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)
-
-# Problem Script:
-
-```
-function binaryAgent(str) {
-  return str;
-}
-
-binaryAgent('01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111');
-```
-
-## Explanation:
-
-This problem is very straight forward, you will get string that will represent a sentence in binary code, and you need to translate that into words. There is not direct way to do this so you will have to translate twice.
-
-You should first convert from **binary** to **decimal** and from decimal to **ASCII**
-soon
-
-## Hint: 2
-Things are easier when focusing on smaller parts, divide the input to focus on one letter at the time.
-
-## Hint: 3
-Make sure that each time you transcode a character from binary to decimal, that you reset whatever variable you used to keep track of the ones. Also do not forget to turn everything back into one string.
-
-## My code:
-
-```
-function binaryAgent(str) {
-    str = str.split(' ');
-    var power;
-    var decValue = 0;
-    var sentence = '';
-    for (var s in str) {
-        for (var t in str[s]){
-            if (str[s][t] == 1){
-                power = Math.pow(2,+str[s].length - t - 1);
-                decValue+= power;
-            }
-        }
-        sentence+=(String.fromCharCode(decValue));
-        decValue = 0;
-    }
-  return sentence;
-}
-```
-## My Code Explanation:
-
-* Separate the string into an array of strings separated by whitespace.
-* Create some variables that will be needed along the way, the names are self explanatory for the most part.
-* Iterate through each binary string in the new array.
-* For each of these binary strings, check for the ones and ignore the zeroes.
-* For those that are one or active then convert them to decimal, this takes into account the position and the right power it needs to be raised to.
-* Store the power into the **power** variable by adding it to any previous ones on the variable **decValue**. This variable will add and add the powers of the active ones until the end of the loop and then return the decimal number.
-* Convert the final decimal outside of the inner loop and then convert it to ASCII and saving it to **sentence** along with any other text string already converted and stored.
-* Reset the variable **decValue** to avoid getting wrong decimals before continuing to the outer loop.
-* At the end, we return out converted message.
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-check-for-palindromes.md b/nap/data/wiki/bonfire-check-for-palindromes.md
deleted file mode 100644
index bb14ee4..0000000
--- a/nap/data/wiki/bonfire-check-for-palindromes.md
+++ /dev/null
@@ -1 +0,0 @@
-wiki coming soon!
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-chunky-monkey.md b/nap/data/wiki/bonfire-chunky-monkey.md
deleted file mode 100644
index d9d2ea8..0000000
--- a/nap/data/wiki/bonfire-chunky-monkey.md
+++ /dev/null
@@ -1,72 +0,0 @@
-![](http://i.imgur.com/CuXtGin.jpg)
-
-Our goal for this bonfire is to split `arr` (first argument) into smaller chunks of arrays with the length provided by `size` (second argument). There are 4 green checks (objectives) our code needs to pass in order to complete this bonfire:
-
-1. `(['a', 'b', 'c', 'd'], 2)` is expected to be `[['a', 'b'], ['c', 'd']]`
-2. `([0, 1, 2, 3, 4, 5], 3)` is expected to be `[[0, 1, 2], [3, 4, 5]]`
-3. `([0, 1, 2, 3, 4, 5], 2)` is expected to be `[[0, 1], [2, 3], [4, 5]]`
-4. `([0, 1, 2, 3, 4, 5], 4)` is expected to be `[[0, 1, 2, 3], [4, 5]]`
-
-Click **More information** under the bonfire title and read the helpful links if you haven't yet. 
-&nbsp;
-
-## How to approach the bonfire
-
-The helpful links suggest to use `Array.push()` so let's start by first creating a new array to store the smaller arrays we will soon have like this: 
-
-    var newArray = [];
-
-&nbsp;
-Next we'll need a `for loop` to loop through `arr` then finally we need a method to do the actual splitting and we can use `Array.slice()` to do that. The key to this bonfire is understanding how a `for loop`, `size`, `Array.slice()` and `Array.push()` all work together.
-&nbsp;
-
-## How does a for loop and Array.slice() work
-
-**For Loop**
-
-A `for loop` keeps looping until a condition evaluates to false for example if we had: 
-
-    for (var i = 0; i < arr.length; i++) 
-
-&nbsp;
-`i` starts with a value of 0, `i` loops until `i` is no longer less than the length of `arr` and during each repeat loop, the value of `i` increases by 1 (one). If `arr.length` happens to be 4 then the `for loop` stops right before `i` reaches 4.
-&nbsp;
-
-**Array.slice() Method**
-
-`Array.slice()` method extracts a portion of an array and returns a copy into a new array. We can declare which element to start and which element to stop. For example, if `arr` is `['a', 'b', 'c', 'd']` and we used `arr.slice(1, 3);`, the `Array.slice()` method starts at element 1 and stops at element 3 then returns: 
-```js
-["b","c"]
-``` 
-_Notice how it captures the start element but doesn't capture the stop element._
-&nbsp;
-
-## Using a for loop and Array.slice() together
-
-If we use the following `for loop` while `size` is 2 (note: `size` = 2):
-
-    (var i = 0; i < arr.length; i += size)
-
-&nbsp;
-The loop starts at element 0, loops once then `i += 2` which is another way of stating `i = i + 2` so now the new value of `i` becomes 2. What happens if we combine the following `arr.slice()` with the `for loop`?
-```js
-arr.slice(i, i + size)
-```
-&nbsp;
-
-## Push the arrays out 
-
-We can combine the `Array.slice()` method with the `Array.push()` method inside the `for loop` like this:
-
-    for (var i = 0; i < arr.length; i += size) {
-    newArray.push(arr.slice(i, i + size)); 
-    }
-
-&nbsp;
-`arr.slice()` will start at element 0 and stop at element 2. Here's the fun part: once the `for loop`, loops again then the value of `i` becomes 2 while the `i` in the `arr.slice()` will also have a value of 2. The new `arr.slice()` becomes:
-
-    arr.slice(2, 2 + 2)
-
-&nbsp;
-Now `arr.slice()` starts at the element 2 and stops at element 4 and in the next loop, `arr.slice()` will start at element 4 and stop at element 6. `newArray.push()` will push all the elements out into chunks of smaller arrays with the length of `size`.
-&nbsp;
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-confirm-the-ending.md b/nap/data/wiki/bonfire-confirm-the-ending.md
deleted file mode 100644
index bb14ee4..0000000
--- a/nap/data/wiki/bonfire-confirm-the-ending.md
+++ /dev/null
@@ -1 +0,0 @@
-wiki coming soon!
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-convert-HTML-entities.md b/nap/data/wiki/bonfire-convert-HTML-entities.md
deleted file mode 100644
index bb14ee4..0000000
--- a/nap/data/wiki/bonfire-convert-HTML-entities.md
+++ /dev/null
@@ -1 +0,0 @@
-wiki coming soon!
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-drop-it.md b/nap/data/wiki/bonfire-drop-it.md
deleted file mode 100644
index a9c8eb5..0000000
--- a/nap/data/wiki/bonfire-drop-it.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# Author
-
-![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
-
-* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
-* CodePed Profile: http://codepen.io/Rafase282/
-* LinkedIn: https://www.linkedin.com/in/rafase282
-
-# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
-
-# Details
-
-* Difficulty: 2/5
-
-Drop the elements of an array (first argument), starting from the front, until the predicate (second argument) returns true.
-Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
-
-# Useful Links
-
-* [Arguments object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments)
-* [Array.shift()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)
-
-# Problem Script:
-
-```
-function drop(arr, func) {
-  // Drop them elements.
-  return arr;
-}
-
-drop([1, 2, 3], function(n) {return n < 3; });
-```
-
-## Explanation:
-
-Basically while the second argument is not true, you will have to remove the first element from the left of the array that was passed as the first argument.
-
-## Hint: 1
-You can use Array.shift() or filter that you should be more familiar with to solve this problem in a few lines of code.
-
-## Hint: 2
-Shift returns the element that was removed which we don't really need, all we need is the modified array that is left.
-
-## Hint: 3
-If you still can't figure out how to solve it with shift, then try solving it with filter, and check how filter works, if you become familiar with it, then you can make the code with shift.
-
-## My code:
-
-```
-function drop(arr, func) {
-  return arr.filter(func);
-}
-
-drop([1, 2, 3], function(n) {return n < 3; });
-```
-
-## My Code Explanation:
-
-* I used filter as I was more familiar with it.
-* I have it filter the array to remove the elements that needs to be removed.
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-everything-be-true.md b/nap/data/wiki/bonfire-everything-be-true.md
deleted file mode 100644
index 6248b91..0000000
--- a/nap/data/wiki/bonfire-everything-be-true.md
+++ /dev/null
@@ -1,73 +0,0 @@
-# Author
-
-![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
-
-* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
-* CodePed Profile: http://codepen.io/Rafase282/
-* LinkedIn: https://www.linkedin.com/in/rafase282
-
-# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
-
-# Details
-
-* Difficulty: 2/5
-
-Check if the predicate (second argument) returns truthy (defined) for all elements of a collection (first argument).
-
-For this, check to see if the property defined in the second argument is present on every element of the collection.
-
-Remember, you can access object properties through either dot notation or [] notation.
-
-Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
-
-# Useful Links
-
-* [Object.hasOwnProperty()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty)
-* [Object.getOwnPropertyNames()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames)
-
-# Problem Script:
-```
-function every(collection, pre) {
-  // Does everyone have one of these?
-  return pre;
-}
-
-every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa', 'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], 'sex');
-
-```
-## Explanation:
-
-The program needs to check if the second argument is a truthy element, and it must check this for each object in the first argument.
-
->In JavaScript, a truthy value is a value that translates to true when evaluated in a Boolean context. All values are truthy unless they are defined as falsy (i.e., except for false, 0, "", null, undefined, and NaN).
-
-## Hint: 1
-Remember to iterate through the first argument to check each object.
-
-## Hint: 2
-Only if all of them are truth will we return true, so make sure all of them check.
-
-## Hint: 3
-You could use loops or callbacks functions, there are multiple ways to solve this problem.
-
-## My Code:
-```
-function every(collection, pre) {
-  var counter = 0;
-  for (var c in collection) {
-    if (collection[c].hasOwnProperty(pre) || collection[c][pre] == pre){ counter++;}
-  }
-  if (counter == collection.length) {
-    return true;
-  } else 
-    return false;
-}
-
-every([{'user': 'Tinky-Winky', 'sex': 'male'}, {'user': 'Dipsy', 'sex': 'male'}, {'user': 'Laa-Laa',
-'sex': 'female'}, {'user': 'Po', 'sex': 'female'}], 'sex');
-```
-## My Code Explanation:
-
-* First I create a counter to check how many cases are actually true.
-* Then check for each object if it it has the same property or the same property value. If true then add one to the counter.
-* Outside the loop, I check to see if the counter variable has the same value as the length of **collection**, if true then return **true**, otherwise, return **false**
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-find-the-longest-word-in-a-string.md b/nap/data/wiki/bonfire-find-the-longest-word-in-a-string.md
deleted file mode 100644
index bb14ee4..0000000
--- a/nap/data/wiki/bonfire-find-the-longest-word-in-a-string.md
+++ /dev/null
@@ -1 +0,0 @@
-wiki coming soon!
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-finders-keepers.md b/nap/data/wiki/bonfire-finders-keepers.md
deleted file mode 100644
index 2f82186..0000000
--- a/nap/data/wiki/bonfire-finders-keepers.md
+++ /dev/null
@@ -1,67 +0,0 @@
-# Author
-
-![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
-
-* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
-* CodePed Profile: http://codepen.io/Rafase282/
-* LinkedIn: https://www.linkedin.com/in/rafase282
-
-# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
-
-# Details
-
-* Difficulty: 2/5
-
-Create a function that looks through an array (first argument) and returns the first element in the array that passes a truth test (second argument).
-
-Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
-
-# Useful Links
-
-* [Array.some()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)
-
-# Problem Script:
-
-```
-function find(arr, func) {
-  var num = 0;
-  return num;
-}
-
-find([1, 2, 3, 4], function(num){ return num % 2 === 0; });
-```
-
-## Explanation:
-
-The problem is quite simple to understand. You will check for each element in the array that is passed in the first argument, if the element plugged in to the function passed as the second argument returns true the first time. We do not care about the second or third one that is true, only the very first one if any. If there are none, then return undefined. This last bit is not explained but it is part of the tests used.
-
-## Hint: 1
-You can use the function directly from the parameter, no need to rename it or anything.
-
-## Hint: 2
-You need to pass an element and record it if the function returns true, for this you just have to pass the element as the parameter for the function.
-
-## Hint: 3
-If no element satisfy the function then you must return **undefined**
-
-## My code:
-
-```
-function find(arr, func) {
-    var num;
-    for (var a in arr) {
-        if (func(arr[a])){
-            num = arr[a];
-            return num;
-        }
-    }
-  return num;
-}
-```
-
-## My Code Explanation:
-
-* To make the code easier, create an undefined variable that will be returned.
-* Loop through the array to check for each element if it satisfy the function. This is done by passing the arr[index of the loop] as the parameter for the function from the second argument.
-* If true, then store the array element, and return it. This will stop the loop. No else needed.
-* If the loop was not broken and it has ended, then return **num** which by default is undefined. This means that none of the elements from the array satisfied the function.
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-make-a-person.md b/nap/data/wiki/bonfire-make-a-person.md
deleted file mode 100644
index c3f5485..0000000
--- a/nap/data/wiki/bonfire-make-a-person.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# Author
-
-![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) 
-submitted by Rafase282 
-
-[Github](https://github.com/Rafase282) |
-[FreeCodeCamp](http://www.freecodecamp.com/rafase282) | 
-[CodePen](http://codepen.io/Rafase282/) |
-[LinkedIn](https://www.linkedin.com/in/rafase282) |
-[My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
-
-## Details
-
-* Difficulty: 3/5
-
-Fill in the object constructor with the methods specified in the tests.
-
-Those methods are:
-
-* getFirstName()
-* getLastName()
-* getFullName()
-* setFirstName(first)
-* setLastName(last)
-* setFullName(firstAndLast)
-
-All functions that take an argument have an arity of 1, and the argument will be a string.
-
-These methods must be the only available means for interacting with the object.
-
-## Useful Links
-
-* [Closures](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures)
-* [Details of the Object Model](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Details_of_the_Object_Model)
-
-
-## Problem Script:
-
-```
-var Person = function(firstAndLast) {
-    return firstAndLast;
-};
-
-var bob = new Person('Bob Ross');
-bob.getFullName();
-```
-
-## Explanation:
-
-When I started the program I figured I just had to create the six functions mentioned in the details. However, it was not as simple. Creating them as a function was not the right way, I had to create them in a different way to make them a key.
-
-There is also a tricky part as you need six keys no more or less, so at first I had the variable that store the original name as a key too which was wrong. 
-
-As for the usage of array, that is optional, you could also create new variable to hold the separated string if you wish but an array is easier to deal with as strings are immutable.
-
-Read the instructions carefully, it is always a good hint on itself to run the code and check what the test results were so you know what to expect but do not fixate yourself on that. Once you understand what you need to do, this problem is very easy and straightforward.
-
-## Hint: 1
-
-Use the **this** notation to create the keys instead of regular functions: This means instead of ```var varName = function() {/*...*/}``` you should use ``` this.varName = function() {/*...*/}```
-
-## Hint: 2
-
-The program has a test that checks for how many keys you used, they have to be exactly six, the six mentioned in the details section. This means if you need to work with variables, make them local and not a key: ```this.fullName = firstAndLast;```
-
-## Hint: 3
-Often the code would not work the way you expect it due to wrong variable names, make sure to check that you spell them the right way. This happens to all of us at some point.
-
-## My code
-
-Please try hard before you check this solution.
-
-```
-var Person = function(firstAndLast) {
-    
-    var fullName = firstAndLast;
-    var arr = fullName.split(' ');
-    
-    this.getFirstName = function() {
-        return arr[0];
-    };
-    this.getLastName = function() {
-        return arr[1];
-    };
-    this.getFullName = function() {
-        return fullName;
-    };
-    this.setFirstName = function(first) {
-        arr[0] = first;
-    };
-    this.setLastName = function(last) {
-        arr[1] = last;
-    };
-    this.setFullName = function(firstAndLast) {
-        fullName = firstAndLast;
-    };
-};
-```
-## My Code Explanation:
-
-* Create a variable that will make a copy of the full name that was passed as a parameter.
-* Create another variable that will split that full name into first and last name array.
-* Then we can proceed to create the six keys needed and return what is needed.
-* For the setters, we can use the arr array and the right index to change the value to what was passed as a parameter.
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-map-the-debris.md b/nap/data/wiki/bonfire-map-the-debris.md
deleted file mode 100644
index ba02836..0000000
--- a/nap/data/wiki/bonfire-map-the-debris.md
+++ /dev/null
@@ -1,92 +0,0 @@
-# Author
-
-![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
-
-* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
-* CodePed Profile: http://codepen.io/Rafase282/
-* LinkedIn: https://www.linkedin.com/in/rafase282
-
-## [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
-
-# Details
-
-* Difficulty: 3/5
-
-Return a new array that transforms the element's average altitude into their orbital periods.
-
-The array will contain objects in the format {name: 'name', avgAlt: avgAlt}.
-
-You can read about orbital periods on wikipedia.
-
-The values should be rounded to the nearest whole number. The body being orbited is Earth.
-
-The radius of the earth is 6367.4447 kilometers, and the GM value of earth is 398600.4418
-
-Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
-
-
-# Useful Links
-
-* [Math.pow()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/pow)
-* [orbital periods](http://en.wikipedia.org/wiki/Orbital_period)
-
-## Problem Script:
-
-```
-function orbitalPeriod(arr) {
-  var GM = 398600.4418;
-  var earthRadius = 6367.4447;
-  return arr;
-}
-
-orbitalPeriod([{name : "sputkin", avgAlt : 35873.5553}]);
-```
-
-## Explanation:
-
-The first thing to do is to get familiar with what the program is for, for this I would suggest you check the Wikipedia link as that is very important and from where you can also get the formula for the conversion. The hardest part are finding the formula, implementing it and for some modifying objects by the key. However, something that is not very clear is the fact that your program has to be able to check for any number od objects in the array which is what is tested on the second part.
-
-## Hint: 1
-
-The formula needed is: T = 2*pi * sqrt(earthRadius + avgAlt to the cube / GM)
-
-## Hint: 2
-Use Math.round() to round up to the next whole number as requested. Using Math.ceil() will let you pass the first test but fail the second one.
-
-## Hint: 3
-Find out how to remove and add key to an object
-
-## My code
-
-```
-function orbitalPeriod(arr) {
-	var GM = 398600.4418;
-	var earthRadius = 6367.4447;
-	var a = 2 * Math.PI;
-	var newArr = [];
-	var getOrbPeriod = function (obj) {
-	    var c = Math.pow(earthRadius + obj.avgAlt ,3);
-	    var b = Math.sqrt(c/GM);
-	    var orbPeriod = Math.round(a * b);
-	    delete obj.avgAlt;
-	    obj.orbitalPeriod = orbPeriod;
-	    return obj;
-	};
-	
-	for (var elem in arr){
-	    newArr.push(getOrbPeriod(arr[elem]));
-	}
-	return newArr;
-}
-```
-## Code Explanation:
-
-* The GM and earthRadius is given to us.
-* To make the code easier to edit and read, I separated each part of the equation.
-* Create a new array to store the orbPeriods.
-* a is 2 times pi. The part that is a constant is on the global scope while the rest is part of a function.
-* Create a function that will do the required work for any amount of objects.
-* c is the power of earthRadius + the value of avgAlt to the cube.
-* b is the square root of c divided by GM.
-* Create orbPeriod to store the product of a & b, with the ceiling function applied to round up to the next whole number.
-* Then we delete the key avgAlt, and add the new key and its value.
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-mutations.md b/nap/data/wiki/bonfire-mutations.md
deleted file mode 100644
index e2c0f19..0000000
--- a/nap/data/wiki/bonfire-mutations.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Problem Explanation:
-- Return true if the string in the first element of the array contains all of the letters of the string in the second element of the array..
-
-## Hint: 1
-- If everything is lowercase it will be easier to compare.
-
-## Hint: 2
-- Our strings might be easier to work with if they were arrays of characters.
-
-## Hint: 3
-- A loop might help.
-
-## Spoiler Alert!
-[![687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/thumb/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)](https://files.gitter.im/FreeCodeCamp/Wiki/nlOm/687474703a2f2f7777772e796f75726472756d2e636f6d2f796f75726472756d2f696d616765732f323030372f31302f31302f7265645f7761726e696e675f7369676e5f322e676966.gif)
-
-**Solution ahead!**
-
-## Solution Code:
-
-```
-function mutation(arr) {
-  var test = arr[1].toLowerCase();
-  var target = arr[0].toLowerCase();
-  test = test.split('');
-  target = target.split('');
-  for (i=0;i<test.length;i++) {
-    if (target.indexOf(test[i]) < 0)
-      return false;
-  }
-  return true;
- }
-```
-
-## Code Explanation:
-- First, we make the to strings in the array lowercase.  
-- Second, we split the individual strings in to 2 separate arrays of characters. test variable holds what we are looking for. target variable is where we are looking.   
-- Third, we loop through our test characters, and if they are not _all_ found we return false.
diff --git a/nap/data/wiki/bonfire-pairwise.md b/nap/data/wiki/bonfire-pairwise.md
deleted file mode 100644
index 6598b64..0000000
--- a/nap/data/wiki/bonfire-pairwise.md
+++ /dev/null
@@ -1,83 +0,0 @@
-# Author
-
-![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
-
-* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
-* CodePed Profile: http://codepen.io/Rafase282/
-* LinkedIn: https://www.linkedin.com/in/rafase282
-
-# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
-
-# Details
-
-* Difficulty: 3/5
-
-Return the sum of all indices of elements of 'arr' that can be paired with one other element to form a sum that equals the value in the second argument 'arg'. If multiple sums are possible, return the smallest sum. Once an element has been used, it cannot be reused to pair with another.
-
-For example, pairwise([1, 4, 2, 3, 0, 5], 7) should return 11 because 4, 2, 3 and 5 can be paired with each other to equal 7.
-
-pairwise([1, 3, 2, 4], 4) would only equal 1, because only the first two elements can be paired to equal 4, and the first element has an index of 0!
-
-Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
-
-# Useful Links
-
-* [Array.reduce()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)
-
-# Problem Script:
-
-```
-function pairwise(arr, arg) {
-  return arg;
-}
-
-pairwise([1,4,2,3,0,5], 7);
-```
-
-## Explanation:
-
-The program should look for the numbers in the array which would add to make the number from the **arg.** Then instead of adding those numbers up, you will add their **indices** which is the reason why you get 11 on the example from detail.
-
-Remember that arrays start at index 0 and go from there so from [1,4,2,3,0,5] if we switch to their indices it would be [0,1,2,3,4,5] then we add indices 1 + 2 + 3 + 5 and we get 11. That is what we need to return.
-
-## Hint: 1
-
-Remember to return the smaller sum if multiple are possible. This mean ```[1,1,1],1 should use 0 + 1 instead of 0+1 & 1 +1 , etc```
-
-## Hint: 2
-Try using an array of indices to track when an index has been used or not.
-
-## Hint: 3
-It is easy to confuse indices as being numbers, but since you will be interacting with them, make sure to work with them as integers to prevent the code from behaving erratically.
-
-# My code
-
-```
-function pairwise(arr, arg) {
-    var index = [];
-    for (var a in arr){
-        var temp = arr[a];
-        for (var i=1; i < arr.length; i++) {
-            var temp2 = arr[i];
-            if (temp + temp2 === arg && i > a && index.indexOf(+a) === -1 && index.indexOf(+i) === -1){
-                index.push (+a,+i);
-            }
-        }
-    }
-    if (index.length >= 1) {
-        return index.reduce(function(a, b){
-          return a + b;
-        });
-    } else {
-        return 0;
-    }
-}
-```
-# Code Explained
-
-* First I create an empty array to store the indices that i will be adding.
-* Then I create an outer loop to get the first number.
-* Then get the second number from another inner loop.
-* Then I check to make sure that the two numbers add to arg that was passed as a parameter to the function; we also have to make sure the index from the second loop is grater than the one from the first loop to avoid adding wrong indices. We also have to check to make sure the indices are not already part of the **index** array.
-* If all that is true, then we add the two indices as integer by using '+' or parseInt(), and then we stop the inner loop since everything else would be redundant and wrong.
-* After all the loops are over, check in **index** is empty, if it is then return 0, otherwise return the addition of all the integers in it using Array.reduce(callbackFunc) to return the sum of the numbers.
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-repeat-a-string-repeat-a-string.md b/nap/data/wiki/bonfire-repeat-a-string-repeat-a-string.md
deleted file mode 100644
index bb14ee4..0000000
--- a/nap/data/wiki/bonfire-repeat-a-string-repeat-a-string.md
+++ /dev/null
@@ -1 +0,0 @@
-wiki coming soon!
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-return-largest-numbers-in-arrays.md b/nap/data/wiki/bonfire-return-largest-numbers-in-arrays.md
deleted file mode 100644
index bb14ee4..0000000
--- a/nap/data/wiki/bonfire-return-largest-numbers-in-arrays.md
+++ /dev/null
@@ -1 +0,0 @@
-wiki coming soon!
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-roman-numeral-converter.md b/nap/data/wiki/bonfire-roman-numeral-converter.md
deleted file mode 100644
index c0d1fe6..0000000
--- a/nap/data/wiki/bonfire-roman-numeral-converter.md
+++ /dev/null
@@ -1,4 +0,0 @@
-placeholder
-
-## hint one
-another hint
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-slasher-flick.md b/nap/data/wiki/bonfire-slasher-flick.md
deleted file mode 100644
index 6770095..0000000
--- a/nap/data/wiki/bonfire-slasher-flick.md
+++ /dev/null
@@ -1,63 +0,0 @@
-You should make sure to try hard to solve the Bonfire yourself before reading this!
-# :link: [Original Bonfire](http://www.freecodecamp.com/challenges/bonfire-slasher-flick) :point_right:  
-
-## Author
-
-![Andre](https://avatars2.githubusercontent.com/u/2698441?v=3&amp;s=460) submitted by [Andre - Clint Tecnologia](//freecodecamp.com/clint74) | https://github.com/clint74
-
-## The problem
-Return the remaining elements of an array after chopping off n elements from the head.
-Factorials are often represented with the shorthand notation n!
-
-For example: `slasher([1, 2, 3], 2);` must return [3]
-
-## Analysis
-Since we need only the remaining part of an array we can just remove what we don't.
-
-## Understanding slicing
-Slice allows to get only what you want from an array.
-
-## Understanding the splice
-If you want the **tail** of a snake remove the head first.
-The splice() method changes the content of an array by removing existing elements and/or adding new elements.
-This can be handy. Get an array, remove the first part and return the remaining.
-
-## :construction: My Solution is coming up!
-Don't scroll down if you don't want to see it!
-
-![warning](http://www.yourdrum.com/yourdrum/images/2007/10/10/red_warning_sign_2.gif)        
-
-```
-           ,,,         ,,,
-          ;"   ^;     ;'   ",
-          ;    s$$$$$$$s     ;
-          ,  ss$$$$$$$$$$s  ,'
-          ;s$$$$$$$$$$$$$$$
-          $$$$$$$$$$$$$$$$$$
-         $$$$P""Y$$$Y""W$$$$$      -{ Happy Camping! }
-         $$$$  p"$$$"q  $$$$$
-         $$$$  .$$$$$.  $$$$
-          $$DcaU$$$$$$$$$$
-            "Y$$$"*"$$$Y"    
-                "$b.$$"     
-```
-
-## My solution
-``` javascript
-function slasher(arr, howMany) {
-  // remove the head
-  arr.splice(0,howMany);
-  //return the remaining or the tail  \__/(**)-<
-  return arr;
-}
-slasher([1, 2, 3], 2);
-```
-
-
-
-## References
-- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
-
-## If you enjoyed this guide, then type:
-`thanks @clint74`
-in the chat!
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-smallest-common-multiple.md b/nap/data/wiki/bonfire-smallest-common-multiple.md
deleted file mode 100644
index 6d4dfee..0000000
--- a/nap/data/wiki/bonfire-smallest-common-multiple.md
+++ /dev/null
@@ -1,21 +0,0 @@
-placeholder intro to the bonfire
-
-## hint
-Here freeze a multiple candidate starting from the biggest array value - call it J 
-`for (var j = max; j <= 1000000; j++){...}`
-
-## hint
-Now you have to test your candidate
-`//I increase the denominator from min to max
-    for (var k = arr[0]; k <= arr[1]; k++) {
-
-      if (j % k === 0) { // every time the modulus is 0 increase a counting 
-        count++; // variable
-      }`
-
-## final hint
-When your candidate is a multiple???
-`if (count === numbers.length) { 
-      multiple.push(j); 
-    }
-`
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-steamroller.md b/nap/data/wiki/bonfire-steamroller.md
deleted file mode 100644
index 4994fca..0000000
--- a/nap/data/wiki/bonfire-steamroller.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# Author
-
-![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
-
-* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
-* CodePed Profile: http://codepen.io/Rafase282/
-* LinkedIn: https://www.linkedin.com/in/rafase282
-
-# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
-
-# Details
-
-* Difficulty: 2/5
-
-Flatten a nested array. You must account for varying levels of nesting.
-
-Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
-
-# Useful Links
-
-* [Array.isArray()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray)
-
-# Problem Script:
-
-```
-function steamroller(arr) {
-  // I'm a steamroller, baby
-  return arr;
-}
-
-steamroller([1, [2], [3, [[4]]]]);
-```
-
-## Explanation:
-
-This problem seems simple but you need to make sure to flatten any array, regardless of the level which is what adds a bit of difficulty to the problem.
-
-## Hint: 1
-You need to check if an element is an array or not.
-
-## Hint: 2
-If you are dealing with an array, then you need flatten it by getting the value inside of the array. This means if you have [[4]] then instead of returning [4] you need to return 4. If you get [[[4]]] then the same, you want the 4. You can access it with arr[index1][index2] to go a level deeper.
-
-## Hint: 3
-You will definitely need recursion or another way to go beyond two level arrays to make the code flexible and not hard-coded to the answers needed. Have fun!
-
-## My code:
-
-```
-function steamroller(arr) {
-	var flattenedArray = [];
-	var flatten = function (arg) {
-		if (!Array.isArray(arg)){
-			flattenedArray.push(arg);
-		} else {
-			for (var a in arg) {
-				flatten(arg[a]);
-			}
-		}
-	};
-	arr.forEach(flatten);
-	return flattenedArray;
-}
-```
-## My Code Explanation:
-
-* Create a new variable to keep flattened arrays.
-* Create a function that will add non array elements to the new variable, and for the ones that are array it loops through them to get the element.
-* It does that by using recursion, if the element is an array then call the function again with a layer of array deeper to check if it is an array or not. if it is not then push that non-array element to the variable that gets returned. Otherwise, keep going deeper.
-* Use Array.forEach(callbackFunc) to go element by element of the original array.
-* Return the flattened array.
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-sum-all-odd-fibonacci-numbers.md b/nap/data/wiki/bonfire-sum-all-odd-fibonacci-numbers.md
deleted file mode 100644
index 86f6b49..0000000
--- a/nap/data/wiki/bonfire-sum-all-odd-fibonacci-numbers.md
+++ /dev/null
@@ -1 +0,0 @@
-Think about how Fibonacci numbers are defined, and how you would redefine them on each iteration. There are many ways to do this, including using a temp variable and console.log statements to ensure you're on the right track.
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-sum-all-primes.md b/nap/data/wiki/bonfire-sum-all-primes.md
deleted file mode 100644
index d1104af..0000000
--- a/nap/data/wiki/bonfire-sum-all-primes.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# Author
-
-![@Rafase282](https://avatars0.githubusercontent.com/Rafase282?&s=128) submitted by Rafase282 | https://github.com/Rafase282
-
-* FreeCodeCamp Profile: http://www.freecodecamp.com/rafase282
-* CodePed Profile: http://codepen.io/Rafase282/
-* LinkedIn: https://www.linkedin.com/in/rafase282
-
-# [My Original Wiki](http://rafase282.github.io/My-FreeCodeCamp-Code/)
-
-# Details
-
-* Difficulty: 2/5
-
-Sum all the prime numbers up to and including the provided number.
-
-A prime number is defined as having only two divisors, 1 and itself. For example, 2 is a prime number because it's only divisible by 1 and 2. 1 isn't a prime number, because it's only divisible by itself.
-
-The provided number may not be a prime.
-
-Remember to use [RSAP](http://www.freecodecamp.com/field-guide/how-do-i-get-help-when-I-get-stuck) if you get stuck. Try to pair program. Write your own code.
-
-# Useful Links
-
-* [For Loops](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for)
-* [Array.push()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
-
-# Problem Script:
-```
-function sumPrimes(num) {
-  return num;
-}
-
-sumPrimes(10);
-```
-
-## Explanation:
-
-The explanation for this problem is very simple. You will generate a list of prime numbers up to the number you are given as a parameter. Then you need to add them all up and return that value. The tricky part is on generating the list of prime numbers. I suggest you find a code or a good math algorithm that you can turn into code.
-
-## Hint: 1
-Generate a list of all the numbers up to and including the one you got as a parameter. This will be needed to determine which numbers are prime or not.
-
-## Hint: 2
-Check this [link](http://stackoverflow.com/questions/11966520/how-to-find-prime-numbers-between-0-100) if you prefer to find a solution for finding primes, or try learning and implementing your own [Sieve of Eratosthenes](https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes)
-
-## Hint: 3
-This problem is hard if you have to create your own code to check for primes, so don't feel bad if you had to use someone's code for that bit. Either way, you are most likely using array, so once you generate an array of primes, then just add them all up and return the number you get.
-
-## My code:
-
-```
-function sumPrimes(num) {
-    var res = 0;
-    function getPrimes(max) {
-        var sieve = [], i, j, primes = [];
-        for (i = 2; i <= max; ++i) {
-            if (!sieve[i]) {
-                primes.push(i);
-                for (j = i << 1; j <= max; j += i) {
-                    sieve[j] = true;
-                }
-            }
-        }
-    return primes;
-    }
-    var primes = getPrimes(num);
-    for (var p in primes) {
-        res+= primes[p];
-    }
-return res;
-}
-```
-
-## My Code Explanation:
-
-* Create a function that generates the numbers from 1 to **num** and check if they are prime along the way.
-* Declare the variables that will be needed.
-* Start with 2, if it has not been marked and added to the sieve array then it is a prime and we add it to the prime array.
-* Add the others to the sieve array.
-* Return the primes
-* Loop through the returned array and add all the elements to then return the final value.
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-title-case-a-sentence.md b/nap/data/wiki/bonfire-title-case-a-sentence.md
deleted file mode 100644
index aabab61..0000000
--- a/nap/data/wiki/bonfire-title-case-a-sentence.md
+++ /dev/null
@@ -1 +0,0 @@
-wiki coming soon
\ No newline at end of file
diff --git a/nap/data/wiki/bonfire-truncate-a-string.md b/nap/data/wiki/bonfire-truncate-a-string.md
deleted file mode 100644
index af47925..0000000
--- a/nap/data/wiki/bonfire-truncate-a-string.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# Instructions
-
-Truncate a string (first argument) if it is longer than the given maximum string length (second argument). Return the truncated string with a '...' ending.
-
-Note that the three dots at the end add to the string length.
-
-# Tests final code needs to pass
-
-1. expect(truncate('A-tisket a-tasket A green and yellow basket', 11)).to.eqls('A-tisket...');
-2. expect(truncate('Peter Piper picked a peck of pickled peppers', 14)).to.eqls('Peter Piper...');
-3. assert(truncate('A-tisket a-tasket A green and yellow basket', 'A-tisket a-tasket A green and yellow basket'.length) === 'A-tisket a-tasket A green and yellow basket', 'should not truncate if string is = length');
-4. assert.strictEqual(truncate('A-tisket a-tasket A green and yellow basket', 'A-tisket a-tasket A green and yellow basket'.length + 2), 'A-tisket a-tasket A green and yellow basket', 'should not truncate if string is < length');
-
-## Hint
-
-Truncate the string to a length equal to the second parameter passed to the function. Remember the added ... is included in the final string length.
-
-## My final code
-
-    function truncate(str, num) {
-      // Clear out that junk in your trunk
-      if (str.length > num) {
-        str = str.slice(0, num-3) + '...';
-      }
-      return str;
-    }
-
-    truncate('A-tisket a-tasket A green and yellow basket', 11);
-
-## Explanation
-
-First we need a conditional if statement to test if the length of the full string passed in as the first argument is greater than the maximum passed in as the second argument.
-
-    if (str.length > num)
-
-Then we need to slice the full string at the length required (second argument). The trick is to minus the length of the ... that needs to be added to get the final truncated string.
-
-    str = str.slice(0, num-3)
-
-Finally, just add the ... to the end of the sliced substring ready to be returned
-
-    str = str.slice(0, num-3) + '...';
\ No newline at end of file
diff --git a/nap/data/wiki/boolean.md b/nap/data/wiki/boolean.md
deleted file mode 100644
index 52c053a..0000000
--- a/nap/data/wiki/boolean.md
+++ /dev/null
@@ -1,39 +0,0 @@
-The value passed as the first parameter is converted to a boolean value, if necessary. If value is omitted or is 0, -0, null, false, NaN, undefined, or the empty string (""), the object has an initial value of false. All other values, including any object or the string "false", create an object with an initial value of true.
-
-Do not confuse the primitive Boolean values true and false with the true and false values of the Boolean object.
-
-## More Details
-
-Any object whose value is not undefined or null, including a Boolean object whose value is false, evaluates to true when passed to a conditional statement. For example, the condition in the following if statement evaluates to true:
-
-```
-var x = new Boolean(false);
-if (x) {
-  // this code is executed
-}
-```
-This behavior does not apply to Boolean primitives. For example, the condition in the following if statement evaluates to false:
-
-```
-var x = false;
-if (x) {
-  // this code is not executed
-}
-```
-Do not use a Boolean object to convert a non-boolean value to a boolean value. Instead, use Boolean as a function to perform this task:
-
-```
-var x = Boolean(expression);     // preferred
-var x = new Boolean(expression); // don't use
-```
-If you specify any object, including a Boolean object whose value is false, as the initial value of a Boolean object, the new Boolean object has a value of true.
-
-```
-var myFalse = new Boolean(false);   // initial value of false
-var g = new Boolean(myFalse);       // initial value of true
-var myString = new String('Hello'); // string object
-var s = new Boolean(myString);      // initial value of true
-```
-Do not use a Boolean object in place of a Boolean primitive.
-
-[Orininal](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)
\ No newline at end of file
diff --git a/nap/data/wiki/bootstrap.md b/nap/data/wiki/bootstrap.md
deleted file mode 100644
index 812ab22..0000000
--- a/nap/data/wiki/bootstrap.md
+++ /dev/null
@@ -1,5 +0,0 @@
-A frontend [CSS](https://github.com/bothelpers/kbase/wiki/css) framework.
-
-You can find out more [here](http://getbootstrap.com/)
-
-> related: css, frameworks
diff --git a/nap/data/wiki/bot-announce.md b/nap/data/wiki/bot-announce.md
deleted file mode 100644
index 296dd6f..0000000
--- a/nap/data/wiki/bot-announce.md
+++ /dev/null
@@ -1,20 +0,0 @@
-## Announcing CamperBot!
-
-CamperBot is our new AI friend who's going to make the FCC chatrooms more fun.
-He can get info from the wiki, share bonfire hints, and help you get brownie points for helping people!
-
-https://twitter.com/FreeCodeCamp/status/627338604134559744
-
-
-### beta testing
-Currently in beta test in the #HelpBonfires channel. Try it out here:
-https://gitter.im/FreeCodeCamp/HelpBonfires
-
-
-### read about what CamperBot features
-https://github.com/FreeCodeCamp/freecodecamp/wiki/camperbot
-
-
-### talk to the Dev Team
-https://gitter.im/dcsan/gitterbot
-
diff --git a/nap/data/wiki/botdemo.md b/nap/data/wiki/botdemo.md
deleted file mode 100644
index 51d1fdf..0000000
--- a/nap/data/wiki/botdemo.md
+++ /dev/null
@@ -1,24 +0,0 @@
-We've added a bot to some of the chatrooms. We'll be adding more features over time, but these are the starting features. We'd love to hear what you think!
-The main thing is pulling in content from our [brand new wiki](https://github.com/FreeCodeCamp/freecodecamp/wiki), right into the chat.
-
-- `find js` or `find css` or `find html`  
-show a list of matching items.
-
-- `help js ternary`  
-quick definition/help. click through to see more on the wiki
-
-- `help video`  
-inline video
-
-- `help bobbytables`  
-shows inline images
-
-- `explain triphop`
-you can embed soundcloud tracks
-
-- `topics`  
-  show a list of topics
-
-# Join the CamperBot DevTeam!
-we're looking for some people to join the core dev team to work on new features for the bot.
-ping @dcsan on gitter or leave a message in [gitter.com/camperbot/devteam](https://gitter.im/camperbot/devteam)
diff --git a/nap/data/wiki/botideas.md b/nap/data/wiki/botideas.md
deleted file mode 100644
index 0152f25..0000000
--- a/nap/data/wiki/botideas.md
+++ /dev/null
@@ -1,6 +0,0 @@
-If you have ideas or feature requests for the bot, you can add them to this page.
-Also come hang out in https://gitter.im/camperbot/devteam
-
-- XKCD comic feed  
-show comics inside the feed! 
-from @saintpeter
diff --git a/nap/data/wiki/botintro.md b/nap/data/wiki/botintro.md
deleted file mode 100644
index 8f4bb21..0000000
--- a/nap/data/wiki/botintro.md
+++ /dev/null
@@ -1,33 +0,0 @@
-Bot is live in beta on gitter
-
-## https://gitter.im/FreeCodeCamp/HelpBonfires
-
-https://twitter.com/FreeCodeCamp/status/627338604134559744
-
-Hay All! We're working on a new CamperBot for FreeCodeCamp. 
-This will make the chat rooms more fun and useful. 
-It will pull in content from our [brand new wiki](https://github.com/FreeCodeCamp/freecodecamp/wiki/) right into the chat room.
-
-# Basic commands
-We're adding more features all the time. But here are some basics
-
-```
-help
-find TOPIC
-wiki TOPIC
-about @user
-thanks @user
-```
-
-## adding to the wiki
-you can add topics to the main wiki, and these will get updated and pulled into the chat.
-Please add material!
-
-## Beta Testing
-https://gitter.im/dcsan/gitterbot
-
-## Repo
-
-
-http://bot.freecodecamp.com/go?room=camperbot/testing&topic=betatesting
-type `help` to get started with basic commands
diff --git a/nap/data/wiki/botpreso.md b/nap/data/wiki/botpreso.md
deleted file mode 100644
index dbb3edf..0000000
--- a/nap/data/wiki/botpreso.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# FCC chatbot **CamperBot**
-Now in development. First release today.
-
-to get started:
-# bot help
-
-To talk with the dev team about new features:
-# [https://gitter.im/camperbot/testing](https://gitter.im/camperbot/testing)
-
diff --git a/nap/data/wiki/camperbot.md b/nap/data/wiki/camperbot.md
deleted file mode 100644
index fafe69c..0000000
--- a/nap/data/wiki/camperbot.md
+++ /dev/null
@@ -1,66 +0,0 @@
-Hi, I'm **[CamperBot](https://github.com/FreeCodeCamp/freecodecamp/wiki/camperbot)**! I can help you in this chatroom :smile: 
-
-### Basic Commands:
-- ``find TOPIC``  find all entries about topic. ex: `find js`
-- `wiki TOPIC` show contents of topic page
-- `thanks @username`  send brownie points to another user
-- `about @username`   shows info on that user
-- `bonfire BONFIRENAME` info on a bonfire
-
-:speech_balloon: [meet CamperBot in this room!](https://gitter.im/camperbot/testing)
-
-
-## Example Commands
-
-```
-find js   # all JS entries
-wiki muta  # first entry with muta in name
-wiki bobbytables  # showing images
-wiki video  # and video
-rollem    # secret sauce
-bonfire roman   # any bonfire with roman in name
-```
-For playing with CamperBot please use the testing channel:
-[https://gitter.im/camperbot/testing](https://gitter.im/camperbot/testing)
-
-## Help on Bonfires
-Live currently on the HelpBonFires channel on Gitter
-[https://gitter.im/FreeCodeCamp/HelpBonfires](https://gitter.im/FreeCodeCamp/HelpBonfires)
-
-We've added some bonfire specific commands. If you type `bonfire $BONFIRENAME` (where $BONFIRENAME is part of a bonfire name) it will set the chat to be about that bonfire. Then you can use some other bonfire specific commands:
-
-- bf details - more info
-- bf spoiler - show some hints
-
-## More  commands
-- `update`  pulls new wiki edits asap
-- `topics` selected pages from the wiki
-- `rooms`  all rooms the bot is in
-- `archives` show history
-- `music` link to Musare (a music app built by campers)
-- `twitch` show the twitch feed
-
-## Content for the wiki
-Feel free to make new pages, an example entry is here:
-https://github.com/FreeCodeCamp/freecodecamp/wiki/example
-
-## Source Repository
-### [https://github.com/dcsan/gitterbot](https://github.com/dcsan/gitterbot)
-Fork it and have fun!
-
-## Roadmap
-We're looking for ideas for new features to add, and some people to help working on the bot.
-Have a look at Tickets with [help wanted](https://github.com/dcsan/gitterbot/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) on the repo and maybe you can contribute?
-
-In future, we're planning:
-- Bonfire step-by-step tutorials will be available via chat and from the CamperBot
-- realtime tagging and searching of chats by topic
-- a scripting language and natural language processing
-Get involved and let us know what you'd like to see next!
-
-## Developer Chatroom
-- [Join us on our repository chat room](https://gitter.im/dcsan/gitterbot) to discuss new features. Perhaps we can pair up to work on the bot 2.0!
-- [Join this chat room](https://gitter.im/camperbot/testing) to mess around with the CamperBot and try out commands, proofread your edits to wiki content etc.
-
-
-![enjoy](https://avatars1.githubusercontent.com/camperbot?&s=100) Happy Camping!
diff --git a/nap/data/wiki/chai-assert.md b/nap/data/wiki/chai-assert.md
deleted file mode 100644
index 3737503..0000000
--- a/nap/data/wiki/chai-assert.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# assert(expression, message)
-
-- @param{ Mixed }expressionto test for truthiness
-- @param{ String }messageto display on error
-
-Write your own test expressions.
-
-```js
-assert('foo' !== 'bar', 'foo is not bar');
-assert(Array.isArray([]), 'empty arrays are arrays');
-```
-
-details: http://chaijs.com/api/assert/
diff --git a/nap/data/wiki/chai-cheat.md b/nap/data/wiki/chai-cheat.md
deleted file mode 100644
index aa81f34..0000000
--- a/nap/data/wiki/chai-cheat.md
+++ /dev/null
@@ -1,126 +0,0 @@
-# Chai.js
-
-### Assert
-
-    assert(val)
-    assert.fail(actual, expected)
-    assert.ok(val) // is truthy
-    assert.equal(actual, expected) // 'compare with =='
-    assert.strictEqual
-    assert.deepEqual
-
-    assert.isTrue
-    assert.isFalse
-
-    assert.isNull
-    assert.isNotNull
-    assert.isUndefined
-    assert.isDefined
-    assert.isFunction
-    assert.isObject
-    assert.isArray
-    assert.isString
-    assert.isNumber
-    assert.isBoolean
-
-    assert.typeOf(/tea/, 'regexp') // Object.prototype.toString()
-    assert.instanceOf(chai, Tea)
-    assert.include([ a,b,c ], a)
-    assert.match(val, /regexp/)
-    assert.property(obj, 'tea') // 'tea' in object
-    assert.deepProperty(obj, 'tea.green')
-    assert.propertyVal(person, 'name', 'John')
-    assert.deepPropertyVal(post, 'author.name', 'John')
-
-    assert.lengthOf(object, 3)
-    assert.throws(function() { ... })
-    assert.throws(function() { ... }, /reference error/)
-    assert.doesNotThrow
-
-    assert.operator(1, '<', 2)
-    assert.closeTo(actual, expected)
-
-### Should: chains
-
-    .to .be .been .is .that .and .have .with .at .of .same
-
-### Should not
-
-    expect(object).not.equal('x')
-
-### Expectations
-
-    expect(object)
-      .equal(expected)
-      .eql
-      .deep.equal(expected) // same as .eql
-      .be.a('string')
-      .include(val)
-
-      .be.ok(val)
-      .be.true
-      .be.false
-
-      .be.null
-      .be.undefined
-      .be.empty
-      .be.arguments
-      .be.function
-      .be.instanceOf
-
-      .gt(5)  # or .above .greaterThan
-      .gte    # or .at.least
-      .lt(5)  # or .below
-
-      .respondTo('bar')
-      .satisfy (n) -> n > 0
-
-      .have.members([2, 3, 4])
-      .have.keys(['foo'])
-      .have.key('foo')
-
-      .exist
-
-    expect(-> ...)
-      .throw /not a function/
-
-### Chai-jQuery
-
-```js
-    global.jQuery = ...;
-    chai.use(require('chai-jquery'));
-
-    expect($body)
-
-      .have.attr('foo')
-      .have.prop('disabled')
-      .have.css('background')
-      .have.css('background-color', '#ffffff')
-      .have.data('foo')
-
-      .have.class('active')
-      .have.id('id')
-
-      .have.html('<em>hi</em>')
-      .have.text('hello')
-      .have.value('2013')
-
-      .be.visible
-      .be.hidden
-
-      .be.checked
-      .be.selected
-
-      .be.enabled
-      .be.disabled
-
-      .be.empty
-      .to.exist
-      .to.contain('text')
-      .to.have('.selector')
-```
-
-
-> [ricostacruz CheatSheets](https://github.com/rstacruz/cheatsheets)
-
-> [Discuss on gitter](https://gitter.im/bothelp/testing)
diff --git a/nap/data/wiki/chai.md b/nap/data/wiki/chai.md
deleted file mode 100644
index 03a4a38..0000000
--- a/nap/data/wiki/chai.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Chai.js
-
-[Chai] (http://chaijs.com/) is a testing framework. More info:
-- `help chai assert`
-- `help chai expectations`
diff --git a/nap/data/wiki/code-formatting.md b/nap/data/wiki/code-formatting.md
deleted file mode 100644
index c20640c..0000000
--- a/nap/data/wiki/code-formatting.md
+++ /dev/null
@@ -1,38 +0,0 @@
-### Inline code
-This an inline \``<paste code here>`\` code formatting with a single backtick(\`) at *start* and *end* around the `code`.
-
-### Code Block
-\`\`\` ⇦ Type 3 backticks, then press `[shift + enter ⏎]`
-```text
-<paste your code here>,
-then press [shift + enter ⏎]
-```
-\`\`\` ⇦ Type 3 backticks, then press `[enter ⏎]`
-
-See also: ☛ [**How to type Backticks**](https://github.com/FreeCodeCamp/freecodecamp/wiki/code-formatting#typing-backticks) | ☯ [Compose Mode](https://gitter.zendesk.com/hc/en-us/articles/201302311-Compose-mode) | ❄ [Gitter Formatting Basics](https://gitter.zendesk.com/hc/en-us/articles/200176682-Markdown-basics)
-
-## Typing Backticks[⤴](http://superuser.com/a/254077/122424)
-### QWERTY and QWERTZ (Key that's been marked with red border)
-
-[![QWERTY][2]][3]
-
-### AZERTY France (<kbd>Alt Gr</kbd> + Key that's been marked with red border)
-
-[![AZERTY][4]][5]
-
-### AZERTY Belgium (<kbd>Alt Gr</kbd> + Key that's been marked with red border)
-
-[![enter image description here][6]][7]
-
-### QWERTY Estonian (Key's that have been marked with red border)
-
-![Estonian Keyboard layout](http://i.imgur.com/Ugcflkk.png)
-
-
-  [1]: http://en.wikipedia.org/wiki/Dead_key
-  [2]: http://i.stack.imgur.com/TOn1U.png
-  [3]: http://i.stack.imgur.com/TOn1U.png
-  [4]: http://i.stack.imgur.com/BTBIE.png
-  [5]: http://i.stack.imgur.com/BTBIE.png
-  [6]: http://i.stack.imgur.com/9o9hM.png
-  [7]: http://i.stack.imgur.com/9o9hM.png
\ No newline at end of file
diff --git a/nap/data/wiki/css-selectors.md b/nap/data/wiki/css-selectors.md
deleted file mode 100644
index e098abc..0000000
--- a/nap/data/wiki/css-selectors.md
+++ /dev/null
@@ -1,26 +0,0 @@
-In CSS, selectors are patterns used to select DOM elements.
-
-basic selectors like `a` or `h1`
-```css
-a { color: black; }
-h1 { font-size 24px; }
-```
-
-## cheat list of selectors
-```css
-.name            - all items of class 'name'
-#name            - ID of 'name'
-div#container    - all divs with 
-```
-but you can combine them in other ways like:
-```
-li a             -
-li > a           -
-li + a           -
-```
-
-## this is a stub entry! 
-please read up on this stuff from cheat sheets around the web and edit/complete this document!
-
-[Great Reference at CodeTuts](http://code.tutsplus.com/tutorials/the-30-css-selectors-you-must-memorize--net-16048)
-
diff --git a/nap/data/wiki/css.md b/nap/data/wiki/css.md
deleted file mode 100644
index 0a97b94..0000000
--- a/nap/data/wiki/css.md
+++ /dev/null
@@ -1,4 +0,0 @@
-Cascading Style Sheets [(CSS)] (https://developer.mozilla.org/en-US/docs/Web/CSS) is a style sheet language used for describing the look and formatting of a document written in a markup language.
-
-> tags: css, stylesheets
-
diff --git a/nap/data/wiki/dau.md b/nap/data/wiki/dau.md
deleted file mode 100644
index ac78fa2..0000000
--- a/nap/data/wiki/dau.md
+++ /dev/null
@@ -1,4 +0,0 @@
-Daily Active Users
-
-often used in web startups as a core [KPI](kpi)
-see also [MAU](mau).
\ No newline at end of file
diff --git a/nap/data/wiki/debugging.md b/nap/data/wiki/debugging.md
deleted file mode 100644
index abc2660..0000000
--- a/nap/data/wiki/debugging.md
+++ /dev/null
@@ -1,3 +0,0 @@
-> Debugging helps you identify and remove errors from (computer hardware or software).
-
-Use [repl.it](http://repl.it/languages/JavaScript) to help you debug your code.  It shows the console output on the right as well as errors and lets you share your code snippets with other people.
diff --git a/nap/data/wiki/demo-trim.md b/nap/data/wiki/demo-trim.md
deleted file mode 100644
index f9d7117..0000000
--- a/nap/data/wiki/demo-trim.md
+++ /dev/null
@@ -1,13 +0,0 @@
-The chatwiki only shows up to the first `h2` heading, marked with two # symbols.
-This is a piece of demo content showing embedded scripts. 
-The first paragraph should display inside the chat.
-The second paragraph won't show in wiki chat, but will show if you click through.
-
-```js
-function test(a, b) {
-  return (a+b);
-}
-```
-
-## second paragraph
-This is the 2nd paragraph of content which is "below the fold" and won't be visible in the chat.
diff --git a/nap/data/wiki/emoji.md b/nap/data/wiki/emoji.md
deleted file mode 100644
index be0632f..0000000
--- a/nap/data/wiki/emoji.md
+++ /dev/null
@@ -1,2 +0,0 @@
-Gitter IM and GitHub both support a range of cool emoji (emoticons).
-From `:sunny:` :sunny: to `:poop:` :poop: you can express a range of emotions!
diff --git a/nap/data/wiki/example.md b/nap/data/wiki/example.md
deleted file mode 100644
index 2bcc9f2..0000000
--- a/nap/data/wiki/example.md
+++ /dev/null
@@ -1,24 +0,0 @@
-This is an example wiki entry. Break it up with a `## H2 heading` as content before that will show in the chat, but the [rest is on the wiki](https://github.com/FreeCodeCamp/freecodecamp/wiki/example).
-
-```
-console.log("less is more!");
-```
-
-| ![HappyCamping](https://avatars2.githubusercontent.com/u/13561988?v=3&s=128) | -{ Happy Coding! :+1: } |
-| ------------- |:-------------|
-|      | https://github.com/camperbot|
-
-## anything after this ## heading doesn't show in the chat
-Anything below the first `## Heading` will only be shown in the wiki.
-
-- update
-When you're done editing, type `update`
-
-- For testing your update please use the bot testing channel here:
-https://gitter.im/camperbot/testing
-
-- If you put links [make them full URLs](https://github.com/FreeCodeCamp/freecodecamp/wiki/example) like that.
-
-:star2: :hamster: [emoji look cute! cheat sheet](http://www.emoji-cheat-sheet.com/)
-
-![images](https://s3.amazonaws.com/freecodecamp/landingIcons_connect.svg.gz)
diff --git a/nap/data/wiki/falsey.md b/nap/data/wiki/falsey.md
deleted file mode 100644
index 775af37..0000000
--- a/nap/data/wiki/falsey.md
+++ /dev/null
@@ -1,6 +0,0 @@
-Something which evaluates to FALSE. There are only five falsey values in JavaScript:
-`undefined`, `null`, `NaN`, `0`, `""` (empty string), and `false` of course.
-
-## see also
-- [truthy](truthy) 
-- [Truthy & Falsey blog post](http://james.padolsey.com/javascript/truthy-falsey/)
\ No newline at end of file
diff --git a/nap/data/wiki/fart.md b/nap/data/wiki/fart.md
deleted file mode 100644
index bdfe191..0000000
--- a/nap/data/wiki/fart.md
+++ /dev/null
@@ -1 +0,0 @@
-Real mature.
\ No newline at end of file
diff --git a/nap/data/wiki/help.md b/nap/data/wiki/help.md
deleted file mode 100644
index 07d497a..0000000
--- a/nap/data/wiki/help.md
+++ /dev/null
@@ -1 +0,0 @@
-this is the help section for the Wiki. Placeholder for now, please edit me!
\ No newline at end of file
diff --git a/nap/data/wiki/higher-order-functions.md b/nap/data/wiki/higher-order-functions.md
deleted file mode 100644
index 2698c5f..0000000
--- a/nap/data/wiki/higher-order-functions.md
+++ /dev/null
@@ -1,4 +0,0 @@
-Functions that are higher!
-
-https://www.youtube.com/watch?v=BMUiFMZr7vk
-
diff --git a/nap/data/wiki/how-to-post-code.md b/nap/data/wiki/how-to-post-code.md
deleted file mode 100644
index afe0837..0000000
--- a/nap/data/wiki/how-to-post-code.md
+++ /dev/null
@@ -1,3 +0,0 @@
-use backticks `
-
-![posting](https://dl.dropboxusercontent.com/u/48751994/code.png)
diff --git a/nap/data/wiki/html-elements.md b/nap/data/wiki/html-elements.md
deleted file mode 100644
index ad57553..0000000
--- a/nap/data/wiki/html-elements.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Most HTML elements have an opening tag and a closing tag. Opening tags look like this: `<h1>`. 
-
-Closing tags look like this: `</h1>`. 
-
-Note that the only difference between opening and closing tags is that closing tags have a slash after their opening angle bracket.
-
-Try it here! http://www.freecodecamp.com/challenges/waypoint-say-hello-to-html-elements
\ No newline at end of file
diff --git a/nap/data/wiki/isLoggedInAsync().md b/nap/data/wiki/isLoggedInAsync().md
deleted file mode 100644
index ac046e2..0000000
--- a/nap/data/wiki/isLoggedInAsync().md
+++ /dev/null
@@ -1,17 +0,0 @@
-Let's say you have a public page, but if the user is logged in you want to show special information to them. You'll need to detect if a user is logged in before you make an *$http* call, right? It’s not guaranteed that this will work, because *isLoggedIn()* is actually an async call. If you want to force something to wait until after *isLoggedIn()* is successful before it gets called, you should include *Auth.isLoggedInAsync*:
-
-~~~javascript
-$scope.isLoggedInAsync = Auth.isLoggedInAsync;
-~~~	
-
-*isLoggedInAsync* takes a callback function as an input, and passes the callback function a *true* boolean if the user is logged in, and a *false* if the user is not. You can call it like so: 
-
-~~~javascript
-$scope.isLoggedInAsync(callback(bool) {
-	if (bool) { /** do thing if they’re logged in **/ } 
-	else { /** do different thing if they’re not logged in **/ }
-});
-~~~
-
-[PREVIOUS](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Restrict-a-page-to-authenticated-users)
-[NEXT](https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/Bonus:-SocketIO)
\ No newline at end of file
diff --git a/nap/data/wiki/jQuery.md b/nap/data/wiki/jQuery.md
deleted file mode 100644
index a4ed59b..0000000
--- a/nap/data/wiki/jQuery.md
+++ /dev/null
@@ -1,8 +0,0 @@
-It's the most used library in JavaScript. Is used to handle events, create animations, etc. to create dynamic web applications and pages. 
-- `$()` -> tells js we'll be using jQuery. 
-- `document` tells jQuery to work with our HTML
-- `.ready` -> makes the jQuery wait untill the page is completely loaded.
-
-## Keep adding 
-placeholder! work in progress!
-please add key notes here, these won't show up in chat.
\ No newline at end of file
diff --git a/nap/data/wiki/js-arguments.md b/nap/data/wiki/js-arguments.md
deleted file mode 100644
index ed62675..0000000
--- a/nap/data/wiki/js-arguments.md
+++ /dev/null
@@ -1,62 +0,0 @@
-The arguments object is an **array-like object** *(meaning that it looks like an array but it's not)* that stores all of the arguments that you passed to a function and is proprietary to that function in particular. If you were to pass 3 arguments to a function, say `storeNames()`, those 3 arguments would be stored inside an object called **arguments** and it would look like this when we pass the arguments `storeNames("Mulder", "Scully", "Alex Krycek")` to our function:
-
-- First, we declare a function and make it return the arguments object.
-``` javascript
-function storeNames() { return arguments; }
-```
-
-- Then, when we execute that function with **n arguments**, 3 in this case, it will return the object to us and it will **look like** an array. We can convert it to an array, but more on that later...
-``` javascript
-// If we execute the following line in the console:
-storeNames("Mulder", "Scully", "Alex Kryceck");
-// The output will be: ["Mulder", "Scully", "Alex Kryceck"]
-```
-
-If you want to know more about this, such as converting it to an array or the optimization problem that comes with using the *slice(*) method and how to solve it, click on **read more** (Gitter Chat Only).
-
-## Treat it as an array
-You can invoke arguments by using `arguments[n]` (where *n* is the index of the argument in the array-like object) but if you want to use it as an array for iteration purposes or applying array methods to it, you need to *convert it to an array* by declaring a variable and using the Array.prototype.slice.call method (because *arguments* is not an array):
-
-``` javascript
-var args = Array.prototype.slice.call(arguments)
-```
-
-Since **slice()** has two (the parameter **end** is optional) parameters, you can grab a certain portion of the arguments by specifying (using the *slice.call()* method renders these two parameters optional, not just *end*) the beginning and the ending of your portion; check out the following code:
-
-``` javascript
-function getGrades() {
-	var args = Array.prototype.slice.call(arguments, 1, 3);
-	return args;
-}
-
-// Let's output this!
-console.log(getGrades(90, 100, 75, 40, 89, 95));
-
-// OUTPUT SHOULD BE: //
-// [100, 75] <- Why? Because it started from index 1 and stopped at index 3
-// so, index 3 (40) wasn't taken in consideration.
-//
-// If we remove the '3' parameter, leaving just (arguments, 1) we'd get
-// every argument from index 1: [100, 75, 40, 89, 95].
-```
-
-### Optimization issues with Array.slice()
-
-There is a little problem, it's not recommended to use slice in the arguments object (optimization reasons)...
-
-> **Important**: You should not slice on arguments because it prevents optimizations in JavaScript engines (V8 for example). Instead, try constructing a new array by iterating through the arguments object. 
-
-> *by* ***Mozilla Developer Network***
-
-So, what other method is available to convert *arguments* to an array?
-I recommend the for-loop (not the for-in loop), you can do it like this:
-
-``` javascript
-var args = []; // Empty array, at first.
-for (var i = 0; i < arguments.length; i++) {
-	args.push(arguments[i])
-} // Now 'args' is an array that holds your arguments.
-```
-
-For more information on the optimization issues:  
-[Optimization Killers: Managing Arugments](https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#3-managing-arguments)
\ No newline at end of file
diff --git a/nap/data/wiki/js-closures.md b/nap/data/wiki/js-closures.md
deleted file mode 100644
index 9a7fd6b..0000000
--- a/nap/data/wiki/js-closures.md
+++ /dev/null
@@ -1,16 +0,0 @@
-Closures are functions that refer to independent (free) variables. In other words, the function defined in the closure 'remembers' the environment in which it was created.
-
-```js
-function init() {
-  var name = "Mozilla"; // name is a local variable created by init
-  function displayName() { // displayName() is the inner function, a closure
-    alert(name); // use variable declared in the parent function    
-  }
-  displayName();    
-};
-init();
-```
-
-see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures)
-
-> tags: closure, javascript, js
\ No newline at end of file
diff --git a/nap/data/wiki/js-filter.md b/nap/data/wiki/js-filter.md
deleted file mode 100644
index 7e4122f..0000000
--- a/nap/data/wiki/js-filter.md
+++ /dev/null
@@ -1,57 +0,0 @@
-The `filter()` method creates a new array with all elements that pass the test implemented by the provided function
-
-```js
-arr.filter(callback[, thisArg])
-```
-
-## parameters
-
-|          | Parameter                           |
-|----------|-------------------------------------|
-| Required | Arr                                 |
-| Required | callback (function with max 3 args) |
-| Optional | thisArg                             |
-
-**Return:** A new array that contains all the values for which the callback function returns true. If the callback function returns false for all elements of array1, the length of the new array is 0.
-
-[MDN link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) | [MSDN link](https://msdn.microsoft.com/library/ff679973%28v=vs.94%29.aspx?f=255&MSPPError=-2147217396)
-
-## Examples
-```js
-// Define a callback function.
-function CheckIfPrime(value, index, ar) {
-    high = Math.floor(Math.sqrt(value)) + 1;
-    
-    for (var div = 2; div <= high; div++) {
-        if (value % div == 0) {
-            return false;
-        }
-    } 
-    return true;
-}
-
-// Create the original array.
-var numbers = [31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53];
-
-// Get the prime numbers that are in the original array. 
-var primes = numbers.filter(CheckIfPrime);
-
-document.write(primes);
-// Output: 31,37,41,43,47,53
-```
-
-```js
-// Create the original array.
-var arr = [5, "element", 10, "the", true];
-
-// Create an array that contains the string
-// values that are in the original array.
-var result = arr.filter(
-    function (value) {
-        return (typeof value === 'string');
-    }
-);
-
-document.write(result);
-// Output: element, the
-```
\ No newline at end of file
diff --git a/nap/data/wiki/js-for-in.md b/nap/data/wiki/js-for-in.md
deleted file mode 100644
index 930e976..0000000
--- a/nap/data/wiki/js-for-in.md
+++ /dev/null
@@ -1,58 +0,0 @@
-The `for..in` statement iterates over the enumerable properties of an object, in arbitrary order. For each distinct property, statements can be executed.
-
-```js
-for (variable in object) {
-...
-}
-```
-
-| Required/Optional | Parameter | Description                                                          |
-|-------------------|-----------|----------------------------------------------------------------------|
-| Required          | Variable  | A different property name is assigned to variable on each iteration. |
-| Optional          | Object    | Object whose enumerable properties are iterated.                     |
-
-[MDN link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in) | [MSDN link](https://msdn.microsoft.com/library/55wb2d34.aspx)
-
-## Examples
-```js
-// Initialize object.
-a = {"a" : "Athens" , "b" : "Belgrade", "c" : "Cairo"}
-
-// Iterate over the properties.
-var s = ""
-for (var key in a) {
-    s += key + ": " + a[key];
-    s += "<br />";
-    }
-document.write (s);
-
-// Output:
-// a: Athens
-// b: Belgrade
-// c: Cairo
-```
-
-```js
-// Initialize the array.
-var arr = new Array("zero","one","two");
-
-// Add a few expando properties to the array.
-arr["orange"] = "fruit";
-arr["carrot"] = "vegetable";
-
-// Iterate over the properties and elements.
-var s = "";
-for (var key in arr) {
-    s += key + ": " + arr[key];
-    s += "<br />";
-}
-
-document.write (s);
-
-// Output:
-//   0: zero
-//   1: one
-//   2: two
-//   orange: fruit
-//   carrot: vegetable
-```
\ No newline at end of file
diff --git a/nap/data/wiki/js-for-of.md b/nap/data/wiki/js-for-of.md
deleted file mode 100644
index fbdee36..0000000
--- a/nap/data/wiki/js-for-of.md
+++ /dev/null
@@ -1,43 +0,0 @@
-The `for..or` statement creates a loop Iterating over iterable objects (including Array, Map, Set, arguments object and so on), invoking a custom iteration hook with statements to be executed for the value of each distinct property.
-
-```js
-for (variable of object) {
-  statement
-}
-```
-
-|          | Description                          |
-|----------|-------------------------------------|
-| variable | On each iteration a value of a different property is assigned to variable.                                 |
-| object | Object whose enumerable properties are iterated. |
-
-[MDN link](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/for...of) | [MSDN link](https://msdn.microsoft.com/library/dn858238%28v=vs.94%29.aspx?f=255&MSPPError=-2147217396)
-
-## Examples
-
-```js
-let arr = [ "fred", "tom", "bob" ];
-
-for (let i of arr) {
-    console.log(i);
-}
-
-// Output:
-// fred
-// tom
-// bob
-```
-
-```js
-var m = new Map();
-m.set(1, "black");
-m.set(2, "red");
-
-for (var n of m) {
-console.log(n);
-}
-
-// Output:
-// 1,black
-// 2,red
-```
\ No newline at end of file
diff --git a/nap/data/wiki/js-for.md b/nap/data/wiki/js-for.md
deleted file mode 100644
index c7cfee9..0000000
--- a/nap/data/wiki/js-for.md
+++ /dev/null
@@ -1,12 +0,0 @@
-The javascript `for` command iterates through a list of items.
-
-```js
-for (var i = 0; i < 9; i++) {
-   console.log(i);
-   // more statements
-}
-```
-
-links: [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for)
-
-related: js-loops
diff --git a/nap/data/wiki/js-immutable.md b/nap/data/wiki/js-immutable.md
deleted file mode 100644
index 3455c24..0000000
--- a/nap/data/wiki/js-immutable.md
+++ /dev/null
@@ -1,18 +0,0 @@
-> Immutable means unchangeable i.e. you can't change.
-
-Javascript has lots of immutable types e.g. `string` primitive type. Try this in your console.
-
-```js
-s = "red";
-console.log(s[1]); //→ "e"
-s[1] = "x";
-console.log(s) //→ "red"
-```
-the `s` didn't change! WAT!
-
-## Details
-Some string methods like `String.replace` returns a new string. 
-
-JavaScript has one complex data type, the Object data type, and it has five simple data types: Number, String, Boolean, Undefined, and Null. These simple (primitive) data types are immutable (cannot be changed), while objects are mutable (can be changed).
-
-tags: js, immutability
\ No newline at end of file
diff --git a/nap/data/wiki/js-indexof.md b/nap/data/wiki/js-indexof.md
deleted file mode 100644
index ce72836..0000000
--- a/nap/data/wiki/js-indexof.md
+++ /dev/null
@@ -1,42 +0,0 @@
-## Array.prototype.indexOf()
-
-The `indexOf()` method returns the first index at which a given element can be found in the array, or -1 if it is not present.
-
-```js
-arr.indexOf(searchElement[, fromIndex = 0])
-```
-
-## Parameters
-
-|          | Parameter                           |
-|----------|-------------------------------------|
-| Required | Arr                                 |
-| Required | searchElement |
-| Optional | fromIndex                             |
-
-**Return:** -1 if the element is not found in the array or an integer >=0, the position of the element in the array
-
-[MDN link](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)
-
-## Examples
-**Use Case:** Check to see if there are any apples in the fruit basket (defined as an array)?
-```js
-var basket = ['apple','orange','banana','strawberry'];
-```
-**Without** indexOf()
-```js
-var found = false;
-for(var i= 0, l = basket.length; i< l; i++){
-	if(basket[i] === 'apple'){
-		found = true;
-                break;
-	}
-}
-console.log(found);
-```
-**With** indexOf()
-```js
-console.log(basket.indexOf("apple") != -1);
-```
-
-tags: js, array
\ No newline at end of file
diff --git a/nap/data/wiki/js-loops.md b/nap/data/wiki/js-loops.md
deleted file mode 100644
index 6083cd3..0000000
--- a/nap/data/wiki/js-loops.md
+++ /dev/null
@@ -1,17 +0,0 @@
-Javascript has a few different ways to control flow, otherwise known as loops
-
-- [for](js-for)
-- [while](js-while)
-- [until](js-until)
-
-you can type `js for` or `js while` to get more info on any of these.
-
-this is a stub entry, please help add to it!
-
-----
-
-> Links: [MDN **for loop**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for)
-
-> related: for, while, for-each, for-of, for-in
-
-> advanced: comprehensions, iterators
diff --git a/nap/data/wiki/js-map.md b/nap/data/wiki/js-map.md
deleted file mode 100644
index 8ed08bb..0000000
--- a/nap/data/wiki/js-map.md
+++ /dev/null
@@ -1,63 +0,0 @@
-The method `map` of the Array prototype allows you to grab a hold of each element inside an array and apply a function to them. After **map** finishes iterating through the array, it will return a **new array** with the results of applying the function to the aforementioned elements.
-
-#### The syntax is as follows:
-`myAwesomeArray.map(myAwesomeFunction)`
-
-Since **map** doesn't mutate the original array, it should be used as a value, stored inside a variable, passed in as a **returned value** inside a function (the most common case) and many other things.
-Let's learn a little bit of what this powerful function can do! Say we have an array of  names and we want to create a new array with these names but UPPERCASED.
-
-``` javascript
-var names = ["Leia", "Anakin", "Luke", "Obi Wan Kenobi"];
-var uppercaseNames = names.map(function(name) {
-  return name.toUpperCase();
-};
-```
-Now if we `console.log(uppercaseNames)` we will get this:
-> `Array(4) -> ["LEIA", "ANAKIN", "LUKE", "OBI WAN KENOBI"]`
-
-But how does it work? Let's dive more into it.
-
-## Let's talk about the callback parameters
-The callback is the function that the Array.map() method accepts, it can be an anonymous function or an already declared function with the following parameters which, by the way, you can name as you please:
-
-1- **currentValue**: As the name suggest, it's the current element of the array being evaluated and waiting for your function to replace it with a new value in the new array (same index of course).
-
-2- **index**: It equals to the numeric index of currentValue, say you are in "Anakin", that means index, at the time, will equal to **1**.
-
-3- **array**: The array that's calling the method, in this case, it's referring to **names**.
-
-Examples work better than loose explanations, now we can make our callback function turn `["Leia", "Anakin", "Luke", "Obi Wan Kenobi"]` into `["My name is Leia, I'm #1", "My name is Anakin, I'm #2", "My name is Luke, I'm #3", "And last but not less important, I'm #4 Obi Wan Kenobi"]`. Sounds interesting and complex huh? It's actually not if you put the first two parameters to use.
-
-``` javascript
-var jediMasters = ["Leia", "Anakin", "Luke", "Obi Wan Kenobi"];
-var jediMastersSayHi = jediMasters.map(function(jediName, jediIndex) {
-  if (jediName === "Obi Wan Kenobi") {
-    return "And last but not less important, I'm #" + (jediIndex + 1) + " " + jediName;
-  } else {
-    return "My name is " + jediName + ", I'm #" + (jediIndex + 1);
-  }
-}); // We're done mapping, now console.log the whole thing.
-```
-
-If we now console out the values of the two arrays, we get this:
-
-![Map in action](https://www.evernote.com/shard/s539/sh/75d6da94-dd29-4dd6-98b7-9ee7260533ca/21e0ed3c9e391b9507128a42d2b12421/res/77e93999-b27c-46c5-b101-f9ed32d7aee0/skitch.png)
-
-If you are asking why one of the values in the string concatenation is `(jediIndex + 1)`, that's because **indices are 0-based**, we would get 0, 1, 2 and 3 for our Jedi's and that's not cool. Check that IF statement just sitting there, what does it do? Simple, it checks if the current Jedi is Obi Wan, if it is, then the new value of that element of the array (the new one) should be different from the rest.
-
-It's important to note that **we can write the function outside the map method** and call it with the name's function. Let's one more time re-write our code and see how we can achieve this (I think it's cleaner):
-
-``` javascript
-function sayHi(jedi, index) {
-  if (jedi === "Obi Wan Kenobi") {
-    return "And last but not less important, I'm #" + (index + 1) + " " + jedi;
-  } else {
-    return "My name is " + jedi + ", I'm #" + (index + 1);
-  }
-}
-
-var jediMasters = ["Leia", "Anakin", "Luke", "Obi Wan Kenobi"];
-var jediMastersSayHi = jediMasters.map(sayHi); // We're done mapping, now console.log the whole thing.
-```
-
-We can use map in strings and other types of objects if we use `Array.prototype.call(objectToBeMapped, callbackFunction)`, for more examples, go look other sites and practise it.
\ No newline at end of file
diff --git a/nap/data/wiki/js-slice.md b/nap/data/wiki/js-slice.md
deleted file mode 100644
index 5e728e8..0000000
--- a/nap/data/wiki/js-slice.md
+++ /dev/null
@@ -1,37 +0,0 @@
-> The `slice()` method returns a shallow copy of a portion of an array into a new array object.
-
-```js
-arr.slice([begin[, end]])
-```
-
-| Necessity | Parameter | Description                                                          |
-|-------------------|-----------|----------------------------------------------------------------------|
-| Required          | arr  | An Array object. |
-| Required          | begin    | The beginning of the specified portion of array.                     |
-| Optional          | end  | The end of the specified portion of array. |
-
-**Return:** The slice method returns an *Array object* containing the specified portion of arrayObj.
-
-[MDN link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice) | [MSDN link](https://msdn.microsoft.com/library/tkcsy6fe%28v=vs.94%29.aspx?f=255&MSPPError=-2147217396)
-
-## Examples
-```js
-var origArray = [3, 5, 7, 9];
-var newArray = origArray. slice(0, -1);
-document.write(origArray);
-document.write("<br/>");
-newArray = origArray. slice(-2);
-document.write(newArray);
-
-// Output:
-// 3,5,7,9
-// 7,9
-```
-
-```js
-// Our good friend the citrus from fruits example
-var fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango'];
-var citrus = fruits.slice(1, 3);
-
-// citrus contains ['Orange','Lemon']
-```
\ No newline at end of file
diff --git a/nap/data/wiki/js-ternary.md b/nap/data/wiki/js-ternary.md
deleted file mode 100644
index bef3c3b..0000000
--- a/nap/data/wiki/js-ternary.md
+++ /dev/null
@@ -1,13 +0,0 @@
-The Ternary operator replaces an if/then block.
-It's mostly used in one liners for simple tests and replacements, like this:
-
-```js
-var x = false;
-var s = x ? "yes" : "no";
-console.log(s);  //→ "no"
-
-```
-## Description
-If condition is true, the operator returns the value of expr1; otherwise, it returns the value of expr2. For example, to display a different message based on the value of the isMember variable, you could use this statement:
-
-**Read more:** [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator)
\ No newline at end of file
diff --git a/nap/data/wiki/js-undefined.md b/nap/data/wiki/js-undefined.md
deleted file mode 100644
index 067e063..0000000
--- a/nap/data/wiki/js-undefined.md
+++ /dev/null
@@ -1,3 +0,0 @@
-A primitive value automatically assigned to variables that have just been declared or to formal arguments for which there are no actual arguments.
-
-[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined)
\ No newline at end of file
diff --git a/nap/data/wiki/latex.md b/nap/data/wiki/latex.md
deleted file mode 100644
index 07ff752..0000000
--- a/nap/data/wiki/latex.md
+++ /dev/null
@@ -1,38 +0,0 @@
-LaTeX is designed for the production of technical and scientific documentation.
-You can create matrix, arrays or several other mathmatical functions.
-
-`` $$ (latex language) $$ ``
-
-You can embed Latex in GitterIM. Examples:
-
-**Array**:
-$$\begin{array} {c c}
-arr11 & arr12\\
-arr21 & arr22\\
-\end{array}$$
-
-**Matrix**:
-$$\begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}$$
-
-**formatting**:
-$$\huge\textstyle\color{#F00}{BigRed}\small\textstyle\color{#0F0}{SmallGreen}$$
-
-[Function Support](https://github.com/Khan/KaTeX/wiki/Function-Support-in-KaTeX)
-## details
-[KaTeX Github Repo](https://github.com/Khan/KaTeX)
-LaTeX is a high-quality typesetting system; it includes features designed for the production of technical and scientific documentation. LaTeX is the de facto standard for the communication and publication of scientific documents.
-His advantages are noticable in long documents like books, papers or thesis.
-
-Gitter uses Katex (an custom implementation of LaTeX) and it can be used introducing the following code:
-
-```latex
-$$\begin{array} {c c}
-item11 & item12\
-item21 & item 22\
-\end{array}
-$$
-```
-
-Text:
-- `$$\huge\textstyle{some text}$$` -> $$\huge\textstyle{some text}$$
-- `$$\color{#F90}{some text}$$` -> $$\color{#F90}{some text}$$
\ No newline at end of file
diff --git a/nap/data/wiki/ooda.md b/nap/data/wiki/ooda.md
deleted file mode 100644
index 66feece..0000000
--- a/nap/data/wiki/ooda.md
+++ /dev/null
@@ -1,6 +0,0 @@
-The OODA Loop is about how fast you can iterate. Often referenced in Lean Startup circles.
-
-![OODA](https://upload.wikimedia.org/wikipedia/commons/3/3a/OODA.Boyd.svg)
-
-## see also
-https://en.wikipedia.org/wiki/OODA_loop
\ No newline at end of file
diff --git a/nap/data/wiki/promises.md b/nap/data/wiki/promises.md
deleted file mode 100644
index a909ec5..0000000
--- a/nap/data/wiki/promises.md
+++ /dev/null
@@ -1,11 +0,0 @@
-A new feature of ES6 to help with async programming.
-
-## syntax
-```javascript
-new Promise(executor);
-new Promise(function(resolve, reject) { ... });
-```
-
-![MDN image](https://mdn.mozillademos.org/files/8633/promises.png)
-
-read more at [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
\ No newline at end of file
diff --git a/nap/data/wiki/quincy-larson.md b/nap/data/wiki/quincy-larson.md
deleted file mode 100644
index c417f6f..0000000
--- a/nap/data/wiki/quincy-larson.md
+++ /dev/null
@@ -1 +0,0 @@
-> Founder of [FreeCodeCamp.com](http://freecodecamp.com) !
\ No newline at end of file
diff --git a/nap/data/wiki/random.md b/nap/data/wiki/random.md
deleted file mode 100644
index 1c8450b..0000000
--- a/nap/data/wiki/random.md
+++ /dev/null
@@ -1,4 +0,0 @@
-my random thing! This is the above the fold content that will be shown in the chat.
-
-## more stuff
-more random stuff. anything below the first ## will only be shown in the wiki.
diff --git a/nap/data/wiki/regex.md b/nap/data/wiki/regex.md
deleted file mode 100644
index 157766e..0000000
--- a/nap/data/wiki/regex.md
+++ /dev/null
@@ -1,29 +0,0 @@
-> Links to useful RegEx resources. 
-
-* **Getting Started Tutorial:** http://regexone.com (FCC recommended)
-* **RegEx 101:** https://regex101.com
-
-**See also:** Regex [**Tutorials**](https://github.com/FreeCodeCamp/freecodecamp/wiki/regex#regex-tutorial--guides) | [**Testing**](https://github.com/FreeCodeCamp/freecodecamp/wiki/regex#regex-testing-ground) | [Games](https://github.com/FreeCodeCamp/freecodecamp/wiki/regex#regex-gameplay) | [Blogs](https://github.com/FreeCodeCamp/freecodecamp/wiki/regex#regex-blog) | [Software](https://github.com/FreeCodeCamp/freecodecamp/wiki/regex#software-aids-for-regex)
-
-## RegEx Tutorial & Guides
-* **RegEx Tutorial:** http://www.regular-expressions.info/tutorial.html (detailed explanation)
-* **RegEx Cheatsheet:** http://www.cheatography.com/davechild/cheat-sheets/regular-expressions
-* **MDN RegEx Guide:** https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
-* **StackOverflow RegEx FAQ:** http://stackoverflow.com/a/22944075/1262108
-* **RegEx Video Tutorial:** https://www.youtube.com/watch?v=EkluES9Rvak
-
-## RegEx Testing Ground
-* **RegEx Visualizer:** https://www.debuggex.com/?flavor=javascript
-* **RegEx Challenges in Hackerrank:** https://www.hackerrank.com/domains/algorithms/regex (practice)
-* **RegEx Regexplained:** https://leaverou.github.io/regexplained/
-## RegEx Gameplay
-* **RegEx Golf:** http://regex.alf.nu
-* **RegEx Crossword:** http://regexcrossword.com
-
-## RegEx Blog
-* **Rex Egg:** http://www.rexegg.com
-
-### Software Aids for RegEx
-* **RegExBuddy:** http://www.regexbuddy.com (proprietary)
-* **Expresso:** http://www.ultrapico.com/expresso.htm (free)
-* **RegEx Coach:** http://www.weitz.de/regex-coach/ (free)
\ No newline at end of file
diff --git a/nap/data/wiki/scope.md b/nap/data/wiki/scope.md
deleted file mode 100644
index aed5e6e..0000000
--- a/nap/data/wiki/scope.md
+++ /dev/null
@@ -1,5 +0,0 @@
-The current context of execution. The context in which values and expressions are "visible," or can be referenced. If a variable or other expression is not "in the current scope," then it is unavailable for use. Scopes can also be layered in a hierarchy, so that child scopes have access to parent scopes, but not vice versa.
-
-## Further Reading
-* [Understanding Scope and Context](http://ryanmorr.com/understanding-scope-and-context-in-javascript/) - Detailed explanation with examples by Ryan Morr
-* [Wikipedia - Scope](https://en.wikipedia.org/wiki/Scope_(computer_science))
\ No newline at end of file
diff --git a/nap/data/wiki/staging.md b/nap/data/wiki/staging.md
deleted file mode 100644
index 791e0bd..0000000
--- a/nap/data/wiki/staging.md
+++ /dev/null
@@ -1 +0,0 @@
-see beta site.
\ No newline at end of file
diff --git a/nap/data/wiki/test.md b/nap/data/wiki/test.md
deleted file mode 100644
index a459bc2..0000000
--- a/nap/data/wiki/test.md
+++ /dev/null
@@ -1 +0,0 @@
-something
\ No newline at end of file
diff --git a/nap/data/wiki/testingjson.md b/nap/data/wiki/testingjson.md
deleted file mode 100644
index 821c0af..0000000
--- a/nap/data/wiki/testingjson.md
+++ /dev/null
@@ -1 +0,0 @@
-too long
\ No newline at end of file
diff --git a/nap/data/wiki/topic.md b/nap/data/wiki/topic.md
deleted file mode 100644
index 19342fd..0000000
--- a/nap/data/wiki/topic.md
+++ /dev/null
@@ -1,6 +0,0 @@
-This is an example. You should replace `topic` with the thing you want to find info on.
-For example:
-```text
-wiki css    # find a wiki page on css
-find js     # find all pages related to css
-```
\ No newline at end of file
diff --git a/nap/data/wiki/triphop.md b/nap/data/wiki/triphop.md
deleted file mode 100644
index 2c4a1c9..0000000
--- a/nap/data/wiki/triphop.md
+++ /dev/null
@@ -1,3 +0,0 @@
-https://soundcloud.com/nasostsolakis/sets/triphop_electronic
-
-embedding a soundcloud track in the wiki!
\ No newline at end of file
diff --git a/nap/data/wiki/troll.md b/nap/data/wiki/troll.md
deleted file mode 100644
index 70d5506..0000000
--- a/nap/data/wiki/troll.md
+++ /dev/null
@@ -1,2 +0,0 @@
-Defenition: CamperBot
-It will make you want to leave chat forever!
\ No newline at end of file
diff --git a/nap/data/wiki/truthy.md b/nap/data/wiki/truthy.md
deleted file mode 100644
index 767fdee..0000000
--- a/nap/data/wiki/truthy.md
+++ /dev/null
@@ -1,5 +0,0 @@
-> A **truthy** value is a value that translates to **true** when evaluated in a *Boolean* context.
-
-All values are **truthy** unless they are defined as **falsy** (i.e. except for `false`, `0`, `""`, `null`, `undefined` and `NaN`).
-
-**See Also:** [MDN](https://developer.mozilla.org/en-US/docs/Glossary/Truthy)
\ No newline at end of file
diff --git a/nap/data/wiki/twitch.md b/nap/data/wiki/twitch.md
deleted file mode 100644
index d1abe31..0000000
--- a/nap/data/wiki/twitch.md
+++ /dev/null
@@ -1,3 +0,0 @@
-you can see the FCC Twitch Channel from here:
-
-http://www.twitch.tv/freecodecamp
diff --git a/nap/data/wiki/underworld.md b/nap/data/wiki/underworld.md
deleted file mode 100644
index 6042479..0000000
--- a/nap/data/wiki/underworld.md
+++ /dev/null
@@ -1 +0,0 @@
-https://soundcloud.com/underworld/saved-from-the-cutting-room-floor-mix-underworld-vs-the-misterons-1
\ No newline at end of file
diff --git a/nap/data/wiki/update.md b/nap/data/wiki/update.md
deleted file mode 100644
index 435e169..0000000
--- a/nap/data/wiki/update.md
+++ /dev/null
@@ -1,2 +0,0 @@
-the update command will pull down any new wiki edits, or new material.
-right now you have to do this manually, sorry! But we will in future automate this process.
diff --git a/nap/data/wiki/video-demo.md b/nap/data/wiki/video-demo.md
deleted file mode 100644
index 19ad15f..0000000
--- a/nap/data/wiki/video-demo.md
+++ /dev/null
@@ -1,3 +0,0 @@
-you can add inline video to the wiki with just a google link. Inside the chatwiki this will show up as an embedded video.
-
-https://www.youtube.com/watch?v=BMUiFMZr7vk
diff --git a/nap/data/wiki/video.md b/nap/data/wiki/video.md
deleted file mode 100644
index 87a53e0..0000000
--- a/nap/data/wiki/video.md
+++ /dev/null
@@ -1,4 +0,0 @@
-demoing inline video clips
-
-https://www.youtube.com/watch?v=BMUiFMZr7vk
-
diff --git a/nap/data/wiki/wat.md b/nap/data/wiki/wat.md
deleted file mode 100644
index f08359f..0000000
--- a/nap/data/wiki/wat.md
+++ /dev/null
@@ -1,3 +0,0 @@
-A brilliant talk about objects in ruby, javascript and other languages. Funny and insightful.
-
-https://www.destroyallsoftware.com/talks/wat
diff --git a/nap/data/wiki/wiki-js-template.md b/nap/data/wiki/wiki-js-template.md
deleted file mode 100644
index 221ecdd..0000000
--- a/nap/data/wiki/wiki-js-template.md
+++ /dev/null
@@ -1,25 +0,0 @@
-> This Template helps you build javascript topic wiki's.
-
-### Introduction
-
-```js
-Syntax of the method that you are writing about
-```
-
-| Parameter  |           Description                         |   Necessity   |
-|------------|-----------------------------------------------|---------------|
-|  Variable  | I'm a Description                             |   Required    |
-|  Object    | The position of vertical bar is not important |   Optional    |
-
-[MDN link](URL here) | [MSDN link](URL here)
-
-## Examples
-> You should provide at least 2 different examples
-
-```js
-INSERT EXAMPLE HERE
-```
-
-```js
-INSERT EXAMPLE HERE
-```
\ No newline at end of file
diff --git a/nap/docs/.eslintrc b/nap/docs/.eslintrc
deleted file mode 100644
index 3bae635..0000000
--- a/nap/docs/.eslintrc
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "env": {
-    "browser": 0
-  },
- 
-  "globals": {
-    "require": 1,
-    "console": 1
-    "module": 1
-  },
- 
-  "rules": {
-    "quotes": [2, "double"],
-    "strict": [2, "global"],
-    "no-console": 0
-  },
-
-  "ecmaFeatures": {
-    "blockBindings": true,
-    "forOf": true,
-    "jsx": true
-  },
-}
\ No newline at end of file
diff --git a/nap/docs/TODO.txt b/nap/docs/TODO.txt
deleted file mode 100644
index e3eef9e..0000000
--- a/nap/docs/TODO.txt
+++ /dev/null
@@ -1,112 +0,0 @@
-TODO
-
-- set room topic on entering the room / for that room?
-  if bonfire flag = true
-
-- call to action at the end "add comments / edit"
-
--
-
-
-    step through Luis lesson (wikihints)
-    allow users to add hints to bonfires?
-    co-browsing panel
-
-    advanced/other bonfires data
-    disable same message twice
-    volume feature
-
-    test out in main chat?
-
-X bugfix 'unauthorized user' message
-
-
-
-/more command
-
-hook in chatbot engine
-
-'scan' and listen for mentions / send a link?
-redirect to the bonfire help room
-
-lesson tips read from the wiki?
-
-
-------
-
-find / choose from list
-
-better search / help / find
-    choose first matching item?
-    if only one item return content right away
-
-
-thanks archive
-    read history of messages
-    tag
-    write to file?
-    send link to file?
-
-archiving messages?
-after basic thanks/karma system?
-
-karma code API call to FCC
-
-DM system
-
-
-# chatbot script
-integrated for conversation and topics, discussions
-
-# Basic Commands
-    menu - show commands
-    index - all topics
-    help - help page from wiki?
-
-
-# Bot Querying
-    replace spaces in topic names
-    hierarchical search?
-    Helper bot query syntax
-
-thanks @user
-    ask question, fire response?
-    show confirmation "gave a tip to user X!"
-    play animation
-
-
-# direct messaging
-    DMs to the bot, between players
-    send a link to open 1:1 chat
-
-
-what User info do we get?
-
-
-timeout / gambit / opener to keep activity
-
-
-
-
-YAML importer?
-break up room data into a yaml file
-
-
-
-------------
-Questions
-
-running mocha with iojs?
-
-Rooms, RoomData, - classnames?
-ES6 classes or prototypes?
-
-config files for different environments
-
-
-Mongoose wrapper?
-how best to use mongo?
-
-iojs install/version
-
-
diff --git a/nap/docs/credentials.md b/nap/docs/credentials.md
deleted file mode 100644
index 0804b1b..0000000
--- a/nap/docs/credentials.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# Setting up login credentials
-
-Apologies as this is a bit unclean right now. 
-
-You'll need to get a gitter.im token to use for your bot.
-create a new app here
-https://developer.gitter.im/apps
-
-Now make a copy of the `bin/credentials-example` file.
-Save it as credentials-YOUR_GITHUB_ID
-and fill in the fields.
-
-Look in the file data/RoomData.js
-
-```js
-var BotRoomData = {
-
-    // this controls which rooms you can access
-    YOUR_GITHUB_ID: [
-        // change this to be a room your user is already in
-        {
-            title: "bothelp",
-            name: "YOUR_GITHUB_ID/testing",
-            icon: "question",
-            topics: ["chitchat", "bots", "bot-development", "camperbot"]
-        },
-```
-
-once that's setup you should be able to run the app from this script
-
-    $ bin/run-YOUR_GITHUB_ID.sh
-
-Then access your new room in the web browser
-
-        http://gitter.im/YOUR_GITHUB_ID/testing
-
-Of course in all this, you should change YOUR_GITHUB_ID to your actual github ID!
-(Or better, make a separate github account for purposes of testing the bot)
-
-You can see in this commit as I tagged the areas which needed changing to make this generic.
-https://github.com/dcsan/gitterbot/commit/4af309c3a068d35207ca6be150446e1e059e85cd
-
-When you start the server the default is to run on port 7891
-You don't have to deploy this server anywhere - it will connect to gitter.im 
-
-
diff --git a/nap/docs/eslintrc.yaml b/nap/docs/eslintrc.yaml
deleted file mode 100644
index 4c8b9f4..0000000
--- a/nap/docs/eslintrc.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-rules:
-  indent:
-    - 2
-    - 4
-  quotes:
-    - 2
-    - double
-  linebreak-style:
-    - 2
-    - unix
-  semi:
-    - 2
-    - always
-
-  no-unused-vars: 
-    - 2
-    - 
-      vars: "none"
-      args: "after-used"
-
-
-env:
-  es6: true
-  node: true
diff --git a/nap/docs/nap.sublime-project b/nap/docs/nap.sublime-project
deleted file mode 100644
index 5941e0d..0000000
--- a/nap/docs/nap.sublime-project
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-    "folders":
-    [
-        {
-            "follow_symlinks": true,
-            "path": "../app"
-        },
-
-        {
-            "follow_symlinks": true,
-            "path": "..",
-            "folder_exclude_patterns": ["node_modules"]            
-        }
-
-    ]
-
-}
-
diff --git a/nap/docs/nap.sublime-workspace b/nap/docs/nap.sublime-workspace
deleted file mode 100644
index 9710df5..0000000
--- a/nap/docs/nap.sublime-workspace
+++ /dev/null
@@ -1,2002 +0,0 @@
-{
-	"auto_complete":
-	{
-		"selected_items":
-		[
-			[
-				"bonfireH",
-				"bonfireHint(input, bot)	bonfire.js"
-			],
-			[
-				"bon",
-				"bonfireHeader()	bonfire.js"
-			],
-			[
-				"bonfire",
-				"bonfireScript(input, bot)	bonfire.js"
-			],
-			[
-				"undefined",
-				"undefined"
-			],
-			[
-				"TEST",
-				"TEST_BF_NAME	BonfiresSpec.js"
-			],
-			[
-				"TE",
-				"TEST_BF_NAME	BonfiresSpec.js"
-			],
-			[
-				"hint",
-				"hintNum"
-			],
-			[
-				"hasPro",
-				"hasProperty(name, obj)	hasProperty.js"
-			],
-			[
-				"serverE",
-				"serverEnv	AppConfig.js"
-			],
-			[
-				"res",
-				"res	GBotSpec.js"
-			],
-			[
-				"KB",
-				"KBase"
-			],
-			[
-				"bot",
-				"bothelp"
-			],
-			[
-				"we",
-				"welcome"
-			],
-			[
-				"out",
-				"output"
-			],
-			[
-				"ma",
-				"makeMessageFromString"
-			],
-			[
-				"check",
-				"checkWiki"
-			],
-			[
-				"list",
-				"listenToRoom"
-			],
-			[
-				"btn",
-				"btn-lg"
-			],
-			[
-				"git",
-				"githubType"
-			],
-			[
-				"GItter",
-				"GitterHelper"
-			],
-			[
-				"gitt",
-				"gitterHelper"
-			],
-			[
-				"init",
-				"initPromise"
-			],
-			[
-				"by",
-				"findByTopic"
-			],
-			[
-				"font-s",
-				"font-size"
-			],
-			[
-				"Gi",
-				"GitterBot"
-			],
-			[
-				"pass",
-				"passportLogin"
-			],
-			[
-				"repl",
-				"replyString"
-			],
-			[
-				"ab",
-				"absolute"
-			],
-			[
-				"pause",
-				"pause-button"
-			],
-			[
-				"im",
-				"improve"
-			],
-			[
-				"font-",
-				"font-face"
-			],
-			[
-				"story",
-				"storyStars"
-			],
-			[
-				"TaskL",
-				"TaskLists"
-			],
-			[
-				"f",
-				"font-size"
-			],
-			[
-				"reset",
-				"resetDrill"
-			],
-			[
-				"tas",
-				"tasklist"
-			],
-			[
-				"Tast",
-				"TaskLists"
-			],
-			[
-				"step",
-				"stepNum"
-			],
-			[
-				"stpe",
-				"stepNum"
-			],
-			[
-				"task",
-				"taskname"
-			],
-			[
-				"prog",
-				"progress"
-			],
-			[
-				"drills",
-				"drills-container"
-			],
-			[
-				"taskli",
-				"tasklist"
-			],
-			[
-				"sta",
-				"starcount"
-			],
-			[
-				"che",
-				"checkPassed"
-			],
-			[
-				"findO",
-				"findOrCreate"
-			],
-			[
-				"max",
-				"maxStars"
-			],
-			[
-				"split",
-				"splitMode"
-			],
-			[
-				"par",
-				"parseBool"
-			],
-			[
-				"mul",
-				"multiChoice"
-			],
-			[
-				"totalS",
-				"totalStars"
-			],
-			[
-				"s",
-				"showInput"
-			],
-			[
-				"font",
-				"font-family"
-			],
-			[
-				"mar",
-				"margin-left"
-			],
-			[
-				"first",
-				"firstLine"
-			],
-			[
-				"skip",
-				"skipReply"
-			],
-			[
-				"err",
-				"error"
-			],
-			[
-				"stor",
-				"storyname"
-			],
-			[
-				"sto",
-				"storyPercent"
-			],
-			[
-				"Player",
-				"PlayerTasks"
-			],
-			[
-				"parse",
-				"parseBool"
-			],
-			[
-				"Pla",
-				"PlayerTasks"
-			],
-			[
-				"stea",
-				"streamImage"
-			],
-			[
-				"sc",
-				"sceneHeight"
-			],
-			[
-				"APP_",
-				"APP_ARG"
-			],
-			[
-				"reply",
-				"replyObj"
-			],
-			[
-				"load",
-				"loadBrainsFromJsonAndCodeDump"
-			],
-			[
-				"brain",
-				"brainPath"
-			],
-			[
-				"brains",
-				"brainsDumpImport"
-			],
-			[
-				"strea",
-				"streamFontMedium"
-			],
-			[
-				"next",
-				"nextUrl"
-			],
-			[
-				"start",
-				"startTime"
-			],
-			[
-				"paris",
-				"pairsdata"
-			],
-			[
-				"pairs",
-				"pairsdata"
-			],
-			[
-				"voca",
-				"vocabAll"
-			],
-			[
-				"chec",
-				"checkActions"
-			],
-			[
-				"margin",
-				"margin-bottom"
-			],
-			[
-				"tile-sec",
-				"tile-section-title"
-			],
-			[
-				"back",
-				"background-image"
-			],
-			[
-				"as",
-				"absolute"
-			],
-			[
-				"marg",
-				"margin-bottom"
-			],
-			[
-				"font-m",
-				"font-medium"
-			],
-			[
-				"arra",
-				"arrayContains"
-			],
-			[
-				"stream",
-				"streamImage"
-			],
-			[
-				"ti",
-				"tileNum"
-			],
-			[
-				"scro",
-				"scrollToLastTile"
-			],
-			[
-				"animat",
-				"animateGrid"
-			],
-			[
-				"fadeInLeft",
-				"fadeInLeftBig"
-			],
-			[
-				"asset",
-				"assetServer"
-			],
-			[
-				"a",
-				"actorR"
-			],
-			[
-				"o",
-				"opacity"
-			],
-			[
-				"cover",
-				"coverTall"
-			],
-			[
-				"do",
-				"doTask"
-			],
-			[
-				"find",
-				"findOrCreate"
-			],
-			[
-				"bac",
-				"background-color"
-			],
-			[
-				"fin",
-				"findOrCreate"
-			],
-			[
-				"b",
-				"background-repeat"
-			],
-			[
-				"tra",
-				"transform"
-			],
-			[
-				"calc",
-				"calcTemplate"
-			],
-			[
-				"unit",
-				"unitNames"
-			],
-			[
-				"book",
-				"bookNames"
-			],
-			[
-				"da",
-				"dayTiles"
-			],
-			[
-				"week",
-				"weekData"
-			],
-			[
-				"c",
-				"console"
-			],
-			[
-				"blok",
-				"blockObj"
-			],
-			[
-				"creat",
-				"createText"
-			],
-			[
-				"block",
-				"blockObj"
-			],
-			[
-				"blo",
-				"blockData"
-			],
-			[
-				"bloc",
-				"blocksGroup"
-			],
-			[
-				"slab",
-				"slabData"
-			],
-			[
-				"Sla",
-				"SlabsController"
-			],
-			[
-				"icon",
-				"iconList"
-			],
-			[
-				"chap",
-				"chapter"
-			],
-			[
-				"use",
-				"useCard"
-			],
-			[
-				"ch",
-				"check"
-			],
-			[
-				"hand",
-				"handleBotsResponse"
-			],
-			[
-				"relo",
-				"reloadAll"
-			],
-			[
-				"tileBx",
-				"tileBoxId"
-			],
-			[
-				"tile",
-				"tilesize"
-			],
-			[
-				"chapt",
-				"chapters"
-			],
-			[
-				"cha",
-				"chapdata"
-			],
-			[
-				"Chat",
-				"Chapters"
-			],
-			[
-				"user",
-				"username"
-			],
-			[
-				"loadF",
-				"loadFromJsonString"
-			],
-			[
-				"border-r",
-				"border-radius"
-			],
-			[
-				"backg",
-				"background-color"
-			],
-			[
-				"messag",
-				"messageObject"
-			],
-			[
-				"re",
-				"reply"
-			]
-		]
-	},
-	"buffers":
-	[
-	],
-	"build_system": "",
-	"build_system_choices":
-	[
-		[
-			[
-				[
-					"Packages/Better CoffeeScript/CoffeeScript.sublime-build",
-					""
-				],
-				[
-					"Packages/Better CoffeeScript/CoffeeScript.sublime-build",
-					"Run"
-				],
-				[
-					"Packages/JavaScript & Coffeescript Build Systems/xCoffee.sublime-build",
-					""
-				],
-				[
-					"Packages/JavaScript & Coffeescript Build Systems/xCoffee.sublime-build",
-					"Compile"
-				],
-				[
-					"Packages/User/coffee-dc.sublime-build",
-					""
-				],
-				[
-					"Packages/User/tns-android-run.sublime-build",
-					""
-				],
-				[
-					"Packages/User/tns-ios.sublime-build",
-					""
-				]
-			],
-			[
-				"Packages/Better CoffeeScript/CoffeeScript.sublime-build",
-				"Run"
-			]
-		],
-		[
-			[
-				[
-					"Packages/JavaScript & Coffeescript Build Systems/xJs.sublime-build",
-					""
-				],
-				[
-					"Packages/JavaScript & Coffeescript Build Systems/xJs.sublime-build",
-					"Compile"
-				],
-				[
-					"Packages/JavaScript & Coffeescript Build Systems/xJs.sublime-build",
-					"Harmony"
-				],
-				[
-					"Packages/User/coffee-dc.sublime-build",
-					""
-				],
-				[
-					"Packages/User/tns-android-run.sublime-build",
-					""
-				],
-				[
-					"Packages/User/tns-ios.sublime-build",
-					""
-				]
-			],
-			[
-				"Packages/User/coffee-dc.sublime-build",
-				""
-			]
-		]
-	],
-	"build_varint": "",
-	"command_palette":
-	{
-		"height": 267.0,
-		"last_filter": "java",
-		"selected_items":
-		[
-			[
-				"java",
-				"Set Syntax: JavaScript Next"
-			],
-			[
-				"form",
-				"Pretty JSON: Format (Pretty Print) JSON"
-			],
-			[
-				"lint",
-				"SublimeLinter: Lint This View"
-			],
-			[
-				"remo",
-				"Package Control: Remove Package"
-			],
-			[
-				"re",
-				"Package Control: Remove Package"
-			],
-			[
-				"rem",
-				"Package Control: Remove Package"
-			],
-			[
-				"pack",
-				"Package Control: Remove Package"
-			],
-			[
-				"inst",
-				"Package Control: Install Package"
-			],
-			[
-				"remove",
-				"Package Control: Remove Package"
-			],
-			[
-				"esl",
-				"Preferences: SublimeLinter Settings – User"
-			],
-			[
-				"js",
-				"JSLint"
-			],
-			[
-				"bea",
-				"Javascript Beautify"
-			],
-			[
-				"jac",
-				"Javascript Beautify"
-			],
-			[
-				"json",
-				"JSON Reindent: reindent file or selection"
-			],
-			[
-				"diff",
-				"Git: Diff Current File"
-			],
-			[
-				"git",
-				"Git: Blame"
-			],
-			[
-				"git bl",
-				"Git: Blame"
-			],
-			[
-				"check",
-				"Git: Checkout Current File"
-			],
-			[
-				"git check",
-				"Git: Checkout Current File"
-			],
-			[
-				"coffee",
-				"Coffee: Compile File"
-			],
-			[
-				"comp",
-				"Coffee: Compile File"
-			],
-			[
-				"coffe",
-				"Build With: CoffeeScript"
-			],
-			[
-				"git hi",
-				"Git: Graph Current File"
-			],
-			[
-				"git lo",
-				"Git: Log Current File"
-			],
-			[
-				"git di",
-				"Git: Diff Current File"
-			],
-			[
-				"insta",
-				"Package Control: Install Package"
-			],
-			[
-				"jva",
-				"Javascript Beautify"
-			],
-			[
-				"instal",
-				"Package Control: Install Package"
-			],
-			[
-				"refor",
-				"JSON Reindent: reindent file or selection"
-			],
-			[
-				"remov",
-				"Package Control: Remove Package"
-			],
-			[
-				"coff",
-				"Coffee: Run Cake Task"
-			],
-			[
-				"goto",
-				"Go To Definition"
-			],
-			[
-				"rela",
-				"Related Files"
-			],
-			[
-				"go to",
-				"Go To Definition"
-			],
-			[
-				"ins",
-				"Package Control: Install Package"
-			],
-			[
-				"iope",
-				"File Navigator: Open"
-			],
-			[
-				"focu",
-				"Focus File on Sidebar"
-			],
-			[
-				"swi",
-				"CTags: Show Symbols (file)"
-			],
-			[
-				"Package Control: ",
-				"Package Control: List Packages"
-			],
-			[
-				"file",
-				"Focus File on Sidebar"
-			],
-			[
-				"ctag",
-				"CTags: Show Symbols (all)"
-			],
-			[
-				"cta",
-				"CTags: Show Symbols (file)"
-			],
-			[
-				"open",
-				"View: Toggle Open Files in Side Bar"
-			],
-			[
-				"refo",
-				"Pretty JSON: Format (Pretty Print) JSON"
-			],
-			[
-				"packa",
-				"Preferences: Package Control Settings – Default"
-			],
-			[
-				"isnta",
-				"Package Control: Install Package"
-			],
-			[
-				"upgr",
-				"Package Control: Upgrade Package"
-			],
-			[
-				"ind",
-				"Indentation: Reindent Lines"
-			],
-			[
-				"",
-				"Coffee: Fast Compile"
-			],
-			[
-				"pac",
-				"Package Control: Install Package"
-			],
-			[
-				"insl",
-				"Package Control: Install Package"
-			],
-			[
-				"uninst",
-				"SublimeLinter: Disable Linter"
-			]
-		],
-		"width": 521.0
-	},
-	"console":
-	{
-		"height": 495.0,
-		"history":
-		[
-			"import urllib2, os;",
-			"import urllib2,os; pf='Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf), 'wb' ).write( urllib2.urlopen( 'http://sublime.wbond.net/' +pf.replace( ' ','%20' )).read()); print( 'Please restart Sublime Text to finish installation')"
-		]
-	},
-	"distraction_free":
-	{
-		"menu_visible": true,
-		"show_minimap": false,
-		"show_open_files": false,
-		"show_tabs": false,
-		"side_bar_visible": true,
-		"status_bar_visible": false
-	},
-	"expanded_folders":
-	[
-		"/Users/dc/dev/fcc/gitterbot/nap",
-		"/Users/dc/dev/fcc/gitterbot/nap/data",
-		"/Users/dc/dev/fcc/gitterbot/nap/data/rooms",
-		"/Users/dc/dev/fcc/gitterbot/nap/data/seed",
-		"/Users/dc/dev/fcc/gitterbot/nap/data/seed/challenges",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot",
-		"/Users/dc/dev/fcc/gitterbot/nap/logs",
-		"/Users/dc/dev/fcc/gitterbot/nap/test"
-	],
-	"file_history":
-	[
-		"/Users/dc/dev/fcc/gitterbot/nap/data/rooms/RoomMessages.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/RoomMessagesSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/data/RoomData.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/docs/TODO.txt",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/pm2-update.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/logs/README.md",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/GBot.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/app/Bonfires.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/BonfiresSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/KBase.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/utils/Utils.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/cmds/wiki.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/deploy.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/TestHelper.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/cmds/bonfire.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/utils/TextLib.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/package.json",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/BotCommands.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/data/seed/challenges/basic-bonfires.json",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/run-bothelp.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/app.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/cmds/about.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/utils/HttpWrap.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/config/AppConfig.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/credentials-bothelp.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/.gitignore",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/credentials-demobot.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/docs/credentials.md",
-		"/Users/dc/dev/fcc/gitterbot/nap/README.md",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/test.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/step-debug.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/run-demobot.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/utils/clog.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/app/routes.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/views/rooms.jade",
-		"/Users/dc/dev/fcc/gitterbot/docs/bonfires/where-art-thou.js",
-		"/Users/dc/dev/fcc/gitterbot/docs/bonfires/seek-and-destroy.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/cmds/update.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/wiki-pull.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/force-update.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/wiki-pull-prod.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/bot/cmds/thanks.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/run-dev-bothelp.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/run-YOUR_GITHUB_ID.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/credentials-example.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/credentials-dc.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/wiki-update.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/HttpWrapSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/SearchSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/WikiSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/IOSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/ParserSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/GBotSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/CommandsSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/TextLibSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/AppConfigSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/pm2-run.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/app/Rooms.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/UtilsSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/camperbot-run.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/test/RoomsSpec.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/vendor/meteor/Match.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/bin/debug.sh",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/gitter/restApi.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/lib/gitter/GitterHelper.js",
-		"/Users/dc/dev/fcc/gitterbot/nap/docs/nap.sublime-project",
-		"/Users/dc/dev/shumi/chatU/docs/chatU.sublime-project",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/docs/TODO.txt",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/.eslintrc",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/bot/GBot.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/RegexSpec.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/bot/BotCommands.js",
-		"/Users/dc/Library/Application Support/Sublime Text 3/Packages/SublimeLinter/SublimeLinter.sublime-settings",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/AppConfigSpec.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/data/RoomData.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/GBotSpec.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/utils/Utils.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/config/AppConfig.js",
-		"/Users/dc/Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter.sublime-settings",
-		"/Users/dc/Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings",
-		"/Users/dc/Library/Application Support/Sublime Text 3/Packages/User/JSON.sublime-settings",
-		"/Users/dc/Library/Application Support/Sublime Text 3/Packages/Default/Preferences.sublime-settings",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/update-wiki.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/run.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/dev.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/credentials.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/bot/KBase.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/runup.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/app/Rooms.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/README.md",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/auth.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/post.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/mocha-debug.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/debug.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/credentials-example.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/.gitignore",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/test.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/app.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/docs/regex.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/docs/questions.txt",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/app/routes.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/views/nav.jade",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/routesSpec.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/BotSpec.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/RoomsSpec.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/views/rooms.jade",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/views/home.jade",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/gitter/GitterHelper.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/gitter/passportModule.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/KBaseSpec.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/package.json",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/util/util.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/Environment.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/gitter/streamApi.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/docs/nap.sublime-project",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/credentials-dc.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/bin/credentials-bothelp.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/lib/bot/bot.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/public/css/app.css",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/topicsSpec.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/docs/questions.txt",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/data/topics.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/hugit/bin/run.sh",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/views/topics.jade",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/views/layout.jade",
-		"/Users/dc/dev/rikai/gitter/gitterbot/oauth/views/home.jade",
-		"/Users/dc/dev/rikai/gitter/gitterbot/nap/test/tester.js",
-		"/Users/dc/dev/rikai/gitter/gitterbot/hugit/hubot-scripts.json"
-	],
-	"find":
-	{
-		"height": 35.0
-	},
-	"find_in_files":
-	{
-		"height": 93.0,
-		"where_history":
-		[
-			"*js,/Users/dc/dev/fcc/gitterbot/nap/",
-			"*js,/Users/dc/dev/fcc/gitterbot/nap/lib",
-			"*js",
-			"*coffee",
-			"*code",
-			"*rive",
-			"*coffee",
-			"*rive",
-			"*coffee",
-			"*styl",
-			"",
-			"*coffee",
-			"/Users/dc/dev/shumi/chatU/app/client/widgets",
-			"/Users/dc/dev/shumi/chatU/app/packages/ribot",
-			"/Users/dc/dev/shumi/chatU/app/packages/ribot-editor/assets/brains",
-			"*code",
-			"*coffee",
-			"*styl",
-			"*jade",
-			"*js",
-			"*coffee",
-			"*code",
-			"*coffee",
-			"",
-			"*code",
-			"*coffee",
-			"coffee",
-			"/Users/dc/dev/shumi/chatU/app/packages/ribot-editor/assets",
-			"*coffee",
-			"",
-			"/Users/dc/dev/shumi/chatU/app/client/widgets",
-			"*styl",
-			"*",
-			"*coffee",
-			"",
-			"/Users/dc/dev/shumi/chatU/app/client/widgets",
-			"",
-			"*coffee",
-			"/Users/dc/dev/shumi/chatU/app/client/widgets",
-			"*styl",
-			"styl",
-			"",
-			"*coffee",
-			"coffee",
-			"",
-			"*coffee",
-			"",
-			"*",
-			"*styl",
-			"",
-			"*",
-			"*jade",
-			"*coffee",
-			"*jade",
-			"*coffee",
-			"*jade",
-			"*",
-			"*coffee",
-			"*",
-			"*scss",
-			"*jade",
-			"*coffee",
-			"",
-			"*js",
-			"*coffee",
-			"",
-			"/Users/dc/dev/shumi/chatU/app/client/widgets,*.coffee",
-			"/Users/dc/dev/shumi/chatU/app/client/widgets",
-			"*.coffee",
-			"*.css,",
-			"*css",
-			"*styl",
-			"*jade",
-			"*coffee",
-			"*js",
-			"*coffee",
-			"coffee",
-			"",
-			"coffee",
-			"",
-			"*rive",
-			"*styl",
-			"*coffee",
-			"*rive",
-			"*styl",
-			"",
-			"*.coffee",
-			"coffee",
-			"/Users/dc/dev/shumi/chatU/app/packages/ribot/data/proposal",
-			"/Users/dc/dev/shumi/chatU/app/packages/ribot/data/styleguide",
-			"",
-			"*.rive",
-			"*.coffee",
-			"*.rive",
-			"*.styl",
-			"*.style",
-			"*.coffee",
-			"*.styl",
-			"",
-			"*.coffee",
-			"/Users/dc/dev/shumi/chatU/app/packages/ribot/data",
-			"/Users/dc/dev/shumi/chatU/app/client/widgets",
-			"/Users/dc/dev/shumi/chatU/app/,*.styl",
-			"/Users/dc/dev/shumi/chatU/app/,*.coffee",
-			"/Users/dc/dev/shumi/chatU/app/,*.js",
-			"/Users/dc/dev/shumi/chatU/app/,*.css",
-			"/Users/dc/dev/shumi/chatU/app/,*.styl",
-			"/Users/dc/dev/shumi/chatU/app/client",
-			"/Users/dc/dev/shumi/chatU/client",
-			"/Users/dc/dev/shumi/chatU/,-.meteor/*",
-			"/Users/dc/dev/shumi/chatU/,-.meteor",
-			"/Users/dc/dev/shumi/chatU/",
-			"/Users/dc/dev/shumi/chatU/app/client/widgets",
-			"/Users/dc/dev/shumi/chatU/app/, *styl",
-			"/Users/dc/dev/shumi/chatU/app/, *coffee",
-			"/Users/dc/dev/shumi/chatU/app/",
-			"/Users/dc/dev/shumi/chatU/app/packages/ribot",
-			"/Users/dc/dev/shumi/chatU/app/packages/ribot/data/lost",
-			"/Users/dc/dev/shumi/chatU/,*styl",
-			"/Users/dc/dev/shumi/chatU/",
-			"/Users/dc/dev/shumi/chatU/app/client/widgets",
-			"/Users/dc/dev/shumi/chatU/app/,*.styl",
-			"/Users/dc/dev/shumi/chatU/app/",
-			"/Users/dc/dev/shumi/chatU/app/client/widgets",
-			"",
-			"/Users/dc/dev/shumi/chatU/app/client/widgets",
-			"/Users/dc/dev/shumi/chatU/app/packages/, *.rive",
-			"/Users/dc/dev/shumi/chatU/app/packages/"
-		]
-	},
-	"find_state":
-	{
-		"case_sensitive": false,
-		"find_history":
-		[
-			"cons",
-			"bonfireHeader",
-			"Utils",
-			"`",
-			"<a href",
-			"data/bonfires/basic-bonfires.js",
-			"bonfire",
-			"parseIn",
-			"status",
-			"stackLines",
-			"botname",
-			"envConfigs",
-			"dcsan",
-			"rooms",
-			"showConfig",
-			"botname",
-			"function where(collection, source) {\n  var arr = [];\n  // What's in a name?\n  k = Object.keys(source)[0]; // since we know only one \n  v = source[k];\n  console.log(\"match for:\", k, v);\n  var arr = collection.filter(function(a){\n    console.log(a);\n    return (a[k] === v);\n  });\n  return arr;\n}\n",
-			"ls.",
-			"wikiU",
-			"botzy",
-			"footer",
-			"help",
-			"rooms",
-			"RoomData",
-			"joinKnownRooms",
-			"rooms",
-			"makeInputFromString",
-			"rooms",
-			"makeInputFromString",
-			"message",
-			"makeMessageFromString",
-			"Utils.makeMessageFromString",
-			"mockInput",
-			"Utils",
-			"\"topics\"",
-			"AppConfig.botname",
-			"wikiLink",
-			"botna",
-			"getBotName",
-			"error",
-			"clog",
-			"dmLink",
-			"AppConfig.botname",
-			"RoomData",
-			"BOTNAME",
-			"BOT_APP_HOST",
-			"getBotName",
-			"joinKnownRooms",
-			"joinRoom",
-			"say",
-			"currentBot",
-			"RoomData",
-			"RoomData.rooms",
-			"RoomData.",
-			"RoomData",
-			"botname",
-			"botn",
-			"input.room",
-			"message.room",
-			"scan",
-			"listeTo",
-			"bot.say",
-			"say",
-			"GBot.say",
-			"say",
-			"expect",
-			"KBase.topicList",
-			"topicn",
-			"mainBot",
-			"GITTER_APP_REDIRECT_URL",
-			"\"lodash\"",
-			"join",
-			".log",
-			"clog",
-			"addToRoomList",
-			"hasAlreadyJoined",
-			"hasAl",
-			"assert",
-			"has already",
-			"has al",
-			"checkObject",
-			"'",
-			"stric",
-			"`",
-			"template",
-			"function(",
-			"commands",
-			"Utils",
-			"linki",
-			"function(",
-			"})\n",
-			"function(",
-			"function()",
-			"dmLink",
-			"function(",
-			"beau",
-			"assert",
-			"botCOmm",
-			"roomL",
-			"bothelp",
-			"parseI",
-			"checkThanks",
-			"msg.",
-			"makeMessageFromString",
-			"blob",
-			"message",
-			"text",
-			"findAnyReply",
-			"value",
-			"findAnyReply",
-			"parseInput",
-			"listenToRoom",
-			"joinKnownRooms",
-			"checkThanks",
-			"Utils.cls",
-			"sendReply",
-			"listenToRoom",
-			"getMessage",
-			"parseInput",
-			"findAnyReply",
-			"sendReply",
-			"findAnyReply",
-			"say",
-			"checkWiki",
-			"cleanTopic",
-			"hasAlreadyJoined",
-			"alreadyJoined",
-			"botComm"
-		],
-		"highlight": true,
-		"in_selection": false,
-		"preserve_case": false,
-		"regex": false,
-		"replace_history":
-		[
-			"cmd.",
-			"makeMessageFromString",
-			"input",
-			"makeInputFromString",
-			"TestHelper.makeMessageFromString",
-			"AppConfig.getBotName()",
-			"RoomData.rooms()",
-			"RoomData.rooms.",
-			"input.message.room",
-			"botname",
-			"\"",
-			"function (",
-			"});\n",
-			"function (",
-			"message.",
-			"Utils.makeMessageFromString",
-			"input",
-			"getAnnounceMessage",
-			"hasAlreadyJoined",
-			"alreadyJoined",
-			"isRoomInList",
-			"GBot.gitter",
-			"checkWiki",
-			"oneRoomData",
-			"name:",
-			"GBot",
-			"AppConfig",
-			"listname=",
-			"listname",
-			"stepNum",
-			".coffee\"",
-			".coffee",
-			"\"client",
-			"blankData",
-			"drills",
-			"drill",
-			"TaskLists",
-			"tiles",
-			"calcUrl",
-			"clog",
-			"dclib.userId()",
-			"gameOver",
-			"findTaskName",
-			"findOrCreate",
-			"ptask",
-			"@numSteps",
-			"checkpoint",
-			"namedStep",
-			"screenwords=",
-			"toonFont",
-			"tpl",
-			"pulseSize",
-			"bigPulse",
-			"totalpairs=4",
-			"screenword=5",
-			"&duration=30",
-			"totalpairs=3",
-			"DEFAULT_TOTAL_PAIRS",
-			"totalpairs",
-			"that",
-			"screenwords",
-			"screenWords",
-			"",
-			"fa-diamond",
-			"checkUserCommands",
-			"buildIsotope",
-			"Meteor",
-			"clog",
-			"buildGrid",
-			"backImage",
-			"bottomLine",
-			"tileNum",
-			"starBar",
-			"taskname",
-			"fixed",
-			"safeParams",
-			"gridQuery",
-			"obj.",
-			"Units",
-			"units",
-			"slideTiles",
-			"unit",
-			"days",
-			"chapters",
-			"questions",
-			"totalQuestions",
-			"@sprite.",
-			"@sprite",
-			"@data",
-			"@group",
-			"@state",
-			"\"0x",
-			"slabDefault",
-			"tiledata",
-			"@config",
-			"slab",
-			"Slab",
-			"slabs",
-			"Slab",
-			"slabs",
-			"slasb",
-			"lesson",
-			"task",
-			"numQuestions",
-			"userInput",
-			"input",
-			"Drills",
-			"skip",
-			"text",
-			"broadway",
-			"grammar",
-			"sizex",
-			"24",
-			"@clog",
-			"cardsRight",
-			"taskListLesson",
-			"/i)",
-			"text",
-			"witResponse",
-			"",
-			" ",
-			"",
-			"@import \"../layouts/shared/shared.styl\"",
-			"lastInput",
-			"userCards",
-			"SERVER_ENV",
-			"SERVERENV",
-			"botPlayer"
-		],
-		"reverse": false,
-		"show_context": false,
-		"use_buffer2": false,
-		"whole_word": false,
-		"wrap": true
-	},
-	"groups":
-	[
-		{
-			"sheets":
-			[
-			]
-		}
-	],
-	"incremental_find":
-	{
-		"height": 23.0
-	},
-	"input":
-	{
-		"height": 31.0
-	},
-	"layout":
-	{
-		"cells":
-		[
-			[
-				0,
-				0,
-				1,
-				1
-			]
-		],
-		"cols":
-		[
-			0.0,
-			1.0
-		],
-		"rows":
-		[
-			0.0,
-			1.0
-		]
-	},
-	"menu_visible": true,
-	"output.exec":
-	{
-		"height": 341.0
-	},
-	"output.find_results":
-	{
-		"height": 458.0
-	},
-	"pinned_build_system": "Packages/User/node.sublime-build",
-	"project": "nap.sublime-project",
-	"replace":
-	{
-		"height": 64.0
-	},
-	"save_all_on_build": true,
-	"select_file":
-	{
-		"height": 0.0,
-		"last_filter": "",
-		"selected_items":
-		[
-			[
-				"tod",
-				"nap/docs/TODO.txt"
-			],
-			[
-				"gb",
-				"nap/lib/bot/GBot.js"
-			],
-			[
-				"pm2",
-				"nap/bin/pm2-update.sh"
-			],
-			[
-				"bonfi",
-				"nap/lib/app/Bonfires.js"
-			],
-			[
-				"kba",
-				"nap/lib/bot/KBase.js"
-			],
-			[
-				"roomd",
-				"nap/data/RoomData.js"
-			],
-			[
-				"uti",
-				"nap/lib/utils/Utils.js"
-			],
-			[
-				"wiki",
-				"nap/lib/bot/cmds/wiki.js"
-			],
-			[
-				"depl",
-				"nap/bin/deploy.sh"
-			],
-			[
-				"deplo",
-				"nap/bin/deploy.sh"
-			],
-			[
-				"gbo",
-				"nap/lib/bot/GBot.js"
-			],
-			[
-				"test",
-				"nap/test/TestHelper.js"
-			],
-			[
-				"bonf",
-				"nap/lib/app/Bonfires.js"
-			],
-			[
-				"kbas",
-				"nap/lib/bot/KBase.js"
-			],
-			[
-				"util",
-				"nap/lib/utils/Utils.js"
-			],
-			[
-				"run",
-				"nap/bin/run-bothelp.sh"
-			],
-			[
-				"pack",
-				"nap/package.json"
-			],
-			[
-				"text",
-				"nap/lib/utils/TextLib.js"
-			],
-			[
-				"basic",
-				"nap/data/seed/challenges/basic-bonfires.json"
-			],
-			[
-				"bon",
-				"nap/data/seed/challenges/basic-bonfires.json"
-			],
-			[
-				"botco",
-				"nap/lib/bot/BotCommands.js"
-			],
-			[
-				"app.",
-				"nap/app.js"
-			],
-			[
-				"about",
-				"nap/lib/bot/cmds/about.js"
-			],
-			[
-				"utils",
-				"nap/lib/utils/Utils.js"
-			],
-			[
-				"room",
-				"nap/data/RoomData.js"
-			],
-			[
-				"http",
-				"nap/lib/utils/HttpWrap.js"
-			],
-			[
-				"appc",
-				"nap/config/AppConfig.js"
-			],
-			[
-				"both",
-				"nap/bin/credentials-bothelp.sh"
-			],
-			[
-				"botc",
-				"nap/lib/bot/BotCommands.js"
-			],
-			[
-				"demob",
-				"nap/bin/credentials-demobot.sh"
-			],
-			[
-				"read",
-				"nap/README.md"
-			],
-			[
-				"crebo",
-				"nap/bin/credentials-bothelp.sh"
-			],
-			[
-				"step",
-				"nap/bin/step-debug.sh"
-			],
-			[
-				"rooms.",
-				"nap/views/rooms.jade"
-			],
-			[
-				"route",
-				"nap/lib/app/routes.js"
-			],
-			[
-				"cred",
-				"nap/bin/credentials-demobot.sh"
-			],
-			[
-				"appcon",
-				"nap/config/AppConfig.js"
-			],
-			[
-				"update.",
-				"nap/lib/bot/cmds/update.js"
-			],
-			[
-				"forc",
-				"nap/bin/force-update.sh"
-			],
-			[
-				"",
-				"nap/lib/bot/BotCommands.js"
-			],
-			[
-				"tha",
-				"nap/lib/bot/cmds/thanks.js"
-			],
-			[
-				"abo",
-				"nap/lib/bot/cmds/about.js"
-			],
-			[
-				"than",
-				"nap/lib/bot/cmds/thanks.js"
-			],
-			[
-				"app",
-				"nap/app.js"
-			],
-			[
-				"httw",
-				"nap/test/HttpWrapSpec.js"
-			],
-			[
-				"httpw",
-				"nap/test/HttpWrapSpec.js"
-			],
-			[
-				"romd",
-				"nap/data/RoomData.js"
-			],
-			[
-				"botcom",
-				"nap/lib/bot/BotCommands.js"
-			],
-			[
-				"thanks",
-				"nap/lib/bot/cmds/thanks.js"
-			],
-			[
-				"wikis",
-				"nap/test/WikiSpec.js"
-			],
-			[
-				"searc",
-				"nap/test/SearchSpec.js"
-			],
-			[
-				"ioc",
-				"nap/test/IOSpec.js"
-			],
-			[
-				"pars",
-				"nap/test/ParserSpec.js"
-			],
-			[
-				"io",
-				"nap/test/IOSpec.js"
-			],
-			[
-				"gbots",
-				"nap/test/GBotSpec.js"
-			],
-			[
-				"gbot",
-				"nap/lib/bot/GBot.js"
-			],
-			[
-				"testh",
-				"nap/test/TestHelper.js"
-			],
-			[
-				"botcomm",
-				"nap/lib/bot/BotCommands.js"
-			],
-			[
-				"ut",
-				"nap/lib/utils/Utils.js"
-			],
-			[
-				"g",
-				"nap/lib/bot/GBot.js"
-			],
-			[
-				"gbtosp",
-				"nap/test/GBotSpec.js"
-			],
-			[
-				"tes",
-				"nap/bin/test.sh"
-			],
-			[
-				"p2",
-				"nap/bin/pm2-run.sh"
-			],
-			[
-				"tes.",
-				"nap/bin/test.sh"
-			],
-			[
-				"appcons",
-				"nap/test/AppConfigSpec.js"
-			],
-			[
-				"thank",
-				"nap/lib/bot/cmds/thanks.js"
-			],
-			[
-				"rooms",
-				"nap/lib/app/Rooms.js"
-			],
-			[
-				"to",
-				"nap/docs/TODO.txt"
-			],
-			[
-				"appco",
-				"nap/config/AppConfig.js"
-			],
-			[
-				"cur",
-				"nap/bin/camperbot-run.sh"
-			],
-			[
-				"cam",
-				"nap/bin/camperbot-run.sh"
-			],
-			[
-				"ios",
-				"nap/test/IOSpec.js"
-			],
-			[
-				"roos",
-				"nap/test/RoomsSpec.js"
-			],
-			[
-				"comma",
-				"nap/test/CommandsSpec.js"
-			],
-			[
-				"abou",
-				"nap/lib/bot/cmds/about.js"
-			],
-			[
-				"dev",
-				"nap/bin/run-dev-bothelp.sh"
-			],
-			[
-				"pac",
-				"nap/package.json"
-			],
-			[
-				"cre",
-				"nap/bin/credentials-example.sh"
-			],
-			[
-				"rout",
-				"nap/lib/app/routes.js"
-			],
-			[
-				"deb",
-				"nap/bin/debug.sh"
-			],
-			[
-				"gitter",
-				"nap/lib/gitter/restApi.js"
-			],
-			[
-				"gitterh",
-				"nap/lib/gitter/GitterHelper.js"
-			],
-			[
-				"reg",
-				"test/RegexSpec.js"
-			],
-			[
-				"rege",
-				"test/RegexSpec.js"
-			],
-			[
-				"regexsp",
-				"test/RegexSpec.js"
-			],
-			[
-				"upd",
-				"bin/update-wiki.sh"
-			],
-			[
-				"bots",
-				"test/GBotSpec.js"
-			],
-			[
-				"kb",
-				"lib/bot/KBase.js"
-			],
-			[
-				"te",
-				"bin/test.sh"
-			],
-			[
-				"ques",
-				"docs/questions.txt"
-			],
-			[
-				"bot",
-				"lib/bot/GBot.js"
-			],
-			[
-				"nav",
-				"views/nav.jade"
-			],
-			[
-				"roo",
-				"lib/app/Rooms.js"
-			],
-			[
-				"ap",
-				"app.js"
-			],
-			[
-				"routes",
-				"lib/app/routes.js"
-			],
-			[
-				"botsp",
-				"test/BotSpec.js"
-			],
-			[
-				"pas",
-				"lib/gitter/passportModule.js"
-			],
-			[
-				"todo",
-				"docs/TODO.txt"
-			],
-			[
-				"pass",
-				"lib/gitter/passportModule.js"
-			],
-			[
-				"run.",
-				"bin/run.sh"
-			],
-			[
-				"home",
-				"views/home.jade"
-			],
-			[
-				"routess",
-				"test/routesSpec.js"
-			],
-			[
-				"rou",
-				"lib/app/routes.js"
-			],
-			[
-				"quest",
-				"docs/questions.txt"
-			],
-			[
-				"topics",
-				"nap/data/topics.js"
-			],
-			[
-				"passp",
-				"lib/gitter/passportLogin.js"
-			],
-			[
-				"msgp",
-				"app/packages/streamer/lib/MsgParser.coffee"
-			],
-			[
-				"font",
-				"app/client/layouts/shared/font-loader.js"
-			],
-			[
-				"playerac",
-				"app/packages/mpgames/lib/PlayerActions.coffee"
-			],
-			[
-				"msgpar",
-				"app/packages/streamer/lib/MsgParser.coffee"
-			],
-			[
-				"playert",
-				"app/packages/mpgames/lib/PlayerTasks.coffee"
-			],
-			[
-				"taskli",
-				"app/client/widgets/tasklist.jade"
-			],
-			[
-				"stream",
-				"app/packages/streamer/client/stream/stream.coffee"
-			],
-			[
-				"dcli",
-				"package-dev/dclib/lib/dclib.coffee"
-			],
-			[
-				"story",
-				"app/packages/u-menu/client/views/storyTop.coffee"
-			],
-			[
-				"widget",
-				"app/client/widgets/widgets.styl"
-			],
-			[
-				"questi",
-				"app/client/widgets/question.styl"
-			],
-			[
-				"slider",
-				"app/client/widgets/slider.jade"
-			],
-			[
-				"slider.j",
-				"app/client/widgets/slider.jade"
-			],
-			[
-				"shared.",
-				"app/client/layouts/shared/shared.styl"
-			],
-			[
-				"narra",
-				"app/client/widgets/narrator.styl"
-			],
-			[
-				"exam",
-				"app/client/widgets/example.styl"
-			],
-			[
-				"thunk",
-				"app/packages/wit/server/Thunk.coffee"
-			],
-			[
-				"cst",
-				"app/packages/streamer/lib/CStreamer.coffee"
-			],
-			[
-				"local",
-				"app/private/config/local.json"
-			],
-			[
-				"stream.c",
-				"app/packages/streamer/client/stream/stream.coffee"
-			],
-			[
-				"msgpa",
-				"app/packages/streamer/lib/MsgParser.coffee"
-			],
-			[
-				"stre",
-				"app/packages/streamer/client/stream/stream.coffee"
-			]
-		],
-		"width": 0.0
-	},
-	"select_project":
-	{
-		"height": 500.0,
-		"last_filter": "",
-		"selected_items":
-		[
-			[
-				"",
-				"~/dev/shumi/chatU/docs/chatU.sublime-project"
-			]
-		],
-		"width": 380.0
-	},
-	"select_symbol":
-	{
-		"height": 392.0,
-		"last_filter": "",
-		"selected_items":
-		[
-			[
-				"",
-				"BuildAndroid"
-			]
-		],
-		"width": 602.0
-	},
-	"selected_group": 0,
-	"settings":
-	{
-	},
-	"show_minimap": false,
-	"show_open_files": false,
-	"show_tabs": true,
-	"side_bar_visible": true,
-	"side_bar_width": 216.0,
-	"status_bar_visible": true,
-	"template_settings":
-	{
-	}
-}
diff --git a/nap/docs/questions.txt b/nap/docs/questions.txt
deleted file mode 100644
index bb3cb5a..0000000
--- a/nap/docs/questions.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-# questions
-
-passing objects down into modules
-eg global "logger" module
-
-using ES6 by default?
-what about client?
-
-good logger module
-shows line nums etc.
-
-simple testing of a node app and classes
-
-free license of editor?
-
-## variable names
-mixing Objects and plain data
-using Obj as suffix?
-eg  topic="room"
-    topicObj = { name: room}
-
-## content
-
-what content to expose through the bot?
-
--------------------------------------------------------------
-# Tech
-
-CI tool used?
diff --git a/nap/dot-EXAMPLE.env b/nap/dot-EXAMPLE.env
deleted file mode 100644
index 76457a6..0000000
--- a/nap/dot-EXAMPLE.env
+++ /dev/null
@@ -1,11 +0,0 @@
-# make a copy of this file and rename it to "dot.env"
-SERVER_ENV=demobot
-GITTER_USER_TOKEN=1ac342045f5a57d99fe537e58da78f6cba94f7db
-FCC_API_KEY=TESTAPIKEY
-
-# get these from oauth later
-GITTER_APP_KEY=63ece8ac0eeed9b17b1cc9867f65d4857ec6e5fc
-GITTER_APP_SECRET=9026e3b3a74357035ee15a9591f31b2de5cfd3a6
-GITTER_APP_REDIRECT_URL=http://localhost:7891/login/callback
-LOG_LEVEL=10
-PORT=7891
diff --git a/nap/gulpfile.js b/nap/gulpfile.js
deleted file mode 100644
index 6ec5145..0000000
--- a/nap/gulpfile.js
+++ /dev/null
@@ -1,33 +0,0 @@
-const gulp = require('gulp'),
-      eslint = require('gulp-eslint'),
-      tape = require('gulp-tape'),
-      faucet = require('faucet'),
-      env = require('gulp-env');
-
-require('dotenv').config({path: 'dot.env'});
-
-gulp.task('lint', () => {
-    return gulp.src(['**/*.js', '!node_modules/**'])
-        .pipe(eslint())
-        .pipe(eslint.format())
-        .pipe(eslint.failAfterError());
-});
-
-gulp.task('test', () => {
-  return gulp.src('test/*.spec.js')
-    .pipe(tape({
-      reporter: faucet()
-    }));
-});
-
-gulp.task('set-env', () => {
-  env({
-    vars: {
-      SERVER_ENV: 'test'
-    }
-  });
-});
-
-gulp.task('default', ['set-env', 'test'], () => {
-
-});
diff --git a/nap/lib/app/Bonfires.js b/nap/lib/app/Bonfires.js
deleted file mode 100644
index 321d8ad..0000000
--- a/nap/lib/app/Bonfires.js
+++ /dev/null
@@ -1,270 +0,0 @@
-'use strict';
-
-const fs = require('fs'),
-      Utils = require('../../lib/utils/Utils'),
-      InputWrap = require('../../lib/bot/InputWrap'),
-      KBase = require('../../lib/bot/KBase'),
-      TextLib = require('../../lib/utils/TextLib');
-
-const newline = '\n';
-
-const Bonfires = {
-  data: null,
-  fixed: {
-    hintWarning: '## :construction: ** After this are possible spoiler hints.' +
-      '**\nMake sure you\'ve tried to hard to solve it yourself before ' +
-      'proceeding. :construction:',
-    menu: '\n- `bonfire info` for more info ' +
-      '\n- `bonfire links` ' +
-      '\n- `bonfire script` for the script',
-    askName: 'give the name of the bonfire and I\'ll try to look it up!',
-    setName: 'Set a bonfire to talk about with `bonfire name`',
-    comingSoon: 'Coming Soon! We\'re working on it!',
-    nameHint: 'no, type part of the name of the bonfire! eg `bonfire roman`',
-    alert: '\n - :construction: **spoiler alert** :construction:',
-
-    bfRoomLink: function(name) {
-      return '[spoiler chatroom](https://gitter.im/camperbot/' + name + ')';
-    },
-    footer: function() {
-      return '\n\n> more info:&nbsp;&nbsp;`bf details` | ' +
-        '`bf links` | `hint` ';
-    },
-    reminder: function(name) {
-      return 'we\'re talking about bonfire :fire: ' + name;
-    },
-    cantFind: function(name) {
-      return '> Sorry, can\'t find a bonfire called ' + name +
-        '. [ [Check the map?]' +
-        '(http://www.freecodecamp.com/map#Basic-Algorithm-Scripting) ]';
-    },
-    roomLink: function(name) {
-      return ':construction: **spoiler alert** ' + this.bfRoomLink(name) +
-        ' :arrow_forward:';
-    },
-    goToBonfireRoom: function(bf) {
-      const link = Utils.linkify(bf.dashedName,
-                                 'camperbot', 'Bonfire\'s Custom Room');
-      return '> :construction: Spoilers are only in the ' + link +
-        ' :point_right: ';
-    },
-    pleaseContribute: function(bf) {
-      const link = Utils.linkify(bf.dashedName,
-                                 'wiki', 'Bonfire\'s Wiki Hints Page');
-      return 'These hints depend on people like you! ' +
-        'Please add to this :point_right: ' + link;
-    }
-  },
-
-  load: function() {
-    // Get document, or throw exception on error
-    try {
-      const bfDataFiles = [
-        'basic-bonfires.json',
-        'intermediate-bonfires.json',
-        'advanced-bonfires.json',
-        'expert-bonfires.json'
-      ];
-
-      let allData = {
-        challenges: []
-      };
-
-      bfDataFiles.map(fname => {
-        const raw = fs.readFileSync('./data/seed/challenges/' + fname, 'utf8'),
-              thisData = JSON.parse(raw);
-        allData.challenges = allData.challenges.concat(thisData.challenges);
-      });
-
-      this.data = allData;
-
-      Bonfires.loadWikiHints();
-
-      // TODO - convert the embedded HTML to markdown tags
-      // this.data = Utils.toMarkdown(this.data);
-    } catch (e) {
-      Utils.error('can\'t load bonfire data', e);
-    }
-    return this;
-  },
-
-  loadWikiHints: function() {
-    this.data.challenges = this.data.challenges.map(bf => {
-      bf.hints = [Bonfires.fixed.hintWarning];
-      const wikiHints = KBase.getWikiHints(bf.dashedName);
-      if (wikiHints) {
-        bf.hints = bf.hints.concat(wikiHints);
-      } else {
-        Utils.tlog('bf.wikiHints not found', bf.dashedName);
-      }
-      return bf;
-    });
-  },
-
-  findBonfire: function(bfName) {
-    let flag;
-    bfName = TextLib.dashedName(bfName);
-    const bfs = this.data.challenges.filter(item => {
-      flag = (item.dashedName.indexOf(bfName) >= 0);
-      return flag;
-    });
-    const bf = bfs[0];
-    if (!bf) {
-      Utils.warn('can\'t find bonfire for ' + bfName);
-      return null;
-    } else {
-      return bf;
-    }
-  },
-
-
-  getNextHint: function(bonfire, input) {
-    let hint,
-        hintNum = parseInt(input.params, 10);
-
-    if (isNaN(hintNum)) {
-      hintNum = bonfire.currentHint || 0;
-    }
-    hint = bonfire.hints[hintNum];
-
-    if (hintNum < bonfire.hints.length) {
-      const hintCounter = hintNum + 1;
-      hint = '`hint [' + hintCounter + '/' +
-        bonfire.hints.length + ']`\n## ' + hint;
-      bonfire.currentHint = hintNum + 1;
-      hint += this.wikiLinkFooter(bonfire);
-      return hint;
-    } else {
-      bonfire.currentHint = 0;
-      return Bonfires.fixed.pleaseContribute(bonfire);
-    }
-  },
-
-  toMarkdown: function() {
-    this.data.challenges = this.data.challenges.map(item => {
-      item.description = item.description.map(desc => Utils.toMarkdown(desc));
-    });
-  },
-
-  allDashedNames: function() {
-    return this.fieldList('dashedName');
-  },
-
-  allNames: function() {
-    return this.fieldList('name');
-  },
-
-  fieldList: function(field) {
-    return this.data.challenges.map(item => item[field]);
-  },
-
-  fromInput: function(input) {
-    const roomName = InputWrap.roomShortName(input),
-          bf = this.findBonfire(roomName);
-    Utils.checkNotNull(bf, 'cant find bonfire for ' + roomName);
-    return (bf);
-  },
-
-
-  wikiLinkFooter: function(bonfire) {
-    let str = '\n\n> type `hint` for next hint  :pencil: ';
-    const text = '[Contribute at the FCC Wiki]';
-
-    return str + Utils.linkify(bonfire.dashedName, 'wiki', text);
-  },
-
-  getDescription: function(bonfire) {
-    return bonfire.description.join('\n');
-  },
-
-  getLinks: function(bonfire) {
-    return 'links: \n' + Utils.makeMdnLinks(bonfire.MDNlinks, 'mdn');
-  },
-
-  getLinksFromInput: function(input) {
-    const bf = Bonfires.fromInput(input);
-
-    if (!bf || !bf.MDNlinks) {
-      const msg = ('no links found for: ' + input.params);
-      Utils.error('Bonfires>', msg, bf);
-      return msg;
-    }
-    return this.getLinks(bf);
-  },
-
-  getSeed: function(bonfire) {
-    const seed = bonfire.challengeSeed.join('\n');
-    return '```js ' + newline + seed + '```';
-  },
-
-  getChallengeSeedFromInput: function(input) {
-    const bf = Bonfires.fromInput(input);
-
-    if (!bf || !bf.challengeSeed) {
-      const msg = ('no challengeSeed found for: ' + input.params);
-      Utils.error('Bonfires>', msg, bf);
-      return msg;
-    }
-
-    const seed = bf.challengeSeed.join('\n');
-
-    return '```js ' + newline + seed + '```';
-  },
-
-  // methods that describe a bonfire that accept/expect a bonfire parameter
-  bonfireInfo: function(bonfire) {
-    if (!bonfire) {
-      Utils.error('Bonfires.bonfireInfo', 'no bonfire');
-    }
-
-    return this.bonfireHeader(bonfire) + newline +
-      this.bonfireScript(bonfire) + newline +
-      this.bonfireDescription(bonfire) + newline +
-      newline + this.fixed.footer(bonfire.dashedName);
-  },
-
-  bonfireStatus: function(bonfire) {
-    return '\n- hints: ' + bonfire.hints.length;
-  },
-
-  bonfireHeader: function(bonfire) {
-    return '## :fire:' + TextLib.mdLink(bonfire.name,
-      'www.freecodecamp.com/challenges/' + bonfire.dashedName) + ' :link:';
-  },
-
-  bonfireDetails: function(bonfire) {
-    return this.bonfireHeader(bonfire) + newline +
-      this.bonfireScript(bonfire) + newline +
-      this.bonfireDescription(bonfire, 50) + newline +
-      this.bonfireLinks(bonfire);
-  },
-
-  bonfireDescription: function(bonfire, lines) {
-    if (lines) {
-      const desc = bonfire.description.slice(0, lines);
-      return desc.join('\n');
-    } else {
-      return bonfire.description[0];
-    }
-  },
-
-  bonfireLinks: function(bonfire) {
-    return Bonfires.getLinks(bonfire);
-  },
-
-  bonfireScript: function(bonfire) {
-    return Bonfires.getSeed(bonfire);
-  },
-
-  bonfireWiki: function() {
-    const link = Utils.linkify(this.currentBonfire.name);
-    return '> :fire: wiki: ' + link;
-  }
-};
-
-// ideally KBase should be loaded first,
-// though in theory it will load itself before data is needed ...?
-
-Bonfires.load();
-
-module.exports = Bonfires;
diff --git a/nap/lib/app/Rooms.js b/nap/lib/app/Rooms.js
deleted file mode 100644
index 9ec6202..0000000
--- a/nap/lib/app/Rooms.js
+++ /dev/null
@@ -1,50 +0,0 @@
-'use strict';
-
-const RoomData = require('../../data/RoomData'),
-      _ = require('lodash'),
-      Utils = require('../utils/Utils');
-
-const Rooms = {
-
-  findByTopic: function(topic) {
-    const rooms = RoomData.rooms().filter(rm => {
-      const topics = rm.topics;
-      if (topics && topics.indexOf(topic) !== -1) {
-        return true;
-      }
-      return false;
-    });
-
-    return (this.checkRoom(rooms[0], 'findByTopic', topic));
-  },
-
-  findByName: function(name) {
-    const room = _.findWhere(RoomData.rooms(), { name: name });
-    if (room) {
-      return room;
-    }
-    Utils.error('cant find room name:', name);
-  },
-
-  isBonfire: function(name) {
-    const room = this.findByName(name);
-    if (room) {
-      return room.isBonfire;
-    }
-    return false;
-  },
-
-  names: function() {
-    this.roomList = RoomData.rooms().map(room => room.name);
-    return this.roomList;
-  },
-
-  checkRoom: function(room, how, tag) {
-    if (room) {
-      return room;
-    }
-    Utils.error('Rooms.checkRoom> failed', how, tag);
-  }
-};
-
-module.exports = Rooms;
diff --git a/nap/lib/app/routes.js b/nap/lib/app/routes.js
deleted file mode 100644
index 8410b57..0000000
--- a/nap/lib/app/routes.js
+++ /dev/null
@@ -1,151 +0,0 @@
-'use strict';
-
-// TODO - FIXME this seems a bit hacky?
-// should be a passed in object?
-// but needed for tests too so want this class self contained
-
-const AppConfig = require('../../config/AppConfig'),
-      Rooms = require('../../lib/app/Rooms.js'),
-      Utils = require('../../lib/utils/Utils'),
-      Bonfires = require('./Bonfires'),
-      RoomData = require('../../data/RoomData'),
-      GitterHelper = require('../../lib/gitter/GitterHelper');
-
-function clog(msg, obj) {
-  Utils.clog('Routes>', msg, obj);
-}
-
-const Router = {
-  // query can include a room or a topic
-  findRedirect: function(query) {
-    Utils.isObject(query);
-    query.org = AppConfig.getOrg();
-
-    if (query.dm === 'y') {
-      query.room = query.room || AppConfig.getBotName();
-    }
-
-    if (query.room) {
-      // need to make a roomObj for other handling
-      query.roomObj = {
-        title: query.room,
-        name: query.room
-      };
-    } else if (query.topic) {
-      query.roomObj = Rooms.findByTopic(query.topic);
-    }
-    Utils.isObject(query.roomObj, 'could not find room object');
-    query.url = 'https://gitter.im/' + query.roomObj.name;
-    clog('findRedirect:', query);
-    return query;
-  },
-
-  init: function(app, gbot, passport) {
-    Router.gbot = gbot;
-    const that = this;
-
-    app.get('/test', (req, res) => {
-      res.send('test');
-    });
-
-    app.get('/go', (req, res) => {
-      const redir = that.findRedirect(req.query);
-      gbot.announce(redir);
-      res.redirect(redir.url);
-    });
-
-    app.get('/api/v1/msg', (req, res) => {
-      const redir = that.findRedirect(req.query);
-      gbot.announce(redir);
-      res.send('OK');
-    });
-
-    app.get('/login', passport.authenticate('oauth2'));
-
-    app.get('/login/callback',
-      passport.authenticate('oauth2', {
-        successRedirect: '/home',
-        failureRedirect: '/'
-      })
-    );
-
-    app.get('/logout', (req, res) => {
-      req.session.destroy();
-      res.redirect('/');
-    });
-
-    app.get('/', (req, res) => {
-      res.render('landing');
-    });
-
-    // after login home show token
-    app.get('/home2', (req, res) => {
-      if (!req.user) {
-        return res.redirect('/');
-      }
-
-      res.render('home', {
-        user: req.user,
-        sessionToken: req.session.token,
-        rooms: []
-      });
-    });
-
-
-    app.get('/rooms', (req, res) => {
-      // for now force login so we dont get webspammed by crawlers
-      if (!req.user) {
-        return res.redirect('/');
-      }
-      console.log('req.user', req.user);
-
-      const rooms = RoomData.rooms('camperbot').filter(rm => {
-        return rm.isBonfire;
-      });
-      console.log(rooms);
-
-      res.render('rooms', {
-        user: req.user,
-        who: AppConfig.who(req),
-        token: req.session.token,
-        rooms: rooms,
-        bonfires: Bonfires.data.challenges,
-        topicDmUri: AppConfig.topicDmUri()
-      });
-    });
-
-    app.get('/rooms/update', (req, res) => {
-      Router.gbot.scanRooms(req.user, req.session.token);
-      res.redirect('/home');
-    });
-
-    app.get('/home', (req, res) => {
-      if (!req.user) {
-        return res.redirect('/');
-      }
-
-      GitterHelper.fetchRooms(req.user, req.session.token, (err, rooms) => {
-        if (err) {
-          return res.send(500);
-        }
-        const blob = {
-          user: req.user,
-          token: req.session.token,
-          rooms: rooms,
-          topicDmUri: AppConfig.topicDmUri()
-        };
-        clog('rooms.blob', blob);
-        res.render('home', blob);
-      });
-    });
-
-    // Alive Status - returns 200/OK on GET
-    app.get('/status', (req, res) => {
-      // To disable etag/cache/304 response
-      req.method = 'NONE';
-      res.status(200).send('OK');
-    });
-  }
-};
-
-module.exports = Router;
diff --git a/nap/lib/bot/BotCommands.js b/nap/lib/bot/BotCommands.js
deleted file mode 100644
index 904604b..0000000
--- a/nap/lib/bot/BotCommands.js
+++ /dev/null
@@ -1,204 +0,0 @@
-'use strict';
-
-const KBase = require('../bot/KBase'),
-      Utils = require('../../lib/utils/Utils'),
-      AppConfig = require('../../config/AppConfig'),
-      InputWrap = require('../bot/InputWrap'),
-      _ = require('lodash'),
-      stringy = require('stringy');
-
-const newline = '\n';
-
-const BotCommands = {
-  isCommand: function(input) {
-    let res;
-
-    const cmds = BotCommands.cmdList.filter(c => {
-      return (c === input.keyword);
-    });
-
-    const one = cmds[0];
-    if (one) {
-      res = true;
-    } else {
-      res = false;
-      Utils.warn('isCommand', 'not command', input);
-      Utils.warn('isCommand',
-        '[ isCommand: ' + input.keyword + ' one: ' + one + ' res: ' + res );
-    }
-    return res;
-  },
-
-  cbot: function(input, bot) {
-    switch (input.params) {
-      case 'version':
-        return this.botversion(input, bot);
-      case 'status':
-        Utils.log('input', input);
-        const status = this.botstatus(input, bot);
-        Utils.clog('status', status);
-        return status;
-      default:
-        return 'you called?';
-    }
-  },
-
-  // very simple example function showing how to parse a message and respond
-  // 'echo' is already a botCommand
-  echo: function(input) {
-    const username = input.message.model.fromUser.username;
-    return '@' + username + ' said: ' + input.message.model.text;
-  },
-
-  echojson: function(input) {
-    // avoid circular refs
-    const jsonString = stringy.stringify(input);
-    console.log(jsonString);
-    const safeObj = JSON.parse(jsonString);
-    console.log(safeObj);
-    const pretty = JSON.stringify(safeObj, null, 2);
-
-    return '```json' + pretty + '```';
-  },
-
-  botversion: function() {
-    return 'botVersion: ' + AppConfig.botVersion;
-  },
-
-  botstatus: function() {
-    return 'All bot systems are go!  \n' + this.botversion() + newline +
-      this.botenv() + newline + 'botname: ' + AppConfig.getBotName() + newline;
-  },
-
-  botenv: function() {
-    return 'env: ' + AppConfig.serverEnv;
-  },
-
-  archive: function(input) {
-    const roomName = input.message.room.name,
-          shortName = InputWrap.roomShortName(input),
-          roomUri = AppConfig.gitterHost + roomName + '/archives/',
-          timeStamp = Utils.timeStamp('yesterday');
-
-    return 'Archives for **' + shortName + '**' + newline +
-      '\n- [All Time](' + roomUri + 'all)' +
-      '\n- [Yesterday](' + roomUri + timeStamp + ')';
-  },
-
-  init: function(bot) {
-    // TODO - FIXME this is sketchy storing references like a global
-    // called from the bot where we don't always have an instance
-    BotCommands.bot = bot;
-  },
-
-  tooNoisy: function() {
-    // if this.room.name
-    return false;
-  },
-
-  // help on its own we return `help bothelp`
-  help: function(input, bot) {
-    if (this.tooNoisy(input, bot)) {
-      return null;
-    }
-
-    if (input.params) {
-      return this.wiki(input, bot);
-    } else {
-      const keyword = 'camperbot',
-            topicData = KBase.getTopicData(keyword);
-      return topicData.shortData + this.wikiFooter(keyword);
-    }
-  },
-
-  menu: function() {
-    return 'type help for a list of things the bot can do';
-  },
-
-  // TODO - sort alphabetically
-  rooms: function() {
-    return '## rooms\nSee all the FreeCodeCamp rooms at ' +
-      '[gitter.im/FreeCodeCamp/rooms](https://gitter.im/orgs/FreeCodeCamp/' +
-      'rooms)\nOr check [this wiki article](https://github.com/freecodecamp/' +
-      'freecodecamp/wiki/official-free-code-camp-chat-rooms) for a shortlist';
-  },
-
-  find: function(input, bot) {
-    const shortList = KBase.getTopicsAsList(input.params);
-
-    bot.context = {
-        state: 'finding',
-        commands: shortList.commands
-    };
-
-    const str = 'find **' + input.params + '**\n' + shortList;
-    bot.makeListOptions(str);
-    return str;
-  },
-
-  commands: function() {
-    return '## commands:\n- ' + BotCommands.cmdList.join('\n- ');
-  },
-
-  // TODO - FIXME this isn't working it seems
-  // rejoin: function (input, bot) {
-  //     clog('GBot', GBot);
-  //     BotCommands.bot.scanRooms();
-  //     return 'rejoined';
-  // },
-
-  music: function() {
-    return '## Music!\n http://musare.com/';
-  },
-
-  announce: function(input) {
-    const parts = input.params.split(' '),
-          roomName = parts[0],
-          text = parts.join(' ');
-    this.bot.sayToRoom(text, roomName);
-  },
-
-  rollem: function(input) {
-    const fromUser = '@' + input.message.model.fromUser.username;
-    return fromUser + ' says enjoy!' +
-      'https://www.youtube.com/watch?v=dQw4w9WgXcQ';
-  },
-
-  camperCount: function() {
-    return 'WIP camperCount';
-  },
-
-  welcome: function(input) {
-    if (input.params && input.params.match(/world/i)) {
-      return '## welcome to FreeCodeCamp @' +
-        input.message.model.fromUser.username + '!';
-    }
-  },
-
-  hello: function(input, bot) {
-    return (this.welcome(input, bot) );
-  }
-};
-
-
-// TODO - iterate and read all files in /cmds
-const wiki = require('./cmds/wiki'),
-      thanks = require('./cmds/thanks'),
-      update = require('./cmds/update'),
-      bonfire = require('./cmds/bonfire');
-
-_.merge(BotCommands, wiki, thanks, update, bonfire);
-
-// aliases
-BotCommands.explain = BotCommands.wiki;
-BotCommands.bot = BotCommands.wiki;
-BotCommands.hi = BotCommands.welcome;
-BotCommands.index = BotCommands.topics;
-BotCommands.thank = BotCommands.thanks;
-BotCommands.log = BotCommands.archive;
-BotCommands.archives = BotCommands.archive;
-
-// TODO - some of these should be filtered/as private
-BotCommands.cmdList = Object.keys(BotCommands);
-
-module.exports = BotCommands;
diff --git a/nap/lib/bot/GBot.js b/nap/lib/bot/GBot.js
deleted file mode 100644
index 5664aa2..0000000
--- a/nap/lib/bot/GBot.js
+++ /dev/null
@@ -1,350 +0,0 @@
-'use strict';
-
-const AppConfig = require('../../config/AppConfig'),
-      RoomData = require('../../data/RoomData'),
-      Utils = require('../../lib/utils/Utils'),
-      KBase = require('../../lib/bot/KBase'),
-      BotCommands = require('../../lib/bot/BotCommands'),
-      Bonfires = require('../app/Bonfires'),
-      Gitter = require('node-gitter'),
-      GitterHelper = require('../../lib/gitter/GitterHelper'),
-      RoomMessages = require('../../data/rooms/RoomMessages');
-
-function clog(msg, obj) {
-    Utils.clog('GBot>', msg, obj);
-}
-
-let apiWait = 0;
-let apiDelay = 1000;
-
-const GBot = {
-
-  init: function() {
-    // TODO refresh and add oneToOne rooms
-    KBase.initSync();
-    this.roomList = [];
-    this.listReplyOptions = [];
-    this.gitter = new Gitter(AppConfig.token);
-    this.joinKnownRooms();
-
-    // listen to other rooms for 1:1
-    if (AppConfig.supportDmRooms) {
-      this.gitter.currentUser().then(user => {
-        this.scanRooms(user, AppConfig.token);
-      }, err => {
-        Utils.error('GBot.currentUser>', 'failed', err);
-      });
-    }
-    BotCommands.init(this);
-  },
-
-  getName: function() {
-    return AppConfig.botlist[0];
-  },
-
-  // listen to a known room
-  // does a check to see if not already joined according to internal data
-  listenToRoom: function(room) {
-    if (this.addToRoomList(room) === false) {
-      return;
-    }
-
-    const chats = room.streaming().chatMessages();
-
-    // The 'chatMessages' event is emitted on each new message
-    chats.on('chatMessages', message => {
-      if (message.operation !== 'create') {
-        return;
-      }
-      if (GBot.isBot(message.model.fromUser.username)) {
-        return;
-      }
-
-      message.room = room;
-      GBot.handleReply(message);
-    });
-  },
-
-  handleReply: function(message) {
-    clog(message.room.uri + ' @' + message.model.fromUser.username + ':');
-    clog(' in|', message.model.text);
-    const output = this.findAnyReply(message);
-    if (output) {
-      clog('out| ', output);
-      GBot.say(output, message.room);
-    }
-    // for debugging
-    return output;
-  },
-
-  // using a callback to get roomId
-  sayToRoom: function(text, roomName) {
-    const sayIt = () => {
-      console.log('sayIt', text, roomName);
-      GBot.say(text, roomName);
-    };
-    GitterHelper.findRoomByName(roomName, sayIt);
-  },
-
-  say: function(text, room) {
-    // did we get a room
-    Utils.hasProperty(room, 'path', 'expected room object');
-    if (!text) {
-      console.warn('tried to say with no text');
-    }
-    try {
-      GitterHelper.sayToRoomName(text, room.uri);
-    } catch (err) {
-      Utils.warn('GBot.say>', 'failed', err);
-      Utils.warn('GBot.say>', 'room', room);
-    }
-  },
-
-  // search all reply methods
-  // returns a string to send
-  // handleReply takes care of sending to chat system
-  findAnyReply: function(message) {
-    const input = this.parseInput(message),
-          listReplyOptionsAvailable = this.findListOption(input);
-    let output;
-
-    if (input.command) {
-      // this looks up a command and calls it
-      output = BotCommands[input.keyword](input, this);
-    } else if (listReplyOptionsAvailable !== false) {
-      // if a list exists and user chose an option
-      output = listReplyOptionsAvailable;
-    } else {
-      // non-command keywords like 'troll'
-      const scanCommand = RoomMessages.scanInput(input, input.message.room.name,
-                                                 AppConfig.botNoiseLevel);
-      if (scanCommand) {
-        if (scanCommand.text) {
-          output = (scanCommand.text);
-        }
-        if (scanCommand.func) {
-          output = scanCommand.func(input, this);
-        }
-      }
-    }
-    // TODO - check its a string or nothing
-    return output;
-  },
-
-  // save a list of options
-  // when the bot sends out a list
-  makeListOptions: function(output) {
-    let matches = [];
-    // find what is between [] brackets in the list of links
-    // example [bonfire arguments optional]
-    output.replace(/\[([a-zA-Z ]+)\]/g, (g0, g1) => {
-      matches.push(g1);
-    });
-    // stores 'bonfire arguments optional' and the like in an array
-    this.listReplyOptions = matches;
-    return matches;
-  },
-
-  // reply option to user
-  // if they chose an option from the list
-  findListOption: function(input) {
-    const parsedInput = parseInt(input.cleanText, 10);
-
-    if (!this.listReplyOptions || this.listReplyOptions.length === 0) {
-      return false;
-    } else if (input.cleanText.match(/^[0-9]+$/i) === null) {
-      // check if input is not a number
-      return false;
-    } else if (typeof this.listReplyOptions[parsedInput] === 'undefined') {
-      return false;
-    }
-
-    // get chosen wiki or bonfire article to output
-    input.params = this.listReplyOptions[parsedInput];
-    let output;
-    if (input.params.split(' ')[0] === 'bonfire') {
-      output = BotCommands['bonfire'](input, this);
-    } else {
-      output = BotCommands['wiki'](input, this);
-    }
-
-    this.listReplyOptions = [];
-    return output;
-  },
-
-  // turns raw text input into a json format
-  parseInput: function(message) {
-    Utils.hasProperty(message, 'model');
-
-    let cleanText = message.model.text;
-    cleanText = Utils.sanitize(cleanText);
-
-    let input = Utils.splitParams(cleanText);
-    input = this.cleanInput(input);
-    input.message = message;
-    input.cleanText = cleanText;
-
-    if (BotCommands.isCommand(input)) {
-      input.command = true;
-    }
-    return input;
-  },
-
-  cleanInput: function(input) {
-    // 'bot' keyword is an object = bad things happen when called as a command
-    if (input.keyword === 'bot') {
-      input.keyword = 'help';
-    }
-    return input;
-  },
-
-  announce: function(opts) {
-    clog('announce', opts);
-    this.joinRoom(opts, true);
-  },
-
-  joinRoom: function(opts) {
-    const roomUrl = opts.roomObj.name;
-
-    GBot.gitter.rooms.join(roomUrl, (err, room) => {
-      if (err) {
-        console.warn('Not possible to join the room: ', err, roomUrl);
-      }
-      GBot.roomList.push(room);
-      // have to stagger this for gitter rate limit
-      GBot.listenToRoom(room);
-      const text = GBot.getAnnounceMessage(opts);
-      GBot.say(text, room);
-
-      return room;
-    });
-
-    return false;
-  },
-
-  // checks if joined already, otherwise adds
-  addToRoomList: function(room) {
-    // check for dupes
-    this.roomList = this.roomList || [];
-    if (this.hasAlreadyJoined(room, this.roomList)) {
-      return false;
-    }
-
-    this.roomList.push(room);
-    return true;
-  },
-
-  // checks if a room is already in bots internal list of joined rooms
-  // this is to avoid listening twice
-  // see https://github.com/gitterHQ/node-gitter/issues/15
-  // note this is only the bots internal tracking
-  // it has no concept if the gitter API/state already thinks
-  // you're joined/listening
-  hasAlreadyJoined: function(room) {
-    const checks = this.roomList.filter(rm => {
-      return (rm.name === room.name);
-    });
-
-    const oneRoom = checks[0];
-    if (oneRoom) {
-      Utils.warn('GBot', 'hasAlreadyJoined:', oneRoom.url);
-      return true;
-    }
-
-    return false;
-  },
-
-  getAnnounceMessage: function() {
-    return '';
-  },
-
-  // dont reply to bots or you'll get a feedback loop
-  isBot: function(who) {
-    // 'of' IS correct even tho ES6Lint doesn't get it
-    for (let bot of AppConfig.botlist) {
-      if (who === bot) {
-        return true;
-      }
-    }
-    return false;
-  },
-
-  // this joins rooms contained in the data/RoomData.js file
-  // ie a set of bot specific discussion rooms
-  joinKnownRooms: function() {
-    clog('botname on rooms', AppConfig.getBotName());
-
-    RoomData.rooms().map(oneRoomData => {
-      const roomUrl = oneRoomData.name;
-      this.delayedJoin(roomUrl);
-    });
-  },
-
-
-  delayedJoin: function(roomUrl) {
-    apiWait += apiDelay;
-    setTimeout(() => {
-      this.gitter.rooms.join(roomUrl, (err, room) => {
-        if (err) {
-          Utils.warn('Not possible to join the room:', roomUrl, err);
-          return;
-        }
-        clog('joined> ', room.name);
-        this.listenToRoom(room);
-      });
-    }, apiWait);
-  },
-
-  joinBonfireRooms: function() {
-    Bonfires.allDashedNames().map(name => {
-      const roomUrl = AppConfig.getBotName() + '/' + name;
-      this.delayedJoin(roomUrl);
-    });
-  },
-
-  // uses gitter helper to fetch the list of rooms this user is 'in'
-  // and then tries to listen to them
-  // this is mainly to pick up new oneOnOne conversations
-  // when a user DMs the bot
-  // as I can't see an event the bot would get to know about that
-  // so its kind of like 'polling' and currently only called from the webUI
-  scanRooms: function(user, token) {
-    clog('user', user);
-    clog('token', token);
-    GitterHelper.fetchRooms(user, token, (err, rooms) => {
-      if (err) {
-        Utils.warn('GBot', 'fetchRooms', err);
-      }
-      if (!rooms) {
-        Utils.warn('cant scanRooms');
-        return;
-      }
-      clog('scanRooms.rooms', rooms);
-      rooms.map(room => {
-        if (room.oneToOne) {
-          clog('oneToOne', room.name);
-          this.gitter.rooms.find(room.id)
-            .then(roomObj => {
-              this.listenToRoom(roomObj);
-            });
-        }
-      });
-    });
-  },
-
-  // TODO - FIXME doesnt work for some reason >.<
-  // needs different type of token?
-  updateRooms: function() {
-    GBot.gitter.currentUser()
-      .then(user => {
-        const list = user.rooms((err, obj) => {
-          clog('rooms', err, obj);
-        });
-        clog('user', user);
-        clog('list', list);
-        return list;
-      });
-  }
-};
-
-module.exports = GBot;
diff --git a/nap/lib/bot/InputWrap.js b/nap/lib/bot/InputWrap.js
deleted file mode 100644
index 5877fe2..0000000
--- a/nap/lib/bot/InputWrap.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict';
-
-const Utils = require('../utils/Utils');
-
-const InputWrap = {
-  roomShortName: function(input) {
-    let name = input.message.room.name;
-    name = name.split('/');
-    name = name[1] || name[0];
-    return name;
-  },
-
-  fromUser: function(input) {
-    try {
-      return '@' + input.message.model.fromUser.username;
-    } catch (e) {
-      Utils.error('InputWrap', 'no fromUser', input);
-    }
-  },
-
-  mentioned: function(input) {
-    const mentions = input.message.model.mentions;
-    let names;
-    if (mentions) {
-      // TODO - build a list
-      return names;
-    }
-    return null;
-  }
-};
-
-module.exports = InputWrap;
diff --git a/nap/lib/bot/KBase.js b/nap/lib/bot/KBase.js
deleted file mode 100644
index 66e085a..0000000
--- a/nap/lib/bot/KBase.js
+++ /dev/null
@@ -1,150 +0,0 @@
-'use strict';
-
-const TextLib = require('../utils/TextLib'),
-      fs = require('fs'),
-      path = require('path'),
-      Utils = require('../utils/Utils');
-
-// topicNameList - list of individual topic keywords eg 'chai-cheat'
-// topics    - Hash full data of all topics
-
-//  example topic:
-//
-// 'js-for':
-//  { path: '/Users/dc/dev/fcc/gitterbot/nap/data/wiki/js-for.md',
-//    topic: 'js-for',
-//    fname: 'js-for.md',
-//    data: 'The javascript `for` command iterates through a list of items.\n\n
-//           ```js\nfor (var i = 0; i < 9; i++) {\n   console.log(i);\n
-//               // more statements\n}\n```\n\n----',
-//    shortData: 'The javascript `for` command iterates through a list of items.
-//                \n\n```js\nfor (var i = 0; i < 9; i++) {\n   console.log(i);\n
-//                   // more statements\n}\n```\n\n----' },
-
-const KBase = {
-  files: [],
-  topics: null,
-  findMoreResults: [],
-
-  initSync: function() {
-    // TODO - FIXME works relative?
-    const wikiDataDir = path.join(__dirname, '/../../data/wiki');
-
-    KBase.allData = [];
-    fs.readdirSync(wikiDataDir).forEach(name => {
-      if ((/md$/).test(name)) {
-        const filePath = path.join(wikiDataDir, name),
-              arr = filePath.split(path.sep),
-              fileName = arr[arr.length - 1].toLowerCase(),
-              topicName = fileName.replace('.md', ''),
-              data = fs.readFileSync(filePath, 'utf8');
-
-        const blob = {
-            path: filePath,
-            displayName: Utils.namify(topicName),
-            fileName: fileName,
-            data: data,
-            shortData: TextLib.trimLines(data),
-            dashedName: TextLib.dashedName(topicName)
-        };
-
-        KBase.allData.push(blob);
-      }
-    });
-    return KBase.allData;
-  },
-
-  getWikiHints: function(bfName) {
-    const topicData = this.getTopicData(bfName);
-    if (topicData) {
-      return topicData.data.split('##');
-    } else {
-      return null;
-    }
-  },
-
-  getTopicData: function(params) {
-    const searchDashName = TextLib.dashedName(params);
-
-    if (!KBase.allData) {
-      KBase.initSync();
-    } else {
-      const shortList = KBase.allData.filter(t => {
-        return (t.dashedName.includes(searchDashName));
-      });
-      if (shortList) {
-        return shortList[0];
-      } else {
-        Utils.warn('KBase', 'cant find topicData for', params);
-        Utils.warn('Kbase', 'allData', KBase.allData);
-        return null;
-      }
-    }
-  },
-
-  getTopics: function(keyword) {
-    // TODO - refac and use function above
-    const searchDashName = TextLib.dashedName(keyword);
-    const shortList = this.allData.filter(t => {
-      return (t.dashedName.includes(searchDashName));
-    });
-    return shortList;
-  },
-
-  //    return topics as markdown links
-  getTopicsAsList: function(keyword) {
-    const shortList = this.getTopics(keyword);
-    let findResults;
-    if (shortList.length === 0) {
-      return 'nothing found';
-    }
-    if (this.findMoreResults[0] === keyword) {
-      // continue list of enteries after limit
-      findResults = this.findMoreResults[1];
-      this.findMoreResults = [];
-      return '> more enteries: \n ' + findResults;
-    }
-    this.findMoreResults = [];
-    // else
-    Utils.log('shortList', shortList);
-
-    const emojiList = [':zero:', ':one:', ':two:', ':three:', ':four:',
-                        ':five:', ':six:', ':seven:', ':eight:', ':nine:'];
-    const listLimit = 20;
-
-    findResults = '';
-    for (let i = 0; i < shortList.length; i++) {
-      let topicData = shortList[i],
-          link = Utils.linkify(topicData.dashedName, 'wiki',
-                                 topicData.displayName);
-      let line;
-      if (i < 10) {
-        line = '\n ' + emojiList[i] + ' ' + link;
-      } else if (i < 100) {
-        let iSplit = i.toString().split('');
-        line = '\n ' + emojiList[iSplit[0]] +
-               emojiList[iSplit[1]] + ' ' + link;
-      }
-
-      if (i === listLimit) {
-        // meets limit
-        findResults += '\n > limited to first ' + listLimit + ' entries.' +
-                       '\n > type `find ' + keyword +
-                       '` again for more enteries.';
-        this.findMoreResults[0] = keyword;
-        this.findMoreResults[1] = '' + line;
-      } else if (i > listLimit) {
-        // exceeds limit
-        this.findMoreResults[1] += line;
-      } else {
-        // below limit
-        findResults += line;
-      }
-    }
-    return findResults;
-  }
-};
-
-KBase.initSync();
-
-module.exports = KBase;
diff --git a/nap/lib/bot/cmds/bonfire.js b/nap/lib/bot/cmds/bonfire.js
deleted file mode 100644
index 73afe2c..0000000
--- a/nap/lib/bot/cmds/bonfire.js
+++ /dev/null
@@ -1,118 +0,0 @@
-'use strict';
-
-const Bonfires = require('../../../lib/app/Bonfires'),
-      Rooms = require('../../../lib/app/Rooms'),
-      Utils = require('../../../lib/utils/Utils');
-
-const commands = {
-
-  // commands to bonfire with a parameter
-  bonfire: function(input, bot, blob) {
-
-    const bonfire = this.checkHasBonfire(input, bot);
-    let foundCmd = false;
-
-    const opts = {
-      bonfire: bonfire,
-      input: input,
-      bot: bot,
-      blob: blob
-    };
-
-    if (bonfire) {
-      foundCmd = this.checkBonfireCommands(opts);
-      if (foundCmd) {
-        return foundCmd;
-      }
-    }
-    if (!foundCmd) {
-      return this.searchBonfire(input, bot);
-    }
-  },
-
-  checkBonfireCommands: function(opts) {
-    const bonfire = opts.bonfire;
-    switch (opts.input.params) {
-      // no params just return status
-      /* eslint-disable no-undefined */
-      case undefined:
-        return Bonfires.fixed.reminder(bonfire.name);
-      /* eslint-enable no-undefined */
-      case 'info':
-        return Bonfires.bonfireInfo(bonfire);
-      case 'details':
-        return Bonfires.bonfireDetails(bonfire);
-      case 'links':
-        return Bonfires.bonfireLinks(bonfire);
-      case 'spoiler':
-      case 'hint':
-        return this.hint(opts.input, opts.bot);
-      case 'script':
-        return Bonfires.bonfireScript(bonfire);
-      case 'wiki':
-        return Bonfires.bonfireWiki(bonfire);
-      case 'name':
-        return Bonfires.fixed.nameHint;
-      case 'status':
-        return Bonfires.bonfireStatus(bonfire);
-      default:
-        return false;
-    }
-  },
-
-  searchBonfire: function(input) {
-    if (!input.params) {
-      return Bonfires.fixed.askName;
-    }
-
-    Utils.log('params ', input.params);
-    const newBonfire = Bonfires.findBonfire(input.params);
-
-    if (newBonfire) {
-      this.currentBonfire = newBonfire;
-      return Bonfires.bonfireInfo(newBonfire);
-    } else {
-      // TODO - only send this messsage if at the start of a line
-      return Bonfires.fixed.cantFind(input.params);
-    }
-  },
-
-  // TODO - FIXME this is a bit sketchy, return type is 'bonfire name' or true.
-  checkHasBonfire: function(input) {
-    const roomName = input.message.room.name;
-    if (Rooms.isBonfire(roomName)) {
-      const bfName = roomName.split('/')[1];
-      return Bonfires.findBonfire(bfName);
-    }
-
-    if (!this.currentBonfire) {
-      return false;
-    }
-
-    return this.currentBonfire;
-  },
-
-  inBonfireRoom: function(input) {
-    const roomName = input.message.room.name;
-    return !!Rooms.isBonfire(roomName);
-  },
-
-  // this is a naked command
-  hint: function(input, bot) {
-    const bonfire = this.checkHasBonfire(input, bot);
-    if (!bonfire) {
-      return Bonfires.fixed.setName;
-    }
-
-    if (!this.inBonfireRoom(input, bot)) {
-      return Bonfires.fixed.goToBonfireRoom(bonfire);
-    }
-    // all good so:
-    return Bonfires.getNextHint(bonfire, input);
-  }
-};
-
-// alias
-commands.bf = commands.bonfire;
-
-module.exports = commands;
diff --git a/nap/lib/bot/cmds/thanks.js b/nap/lib/bot/cmds/thanks.js
deleted file mode 100644
index b67f371..0000000
--- a/nap/lib/bot/cmds/thanks.js
+++ /dev/null
@@ -1,124 +0,0 @@
-/*jslint todo: true */
-'use strict';
-
-const GBot = require('../../../lib/bot/GBot.js'),
-      Utils = require('../../../lib/utils/Utils'),
-      HttpWrap = require('../../../lib/utils/HttpWrap'),
-      TextLib = require('../../../lib/utils/TextLib');
-
-const thanksCommands = {
-
-  messages: {
-    wikiHint: function(fromUser) {
-      const wikiUrl = '(https://github.com/freecodecamp/' +
-                    'freecodecamp/wiki/wiki-style-guide)';
-
-      return '\n> hey @' + fromUser + ' if you found this info helpful ' +
-        ':point_right: *[consider adding a wiki article!]' + wikiUrl + '*';
-    }
-  },
-
-  thanks: function(input, bot) {
-    Utils.hasProperty(input, 'message', 'thanks expects an object');
-    let mentions, fromUser, toUser, toUserMessage;
-
-    mentions = input.message.model.mentions;
-    // just 'thanks' in a message
-    if (mentions && mentions.length === 0) {
-      Utils.warn('thanks', 'without any mentions', input.message.model);
-      return null;
-    }
-
-    fromUser = input.message.model.fromUser.username.toLowerCase();
-    const options = {
-      method: 'POST',
-      input: input,
-      bot: bot
-    };
-
-    const namesList = mentions.map(m => {
-      toUser = m.screenName.toLowerCase();
-      if (toUser !== fromUser) {
-        const apiPath = '/api/users/give-brownie-points?receiver=' + toUser +
-                        '&giver=' + fromUser;
-        HttpWrap.callApi(apiPath, options, thanksCommands.showInfoCallback);
-        return toUser;
-      } else {
-        return null;
-      }
-    });
-
-    if (namesList[0]) {
-      toUserMessage = namesList.join(' and @');
-      return '> ' + fromUser + ' sends brownie points to @' + toUserMessage +
-        ' :sparkles: :thumbsup: :sparkles: ';
-    } else {
-      return '> sorry ' + fromUser + ', you can\'t send brownie points to ' +
-        'yourself! :sparkles: :sparkles: ';
-    }
-  },
-
-  about: function(input, bot) {
-    const mentions = input.message.model.mentions,
-          them = mentions[0];
-
-    if (!them) {
-      Utils.warn('about without any mentions', input.message.model);
-      return 'you need to ask about @someone!';
-    }
-    const name = them.screenName.toLowerCase();
-    const options = {
-      method: 'GET',
-      input: input,
-      bot: bot
-    };
-
-    const apiPath = '/api/users/about?username=' + name;
-    HttpWrap.callApi(apiPath, options, thanksCommands.showInfoCallback);
-  },
-
-  // called back from apiCall so can't use Global GBot here
-  // blob:
-  //      response
-  //      bot
-  //      input
-  showInfoCallback: function(blob) {
-    // in case we want to filter the message
-    const cleanMessage = message => {
-      // return message;
-      if (message.match(/^FCC: no user/)) {
-        message = 'hmm, can\'t find that user on the beta site. wait til ' +
-                  'we release new version!';
-      }
-      message = '> :warning: ' + message;
-      return message;
-    };
-
-    if (blob.response.error) {
-      const message = cleanMessage(blob.response.error.message);
-
-      Utils.warn('WARN @thanks>', blob.response.error.message,
-                 blob.response.error);
-
-      // show the error to the user
-      blob.bot.say(message, blob.input.message.room);
-      return false;
-    }
-
-    let str;
-    try {
-      const username = blob.response.about.username,
-            about = blob.response.about,
-            uri = 'http://www.freecodecamp.com/' + username;
-      str = '> :star: ' + about.browniePoints + ' | @' + username + ' | ';
-      str += TextLib.mdLink(uri, uri);
-    } catch (err) {
-      Utils.error('can\'t create response from API callback', err);
-      Utils.warn('thanks>', 'blob>', blob);
-      str = 'api offline';
-    }
-    blob.bot.say(str, blob.input.message.room);
-  }
-};
-
-module.exports = thanksCommands;
diff --git a/nap/lib/bot/cmds/update.js b/nap/lib/bot/cmds/update.js
deleted file mode 100644
index 21e36d3..0000000
--- a/nap/lib/bot/cmds/update.js
+++ /dev/null
@@ -1,42 +0,0 @@
-'use strict';
-
-const spawn = require('child_process').spawn,
-      KBase = require('../../bot/KBase'),
-      Bonfires = require('../../../lib/app/Bonfires');
-
-const commands = {
-  update: function(input, bot) {
-    const cmdPath = 'bin/wiki-pull.sh';
-
-    if (input.params && input.params !== 'wiki') {
-      // has to be exact command
-      return;
-    }
-
-    let cmd = spawn('sh', [ cmdPath ], {
-      cwd: process.cwd()
-    });
-
-    // these throw errors if you're already on a branch
-    cmd.stdout.on('data', data => {
-      const piped = '\n```' + data + '```\n';
-      bot.say(piped, input.message.room);
-    });
-
-    cmd.stderr.on('data', data => {
-      console.log('stderr: ' + data);
-    });
-
-    cmd.on('close', code => {
-      KBase.initSync();
-      Bonfires.load();
-      const output = '\n`done code: ' + code + '`' + '\n :computer: ';
-      bot.say(output, input.message.room);
-    });
-    /* eslint-disable consistent-return */
-    return 'updating wiki...';
-    /* eslint-enable consistent-return */
-  }
-};
-
-module.exports = commands;
diff --git a/nap/lib/bot/cmds/wiki.js b/nap/lib/bot/cmds/wiki.js
deleted file mode 100644
index 684a0e3..0000000
--- a/nap/lib/bot/cmds/wiki.js
+++ /dev/null
@@ -1,44 +0,0 @@
-'use strict';
-
-const KBase = require('../../bot/KBase'),
-    Utils = require('../../../lib/utils/Utils');
-
-const commands = {
-
-  wikiFooter: function(params) {
-    const text = ('read more about ' + params + ' on the FCC Wiki'),
-          link = Utils.linkify(params, 'wiki', text);
-
-    return '\n:pencil: ' + link;
-  },
-
-  wikiUsage: function() {
-    return 'usage:\n    `wiki $topic`   info on that topic';
-  },
-
-  wikiCantFind: function(input) {
-    Utils.warn('wiki.js', 'cant find topic for', input.params);
-    return 'no wiki entry for: `' + input.params + '`';
-  },
-
-  wiki: function(input) {
-    if (!input.params) {
-      return this.wikiUsage();
-    }
-
-    const topicData = KBase.getTopicData(input.params);
-    if (!topicData) {
-      Utils.warn('cant find topic for ', input.params);
-      return this.wikiCantFind(input);
-    }
-
-    Utils.log('topicData', topicData);
-    const link = Utils.linkify(topicData.dashedName, 'wiki',
-                               topicData.displayName + '  [wiki]');
-
-    return '## :point_right: ' + link + '\n' + topicData.shortData +
-      this.wikiFooter(topicData.dashedName);
-  }
-};
-
-module.exports = commands;
diff --git a/nap/lib/gitter/GitterHelper.js b/nap/lib/gitter/GitterHelper.js
deleted file mode 100644
index 42f4905..0000000
--- a/nap/lib/gitter/GitterHelper.js
+++ /dev/null
@@ -1,133 +0,0 @@
-'use strict';
-
-const gitterHost = process.env.HOST || 'https://gitter.im',
-      AppConfig = require('../../config/AppConfig'),
-      Utils = require('../../lib/utils/Utils'),
-      request = require('request'),
-      _ = require('lodash');
-
-// Gitter API client helper
-const GitterHelper = {
-
-  roomDataCache: {},
-
-  fetch: function(path, callback, options) {
-    options = options || {};
-
-    const defaultOptions = {
-      uri: gitterHost + '/api/v1' + path,
-      headers: {
-        'Content-Type': 'application/json',
-        'Accept': 'application/json',
-        'Authorization': 'Bearer ' + AppConfig.token
-      }
-    };
-    // opts takes priority
-    _.extend(defaultOptions, options);
-
-    request(defaultOptions, (err, res, body) => {
-      if (err) {
-        Utils.error('GitterHelper.fetch', err);
-        Utils.error('GitterHelper.fetch.options', defaultOptions);
-        return callback(err);
-      }
-      /* eslint-disable consistent-return */
-      if (!callback) { return; }
-      /* eslint-enable consistent-return */
-
-      if (res.statusCode === 200) {
-        let data;
-        // TODO - FIXME sometimes we get JSON back (from POST requests)
-        // sometimes we just get a string
-        if (typeof body === 'string') {
-          data = JSON.parse(body);
-        } else {
-          // hope its json!
-          data = body;
-        }
-        return callback(null, data);
-      } else {
-        Utils.warn('GitterHelper', 'non 200 response from', defaultOptions);
-        Utils.warn('GitterHelper', 'body', body);
-        return callback('err' + res.statusCode);
-      }
-    });
-  },
-
-  postMessage: function(text, roomId, callback, opts) {
-    const data = { 'text': text };
-    opts = {
-      method: 'POST',
-      body: data,
-      json: true
-    };
-
-    this.fetch(
-      '/rooms/' + roomId + '/chatMessages',
-      callback,
-      opts
-    );
-  },
-
-  fetchCurrentUser: function(token, cb) {
-    this.fetch('/user/', (err, user) => {
-      cb(err, user[0]);
-    });
-  },
-
-  // TODO - refactor not to take a token on each req
-  fetchRooms: function(user, token, cb) {
-    this.fetch('/user/' + user.id + '/rooms', (err, rooms) => {
-      cb(err, rooms);
-    });
-  },
-
-  findRoomByName: function(roomUri, callback, cbParams) {
-    cbParams = cbParams || {};
-
-    // avoid doing rest calls if we're posting to a known room
-    const cached = GitterHelper.roomDataCache[roomUri];
-    if (cached) {
-      cbParams.gitterRoom = cached;
-      return callback(cbParams);
-    } else {
-      this.fetch('/rooms', (err, rooms) => {
-        if (err) {
-          return callback(err);
-        }
-        if (!rooms) {
-          Utils.error('can\'t find rooms with roomUri', roomUri);
-          /* eslint-disable consistent-return */
-          return;
-          /* eslint-enable consistent-return */
-        }
-        const roomList = rooms.filter(rm => {
-          return rm.uri === roomUri;
-        });
-        if (roomList.length > 0) {
-          const room = roomList[0];
-          GitterHelper.roomDataCache[roomUri] = room;
-          cbParams.gitterRoom = room;
-          return callback(cbParams);
-        }
-      });
-    }
-  },
-
-  responseCallback: function() {
-    Utils.clog('GitterHelper.response callback');
-  },
-
-  sayToRoomObj: function(text, opts) {
-    GitterHelper.postMessage(text, opts.id);
-  },
-
-  sayToRoomName: function(text, roomUri) {
-    GitterHelper.findRoomByName(roomUri, opts => {
-      GitterHelper.sayToRoomObj(text, opts.gitterRoom);
-    });
-  }
-};
-
-
-module.exports = GitterHelper;
diff --git a/nap/lib/gitter/passportModule.js b/nap/lib/gitter/passportModule.js
deleted file mode 100644
index a480dd0..0000000
--- a/nap/lib/gitter/passportModule.js
+++ /dev/null
@@ -1,38 +0,0 @@
-'use strict';
-
-const passport = require('passport'),
-      OAuth2Strategy = require('passport-oauth2'),
-      gitterHost = process.env.HOST || 'https://gitter.im',
-      clientId = process.env.GITTER_APP_KEY,
-      clientSecret = process.env.GITTER_APP_SECRET,
-      GitterHelper = require('./GitterHelper');
-
-const opts = {
-    authorizationURL: gitterHost + '/login/oauth/authorize',
-    tokenURL: gitterHost + '/login/oauth/token',
-    clientID: clientId,
-    clientSecret: clientSecret,
-    callbackURL: '/login/callback',
-    passReqToCallback: true
-};
-
-passport.use(new OAuth2Strategy(
-  opts,
-  (req, accessToken, refreshToken, profile, done) => {
-    console.log('set access token', accessToken);
-    req.session.token = accessToken;
-    GitterHelper.fetchCurrentUser(accessToken, (err, user) => {
-      return (err ? done(err) : done(null, user));
-    });
-  }
-));
-
-passport.serializeUser((user, done) => {
-  done(null, JSON.stringify(user));
-});
-
-passport.deserializeUser((user, done) => {
-  done(null, JSON.parse(user));
-});
-
-module.exports = passport;
diff --git a/nap/lib/gitter/restApi.js b/nap/lib/gitter/restApi.js
deleted file mode 100644
index 6cffc26..0000000
--- a/nap/lib/gitter/restApi.js
+++ /dev/null
@@ -1,102 +0,0 @@
-'use strict';
-
-const gitterHost = process.env.HOST || 'https://gitter.im',
-      _ = require('underscore'),
-      request = require('request'),
-      AppConfig = require('../../../config/AppConfig');
-
-function handleCallback(err) {
-  if (err) {
-    console.error('ERROR \n');
-  }
-}
-
-// Gitter API client helper
-const gitter = {
-  stashToken: function(token) {
-    if (token) {
-      AppConfig.token = token;
-    } else {
-      console.error('tried to stash null token:', token);
-    }
-    console.log('stashToken AppConfig:', AppConfig);
-    token = token || AppConfig.token;
-    return token;
-  },
-
-  checkUser: function(user) {
-    if (user === '[') {
-      console.error('WTF user is [');
-      user = AppConfig.user;
-    }
-    return user;
-  },
-
-  fetch: function(path, token, cb, opts) {
-    token = token || AppConfig.token;
-    const options = {
-      url: gitterHost + path,
-      headers: {
-        'Content-Type': 'application/json',
-        'Accept': 'application/json',
-        'Authorization': 'Bearer ' + token
-      }
-    };
-
-    opts = opts || {};
-    // opts takes priority
-    _.extend(options, opts);
-
-    request(options, (err, res, body) => {
-      if (err) { return cb(err); }
-
-      if (res.statusCode === 200) {
-        cb(null, body);
-      } else {
-        cb('err ' + res.statusCode);
-      }
-    });
-  },
-
-  fetchCurrentUser: function(token, cb) {
-    this.fetch('/api/v1/user/', token, (err, user) => {
-      cb(err, user[0]);
-    });
-  },
-
-  fetchRooms: function(user, token, cb) {
-    // TODO - FIXME
-    user = this.checkUser(user);
-    token = this.stashToken(token);
-    this.fetch('/api/v1/user/' + user.id + '/rooms', token, (err, rooms) => {
-      cb(err, rooms);
-    });
-  },
-
-  postMessage: function(text, roomId) {
-    const token = this.stashToken();
-    roomId = roomId || AppConfig.roomId;
-    const data = { 'text': text };
-    const opts = {
-      method: 'POST',
-      // body: JSON.stringify(data),
-      body: data,
-      json: true
-    };
-
-    this.fetch(
-      '/api/v1/rooms/' + roomId + '/chatMessages',
-      token,
-      handleCallback,
-      opts
-    );
-  }
-};
-
-
-gitter.currentUser().then(user => {
-  console.log('---- You are logged in as:', user.username);
-});
-
-
-module.exports = gitter;
diff --git a/nap/lib/gitter/streamApi.js b/nap/lib/gitter/streamApi.js
deleted file mode 100644
index cd2f566..0000000
--- a/nap/lib/gitter/streamApi.js
+++ /dev/null
@@ -1,41 +0,0 @@
-'use strict';
-
-const https = require('https');
-
-function listenToRoom(roomId, bot) {
-  const token = process.env.GITTER_USER_TOKEN,
-        heartbeat = ' \n';
-
-  console.log('listenToRoom', roomId);
-
-  const options = {
-    hostname: 'stream.gitter.im',
-    port: 443,
-    path: '/v1/rooms/' + roomId + '/chatMessages',
-    method: 'GET',
-    headers: {
-      'Authorization': 'Bearer ' + token
-    }
-  };
-
-  const req = https.request(options, res => {
-    res.on('data', chunk => {
-      const msg = chunk.toString();
-      if (msg !== heartbeat) {
-        const blob = JSON.parse(msg);
-        blob.roomId = roomId;
-        bot.reply(blob);
-      }
-    });
-  });
-
-  req.on('error', e => {
-    console.log('Something went wrong: ' + e.message);
-  });
-
-  req.end();
-}
-
-module.exports = {
-  'listenToRoom': listenToRoom
-};
diff --git a/nap/lib/utils/HttpWrap.js b/nap/lib/utils/HttpWrap.js
deleted file mode 100644
index ace5e8b..0000000
--- a/nap/lib/utils/HttpWrap.js
+++ /dev/null
@@ -1,57 +0,0 @@
-'use strict';
-
-const http = require('http'),
-      _ = require('lodash'),
-      AppConfig = require('../../config/AppConfig'),
-      Utils = require('./Utils');
-
-const HttpWrap = {
-  defaultOptions: {
-    host: AppConfig.apiServer,
-    timeout: 5000,
-    debug: false,
-    headers: {
-      'Authorization': AppConfig.apiKey
-    }
-  },
-
-  callApi: function(apiPath, options, callback) {
-
-    _.merge(this.defaultOptions, options);
-
-    // TODO add authorisation to header
-    this.defaultOptions.path = apiPath;
-
-    const handleResponse = response => {
-      let str = '';
-
-      // another chunk of data has been received, so append it to `str`
-      response.on('data', chunk => {
-        str += chunk;
-      });
-
-      // the whole response has been recieved, so we just print it out here
-      response.on('end', () => {
-        try {
-          const blob = JSON.parse(str);
-          options.response = blob;
-        } catch (err) {
-          Utils.error('cant parse API response', str);
-          Utils.error('error>', err);
-          options.response = 'api offline';
-        }
-        callback(options);
-      });
-    };
-
-    const handleTimeout = err => {
-      Utils.error('HttpWrap', 'timeout', err);
-    };
-
-    const request = http.request(this.defaultOptions, handleResponse);
-    request.setTimeout(3000, handleTimeout);
-    request.end();
-  }
-};
-
-module.exports = HttpWrap;
diff --git a/nap/lib/utils/TextLib.js b/nap/lib/utils/TextLib.js
deleted file mode 100644
index df113ac..0000000
--- a/nap/lib/utils/TextLib.js
+++ /dev/null
@@ -1,34 +0,0 @@
-'use strict';
-
-const AppConfig = require('../../config/AppConfig');
-
-const TextLib = {
-  // we only show the first para
-  // and limit to 20 lines
-  trimLines: function(data, lines) {
-    const part = data.split('\n## ')[0];
-    lines = lines || AppConfig.MAX_WIKI_LINES;
-    let subset = part.split('\n');
-    subset = subset.slice(0, lines).join('\n');
-    return subset;
-  },
-
-  mdLink: function(text, uri) {
-    return '[' + text + '](' + uri + ')';
-  },
-
-  dashedName: function(str) {
-    if (!str) { return; }
-    str = str.replace(/\s/g, '-');
-    str = str.toLowerCase();
-    // in case of doubles
-    str = str.replace('--', '-');
-    str = str.replace('.md', '');
-    str = str.replace(/([^a-z0-9áéíóúñü_@\-\s]|[\t\n\f\r\v\0])/gim, '');
-    /* eslint-disable consistent-return */
-    return str;
-    /* eslint-enable consistent-return */
-  }
-};
-
-module.exports = TextLib;
diff --git a/nap/lib/utils/Utils.js b/nap/lib/utils/Utils.js
deleted file mode 100644
index 5035745..0000000
--- a/nap/lib/utils/Utils.js
+++ /dev/null
@@ -1,244 +0,0 @@
-'use strict';
-
-require('dotenv').config({path: 'dot.env'});
-
-const assert = require('chai').assert,
-      clc = require('cli-color'),
-      _ = require('lodash'),
-      AppConfig = require('../../config/AppConfig'),
-      MDNlinks = require('../../data/seed/bonfireMDNlinks');
-
-const LOG_LEVEL_ERROR = 2,
-      LOG_LEVEL_WARN = 3,
-      LOG_LEVEL_INFO = 5;
-
-const Utils = {
-
-  cols: {
-    error: clc.bgRedBright.white.bold,
-    warn: clc.black.bgYellow.bold,
-    info: clc.black.cyanBright,
-    info2: clc.black.bgCyan,
-    notice: clc.blue,
-    bright: clc.xterm(237).bgXterm(195),
-    dimmed: clc.xterm(232).bgXterm(253),
-    warning: clc.xterm(232).bgXterm(215),
-    errorColors: clc.xterm(232).bgRedBright
-  },
-
-  // default
-  logLevel: 10,
-
-  log: function(msg, obj) {
-    let where = '';
-    if (this.logLevel > LOG_LEVEL_INFO) {
-      where = this.stackLines(3, 4);
-    }
-    Utils.clog(where, msg, obj);
-  },
-
-  clog: function(where, msg, obj) {
-    if (process.env.SERVER_ENV || this.logLevel < LOG_LEVEL_INFO) {
-      return;
-    }
-    obj = obj || '';
-    console.log(this.cols.info(where), this.cols.info(msg), obj);
-  },
-
-  // log during test
-  tlog: function() {
-    if (process.env.SERVER_ENV) { return; }
-    const args = Array.prototype.slice.call(arguments);
-    const p1 = args.shift() || '_',
-          p2 = args.shift() || '_',
-          p3 = args.shift() || '_';
-    console.log(this.cols.bright(p1), p2, p3);
-    args.forEach(p => {
-      if (p) { console.log(p); }
-    });
-  },
-
-  warn: function(where, msg, obj) {
-    if (process.env.SERVER_ENV || this.logLevel < LOG_LEVEL_WARN) {
-      return;
-    }
-    obj = obj || '';
-    console.warn(this.cols.warn(where), this.cols.warn(msg), obj);
-  },
-
-  stackTrace: function() {
-    const err = new Error();
-    console.log(err);
-    return err.stack;
-  },
-
-  stackLines: function(from, to) {
-    const err = new Error(),
-          lines = err.stack.split('\n');
-    return lines.slice(from, to).join('\n');
-  },
-
-  error: function(where, msg, obj) {
-    if (process.env.SERVER_ENV || this.logLevel < LOG_LEVEL_ERROR) {
-        return;
-    }
-    obj = obj || '';
-    console.error(this.cols.error(where), this.cols.error(msg), obj);
-
-    const stackLines = this.stackLines(3, 10);
-    where = 'ERROR: ' + stackLines + '\n / ' + where;
-    console.log(stackLines);
-  },
-
-  // move to TextLib
-  // does ~same as dashedName() method so remove this one
-  sanitize: function(str, opts) {
-    if (opts && opts.spaces) {
-      str = str.replace(/\s/g, '-');
-    }
-    str = str.toLowerCase();
-    str = str.replace('.md', '');
-    str = str.replace(/([^a-z0-9áéíóúñü_@\-\s]|[\t\n\f\r\v\0])/gim, '');
-    return str;
-  },
-
-  // display filenames replace the - with a space
-  namify: function(str) {
-    str = str.replace(/-/g, ' ');
-    return str;
-  },
-
-  asFileName: function(str) {
-    if (str) {
-      str = str.replace(/ /g, '-');
-    }
-    str = str.toLowerCase();
-    return str;
-  },
-
-  // text is optional if we want URL to be different from displayed text
-  linkify: function(path, where, text) {
-    let host;
-
-    where = where || 'wiki';
-    text = text || path;
-    if (!path) {
-      Utils.error('tried to linkify an empty item');
-      return '-----';
-    }
-    // not URL encoded
-    path = path.replace('?', '%3F');
-
-    switch (where) {
-      case 'gitter':
-      case 'camperbot':
-        host = AppConfig.gitterHost + AppConfig.getBotName() + '/';
-        break;
-      case 'wiki':
-        host = AppConfig.wikiHost;
-        break;
-      default:
-        break;
-    }
-
-    const uri = host + path,
-          name = Utils.namify(text),
-          link = '[' + name + '](' + uri + ')';
-    Utils.clog('Utils.linkify>', 'link', link);
-    return link;
-  },
-
-  splitParams: function(text) {
-    assert.isString(text);
-    let params;
-    const parts = text.split(' '),
-          keyword = parts.shift();
-
-    if (parts.length > 0) {
-      params = parts.join(' ');
-    }
-    const res = {
-      keyword: keyword,
-      params: params
-    };
-
-    return res;
-  },
-
-  checkNotNull: function(item, msg) {
-    if (item) {
-      // means OK
-      return true;
-    } else {
-      Utils.error(msg);
-      return false;
-    }
-  },
-
-  isObject: function(obj, errmsg) {
-    errmsg = errmsg || 'not an object';
-    return true;
-
-    if (typeof obj === 'object') {
-      // means OK
-      return true;
-    } else {
-      this.error(errmsg, obj);
-      return false;
-    }
-  },
-
-
-  makeMdnLinks: function(items) {
-    let out = '';
-    if (!items) {
-      Utils.error('tried to makeMdnLinks for no items');
-      return '';
-    }
-    items.forEach(one => {
-      out += '\n- [' + one + '](' + MDNlinks[one] + ')';
-    });
-    return out;
-  },
-
-  timeStamp: function(when, baseDate) {
-    let month, day;
-    baseDate = baseDate || new Date();
-    const d1 = new Date();
-
-    switch (when) {
-      case 'yesterday':
-      default:
-        d1.setDate(baseDate.getDate() - 1);
-    }
-
-    month = d1.getMonth() + 1;
-    month = _.padLeft(month, 2, '0');
-
-    day = d1.getDate();
-    day = _.padLeft(day, 2, '0');
-
-    const timestamp = d1.getFullYear() + '/' + month + '/' + day;
-    return timestamp;
-  },
-
-  hasProperty: function(obj, prop, msg) {
-    if (obj && obj.hasOwnProperty(prop)) {
-      return true;
-    }
-    msg = msg || 'ERROR';
-    Utils.error(msg);
-    Utils.error('missing property', prop, obj);
-    return false;
-  },
-
-  betaFooter: function() {
-    return '\n\n >this feature is linked to our [beta site](beta.freecodecamp' +
-      '.com), so it may not have all users til we go live with the new ' +
-      'release. Also check that FCC ID matches githubID!';
-  }
-};
-
-Utils.logLevel = parseInt(process.env.LOG_LEVEL || 4, 10);
-
-module.exports = Utils;
diff --git a/nap/logs/README.md b/nap/logs/README.md
deleted file mode 100644
index feeed59..0000000
--- a/nap/logs/README.md
+++ /dev/null
@@ -1 +0,0 @@
-this file keeps the directory even if contents are ignored
\ No newline at end of file
diff --git a/nap/mylogfile.log b/nap/mylogfile.log
deleted file mode 100644
index e69de29..0000000
diff --git a/nap/package.json b/nap/package.json
deleted file mode 100644
index ee44e72..0000000
--- a/nap/package.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "gitter-demo-app",
-  "version": "0.0.1",
-  "dependencies": {
-    "chai": "",
-    "cli-color": "",
-    "dotenv": "^1.2.0",
-    "express": "~3.4.4",
-    "glob": "",
-    "jade": "~0.35.0",
-    "js-yaml": "",
-    "lodash": "^3.10.1",
-    "node-gitter": "",
-    "passport": "~0.2.0",
-    "passport-oauth2": "~1.1.1",
-    "request": "~2.27.0",
-    "simple-node-logger": "",
-    "stringy": ""
-  },
-  "devDependencies": {
-    "babel-eslint": "^4.1.6",
-    "eslint": "^1.10.3",
-    "eslint-plugin-react": "^3.11.3",
-    "faucet": "0.0.1",
-    "gulp": "^3.9.0",
-    "gulp-env": "^0.2.0",
-    "gulp-eslint": "^1.1.0",
-    "gulp-tape": "0.0.7",
-    "nodemon": "~1.0.15",
-    "tape": "^4.2.2"
-  },
-  "scripts": {
-    "start": "node app.js",
-    "pretest": "make restart-test-server",
-    "test": "NODE_ENV=test mocha",
-    "posttest": "make stop-test-server"
-  }
-}
diff --git a/nap/public/css/app.css b/nap/public/css/app.css
deleted file mode 100644
index b8b3b18..0000000
--- a/nap/public/css/app.css
+++ /dev/null
@@ -1,24 +0,0 @@
-.navbar-logo {
-  margin: 10px 20px 0px 10px;
-}
-
-.center {
-  padding-top: 100px;
-  text-align: center;
-}
-
-.home img {
-  height: 100px;
-}
-
-.mono {
-  font-family: Monaco, "Liberation Mono", Courier, monospace;
-}
-
-.room-name {
-    font-size: 24px;
-}
-
-.topic-name {
-    font-size: 12px;
-}
\ No newline at end of file
diff --git a/nap/public/img/camperbot-cu.png b/nap/public/img/camperbot-cu.png
deleted file mode 100644
index aa19648..0000000
Binary files a/nap/public/img/camperbot-cu.png and /dev/null differ
diff --git a/nap/public/img/camperbot-qtr.png b/nap/public/img/camperbot-qtr.png
deleted file mode 100644
index 81a13d5..0000000
Binary files a/nap/public/img/camperbot-qtr.png and /dev/null differ
diff --git a/nap/public/img/gbot.jpg b/nap/public/img/gbot.jpg
deleted file mode 100644
index 0009c49..0000000
Binary files a/nap/public/img/gbot.jpg and /dev/null differ
diff --git a/nap/public/img/logo.png b/nap/public/img/logo.png
deleted file mode 100644
index 3e3d629..0000000
Binary files a/nap/public/img/logo.png and /dev/null differ
diff --git a/nap/public/img/robot_army.jpg b/nap/public/img/robot_army.jpg
deleted file mode 100644
index 522c7f4..0000000
Binary files a/nap/public/img/robot_army.jpg and /dev/null differ
diff --git a/nap/test/AppConfig.spec.js b/nap/test/AppConfig.spec.js
deleted file mode 100644
index cf21bce..0000000
--- a/nap/test/AppConfig.spec.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict';
-
-var test = require('tape'),
-    AppConfig = require('../config/AppConfig');
-
-test('AppConfig test', t => {
-  t.plan(3);
-
-  t.equal(AppConfig.testUser, 'bothelp', 'should have default AppConfig');
-
-  t.test('should make a topicDmUri', (st) => {
-    var topicDmUri = AppConfig.topicDmUri(),
-        expUri = AppConfig.appHost + '/go?dm=y&room=bothelp';
-    st.plan(1);
-    st.equal(topicDmUri, expUri);
-    st.end();
-  });
-
-  t.equal(AppConfig.getBotName(), 'bothelp', 'should setup the botname');
-
-  t.end();
-});
diff --git a/nap/test/Bonfires.spec.js b/nap/test/Bonfires.spec.js
deleted file mode 100644
index 0ecb45c..0000000
--- a/nap/test/Bonfires.spec.js
+++ /dev/null
@@ -1,109 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      Bonfires = require('../lib/app/Bonfires.js'),
-      InputWrap = require('../lib/bot/InputWrap'),
-      TestHelper = require('./TestHelper'),
-      GBot = require('../lib/bot/GBot.js'),
-      KBase = require('../lib/bot/KBase.js');
-
-const TESTROOMNAME = 'bonfire-factorialize-a-number',
-      TEST_BF_NAME = 'bonfire factorialize a number',
-      TEST_BF_TITLE = 'Bonfire Factorialize a Number';
-
-// sets a bonfire as active inside the current chat
-function testMessage(command) {
-    const message = TestHelper.makeMessageFromString(command);
-    return GBot.findAnyReply(message);
-}
-
-test('Bonfires test', t => {
-  t.plan(11);
-
-  // activate Bonfire
-  testMessage('bonfire ' + TEST_BF_TITLE);
-
-  t.notEqual(Bonfires.load().data.challenges[0], null,
-              'should load the Bonfies');
-
-  t.test('test find bonfire and stubInput', st => {
-    st.plan(3);
-
-    const bfName = TESTROOMNAME,
-          bf = Bonfires.findBonfire(bfName);
-
-    st.equal(bf.dashedName, bfName, 'should find a bonfire by roomname');
-    st.equal(TestHelper.stubInput.message.room.name, `bothelp/${bfName}`,
-            'stubInput test 1');
-
-    const sname = InputWrap.roomShortName(TestHelper.stubInput);
-    st.equal(sname, bfName, 'stubInput test 2');
-    st.end();
-  });
-
-  t.equal(Bonfires.allDashedNames()[0],
-          'waypoint-pair-program-on-bonfires',
-          'initialize allDashedNames');
-
-  t.equal(Bonfires.allNames()[0],
-          'Waypoint: Pair Program on Bonfires',
-          'initialize allNames');
-
-  t.test('findBonfire tests', st => {
-    st.plan(3);
-    const testBf = Bonfires.findBonfire(TEST_BF_NAME),
-          testDesc = testBf.description[0],
-          testLinks = Bonfires.getLinks(testBf);
-
-    st.equal(testDesc,
-            'Return the factorial of the provided integer.',
-            'should find bonfire from lowercase name');
-    st.notEqual(testLinks, null, 'links should not be null');
-    st.ok(testLinks.includes('links:'), 'links has valid formatting');
-    st.end();
-  });
-
-  t.test('should respond to bonfire details', st => {
-    st.plan(1);
-    const res = testMessage('bonfire details');
-    st.ok(res.includes('## :fire:[Bonfire'));
-    st.end();
-  });
-
-  t.test('should respond to bonfire links', st => {
-    st.plan(1);
-    const res = testMessage('bonfire links');
-    st.ok(res.includes('links:'));
-    st.end();
-  });
-
-  t.test('should respond to bonfire script', st => {
-    st.plan(1);
-    const res = testMessage('bonfire script');
-    st.ok(res.includes('```js \nfunction'));
-    st.end();
-  });
-
-  t.test('should respond to hints command', st => {
-    st.plan(1);
-    const res = testMessage('hint');
-    st.ok(res.includes('> :construction: Spoilers'));
-    st.end();
-  });
-
-  t.test('should find raw wiki hints from KBase', st =>{
-    st.plan(1);
-    const hints = KBase.getWikiHints(TEST_BF_TITLE);
-    st.ok(Array.isArray(hints));
-    st.end();
-  });
-
-  t.test('should have wikiHints linked to bonfire object', st =>{
-    st.plan(1);
-    const bf = Bonfires.findBonfire(TEST_BF_TITLE);
-    st.ok(Array.isArray(bf.hints));
-    st.end();
-  });
-
-  t.end();
-});
diff --git a/nap/test/Commands.spec.js b/nap/test/Commands.spec.js
deleted file mode 100644
index 2fb9262..0000000
--- a/nap/test/Commands.spec.js
+++ /dev/null
@@ -1,49 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      GBot = require('../lib/bot/GBot.js'),
-      BotCommands = require('../lib/bot/BotCommands'),
-      KBase = require('../lib/bot/KBase.js'),
-      TestHelper = require('./TestHelper');
-
-test('Command tests', t => {
-  t.plan(5);
-
-  t.doesNotThrow(() => {
-    KBase.initSync();
-  }, 'should load KBase');
-
-  t.test('isCommand: menu true', st => {
-    st.plan(1);
-    const input = {keyword: 'menu'},
-          res = BotCommands.isCommand(input);
-    st.ok(res);
-    st.end();
-  });
-
-  t.test('isCommand: XXXX false', st => {
-    st.plan(1);
-    const input = {keyword: 'XXXX'},
-          res = BotCommands.isCommand(input);
-    st.notOk(res);
-    st.end();
-  });
-
-  t.test('should show archives', st => {
-    st.plan(2);
-    const archive = BotCommands.archive(TestHelper.stubInput);
-    st.notEqual(archive, null, 'archive should not be null');
-    st.ok(archive.includes('Archives for '), 'should be a valid archive');
-    st.end();
-  });
-
-  t.test('should have a find command', st => {
-    st.plan(3);
-    const input = TestHelper.makeInputFromString('find js'),
-          res = BotCommands.find(input, GBot);
-    st.equal(input.keyword, 'find', 'keyword should be find');
-    st.equal(input.params, 'js', 'param should be js');
-    st.ok(res.includes('find **js**'), 'response should be valid');
-    st.end();
-  });
-});
diff --git a/nap/test/GBot.spec.js b/nap/test/GBot.spec.js
deleted file mode 100644
index dfa4e51..0000000
--- a/nap/test/GBot.spec.js
+++ /dev/null
@@ -1,90 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      AppConfig = require('../config/AppConfig'),
-      GBot = require('../lib/bot/GBot'),
-      TestHelper = require('./TestHelper'),
-      KBase = require('../lib/bot/KBase');
-
-function testMessage(command) {
-    const message = TestHelper.makeMessageFromString(command);
-    return GBot.findAnyReply(message);
-}
-
-test('GBot tests', t => {
-  t.plan(11);
-
-  t.doesNotThrow(() => {
-    KBase.initSync();
-  }, 'kbase should load');
-
-  t.equal(GBot.getName(), 'bothelp', 'bot should have a name');
-
-  t.test('GBot should not reply to itself', st => {
-    st.plan(1);
-    const botname = AppConfig.getBotName(),
-          flag = GBot.isBot(botname);
-    st.ok(flag);
-    st.end();
-  });
-
-  t.test('GBot should parse wiki input', st => {
-    st.plan(2);
-    const input = TestHelper.makeInputFromString('wiki bootstrap'),
-          output = GBot.parseInput(input.message);
-    st.equal(output.keyword, 'wiki', 'has correct keyword prop');
-    st.equal(output.params, 'bootstrap', 'has correct params prop');
-    st.end();
-  });
-
-  t.test('GBot should format non-help as false command', st => {
-    st.plan(1);
-    const input = TestHelper.makeMessageFromString('DONT bootstrap'),
-          output = GBot.parseInput(input);
-    st.notOk(output.command, 'should return false');
-    st.end();
-  });
-
-  t.skip('GBot should respond to wiki bootstrap', st => {
-    st.plan(1);
-    const res = testMessage('wiki bootstrap');
-    console.log(res);
-    t.ok(res.includes('## :point_right: [bootstrap'));
-    t.end();
-  });
-
-  t.test('GBot should have a botstatus response', st => {
-    st.plan(1);
-    const res = testMessage('botstatus');
-    st.ok(res.includes('All bot systems are go!'));
-    st.end();
-  });
-
-  t.test('GBot should have a menu command', st => {
-    st.plan(1);
-    const res = testMessage('menu');
-    st.ok(res.includes('type help for a list'));
-    st.end();
-  });
-
-  t.test('GBot should have a help command', st => {
-    st.plan(1);
-    const res = testMessage('help');
-    st.ok(res.includes('Hi, I\'m **[CamperBot]'));
-    st.end();
-  });
-
-  t.test('GBot should send a thanks karma reply', st => {
-    st.plan(1);
-    const res = testMessage('thanks @bob');
-    st.ok(res.includes('testuser sends brownie points to'));
-    st.end();
-  });
-
-  t.test('GBot should have a find command', st => {
-    st.plan(1);
-    const res = testMessage('find XXX');
-    st.ok(res.includes('find **'));
-    st.end();
-  });
-});
diff --git a/nap/test/GitterHelper.spec.js b/nap/test/GitterHelper.spec.js
deleted file mode 100644
index 717c39b..0000000
--- a/nap/test/GitterHelper.spec.js
+++ /dev/null
@@ -1,34 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      GitterHelper = require('../lib/gitter/GitterHelper');
-
-const TEST_ROOM_NAME = 'camperbot/localdev';
-
-test('GitterHelper tests', t => {
-  t.plan(3);
-
-  t.test('GitterHelper should find room by name', st => {
-    st.plan(1);
-    const foundRoom = function(blob) {
-      const foundRoomName = blob.gitterRoom.uri.toLowerCase();
-      st.equal(foundRoomName, TEST_ROOM_NAME);
-      st.end();
-    };
-    GitterHelper.findRoomByName(TEST_ROOM_NAME, foundRoom);
-  });
-
-  t.test('GitterHelper should store room info in cache', st => {
-    st.plan(1);
-    const foundRoom2 = function() {
-      const cachedRoom = GitterHelper.roomDataCache[TEST_ROOM_NAME];
-      st.equal(cachedRoom.uri, TEST_ROOM_NAME);
-      st.end();
-    };
-    GitterHelper.findRoomByName(TEST_ROOM_NAME, foundRoom2);
-  });
-
-  t.doesNotThrow(() => {
-    GitterHelper.sayToRoomName('autotest', TEST_ROOM_NAME);
-  }, 'should send a message to a named room');
-});
diff --git a/nap/test/HttpWrap.spec.js b/nap/test/HttpWrap.spec.js
deleted file mode 100644
index 5319bc5..0000000
--- a/nap/test/HttpWrap.spec.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      HttpWrap = require('../lib/utils/HttpWrap.js');
-
-test('HttpWrap tests', t => {
-  t.plan(1);
-  const name = 'berkeleytrue',
-        apiPath = '/api/users/about?username=' + name,
-        options = {method: 'GET'};
-
-  HttpWrap.callApi(apiPath, options, apiResult => {
-    t.equal(apiResult.response.about.username, 'berkeleytrue',
-            'should return correct username');
-    t.end();
-  });
-});
diff --git a/nap/test/Parser.spec.js b/nap/test/Parser.spec.js
deleted file mode 100644
index ec3ce20..0000000
--- a/nap/test/Parser.spec.js
+++ /dev/null
@@ -1,31 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      GBot = require('../lib/bot/GBot.js'),
-      TestHelper = require('./TestHelper');
-
-function testParser(command) {
-  const msg = TestHelper.makeMessageFromString(command);
-  return GBot.parseInput(msg);
-}
-
-test('Parser tests', t => {
-  t.plan(2);
-
-  t.test('should find a thanks command', st => {
-    st.plan(2);
-    const res = testParser('thanks @bob');
-    st.equal(res.keyword, 'thanks', 'keyword should be thanks');
-    st.ok(res.command);
-    st.end();
-  });
-
-  t.test('should parse a thanks command with a hashtag', st => {
-    st.plan(2);
-    const res = testParser('thanks @bob #hashtag');
-    st.equal(res.keyword, 'thanks');
-    st.ok(res.command);
-    st.end();
-  });
-
-});
diff --git a/nap/test/RoomMessages.spec.js b/nap/test/RoomMessages.spec.js
deleted file mode 100644
index 1a9af39..0000000
--- a/nap/test/RoomMessages.spec.js
+++ /dev/null
@@ -1,45 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      RoomMessages = require('../data/rooms/RoomMessages'),
-      TestHelper = require('./TestHelper');
-
-test('RoomMessages tests', t => {
-  t.plan(4);
-
-  t.test('should find a message', st => {
-    st.plan(1);
-    const msg = 'you gotta holler i say',
-          input = TestHelper.makeInputFromString(msg),
-          res = RoomMessages.scanInput(input, 'camperbot/testing', 1);
-    st.equal(res.text, '> holler back!');
-    st.end();
-  });
-
-  t.test('should be silent in 0 chance tooms', st => {
-    st.plan(1);
-    const msg = 'you gotta holler i say',
-          input = TestHelper.makeInputFromString(msg),
-          res = RoomMessages.scanInput(input, 'camperbot/testing', 0);
-    st.equal(res, null);
-    st.end();
-  });
-
-  t.test(`should find a message three ticks '''`, st => {
-    st.plan(1);
-    const msg = `mistake ''' text`,
-          input = TestHelper.makeInputFromString(msg),
-          res = RoomMessages.scanInput(input, 'camperbot/testing', 1);
-    st.ok(res.text.includes('> :bulb: to format'));
-    st.end();
-  });
-
-  t.test('should find a message for a bonfire', st => {
-    st.plan(1);
-    const msg = 'help for bonfire XXX',
-          input = TestHelper.makeInputFromString(msg),
-          res = RoomMessages.scanInput(input, 'camperbot/testing', 1);
-    st.ok(res.text.includes('> type `bonfire name`'));
-    st.end();
-  });
-});
diff --git a/nap/test/Rooms.spec.js b/nap/test/Rooms.spec.js
deleted file mode 100644
index fa42a60..0000000
--- a/nap/test/Rooms.spec.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      Rooms = require('../lib/app/Rooms.js');
-
-test('Rooms tests', t => {
-  t.plan(3);
-
-  t.equal(Rooms.findByTopic('bonfires').name,
-          'bothelp/HelpBonfires',
-          'should find a room for topic');
-
-  t.equal(Rooms.findByName('bothelp/HelpBonfires').name,
-          'bothelp/HelpBonfires',
-          'should find a room by name');
-
-  t.test('should find a bonfire room', st => {
-    st.plan(2);
-    const room = Rooms.findByName('bothelp/bonfire-factorialize-a-number');
-    st.equal(room.name, 'bothelp/bonfire-factorialize-a-number',
-             'name is correct');
-    st.equal(room.isBonfire, true, 'should be flagged as bonfire');
-    st.end();
-  });
-});
diff --git a/nap/test/TestHelper.js b/nap/test/TestHelper.js
deleted file mode 100644
index cdb1dbd..0000000
--- a/nap/test/TestHelper.js
+++ /dev/null
@@ -1,150 +0,0 @@
-"use strict";
-
-
-var GBot = require('../lib/bot/GBot');
-
-var TestHelper = {
-    aboutInput: {
-        keyword: 'about',
-        params: '@bothelp ',
-        message: {
-            operation: 'create',
-            model: {
-                id: '55b95acb5bc8dc88744243ff',
-                text: 'about @bothelp',
-                html: 'about <span data-link-type="mention" data-screen-name="bothelp" class="mention">@bothelp</span> ',
-                sent: '2015-07-29T22:59:23.187Z',
-                editedAt: null,
-                fromUser: {
-                    username: "testuser"
-                },
-                unread: true,
-                readBy: 0,
-                urls: [],
-                mentions: [
-                    {screenName: 'dcsan'},
-                    {screenName: 'berkeleytrue'}
-                ],
-                issues: [],
-                meta: {},
-                v: 1
-            },
-            room: {
-                path: '/rooms',
-                id: '55b3d5780fc9f982beaaf7f4',
-                name: 'camperbot/localdev',
-                topic: ' testing',
-                uri: 'camperbot/localdev',
-                oneToOne: false,
-                userCount: 5,
-                unreadItems: 100,
-                mentions: 27,
-                lastAccessTime: '2015-07-29T14:41:04.820Z',
-                lurk: false,
-                url: '/camperbot/localdev',
-                githubType: 'USER_CHANNEL',
-                security: 'PUBLIC',
-                noindex: false,
-                v: 1,
-                client: [Object],
-                faye: [Object],
-                _events: [Object]
-            }
-        },
-        cleanText: 'about @bothelp ',
-        command: true
-    },
-
-    stubInput: {
-        keyword: 'hint',
-        params: undefined,
-        message: {
-            operation: 'create',
-            model: {
-                id: '55b91175c35e438c74fc725c',
-                text: 'hint',
-                html: 'hint',
-                sent: '2015-07-29T17:46:29.190Z',
-                editedAt: null,
-                fromUser: [Object],
-                unread: true,
-                readBy: 0,
-                urls: [],
-                mentions: [],
-                issues: [],
-                meta: {},
-                v: 1
-            },
-            room: {
-                path: '/rooms',
-                id: '55b8fc980fc9f982beab6b19',
-                name: 'bothelp/bonfire-factorialize-a-number',
-                topic: '',
-                uri: 'bothelp/bonfire-factorialize-a-number',
-                oneToOne: false,
-                userCount: 3,
-                unreadItems: 9,
-                mentions: 0,
-                lastAccessTime: '2015-07-29T16:17:28.850Z',
-                lurk: false,
-                url: '/bothelp/bonfire-factorialize-a-number',
-                githubType: 'USER_CHANNEL',
-                security: 'PUBLIC',
-                noindex: false,
-                client: [Object],
-                faye: [Object],
-                _events: [Object]
-            }
-        },
-        cleanText: 'hint',
-        command: true
-    },
-
-    mockInput: function(roomName) {
-        var input = {
-            message: {
-                room: {
-                    name: roomName
-                }
-            }
-        };
-        // clog(input);
-        return input;
-    },
-
-    // used for tests
-    // and also strings to commands
-    // https://developer.gitter.im/docs/messages-resource
-    // makeInputFromString: function (text) {
-    //     var message = {};
-    //     var model = {
-    //         text: text
-    //     };
-    //     message.model = model;
-    //     return message;
-    // },
-
-    makeInputFromString: function (text) {
-        var input = TestHelper.aboutInput;
-        input.message.model.text = text;    // initialize before parsing
-        //console.log("input1", input);
-        input = GBot.parseInput(input.message);  // add keywords etc.
-        //console.log("input2", input);
-        input.message.model.text = text;
-        input.message.model.fromUser = {
-            username: "testuser"
-        };
-        return input;
-    },
-
-    makeMessageFromString: function (text) {
-        var input = TestHelper.makeInputFromString(text);
-        return input.message;
-    }
-
-
-};
-
-
-
-module.exports = TestHelper;
diff --git a/nap/test/TextLib.spec.js b/nap/test/TextLib.spec.js
deleted file mode 100644
index 2df6112..0000000
--- a/nap/test/TextLib.spec.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      TextLib = require('../lib/utils/TextLib'),
-      KBase = require('../lib/bot/Kbase');
-
-test('TextLib tests', t => {
-  t.plan(3);
-
-  t.doesNotThrow(() => {
-    KBase.initSync();
-  }, 'kbase should load');
-
-  var longTextBlock = `# Headline
-  line 1
-  line 2
-  line 3
-  line 4
-  line 5
-  line 6
-  line 7
-  line 8
-  line 9
-  line 10
-  `;
-
-  t.test('should take the first 5 lines of a chunk', st => {
-    st.plan(3);
-    const short = TextLib.trimLines(longTextBlock, 5),
-          split = short.split('\n');
-    st.equal(split.length, 5, 'should have trimmed correct number of lines');
-    st.ok(split[0].includes('# Headline'), 'first line should be correct');
-    st.ok(split[split.length - 1].includes('line 4'),
-          'last line should be correct');
-    st.end();
-  });
-
-  t.test('should trim camperbot entry', st => {
-    st.plan(3);
-    const params = 'camperbot',
-          topicData = KBase.getTopicData(params),
-          short = TextLib.trimLines(topicData.data),
-          split = short.split('\n');
-    st.equal(split.length, 12, 'should have trimmed correct number of lines');
-    st.ok(split[0].includes('Hi, I\'m **[CamperBot'),
-          'first line should be correct');
-    st.equal(split[split.length - 1], '',
-          'last line should be correct');
-    st.end();
-  });
-});
diff --git a/nap/test/Thanks.spec.js b/nap/test/Thanks.spec.js
deleted file mode 100644
index 79b9dc9..0000000
--- a/nap/test/Thanks.spec.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      GBot = require('../lib/bot/GBot'),
-      TestHelper = require('./TestHelper');
-
-test('Thanks tests', t => {
-  t.plan(1);
-
-  t.test('should work for two users', st => {
-    st.plan(1);
-    var msg = TestHelper.makeInputFromString('thanks @dcsan @bob'),
-        res = GBot.findAnyReply(msg.message);
-    st.ok(res.includes('> testuser sends brownie points to ' +
-                       '@dcsan and @berkeleytrue'));
-    st.end();
-  });
-});
diff --git a/nap/test/Utils.spec.js b/nap/test/Utils.spec.js
deleted file mode 100644
index fa39f20..0000000
--- a/nap/test/Utils.spec.js
+++ /dev/null
@@ -1,58 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      Utils = require('../lib/utils/Utils');
-
-test('Utils tests', t => {
-  t.plan(9);
-
-  t.equal(Utils.linkify('wiki', 'wiki'),
-          '[wiki](https://github.com/freecodecamp/freecodecamp/wiki/wiki)',
-          'should linkify');
-
-  t.equal(Utils.namify('some-page-here'),
-          'some page here',
-          'should namify');
-
-  t.equal(Utils.sanitize('something-special?.md'),
-          'something-special',
-          'should sanitize file name strings');
-
-  t.equal(Utils.sanitize('thanks bob', {spaces: false}),
-          'thanks bob',
-          'sanitize with spaces:false should not remove spaces');
-
-  t.equal(Utils.sanitize('thanks for that', {spaces: true}),
-          'thanks-for-that',
-          'sanitize with spaces:true should convert spaces to dashes');
-
-  t.test('splitParams command only', st => {
-    st.plan(2);
-    const res = Utils.splitParams('menu');
-    st.equal(res.keyword, 'menu', 'should have menu keyword');
-    st.notOk(res.params, 'should have no params');
-    st.end();
-  });
-
-  t.test('splitParams command and one param', st => {
-    st.plan(2);
-    const res = Utils.splitParams('menu options');
-    st.equal(res.keyword, 'menu', 'should have menu keyword');
-    st.equal(res.params, 'options', 'should have options param');
-    st.end();
-  });
-
-  t.test('splitParams command and multiple params', st => {
-    st.plan(2);
-    const res = Utils.splitParams('menu with more stuff');
-    st.equal(res.keyword, 'menu', 'should have menu keyword');
-    st.equal(res.params, 'with more stuff',
-             'should have with more stuff params');
-    st.end();
-  });
-
-  t.equal(Utils.linkify('SomePageName'),
-          '[SomePageName](https://github.com/' +
-            'freecodecamp/freecodecamp/wiki/SomePageName)',
-          'should make a wiki link');
-});
diff --git a/nap/test/Wiki.spec.js b/nap/test/Wiki.spec.js
deleted file mode 100644
index 6542dc9..0000000
--- a/nap/test/Wiki.spec.js
+++ /dev/null
@@ -1,35 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      KBase = require('../lib/bot/KBase.js');
-
-test('Wiki tests', t => {
-  t.plan(4);
-
-  t.test('should load KBase', st => {
-    st.plan(2);
-    let allData;
-    st.doesNotThrow(() => {
-      allData = KBase.initSync();
-    });
-    st.ok(Array.isArray(allData));
-    st.end();
-  });
-
-  // These lookups are not grabbing the right wiki article
-  // Skipping for now.
-  t.skip(KBase.getTopicData('css-selectors').dashedName,
-          'css-selectors',
-          'should find a css page');
-
-  t.skip(KBase.getTopicData('bootstrap').dashedName,
-          'bootstrap',
-          'should find a bootstrap page');
-
-  t.test('should get wiki data back', st => {
-    st.plan(1);
-    const entry = KBase.getTopicData('camperbot');
-    st.ok(entry.shortData.includes('Hi, I\'m **[CamperBot]'));
-    st.end();
-  });
-});
diff --git a/nap/test/routes.spec.js b/nap/test/routes.spec.js
deleted file mode 100644
index 03d6b7f..0000000
--- a/nap/test/routes.spec.js
+++ /dev/null
@@ -1,33 +0,0 @@
-'use strict';
-
-const test = require('tape'),
-      routes = require('../lib/app/routes.js');
-
-test('Routes tests', t => {
-  t.plan(2);
-
-  t.test('should use room from params for route redir', st => {
-    st.plan(4);
-    const query = {room: 'random'},
-          redir = routes.findRedirect(query),
-          url = 'https://gitter.im/' + query.room;
-
-    st.ok(redir.room, 'route has a room');
-    st.ok(redir.org, 'route has an org');
-    st.ok(redir.url, 'route has a url');
-    st.equal(redir.url, url, 'route url is correct');
-    st.end();
-  });
-
-  t.test('should find DM room go URI', st => {
-    st.plan(3);
-    const query = {room: 'bothelp'},
-          redir = routes.findRedirect(query),
-          url = 'https://gitter.im/' + query.room;
-
-    st.ok(redir.room, 'route has a room');
-    st.ok(redir.url, 'route has a url');
-    st.equal(redir.url, url, 'route url is correct');
-    st.end();
-  });
-});
diff --git a/nap/views/home.jade b/nap/views/home.jade
deleted file mode 100644
index 5460552..0000000
--- a/nap/views/home.jade
+++ /dev/null
@@ -1,49 +0,0 @@
-extends layout
-
-block content
-
-  include nav
-
-  .container-fluid
-
-    div 
-        img.img-circle(src="#{user.avatarUrlMedium}")
-        span.small Hello 
-        span.h1 #{user.username}!
-    //- p  clientId: 
-    //-   span.mono #{clientId}
-    //- p sessionToken: 
-    //-   span.mono #{sessionToken}
-    //- p 
-    //-   |Search 
-    //-   a(href='https://developer.gitter.im/docs/welcome')
-    //-     |Developer documentation
-    //-   |. 
-
-    div.page-header
-        h2 Your rooms
-
-    table.table.table-striped.table-hover
-        thead
-            tr
-                td name
-                td users
-                td oneToOne
-                td unread
-                td githubType
-                td security
-        - each room in rooms
-            tr
-                td
-                    a.btn.btn-lg.btn-primary(href="https://gitter.im#{room.url}") #{room.name} &nbsp;
-                td #{room.userCount}
-                td
-                    if room.oneToOne
-                        span.label.label-warning TRUE
-                    else
-                        span.label.label-info FALSE
-
-                td #{room.unreadItems}
-                td #{room.githubType}
-                td #{room.security}
-            
diff --git a/nap/views/landing.jade b/nap/views/landing.jade
deleted file mode 100644
index 1c00030..0000000
--- a/nap/views/landing.jade
+++ /dev/null
@@ -1,13 +0,0 @@
-extends layout
-
-block content
-
-  include nav
-
-  .container-fluid
-    .row
-      .col-md-12
-        .home
-          h1 Gitter Demo App
-          p
-            a(href="/login").btn.btn-primary Sign in
diff --git a/nap/views/layout.jade b/nap/views/layout.jade
deleted file mode 100644
index 3a134dc..0000000
--- a/nap/views/layout.jade
+++ /dev/null
@@ -1,14 +0,0 @@
-doctype 5
-head
-  meta(charset="utf-8")
-  meta(http-equiv="X-UA-Compatible", content="IE=edge")
-  meta(name="viewport", content="width=device-width, initial-scale=1")
-
-  link(href='//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css', rel='stylesheet')
-  link(href='/css/app.css', rel='stylesheet')
-
-  title Gitterbot host app
-body
-  block content
-  script(src='//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js')
-  script(src='//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js')
diff --git a/nap/views/nav.jade b/nap/views/nav.jade
deleted file mode 100644
index 7846be9..0000000
--- a/nap/views/nav.jade
+++ /dev/null
@@ -1,33 +0,0 @@
-nav.navbar.navbar-default(role='navigation')
-  .container
-    .navbar-header
-      button.navbar-toggle(type='button', data-toggle='collapse', data-target='#navbar-collapse')
-        span.sr-only Toggle navigation
-        span.icon-bar
-        span.icon-bar
-        span.icon-bar
-      p.navbar-logo(href='#')
-        img(src="/img/logo.png")
-
-    #navbar-collapse.collapse.navbar-collapse
-      ul.nav.navbar-nav
-        li
-          a(href='/home') home
-        li
-          a(href='/rooms') rooms
-        li
-          a(href='/rooms/update') update
-
-      if user
-        ul.nav.navbar-nav.navbar-right
-          li.dropdown
-            a.dropdown-toggle(href='#', data-toggle='dropdown')
-              | Hi #{user.username}! 
-              b.caret
-            ul.dropdown-menu
-              li
-                a(href='/logout') Sign out
-      else
-        ul.nav.navbar-nav.navbar-right
-          li
-            a(href="/login") Sign in
diff --git a/nap/views/rooms.jade b/nap/views/rooms.jade
deleted file mode 100644
index 856f1e3..0000000
--- a/nap/views/rooms.jade
+++ /dev/null
@@ -1,54 +0,0 @@
-extends layout
-
-block content
-
-    include nav
-
-    .container-fluid
-        h1 GitterBot Rooms
-
-        a.btn.btn-lg.btn-default(href=topicDmUri) DM with bothelp
-        span.btn.btn-sm #{topicDmUri}
-
-
-        - each room in rooms
-            .well
-                .container-fluid
-                    .row
-                        .col-md-3
-                            div HBF + topic=#{room.topic}
-                        .col-md-4
-                            a.btn.btn-med.btn-default(href="/go?room=#{room.entry}&topic=#{room.topic}&who=#{who}")
-                                span #{room.entry}<b>&topic=#{room.topic}</b>
-
-                            br
-                            br
-
-                    .row
-                        .col-md-3
-                            div dedicated room
-                        .col-md-4
-                            a.btn.btn-med.btn-success(href="/go?room=#{room.name}&who=#{who}")
-                                span #{room.name}
-
-
-        //.col-md-8
-                        //    if room.topics
-                        //        - each topic in room.topics
-                        //            a.btn.btn-default(href="/go?topic=#{topic}&who=#{who}") #{topic}
-                        //            &nbsp;
-                        //            span /go?topic=#{topic}&who=#{who}
-                        //            br
-        //
-        //h2 Bonfire Rooms
-        //.container-fluid
-        //    - each bonfire in bonfires
-        //        //- a.btn.btn-lg.btn-success(href="/go?room=#{bonfire.dashedName}&who=#{who}") #{bonfire.name} &nbsp;
-        //        .row
-        //            hr
-        //            .col-md-6
-        //                a.btn.btn-lg.btn-success(href="https://gitter.im/camperbot/#{bonfire.dashedName}?who=#{who}") #{bonfire.name} &nbsp;
-        //                p #{bonfire.description[0]}
-        //            .col-md-6
-        //                a.btn.btn-default(href="/go?room=camperbot/#{bonfire.dashedName}?who=#{who}&topic=question") #{bonfire.name} &nbsp;
-        //                p #{bonfire.dashedName}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..ee44e72
--- /dev/null
+++ b/package.json
@@ -0,0 +1,38 @@
+{
+  "name": "gitter-demo-app",
+  "version": "0.0.1",
+  "dependencies": {
+    "chai": "",
+    "cli-color": "",
+    "dotenv": "^1.2.0",
+    "express": "~3.4.4",
+    "glob": "",
+    "jade": "~0.35.0",
+    "js-yaml": "",
+    "lodash": "^3.10.1",
+    "node-gitter": "",
+    "passport": "~0.2.0",
+    "passport-oauth2": "~1.1.1",
+    "request": "~2.27.0",
+    "simple-node-logger": "",
+    "stringy": ""
+  },
+  "devDependencies": {
+    "babel-eslint": "^4.1.6",
+    "eslint": "^1.10.3",
+    "eslint-plugin-react": "^3.11.3",
+    "faucet": "0.0.1",
+    "gulp": "^3.9.0",
+    "gulp-env": "^0.2.0",
+    "gulp-eslint": "^1.1.0",
+    "gulp-tape": "0.0.7",
+    "nodemon": "~1.0.15",
+    "tape": "^4.2.2"
+  },
+  "scripts": {
+    "start": "node app.js",
+    "pretest": "make restart-test-server",
+    "test": "NODE_ENV=test mocha",
+    "posttest": "make stop-test-server"
+  }
+}
diff --git a/public/css/app.css b/public/css/app.css
new file mode 100644
index 0000000..b8b3b18
--- /dev/null
+++ b/public/css/app.css
@@ -0,0 +1,24 @@
+.navbar-logo {
+  margin: 10px 20px 0px 10px;
+}
+
+.center {
+  padding-top: 100px;
+  text-align: center;
+}
+
+.home img {
+  height: 100px;
+}
+
+.mono {
+  font-family: Monaco, "Liberation Mono", Courier, monospace;
+}
+
+.room-name {
+    font-size: 24px;
+}
+
+.topic-name {
+    font-size: 12px;
+}
\ No newline at end of file
diff --git a/public/img/camperbot-cu.png b/public/img/camperbot-cu.png
new file mode 100644
index 0000000..aa19648
Binary files /dev/null and b/public/img/camperbot-cu.png differ
diff --git a/public/img/camperbot-qtr.png b/public/img/camperbot-qtr.png
new file mode 100644
index 0000000..81a13d5
Binary files /dev/null and b/public/img/camperbot-qtr.png differ
diff --git a/public/img/gbot.jpg b/public/img/gbot.jpg
new file mode 100644
index 0000000..0009c49
Binary files /dev/null and b/public/img/gbot.jpg differ
diff --git a/public/img/logo.png b/public/img/logo.png
new file mode 100644
index 0000000..3e3d629
Binary files /dev/null and b/public/img/logo.png differ
diff --git a/public/img/robot_army.jpg b/public/img/robot_army.jpg
new file mode 100644
index 0000000..522c7f4
Binary files /dev/null and b/public/img/robot_army.jpg differ
diff --git a/test/AppConfig.spec.js b/test/AppConfig.spec.js
new file mode 100644
index 0000000..cf21bce
--- /dev/null
+++ b/test/AppConfig.spec.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var test = require('tape'),
+    AppConfig = require('../config/AppConfig');
+
+test('AppConfig test', t => {
+  t.plan(3);
+
+  t.equal(AppConfig.testUser, 'bothelp', 'should have default AppConfig');
+
+  t.test('should make a topicDmUri', (st) => {
+    var topicDmUri = AppConfig.topicDmUri(),
+        expUri = AppConfig.appHost + '/go?dm=y&room=bothelp';
+    st.plan(1);
+    st.equal(topicDmUri, expUri);
+    st.end();
+  });
+
+  t.equal(AppConfig.getBotName(), 'bothelp', 'should setup the botname');
+
+  t.end();
+});
diff --git a/test/Bonfires.spec.js b/test/Bonfires.spec.js
new file mode 100644
index 0000000..0ecb45c
--- /dev/null
+++ b/test/Bonfires.spec.js
@@ -0,0 +1,109 @@
+'use strict';
+
+const test = require('tape'),
+      Bonfires = require('../lib/app/Bonfires.js'),
+      InputWrap = require('../lib/bot/InputWrap'),
+      TestHelper = require('./TestHelper'),
+      GBot = require('../lib/bot/GBot.js'),
+      KBase = require('../lib/bot/KBase.js');
+
+const TESTROOMNAME = 'bonfire-factorialize-a-number',
+      TEST_BF_NAME = 'bonfire factorialize a number',
+      TEST_BF_TITLE = 'Bonfire Factorialize a Number';
+
+// sets a bonfire as active inside the current chat
+function testMessage(command) {
+    const message = TestHelper.makeMessageFromString(command);
+    return GBot.findAnyReply(message);
+}
+
+test('Bonfires test', t => {
+  t.plan(11);
+
+  // activate Bonfire
+  testMessage('bonfire ' + TEST_BF_TITLE);
+
+  t.notEqual(Bonfires.load().data.challenges[0], null,
+              'should load the Bonfies');
+
+  t.test('test find bonfire and stubInput', st => {
+    st.plan(3);
+
+    const bfName = TESTROOMNAME,
+          bf = Bonfires.findBonfire(bfName);
+
+    st.equal(bf.dashedName, bfName, 'should find a bonfire by roomname');
+    st.equal(TestHelper.stubInput.message.room.name, `bothelp/${bfName}`,
+            'stubInput test 1');
+
+    const sname = InputWrap.roomShortName(TestHelper.stubInput);
+    st.equal(sname, bfName, 'stubInput test 2');
+    st.end();
+  });
+
+  t.equal(Bonfires.allDashedNames()[0],
+          'waypoint-pair-program-on-bonfires',
+          'initialize allDashedNames');
+
+  t.equal(Bonfires.allNames()[0],
+          'Waypoint: Pair Program on Bonfires',
+          'initialize allNames');
+
+  t.test('findBonfire tests', st => {
+    st.plan(3);
+    const testBf = Bonfires.findBonfire(TEST_BF_NAME),
+          testDesc = testBf.description[0],
+          testLinks = Bonfires.getLinks(testBf);
+
+    st.equal(testDesc,
+            'Return the factorial of the provided integer.',
+            'should find bonfire from lowercase name');
+    st.notEqual(testLinks, null, 'links should not be null');
+    st.ok(testLinks.includes('links:'), 'links has valid formatting');
+    st.end();
+  });
+
+  t.test('should respond to bonfire details', st => {
+    st.plan(1);
+    const res = testMessage('bonfire details');
+    st.ok(res.includes('## :fire:[Bonfire'));
+    st.end();
+  });
+
+  t.test('should respond to bonfire links', st => {
+    st.plan(1);
+    const res = testMessage('bonfire links');
+    st.ok(res.includes('links:'));
+    st.end();
+  });
+
+  t.test('should respond to bonfire script', st => {
+    st.plan(1);
+    const res = testMessage('bonfire script');
+    st.ok(res.includes('```js \nfunction'));
+    st.end();
+  });
+
+  t.test('should respond to hints command', st => {
+    st.plan(1);
+    const res = testMessage('hint');
+    st.ok(res.includes('> :construction: Spoilers'));
+    st.end();
+  });
+
+  t.test('should find raw wiki hints from KBase', st =>{
+    st.plan(1);
+    const hints = KBase.getWikiHints(TEST_BF_TITLE);
+    st.ok(Array.isArray(hints));
+    st.end();
+  });
+
+  t.test('should have wikiHints linked to bonfire object', st =>{
+    st.plan(1);
+    const bf = Bonfires.findBonfire(TEST_BF_TITLE);
+    st.ok(Array.isArray(bf.hints));
+    st.end();
+  });
+
+  t.end();
+});
diff --git a/test/Commands.spec.js b/test/Commands.spec.js
new file mode 100644
index 0000000..2fb9262
--- /dev/null
+++ b/test/Commands.spec.js
@@ -0,0 +1,49 @@
+'use strict';
+
+const test = require('tape'),
+      GBot = require('../lib/bot/GBot.js'),
+      BotCommands = require('../lib/bot/BotCommands'),
+      KBase = require('../lib/bot/KBase.js'),
+      TestHelper = require('./TestHelper');
+
+test('Command tests', t => {
+  t.plan(5);
+
+  t.doesNotThrow(() => {
+    KBase.initSync();
+  }, 'should load KBase');
+
+  t.test('isCommand: menu true', st => {
+    st.plan(1);
+    const input = {keyword: 'menu'},
+          res = BotCommands.isCommand(input);
+    st.ok(res);
+    st.end();
+  });
+
+  t.test('isCommand: XXXX false', st => {
+    st.plan(1);
+    const input = {keyword: 'XXXX'},
+          res = BotCommands.isCommand(input);
+    st.notOk(res);
+    st.end();
+  });
+
+  t.test('should show archives', st => {
+    st.plan(2);
+    const archive = BotCommands.archive(TestHelper.stubInput);
+    st.notEqual(archive, null, 'archive should not be null');
+    st.ok(archive.includes('Archives for '), 'should be a valid archive');
+    st.end();
+  });
+
+  t.test('should have a find command', st => {
+    st.plan(3);
+    const input = TestHelper.makeInputFromString('find js'),
+          res = BotCommands.find(input, GBot);
+    st.equal(input.keyword, 'find', 'keyword should be find');
+    st.equal(input.params, 'js', 'param should be js');
+    st.ok(res.includes('find **js**'), 'response should be valid');
+    st.end();
+  });
+});
diff --git a/test/GBot.spec.js b/test/GBot.spec.js
new file mode 100644
index 0000000..dfa4e51
--- /dev/null
+++ b/test/GBot.spec.js
@@ -0,0 +1,90 @@
+'use strict';
+
+const test = require('tape'),
+      AppConfig = require('../config/AppConfig'),
+      GBot = require('../lib/bot/GBot'),
+      TestHelper = require('./TestHelper'),
+      KBase = require('../lib/bot/KBase');
+
+function testMessage(command) {
+    const message = TestHelper.makeMessageFromString(command);
+    return GBot.findAnyReply(message);
+}
+
+test('GBot tests', t => {
+  t.plan(11);
+
+  t.doesNotThrow(() => {
+    KBase.initSync();
+  }, 'kbase should load');
+
+  t.equal(GBot.getName(), 'bothelp', 'bot should have a name');
+
+  t.test('GBot should not reply to itself', st => {
+    st.plan(1);
+    const botname = AppConfig.getBotName(),
+          flag = GBot.isBot(botname);
+    st.ok(flag);
+    st.end();
+  });
+
+  t.test('GBot should parse wiki input', st => {
+    st.plan(2);
+    const input = TestHelper.makeInputFromString('wiki bootstrap'),
+          output = GBot.parseInput(input.message);
+    st.equal(output.keyword, 'wiki', 'has correct keyword prop');
+    st.equal(output.params, 'bootstrap', 'has correct params prop');
+    st.end();
+  });
+
+  t.test('GBot should format non-help as false command', st => {
+    st.plan(1);
+    const input = TestHelper.makeMessageFromString('DONT bootstrap'),
+          output = GBot.parseInput(input);
+    st.notOk(output.command, 'should return false');
+    st.end();
+  });
+
+  t.skip('GBot should respond to wiki bootstrap', st => {
+    st.plan(1);
+    const res = testMessage('wiki bootstrap');
+    console.log(res);
+    t.ok(res.includes('## :point_right: [bootstrap'));
+    t.end();
+  });
+
+  t.test('GBot should have a botstatus response', st => {
+    st.plan(1);
+    const res = testMessage('botstatus');
+    st.ok(res.includes('All bot systems are go!'));
+    st.end();
+  });
+
+  t.test('GBot should have a menu command', st => {
+    st.plan(1);
+    const res = testMessage('menu');
+    st.ok(res.includes('type help for a list'));
+    st.end();
+  });
+
+  t.test('GBot should have a help command', st => {
+    st.plan(1);
+    const res = testMessage('help');
+    st.ok(res.includes('Hi, I\'m **[CamperBot]'));
+    st.end();
+  });
+
+  t.test('GBot should send a thanks karma reply', st => {
+    st.plan(1);
+    const res = testMessage('thanks @bob');
+    st.ok(res.includes('testuser sends brownie points to'));
+    st.end();
+  });
+
+  t.test('GBot should have a find command', st => {
+    st.plan(1);
+    const res = testMessage('find XXX');
+    st.ok(res.includes('find **'));
+    st.end();
+  });
+});
diff --git a/test/GitterHelper.spec.js b/test/GitterHelper.spec.js
new file mode 100644
index 0000000..717c39b
--- /dev/null
+++ b/test/GitterHelper.spec.js
@@ -0,0 +1,34 @@
+'use strict';
+
+const test = require('tape'),
+      GitterHelper = require('../lib/gitter/GitterHelper');
+
+const TEST_ROOM_NAME = 'camperbot/localdev';
+
+test('GitterHelper tests', t => {
+  t.plan(3);
+
+  t.test('GitterHelper should find room by name', st => {
+    st.plan(1);
+    const foundRoom = function(blob) {
+      const foundRoomName = blob.gitterRoom.uri.toLowerCase();
+      st.equal(foundRoomName, TEST_ROOM_NAME);
+      st.end();
+    };
+    GitterHelper.findRoomByName(TEST_ROOM_NAME, foundRoom);
+  });
+
+  t.test('GitterHelper should store room info in cache', st => {
+    st.plan(1);
+    const foundRoom2 = function() {
+      const cachedRoom = GitterHelper.roomDataCache[TEST_ROOM_NAME];
+      st.equal(cachedRoom.uri, TEST_ROOM_NAME);
+      st.end();
+    };
+    GitterHelper.findRoomByName(TEST_ROOM_NAME, foundRoom2);
+  });
+
+  t.doesNotThrow(() => {
+    GitterHelper.sayToRoomName('autotest', TEST_ROOM_NAME);
+  }, 'should send a message to a named room');
+});
diff --git a/test/HttpWrap.spec.js b/test/HttpWrap.spec.js
new file mode 100644
index 0000000..5319bc5
--- /dev/null
+++ b/test/HttpWrap.spec.js
@@ -0,0 +1,17 @@
+'use strict';
+
+const test = require('tape'),
+      HttpWrap = require('../lib/utils/HttpWrap.js');
+
+test('HttpWrap tests', t => {
+  t.plan(1);
+  const name = 'berkeleytrue',
+        apiPath = '/api/users/about?username=' + name,
+        options = {method: 'GET'};
+
+  HttpWrap.callApi(apiPath, options, apiResult => {
+    t.equal(apiResult.response.about.username, 'berkeleytrue',
+            'should return correct username');
+    t.end();
+  });
+});
diff --git a/test/Parser.spec.js b/test/Parser.spec.js
new file mode 100644
index 0000000..ec3ce20
--- /dev/null
+++ b/test/Parser.spec.js
@@ -0,0 +1,31 @@
+'use strict';
+
+const test = require('tape'),
+      GBot = require('../lib/bot/GBot.js'),
+      TestHelper = require('./TestHelper');
+
+function testParser(command) {
+  const msg = TestHelper.makeMessageFromString(command);
+  return GBot.parseInput(msg);
+}
+
+test('Parser tests', t => {
+  t.plan(2);
+
+  t.test('should find a thanks command', st => {
+    st.plan(2);
+    const res = testParser('thanks @bob');
+    st.equal(res.keyword, 'thanks', 'keyword should be thanks');
+    st.ok(res.command);
+    st.end();
+  });
+
+  t.test('should parse a thanks command with a hashtag', st => {
+    st.plan(2);
+    const res = testParser('thanks @bob #hashtag');
+    st.equal(res.keyword, 'thanks');
+    st.ok(res.command);
+    st.end();
+  });
+
+});
diff --git a/test/RoomMessages.spec.js b/test/RoomMessages.spec.js
new file mode 100644
index 0000000..1a9af39
--- /dev/null
+++ b/test/RoomMessages.spec.js
@@ -0,0 +1,45 @@
+'use strict';
+
+const test = require('tape'),
+      RoomMessages = require('../data/rooms/RoomMessages'),
+      TestHelper = require('./TestHelper');
+
+test('RoomMessages tests', t => {
+  t.plan(4);
+
+  t.test('should find a message', st => {
+    st.plan(1);
+    const msg = 'you gotta holler i say',
+          input = TestHelper.makeInputFromString(msg),
+          res = RoomMessages.scanInput(input, 'camperbot/testing', 1);
+    st.equal(res.text, '> holler back!');
+    st.end();
+  });
+
+  t.test('should be silent in 0 chance tooms', st => {
+    st.plan(1);
+    const msg = 'you gotta holler i say',
+          input = TestHelper.makeInputFromString(msg),
+          res = RoomMessages.scanInput(input, 'camperbot/testing', 0);
+    st.equal(res, null);
+    st.end();
+  });
+
+  t.test(`should find a message three ticks '''`, st => {
+    st.plan(1);
+    const msg = `mistake ''' text`,
+          input = TestHelper.makeInputFromString(msg),
+          res = RoomMessages.scanInput(input, 'camperbot/testing', 1);
+    st.ok(res.text.includes('> :bulb: to format'));
+    st.end();
+  });
+
+  t.test('should find a message for a bonfire', st => {
+    st.plan(1);
+    const msg = 'help for bonfire XXX',
+          input = TestHelper.makeInputFromString(msg),
+          res = RoomMessages.scanInput(input, 'camperbot/testing', 1);
+    st.ok(res.text.includes('> type `bonfire name`'));
+    st.end();
+  });
+});
diff --git a/test/Rooms.spec.js b/test/Rooms.spec.js
new file mode 100644
index 0000000..fa42a60
--- /dev/null
+++ b/test/Rooms.spec.js
@@ -0,0 +1,25 @@
+'use strict';
+
+const test = require('tape'),
+      Rooms = require('../lib/app/Rooms.js');
+
+test('Rooms tests', t => {
+  t.plan(3);
+
+  t.equal(Rooms.findByTopic('bonfires').name,
+          'bothelp/HelpBonfires',
+          'should find a room for topic');
+
+  t.equal(Rooms.findByName('bothelp/HelpBonfires').name,
+          'bothelp/HelpBonfires',
+          'should find a room by name');
+
+  t.test('should find a bonfire room', st => {
+    st.plan(2);
+    const room = Rooms.findByName('bothelp/bonfire-factorialize-a-number');
+    st.equal(room.name, 'bothelp/bonfire-factorialize-a-number',
+             'name is correct');
+    st.equal(room.isBonfire, true, 'should be flagged as bonfire');
+    st.end();
+  });
+});
diff --git a/test/TestHelper.js b/test/TestHelper.js
new file mode 100644
index 0000000..cdb1dbd
--- /dev/null
+++ b/test/TestHelper.js
@@ -0,0 +1,150 @@
+"use strict";
+
+
+var GBot = require('../lib/bot/GBot');
+
+var TestHelper = {
+    aboutInput: {
+        keyword: 'about',
+        params: '@bothelp ',
+        message: {
+            operation: 'create',
+            model: {
+                id: '55b95acb5bc8dc88744243ff',
+                text: 'about @bothelp',
+                html: 'about <span data-link-type="mention" data-screen-name="bothelp" class="mention">@bothelp</span> ',
+                sent: '2015-07-29T22:59:23.187Z',
+                editedAt: null,
+                fromUser: {
+                    username: "testuser"
+                },
+                unread: true,
+                readBy: 0,
+                urls: [],
+                mentions: [
+                    {screenName: 'dcsan'},
+                    {screenName: 'berkeleytrue'}
+                ],
+                issues: [],
+                meta: {},
+                v: 1
+            },
+            room: {
+                path: '/rooms',
+                id: '55b3d5780fc9f982beaaf7f4',
+                name: 'camperbot/localdev',
+                topic: ' testing',
+                uri: 'camperbot/localdev',
+                oneToOne: false,
+                userCount: 5,
+                unreadItems: 100,
+                mentions: 27,
+                lastAccessTime: '2015-07-29T14:41:04.820Z',
+                lurk: false,
+                url: '/camperbot/localdev',
+                githubType: 'USER_CHANNEL',
+                security: 'PUBLIC',
+                noindex: false,
+                v: 1,
+                client: [Object],
+                faye: [Object],
+                _events: [Object]
+            }
+        },
+        cleanText: 'about @bothelp ',
+        command: true
+    },
+
+    stubInput: {
+        keyword: 'hint',
+        params: undefined,
+        message: {
+            operation: 'create',
+            model: {
+                id: '55b91175c35e438c74fc725c',
+                text: 'hint',
+                html: 'hint',
+                sent: '2015-07-29T17:46:29.190Z',
+                editedAt: null,
+                fromUser: [Object],
+                unread: true,
+                readBy: 0,
+                urls: [],
+                mentions: [],
+                issues: [],
+                meta: {},
+                v: 1
+            },
+            room: {
+                path: '/rooms',
+                id: '55b8fc980fc9f982beab6b19',
+                name: 'bothelp/bonfire-factorialize-a-number',
+                topic: '',
+                uri: 'bothelp/bonfire-factorialize-a-number',
+                oneToOne: false,
+                userCount: 3,
+                unreadItems: 9,
+                mentions: 0,
+                lastAccessTime: '2015-07-29T16:17:28.850Z',
+                lurk: false,
+                url: '/bothelp/bonfire-factorialize-a-number',
+                githubType: 'USER_CHANNEL',
+                security: 'PUBLIC',
+                noindex: false,
+                client: [Object],
+                faye: [Object],
+                _events: [Object]
+            }
+        },
+        cleanText: 'hint',
+        command: true
+    },
+
+    mockInput: function(roomName) {
+        var input = {
+            message: {
+                room: {
+                    name: roomName
+                }
+            }
+        };
+        // clog(input);
+        return input;
+    },
+
+    // used for tests
+    // and also strings to commands
+    // https://developer.gitter.im/docs/messages-resource
+    // makeInputFromString: function (text) {
+    //     var message = {};
+    //     var model = {
+    //         text: text
+    //     };
+    //     message.model = model;
+    //     return message;
+    // },
+
+    makeInputFromString: function (text) {
+        var input = TestHelper.aboutInput;
+        input.message.model.text = text;    // initialize before parsing
+        //console.log("input1", input);
+        input = GBot.parseInput(input.message);  // add keywords etc.
+        //console.log("input2", input);
+        input.message.model.text = text;
+        input.message.model.fromUser = {
+            username: "testuser"
+        };
+        return input;
+    },
+
+    makeMessageFromString: function (text) {
+        var input = TestHelper.makeInputFromString(text);
+        return input.message;
+    }
+
+
+};
+
+
+
+module.exports = TestHelper;
diff --git a/test/TextLib.spec.js b/test/TextLib.spec.js
new file mode 100644
index 0000000..2df6112
--- /dev/null
+++ b/test/TextLib.spec.js
@@ -0,0 +1,51 @@
+'use strict';
+
+const test = require('tape'),
+      TextLib = require('../lib/utils/TextLib'),
+      KBase = require('../lib/bot/Kbase');
+
+test('TextLib tests', t => {
+  t.plan(3);
+
+  t.doesNotThrow(() => {
+    KBase.initSync();
+  }, 'kbase should load');
+
+  var longTextBlock = `# Headline
+  line 1
+  line 2
+  line 3
+  line 4
+  line 5
+  line 6
+  line 7
+  line 8
+  line 9
+  line 10
+  `;
+
+  t.test('should take the first 5 lines of a chunk', st => {
+    st.plan(3);
+    const short = TextLib.trimLines(longTextBlock, 5),
+          split = short.split('\n');
+    st.equal(split.length, 5, 'should have trimmed correct number of lines');
+    st.ok(split[0].includes('# Headline'), 'first line should be correct');
+    st.ok(split[split.length - 1].includes('line 4'),
+          'last line should be correct');
+    st.end();
+  });
+
+  t.test('should trim camperbot entry', st => {
+    st.plan(3);
+    const params = 'camperbot',
+          topicData = KBase.getTopicData(params),
+          short = TextLib.trimLines(topicData.data),
+          split = short.split('\n');
+    st.equal(split.length, 12, 'should have trimmed correct number of lines');
+    st.ok(split[0].includes('Hi, I\'m **[CamperBot'),
+          'first line should be correct');
+    st.equal(split[split.length - 1], '',
+          'last line should be correct');
+    st.end();
+  });
+});
diff --git a/test/Thanks.spec.js b/test/Thanks.spec.js
new file mode 100644
index 0000000..79b9dc9
--- /dev/null
+++ b/test/Thanks.spec.js
@@ -0,0 +1,18 @@
+'use strict';
+
+const test = require('tape'),
+      GBot = require('../lib/bot/GBot'),
+      TestHelper = require('./TestHelper');
+
+test('Thanks tests', t => {
+  t.plan(1);
+
+  t.test('should work for two users', st => {
+    st.plan(1);
+    var msg = TestHelper.makeInputFromString('thanks @dcsan @bob'),
+        res = GBot.findAnyReply(msg.message);
+    st.ok(res.includes('> testuser sends brownie points to ' +
+                       '@dcsan and @berkeleytrue'));
+    st.end();
+  });
+});
diff --git a/test/Utils.spec.js b/test/Utils.spec.js
new file mode 100644
index 0000000..fa39f20
--- /dev/null
+++ b/test/Utils.spec.js
@@ -0,0 +1,58 @@
+'use strict';
+
+const test = require('tape'),
+      Utils = require('../lib/utils/Utils');
+
+test('Utils tests', t => {
+  t.plan(9);
+
+  t.equal(Utils.linkify('wiki', 'wiki'),
+          '[wiki](https://github.com/freecodecamp/freecodecamp/wiki/wiki)',
+          'should linkify');
+
+  t.equal(Utils.namify('some-page-here'),
+          'some page here',
+          'should namify');
+
+  t.equal(Utils.sanitize('something-special?.md'),
+          'something-special',
+          'should sanitize file name strings');
+
+  t.equal(Utils.sanitize('thanks bob', {spaces: false}),
+          'thanks bob',
+          'sanitize with spaces:false should not remove spaces');
+
+  t.equal(Utils.sanitize('thanks for that', {spaces: true}),
+          'thanks-for-that',
+          'sanitize with spaces:true should convert spaces to dashes');
+
+  t.test('splitParams command only', st => {
+    st.plan(2);
+    const res = Utils.splitParams('menu');
+    st.equal(res.keyword, 'menu', 'should have menu keyword');
+    st.notOk(res.params, 'should have no params');
+    st.end();
+  });
+
+  t.test('splitParams command and one param', st => {
+    st.plan(2);
+    const res = Utils.splitParams('menu options');
+    st.equal(res.keyword, 'menu', 'should have menu keyword');
+    st.equal(res.params, 'options', 'should have options param');
+    st.end();
+  });
+
+  t.test('splitParams command and multiple params', st => {
+    st.plan(2);
+    const res = Utils.splitParams('menu with more stuff');
+    st.equal(res.keyword, 'menu', 'should have menu keyword');
+    st.equal(res.params, 'with more stuff',
+             'should have with more stuff params');
+    st.end();
+  });
+
+  t.equal(Utils.linkify('SomePageName'),
+          '[SomePageName](https://github.com/' +
+            'freecodecamp/freecodecamp/wiki/SomePageName)',
+          'should make a wiki link');
+});
diff --git a/test/Wiki.spec.js b/test/Wiki.spec.js
new file mode 100644
index 0000000..6542dc9
--- /dev/null
+++ b/test/Wiki.spec.js
@@ -0,0 +1,35 @@
+'use strict';
+
+const test = require('tape'),
+      KBase = require('../lib/bot/KBase.js');
+
+test('Wiki tests', t => {
+  t.plan(4);
+
+  t.test('should load KBase', st => {
+    st.plan(2);
+    let allData;
+    st.doesNotThrow(() => {
+      allData = KBase.initSync();
+    });
+    st.ok(Array.isArray(allData));
+    st.end();
+  });
+
+  // These lookups are not grabbing the right wiki article
+  // Skipping for now.
+  t.skip(KBase.getTopicData('css-selectors').dashedName,
+          'css-selectors',
+          'should find a css page');
+
+  t.skip(KBase.getTopicData('bootstrap').dashedName,
+          'bootstrap',
+          'should find a bootstrap page');
+
+  t.test('should get wiki data back', st => {
+    st.plan(1);
+    const entry = KBase.getTopicData('camperbot');
+    st.ok(entry.shortData.includes('Hi, I\'m **[CamperBot]'));
+    st.end();
+  });
+});
diff --git a/test/routes.spec.js b/test/routes.spec.js
new file mode 100644
index 0000000..03d6b7f
--- /dev/null
+++ b/test/routes.spec.js
@@ -0,0 +1,33 @@
+'use strict';
+
+const test = require('tape'),
+      routes = require('../lib/app/routes.js');
+
+test('Routes tests', t => {
+  t.plan(2);
+
+  t.test('should use room from params for route redir', st => {
+    st.plan(4);
+    const query = {room: 'random'},
+          redir = routes.findRedirect(query),
+          url = 'https://gitter.im/' + query.room;
+
+    st.ok(redir.room, 'route has a room');
+    st.ok(redir.org, 'route has an org');
+    st.ok(redir.url, 'route has a url');
+    st.equal(redir.url, url, 'route url is correct');
+    st.end();
+  });
+
+  t.test('should find DM room go URI', st => {
+    st.plan(3);
+    const query = {room: 'bothelp'},
+          redir = routes.findRedirect(query),
+          url = 'https://gitter.im/' + query.room;
+
+    st.ok(redir.room, 'route has a room');
+    st.ok(redir.url, 'route has a url');
+    st.equal(redir.url, url, 'route url is correct');
+    st.end();
+  });
+});
diff --git a/views/home.jade b/views/home.jade
new file mode 100644
index 0000000..5460552
--- /dev/null
+++ b/views/home.jade
@@ -0,0 +1,49 @@
+extends layout
+
+block content
+
+  include nav
+
+  .container-fluid
+
+    div 
+        img.img-circle(src="#{user.avatarUrlMedium}")
+        span.small Hello 
+        span.h1 #{user.username}!
+    //- p  clientId: 
+    //-   span.mono #{clientId}
+    //- p sessionToken: 
+    //-   span.mono #{sessionToken}
+    //- p 
+    //-   |Search 
+    //-   a(href='https://developer.gitter.im/docs/welcome')
+    //-     |Developer documentation
+    //-   |. 
+
+    div.page-header
+        h2 Your rooms
+
+    table.table.table-striped.table-hover
+        thead
+            tr
+                td name
+                td users
+                td oneToOne
+                td unread
+                td githubType
+                td security
+        - each room in rooms
+            tr
+                td
+                    a.btn.btn-lg.btn-primary(href="https://gitter.im#{room.url}") #{room.name} &nbsp;
+                td #{room.userCount}
+                td
+                    if room.oneToOne
+                        span.label.label-warning TRUE
+                    else
+                        span.label.label-info FALSE
+
+                td #{room.unreadItems}
+                td #{room.githubType}
+                td #{room.security}
+            
diff --git a/views/landing.jade b/views/landing.jade
new file mode 100644
index 0000000..1c00030
--- /dev/null
+++ b/views/landing.jade
@@ -0,0 +1,13 @@
+extends layout
+
+block content
+
+  include nav
+
+  .container-fluid
+    .row
+      .col-md-12
+        .home
+          h1 Gitter Demo App
+          p
+            a(href="/login").btn.btn-primary Sign in
diff --git a/views/layout.jade b/views/layout.jade
new file mode 100644
index 0000000..3a134dc
--- /dev/null
+++ b/views/layout.jade
@@ -0,0 +1,14 @@
+doctype 5
+head
+  meta(charset="utf-8")
+  meta(http-equiv="X-UA-Compatible", content="IE=edge")
+  meta(name="viewport", content="width=device-width, initial-scale=1")
+
+  link(href='//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css', rel='stylesheet')
+  link(href='/css/app.css', rel='stylesheet')
+
+  title Gitterbot host app
+body
+  block content
+  script(src='//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js')
+  script(src='//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js')
diff --git a/views/nav.jade b/views/nav.jade
new file mode 100644
index 0000000..7846be9
--- /dev/null
+++ b/views/nav.jade
@@ -0,0 +1,33 @@
+nav.navbar.navbar-default(role='navigation')
+  .container
+    .navbar-header
+      button.navbar-toggle(type='button', data-toggle='collapse', data-target='#navbar-collapse')
+        span.sr-only Toggle navigation
+        span.icon-bar
+        span.icon-bar
+        span.icon-bar
+      p.navbar-logo(href='#')
+        img(src="/img/logo.png")
+
+    #navbar-collapse.collapse.navbar-collapse
+      ul.nav.navbar-nav
+        li
+          a(href='/home') home
+        li
+          a(href='/rooms') rooms
+        li
+          a(href='/rooms/update') update
+
+      if user
+        ul.nav.navbar-nav.navbar-right
+          li.dropdown
+            a.dropdown-toggle(href='#', data-toggle='dropdown')
+              | Hi #{user.username}! 
+              b.caret
+            ul.dropdown-menu
+              li
+                a(href='/logout') Sign out
+      else
+        ul.nav.navbar-nav.navbar-right
+          li
+            a(href="/login") Sign in
diff --git a/views/rooms.jade b/views/rooms.jade
new file mode 100644
index 0000000..856f1e3
--- /dev/null
+++ b/views/rooms.jade
@@ -0,0 +1,54 @@
+extends layout
+
+block content
+
+    include nav
+
+    .container-fluid
+        h1 GitterBot Rooms
+
+        a.btn.btn-lg.btn-default(href=topicDmUri) DM with bothelp
+        span.btn.btn-sm #{topicDmUri}
+
+
+        - each room in rooms
+            .well
+                .container-fluid
+                    .row
+                        .col-md-3
+                            div HBF + topic=#{room.topic}
+                        .col-md-4
+                            a.btn.btn-med.btn-default(href="/go?room=#{room.entry}&topic=#{room.topic}&who=#{who}")
+                                span #{room.entry}<b>&topic=#{room.topic}</b>
+
+                            br
+                            br
+
+                    .row
+                        .col-md-3
+                            div dedicated room
+                        .col-md-4
+                            a.btn.btn-med.btn-success(href="/go?room=#{room.name}&who=#{who}")
+                                span #{room.name}
+
+
+        //.col-md-8
+                        //    if room.topics
+                        //        - each topic in room.topics
+                        //            a.btn.btn-default(href="/go?topic=#{topic}&who=#{who}") #{topic}
+                        //            &nbsp;
+                        //            span /go?topic=#{topic}&who=#{who}
+                        //            br
+        //
+        //h2 Bonfire Rooms
+        //.container-fluid
+        //    - each bonfire in bonfires
+        //        //- a.btn.btn-lg.btn-success(href="/go?room=#{bonfire.dashedName}&who=#{who}") #{bonfire.name} &nbsp;
+        //        .row
+        //            hr
+        //            .col-md-6
+        //                a.btn.btn-lg.btn-success(href="https://gitter.im/camperbot/#{bonfire.dashedName}?who=#{who}") #{bonfire.name} &nbsp;
+        //                p #{bonfire.description[0]}
+        //            .col-md-6
+        //                a.btn.btn-default(href="/go?room=camperbot/#{bonfire.dashedName}?who=#{who}&topic=question") #{bonfire.name} &nbsp;
+        //                p #{bonfire.dashedName}
