Preparing for bonfire challenges, create Bonfire model, BonfireCompletion model, update bonfire controller, create initial bonfire seed data

This commit is contained in:
Nathan Leniz
2015-01-21 21:32:13 -05:00
parent 9e41b0ca7b
commit 6ea5f5c895
6 changed files with 698 additions and 436 deletions

View File

@ -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
// });
// });
//};
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
});
});
};

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

225
seed_data/bonfires.json Normal file
View File

@ -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"
*/