diff --git a/controllers/bonfire.js b/controllers/bonfire.js index c19f410364..88930d0e6b 100644 --- a/controllers/bonfire.js +++ b/controllers/bonfire.js @@ -1,68 +1,75 @@ var _ = require('lodash'), -debug = require('debug')('freecc:cntr:bonfires'); -// bonfire = require('./../models/Bonfire'); + debug = require('debug')('freecc:cntr:bonfires'), + Bonfire = require('./../models/Bonfire'); /** * Bonfire controller */ + +var highestBonfireNumber = 10; + exports.index = function(req, res) { - res.render('bonfire/bonfire.jade', { - title: 'Learn to code with Bonfire' - }); - //Bonfire.find({}, null, { sort: { bonfireNumber: 1 } }, function(err, c) { - // if (err) { - // debug('bonfire err: ', err); - // next(err); - // } - //}); + res.render('bonfire/bonfire.jade', { + title: 'Learn to code with Bonfire' + }); + + Bonfire.find({}, null, { sort: { bonfireNumber: 1 } }, function(err, c) { + if (err) { + debug('bonfire err: ', err); + next(err); + } + }); }; -//exports.returnBonfire = function(req, res, next) { -// var bonfireNumber = parseInt(req.params.bonfireNumber) || 0; -// var verbs = [ -// 'ACED', -// 'NAILED', -// 'ROCKED', -// 'SCORCHED', -// 'DEVASTATED', -// 'OWNED', -// 'CRUSHED', -// 'CONQUERED', -// 'KILLED', -// 'SHREDDED', -// 'ANNIHILATED', -// 'NUKED' -// ]; -// var phrases = [ -// "Shout it from on top of a mountain", -// "Tell everyone and their dogs", -// "Show them. Show them all!", -// "Inspire your friends", -// "Tell the world of your greatness", -// "Look accomplished on social media", -// "Share news of your grand endeavor", -// "Establish your alibi for the past two hours", -// "Prove to mom that computers aren't just for games" -// ]; -// if (bonfireNumber > 53) { bonfireNumber = 0; } -// Bonfire.find({}, null, { sort: { bonfireNumber: 1 } }, function(err, c) { -// if (err) { -// debug('bonfire err: ', err); -// next(err); -// } -// res.render('bonfires/show', { -// //title: 'bonfire: ' + c[bonfireNumber].name, -// //name: c[bonfireNumber].name, -// //video: c[bonfireNumber].video, -// //time: c[bonfireNumber].time, -// //steps: c[bonfireNumber].steps, -// //number: bonfireNumber, -// //categories: c[bonfireNumber].category, -// //cc: req.user ? req.user.bonfiresHash : undefined, -// //points: req.user ? req.user.points : undefined, -// //verb: verbs[Math.floor(Math.random() * verbs.length)], -// //phrase: phrases[Math.floor(Math.random() * phrases.length)], -// //bonfires: c -// }); -// }); -//}; \ No newline at end of file +exports.returnBonfire = function(req, res, next) { + var bonfireNumber = parseInt(req.params.bonfireNumber) || 0; + var verbs = [ + 'ACED', + 'NAILED', + 'ROCKED', + 'SCORCHED', + 'DEVASTATED', + 'OWNED', + 'CRUSHED', + 'CONQUERED', + 'KILLED', + 'SHREDDED', + 'ANNIHILATED', + 'NUKED' + ]; + var phrases = [ + "Shout it from on top of a mountain", + "Tell everyone and their dogs", + "Show them. Show them all!", + "Inspire your friends", + "Tell the world of your greatness", + "Look accomplished on social media", + "Share news of your grand endeavor", + "Establish your alibi for the past two hours", + "Prove to mom that computers aren't just for games" + ]; + if (bonfireNumber > highestBonfireNumber) { bonfireNumber = 0; } + Bonfire.find({}, null, { sort: { bonfireNumber: 1 } }, function(err, c) { + if (err) { + debug('bonfire err: ', err); + next(err); + } + + res.render('bonfires/show', { + title: 'bonfire: ' + c[bonfireNumber].name, + name: c[bonfireNumber].name, + number: bonfireNumber, + difficulty: c[bonfireNumber].difficulty, + description: c[bonfireNumber].description, + publicTests: c[bonfireNumber].publicTests, + privateTests: c[bonfireNumber].privateTests, + challengeSeed: c[bonfireNumber].challengeSeed, + + cc: req.user ? req.user.bonfiresHash : undefined, + points: req.user ? req.user.points : undefined, + verb: verbs[Math.floor(Math.random() * verbs.length)], + phrase: phrases[Math.floor(Math.random() * phrases.length)], + bonfires: c + }); + }); +}; \ No newline at end of file diff --git a/controllers/challenges.js b/controllers/challenges.js index e686fc8b39..96170f433b 100644 --- a/controllers/challenges.js +++ b/controllers/challenges.js @@ -6,6 +6,8 @@ var _ = require('lodash'), debug = require('debug')('freecc:cntr:challenges'), Challenge = require('./../models/Challenge'); +var highestChallengeNumber = 53; + exports.returnChallenge = function(req, res, next) { var challengeNumber = parseInt(req.params.challengeNumber) || 0; var verbs = [ @@ -33,7 +35,7 @@ exports.returnChallenge = function(req, res, next) { "Establish your alibi for the past two hours", "Prove to mom that computers aren't just for games" ]; - if (challengeNumber > 53) { challengeNumber = 0; } + if (challengeNumber > highestChallengeNumber) { challengeNumber = 0; } Challenge.find({}, null, { sort: { challengeNumber: 1 } }, function(err, c) { if (err) { debug('Challenge err: ', err); diff --git a/models/Bonfire.js b/models/Bonfire.js index 10360c40c0..328417da3e 100644 --- a/models/Bonfire.js +++ b/models/Bonfire.js @@ -1,14 +1,27 @@ var mongoose = require('mongoose'); var secrets = require('../config/secrets'); +/** + * + * @type {exports.Schema} + */ + +new Schema({ _id: String }) +var ObjectId = require('mongoose').Types.ObjectId; +var myObjectId = ObjectId.fromString('myhexstring'); var bonfireSchema = new mongoose.Schema({ + name: { type: String, unique: true }, - link: String, - time: String, - bonfireNumber: Number + difficulty: Number, + description: Array, + publicTests: Array, + privateTests: Array, + challengeSeed: String, + bonfireNumber: Number, + number: Number }); module.exports = mongoose.model('Bonfire', bonfireSchema); diff --git a/models/BonfireCompletion.js b/models/BonfireCompletion.js new file mode 100644 index 0000000000..67ff2bb0e9 --- /dev/null +++ b/models/BonfireCompletion.js @@ -0,0 +1,15 @@ +var mongoose = require('mongoose'); +var secrets = require('../config/secrets'); + +var bonfireCompletionSchema = new mongoose.Schema({ + dateCompleted: Number, + camper1: String, + camper2: String, + bonfireNumber: { + bonfireNumber: Number, + bonfireId: ObjectId + }, + solution: String +}); + +module.exports = mongoose.model('BonfireCompletion', bonfireCompletionSchema); diff --git a/models/User.js b/models/User.js index ab217b2ad7..3b821416fe 100644 --- a/models/User.js +++ b/models/User.js @@ -3,356 +3,356 @@ var crypto = require('crypto'); var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ - email: { - type: String, - lowercase: true, - unique: true, - trim: true, - sparse: true - }, - password: String, - facebook: String, - twitter: String, - google: String, - github: String, - linkedin: String, - tokens: Array, - points: { - type: Number, - default: 0 - }, - challengesCompleted: { type: Array, default: [] }, - challengesHash: { - 0: { - type: Number, - default: 0 - }, - 1: { - type: Number, - default: 0 - }, - 2: { - type: Number, - default: 0 - }, - 3: { - type: Number, - default: 0 - }, - 4: { - type: Number, - default: 0 - }, - 5: { - type: Number, - default: 0 - }, - 6: { - type: Number, - default: 0 - }, - 7: { - type: Number, - default: 0 - }, - 8: { - type: Number, - default: 0 - }, - 9: { - type: Number, - default: 0 - }, - 10: { - type: Number, - default: 0 - }, - 11: { - type: Number, - default: 0 - }, - 12: { - type: Number, - default: 0 - }, - 13: { - type: Number, - default: 0 - }, - 14: { - type: Number, - default: 0 - }, - 15: { - type: Number, - default: 0 - }, - 16: { - type: Number, - default: 0 - }, - 17: { - type: Number, - default: 0 - }, - 18: { - type: Number, - default: 0 - }, - 19: { - type: Number, - default: 0 - }, - 20: { - type: Number, - default: 0 - }, - 21: { - type: Number, - default: 0 - }, - 22: { - type: Number, - default: 0 - }, - 23: { - type: Number, - default: 0 - }, - 24: { - type: Number, - default: 0 - }, - 25: { - type: Number, - default: 0 - }, - 26: { - type: Number, - default: 0 - }, - 27: { - type: Number, - default: 0 - }, - 28: { - type: Number, - default: 0 - }, - 29: { - type: Number, - default: 0 - }, - 30: { - type: Number, - default: 0 - }, - 31: { - type: Number, - default: 0 - }, - 32: { - type: Number, - default: 0 - }, - 33: { - type: Number, - default: 0 - }, - 34: { - type: Number, - default: 0 - }, - 35: { - type: Number, - default: 0 - }, - 36: { - type: Number, - default: 0 - }, - 37: { - type: Number, - default: 0 - }, - 38: { - type: Number, - default: 0 - }, - 39: { - type: Number, - default: 0 - }, - 40: { - type: Number, - default: 0 - }, - 41: { - type: Number, - default: 0 - }, - 42: { - type: Number, - default: 0 - }, - 43: { - type: Number, - default: 0 - }, - 44: { - type: Number, - default: 0 - }, - 45: { - type: Number, - default: 0 - }, - 46: { - type: Number, - default: 0 - }, - 47: { - type: Number, - default: 0 - }, - 48: { - type: Number, - default: 0 - }, - 49: { - type: Number, - default: 0 - }, - 50: { - type: Number, - default: 0 - }, - 51: { - type: Number, - default: 0 - }, - 52: { - type: Number, - default: 0 - }, - 53: { - type: Number, - default: 0 - }, - 54: { - type: Number, - default: 0 - }, - 55: { - type: Number, - default: 0 - }, - 56: { - type: Number, - default: 0 - }, - 57: { - type: Number, - default: 0 - }, - 58: { - type: Number, - default: 0 - }, - 59: { - type: Number, - default: 0 - } - }, - profile: { - username: { - type: String, - unique: true, - sparse: true, - lowercase: true, - trim: true - }, - bio: { - type: String, - defaults: '' - }, - name: { - type: String, - default: '' - }, - gender: { - type: String, - default: '' - }, - location: { - type: String, - default: '' - }, - picture: { - type: String, - default: '' - }, - linkedinProfile: { - type: String, - default: '' - }, - githubProfile: { - type: String, - default: '' - }, - coderbyteProfile: { - type: String, - default: '' - }, - codepenProfile: { - type: String, - default: '' - }, - twitterHandle: { - type: String, - default: '' - } - }, - portfolio: { - website1Link: { - type: String, - default: '' - }, - website1Title: { - type: String, - default: '' - }, - website1Image: { - type: String, - default: '' - }, - website2Link: { - type: String, - default: '' - }, - website2Title: { - type: String, - default: '' - }, - website2Image: { - type: String, - default: '' - }, - website3Link: { - type: String, - default: '' - }, - website3Title: { - type: String, - default: '' - }, - website3Image: { - type: String, - default: '' - } - }, - resetPasswordToken: String, - resetPasswordExpires: Date + email: { + type: String, + lowercase: true, + unique: true, + trim: true, + sparse: true + }, + password: String, + facebook: String, + twitter: String, + google: String, + github: String, + linkedin: String, + tokens: Array, + points: { + type: Number, + default: 0 + }, + challengesCompleted: { type: Array, default: [] }, + challengesHash: { + 0: { + type: Number, + default: 0 + }, + 1: { + type: Number, + default: 0 + }, + 2: { + type: Number, + default: 0 + }, + 3: { + type: Number, + default: 0 + }, + 4: { + type: Number, + default: 0 + }, + 5: { + type: Number, + default: 0 + }, + 6: { + type: Number, + default: 0 + }, + 7: { + type: Number, + default: 0 + }, + 8: { + type: Number, + default: 0 + }, + 9: { + type: Number, + default: 0 + }, + 10: { + type: Number, + default: 0 + }, + 11: { + type: Number, + default: 0 + }, + 12: { + type: Number, + default: 0 + }, + 13: { + type: Number, + default: 0 + }, + 14: { + type: Number, + default: 0 + }, + 15: { + type: Number, + default: 0 + }, + 16: { + type: Number, + default: 0 + }, + 17: { + type: Number, + default: 0 + }, + 18: { + type: Number, + default: 0 + }, + 19: { + type: Number, + default: 0 + }, + 20: { + type: Number, + default: 0 + }, + 21: { + type: Number, + default: 0 + }, + 22: { + type: Number, + default: 0 + }, + 23: { + type: Number, + default: 0 + }, + 24: { + type: Number, + default: 0 + }, + 25: { + type: Number, + default: 0 + }, + 26: { + type: Number, + default: 0 + }, + 27: { + type: Number, + default: 0 + }, + 28: { + type: Number, + default: 0 + }, + 29: { + type: Number, + default: 0 + }, + 30: { + type: Number, + default: 0 + }, + 31: { + type: Number, + default: 0 + }, + 32: { + type: Number, + default: 0 + }, + 33: { + type: Number, + default: 0 + }, + 34: { + type: Number, + default: 0 + }, + 35: { + type: Number, + default: 0 + }, + 36: { + type: Number, + default: 0 + }, + 37: { + type: Number, + default: 0 + }, + 38: { + type: Number, + default: 0 + }, + 39: { + type: Number, + default: 0 + }, + 40: { + type: Number, + default: 0 + }, + 41: { + type: Number, + default: 0 + }, + 42: { + type: Number, + default: 0 + }, + 43: { + type: Number, + default: 0 + }, + 44: { + type: Number, + default: 0 + }, + 45: { + type: Number, + default: 0 + }, + 46: { + type: Number, + default: 0 + }, + 47: { + type: Number, + default: 0 + }, + 48: { + type: Number, + default: 0 + }, + 49: { + type: Number, + default: 0 + }, + 50: { + type: Number, + default: 0 + }, + 51: { + type: Number, + default: 0 + }, + 52: { + type: Number, + default: 0 + }, + 53: { + type: Number, + default: 0 + }, + 54: { + type: Number, + default: 0 + }, + 55: { + type: Number, + default: 0 + }, + 56: { + type: Number, + default: 0 + }, + 57: { + type: Number, + default: 0 + }, + 58: { + type: Number, + default: 0 + }, + 59: { + type: Number, + default: 0 + } + }, + profile: { + username: { + type: String, + unique: true, + sparse: true, + lowercase: true, + trim: true + }, + bio: { + type: String, + defaults: '' + }, + name: { + type: String, + default: '' + }, + gender: { + type: String, + default: '' + }, + location: { + type: String, + default: '' + }, + picture: { + type: String, + default: '' + }, + linkedinProfile: { + type: String, + default: '' + }, + githubProfile: { + type: String, + default: '' + }, + coderbyteProfile: { + type: String, + default: '' + }, + codepenProfile: { + type: String, + default: '' + }, + twitterHandle: { + type: String, + default: '' + } + }, + portfolio: { + website1Link: { + type: String, + default: '' + }, + website1Title: { + type: String, + default: '' + }, + website1Image: { + type: String, + default: '' + }, + website2Link: { + type: String, + default: '' + }, + website2Title: { + type: String, + default: '' + }, + website2Image: { + type: String, + default: '' + }, + website3Link: { + type: String, + default: '' + }, + website3Title: { + type: String, + default: '' + }, + website3Image: { + type: String, + default: '' + } + }, + resetPasswordToken: String, + resetPasswordExpires: Date }); /** @@ -360,19 +360,19 @@ var userSchema = new mongoose.Schema({ */ userSchema.pre('save', function(next) { - var user = this; + var user = this; - if (!user.isModified('password')) { return next(); } + if (!user.isModified('password')) { return next(); } - bcrypt.genSalt(5, function(err, salt) { - if (err) { return next(err); } + bcrypt.genSalt(5, function(err, salt) { + if (err) { return next(err); } - bcrypt.hash(user.password, salt, null, function(err, hash) { - if (err) { return next(err); } - user.password = hash; - next(); + bcrypt.hash(user.password, salt, null, function(err, hash) { + if (err) { return next(err); } + user.password = hash; + next(); + }); }); - }); }); /** @@ -380,10 +380,10 @@ userSchema.pre('save', function(next) { */ userSchema.methods.comparePassword = function(candidatePassword, cb) { - bcrypt.compare(candidatePassword, this.password, function(err, isMatch) { - if (err) { return cb(err); } - cb(null, isMatch); - }); + bcrypt.compare(candidatePassword, this.password, function(err, isMatch) { + if (err) { return cb(err); } + cb(null, isMatch); + }); }; /** @@ -391,18 +391,18 @@ userSchema.methods.comparePassword = function(candidatePassword, cb) { */ userSchema.methods.gravatar = function(size) { - if (!size) { size = 200; } + if (!size) { size = 200; } - if (!this.email) { - return 'https://gravatar.com/avatar/?s=' + size + '&d=retro'; - } + if (!this.email) { + return 'https://gravatar.com/avatar/?s=' + size + '&d=retro'; + } - var md5 = crypto - .createHash('md5') - .update(this.email) - .digest('hex'); + var md5 = crypto + .createHash('md5') + .update(this.email) + .digest('hex'); - return 'https://gravatar.com/avatar/' + md5 + '?s=' + size + '&d=retro'; + return 'https://gravatar.com/avatar/' + md5 + '?s=' + size + '&d=retro'; }; module.exports = mongoose.model('User', userSchema); diff --git a/seed_data/bonfires.json b/seed_data/bonfires.json new file mode 100644 index 0000000000..6c43f02e31 --- /dev/null +++ b/seed_data/bonfires.json @@ -0,0 +1,225 @@ +{ + "name": "Palindrome Tester", + "difficulty": 1, // should be a range from 1-5 + "description": [ + "Your job is to determine if a provided string is a palindrome.", + "The definition of a palindrome can be found at http://en.wikipedia.org/wiki/Palindrome.", + "Strings will be passed in with varying formats, such as \"racecar\", \"RaceCar\", and \"race CAR\" among others.", + "Return true if the string is a palindrome, otherwise false" + ], + "publicTests": [ + "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);" + ], + "privateTests": [ + "assert.deepEqual(palindrome(\"A man, a plan, a canal. Panama\"), true);", + "assert.deepEqual(palindrome(\"never odd or even\"), true);", + "assert.deepEqual(palindrome(\"nope\"), false);" + ], + "challengeSeed": "function palindrome(str) {\n // Good luck!\n return true;\n}\n\n" +} + +/* +"aaa48de84e1ecc7c742e1124" +"ff0395860f5d3034dc0bfc94" +"7123c8c441eddfaeb5bdef0d" +"c3a4d278b9e760a0ffe8321f" +"aceca143b92049a4392a859e" +"ce9394f67d413734758e27e4" +"1369953ef6f03098cb60e2f7" +"fa229986db0716662e63163a" +"0a6207dfc9ac12f223b4e686" +"2e538b339cbcb7437e61d71f" +"21de1104b8ea7c6a382442d9" +"0aa3497514cb1d8a0ed04933" +"3a45068415f5a20a5d4a2039" +"6a73ec9b86f0e742f6c6ea76" +"06dc21940748badcdb29561e" +"0f2341ef36740b5c2b9d830c" +"dc4cc7ce1fd0418859b10e0b" +"1fcda9b5e0bf502c8b770374" +"482879c42188cde1f9ad3d8f" +"3d680bd03fd291028af57f4f" +"6b444fe5aa97359238bd3c0d" +"72d6ad274e72ffcd399e05cb" +"e864a710647bb6883c9ec617" +"024dcd8cc0178de7daa4f59f" +"ded24fb937a3fd60dc624677" +"9ad4c3b2aebe7282e973e5df" +"d16c66ecc656c82899a2d427" +"ee3e4bf39b840609dd88f5af" +"9a10d27eb6ab6f5030bdbcd9" +"b4cca5ecdeca1eebc0dc4183" +"ccdf1ef407864df62b03331e" +"1baa0329f02e41a5517b11a6" +"b5b33e5ecf6c02a5780ac419" +"84b690f53cd6cbbbf4a361f5" +"4e3b1b9d41ff11bdf3722ffe" +"1fd45e64c43cd640abcf8a76" +"c8bd32cdd943c88fb8a74934" +"9e5440269d09b71f07002333" +"5080016b8b68f40f7476c341" +"f762d45cc870d9f18c6b7024" +"cf21358ab1245c7033504b42" +"41eff7cb0f2fd8ec9e0cbf68" +"a344c63de6a00feea5c541e0" +"7ab3c18c0815d7b1f02e8768" +"a6f36e4387e2e1e25af4e000" +"9064af1431c1ff3aaa15a0d6" +"50946066aaba43a294155ab5" +"70e82e77857317d6936ecdcc" +"dc644dc20d5b02ffd7c8cc94" +"92af1e9f1813619d820dec4d" +"9d4a077fdaaa24b78a54cee9" +"cfd5fa7aea14fb294bd4f5ff" +"068541b6c5130ca541d6c05c" +"39f4d1f12142d583b0318265" +"4a201b8fa69d11cb669dca8c" +"6fa6bba2e334dd2c9e5a6911" +"30ff082b6a28558f16743fea" +"afed31c4dc2ddf056e263acb" +"b2431ecf36f0b780959aa03d" +"54e42938ab6fa923a5fbfbff" +"48d50e3ff5e96f152d912ebf" +"6c7aad2ee996132f76630c05" +"2705f0482774977fa9b5c7bc" +"c09d6682c7a144d9afd4bfab" +"1a0a30c55dd9bc2fff4e2aac" +"30c22b502e80afd144d79120" +"8f882989bbc98c68b6c7347e" +"888bf771b63a5f64e6b696ed" +"959aa13a2e6439fd5d29c5fe" +"d03d311ca64bf59a2404dcd0" +"7a650f3e4308a097d7883b1f" +"54c207808ac349fa34ed24a9" +"3cb12e3ea31fe15ba9d234e5" +"0d9f8123e52f791ae172f627" +"387518b1bb96bd918e7d0b91" +"27198d8918c9802ac0b06a58" +"7a519a552f723c6b1fdc9389" +"4240096651a50f888765ed60" +"8ba94f78cc44cfb82b3678d2" +"1cf7c3bda6ec7952923bc90f" +"cd54811e976edbc798a87c24" +"e4ee17912f5d7d80d41dc52d" +"572346dd1874a0c749c3a031" +"cf700031502680580ff25980" +"7054518832e5c7efde04a58c" +"7716c6b6a3dcc9c5df79a262" +"f4d1084c692f5a07c25a1b47" +"817b80892a78fc6f83eab4eb" +"ae0e0adda6d063d3fd2c9499" +"33184c427ecaab77b5332521" +"c6c4da707e3eed987eb65ba6" +"40f9801913c0cb9800960bf7" +"af11cf78e8340f172ba76bbe" +"c1daea28b5996b8e8800e300" +"7312b3234b5f2f50887597b9" +"3e4361c5356b30f8ce833268" +"e6fc8827b9aa96fc91035ac2" +"11658fe51b23319533c72106" +"34207fe236870fd855392ef6" +"dc970a2b17aa1432d180d078" +"2f1686ad711b5ac3d98905b5" +"ed20f4bf782e10ec26c7b3b1" +"cf4d6241df36b0bbcea401e2" +"97e414eb00338bd7bd5d1b31" +"bcfebb743729d4fc51b0db49" +"52782c1eaa15e050ac748b18" +"57f65a6cd2eb0a2745fc90ee" +"fcc569e80808c6cd84c839cc" +"2447f8e0e3ccfd895a619695" +"600687fe6332b2e2b20d6a84" +"0f8a972361baddb3ac64b6d9" +"f768594ab352cf8e2282b615" +"3163b25e25b0d6859df17751" +"c73d68f0cf77aa113337fcde" +"cc16163137f13f70decbcb5c" +"4adbf6c7ac2004ee8ae20f55" +"c2779f78a0e57dcee471cefd" +"bf44903cd2fca4ae4daf0818" +"ca8013372d58365e21bd0428" +"e308901ca272ad447dca965a" +"ec8cefe29832cd726185119f" +"36bf51da3f32b1e9550f3b15" +"aefff6dffdf534a6c9601f70" +"ce237971a71127f9ce747232" +"99f4d97fae16ccbeb8c26d46" +"c9f6480328ec4b63b1034826" +"ce10bb6e80b09533cb21c9a5" +"311a54aaf062b29422ac0b02" +"b2073bec873b295c04e9fb7e" +"7b7d94035d63c9c0598b242b" +"e19e9a0487f1bd3eabdb777c" +"eeafe5169a2afd9ce3979698" +"96c7a1f9fb73468fdb770034" +"77e607be2498160d3ceeff60" +"c784fa6b1fd7d9aedb05b607" +"a76319bca87e0b57bc79064f" +"a08db36785c51e5b92a6e92f" +"0933ab4a366d57fd1f1c0a48" +"17663f17a835cfe0bca64f4a" +"aee8323d1de634fc42c11d90" +"682044caf09a068e26c11cab" +"1346fdbe3c6fcb808b99cdf6" +"26fd8f47fe4791e2dd07b2e0" +"b1da27dd129216c2ead2e162" +"618adebe192e896eb1501708" +"2628d9eeb38db68c0b255a75" +"1fb78eda5deb8972cc357a9b" +"2fdebb85a401de75bb580a02" +"c59eae24bee36f63c938723d" +"fb66b55d5617e27ca64836a3" +"55994022872e01fd41d8ec7b" +"53ae83b5490e1cf55625ff3d" +"c44975deeb67b96e6cc37eb5" +"94c64d5ff48ca6487f5e0b07" +"e34e7c1a3d70678955a5df8e" +"6426d30a923dec6377132c47" +"d67811849354ded9d34c9ece" +"01e7ae81207cfd230cb02747" +"e24558477f94bcdd82f16ebe" +"4370f6dcc2f53bd5abed7899" +"679b1145cd3072fbcd513bcb" +"4dafd3fd84e7a337ef3e9933" +"2aca3d41cb148603b4a2d70b" +"5e5aa8c960d024109543c577" +"c5f5f313c8a7056bbcdb7639" +"a7b2aaa4cf85fce98cdeb314" +"e556c0d14bc0ce9cc7bde0ca" +"922a8284880a7c879d846f90" +"b146cf2fbf206ca48687e9b6" +"fbdc52bb7c7620bd4508e5a3" +"23d79a262a81459e75576cc2" +"a26721706d3b9f971cef3ce6" +"fb3801ed1b056a3ab4bbfdc1" +"d5cafae617f1485826de335c" +"e9650dfc8b570f9d33381012" +"453c804c7ce82e83305cd751" +"3eaab01bdd1393be8d461777" +"2b6d9ddd4754b71d92ed31b7" +"2338e9af6acab9fcf5327f6a" +"588e7405c30c346ed2ea5e44" +"eec8837994054fb2043b6166" +"0877406795956ca9eb13fea1" +"1dea30e852067eec48a24035" +"ee716ce45ea812167ed2497a" +"9621d5aeaf8de9b2f58977bd" +"e9bb838723083bac7f83d602" +"ef64da08bbe787891d47c31b" +"e01b6616cc6cf7819172f7f3" +"17c821c34fca587daec981fc" +"d0c4b7153dcb3e6af47bcd98" +"5188eb00680051c35cd6e0f0" +"9fc7b68e736a1f4931226ad8" +"b5eac897471f125224a3e594" +"c1d0f890a02c85a9320f96d5" +"7e3b1ca1b1b1e990367f0cc2" +"bff5ff77174c43f7c681e0bd" +"ddeb794121937d07a887c9e6" +"9db902e930f25fbacc125087" +"4f82d277b47ae9c98095f068" +"24f999491fa46cd194c7fd35" +*/ \ No newline at end of file