├── README.md ├── app.js ├── bin └── www ├── controllers ├── commentControllers.js ├── postControllers.js └── userControllers.js ├── package-lock.json ├── package.json ├── public ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff ├── images │ ├── info.png │ ├── info2.png │ ├── info3.png │ └── member.jpg ├── javascripts │ ├── app.js │ ├── bootstrap.js │ ├── bootstrap.min.js │ ├── controllers.js │ ├── directive.js │ ├── encryption.js │ ├── npm.js │ ├── service.js │ └── validdata.js ├── stylesheets │ ├── style.css │ └── textAngular.css └── template │ ├── listPost.html │ ├── myblog.html │ ├── noSignin.html │ ├── paging.html │ ├── postDetail.html │ ├── signin.html │ ├── signup.html │ └── writePost.html ├── routes ├── comments.js ├── index.js ├── post.js └── users.js └── views └── index.html /README.md: -------------------------------------------------------------------------------- 1 | # angular_blog 2 | This is Mean Stack Blog. 3 | You can insert blog and show this. 4 | admin can permit display blog. 5 | 6 | # How to install Blog 7 | 8 | ## 1).Install mongodb-win32-x86_64-2008plus-ssl-3.4.6-signed 9 | ## 2).Select db file in CMD or terminal. 10 | Create Falder C:/db. 11 | and write fallow command in CMD or terminal. 12 | C:\Program Files\MongoDB\Server\3.4\bin>mongod --dbpath c:\db 13 | ## 3).install node_modules 14 | npm install 15 | npm install express 16 | npm install path 17 | npm install serve-favicon 18 | npm install morgan 19 | npm install cookie-parser 20 | npm install body-parser 21 | npm install mongod 22 | npm start 23 | 24 | ## 4).you can show this result. 25 | localhost: 5000 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var path = require('path'); 3 | var favicon = require('serve-favicon'); 4 | var logger = require('morgan'); 5 | var cookieParser = require('cookie-parser'); 6 | var bodyParser = require('body-parser'); 7 | module.exports = function(db) { 8 | 9 | var index = require('./routes/index')(db); 10 | var users = require('./routes/users')(db); 11 | var post = require('./routes/post')(db); 12 | var comments = require('./routes/comments')(db); 13 | var app = express(); 14 | 15 | // view engine setup 16 | app.set('views', path.join(__dirname, 'views')); 17 | app.set('view engine', 'jade'); 18 | 19 | // uncomment after placing your favicon in /public 20 | //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 21 | app.use(logger('dev')); 22 | app.use(bodyParser.json()); 23 | app.use(bodyParser.urlencoded({ extended: false })); 24 | app.use(cookieParser()); 25 | app.use(express.static(path.join(__dirname, 'public'))); 26 | 27 | app.use('/', index); 28 | app.use('/users', users); 29 | app.use('/posts', post); 30 | app.use('/comments', comments); 31 | // catch 404 and forward to error handler 32 | app.use(function(req, res, next) { 33 | var err = new Error('Not Found'); 34 | err.status = 404; 35 | next(err); 36 | }); 37 | 38 | // error handler 39 | app.use(function(err, req, res, next) { 40 | // set locals, only providing error in development 41 | res.locals.message = err.message; 42 | res.locals.error = req.app.get('env') === 'development' ? err : {}; 43 | console.log(err.message); 44 | // render the error page 45 | res.status(err.status || 500); 46 | res.send(err.message); 47 | }); 48 | return app; 49 | }; -------------------------------------------------------------------------------- /bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | var debug = require('debug')('blog:server'); 7 | var http = require('http'); 8 | var mongoClient = require('mongodb').MongoClient; 9 | var mongoUrl = 'mongodb://localhost:27017/zlfData'; 10 | /** 11 | * Get port from environment and store in Express. 12 | */ 13 | mongoClient.connect(mongoUrl).catch(function(error) { 14 | console.log('请先开mongodb'); 15 | debug("Connect to mongodb " + mongoUrl + " failed with error: ", error); 16 | }).then(function(db) { 17 | var app = require('../app')(db); 18 | var port = normalizePort(process.env.PORT || '5000'); 19 | app.set('port', port); 20 | console.log('已启动, 端口: 5000'); 21 | console.log('管理员账号密码为 admin'); 22 | /** 23 | * Create HTTP server. 24 | */ 25 | 26 | var server = http.createServer(app); 27 | 28 | /** 29 | * Listen on provided port, on all network interfaces. 30 | */ 31 | 32 | server.listen(port); 33 | server.on('error', onError); 34 | server.on('listening', onListening); 35 | 36 | /** 37 | * Normalize a port into a number, string, or false. 38 | */ 39 | 40 | function normalizePort(val) { 41 | var port = parseInt(val, 10); 42 | 43 | if (isNaN(port)) { 44 | // named pipe 45 | return val; 46 | } 47 | 48 | if (port >= 0) { 49 | // port number 50 | return port; 51 | } 52 | 53 | return false; 54 | } 55 | 56 | /** 57 | * Event listener for HTTP server "error" event. 58 | */ 59 | 60 | function onError(error) { 61 | if (error.syscall !== 'listen') { 62 | throw error; 63 | } 64 | 65 | var bind = typeof port === 'string' 66 | ? 'Pipe ' + port 67 | : 'Port ' + port; 68 | 69 | // handle specific listen errors with friendly messages 70 | switch (error.code) { 71 | case 'EACCES': 72 | console.error(bind + ' requires elevated privileges'); 73 | process.exit(1); 74 | break; 75 | case 'EADDRINUSE': 76 | console.error(bind + ' is already in use'); 77 | process.exit(1); 78 | break; 79 | default: 80 | throw error; 81 | } 82 | } 83 | 84 | /** 85 | * Event listener for HTTP server "listening" event. 86 | */ 87 | 88 | function onListening() { 89 | var addr = server.address(); 90 | var bind = typeof addr === 'string' 91 | ? 'pipe ' + addr 92 | : 'port ' + addr.port; 93 | debug('Listening on ' + bind); 94 | } 95 | 96 | }); 97 | -------------------------------------------------------------------------------- /controllers/commentControllers.js: -------------------------------------------------------------------------------- 1 | var ObjectID = require('mongodb').ObjectID; 2 | 3 | 4 | module.exports = function (db) { 5 | var comments = db.collection('comments'); 6 | var commentController = { 7 | getComment: function(dataJson) { 8 | return comments.find(dataJson).toArray().then(function(CommentArr) { 9 | return Promise.resolve(CommentArr); 10 | }).catch(function(err) { 11 | return Promise.reject(err); 12 | }); 13 | }, 14 | addComment: function(dataJson) { 15 | return new Promise(function(resolve, reject) { 16 | if (dataJson.content !== '') { 17 | comments.insert(dataJson); 18 | resolve(); 19 | } else { 20 | reject("请从评论框输入评论,并不能为空"); 21 | } 22 | }); 23 | }, 24 | deleteComment: function(dataJson) { 25 | return new Promise(function(resolve, reject) { 26 | comments.findOne({_id: ObjectID(dataJson._id)}).then(function(foundComment) { 27 | comments.remove(foundComment); 28 | resolve(); 29 | }).catch(function(error) { 30 | reject(); 31 | }); 32 | }); 33 | }, 34 | editCommentstatus: function(dataJson) { 35 | return makeisEditfalse().then(function() { 36 | comments.findOne({_id: ObjectID(dataJson._id)}).then(function(foundComment) { 37 | comments.update({"_id" : ObjectID(dataJson._id)}, {$set: {"isEdit" : true}}); 38 | return Promise.resolve(); 39 | }).catch(function(err) { 40 | return Promise.reject(err); 41 | }); 42 | }); 43 | }, 44 | editComment: function(dataJson) { 45 | return new Promise(function(resolve, reject) { 46 | if (dataJson.content !== '') { 47 | comments.findOne({_id: ObjectID(dataJson._id)}).then(function() { 48 | comments.update({"_id" : ObjectID(dataJson._id)}, {$set: {"content": dataJson.content, "isEdit": false}}); 49 | resolve(); 50 | }).catch(function(err) { 51 | reject(err); 52 | }); 53 | } else { 54 | reject('请从评论框输入评论,并不能为空'); 55 | } 56 | }); 57 | }, 58 | cancel: function(dataJson) { 59 | return new Promise(function(resolve, reject) { 60 | comments.update({isEdit: true}, {$set: {"isEdit" : false}}); 61 | resolve(); 62 | }); 63 | }, 64 | hideComment: function(dataJson) { 65 | return new Promise(function(resolve, reject) { 66 | comments.findOne({_id: ObjectID(dataJson._id)}).then(function(foundUser) { 67 | comments.update({"_id" : ObjectID(dataJson._id)}, {$set: {"isHide" : true}}); 68 | resolve(); 69 | }).catch(function(err) { 70 | reject(err); 71 | }); 72 | }); 73 | }, 74 | showComment: function(dataJson) { 75 | return new Promise(function(resolve, reject) { 76 | comments.findOne({_id: ObjectID(dataJson._id)}).then(function() { 77 | comments.update({"_id" : ObjectID(dataJson._id)}, {$set: {"isHide" : false}}); 78 | resolve(); 79 | }).catch(function(err) { 80 | reject(err); 81 | }); 82 | }); 83 | }, 84 | cancelAll: function() { 85 | return makeisEditfalse(); 86 | }, 87 | deleteCommentByPost: function(dataJson) { 88 | comments.remove({id: dataJson}); 89 | } 90 | }; 91 | 92 | function makeisEditfalse() { 93 | return new Promise(function(resolve, reject) { 94 | comments.update({isEdit: true}, {$set: {"isEdit" : false}}); 95 | resolve(); 96 | }); 97 | } 98 | return commentController; 99 | }; 100 | -------------------------------------------------------------------------------- /controllers/postControllers.js: -------------------------------------------------------------------------------- 1 | var ObjectID = require('mongodb').ObjectID; 2 | 3 | module.exports = function(db) { 4 | var post = db.collection('post'); 5 | var commentCtrl = require('./commentControllers.js')(db); 6 | post.find({}).toArray().then(function(postArr) { 7 | if (postArr.length === 0) { 8 | post.save({ 9 | _id: ObjectID(2222), 10 | title: '示例文章', 11 | content: '示例内容', 12 | date: '2017-01-18 23:59', 13 | author: 'admin', 14 | authorUsername: 'admin', 15 | isHide: false 16 | }); 17 | } 18 | }); 19 | 20 | 21 | var postController = { 22 | addnewPost: function (newPost) { 23 | if (newPost._id) newPost._id = ObjectID(newPost._id); 24 | return post.save(newPost).then(function() { 25 | return Promise.resolve('success'); 26 | }).catch(function() { 27 | return Promise.reject('fail'); 28 | }); 29 | }, 30 | getAllPost: function() { 31 | return new Promise(function(resolve, reject) { 32 | post.find({}, {'content': 0}).sort({"date": -1}).toArray().then(function(PostArr) { 33 | resolve(PostArr); 34 | }).catch(function(err) { 35 | reject(err); 36 | }); 37 | }); 38 | }, 39 | getPostById: function(dataJson) { 40 | return new Promise(function(resolve, reject) { 41 | post.findOne({_id: ObjectID(dataJson._id)}, {'content': 0}).then(function(foundPost) { 42 | resolve(foundPost); 43 | }).catch(function() { 44 | reject("no exist"); 45 | }); 46 | }); 47 | }, 48 | getPostByAuthor: function(dataJson) { 49 | return new Promise(function(resolve, reject) { 50 | post.find({'authorUsername': dataJson}, {'content': 0}).sort({"date": -1}).toArray().then(function(PostArr) { 51 | resolve(PostArr); 52 | }).catch(function(err) { 53 | rejecte(err); 54 | }); 55 | }); 56 | }, 57 | deletePost: function (dataJson) { 58 | return new Promise(function(resolve, reject) { 59 | post.findOne({_id: ObjectID(dataJson._id)}).then(function(foundPost) { 60 | post.remove(foundPost); 61 | commentCtrl.deleteCommentByPost(dataJson._id); 62 | resolve(); 63 | }).catch(function(err) { 64 | reject(err); 65 | }); 66 | }); 67 | }, 68 | getPostByKeyWord: function(dataJson) { 69 | return new Promise(function(resolve, reject) { 70 | post.find({"title": {$regex: dataJson.keyWord, $options: "i"}}).sort({"date": -1}).toArray().then(function(PostArr) { 71 | resolve(PostArr); 72 | }).catch(function(err) { 73 | reject("Not Found"); 74 | }); 75 | }); 76 | }, 77 | getPostContent: function(dataJson) { 78 | return new Promise(function(resolve, reject) { 79 | post.findOne({_id: ObjectID(dataJson._id)}, {'content': 1}).then(function(foundPost) { 80 | resolve(foundPost); 81 | }).catch(function() { 82 | reject("no exist"); 83 | }); 84 | }); 85 | }, 86 | getPostByKeyWordAndAuthor: function(dataJson) { 87 | return new Promise(function(resolve, reject) { 88 | post.find({"authorUsername": dataJson.authorUsername, "title": {$regex: dataJson.keyWord, $options: "i"}}).sort({"date": -1}).toArray().then(function(PostArr) { 89 | resolve(PostArr); 90 | }).catch(function(err) { 91 | reject("Not Found"); 92 | }); 93 | }); 94 | }, 95 | showPost: function(dataJson) { 96 | return new Promise(function(resolve, reject) { 97 | post.findOne({_id: ObjectID(dataJson._id)}).then(function(foundPost) { 98 | post.update({"_id" : ObjectID(dataJson._id)}, {$set: {"isHide" : false}}); 99 | resolve(); 100 | }).catch(function() { 101 | reject(); 102 | }); 103 | }); 104 | }, 105 | hidePost: function(dataJson) { 106 | return new Promise(function(resolve, reject) { 107 | post.findOne({_id: ObjectID(dataJson._id)}).then(function(foundPost) { 108 | post.update({"_id" : ObjectID(dataJson._id)}, {$set: {"isHide" : true}}); 109 | resolve(); 110 | }).catch(function() { 111 | reject(); 112 | }); 113 | }); 114 | } 115 | }; 116 | 117 | 118 | return postController; 119 | }; -------------------------------------------------------------------------------- /controllers/userControllers.js: -------------------------------------------------------------------------------- 1 | var validdata = require("../public/javascripts/validdata.js"); 2 | 3 | module.exports = function(db) { 4 | var users = db.collection('users'); 5 | var admin = { 6 | _id: 11111, 7 | username: "admin", 8 | password: "d033e22ae348aeb5660fc2140aec35850c4da997", 9 | nikiname: 'admin', 10 | email: "admin@qq.com", 11 | isAdmin: true 12 | }; 13 | users.find({}).toArray().then(function(userArr) { 14 | if (userArr.length === 0) { 15 | users.insert(admin); 16 | } 17 | }); 18 | var userController = { 19 | signupCheck: function(user) { 20 | return checkUser(user).then(function() { 21 | if (user.repassword) delete user.repassword; 22 | users.insert(user); 23 | return new Promise(function(resolve, reject) { 24 | resolve(user); 25 | }); 26 | }).catch(function(error) { 27 | return new Promise(function(resolve, reject) { 28 | reject(error); 29 | }); 30 | }); 31 | }, 32 | signinCheck: function(user) { 33 | return new Promise(function(resolve, reject) { 34 | users.findOne({username:user.username}).then(function(foundUser) { 35 | if (foundUser) { 36 | if (foundUser.password == user.password) { 37 | resolve(foundUser); 38 | } 39 | else reject("password"); 40 | } else { 41 | reject("username"); 42 | } 43 | }); 44 | }); 45 | }, 46 | checkDataUnique: function(value) { 47 | return new Promise(function(resolve, reject) { 48 | users.findOne(value).then(function(foundvalue) { 49 | if (foundvalue) { 50 | reject("no"); 51 | } else { 52 | resolve("ok"); 53 | } 54 | }); 55 | }); 56 | }, 57 | getUserByName: function(value) { 58 | return new Promise(function(resolve, reject) { 59 | users.findOne({username:value}).then(function(foundUser) { 60 | resolve(foundUser); 61 | }).catch(function() { 62 | reject("该用户不存在"); 63 | }); 64 | }); 65 | } 66 | }; 67 | var checkUser = function(user) { 68 | return new Promise(function(resolve, reject) { 69 | var flag = false; 70 | if (validdata.username(user.username) == "ok" && validdata.nikiname(user.nikiname) == "ok" && 71 | validdata.email(user.email) == "ok" && user.password.length === 40 72 | && user.password != 'da39a3ee5e6b4b0d3255bfef95601890afd80709' && user.password === user.repassword) { 73 | flag = true; 74 | } else { 75 | reject("CheckUser:invalid"); 76 | } 77 | if (flag) { 78 | users.findOne({ $or: [ 79 | { username: user.username }, 80 | { nikiname: user.nikiname }, 81 | { email: user.email } 82 | ]}).then(function(foundUser) { 83 | foundUser ? reject('CheckUser:some attributes has been taken by others') : resolve(); 84 | }); 85 | } 86 | }); 87 | }; 88 | return userController; 89 | }; 90 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blog", 3 | "version": "0.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.3", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", 10 | "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", 11 | "requires": { 12 | "mime-types": "2.1.16", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "acorn": { 17 | "version": "2.7.0", 18 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", 19 | "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" 20 | }, 21 | "acorn-globals": { 22 | "version": "1.0.9", 23 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", 24 | "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", 25 | "requires": { 26 | "acorn": "2.7.0" 27 | } 28 | }, 29 | "align-text": { 30 | "version": "0.1.4", 31 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 32 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 33 | "requires": { 34 | "kind-of": "3.2.2", 35 | "longest": "1.0.1", 36 | "repeat-string": "1.6.1" 37 | } 38 | }, 39 | "amdefine": { 40 | "version": "1.0.1", 41 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 42 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 43 | }, 44 | "array-flatten": { 45 | "version": "1.1.1", 46 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 47 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 48 | }, 49 | "asap": { 50 | "version": "1.0.0", 51 | "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", 52 | "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" 53 | }, 54 | "basic-auth": { 55 | "version": "1.0.4", 56 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz", 57 | "integrity": "sha1-Awk1sB3nyblKgksp8/zLdQ06UpA=" 58 | }, 59 | "body-parser": { 60 | "version": "1.15.2", 61 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.15.2.tgz", 62 | "integrity": "sha1-11eM9PHRHV9uqATO813Hp/9trmc=", 63 | "requires": { 64 | "bytes": "2.4.0", 65 | "content-type": "1.0.2", 66 | "debug": "2.2.0", 67 | "depd": "1.1.1", 68 | "http-errors": "1.5.1", 69 | "iconv-lite": "0.4.13", 70 | "on-finished": "2.3.0", 71 | "qs": "6.2.0", 72 | "raw-body": "2.1.7", 73 | "type-is": "1.6.15" 74 | } 75 | }, 76 | "bson": { 77 | "version": "1.0.4", 78 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", 79 | "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" 80 | }, 81 | "buffer-shims": { 82 | "version": "1.0.0", 83 | "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", 84 | "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" 85 | }, 86 | "bytes": { 87 | "version": "2.4.0", 88 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", 89 | "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" 90 | }, 91 | "camelcase": { 92 | "version": "1.2.1", 93 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 94 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" 95 | }, 96 | "center-align": { 97 | "version": "0.1.3", 98 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 99 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 100 | "requires": { 101 | "align-text": "0.1.4", 102 | "lazy-cache": "1.0.4" 103 | } 104 | }, 105 | "character-parser": { 106 | "version": "1.2.1", 107 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", 108 | "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=" 109 | }, 110 | "clean-css": { 111 | "version": "3.4.28", 112 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", 113 | "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", 114 | "requires": { 115 | "commander": "2.8.1", 116 | "source-map": "0.4.4" 117 | }, 118 | "dependencies": { 119 | "commander": { 120 | "version": "2.8.1", 121 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", 122 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", 123 | "requires": { 124 | "graceful-readlink": "1.0.1" 125 | } 126 | } 127 | } 128 | }, 129 | "cliui": { 130 | "version": "2.1.0", 131 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 132 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 133 | "requires": { 134 | "center-align": "0.1.3", 135 | "right-align": "0.1.3", 136 | "wordwrap": "0.0.2" 137 | }, 138 | "dependencies": { 139 | "wordwrap": { 140 | "version": "0.0.2", 141 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 142 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" 143 | } 144 | } 145 | }, 146 | "commander": { 147 | "version": "2.6.0", 148 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", 149 | "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=" 150 | }, 151 | "constantinople": { 152 | "version": "3.0.2", 153 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", 154 | "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", 155 | "requires": { 156 | "acorn": "2.7.0" 157 | } 158 | }, 159 | "content-disposition": { 160 | "version": "0.5.2", 161 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 162 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 163 | }, 164 | "content-type": { 165 | "version": "1.0.2", 166 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", 167 | "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=" 168 | }, 169 | "cookie": { 170 | "version": "0.3.1", 171 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 172 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 173 | }, 174 | "cookie-parser": { 175 | "version": "1.4.3", 176 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", 177 | "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", 178 | "requires": { 179 | "cookie": "0.3.1", 180 | "cookie-signature": "1.0.6" 181 | } 182 | }, 183 | "cookie-signature": { 184 | "version": "1.0.6", 185 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 186 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 187 | }, 188 | "core-util-is": { 189 | "version": "1.0.2", 190 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 191 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 192 | }, 193 | "css": { 194 | "version": "1.0.8", 195 | "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", 196 | "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", 197 | "requires": { 198 | "css-parse": "1.0.4", 199 | "css-stringify": "1.0.5" 200 | } 201 | }, 202 | "css-parse": { 203 | "version": "1.0.4", 204 | "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", 205 | "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=" 206 | }, 207 | "css-stringify": { 208 | "version": "1.0.5", 209 | "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", 210 | "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=" 211 | }, 212 | "debug": { 213 | "version": "2.2.0", 214 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 215 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 216 | "requires": { 217 | "ms": "0.7.1" 218 | } 219 | }, 220 | "decamelize": { 221 | "version": "1.2.0", 222 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 223 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 224 | }, 225 | "depd": { 226 | "version": "1.1.1", 227 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 228 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 229 | }, 230 | "destroy": { 231 | "version": "1.0.4", 232 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 233 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 234 | }, 235 | "ee-first": { 236 | "version": "1.1.1", 237 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 238 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 239 | }, 240 | "encodeurl": { 241 | "version": "1.0.1", 242 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", 243 | "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" 244 | }, 245 | "es6-promise": { 246 | "version": "3.2.1", 247 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", 248 | "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" 249 | }, 250 | "escape-html": { 251 | "version": "1.0.3", 252 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 253 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 254 | }, 255 | "etag": { 256 | "version": "1.7.0", 257 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", 258 | "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" 259 | }, 260 | "express": { 261 | "version": "4.14.1", 262 | "resolved": "https://registry.npmjs.org/express/-/express-4.14.1.tgz", 263 | "integrity": "sha1-ZGwjf3ZvFIwhIK/wc4F7nk1+DTM=", 264 | "requires": { 265 | "accepts": "1.3.3", 266 | "array-flatten": "1.1.1", 267 | "content-disposition": "0.5.2", 268 | "content-type": "1.0.2", 269 | "cookie": "0.3.1", 270 | "cookie-signature": "1.0.6", 271 | "debug": "2.2.0", 272 | "depd": "1.1.1", 273 | "encodeurl": "1.0.1", 274 | "escape-html": "1.0.3", 275 | "etag": "1.7.0", 276 | "finalhandler": "0.5.1", 277 | "fresh": "0.3.0", 278 | "merge-descriptors": "1.0.1", 279 | "methods": "1.1.2", 280 | "on-finished": "2.3.0", 281 | "parseurl": "1.3.1", 282 | "path-to-regexp": "0.1.7", 283 | "proxy-addr": "1.1.5", 284 | "qs": "6.2.0", 285 | "range-parser": "1.2.0", 286 | "send": "0.14.2", 287 | "serve-static": "1.11.2", 288 | "type-is": "1.6.15", 289 | "utils-merge": "1.0.0", 290 | "vary": "1.1.1" 291 | }, 292 | "dependencies": { 293 | "debug": { 294 | "version": "2.2.0", 295 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 296 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 297 | "requires": { 298 | "ms": "0.7.1" 299 | } 300 | } 301 | } 302 | }, 303 | "finalhandler": { 304 | "version": "0.5.1", 305 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.1.tgz", 306 | "integrity": "sha1-LEANjUUwk1vCMlScX6OF7Afeb80=", 307 | "requires": { 308 | "debug": "2.2.0", 309 | "escape-html": "1.0.3", 310 | "on-finished": "2.3.0", 311 | "statuses": "1.3.1", 312 | "unpipe": "1.0.0" 313 | }, 314 | "dependencies": { 315 | "debug": { 316 | "version": "2.2.0", 317 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 318 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 319 | "requires": { 320 | "ms": "0.7.1" 321 | } 322 | } 323 | } 324 | }, 325 | "forwarded": { 326 | "version": "0.1.0", 327 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", 328 | "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" 329 | }, 330 | "fresh": { 331 | "version": "0.3.0", 332 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", 333 | "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" 334 | }, 335 | "graceful-readlink": { 336 | "version": "1.0.1", 337 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 338 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" 339 | }, 340 | "http-errors": { 341 | "version": "1.5.1", 342 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz", 343 | "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=", 344 | "requires": { 345 | "inherits": "2.0.3", 346 | "setprototypeof": "1.0.2", 347 | "statuses": "1.3.1" 348 | } 349 | }, 350 | "iconv-lite": { 351 | "version": "0.4.13", 352 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", 353 | "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" 354 | }, 355 | "inherits": { 356 | "version": "2.0.3", 357 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 358 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 359 | }, 360 | "ipaddr.js": { 361 | "version": "1.4.0", 362 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", 363 | "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" 364 | }, 365 | "is-buffer": { 366 | "version": "1.1.5", 367 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", 368 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" 369 | }, 370 | "is-promise": { 371 | "version": "2.1.0", 372 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 373 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 374 | }, 375 | "isarray": { 376 | "version": "1.0.0", 377 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 378 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 379 | }, 380 | "jade": { 381 | "version": "1.11.0", 382 | "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", 383 | "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", 384 | "requires": { 385 | "character-parser": "1.2.1", 386 | "clean-css": "3.4.28", 387 | "commander": "2.6.0", 388 | "constantinople": "3.0.2", 389 | "jstransformer": "0.0.2", 390 | "mkdirp": "0.5.1", 391 | "transformers": "2.1.0", 392 | "uglify-js": "2.8.29", 393 | "void-elements": "2.0.1", 394 | "with": "4.0.3" 395 | } 396 | }, 397 | "jstransformer": { 398 | "version": "0.0.2", 399 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", 400 | "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", 401 | "requires": { 402 | "is-promise": "2.1.0", 403 | "promise": "6.1.0" 404 | } 405 | }, 406 | "kind-of": { 407 | "version": "3.2.2", 408 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 409 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 410 | "requires": { 411 | "is-buffer": "1.1.5" 412 | } 413 | }, 414 | "lazy-cache": { 415 | "version": "1.0.4", 416 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 417 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" 418 | }, 419 | "longest": { 420 | "version": "1.0.1", 421 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 422 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" 423 | }, 424 | "media-typer": { 425 | "version": "0.3.0", 426 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 427 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 428 | }, 429 | "merge-descriptors": { 430 | "version": "1.0.1", 431 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 432 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 433 | }, 434 | "methods": { 435 | "version": "1.1.2", 436 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 437 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 438 | }, 439 | "mime": { 440 | "version": "1.3.4", 441 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", 442 | "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" 443 | }, 444 | "mime-db": { 445 | "version": "1.29.0", 446 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", 447 | "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" 448 | }, 449 | "mime-types": { 450 | "version": "2.1.16", 451 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", 452 | "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", 453 | "requires": { 454 | "mime-db": "1.29.0" 455 | } 456 | }, 457 | "minimist": { 458 | "version": "0.0.8", 459 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 460 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 461 | }, 462 | "mkdirp": { 463 | "version": "0.5.1", 464 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 465 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 466 | "requires": { 467 | "minimist": "0.0.8" 468 | } 469 | }, 470 | "mongodb": { 471 | "version": "2.2.31", 472 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.31.tgz", 473 | "integrity": "sha1-GUBEXGYeGSF7s7+CRdmFSq71SNs=", 474 | "requires": { 475 | "es6-promise": "3.2.1", 476 | "mongodb-core": "2.1.15", 477 | "readable-stream": "2.2.7" 478 | } 479 | }, 480 | "mongodb-core": { 481 | "version": "2.1.15", 482 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.15.tgz", 483 | "integrity": "sha1-hB9TuH//9MdFgYnDXIroJ+EWl2Q=", 484 | "requires": { 485 | "bson": "1.0.4", 486 | "require_optional": "1.0.1" 487 | } 488 | }, 489 | "morgan": { 490 | "version": "1.7.0", 491 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.7.0.tgz", 492 | "integrity": "sha1-6xDKjlDRq+D409rVwCAdBS2YHGI=", 493 | "requires": { 494 | "basic-auth": "1.0.4", 495 | "debug": "2.2.0", 496 | "depd": "1.1.1", 497 | "on-finished": "2.3.0", 498 | "on-headers": "1.0.1" 499 | } 500 | }, 501 | "ms": { 502 | "version": "0.7.1", 503 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 504 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" 505 | }, 506 | "negotiator": { 507 | "version": "0.6.1", 508 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 509 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 510 | }, 511 | "on-finished": { 512 | "version": "2.3.0", 513 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 514 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 515 | "requires": { 516 | "ee-first": "1.1.1" 517 | } 518 | }, 519 | "on-headers": { 520 | "version": "1.0.1", 521 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", 522 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" 523 | }, 524 | "optimist": { 525 | "version": "0.3.7", 526 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", 527 | "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", 528 | "requires": { 529 | "wordwrap": "0.0.3" 530 | } 531 | }, 532 | "parseurl": { 533 | "version": "1.3.1", 534 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", 535 | "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" 536 | }, 537 | "path-to-regexp": { 538 | "version": "0.1.7", 539 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 540 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 541 | }, 542 | "process-nextick-args": { 543 | "version": "1.0.7", 544 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 545 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 546 | }, 547 | "promise": { 548 | "version": "6.1.0", 549 | "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", 550 | "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", 551 | "requires": { 552 | "asap": "1.0.0" 553 | } 554 | }, 555 | "proxy-addr": { 556 | "version": "1.1.5", 557 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", 558 | "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", 559 | "requires": { 560 | "forwarded": "0.1.0", 561 | "ipaddr.js": "1.4.0" 562 | } 563 | }, 564 | "qs": { 565 | "version": "6.2.0", 566 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz", 567 | "integrity": "sha1-O3hIwDwt7OaalSKw+ujEEm10Xzs=" 568 | }, 569 | "range-parser": { 570 | "version": "1.2.0", 571 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 572 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 573 | }, 574 | "raw-body": { 575 | "version": "2.1.7", 576 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", 577 | "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", 578 | "requires": { 579 | "bytes": "2.4.0", 580 | "iconv-lite": "0.4.13", 581 | "unpipe": "1.0.0" 582 | } 583 | }, 584 | "readable-stream": { 585 | "version": "2.2.7", 586 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", 587 | "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", 588 | "requires": { 589 | "buffer-shims": "1.0.0", 590 | "core-util-is": "1.0.2", 591 | "inherits": "2.0.3", 592 | "isarray": "1.0.0", 593 | "process-nextick-args": "1.0.7", 594 | "string_decoder": "1.0.3", 595 | "util-deprecate": "1.0.2" 596 | } 597 | }, 598 | "repeat-string": { 599 | "version": "1.6.1", 600 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 601 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 602 | }, 603 | "require_optional": { 604 | "version": "1.0.1", 605 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 606 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 607 | "requires": { 608 | "resolve-from": "2.0.0", 609 | "semver": "5.4.1" 610 | } 611 | }, 612 | "resolve-from": { 613 | "version": "2.0.0", 614 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 615 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 616 | }, 617 | "right-align": { 618 | "version": "0.1.3", 619 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 620 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 621 | "requires": { 622 | "align-text": "0.1.4" 623 | } 624 | }, 625 | "safe-buffer": { 626 | "version": "5.1.1", 627 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 628 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 629 | }, 630 | "semver": { 631 | "version": "5.4.1", 632 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", 633 | "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" 634 | }, 635 | "send": { 636 | "version": "0.14.2", 637 | "resolved": "https://registry.npmjs.org/send/-/send-0.14.2.tgz", 638 | "integrity": "sha1-ObBDiz9RC+Xcb2Z6EfcWiTaM3u8=", 639 | "requires": { 640 | "debug": "2.2.0", 641 | "depd": "1.1.1", 642 | "destroy": "1.0.4", 643 | "encodeurl": "1.0.1", 644 | "escape-html": "1.0.3", 645 | "etag": "1.7.0", 646 | "fresh": "0.3.0", 647 | "http-errors": "1.5.1", 648 | "mime": "1.3.4", 649 | "ms": "0.7.2", 650 | "on-finished": "2.3.0", 651 | "range-parser": "1.2.0", 652 | "statuses": "1.3.1" 653 | }, 654 | "dependencies": { 655 | "debug": { 656 | "version": "2.2.0", 657 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 658 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 659 | "requires": { 660 | "ms": "0.7.1" 661 | }, 662 | "dependencies": { 663 | "ms": { 664 | "version": "0.7.1", 665 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 666 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" 667 | } 668 | } 669 | }, 670 | "ms": { 671 | "version": "0.7.2", 672 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", 673 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" 674 | } 675 | } 676 | }, 677 | "serve-favicon": { 678 | "version": "2.3.2", 679 | "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.2.tgz", 680 | "integrity": "sha1-3UGeJo3gEqtysxnTN/IQUBP5OB8=", 681 | "requires": { 682 | "etag": "1.7.0", 683 | "fresh": "0.3.0", 684 | "ms": "0.7.2", 685 | "parseurl": "1.3.1" 686 | }, 687 | "dependencies": { 688 | "ms": { 689 | "version": "0.7.2", 690 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", 691 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" 692 | } 693 | } 694 | }, 695 | "serve-static": { 696 | "version": "1.11.2", 697 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.11.2.tgz", 698 | "integrity": "sha1-LPmIm9RDWjIMw2iVyapXvWYuasc=", 699 | "requires": { 700 | "encodeurl": "1.0.1", 701 | "escape-html": "1.0.3", 702 | "parseurl": "1.3.1", 703 | "send": "0.14.2" 704 | } 705 | }, 706 | "setprototypeof": { 707 | "version": "1.0.2", 708 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz", 709 | "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=" 710 | }, 711 | "source-map": { 712 | "version": "0.4.4", 713 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 714 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 715 | "requires": { 716 | "amdefine": "1.0.1" 717 | } 718 | }, 719 | "statuses": { 720 | "version": "1.3.1", 721 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 722 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" 723 | }, 724 | "string_decoder": { 725 | "version": "1.0.3", 726 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 727 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 728 | "requires": { 729 | "safe-buffer": "5.1.1" 730 | } 731 | }, 732 | "transformers": { 733 | "version": "2.1.0", 734 | "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", 735 | "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", 736 | "requires": { 737 | "css": "1.0.8", 738 | "promise": "2.0.0", 739 | "uglify-js": "2.2.5" 740 | }, 741 | "dependencies": { 742 | "is-promise": { 743 | "version": "1.0.1", 744 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", 745 | "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" 746 | }, 747 | "promise": { 748 | "version": "2.0.0", 749 | "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", 750 | "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", 751 | "requires": { 752 | "is-promise": "1.0.1" 753 | } 754 | }, 755 | "source-map": { 756 | "version": "0.1.43", 757 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 758 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 759 | "requires": { 760 | "amdefine": "1.0.1" 761 | } 762 | }, 763 | "uglify-js": { 764 | "version": "2.2.5", 765 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", 766 | "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", 767 | "requires": { 768 | "optimist": "0.3.7", 769 | "source-map": "0.1.43" 770 | } 771 | } 772 | } 773 | }, 774 | "type-is": { 775 | "version": "1.6.15", 776 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", 777 | "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", 778 | "requires": { 779 | "media-typer": "0.3.0", 780 | "mime-types": "2.1.16" 781 | } 782 | }, 783 | "uglify-js": { 784 | "version": "2.8.29", 785 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", 786 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 787 | "requires": { 788 | "source-map": "0.5.6", 789 | "uglify-to-browserify": "1.0.2", 790 | "yargs": "3.10.0" 791 | }, 792 | "dependencies": { 793 | "source-map": { 794 | "version": "0.5.6", 795 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", 796 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" 797 | } 798 | } 799 | }, 800 | "uglify-to-browserify": { 801 | "version": "1.0.2", 802 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 803 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 804 | "optional": true 805 | }, 806 | "unpipe": { 807 | "version": "1.0.0", 808 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 809 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 810 | }, 811 | "util-deprecate": { 812 | "version": "1.0.2", 813 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 814 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 815 | }, 816 | "utils-merge": { 817 | "version": "1.0.0", 818 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", 819 | "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" 820 | }, 821 | "vary": { 822 | "version": "1.1.1", 823 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", 824 | "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=" 825 | }, 826 | "void-elements": { 827 | "version": "2.0.1", 828 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", 829 | "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" 830 | }, 831 | "window-size": { 832 | "version": "0.1.0", 833 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 834 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" 835 | }, 836 | "with": { 837 | "version": "4.0.3", 838 | "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", 839 | "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", 840 | "requires": { 841 | "acorn": "1.2.2", 842 | "acorn-globals": "1.0.9" 843 | }, 844 | "dependencies": { 845 | "acorn": { 846 | "version": "1.2.2", 847 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", 848 | "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" 849 | } 850 | } 851 | }, 852 | "wordwrap": { 853 | "version": "0.0.3", 854 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 855 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 856 | }, 857 | "yargs": { 858 | "version": "3.10.0", 859 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 860 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 861 | "requires": { 862 | "camelcase": "1.2.1", 863 | "cliui": "2.1.0", 864 | "decamelize": "1.2.0", 865 | "window-size": "0.1.0" 866 | } 867 | } 868 | } 869 | } 870 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blog", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www" 7 | }, 8 | "dependencies": { 9 | "body-parser": "~1.15.2", 10 | "cookie-parser": "~1.4.3", 11 | "debug": "~2.2.0", 12 | "express": "~4.14.0", 13 | "jade": "~1.11.0", 14 | "mongodb": "^2.2.14", 15 | "morgan": "~1.7.0", 16 | "serve-favicon": "~2.3.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tiger0409/angular_blog/c674417d5dd3af3b0ee8609d0689c8d297c7065c/public/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tiger0409/angular_blog/c674417d5dd3af3b0ee8609d0689c8d297c7065c/public/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tiger0409/angular_blog/c674417d5dd3af3b0ee8609d0689c8d297c7065c/public/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/images/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tiger0409/angular_blog/c674417d5dd3af3b0ee8609d0689c8d297c7065c/public/images/info.png -------------------------------------------------------------------------------- /public/images/info2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tiger0409/angular_blog/c674417d5dd3af3b0ee8609d0689c8d297c7065c/public/images/info2.png -------------------------------------------------------------------------------- /public/images/info3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tiger0409/angular_blog/c674417d5dd3af3b0ee8609d0689c8d297c7065c/public/images/info3.png -------------------------------------------------------------------------------- /public/images/member.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tiger0409/angular_blog/c674417d5dd3af3b0ee8609d0689c8d297c7065c/public/images/member.jpg -------------------------------------------------------------------------------- /public/javascripts/app.js: -------------------------------------------------------------------------------- 1 | var app = angular.module('Blog', ['ngRoute', 'myService', 'myController', 'myDirective', 'ngCookies']); 2 | 3 | 4 | 5 | //route->get different page 6 | app.config(function ($routeProvider) { 7 | $routeProvider 8 | .when('/', { 9 | controller: 'postCtrl', 10 | templateUrl: '/template/listPost.html' 11 | }) 12 | .when('/signup', { 13 | controller: 'registCtrl', 14 | templateUrl: '/template/signup.html' 15 | }) 16 | .when('/signin', { 17 | controller: 'signinCtrl', 18 | templateUrl: '/template/signin.html' 19 | }) 20 | .when('/myblog', { 21 | controller: 'myblogCtrl', 22 | templateUrl: '/template/myblog.html' 23 | }) 24 | .when('/nosignin', { 25 | controller: 'noSigninCtrl', 26 | templateUrl: '/template/noSignin.html' 27 | }) 28 | .when('/writePost', { 29 | controller: 'writeBlogCtrl', 30 | templateUrl: '/template/writePost.html' 31 | }) 32 | .when('/detailPost', { 33 | controller: 'detailCtrl', 34 | templateUrl: '/template/postDetail.html' 35 | }) 36 | .otherwise({ 37 | redirectTo: '/' 38 | }); 39 | }); 40 | 41 | 42 | -------------------------------------------------------------------------------- /public/javascripts/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.0 (http://getbootstrap.com) 3 | * Copyright 2011-2014 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.0",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus","focus"==b.type)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.0",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c="prev"==a?-1:1,d=this.getItemIndex(b),e=(d+c)%this.$items.length;return this.$items.eq(e)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i="next"==b?"first":"last",j=this;if(!f.length){if(!this.options.wrap)return;f=this.$element.find(".item")[i]()}if(f.hasClass("active"))return this.sliding=!1;var k=f[0],l=a.Event("slide.bs.carousel",{relatedTarget:k,direction:h});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var m=a(this.$indicators.children()[this.getItemIndex(f)]);m&&m.addClass("active")}var n=a.Event("slid.bs.carousel",{relatedTarget:k,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),j.sliding=!1,setTimeout(function(){j.$element.trigger(n)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(n)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.0",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.find("> .panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('