Greasy Fork is available in English.

CCC Libraries

Libraries for CCC 1.9

Този скрипт не може да бъде инсталиран директно. Това е библиотека за други скриптове и може да бъде използвана с мета-директива // @require https://update.greasyfork.org/scripts/7952/35672/CCC%20Libraries.js

var __VERSION__ = "1.9",
	__DEBUG__ = false;
 
if (typeof CookieCheat === "undefined") {
	var CookieCheat = {
		models: {},
		views: {},
		currentTab: "tools",
		collections: {},
		cookieToKeep: 0,
		// CookHeaven: {},
		oldBeautify: Beautify,
		oldGameFuncs: {
			RefreshStore: new Function(Game.RefreshStore.toString().replace(/^function[\s\S]+?{/, '').replace(/}$/, 'if (CookieCheat.currentTab === "tools") $("#optimalBuying").html(CookieCheat.optimalBuyingUpgradesHtml()); else CookieCheat.optimalBuyingUpgradesHtml();')),
			RebuildUpgrades: new Function(Game.RebuildUpgrades.toString().replace(/^function[\s\S]+?{/, '').replace(/}$/, 'CookieCheat.optimalBuyingUpgradesHtml();'))
		},
		miscVars: {
			objectsAchievements: {
				0: {
					1: "Click",
					2: "Double-click",
					50: "Mouse wheel",
					100: "Of Mice and Men",
					200: "The Digital"
				},
				1: {
					1: "Grandma's cookies",
					50: "Sloppy kisses",
					100: "Retirement home",
					150: "Friend of the ancients",
					200: "Ruler of the ancients"
				},
				2: {
					1: "My first farm",
					50: "Reap what you sow",
					150: "Perfect Agriculture",
					100: "Farm ill"
				},
				3: {
					1: "Production chain",
					50: "Industrial revolution",
					150: "Ultimate automation",
					100: "Global warming"
				},
				4: {
					1: "You know the drill",
					50: "Excavation site",
					150: "Can you dig it",
					100: "Hollow the planet"
				},
				5: {
					1: "Expedition",
					50: "Galactic highway",
					150: "Type II civilization",
					100: "Far far away"
				},
				6: {
					1: "Transmutation",
					50: "Transmogrification",
					150: "Gild wars",
					100: "Gold member"
				},
				7: {
					1: "A whole new world",
					50: "Now you're thinking",
					150: "Brain-split",
					100: "Dimensional shift"
				},
				8: {
					1: "Time warp",
					50: "Alternate timeline",
					150: "Time duke",
					100: "Rewriting history"
				},
				9: {
					1: "Antibatter",
					50: "Quirky quarks",
					100: "It does matter!",
					150: "Molecular maestro"
				},
				10: {
					1: "Lone photon",
					50: "Dazzling glimmer",
					100: "Blinding flash",
					150: "Unending glow"
				}
			},
			upgradesGenericsFunctions: {
				modifyObjectCps: [
					["Reinforced index finger", 0],
					["Thousand fingers", 0],
					["Million fingers", 0],
					["Billion fingers", 0],
					["Trillion fingers", 0],
					["Quadrillion fingers", 0],
					["Ambidextrous", 0],
					["Carpal tunnel prevention cream", 0],
					["Sextillion fingers", 0],
					["Quintillion fingers", 0],
 
					["Forwards from grandma", 1],
					["One mind", 1],
					["Communal brainsweep", 1],
					["Steel-plated rolling pins", 1],
					["Lubricated dentures", 1],
					["Prune juice", 1],
					["Double-thick glasses", 1],
					["Farmer grandmas", 1],
					["Worker grandmas", 1],
					["Miner grandmas", 1],
					["Cosmic grandmas", 1],
					["Transmuted grandmas", 1],
					["Altered grandmas", 1],
					["Grandmas' grandmas", 1],
					["Antigrandmas", 1],
					["Rainbow grandmas", 1],
					["Bingo center/Research facility", 1],
					["Ritual rolling pins", 1],
					["Elder Pact", 1],
 
					["Cheap hoes", 2],
					["Fertilizer", 2],
					["Cookie trees", 2],
					["Genetically-modified cookies", 2],
					["Gingerbread scarecrows", 2],
 
					["Sturdier conveyor belts", 3],
					["Child labor", 3],
					["Sweatshop", 3],
					["Radium reactors", 3],
					["Recombobulators", 3],
 
					["Sugar gas", 4],
					["Megadrill", 4],
					["Ultradrill", 4],
					["Ultimadrill", 4],
					["H-bomb mining", 4],
 
					["Vanilla nebulae", 5],
					["Wormholes", 5],
					["Frequent flyer", 5],
					["Warp drive", 5],
					["Chocolate monoliths", 5],
 
					["Antimony", 6],
					["Essence of dough", 6],
					["True chocolate", 6],
					["Ambrosia", 6],
					["Aqua crustulae", 6],
 
					["Ancient tablet", 7],
					["Insane oatling workers", 7],
					["Soul bond", 7],
					["Sanity dance", 7],
					["Brane transplant", 7],
 
					["Flux capacitors", 8],
					["Time paradox resolver", 8],
					["Quantum conundrum", 8],
					["Causality enforcer", 8],
					["Yestermorrow comparators", 8],
 
					["Sugar bosons", 9],
					["String theory", 9],
					["Large macaron collider", 9],
					["Big bang bake", 9],
					["Reverse cyclotrons", 9],
					
					["Gem polish", 10],
					["9th color", 10],
					["Chocolate light", 10],
					["Grainbow", 10],
					["Pure cosmic light", 10]
				],
				modifyPercentCps: [
					["Oatmeal raisin cookies", 5],
					["Peanut butter cookies", 5],
					["Plain cookies", 5],
					["Sugar cookies", 5],
					["Coconut cookies", 5],
					["White chocolate cookies", 5],
					["Macadamia nut cookies", 5],
					["Double-chip cookies", 10],
					["White chocolate macadamia nut cookies", 10],
					["All-chocolate cookies", 10],
					["Dark chocolate-coated cookies", 15],
					["White chocolate-coated cookies", 15],
					["Eclipse cookies", 15],
					["Zebra cookies", 15],
					["Snickerdoodles", 15],
					["Stroopwafels", 15],
					["Macaroons", 15],
					["Empire biscuits", 15],
					["British tea biscuits", 15],
					["Chocolate british tea biscuits", 15],
					["Round british tea biscuits", 15],
					["Round chocolate british tea biscuits", 15],
					["Round british tea biscuits with heart motif", 15],
					["Round chocolate british tea biscuits with heart motif", 15],
					["Madeleines", 20],
					["Palmiers", 20],
					["Palets", 20],
					["Sablés", 20],
					["Caramoas", 25],
					["Sagalongs", 25],
					["Shortfoils", 25],
					["Win mints", 25],
					["Fig gluttons", 25],
					["Loreols", 25],
					["Jaffa cakes", 25],
					["Grease's cups", 25],
					["Skull cookies", 20],
					["Ghost cookies", 20],
					["Bat cookies", 20],
					["Slime cookies", 20],
					["Pumpkin cookies", 20],
					["Eyeball cookies", 20],
					["Spider cookies", 20],
 
					["Christmas tree biscuits", 20],
					["Snowflake biscuits", 20],
					["Snowman biscuits", 20],
					["Holly biscuits", 20],
					["Candy cane biscuits", 20],
					["Bell biscuits", 20],
					["Present biscuits", 20],
					["Increased merriness", 15],
					["Improved jolliness", 15],
					["A lump of coal", 1],
					["An itchy sweater", 1],
 
					["Pure heart biscuits", 25],
					["Ardent heart biscuits", 25],
					["Sour heart biscuits", 25],
					["Weeping heart biscuits", 25],
					["Golden heart biscuits", 25],
					["Eternal heart biscuits", 25],
 
					["Specialized chocolate chips", 1],
					["Designer cocoa beans", 2],
					["Underworld ovens", 3],
					["Exotic nuts", 4],
					["Kitten helpers", function () {return (Game.milkProgress * 0.05);}],
					["Kitten workers", function () {return (Game.milkProgress * 0.1);}],
					["Kitten engineers", function () {return (Game.milkProgress * 0.2);}],
					["Kitten overseers", function () {return (Game.milkProgress * 0.2);}],
					["Arcane sugar", 5],
					["Heavenly chip secret", function () {return (parseFloat(Game.prestige['Heavenly chips']) * 0.02 * 0.05);}],
					["Heavenly cookie stand", function () {return (parseFloat(Game.prestige['Heavenly chips']) * 0.02 * 0.25);}],
					["Heavenly bakery", function () {return (parseFloat(Game.prestige['Heavenly chips']) * 0.02 * 0.5);}],
					["Heavenly confectionery", function () {return (parseFloat(Game.prestige['Heavenly chips']) * 0.02 * 0.75);}],
					["Heavenly key", function () {return (parseFloat(Game.prestige['Heavenly chips']) * 0.02 * 1);}]
				],
				addCpsForObjectUpgrades: function (arr) {
					_.each(arr, function (item) {
						var upgradeName = item[0];
						if (!Game.Upgrades[upgradeName])
							console.log('Upgrade [' + upgradeName + '] Doesnt exist.');
						Game.Upgrades[upgradeName].cps = CookieCheat.miscVars.upgradesGenericsFunctions.getCpsForUpgradeFunction(item[1], upgradeName);
						Game.Upgrades[upgradeName].realCps = CookieCheat.miscVars.upgradesGenericsFunctions.takeCareOfAchievements();
					});
				},
				getCpsForUpgradeFunction: function (objId, upgradeName) {
					var pattern = new RegExp('Game\\\.Has\\\([\'"]' + upgradeName + '[\'"]\\)', 'g');
					var cpsFuncModif = new Function(Game.ObjectsById[objId].cps.toString().replace(/}[^}]*?$/, "").replace(/^function[^{]+?{/, "").replace(pattern, 1));
					return function () {
						return ((cpsFuncModif() - Game.ObjectsById[objId].cps()) * Game.ObjectsById[objId].amount);
					}
				},
				getCpsForPercentUpgrade: function (percent) {
					if (typeof percent === "number")
						var nb = percent * 0.01;
					return function () {
						return (Game.cookiesPs * (1 + (nb || percent())) - Game.cookiesPs);
					}
				},
				addCpsForPercentUpgrades: function (arr) {
					_.each(arr, function (item) {
						var upgradeName = item[0];
						Game.Upgrades[upgradeName].cps = CookieCheat.miscVars.upgradesGenericsFunctions.getCpsForPercentUpgrade(item[1]);
						Game.Upgrades[upgradeName].realCps = CookieCheat.miscVars.upgradesGenericsFunctions.takeCareOfAchievements();
					});
				},
				achievsForAllObjects: function () {
					_.each(Game.ObjectsById, function (item) {
						var objectName = item.name;
						Game.Objects[objectName].realCps = CookieCheat.miscVars.upgradesGenericsFunctions.takeCareOfAchievements();
					});
				},
				takeCareOfAchievements: function () {
					return function () {
						var isUpgrade = this instanceof Game.Upgrade;
						var isObject = this instanceof Game.Object;
						var nb = 0;
						if (isObject) {
							if (this.amount === 0 && !_.isUndefined(CookieCheat.miscVars.objectsAchievements[this.id]) && !_.isUndefined(CookieCheat.miscVars.objectsAchievements[this.id][1]) && !Game.HasAchiev(CookieCheat.miscVars.objectsAchievements[this.id][1]))
								nb++;
							if (this.amount === 1 && !_.isUndefined(CookieCheat.miscVars.objectsAchievements[this.id]) && !_.isUndefined(CookieCheat.miscVars.objectsAchievements[this.id][2]) && !Game.HasAchiev(CookieCheat.miscVars.objectsAchievements[this.id][2]))
								nb++;
							if (this.amount === 49 && !_.isUndefined(CookieCheat.miscVars.objectsAchievements[this.id]) && !_.isUndefined(CookieCheat.miscVars.objectsAchievements[this.id][50]) && !Game.HasAchiev(CookieCheat.miscVars.objectsAchievements[this.id][50]))
								nb++;
							if (this.amount === 99 && !_.isUndefined(CookieCheat.miscVars.objectsAchievements[this.id]) && !_.isUndefined(CookieCheat.miscVars.objectsAchievements[this.id][100]) && !Game.HasAchiev(CookieCheat.miscVars.objectsAchievements[this.id][100]))
								nb++;
							if (this.amount === 149 && !_.isUndefined(CookieCheat.miscVars.objectsAchievements[this.id]) && !_.isUndefined(CookieCheat.miscVars.objectsAchievements[this.id][150]) && !Game.HasAchiev(CookieCheat.miscVars.objectsAchievements[this.id][150]))
								nb++;
							if (this.amount === 199 && !_.isUndefined(CookieCheat.miscVars.objectsAchievements[this.id]) && !_.isUndefined(CookieCheat.miscVars.objectsAchievements[this.id][200]) && !Game.HasAchiev(CookieCheat.miscVars.objectsAchievements[this.id][200]))
								nb++;
							if (!Game.HasAchiev('Builder') && Game.BuildingsOwned === 99)
								nb++;
							if (!Game.HasAchiev('Architect') && Game.BuildingsOwned === 399)
								nb++;
							if (!Game.HasAchiev('Engineer') && Game.BuildingsOwned === 799)
								nb++;
							var oneOfEach = 1;
							var mathematician = 1;
							var base10 = 1;
							var centennial = 1;
							for (var i = 0; i < Game.ObjectsById.length; i++) {
								if (i === this.id)
									continue;
								var obj = Game.ObjectsById[i];
								if (obj.amount == 0)
									oneOfEach = 0;
								if (obj.amount < Math.min(128, Math.pow(2, (Game.ObjectsById.length - obj.id) - 1)))
									mathematician = 0;
								if (obj.amount < (Game.ObjectsById.length - obj.id) * 10)
									base10 = 0;
								if (obj.amount < 100)
									centennial = 0;
							}
							if (!Game.HasAchiev('One with everything') && oneOfEach && this.amount === 0)
								nb++;
							if (!Game.HasAchiev('Mathematician') && mathematician && this.amount === Math.min(128, Math.pow(2, (Game.ObjectsById.length - this.id) - 1)) - 1)
								nb++;
							if (!Game.HasAchiev('Base 10') && base10 && this.amount === (Game.ObjectsById.length - this.id) * 10 - 1)
								nb++;
							if (!Game.HasAchiev('Centennial') && centennial && this.amount === 99)
								nb++;
						}
						if (isUpgrade) {
							if (!Game.HasAchiev("Enhancer") && Game.UpgradesOwned === 19)
								nb++;
							if (!Game.HasAchiev("Augmenter") && Game.UpgradesOwned === 49)
								nb++;
							if (!Game.HasAchiev("Upgrader") && Game.UpgradesOwned === 99)
								nb++;
							if (!Game.HasAchiev("Wholesome") && this.name === "Heavenly key")
								nb++;
							var howManyHalloweenUpgrades = 0;
							if (Game.Has('Skull cookies')) howManyHalloweenUpgrades++;
							if (Game.Has('Ghost cookies')) howManyHalloweenUpgrades++;
							if (Game.Has('Bat cookies')) howManyHalloweenUpgrades++;
							if (Game.Has('Slime cookies')) howManyHalloweenUpgrades++;
							if (Game.Has('Pumpkin cookies')) howManyHalloweenUpgrades++;
							if (Game.Has('Eyeball cookies')) howManyHalloweenUpgrades++;
							if (Game.Has('Spider cookies')) howManyHalloweenUpgrades++;
							var test = this.name === 'Skull cookies' || this.name === 'Ghost cookies' || this.name === 'Bat cookies' ||
							this.name === 'Slime cookies' || this.name === 'Pumpkin cookies' || this.name === 'Eyeball cookies' || this.name === 'Spider cookies';
							if (!Game.HasAchiev("Spooky cookies") && howManyHalloweenUpgrades === 6 && test)
								nb++;
							var howManyGrandmasUpgrades = 0;
							if (Game.Has('Farmer grandmas')) howManyGrandmasUpgrades++;
							if (Game.Has('Worker grandmas')) howManyGrandmasUpgrades++;
							if (Game.Has('Miner grandmas')) howManyGrandmasUpgrades++;
							if (Game.Has('Cosmic grandmas')) howManyGrandmasUpgrades++;
							if (Game.Has('Transmuted grandmas')) howManyGrandmasUpgrades++;
							if (Game.Has('Altered grandmas')) howManyGrandmasUpgrades++;
							if (Game.Has('Grandmas\' grandmas')) howManyGrandmasUpgrades++;
							if (Game.Has('Antigrandmas')) howManyGrandmasUpgrades++;
							if (Game.Has('Rainbow grandmas')) howManyGrandmasUpgrades++;
							var test = this.name === 'Antigrandmas' || this.name === 'Farmer grandmas' || this.name === 'Worker grandmas' || this.name === 'Altered grandmas' ||
							this.name === 'Miner grandmas' || this.name === 'Rainbow grandmas' || this.name === 'Cosmic grandmas' || this.name === 'Transmuted grandmas' || this.name === 'Grandmas\' grandmas';
							if (!Game.HasAchiev("Elder") && howManyGrandmasUpgrades === 6 && test)
								nb++;
						}
						var percent = (0.04 * nb) * (0.05 * Game.Has("Kitten helpers") + 0.1 * Game.Has("Kitten workers") + 0.2 * Game.Has("Kitten engineers") + 0.2 * Game.Has("Kitten overseers"));
						var diffCps = (Game.cookiesPs * (1 + percent) - Game.cookiesPs);
						return (this.cps() + diffCps);
					}
				}
			}
		},
		resetCookieCheat: function () {
			if (confirm("You will lose all your saves. Are you sure ?")) {
				_.each(CookieCheat.collections, function (collection, key) {
					while (collection.models.length > 0) {
						if (typeof collection.models[0].stop === "function")
							collection.models[0].stop();
						collection.models[0].clear();
						collection.remove(collection.models[0]);
					}
					collection.reset();
				});
				_.each(CookieCheat.models, function (model, key) {
					model.reset();
					delete model;
				});
				for (var k in localStorage) { if (k.indexOf("CookieClickerCheats") === 0) delete localStorage[k];}
				CookieCheat.miscVars.upgradesGenericsFunctions.addCpsForObjectUpgrades(CookieCheat.miscVars.upgradesGenericsFunctions.modifyObjectCps);
				CookieCheat.miscVars.upgradesGenericsFunctions.addCpsForPercentUpgrades(CookieCheat.miscVars.upgradesGenericsFunctions.modifyPercentCps);
				CookieCheat.miscVars.upgradesGenericsFunctions.achievsForAllObjects();
				CookieCheat.views = {};
				CookieCheat.collections = {};
				CookieCheat.models = {};
				CookieCheat.currentNumFormat = "restore";
				CookieCheat.shouldShowTimeLeft = "restore";
				CookieCheat.changeBeautify("restore");
				CookieCheat.processDesc("restore");
				CookieCheat.initAllBackbone();
				Game.UpdateMenu();
			}
		},
		howManySecondsUntilThisAmount: function (amount) {
			if (Game.cookiesPs == 0)
				return Infinity;
			var res = Math.floor((amount - Game.cookies) / Game.cookiesPs);
			return (res > 0 ? res : 0);
		},
		optimalBuyingHtml: function () {
			CookieCheat.miscVars.objectsOrder = _.map(Game.ObjectsById, function (obj) {
				return {
					id: obj.id,
					name: obj.name,
					val: 10000 * obj.realCps() / obj.price
				};
			}).sort(function(a, b) {
				return b.val - a.val;
			});
			_.each(CookieCheat.miscVars.objectsOrder, function (me, index) {
				var color = (index === 0 ? "#0f0" : (index === Game.ObjectsById.length - 1 ? '#f00' : '#ff0'));
				$('#product' + me.id).find('.price').css("color", color);
				CookieCheat.miscVars.objectsOrder[index].color = color;
			});
		},
		optimalBuyingUpgradesHtml: function () {
			CookieCheat.optimalBuyingHtml();
			var res = "";
			var nb0 = 0;
			var all = CookieCheat.miscVars.objectsOrder;
			var bestObjectVal = CookieCheat.miscVars.objectsOrder[0].val;
			var worstObjectVal = CookieCheat.miscVars.objectsOrder[CookieCheat.miscVars.objectsOrder.length - 1].val;
			_.each(_.map(Game.UpgradesInStore, function (upgrade, index) {
				if (typeof upgrade.realCps !== "function")
					nb0++;
				return {
					id: upgrade.id,
					name: upgrade.name,
					idInStore: index,
					val: 10000 * (typeof upgrade.realCps === "function" ? upgrade.realCps() : 0) / upgrade.basePrice
				};
			}).sort(function(a, b) {
				return b.val - a.val;
			}), function (me, index) {
				if (typeof Game.Upgrades[me.name].realCps === "function") {
					var color = (index === 0 ? "#0f0" : (index === Game.UpgradesInStore.length - nb0 - 1 ? '#f00' : '#ff0'));
					if (me.val > bestObjectVal || me.val < worstObjectVal)
						color = (me.val > bestObjectVal ? "#0ff" : "#f00");
					me.color = color;
					all.push(me);
					$('#upgrade' + me.idInStore).html('<div style="background-color:' + color + ';height:10px;width:100%;"></div>');
				}
				else
					$('#upgrade' + me.idInStore).html('<div style="background-color:#000;height:10px;width:100%;"></div>');
			});
			_.each(all.sort(function(a, b) {
				return b.val - a.val;
			}), function (me) {
				res += '<span style="color:' + me.color + ';font-family: Kavoon;">' + me.name + '</span><br><br>';
			});
			return res;
		},
		upgradeBlacklist: ['Gold hoard', "Neuromancy", "Ultrascience", "Elder Covenant", "Revoke Elder Covenant", "One mind", "Season switcher", "Lovesick biscuit", "Festive biscuit", "Ghostly biscuit", "Fool's biscuit"],
		strForFeatures: {
			topHeadBand: function () {
				return '<hr>' +
				'<div id="tabs">' +
					'<input type="button" class="superTabBtn superGood superBtn' + (CookieCheat.currentTab === "tools" ? " selectedTab" : "") + '" value="Tools" onclick="CookieCheat.changeTab(\'tools\')">' +
					'<input type="button" class="superTabBtn superBad superBtn' + (CookieCheat.currentTab === "cheats" ? " selectedTab" : "") + '" value="Cheats" onclick="CookieCheat.changeTab(\'cheats\')">' +
					'<input type="button" class="superTabBtn superWarning superBtn' + (CookieCheat.currentTab === "mods" ? " selectedTab" : "") + '" value="Mods" onclick="CookieCheat.changeTab(\'mods\')">' +
				'</div>' +
				'<div class="section ' + (CookieCheat.currentTab === "tools" ? " superGood" : (CookieCheat.currentTab === "mods" ? " superWarning" : " superBad")) + '" style="text-decoration:underline;font-size:25px;">' + 
				'<hr>' +
				String.capitalize(CookieCheat.currentTab) + ("") +
				'</div>' +
				'<hr>';
			},
			cheats: function () {
				var a = (function () {
					var nb = $('.numberToSet').val();
					var id = $('#selectBuildingToSet').val();
					if (id === 'all') {
						_.each(Game.ObjectsById, function (me) {
							me.amount = nb;
							if (_.isFunction(me.buyFunction))
								me.buyFunction();
							me.refresh();
						});
					}
					else {
						var me = Game.ObjectsById[id];
						me.amount = nb;
						if (_.isFunction(me.buyFunction))
							me.buyFunction();
						me.refresh();
					}
					Game.storeToRebuild=1;
					Game.recalculateGains=1;
				}).toString();
				return '<div class="subsection"><br>' +
					'<br>' +
					'<br>' +
					'<div class="title">Give yourself some cookies</div>'+ // Cookies to earn
					'<div class="listing"><small>(Note : You can use negative numbers to remove cookies. (<span style="font-style: italic;">"God... Why would you do that..?"</span> - CookieGod).)</small></div><br>'+
					'<div class="listing" id="earnCookieDiv">' +
						'<p class="superFont">' +
							'How many ? ' +
							'<input type="number" class="numberToEarn imAState superFont" value="0" style="width:25%"/>' +
							'<span class="infoToDisplay superGood simpleInfo superRight"></span>' +
						'</p>' +
					'</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">Give yourself some HEAVENLY CHIPS</div>'+ // Heavenly chips to earn
					'<div class="listing"><small>(Note : You can use negative numbers to remove Heavenly chips. (<span style="font-style: italic;">"That.. Is... Really... DUMB !"</span> - CookieGod).)</small></div><br>'+
					'<div class="listing" id="earnHeavenDiv">' +
						'<p class="superFont">' +
							'How many ? ' +
							'<input type="number" class="numberToEarn imAState superFont" value="0" style="width:25%"/>' +
							'<span class="infoToDisplay superGood simpleInfo superRight"></span>' +
						'</p>' +
					'</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">AutoClick Cookie</div>'+ // AutoClick Cookie
					'<div class="listing"><small>(Note : I can\'t guarantee that the cheat will click as fast as you want. It depends on your computer.)</small></div><br>'+
					'<div class="listing" id="autoClickDiv">' +
						'<a id="autoClickButton" class="superBtn superGood">AutoClick</a>' +
						'<span class="superFont imAState">State :</span> <span class="superGood goodState">ON</span>/<span class="badState superBad currentState">OFF</span>' +
						'<div id="clickAmount" class="simpleInfo superRight"></div>' +
						'<br><br><input class="imAState" id="clickingSpeed" type="range" name="speed" min="1" max="1000" step="1" style="width:100%">' +
						'<br><br><span id="clickingSpeedText" class="superFont imAState"></span>' +
					'</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">AutoClick Wrinklers</div>'+ // AutoClick Wrinklers
					'<div class="listing"><small>(Note : Hello, I\'m a note.)</small></div><br>'+
					'<div class="listing" id="autoClickWrinklersDiv">' +
						'<a id="autoClickWrinklersButton" class="superBtn superGood">Kill them all !</a>' +
						'<span class="superFont imAState">State :</span> <span class="superGood goodState">ON</span>/<span class="badState superBad currentState">OFF</span>' +
						'<div id="clickWrinklersAmount" class="simpleInfo superRight"></div>' +
					'</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">Set building amount</div>'+ // Set building amount
					'<div class="listing"><small>(Note : I know you\'ll crash your game with this but... CookieCheat must do ANYTHING. (Yes, even crash your game).)</small></div>'+
					'<div class="listing"><small>(Note : Don\'t be too greedy... (I know you will...))</small></div><br>'+
					'<div class="listing" id="setBuildingDiv">' +
						'<br>' +
						'<p class="superFont">' +
							'Which building ?' +
							'<select id="selectBuildingToSet" class="imAState superFont">' +
								'<option value="all">ALL !!!</option>' +
								(function () {var r = "";for(var i in Game.ObjectsById){r+='<option value="'+i+'">'+Game.ObjectsById[i].name+'</option>';}return r;})() +
							'</select>' +
						'</p>' +
						'<br>' +
						'<p class="superFont">' +
							'How many ?' +
							'<input type="number" class="numberToSet imAState superFont" value="0" style="width:25%"/>' +
						'</p>' +
						'<br>' +
						'<p class="superFont">' +
							'<a id="setBuildingButton" class="superBtn superGood" onclick="' +
								(a.substring(a.indexOf('{') + 1, a.lastIndexOf('}'))).replace(/"/g, "'") +
								'">Set it ! OMFG HURRY UP I WANT A LOT OF THAT THINGS !!!!</a>' +
						'</p>' +
					'</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">AutoClick Reindeers</div>'+ // AutoClick Reindeers
					'<div class="listing" id="autoReindeerClickDiv">' +
						'<a id="autoReindeerClickButton" class="superBtn superGood">AutoReindeerClick</a>' +
						'<span class="superFont imAState">State :</span> <span class="superGood goodState">ON</span>/<span class="badState superBad currentState">OFF</span>' +
						'<div id="reindeerClickAmount" class="simpleInfo superRight"></div>' +
					'</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">AutoSpawn Golden Cookies</div>'+ // AutoSpawn golden Cookie
					'<div class="listing"><small>(Note : I can\'t guarantee that the cheat will spawn golden cookies as fast as you want. It depends on your computer.)</small></div>'+
					'<div class="listing"><small>(Note : Sometimes, "legit" golden cookies will spawn. They do not depend on my cheat.)</small></div><br>'+
					'<div class="listing" id="autoSpawnDiv">' +
						'<a id="autoSpawnButton" class="superBtn superGood">AutoSpawn</a>' +
						'<span class="superFont imAState">State :</span> <span class="superGood goodState">ON</span>/<span class="badState superBad currentState">OFF</span>' +
						'<div id="spawnAmount" class="simpleInfo superRight"></div>' +
						'<br><br><input class="imAState" id="spawningSpeed" type="range" name="speed" min="100" max="600000" step="100" style="width:100%">' +
						'<br><br><span id="spawningSpeedText" class="superFont imAState"></span>' +
					'</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">AutoClick GoldenCookies</div>'+ // AutoClick GoldenCookies
					'<div class="listing" id="autoGoldenClickDiv">' +
						'<a id="autoGoldenClickButton" class="superBtn superGood">AutoGoldenClick</a>' +
						'<span class="superFont imAState">State :</span> <span class="superGood goodState">ON</span>/<span class="badState superBad currentState">OFF</span>' +
						'<div id="goldenClickAmount" class="simpleInfo superRight"></div>' +
					'</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">Spawn GoldenCookies</div>'+ // Spawn GoldenCookie
					'<div class="listing" id="goldenSpawnDiv">' +
						'<a id="goldenSpawnButton" class="superBtn superGood">Spawn a golden cookie NOW ! <span style="font-size:50%;">...please</span></a>' +
						'<div id="goldenSpawnedAmount" class="simpleInfo superRight"></div>' +
					'</div></div>';
			},
			tools: function () {
				var a = (function () {
					if (!confirm('Do you really want to sell ALL your buildings ?'))
						return;
					_.each(Game.ObjectsById, function (obj)  {
						while (obj.amount > 1) {
							var price=obj.basePrice*Math.pow(Game.priceIncrease,obj.amount);
							price=Math.floor(price*0.5);
							Game.cookies += price;
							obj.amount--;
							Game.BuildingsOwned--;
						}
						obj.sell();
					});
				}).toString();
				return '<div class="subsection"><br>' +
					'<br>' +
					'<br>' +
					'<div class="title">Save manager</div>'+ // Save manager
					'<div class="listing">' +
						'<div id="newSaveForm">' +
							'<form>' +
								'<p class="superFont">' +
									'Custom save name :' +
									'<input type="text" id="enterNameSave" class="superRight superFont" style="width:50%"></input>' +
								'</p>' +
								'<br />' +
								'<br />' +
								'<p class="superFont">' +
									'Save code :' +
									'<select id="selectSaveCode" class="superRight superFont">' +
										'<option value="' + CookieCheat.miscVars.newGame + '">New game</option>' +
										'<option value="current">--Current game--</option>' +
										'<option value="manual">--Import a save--</option>' +
									'</select>' +
								'</p>' +
								'<br />' +
								'<br />' +
								'<input type="text" id="saveCode" class="superRight superFont" disabled="1" value="' + CookieCheat.miscVars.newGame + '" style="width:100%;"></input>' +
								'<br />' +
								'<br />' +
								'<p style="text-align:center">' +
									'<input type="submit" id="newSaveButton" class="submit superBtn superGood" value="Give me that save !" />' +
								'</p>' +
							'</form>' +
						'</div>' +
						'<br /><br />' +
						'<div class="superHidden" id="savesListContainer"></div>'+
					'</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">Cookie amount to keep safely (It\'s soooo safe)</div>'+ // Cookies to keep
					'<div class="listing" id="safeCookieDiv">' +
						'<p>' +
							'<p>' +
								'<a class="superBtn" id="fixCookies" style="font-size:1em;color:#333;">Fix my cookies please... (Infinity or NaN cookies ? Push this button and let the CookieGod work !)</a>' +
							'</p>' +
							'<br><br>' +
							'<p>' +
								'<a class="superBtn superRadioBtn _pseudoRadio" id="checkBoxToKeepForLucky" style="font-size:1.2em;">Automatically keep cookies to maximize "Lucky!".</a>' +
								'<span class="infoToDisplay superGood simpleInfo superRight"></span>' +
							'</p>' +
							'<br><br>' +
							'<p>' +
								'<a class="superBtn superRadioBtn _pseudoRadio" id="checkBoxToKeepForFrenzy" style="font-size:1.2em;">Automatically keep cookies to maximize "Lucky!+Frenzy!".</a>' +
							'</p>' +
							'<br><br>' +
							'<p>' +
								'<a class="superBtn superRadioBtn _pseudoRadio" id="checkBoxToKeepAny" style="font-size:1.2em;">By yourself ? Game boy.</a>' +
								'<input type="number" class="numberToKeep imAState superFont" value="0" style="width:25%"/>' +
								'<span class="whatAboutYou superGood simpleInfo superRight"></span>' +
							'</p>' +
							'<p>' +
								'<br>' +
								'<input type="checkbox" id="hitMePlease"/>' +
								'<label for="hitMePlease" class="superBad" id="hitLabel">Don\'t let me break this limit, CookieGod !</label>' +
								'<span class="cookieGod superBad simpleInfo superRight">The CookieGod doesn\'t care</span>' +
							'</p>' +
						'</p>' +
					'</div>'+
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">Optimal Building order</div>'+ // Optimal buying
					'<div class="listing" id="optimalBuying">' +
						CookieCheat.optimalBuyingUpgradesHtml() +
					'</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">Sell buildings</div>'+ // Sell everything !!!
					'<div class="listing">' +
						'<a class="superBtn superBad" onclick="' + (a.substring(a.indexOf('{') + 1, a.lastIndexOf('}'))).replace(/"/g, "'") + '" style="font-size:1.2em;">Sell ALL your buildings (EVERYTHING !!!)</a>' +
						(function () {
							var res = "";
							_.each(Game.ObjectsById, function (obj)  {
								res += "<br><br><br>";
								res += '<a class="superFont superBtn superWarning" onclick="' +
									'var objName = \'' + obj.name + '\';' +
									'var obj = Game.Objects[objName];' +
									'var goal = Game.Objects[objName].amount - 10;' +
									'goal = (goal < 0 ? goal = 0 : goal = goal);' +
									'if (!confirm(\'Do you really want to sell \' + (Game.Objects[objName].amount - goal) + \' \' + objName + \' ?\'))' +
										'return;' +
									'goal++;' +
									'while (obj.amount > goal) {' +
										'var price=obj.basePrice*Math.pow(Game.priceIncrease,obj.amount);' +
										'price=Math.floor(price*0.5);' +
										'Game.cookies += price;' +
										'obj.amount--;' +
										'Game.BuildingsOwned--;' +
									'}' +
									'obj.sell();" style="font-size:1.2em;">Sell 10 ' + obj.name + '</a>\t';
 
								res += '<a class="superFont superBtn superBad" onclick="' +
									'var objName = \'' + obj.name + '\';' +
									'var obj = Game.Objects[objName];' +
									'if (!confirm(\'Do you really want to sell ALL your \' + objName + \' ?\'))' +
										'return;' +
									'while (obj.amount > 1) {' +
										'var price=obj.basePrice*Math.pow(Game.priceIncrease,obj.amount);' +
										'price=Math.floor(price*0.5);' +
										'Game.cookies += price;' +
										'obj.amount--;' +
										'Game.BuildingsOwned--;' +
									'}' +
									'obj.sell();" style="font-size:1.2em;">Sell all your ' + obj.name + '</a>';
							});
							return res;
						})() +
					'</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">AutoBuy Buildings</div>'+ // AutoBuy buildings
					'<div class="listing">' +
						'<div id="newForm">' +
							'<form>' +
								'<p class="superFont">' +
									'Building : ' +
									'<select id="selectBuilding" class="superRight superFont">' +
										'<option value="all">ALL !!!</option>' +
									'</select>' +
								'</p>' +
								'<br />' +
								'<br />' +
								'<p class="superFont">' +
									'Amount to reach : ' +
									'<input type="number" class="superRight number superFont" min="0" max="1000" value="0"/>' +
								'</p>' +
								'<br />' +
								'<br />' +
								'<p style="text-align:center">' +
									'<input type="submit" id="newAutoBuyBuildingsButton" class="submit superBtn superGood" value="Add it !" />' +
								'</p>' +
							'</form>' +
						'</div>' +
						'<br /><br />' + 
						'<div class="superHidden" id="buildingsListContainer"></div>'+
					'</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">AutoBuy Upgrades</div>'+ // AutoBuy upgrades
					'<div class="listing">' +
						'<div id="newUpgradeForm">' +
							'<form>' +
								'<p class="superFont">' +
									'Upgrade : ' +
									'<select id="selectUpgrade" class="superRight superFont" style="width:70%;">' +
										'<option value="all">ALL !!!</option>' +
									'</select>' +
								'</p>' +
								'<br />' +
								'<br />' +
								'<p class="superFont">' +
									'Or enter its name here : ' +
									'<input type="text" id="enterNameUpgrade" class="superRight superFont" style="width:40%"></input>' +
								'</p>' +
								'<br />' +
								'<br />' +
								'<p style="text-align:center">' +
									'<input type="submit" id="newAutoBuyUpgradesButton" class="submit superBtn superGood" value="Buy it !" />' +
								'</p>' +
							'</form>' +
						'</div>' +
						'<br /><br />' + 
						'<div class="superHidden" id="upgradesListContainer"></div>'+
					'</div></div>';
			},
			mods: function () {
				var a = (function () {
					var name = $('#fontSet').val();
					CookieCheat.changeBeautify(name);
				}).toString();
				return '<div class="subsection">' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">Modify the number display</div>'+ // Beautify
					'<div class="listing">' +
						'<p class="superFont">' +
							'Which format do you want ?' +
							'<select class="imAState superFont" id="fontSet" onchange="' + (a.substring(a.indexOf('{') + 1, a.lastIndexOf('}'))).replace(/"/g, "'") + '">' +
								'<option value="restore">Default</option>' +
								(function () {var r = "";for(var i in CookieCheat.numFormats){r+='<option value="'+i+'" + ' + (CookieCheat.currentNumFormat === i ? " selected " : "") + '>'+CookieCheat.lowCamelCaseToSentence(i)+'</option>';}return r;})() +
							'</select>' +
						'</p>' +
					'</div>' +
					// '<br>' +
					// '<br>' +
					// '<br>' +
					// '<div class="title">About the remaining time</div>'+ // Remaining time
					// '<div class="listing">' +
					// 	'<p class="superFont">' +
					// 		'Do you want to show the remaining time in buildings/upgrades tooltips ?<br><br>' +
					// 		'<input id="aboutTheTimeLeft" onchange="' + "$('#shouldLabel').toggleClass('superGood', CookieCheat.shouldShowTimeLeft === 'restore').toggleClass('superBad', CookieCheat.shouldShowTimeLeft !== 'restore');CookieCheat.shouldShowTimeLeft = (CookieCheat.shouldShowTimeLeft === 'restore' ? 'hello' : 'restore');CookieCheat.processDesc(CookieCheat.shouldShowTimeLeft);" + '" type="checkbox" ' + (CookieCheat.shouldShowTimeLeft === "restore" ? "" : "checked") + '/>' +
					// 		'<label for="aboutTheTimeLeft" class="' + (CookieCheat.shouldShowTimeLeft === 'restore' ? 'superBad' : 'superGood') + '" id="shouldLabel">I want to see that information !!!!</label>' +
					// 	'</p>' +
					// '</div>' +
					'<br>' +
					'<br>' +
					'<br>' +
					'<div class="title">Golden cookie effects</div>'+ // Golden cookie choices
					'<div class="listing">' +
						'<br><br>' +
						'<div class="superHidden" id="choicesListContainer"></div>'+
					'</div>' +
				'</div>';	
			}
		},
		processNb: function (amount) {
			var result = "", len;
			var _results = [];
			if (CookieCheat.currentNumFormat === "restore")
				return;
			_datas = CookieCheat.numFormats[CookieCheat.currentNumFormat];
			_.each(_datas, function (data) {
				var tmpVal = 0;
				tmpVal = Math.floor(amount / data.num);
				amount -= (data.num * tmpVal);
				if (tmpVal.toString().length < 3)
					tmpVal = (tmpVal.toString().length === 2 ? "0" : "00") + tmpVal;
				if (tmpVal != 0) {
					_results.push({
						val: tmpVal,
						unit: ((typeof data.plural !== "undefined" && tmpVal > 1) ? data.plural : data.name)
					});
				}
			});
			if (_results.length === 0)
				_results.push({val: 0, unit: ""});
			result = "" + parseInt(_results[0].val, 10) + (_results.length > 1 ? "." + _results[1].val : "") + " " + _results[0].unit;
			return result;
		},
		lowCamelCaseToSentence: function (word, capitalize) {
			var res = "";
			var wasNum = false;
			capitalize = capitalize || true;
			_.each(word, function (char) {
				if (!_.isNaN(char * 123)) {
					if (!wasNum)
						res += " " + char;
					else
						res += char;
					wasNum = true;
				}
				else {
					if (char === char.toUpperCase()) { // La lettre est en majuscule
						res += " " + char;
					}
					else
						res += (wasNum ? " " : "") + char;
					wasNum = false;
				}
			});
			return (capitalize ? String.capitalize(res) : res);
		},
		changeBeautify: function (name) {
			localStorage["CookieClickerCheatsBeautifyThem"] = JSON.stringify(name);
			if (name == null || name === "restore")
				Beautify = CookieCheat.oldBeautify;
			else {
				CookieCheat.currentNumFormat = name;
				Beautify = CookieCheat.processNb;
			}
			Game.storeToRebuild = 1;
		},
		processDesc: function (name, shouldRe) {
			shouldRe = _.isUndefined(shouldRe) ? true : (_.isUndefined(CookieCheat.lastUpMenu) ? shouldRe : (Math.abs(CookieCheat.lastUpMenu - new Date().getTime()) > 1000) ? true : false);
			localStorage["CookieClickerCheatsShouldShowTimeLeft"] = JSON.stringify(name);
			if (name === "restore") {
				if (Game.RefreshStore.toString() !== CookieCheat.oldGameFuncs.RefreshStore.toString()) {
					Game.RefreshStore = CookieCheat.oldGameFuncs.RefreshStore;
					Game.RebuildUpgrades = CookieCheat.oldGameFuncs.RebuildUpgrades;
				}
				if (_.isUndefined(CookieCheat.objSaves)) {
					CookieCheat.objSaves = {};
					_.each(Game.ObjectsById, function (me) {
						CookieCheat.objSaves[me.name] = {};
						CookieCheat.objSaves[me.name].desc = me.desc;
						me.desc = CookieCheat.objSaves[me.name].desc;
					});
				}
				else {
					_.each(Game.ObjectsById, function (me) {
						me.desc = CookieCheat.objSaves[me.name].desc;
					});
				}
				if (_.isUndefined(CookieCheat.upgSaves)) {
					CookieCheat.upgSaves = {};
					_.each(Game.UpgradesById, function (me) {
						CookieCheat.upgSaves[me.name] = {};
						CookieCheat.upgSaves[me.name].desc = me.desc;
						me.desc = CookieCheat.upgSaves[me.name].desc;
					});
				}
				else {
					_.each(Game.UpgradesById, function (me) {
						me.desc = CookieCheat.upgSaves[me.name].desc;
					});
				}
			}
			else {
				if (Game.RefreshStore.toString() === CookieCheat.oldGameFuncs.RefreshStore.toString()) {
					Game.RefreshStore = function () {
						CookieCheat.processDesc(CookieCheat.shouldShowTimeLeft, false);
						var str = '';
						for (var i in Game.Objects) {
							var me = Game.Objects[i];
							str += '<div class="product" ' +
							Game.getTooltip('<div style="min-width:300px;"><div style="float:right;"><span class="price">' + Beautify(Math.round(me.price)) + '</span></div><div class="name">' + me.name + '</div>' + '<small>[owned : ' + me.amount + '</small>]<div class="description">' + me.desc + '</div></div>', 0, 0, 'left') +
							' id="product' + me.id + '"><div class="icon" id="productIcon' + me.id + '" style="background-image:url(img/' + me.icon + '.png);"></div><div class="content"><div class="title">' + me.displayName + '</div><span class="price">' + Beautify(Math.round(me.price)) + '</span>' + (me.amount > 0 ? ('<div class="title owned">' + me.amount + '</div>') : '') + '</div></div>';
						}
						l('products').innerHTML = str;
						for (var i in Game.Objects) {
							var me = Game.Objects[i];
							AddEvent(l('product' + me.id), 'mouseover', function (what) {
								return function () {
									var f = function () {
										$('#timeInfo').html((CookieCheat.howManySecondsUntilThisAmount(Game.ObjectsById[what].price) > 0 ? '<span class=' + (CookieCheat.howManySecondsUntilThisAmount(Game.ObjectsById[what].price) > 60 * 60 * 24 ? "superBad":"superWarning")+'>Available in ' + CookieCheat.processMs(1000 * CookieCheat.howManySecondsUntilThisAmount(Game.ObjectsById[what].price)) + '</span>': '<span class="superGood">Already enabled !</span>'));
									};
									clearInterval(window.memoInterval);
									window.memoInterval = setInterval(f, 1000);
								};
							}(me.id));
							AddEvent(l('product' + me.id), 'mouseout', function () {
								CookieCheat.processDesc(CookieCheat.shouldShowTimeLeft, true);
								clearInterval(window.memoInterval);
							});
							AddEvent(l('product' + me.id), 'click', function (what) {
								return function () {
									Game.ObjectsById[what].buy()
								};
							}(me.id));
						}
						Game.storeToRebuild = 0;
						if (CookieCheat.currentTab == "tools")
							$('#optimalBuying').html(CookieCheat.optimalBuyingUpgradesHtml());
						else
							CookieCheat.optimalBuyingUpgradesHtml();
					};
					Game.RebuildUpgrades = function () {
						CookieCheat.processDesc(CookieCheat.shouldShowTimeLeft, false);
						Game.upgradesToRebuild = 0;
						var list = [];
						for (var i in Game.Upgrades) {
							var me = Game.Upgrades[i];
							if (!me.bought) {
								if (me.unlocked) list.push(me);
							}
						}
						var sortMap = function (a, b) {
							if (a.basePrice > b.basePrice) return 1;
							else if (a.basePrice < b.basePrice) return -1;
							else return 0;
						}
						list.sort(sortMap);
						Game.UpgradesInStore = [];
						for (var i in list) {
							Game.UpgradesInStore.push(list[i]);
						}
						var str = '';
						for (var i in Game.UpgradesInStore) {
							var me = Game.UpgradesInStore[i];
							str += '<div class="crate upgrade" ' + Game.getTooltip('<div style="min-width:200px;"><div style="float:right;"><span class="price">' + Beautify(Math.round(me.basePrice)) + '</span></div><small>[Upgrade]</small><div class="name">' + me.name + '</div><div class="description">' + me.desc + '</div></div>', 0, 16, 'bottom-right') + ' onclick="Game.UpgradesById[' + me.id + '].buy();" id="upgrade' + i + '" style="background-position:' + (-me.icon[0] * 48 + 6) + 'px ' + (-me.icon[1] * 48 + 6) + 'px;"></div>';
						}
						l('upgrades').innerHTML = str;
						for (var i in Game.UpgradesInStore) {
							var me = Game.UpgradesInStore[i];
							AddEvent(l('upgrade' + i), 'mouseover', function (what) {
								return function () {
									var f = function () {
										$('#timeInfo').html((CookieCheat.howManySecondsUntilThisAmount(Game.UpgradesInStore[what].basePrice) > 0 ? '<span class=' + (CookieCheat.howManySecondsUntilThisAmount(Game.UpgradesInStore[what].basePrice) > 60 * 60 * 24 ? "superBad":"superWarning")+'>Available in ' + CookieCheat.processMs(1000 * CookieCheat.howManySecondsUntilThisAmount(Game.UpgradesInStore[what].basePrice)) + '</span>': '<span class="superGood">Already enabled !</span>'));
									};
									clearInterval(window.memoInterval);
									window.memoInterval = setInterval(f, 1000);
								};
							}(i));
							AddEvent(l('upgrade' + i), 'mouseout', function () {
								CookieCheat.processDesc(CookieCheat.shouldShowTimeLeft, true);
								clearInterval(window.memoInterval);
							});
						}
						CookieCheat.optimalBuyingUpgradesHtml();
					}
				}
				if (_.isUndefined(CookieCheat.objSaves)) {
					CookieCheat.objSaves = {};
					_.each(Game.ObjectsById, function (me) {
						CookieCheat.objSaves[me.name] = {};
						CookieCheat.objSaves[me.name].desc = me.desc;
						me.desc = CookieCheat.objSaves[me.name].desc + '<br><div id="timeInfo">' + (CookieCheat.howManySecondsUntilThisAmount(me.price) > 0 ? '<span class=' + (CookieCheat.howManySecondsUntilThisAmount(me.price) > 60 * 60 * 24 ? "superBad":"superWarning")+'>Available in ' + CookieCheat.processMs(1000 * CookieCheat.howManySecondsUntilThisAmount(me.price)) + '</span>': '<span class="superGood">Already enabled !</span></div>');
					});
				}
				else {
					_.each(Game.ObjectsById, function (me) {
						me.desc = CookieCheat.objSaves[me.name].desc + '<br><div id="timeInfo">' + (CookieCheat.howManySecondsUntilThisAmount(me.price) > 0 ? '<span class=' + (CookieCheat.howManySecondsUntilThisAmount(me.price) > 60 * 60 * 24 ? "superBad":"superWarning")+'>Available in ' + CookieCheat.processMs(1000 * CookieCheat.howManySecondsUntilThisAmount(me.price)) + '</span>': '<span class="superGood">Already enabled !</span></div>');
					});
				}
				if (_.isUndefined(CookieCheat.upgSaves)) {
					CookieCheat.upgSaves = {};
					_.each(Game.UpgradesById, function (me) {
						CookieCheat.upgSaves[me.name] = {};
						CookieCheat.upgSaves[me.name].desc = me.desc;
						me.desc = CookieCheat.upgSaves[me.name].desc + '<br><div id="timeInfo">' + (CookieCheat.howManySecondsUntilThisAmount(me.basePrice) > 0 ? '<span class=' + (CookieCheat.howManySecondsUntilThisAmount(me.basePrice) > 60 * 60 * 24 ? "superBad":"superWarning")+'>Available in ' + CookieCheat.processMs(1000 * CookieCheat.howManySecondsUntilThisAmount(me.basePrice)) + '</span>': '<span class="superGood">Already enabled !</span></div>');
					});
				}
				else {
					_.each(Game.UpgradesById, function (me) {
						me.desc = CookieCheat.upgSaves[me.name].desc + '<br><div id="timeInfo">' + (CookieCheat.howManySecondsUntilThisAmount(me.basePrice) > 0 ? '<span class=' + (CookieCheat.howManySecondsUntilThisAmount(me.basePrice) > 60 * 60 * 24 ? "superBad":"superWarning")+'>Available in ' + CookieCheat.processMs(1000 * CookieCheat.howManySecondsUntilThisAmount(me.basePrice)) + '</span>': '<span class="superGood">Already enabled !</span></div>');
					});
				}
			}
			if (shouldRe) {
				CookieCheat.lastUpMenu = new Date().getTime();
				Game.RefreshStore();
				Game.RebuildUpgrades();
			}
		},
		currentNumFormat: "restore",
		shouldShowTimeLeft: "restore",
		numFormats: {
			"international": [
				{ name: "Y", num :  Math.pow(1000, 8) },
				{ name: "Z", num :  Math.pow(1000, 7) },
				{ name: "E", num :  Math.pow(1000, 6) },
				{ name: "P", num:  Math.pow(1000, 5) },
				{ name: "T", num:  Math.pow(1000, 4) },
				{ name: "G", num:  Math.pow(1000, 3) },
				{ name: "M", num:  Math.pow(1000, 2) },
				{ name: "k", num: 1000 },
				{ name: "", num: 1 }
			],
			"tenPowerBased": [
				{ name: "x10^42", num:  Math.pow(1000, 14) },
				{ name: "x10^39", num:  Math.pow(1000, 13) },
				{ name: "x10^36", num:  Math.pow(1000, 12) },
				{ name: "x10^33", num:  Math.pow(1000, 11) },
				{ name: "x10^30", num:  Math.pow(1000, 10) },
				{ name: "x10^27", num:  Math.pow(1000, 9) },
				{ name: "x10^24", num:  Math.pow(1000, 8) },
				{ name: "x10^21", num:  Math.pow(1000, 7) },
				{ name: "x10^18", num:  Math.pow(1000, 6) },
				{ name: "x10^15", num:  Math.pow(1000, 5) },
				{ name: "x10^12", num:  Math.pow(1000, 4) },
				{ name: "x10^9", num:  Math.pow(1000, 3) },
				{ name: "x10^6", num:  Math.pow(1000, 2) },
				{ name: "x10^3", num: 1000 },
				{ name: "", num: 1 }
			],
			"fullNamesShortScale": [
				{ name: "Tredecillion", plural: "Tredecillion", num:  Math.pow(1000, 14) },
				{ name: "Duodecillion", plural: "Duodecillion", num:  Math.pow(1000, 13) },
				{ name: "Undecillion", plural: "Undecillion", num:  Math.pow(1000, 12) },
				{ name: "Decillion", plural: "Decillion", num:  Math.pow(1000, 11) },
				{ name: "Nonillion", plural: "Nonillion", num:  Math.pow(1000, 10) },
				{ name: "Octillion", plural: "Octillion", num:  Math.pow(1000, 9) },
				{ name: "Septillion", plural: "Septillion", num:  Math.pow(1000, 8) },
				{ name: "Sextillion", plural: "Sextillion", num:  Math.pow(1000, 7) },
				{ name: "Quintillion", plural: "Quintillion", num:  Math.pow(1000, 6) },
				{ name: "Quadrillion", plural: "Quadrillion", num:  Math.pow(1000, 5) },
				{ name: "Trillion", plural: "Trillion", num:  Math.pow(1000, 4) },
				{ name: "Billion", plural: "Billion", num:  Math.pow(1000, 3) },
				{ name: "Million", plural: "Million", num: Math.pow(1000, 2) },
				{ name: "Thousand", plural: "Thousand", num: 1000 },
				{ name: "", num: 1 }
			],
			"fullNamesShortScaleShortened": [
				{ name: "Tred", num:  Math.pow(1000, 14) },
				{ name: "Dud", num:  Math.pow(1000, 13) },
				{ name: "Und", num:  Math.pow(1000, 12) },
				{ name: "De", num:  Math.pow(1000, 11) },
				{ name: "No", num:  Math.pow(1000, 10) },
				{ name: "Oc", num:  Math.pow(1000, 9) },
				{ name: "Sp", num:  Math.pow(1000, 8) },
				{ name: "Sx", num:  Math.pow(1000, 7) },
				{ name: "Qi", num:  Math.pow(1000, 6) },
				{ name: "Qa", num:  Math.pow(1000, 5) },
				{ name: "Tr", num:  Math.pow(1000, 4) },
				{ name: "Bi", num:  Math.pow(1000, 3) },
				{ name: "Mi", num: Math.pow(1000, 2) },
				{ name: "Th", num: 1000 },
				{ name: "", num: 1 }
			],
			"fullNamesLongScale": [
				{ name: "Octillion", plural: "Octillion", num:  Math.pow(1000, 16) },
				{ name: "Septilliard", plural: "Septilliard", num:  Math.pow(1000, 15) },
				{ name: "Septillion", plural: "Septillion", num:  Math.pow(1000, 14) },
				{ name: "Sextilliard", plural: "Sextilliard", num:  Math.pow(1000, 13) },
				{ name: "Sextillion", plural: "Sextillion", num:  Math.pow(1000, 12) },
				{ name: "Quintilliard", plural: "Quintilliard", num:  Math.pow(1000, 11) },
				{ name: "Quintillion", plural: "Quintillion", num:  Math.pow(1000, 10) },
				{ name: "Quadrilliard", plural: "Quadrilliard", num:  Math.pow(1000, 9) },
				{ name: "Quadrillion", plural: "Quadrillion", num:  Math.pow(1000, 8) },
				{ name: "Trilliard", plural: "Trilliard", num:  Math.pow(1000, 7) },
				{ name: "Trillion", plural: "Trillion", num:  Math.pow(1000, 6) },
				{ name: "Billiard", plural: "Billiard", num:  Math.pow(1000, 5) },
				{ name: "Billion", plural: "Billion", num:  Math.pow(1000, 4) },
				{ name: "Milliard", plural: "Milliard", num:  Math.pow(1000, 3) },
				{ name: "Million", plural: "Million", num: Math.pow(1000, 2) },
				{ name: "Thousand", plural: "Thousand", num: 1000 },
				{ name: "", num: 1 }
			],
			"fullNamesLongScaleShortened": [
				{ name: "Oco", num:  Math.pow(1000, 16) },
				{ name: "Spd", num:  Math.pow(1000, 15) },
				{ name: "Spo", num:  Math.pow(1000, 14) },
				{ name: "Sxd", num:  Math.pow(1000, 13) },
				{ name: "Sxo", num:  Math.pow(1000, 12) },
				{ name: "Qid", num:  Math.pow(1000, 11) },
				{ name: "Qio", num:  Math.pow(1000, 10) },
				{ name: "Qad", num:  Math.pow(1000, 9) },
				{ name: "Qao", num:  Math.pow(1000, 8) },
				{ name: "Trd", num:  Math.pow(1000, 7) },
				{ name: "Tio", num:  Math.pow(1000, 6) },
				{ name: "Brd", num:  Math.pow(1000, 5) },
				{ name: "Bio", num:  Math.pow(1000, 4) },
				{ name: "Mrd", num:  Math.pow(1000, 3) },
				{ name: "Mio", num: Math.pow(1000, 2) },
				{ name: "Ths", num: 1000 },
				{ name: "", num: 1 }
			]
		},
		launch: function () {
			CookieCheat.addCSS();
			CookieCheat.initModels();
			CookieCheat.initCollections();
			CookieCheat.initViews();
			CookieCheat.addButton();
			CookieCheat.loadChoices();
			CookieCheat.updateMouseCps();
			CookieCheat.computeChoose();
			CookieCheat.updateGoldenCookieclick();
			CookieCheat.initAllBackbone();
			CookieCheat.protectToKeepSafe();
			if (!_.isUndefined(localStorage["CookieClickerCheatsBeautifyThem"])) {
				CookieCheat.currentNumFormat = JSON.parse(localStorage["CookieClickerCheatsBeautifyThem"]);
				CookieCheat.changeBeautify(CookieCheat.currentNumFormat)
			}
			if (!_.isUndefined(localStorage["CookieClickerCheatsShouldShowTimeLeft"])) {
				CookieCheat.shouldShowTimeLeft = JSON.parse(localStorage["CookieClickerCheatsShouldShowTimeLeft"]);
			}
			CookieCheat.miscVars.upgradesGenericsFunctions.addCpsForObjectUpgrades(CookieCheat.miscVars.upgradesGenericsFunctions.modifyObjectCps);
			CookieCheat.miscVars.upgradesGenericsFunctions.addCpsForPercentUpgrades(CookieCheat.miscVars.upgradesGenericsFunctions.modifyPercentCps);
			CookieCheat.miscVars.upgradesGenericsFunctions.achievsForAllObjects();
			Game.RefreshStore = CookieCheat.oldGameFuncs.RefreshStore;
			Game.RebuildUpgrades = CookieCheat.oldGameFuncs.RebuildUpgrades;
			CookieCheat.processDesc(CookieCheat.shouldShowTimeLeft);
			Game.Popup("Cookie Clicker Cheats v." + __VERSION__ + " launched !");
			// CookieCheat.CookHeaven.init();
		}
	};
 
	(function () {
	if (String.capitalize == null) {
		String.capitalize = function (string) {
			var res = "";
			res += string.charAt(0).toUpperCase();
			res += string.substring(1).toLowerCase();
			return res;
		};
	}
	// ------ Some libraries ------
		(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
		}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
			u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
		// End jQuery
		!function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,v=e.reduce,h=e.reduceRight,d=e.filter,g=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,w=i.bind,j=function(n){return n instanceof j?n:this instanceof j?(this._wrapped=n,void 0):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.5.0";var A=j.each=j.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(j.has(n,a)&&t.call(e,n[a],a,n)===r)return};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var E="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduce===v)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(E);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduceRight===h)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(E);return r},j.find=j.detect=function(n,t,r){var e;return O(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:d&&n.filter===d?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:g&&n.every===g?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var O=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:O(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,function(n){return n[t]})},j.where=function(n,t,r){return j.isEmpty(t)?r?void 0:[]:j[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},j.findWhere=function(n,t){return j.where(n,t,!0)},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);if(!t&&j.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>e.computed&&(e={value:n,computed:a})}),e.value},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);if(!t&&j.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a<e.computed&&(e={value:n,computed:a})}),e.value},j.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=j.random(r++),e[r-1]=e[t],e[t]=n}),e};var F=function(n){return j.isFunction(n)?n:function(t){return t[n]}};j.sortBy=function(n,t,r){var e=F(t);return j.pluck(j.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index<t.index?-1:1}),"value")};var k=function(n,t,r,e){var u={},i=F(null==t?j.identity:t);return A(n,function(t,a){var o=i.call(r,t,a,n);e(u,o,t)}),u};j.groupBy=function(n,t,r){return k(n,t,r,function(n,t,r){(j.has(n,t)?n[t]:n[t]=[]).push(r)})},j.countBy=function(n,t,r){return k(n,t,r,function(n,t){j.has(n,t)||(n[t]=0),n[t]++})},j.sortedIndex=function(n,t,r,e){r=null==r?j.identity:F(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])<u?i=o+1:a=o}return i},j.toArray=function(n){return n?j.isArray(n)?o.call(n):n.length===+n.length?j.map(n,j.identity):j.values(n):[]},j.size=function(n){return null==n?0:n.length===+n.length?n.length:j.keys(n).length},j.first=j.head=j.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},j.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},j.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},j.rest=j.tail=j.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},j.compact=function(n){return j.filter(n,j.identity)};var R=function(n,t,r){return t&&j.every(n,j.isArray)?c.apply(r,n):(A(n,function(n){j.isArray(n)||j.isArguments(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r)};j.flatten=function(n,t){return R(n,t,[])},j.without=function(n){return j.difference(n,o.call(arguments,1))},j.uniq=j.unique=function(n,t,r,e){j.isFunction(t)&&(e=r,r=t,t=!1);var u=r?j.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:j.contains(a,r))||(a.push(r),i.push(n[e]))}),i},j.union=function(){return j.uniq(j.flatten(arguments,!0))},j.intersection=function(n){var t=o.call(arguments,1);return j.filter(j.uniq(n),function(n){return j.every(t,function(t){return j.indexOf(t,n)>=0})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){return j.unzip.apply(j,o.call(arguments))},j.unzip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var M=function(){};j.bind=function(n,t){var r,e;if(w&&n.bind===w)return w.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));M.prototype=n.prototype;var u=new M;M.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},j.bindAll=function(n){var t=o.call(arguments,1);if(0===t.length)throw new Error("bindAll must be passed function names");return A(t,function(t){n[t]=j.bind(n[t],n)}),n},j.memoize=function(n,t){var r={};return t||(t=j.identity),function(){var e=t.apply(this,arguments);return j.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},j.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},j.defer=function(n){return j.delay.apply(j,[n,1].concat(o.call(arguments,1)))},j.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var c=function(){o=new Date,a=null,i=n.apply(e,u)};return function(){var l=new Date;o||r.leading!==!1||(o=l);var f=t-(l-o);return e=this,u=arguments,0>=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u)):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u=null;return function(){var i=this,a=arguments,o=function(){u=null,r||(e=n.apply(i,a))},c=r&&!u;return clearTimeout(u),u=setTimeout(o,t),c&&(e=n.apply(i,a)),e}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=_||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){var t=[];for(var r in n)j.has(n,r)&&t.push(n[r]);return t},j.pairs=function(n){var t=[];for(var r in n)j.has(n,r)&&t.push([r,n[r]]);return t},j.invert=function(n){var t={};for(var r in n)j.has(n,r)&&(t[n[r]]=r);return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var I={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","/":"&#x2F;"}};I.unescape=j.invert(I.escape);var T={escape:new RegExp("["+j.keys(I.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(I.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(T[n],function(t){return I[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),D.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n","	":"t","\u2028":"u2028","\u2029":"u2029"},z=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(z,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var D=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],D.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return D.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}.call(this);
		// End Underscore
		(function(){var t=this;var e=t.Backbone;var i=[];var r=i.push;var s=i.slice;var n=i.splice;var a;if(typeof exports!=="undefined"){a=exports}else{a=t.Backbone={}}a.VERSION="1.0.0";var h=t._;if(!h&&typeof require!=="undefined")h=require("underscore");a.$=t.jQuery||t.Zepto||t.ender||t.$;a.noConflict=function(){t.Backbone=e;return this};a.emulateHTTP=false;a.emulateJSON=false;var o=a.Events={on:function(t,e,i){if(!l(this,"on",t,[e,i])||!e)return this;this._events||(this._events={});var r=this._events[t]||(this._events[t]=[]);r.push({callback:e,context:i,ctx:i||this});return this},once:function(t,e,i){if(!l(this,"once",t,[e,i])||!e)return this;var r=this;var s=h.once(function(){r.off(t,s);e.apply(this,arguments)});s._callback=e;return this.on(t,s,i)},off:function(t,e,i){var r,s,n,a,o,u,c,f;if(!this._events||!l(this,"off",t,[e,i]))return this;if(!t&&!e&&!i){this._events={};return this}a=t?[t]:h.keys(this._events);for(o=0,u=a.length;o<u;o++){t=a[o];if(n=this._events[t]){this._events[t]=r=[];if(e||i){for(c=0,f=n.length;c<f;c++){s=n[c];if(e&&e!==s.callback&&e!==s.callback._callback||i&&i!==s.context){r.push(s)}}}if(!r.length)delete this._events[t]}}return this},trigger:function(t){if(!this._events)return this;var e=s.call(arguments,1);if(!l(this,"trigger",t,e))return this;var i=this._events[t];var r=this._events.all;if(i)c(i,e);if(r)c(r,arguments);return this},stopListening:function(t,e,i){var r=this._listeners;if(!r)return this;var s=!e&&!i;if(typeof e==="object")i=this;if(t)(r={})[t._listenerId]=t;for(var n in r){r[n].off(e,i,this);if(s)delete this._listeners[n]}return this}};var u=/\s+/;var l=function(t,e,i,r){if(!i)return true;if(typeof i==="object"){for(var s in i){t[e].apply(t,[s,i[s]].concat(r))}return false}if(u.test(i)){var n=i.split(u);for(var a=0,h=n.length;a<h;a++){t[e].apply(t,[n[a]].concat(r))}return false}return true};var c=function(t,e){var i,r=-1,s=t.length,n=e[0],a=e[1],h=e[2];switch(e.length){case 0:while(++r<s)(i=t[r]).callback.call(i.ctx);return;case 1:while(++r<s)(i=t[r]).callback.call(i.ctx,n);return;case 2:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a);return;case 3:while(++r<s)(i=t[r]).callback.call(i.ctx,n,a,h);return;default:while(++r<s)(i=t[r]).callback.apply(i.ctx,e)}};var f={listenTo:"on",listenToOnce:"once"};h.each(f,function(t,e){o[e]=function(e,i,r){var s=this._listeners||(this._listeners={});var n=e._listenerId||(e._listenerId=h.uniqueId("l"));s[n]=e;if(typeof i==="object")r=this;e[t](i,r,this);return this}});o.bind=o.on;o.unbind=o.off;h.extend(a,o);var d=a.Model=function(t,e){var i;var r=t||{};e||(e={});this.cid=h.uniqueId("c");this.attributes={};h.extend(this,h.pick(e,p));if(e.parse)r=this.parse(r,e)||{};if(i=h.result(this,"defaults")){r=h.defaults({},r,i)}this.set(r,e);this.changed={};this.initialize.apply(this,arguments)};var p=["url","urlRoot","collection"];h.extend(d.prototype,o,{changed:null,validationError:null,idAttribute:"id",initialize:function(){},toJSON:function(t){return h.clone(this.attributes)},sync:function(){return a.sync.apply(this,arguments)},get:function(t){return this.attributes[t]},escape:function(t){return h.escape(this.get(t))},has:function(t){return this.get(t)!=null},set:function(t,e,i){var r,s,n,a,o,u,l,c;if(t==null)return this;if(typeof t==="object"){s=t;i=e}else{(s={})[t]=e}i||(i={});if(!this._validate(s,i))return false;n=i.unset;o=i.silent;a=[];u=this._changing;this._changing=true;if(!u){this._previousAttributes=h.clone(this.attributes);this.changed={}}c=this.attributes,l=this._previousAttributes;if(this.idAttribute in s)this.id=s[this.idAttribute];for(r in s){e=s[r];if(!h.isEqual(c[r],e))a.push(r);if(!h.isEqual(l[r],e)){this.changed[r]=e}else{delete this.changed[r]}n?delete c[r]:c[r]=e}if(!o){if(a.length)this._pending=true;for(var f=0,d=a.length;f<d;f++){this.trigger("change:"+a[f],this,c[a[f]],i)}}if(u)return this;if(!o){while(this._pending){this._pending=false;this.trigger("change",this,i)}}this._pending=false;this._changing=false;return this},unset:function(t,e){return this.set(t,void 0,h.extend({},e,{unset:true}))},clear:function(t){var e={};for(var i in this.attributes)e[i]=void 0;return this.set(e,h.extend({},t,{unset:true}))},hasChanged:function(t){if(t==null)return!h.isEmpty(this.changed);return h.has(this.changed,t)},changedAttributes:function(t){if(!t)return this.hasChanged()?h.clone(this.changed):false;var e,i=false;var r=this._changing?this._previousAttributes:this.attributes;for(var s in t){if(h.isEqual(r[s],e=t[s]))continue;(i||(i={}))[s]=e}return i},previous:function(t){if(t==null||!this._previousAttributes)return null;return this._previousAttributes[t]},previousAttributes:function(){return h.clone(this._previousAttributes)},fetch:function(t){t=t?h.clone(t):{};if(t.parse===void 0)t.parse=true;var e=this;var i=t.success;t.success=function(r){if(!e.set(e.parse(r,t),t))return false;if(i)i(e,r,t);e.trigger("sync",e,r,t)};R(this,t);return this.sync("read",this,t)},save:function(t,e,i){var r,s,n,a=this.attributes;if(t==null||typeof t==="object"){r=t;i=e}else{(r={})[t]=e}if(r&&(!i||!i.wait)&&!this.set(r,i))return false;i=h.extend({validate:true},i);if(!this._validate(r,i))return false;if(r&&i.wait){this.attributes=h.extend({},a,r)}if(i.parse===void 0)i.parse=true;var o=this;var u=i.success;i.success=function(t){o.attributes=a;var e=o.parse(t,i);if(i.wait)e=h.extend(r||{},e);if(h.isObject(e)&&!o.set(e,i)){return false}if(u)u(o,t,i);o.trigger("sync",o,t,i)};R(this,i);s=this.isNew()?"create":i.patch?"patch":"update";if(s==="patch")i.attrs=r;n=this.sync(s,this,i);if(r&&i.wait)this.attributes=a;return n},destroy:function(t){t=t?h.clone(t):{};var e=this;var i=t.success;var r=function(){e.trigger("destroy",e,e.collection,t)};t.success=function(s){if(t.wait||e.isNew())r();if(i)i(e,s,t);if(!e.isNew())e.trigger("sync",e,s,t)};if(this.isNew()){t.success();return false}R(this,t);var s=this.sync("delete",this,t);if(!t.wait)r();return s},url:function(){var t=h.result(this,"urlRoot")||h.result(this.collection,"url")||U();if(this.isNew())return t;return t+(t.charAt(t.length-1)==="/"?"":"/")+encodeURIComponent(this.id)},parse:function(t,e){return t},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return this.id==null},isValid:function(t){return this._validate({},h.extend(t||{},{validate:true}))},_validate:function(t,e){if(!e.validate||!this.validate)return true;t=h.extend({},this.attributes,t);var i=this.validationError=this.validate(t,e)||null;if(!i)return true;this.trigger("invalid",this,i,h.extend(e||{},{validationError:i}));return false}});var v=["keys","values","pairs","invert","pick","omit"];h.each(v,function(t){d.prototype[t]=function(){var e=s.call(arguments);e.unshift(this.attributes);return h[t].apply(h,e)}});var g=a.Collection=function(t,e){e||(e={});if(e.url)this.url=e.url;if(e.model)this.model=e.model;if(e.comparator!==void 0)this.comparator=e.comparator;this._reset();this.initialize.apply(this,arguments);if(t)this.reset(t,h.extend({silent:true},e))};var m={add:true,remove:true,merge:true};var y={add:true,merge:false,remove:false};h.extend(g.prototype,o,{model:d,initialize:function(){},toJSON:function(t){return this.map(function(e){return e.toJSON(t)})},sync:function(){return a.sync.apply(this,arguments)},add:function(t,e){return this.set(t,h.defaults(e||{},y))},remove:function(t,e){t=h.isArray(t)?t.slice():[t];e||(e={});var i,r,s,n;for(i=0,r=t.length;i<r;i++){n=this.get(t[i]);if(!n)continue;delete this._byId[n.id];delete this._byId[n.cid];s=this.indexOf(n);this.models.splice(s,1);this.length--;if(!e.silent){e.index=s;n.trigger("remove",n,this,e)}this._removeReference(n)}return this},set:function(t,e){e=h.defaults(e||{},m);if(e.parse)t=this.parse(t,e);if(!h.isArray(t))t=t?[t]:[];var i,s,a,o,u,l;var c=e.at;var f=this.comparator&&c==null&&e.sort!==false;var d=h.isString(this.comparator)?this.comparator:null;var p=[],v=[],g={};for(i=0,s=t.length;i<s;i++){if(!(a=this._prepareModel(t[i],e)))continue;if(u=this.get(a)){if(e.remove)g[u.cid]=true;if(e.merge){u.set(a.attributes,e);if(f&&!l&&u.hasChanged(d))l=true}}else if(e.add){p.push(a);a.on("all",this._onModelEvent,this);this._byId[a.cid]=a;if(a.id!=null)this._byId[a.id]=a}}if(e.remove){for(i=0,s=this.length;i<s;++i){if(!g[(a=this.models[i]).cid])v.push(a)}if(v.length)this.remove(v,e)}if(p.length){if(f)l=true;this.length+=p.length;if(c!=null){n.apply(this.models,[c,0].concat(p))}else{r.apply(this.models,p)}}if(l)this.sort({silent:true});if(e.silent)return this;for(i=0,s=p.length;i<s;i++){(a=p[i]).trigger("add",a,this,e)}if(l)this.trigger("sort",this,e);return this},reset:function(t,e){e||(e={});for(var i=0,r=this.models.length;i<r;i++){this._removeReference(this.models[i])}e.previousModels=this.models;this._reset();this.add(t,h.extend({silent:true},e));if(!e.silent)this.trigger("reset",this,e);return this},push:function(t,e){t=this._prepareModel(t,e);this.add(t,h.extend({at:this.length},e));return t},pop:function(t){var e=this.at(this.length-1);this.remove(e,t);return e},unshift:function(t,e){t=this._prepareModel(t,e);this.add(t,h.extend({at:0},e));return t},shift:function(t){var e=this.at(0);this.remove(e,t);return e},slice:function(t,e){return this.models.slice(t,e)},get:function(t){if(t==null)return void 0;return this._byId[t.id!=null?t.id:t.cid||t]},at:function(t){return this.models[t]},where:function(t,e){if(h.isEmpty(t))return e?void 0:[];return this[e?"find":"filter"](function(e){for(var i in t){if(t[i]!==e.get(i))return false}return true})},findWhere:function(t){return this.where(t,true)},sort:function(t){if(!this.comparator)throw new Error("Cannot sort a set without a comparator");t||(t={});if(h.isString(this.comparator)||this.comparator.length===1){this.models=this.sortBy(this.comparator,this)}else{this.models.sort(h.bind(this.comparator,this))}if(!t.silent)this.trigger("sort",this,t);return this},sortedIndex:function(t,e,i){e||(e=this.comparator);var r=h.isFunction(e)?e:function(t){return t.get(e)};return h.sortedIndex(this.models,t,r,i)},pluck:function(t){return h.invoke(this.models,"get",t)},fetch:function(t){t=t?h.clone(t):{};if(t.parse===void 0)t.parse=true;var e=t.success;var i=this;t.success=function(r){var s=t.reset?"reset":"set";i[s](r,t);if(e)e(i,r,t);i.trigger("sync",i,r,t)};R(this,t);return this.sync("read",this,t)},create:function(t,e){e=e?h.clone(e):{};if(!(t=this._prepareModel(t,e)))return false;if(!e.wait)this.add(t,e);var i=this;var r=e.success;e.success=function(s){if(e.wait)i.add(t,e);if(r)r(t,s,e)};t.save(null,e);return t},parse:function(t,e){return t},clone:function(){return new this.constructor(this.models)},_reset:function(){this.length=0;this.models=[];this._byId={}},_prepareModel:function(t,e){if(t instanceof d){if(!t.collection)t.collection=this;return t}e||(e={});e.collection=this;var i=new this.model(t,e);if(!i._validate(t,e)){this.trigger("invalid",this,t,e);return false}return i},_removeReference:function(t){if(this===t.collection)delete t.collection;t.off("all",this._onModelEvent,this)},_onModelEvent:function(t,e,i,r){if((t==="add"||t==="remove")&&i!==this)return;if(t==="destroy")this.remove(e,r);if(e&&t==="change:"+e.idAttribute){delete this._byId[e.previous(e.idAttribute)];if(e.id!=null)this._byId[e.id]=e}this.trigger.apply(this,arguments)}});var _=["forEach","each","map","collect","reduce","foldl","inject","reduceRight","foldr","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","max","min","toArray","size","first","head","take","initial","rest","tail","drop","last","without","indexOf","shuffle","lastIndexOf","isEmpty","chain"];h.each(_,function(t){g.prototype[t]=function(){var e=s.call(arguments);e.unshift(this.models);return h[t].apply(h,e)}});var w=["groupBy","countBy","sortBy"];h.each(w,function(t){g.prototype[t]=function(e,i){var r=h.isFunction(e)?e:function(t){return t.get(e)};return h[t](this.models,r,i)}});var b=a.View=function(t){this.cid=h.uniqueId("view");this._configure(t||{});this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()};var x=/^(\S+)\s*(.*)$/;var E=["model","collection","el","id","attributes","className","tagName","events"];h.extend(b.prototype,o,{tagName:"div",$:function(t){return this.$el.find(t)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();this.stopListening();return this},setElement:function(t,e){if(this.$el)this.undelegateEvents();this.$el=t instanceof a.$?t:a.$(t);this.el=this.$el[0];if(e!==false)this.delegateEvents();return this},delegateEvents:function(t){if(!(t||(t=h.result(this,"events"))))return this;this.undelegateEvents();for(var e in t){var i=t[e];if(!h.isFunction(i))i=this[t[e]];if(!i)continue;var r=e.match(x);var s=r[1],n=r[2];i=h.bind(i,this);s+=".delegateEvents"+this.cid;if(n===""){this.$el.on(s,i)}else{this.$el.on(s,n,i)}}return this},undelegateEvents:function(){this.$el.off(".delegateEvents"+this.cid);return this},_configure:function(t){if(this.options)t=h.extend({},h.result(this,"options"),t);h.extend(this,h.pick(t,E));this.options=t},_ensureElement:function(){if(!this.el){var t=h.extend({},h.result(this,"attributes"));if(this.id)t.id=h.result(this,"id");if(this.className)t["class"]=h.result(this,"className");var e=a.$("<"+h.result(this,"tagName")+">").attr(t);this.setElement(e,false)}else{this.setElement(h.result(this,"el"),false)}}});a.sync=function(t,e,i){var r=k[t];h.defaults(i||(i={}),{emulateHTTP:a.emulateHTTP,emulateJSON:a.emulateJSON});var s={type:r,dataType:"json"};if(!i.url){s.url=h.result(e,"url")||U()}if(i.data==null&&e&&(t==="create"||t==="update"||t==="patch")){s.contentType="application/json";s.data=JSON.stringify(i.attrs||e.toJSON(i))}if(i.emulateJSON){s.contentType="application/x-www-form-urlencoded";s.data=s.data?{model:s.data}:{}}if(i.emulateHTTP&&(r==="PUT"||r==="DELETE"||r==="PATCH")){s.type="POST";if(i.emulateJSON)s.data._method=r;var n=i.beforeSend;i.beforeSend=function(t){t.setRequestHeader("X-HTTP-Method-Override",r);if(n)return n.apply(this,arguments)}}if(s.type!=="GET"&&!i.emulateJSON){s.processData=false}if(s.type==="PATCH"&&window.ActiveXObject&&!(window.external&&window.external.msActiveXFilteringEnabled)){s.xhr=function(){return new ActiveXObject("Microsoft.XMLHTTP")}}var o=i.xhr=a.ajax(h.extend(s,i));e.trigger("request",e,o,i);return o};var k={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};a.ajax=function(){return a.$.ajax.apply(a.$,arguments)};var S=a.Router=function(t){t||(t={});if(t.routes)this.routes=t.routes;this._bindRoutes();this.initialize.apply(this,arguments)};var $=/\((.*?)\)/g;var T=/(\(\?)?:\w+/g;var H=/\*\w+/g;var A=/[\-{}\[\]+?.,\\\^$|#\s]/g;h.extend(S.prototype,o,{initialize:function(){},route:function(t,e,i){if(!h.isRegExp(t))t=this._routeToRegExp(t);if(h.isFunction(e)){i=e;e=""}if(!i)i=this[e];var r=this;a.history.route(t,function(s){var n=r._extractParameters(t,s);i&&i.apply(r,n);r.trigger.apply(r,["route:"+e].concat(n));r.trigger("route",e,n);a.history.trigger("route",r,e,n)});return this},navigate:function(t,e){a.history.navigate(t,e);return this},_bindRoutes:function(){if(!this.routes)return;this.routes=h.result(this,"routes");var t,e=h.keys(this.routes);while((t=e.pop())!=null){this.route(t,this.routes[t])}},_routeToRegExp:function(t){t=t.replace(A,"\\$&").replace($,"(?:$1)?").replace(T,function(t,e){return e?t:"([^/]+)"}).replace(H,"(.*?)");return new RegExp("^"+t+"$")},_extractParameters:function(t,e){var i=t.exec(e).slice(1);return h.map(i,function(t){return t?decodeURIComponent(t):null})}});var I=a.History=function(){this.handlers=[];h.bindAll(this,"checkUrl");if(typeof window!=="undefined"){this.location=window.location;this.history=window.history}};var N=/^[#\/]|\s+$/g;var P=/^\/+|\/+$/g;var O=/msie [\w.]+/;var C=/\/$/;I.started=false;h.extend(I.prototype,o,{interval:50,getHash:function(t){var e=(t||this).location.href.match(/#(.*)$/);return e?e[1]:""},getFragment:function(t,e){if(t==null){if(this._hasPushState||!this._wantsHashChange||e){t=this.location.pathname;var i=this.root.replace(C,"");if(!t.indexOf(i))t=t.substr(i.length)}else{t=this.getHash()}}return t.replace(N,"")},start:function(t){if(I.started)throw new Error("Backbone.history has already been started");I.started=true;this.options=h.extend({},{root:"/"},this.options,t);this.root=this.options.root;this._wantsHashChange=this.options.hashChange!==false;this._wantsPushState=!!this.options.pushState;this._hasPushState=!!(this.options.pushState&&this.history&&this.history.pushState);var e=this.getFragment();var i=document.documentMode;var r=O.exec(navigator.userAgent.toLowerCase())&&(!i||i<=7);this.root=("/"+this.root+"/").replace(P,"/");if(r&&this._wantsHashChange){this.iframe=a.$('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow;this.navigate(e)}if(this._hasPushState){a.$(window).on("popstate",this.checkUrl)}else if(this._wantsHashChange&&"onhashchange"in window&&!r){a.$(window).on("hashchange",this.checkUrl)}else if(this._wantsHashChange){this._checkUrlInterval=setInterval(this.checkUrl,this.interval)}this.fragment=e;var s=this.location;var n=s.pathname.replace(/[^\/]$/,"$&/")===this.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!n){this.fragment=this.getFragment(null,true);this.location.replace(this.root+this.location.search+"#"+this.fragment);return true}else if(this._wantsPushState&&this._hasPushState&&n&&s.hash){this.fragment=this.getHash().replace(N,"");this.history.replaceState({},document.title,this.root+this.fragment+s.search)}if(!this.options.silent)return this.loadUrl()},stop:function(){a.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);I.started=false},route:function(t,e){this.handlers.unshift({route:t,callback:e})},checkUrl:function(t){var e=this.getFragment();if(e===this.fragment&&this.iframe){e=this.getFragment(this.getHash(this.iframe))}if(e===this.fragment)return false;if(this.iframe)this.navigate(e);this.loadUrl()||this.loadUrl(this.getHash())},loadUrl:function(t){var e=this.fragment=this.getFragment(t);var i=h.any(this.handlers,function(t){if(t.route.test(e)){t.callback(e);return true}});return i},navigate:function(t,e){if(!I.started)return false;if(!e||e===true)e={trigger:e};t=this.getFragment(t||"");if(this.fragment===t)return;this.fragment=t;var i=this.root+t;if(this._hasPushState){this.history[e.replace?"replaceState":"pushState"]({},document.title,i)}else if(this._wantsHashChange){this._updateHash(this.location,t,e.replace);if(this.iframe&&t!==this.getFragment(this.getHash(this.iframe))){if(!e.replace)this.iframe.document.open().close();this._updateHash(this.iframe.location,t,e.replace)}}else{return this.location.assign(i)}if(e.trigger)this.loadUrl(t)},_updateHash:function(t,e,i){if(i){var r=t.href.replace(/(javascript:|#).*$/,"");t.replace(r+"#"+e)}else{t.hash="#"+e}}});a.history=new I;var j=function(t,e){var i=this;var r;if(t&&h.has(t,"constructor")){r=t.constructor}else{r=function(){return i.apply(this,arguments)}}h.extend(r,i,e);var s=function(){this.constructor=r};s.prototype=i.prototype;r.prototype=new s;if(t)h.extend(r.prototype,t);r.__super__=i.prototype;return r};d.extend=g.extend=S.extend=b.extend=I.extend=j;var U=function(){throw new Error('A "url" property or function must be specified')};var R=function(t,e){var i=e.error;e.error=function(r){if(i)i(t,r,e);t.trigger("error",t,r,e)}}}).call(this);
		// End Backbone
		(function(e,t){if(typeof define==="function"&&define.amd){define(["underscore","backbone"],function(n,r){return t(n||e._,r||e.Backbone)})}else{t(_,Backbone)}})(this,function(e,t){function n(){return((1+Math.random())*65536|0).toString(16).substring(1)}function r(){return n()+n()+"-"+n()+"-"+n()+"-"+n()+"-"+n()+n()+n()}t.LocalStorage=window.Store=function(e){this.name=e;var t=this.localStorage().getItem(this.name);this.records=t&&t.split(",")||[]};e.extend(t.LocalStorage.prototype,{save:function(){this.localStorage().setItem(this.name,this.records.join(","))},create:function(e){if(!e.id){e.id=r();e.set(e.idAttribute,e.id)}this.localStorage().setItem(this.name+"-"+e.id,JSON.stringify(e));this.records.push(e.id.toString());this.save();return this.find(e)},update:function(t){this.localStorage().setItem(this.name+"-"+t.id,JSON.stringify(t));if(!e.include(this.records,t.id.toString()))this.records.push(t.id.toString());this.save();return this.find(t)},find:function(e){return this.jsonData(this.localStorage().getItem(this.name+"-"+e.id))},findAll:function(){return e(this.records).chain().map(function(e){return this.jsonData(this.localStorage().getItem(this.name+"-"+e))},this).compact().value()},destroy:function(t){if(t.isNew())return false;this.localStorage().removeItem(this.name+"-"+t.id);this.records=e.reject(this.records,function(e){return e===t.id.toString()});this.save();return t},localStorage:function(){return localStorage},jsonData:function(e){return e&&JSON.parse(e)}});t.LocalStorage.sync=window.Store.sync=t.localSync=function(e,t,n){var r=t.localStorage||t.collection.localStorage;var i,s,o=$.Deferred&&$.Deferred();try{switch(e){case"read":i=t.id!=undefined?r.find(t):r.findAll();break;case"create":i=r.create(t);break;case"update":i=r.update(t);break;case"delete":i=r.destroy(t);break}}catch(u){if(u.code===DOMException.QUOTA_EXCEEDED_ERR&&window.localStorage.length===0)s="Private browsing is unsupported";else s=u.message}if(i){t.trigger("sync",t,i,n);if(n&&n.success)n.success(i);if(o)o.resolve(i)}else{s=s?s:"Record Not Found";if(n&&n.error)n.error(s);if(o)o.reject(s)}if(n&&n.complete)n.complete(i);return o&&o.promise()};t.ajaxSync=t.sync;t.getSyncMethod=function(e){if(e.localStorage||e.collection&&e.collection.localStorage){return t.localSync}return t.ajaxSync};t.sync=function(e,n,r){return t.getSyncMethod(n).apply(this,[e,n,r])};return t.LocalStorage})
		// End localStorage
	// ------ End libraries ------
		$ = jQuery;
	})();
 
	CookieCheat.miscVars.cssText = "" +
		"<style>" +
 
			"#tabs" +
			"{" +
				"width: 100%;" +
			"}" +
 
			"#hitLabel" +
			"{" +
				"font-size:2em;" +
				"border-color:#f00;" +
				"font-weight:bold;" +
				"opacity:1;" +
			"}" +
 
			"#shouldLabel" +
			"{" +
				"font-size:2em;" +
				"font-weight:bold;" +
				"opacity:1;" +
			"}" +
 
			"#shouldLabel:hover" +
			"{" +
				"cursor:pointer;" +
			"}" +
 
			"#hitLabel:hover" +
			"{" +
				"color:#FF5555;" +
				"cursor:pointer;" +
			"}" +
 
			".superTabBtn.selectedTab" +
			"{" +
				"background-color:#C9C9C9 !important;" +
				"box-shadow:2px 2px 5px rgba(0, 0, 0, 0.6) inset, -1px -1px 3px rgba(0, 0, 0, 0.8) inset !important" +
			"}" +
 
			".superTabBtn" +
			"{" +
				"width: 33.333333333333333333333333333333333333333333333333333%;" +
				"font-size: 30px;" +
			"}" +
 
			".superRadioBtn" +
			"{" +
				"color: #444 !important;" +
				"background-color: white !important;" +
			"}" +
 
			".superRadioBtn:hover" +
			"{" +
				"color: white !important;" +
				"background-color: #444 !important;" +
			"}" +
 
			".tabElem" +
			"{" +
				"border:solid 2px;" +
				"background-color:#333;" +
				"padding:10px 10px;" +
				"font-family:\"Kavoon\";" +
				"margin-top:5px;" +
				"margin-bottom:5px;" +
			"}" +
 
			"input[type=text]:focus" +
			"{" +
				"outline:0;" +
			"}" +
 
			".tabElem:hover" +
			"{" +
				"background-color:#555;" +
			"}" +
 
			".tabElemDone" +
			"{" +
				"border:solid 2px;" +
				"background: #4DBD33;" +
				"background: -webkit-linear-gradient(left, #4DBD33, #395D33);" +
				"background: -moz-linear-gradient(left, #4DBD33, #395D33);" +
				"background: -ms-linear-gradient(left, #4DBD33, #395D33);" +
				"background: -o-linear-gradient(left, #4DBD33, #395D33);" +
				"background: linear-gradient(left, #4DBD33, #395D33);" +
				"padding:10px 10px;" +
				"font-family:\"Kavoon\";" +
				"margin-top:5px;" +
				"margin-bottom:5px;" +
			"}" +
 
			".tabElemDone:hover" +
			"{" +
				"background: #6FDF55;" +
				"background: -webkit-linear-gradient(left, #6FDF55, #5B7F55);" +
				"background: -moz-linear-gradient(left, #6FDF55, #5B7F55);" +
				"background: -ms-linear-gradient(left, #6FDF55, #5B7F55);" +
				"background: -o-linear-gradient(left, #6FDF55, #5B7F55);" +
				"background: linear-gradient(left, #6FDF55, #5B7F55);" +
			"}" +
 
			".superBtn" +
			"{" +
				"border:0;" +
				"font-family:\"Kavoon\";" +
				"box-shadow:2px 2px 5px;" +
				"padding:2px;" +
				"background-color:#fff;" +
			"}" +
 
			".btns" +
			"{" +
				"float:right;" +
			"}" +
 
			".superFont" +
			"{" +
				"font-family:\"Kavoon\"" +
			"}" +
 
			".currentState" +
			"{" +
				"border:1px solid;" +
				"border-radius:100px;" +
				"padding:2px;" +
				"box-shadow:1px 1px 5px;" +
			"}" +
 
			".currentState.superBad" +
			"{" +
				"background-color:#EEB4B4;" +
			"}" +
 
			".currentState.superGood" +
			"{" +
				"background-color:#BCED91;" +
			"}" +
 
			".superBtn:active" +
			"{" +
				"box-shadow:1px 1px 2px #000 inset;" +
			"}" +
 
			".superBtn:hover" +
			"{" +
				"cursor:pointer;" +
				"background-color:#eee;" +
				"text-decoration:underline;" +
				"border:0;" +
			"}" +
 
			".superGood, .superGood:hover" +
			"{" +
				"font-family:\"Kavoon\";" +
				"color:#4CBB17 !important;" +
				"border-color:#4CBB17;" +
			"}" +
 
			".superBad, .superBad:hover" +
			"{" +
				"font-family:\"Kavoon\";" +
				"color:#CD0000;" +
				"border-color:#CD0000;" +
			"}" +
 
			".superWarning, .superWarning:hover" +
			"{" +
				"font-family:\"Kavoon\";" +
				"color:#EE7621;" +
				"border-color:#EE7621;" +
			"}" +
 
			"#cheatButton" +
			"{" +
				"text-decoration:underline;" +
				"padding:14px 16px 10px 0px;" +
				"top:0px;" +
				"right:-16px;" +
			"}" +
 
			"#cheatButton:hover" +
			"{" +
				"right:-8px;" +
				"text-decoration:underline;" +
			"}" +
 
			".simpleInfo" +
			"{" +
				"border:solid 2px;" +
				"background-color:#333;" +
				"padding:5px 10px;" +
				"display:inline-block;" +
			"}" +
 
 
			".superRight" +
			"{" +
				"float:right" +
			"}" +
 
			".imAState" +
			"{" +
				"margin-left:10px;" +
			"}" +
 
			"#newForm, #newUpgradeForm, #newSaveForm" +
			"{" +
				"border:2px solid;" +
				"padding:10px;" +
				"width:50%;" +
				"margin:0 auto;" +
				"box-shadow:5px 5px 10px;" +
				"background-color:#222;" +
			"}" +
 
			"#newAutoBuyBuildingsButton" +
			"{" +
				"width:75%;" +
				"margin:0 auto;" +
			"}" +
 
			".signatureNinetainedo" +
			"{" +
				"font-size:120%;" +
			"}" +
 
			"#upgradesListContainer, #buildingsListContainer, #savesListContainer, #choicesListContainer" +
			"{" +
				"border:2px white solid;" +
				"box-shadow:5px 5px 10px;" +
				"padding:5px;" +
				"overflow:auto;" +
				"max-height:500px" +
			"}" +
 
			".superHidden" +
			'{' +
				"display:none;" +
			'}' +
		"</style>";
 
	CookieCheat.miscVars.buildingTemplate = '<span class="superGood buildingName"></span> <span class="imAState howManyBought"></span> <span class="imAState">State :</span> <span class="superGood goodState">ON</span>/<span class="badState superBad currentState">OFF</span>' +
			'<div class="btns">' +
				'<a class="superBtn superGood myGoBtn">Go</a> <a class="superBtn superWarning myPauseBtn">Pause</a> <a class="superBtn superBad myRemoveBtn">Remove</a>' +
			'</div>';
 
	CookieCheat.miscVars.upgradeTemplate = '<span class="superGood upgradeName"></span> <span class="imAState unlockedOrNot"></span> <span class="imAState">State :</span> <span class="superGood goodState">ON</span>/<span class="badState superBad currentState">OFF</span>' +
			'<div class="btns">' +
				'<a class="superBtn superGood myGoBtn">Go</a> <a class="superBtn superWarning myPauseBtn">Pause</a> <a class="superBtn superBad myRemoveBtn">Remove</a>' +
			'</div>';
 
	CookieCheat.miscVars.saveTemplate = '<span class="superGood saveName""></span><input type="text" class="enterNameSave" class="superFont" style="display:none;></input> <span class="imAState saveDate"></span>' +
			'<div class="btns">' +
				'<a class="superBtn superWarning mySaveHereBtn">Save current game here</a> <a class="superBtn superGood myLoadBtn">Load</a> <a class="superBtn superWarning myExportBtn">Export</a> <a class="superBtn superBad myRemoveBtn">Remove</a>' +
			'</div>';
 
	CookieCheat.miscVars.specialTemplate = '<div class="tabElem"><div style="height:20px;text-align:center;padding:10px">' +
				'<a class="superBtn superGood myGoAllBtn" style="padding:10px;font-size:16px;margin:10px;">Go all !</a> <a class="superBtn superWarning myPauseAllBtn" style="padding:10px;font-size:16px;margin:10px;">Pause all !</a> <a class="superBtn superBad myRemoveAllBtn" style="padding:10px;font-size:16px;margin:10px;">Remove all !</a> <a class="superBtn superBad myRemoveDoneBtn" style="padding:10px;font-size:16px;margin:10px;">Remove completed !</a>' +
			'</div></div>';
 
	CookieCheat.miscVars.choiceTemplate = '<span class="superGood choiceName"></span> <span class="imAState activeOrNot"></span> <span class="imAState">State :</span> <span class="superGood goodState">ON</span>/<span class="badState superBad currentState">OFF</span>' +
			'<div class="btns">' +
				'<a class="superBtn superGood myToggleBtn">Toggle</a> <a class="superBtn superWarning mySpawnBtn">Spawn !</a>' +
			'</div>';
 
	CookieCheat.miscVars.newGame = "MS4wNDExfHwxMzkyNTkwNzE3Njk4OzEzOTI1OTA3MTc3MzI7MTM5MjU5MDcyMTA3OHwxMTExMTEwMHwwOzA7MDswOzA7MDstMTstMTswOzA7MDswOzA7MDswOzA7MDswOzA7MDswOzA7dmFsZW50aW5lczt8MCwwLDAsMDswLDAsMCwwOzAsMCwwLDA7MCwwLDAsMDswLDAsMCwwOzAsMCwwLDA7MCwwLDAsMDswLDAsMCwwOzAsMCwwLDA7MCwwLDAsMDswLDAsMCwwO3wyMjUxNzk5ODEzNjg1MjQ5OzIyNTE3OTk4MTM2ODUyNDk7MjI1MTc5OTgxMzY4NTI0OTsyMjUxNzk5ODEzNjg1MjQ5OzIyNTE3OTk4MTM2ODUyNDk7MjI1MTc5OTgxMzY4NTI0OTsyMjUxNzk5ODEzNjg1MjQ5OzIwOTcxNTN8MjI1MTc5OTgxMzY4NTI0OTsyMjUxNzk5ODEzNjg1MjQ5OzQyOTQ5NjcyOTc%3D%21END%21";
 
	CookieCheat.addCSS = function () {
		$("head").append(CookieCheat.miscVars.cssText);
	};
 
	CookieCheat.initModels = function () {
		CookieCheat.Models = {
			AutoClickWrinklersModel: Backbone.Model.extend({
				initialize: function() {
					if (this.get("count") !== 0)
						this.set({count: 0});
					if (this.get("running") !== false)
						this.set({running:false});
					if (!_.isUndefined(localStorage["CookieClickerCheatsAutoClickWrinklers"])) {
						this.set(JSON.parse(localStorage["CookieClickerCheatsAutoClickWrinklers"]));
					}
					this.save();
					this.set({
						intervalId: 0
					});
					if (typeof this.get("timeOut") === "undefined")
						this.set({timeOut: 1000});
					if (this.get("running"))
						this.go();
				},
				save: function () {
					localStorage["CookieClickerCheatsAutoClickWrinklers"] = JSON.stringify(this.toJSON());
				},
				go: function() {
					var that = this;
					var t = function () {
						var tmpCount = 0;
						_.each(Game.wrinklers, function (w) {
							if (w.phase > 0 && w.hp > 0 && w.sucked > 0) {
								w.hp = 0;
								tmpCount++;
							}
						});
						that.set({
							count: that.get("count") + tmpCount
						});
						var tmp = setTimeout(t, that.get("timeOut"));
						that.set({intervalId:tmp});
					};
					var tmp = setTimeout(t, that.get("timeOut"));
					this.set({intervalId:tmp, running:true});
					this.save();
				},
				stop: function() {
					var that = this;
					if (typeof that.get("intervalId") !== "undefined")
						clearTimeout(that.get("intervalId"));
					that.set({running:false});
					this.save();
				},
				reset: function () {
					this.stop();
					this.set({
						running: false,
						count: 0,
						timeOut: 1000
					});
				}
			}),
			AutoClickModel: Backbone.Model.extend({
				initialize: function() {
					if (this.get("count") !== 0)
						this.set({count: 0});
					if (this.get("running") !== false)
						this.set({running:false});
					if (!_.isUndefined(localStorage["CookieClickerCheatsAutoClick"])) {
						this.set(JSON.parse(localStorage["CookieClickerCheatsAutoClick"]));
					}
					this.save();
					this.set({
						intervalId: 0
					});
					if (typeof this.get("timeOut") === "undefined")
						this.set({timeOut: 50});
					if (this.get("running"))
						this.go();
				},
				save: function () {
					localStorage["CookieClickerCheatsAutoClick"] = JSON.stringify(this.toJSON());
				},
				go: function() {
					var that = this;
					var t = function () {
						Game.ClickCookie();
						that.set({
							count: that.get("count") + 1
						});
						var tmp = setTimeout(t, that.get("timeOut"));
						that.set({intervalId:tmp});
					};
					var tmp = setTimeout(t, that.get("timeOut"));
					this.set({intervalId:tmp, running:true});
					this.save();
				},
				stop: function() {
					var that = this;
					if (typeof that.get("intervalId") !== "undefined")
						clearTimeout(that.get("intervalId"));
					that.set({running:false});
					this.save();
				},
				reset: function () {
					this.stop();
					this.set({
						running: false,
						count: 0,
						timeOut: 50
					});
				}
			}),
			AutoSpawnModel: Backbone.Model.extend({
				initialize: function() {
					if (this.get("count") !== 0)
						this.set({count: 0});
					if (this.get("running") !== false)
						this.set({running:false});
					if (!_.isUndefined(localStorage["CookieClickerCheatsAutoSpawn"])) {
						this.set(JSON.parse(localStorage["CookieClickerCheatsAutoSpawn"]));
					}
					this.save();
					this.set({
						intervalId: 0
					});
					if (typeof this.get("timeOut") === "undefined")
						this.set({timeOut: 1000 * 60 * 10});
					if (this.get("running"))
						this.go();
				},
				save: function () {
					localStorage["CookieClickerCheatsAutoSpawn"] = JSON.stringify(this.toJSON());
				},
				go: function() {
					var that = this;
					var t = function () {
						Game.goldenCookie.life = 0;
						Game.goldenCookie.time = Game.goldenCookie.minTime;
						Game.goldenCookie.spawn();
						that.set({
							count: that.get("count") + 1
						});
						var tmp = setTimeout(t, that.get("timeOut"));
						that.set({intervalId:tmp});
					};
					var tmp = setTimeout(t, that.get("timeOut"));
					this.set({intervalId:tmp, running:true});
					this.save();
				},
				stop: function() {
					var that = this;
					if (typeof that.get("intervalId") !== "undefined")
						clearTimeout(that.get("intervalId"));
					that.set({running:false});
					this.save();
				},
				reset: function () {
					this.stop();
					this.set({
						running: false,
						count: 0,
						timeOut: 50
					});
				}
			}),
			GoldenSpawnModel: Backbone.Model.extend({
				initialize: function() {
					if (this.get("count") !== 0)
						this.set({count: 0});
				},
				incr: function() {
					this.set({
						count: this.get("count") + 1
					});
				},
				reset: function () {
					this.set({
						count: 0
					});
				}
			}),
			AutoGoldenClickModel: Backbone.Model.extend({
				save: function () {
					localStorage["CookieClickerCheatsAutoGoldenClick"] = JSON.stringify(this.toJSON());
				},
				initialize: function() {
					if (this.get("count") !== 0)
						this.set({count: 0});
					if (this.get("running") !== false)
						this.set({running:false});
					if (!_.isUndefined(localStorage["CookieClickerCheatsAutoGoldenClick"])) {
						this.set(JSON.parse(localStorage["CookieClickerCheatsAutoGoldenClick"]));
					}
					this.save();
					this.set({intervalId:0});
					if (this.get("running"))
						this.go();
				},
				go: function() {
					var that = this;
					var tmp = setInterval(function() {
						if (Game.goldenCookie.life > 0) {
							Game.goldenCookie.click();
							that.set({
								count: that.get("count") + 1
							});
						}
					}, 1000);
					this.set({intervalId:tmp, running:true});
					this.save();
				},
				stop: function() {
					var that = this;
					if (typeof that.get("intervalId") !== "undefined")
						clearInterval(that.get("intervalId"));
					that.set({running:false});
					this.save();
				},
				reset: function () {
					this.stop();
					this.set({
						running: false,
						count: 0
					});
				}
			}),
			AutoReindeerClickModel: Backbone.Model.extend({
				save: function () {
					localStorage["CookieClickerCheatsAutoReindeerClick"] = JSON.stringify(this.toJSON());
				},
				initialize: function() {
					if (this.get("count") !== 0)
						this.set({count: 0});
					if (this.get("running") !== false)
						this.set({running:false});
					if (!_.isUndefined(localStorage["CookieClickerCheatsAutoReindeerClick"])) {
						this.set(JSON.parse(localStorage["CookieClickerCheatsAutoReindeerClick"]));
					}
					this.save();
					this.set({intervalId:0});
					if (this.get("running"))
						this.go();
				},
				go: function() {
					var that = this;
					var tmp = setInterval(function() {
						if (Game.seasonPopup.life > 0) {
							Game.seasonPopup.click();
							that.set({
								count: that.get("count") + 1
							});
						}
					}, 1000);
					this.set({intervalId:tmp, running:true});
					this.save();
				},
				stop: function() {
					var that = this;
					if (typeof that.get("intervalId") !== "undefined")
						clearInterval(that.get("intervalId"));
					that.set({running:false});
					this.save();
				},
				reset: function () {
					this.stop();
					this.set({
						running: false,
						count: 0
					});
				}
			}),
			AutoBuyBuilding: Backbone.Model.extend({
				initialize: function() {
					if (typeof this.get("maxAmount") === "undefined" || this.get("maxAmount") < 1)
						this.set({maxAmount:1});
					if (this.get("count") !== 0)
						this.set({count: 0});
					if (this.get("running") !== false && this.get("running") !== true)
						this.set({running:false});
					if (this.get("bought") !== 0)
						this.set({bought:0});
					this.set({count: Game.ObjectsById[this.get("buildingId")].amount});
					this.set({maxBought:this.get("maxAmount") - this.get("count")});
					if (this.get("running") === true) {
						this.toJSON().first = true;
						this.go();
					}
					this.set({intervalId:0, first:true});
				},
				validate: function(attrs, options) {
					if (typeof Game.ObjectsById[this.get("buildingId")] === "undefined") {
						return "Invalid buildingId specified.";
					}
					if (this.get("count") >= this.get("maxAmount")) {
						return "[" + Game.ObjectsById[this.get("buildingId")].name + "] :Your current amount is above your maxAmount.";
					}
				},
				functionToDo: function () {
					if (__DEBUG__)
						console.log("In");
					var that = this;
					var running = that.get("running");
					var buildingId = that.get("buildingId");
					if (running && Game.ObjectsById[buildingId].amount < that.get("maxAmount")) {
						if (Game.cookies - Game.ObjectsById[buildingId].price >= CookieCheat.cookieToKeep) {
							Game.ObjectsById[buildingId].buy();
							if (that.get("count") !== Game.ObjectsById[buildingId].amount) {
								that.set({bought: that.get("bought") + 1});
								that.save();
							}
						}
					}
					else if (Game.ObjectsById[buildingId].amount >= that.get("maxAmount")) {
						that.stop();
					}
					that.set({count: Game.ObjectsById[buildingId].amount});
					if (this.get("again"))
						setTimeout(_.bind(this.functionToDo, this), (running ? 100 : 2000));
					else if (__DEBUG__)
						console.log("Finished for real");
				},
				go: function() {
					var that = this;
					if (typeof this.toJSON().first === "undefined" || this.toJSON().first === true) {
						setTimeout(_.bind(this.functionToDo, this), 200);
						this.toJSON().first = false;
					}
					this.set({running:true, again: true});
					this.save();
				},
				stop: function() {
					var that = this;
					that.set({running:false});
					that.save();
				},
				reset: function () {
					this.stop();
					this.set({
						running: false,
						maxAmount: 1,
						bought: 0,
						count: 0
					});
				}
			}),
			AutoBuyUpgrade: Backbone.Model.extend({
				initialize: function() {
					if (this.get("running") !== false && this.get("running") !== true)
						this.set({running:false});
					if (this.get("running") === true)
						this.go();
					this.set({intervalId:0});
				},
				validate: function(attrs, options) {
					if (typeof Game.UpgradesById[this.get("upgradeId")] === "undefined") {
						return "Invalid upgradeId specified.";
					}
				},
				go: function() {
					var that = this;
					var tmp = setInterval(function() {
						if (Game.UpgradesById[that.get("upgradeId")].unlocked === 1) {
							if (Game.cookies - Game.UpgradesById[that.get("upgradeId")].basePrice >= CookieCheat.cookieToKeep) {
								Game.UpgradesById[that.get("upgradeId")].buy();
								that.save();
							}
						}
					}, 100);
					this.set({intervalId:tmp, running:true});
					that.save();
				},
				stop: function() {
					var that = this;
					if (typeof that.get("intervalId") !== "undefined")
						clearInterval(that.get("intervalId"));
					that.set({running:false});
					that.save();
				},
				reset: function () {
					this.stop();
					this.set({
						running: false,
						upgradeId: -1
					});
				}
			}),
			SaveModel: Backbone.Model.extend({
				initialize: function () {
					if (typeof this.get("name") === "undefined")
						this.set({name: "NoName"});
					if (typeof this.get("date") === "undefined")
						this.set({date: new Date()});
					if (typeof this.get("code") === "undefined")
						this.set({code: ""});
				},
				validate: function(attrs, options) {
					var str = unescape(this.get("code")).split('!END!')[0];
					str = b64_to_utf8(str);
					if (str === "")
						return ("Bad save")
				},
				saveGame: function (save) {
					this.set({backUp: this.get("code"), code: save});
				},
				loadGame: function () {
					Game.LoadSave(this.get("code"));
				},
				loadBackup: function () {
					Game.LoadSave(this.get("backUp"));
				},
				generateSavePreview: function (save) {
					var preview = {
						prefs: {},
						upgrades: {},
						achievements: {},
						objects: {}
					};
					var str = unescape(save);
					var version = 0;
					var oldstr = str.split('|');
					if (oldstr[0] < 1) {} else {
						str = str.split('!END!')[0];
						str = b64_to_utf8(str);
					}
					if (str != '') {
						var spl = '';
						str = str.split('|');
						preview.version = version = parseFloat(str[0]);
 
						if (version >= 1 && version > Game.version) {
							alert('Error : you are attempting to load a save from a later version (v.' + version + '; you are using v.' + Game.version + ').');
							return;
						}
						else if (version >= 1) {
							spl = str[2].split(';'); //save stats
							preview.startDate = parseInt(spl[0]);
 
							spl = str[3].split(''); //prefs
							preview.prefs.particles = parseInt(spl[0]);
							preview.prefs.numbers = parseInt(spl[1]);
							preview.prefs.autosave = parseInt(spl[2]);
							preview.prefs.autoupdate = spl[3] ? parseInt(spl[3]) : 1;
							preview.prefs.milk = spl[4] ? parseInt(spl[4]) : 1;
							preview.prefs.fancy = parseInt(spl[5]);
 
							spl = str[4].split(';'); //cookies
							preview.cookies = parseFloat(spl[0]);
							preview.cookiesEarned = parseFloat(spl[1]);
							preview.cookieClicks = spl[2] ? parseInt(spl[2]) : 0;
							preview.goldenClicks = spl[3] ? parseInt(spl[3]) : 0;
							preview.handmadeCookies = spl[4] ? parseFloat(spl[4]) : 0;
							preview.missedGoldenClicks = spl[5] ? parseInt(spl[5]) : 0;
							preview.backgroundType = spl[6] ? parseInt(spl[6]) : 0;
							preview.milkType = spl[7] ? parseInt(spl[7]) : 0;
							preview.cookiesReset = spl[8] ? parseFloat(spl[8]) : 0;
							preview.elderWrath = spl[9] ? parseInt(spl[9]) : 0;
							preview.pledges = spl[10] ? parseInt(spl[10]) : 0;
							preview.pledgeT = spl[11] ? parseInt(spl[11]) : 0;
							preview.nextResearch = spl[12] ? parseInt(spl[12]) : 0;
							preview.researchT = spl[13] ? parseInt(spl[13]) : 0;
 
							spl = str[5].split(';'); //buildings
							preview.BuildingsOwned = 0;
							for (var i in Game.ObjectsById) {
								var me = Game.ObjectsById[i];
								preview.objects[me.name] = {};
								me = preview.objects[me.name];
								if (spl[i]) {
									var mestr = spl[i].toString().split(',');
									me.amount = parseInt(mestr[0]);
									me.bought = parseInt(mestr[1]);
									me.totalCookies = parseInt(mestr[2]);
									me.specialUnlocked = parseInt(mestr[3]);
									preview.BuildingsOwned += me.amount;
								} else {
									me.unlocked = 0;
									me.bought = 0;
									me.totalCookies = 0;
								}
							}
							if (version < 1.035) //old non-binary algorithm
							{
								spl = str[6].split(';'); //upgrades
								preview.UpgradesOwned = 0;
								for (var i in Game.UpgradesById) {
									var me = Game.UpgradesById[i];
									preview.upgrades[me.name] = {};
									me = preview.upgrades[me.name];
									if (spl[i]) {
										var mestr = spl[i].split(',');
										me.unlocked = parseInt(mestr[0]);
										me.bought = parseInt(mestr[1]);
										if (me.bought) preview.UpgradesOwned++;
									} else {
										me.unlocked = 0;
										me.bought = 0;
									}
								}
								if (str[7]) spl = str[7].split(';');
								else spl = []; //achievements
								preview.AchievementsOwned = 0;
								for (var i in Game.AchievementsById) {
									var me = Game.AchievementsById[i];
									preview.achievements[me.name] = {};
									me = preview.achievements[me.name];
									if (spl[i]) {
										var mestr = spl[i].split(',');
										me.won = parseInt(mestr[0]);
									} else {
										me.won = 0;
									}
									if (me.won && me.hide != 3) preview.AchievementsOwned++;
								}
							} else {
								if (str[6]) spl = str[6];
								else spl = []; //upgrades
								spl = UncompressLargeBin(spl);
								preview.UpgradesOwned = 0;
								for (var i in Game.UpgradesById) {
									var me = Game.UpgradesById[i];
									preview.upgrades[me.name] = {};
									me = preview.upgrades[me.name];
									if (spl[i * 2]) {
										var mestr = [spl[i * 2], spl[i * 2 + 1]];
										me.unlocked = parseInt(mestr[0]);
										me.bought = parseInt(mestr[1]);
										if (me.bought) preview.UpgradesOwned++;
									} else {
										me.unlocked = 0;
										me.bought = 0;
									}
								}
								if (str[7]) spl = str[7];
								else spl = []; //achievements
								spl = UncompressLargeBin(spl);
								preview.AchievementsOwned = 0;
								for (var i in Game.AchievementsById) {
									var me = Game.AchievementsById[i];
									preview.achievements[me.name] = {};
									me = preview.achievements[me.name];
									if (spl[i]) {
										var mestr = [spl[i]];
										me.won = parseInt(mestr[0]);
									} else {
										me.won = 0;
									}
									if (me.won && me.hide != 3) preview.AchievementsOwned++;
								}
							}
						}
					}
					return preview;
				}
			}),
			ChoiceModel: Backbone.Model.extend({})
		};
	};
 
	CookieCheat.initCollections = function () {
		CookieCheat.Collections = {
			BuildingsCollection: Backbone.Collection.extend({
				model: CookieCheat.Models.AutoBuyBuilding,
				localStorage: new Store("CookieClickerCheatsBuildings"),
				initialize: function () {
					return this;
				}
			}),
			UpgradesCollection: Backbone.Collection.extend({
				model: CookieCheat.Models.AutoBuyUpgrade,
				localStorage: new Store("CookieClickerCheatsUpgrades"),
				initialize: function () {
					return this;
				}
			}),
			ChoicesCollection: Backbone.Collection.extend({
				model: CookieCheat.Models.ChoiceModel,
				localStorage: new Store("CookieClickerCheatsGoldenChoices"),
				initialize: function () {
					return this;
				},
				getFromArray: function (arr) {
					for (var i in arr) {
						var t = CookieCheat.clone(arr[i]);
						t.id = arr[i].name;
						this.add(t);
					}
					this.saveAll();
				},
				saveAll: function () {
					for (var i in this.models) {
						this.models[i].save();
					}
				},
				computeAndApply: function () {
					var that = this;
					var out = _.map(this.models, function (item) {return item.toJSON();});
					Game.goldenCookie.choose = CookieCheat.generateChooseFunc(out);
				}
			}),
			SavesCollection: Backbone.Collection.extend({
				model: CookieCheat.Models.SaveModel,
				localStorage: new Store("CookieClickerCheatsSaves"),
				initialize: function () {
					return this;
				},
				getModelByName: function (name) {
					var res = "";
					_.each(this.models, function (model) {
						if (model.get("name") === name)
							res = model;
					});
					return (res);
				}
			})
		};
	};
 
	CookieCheat.initViews = function () {
		CookieCheat.Views = {
			AutoClickWrinklersView: Backbone.View.extend({
				elName: '#autoClickWrinklersDiv',
				initialize: function() {
					this.listenTo(this.model, "change", this.render);
					this.render();
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).find('#autoClickWrinklersButton').off("click");
					$(toChange).find('#autoClickWrinklersButton').click(function() {that.clicked.apply(that)});
					$(toChange).find('#autoClickWrinklersButton').toggleClass("superGood", this.model.get("running"));
					$(toChange).find('#autoClickWrinklersButton').toggleClass("superBad", !this.model.get("running"));
					$(toChange).find("#clickWrinklersAmount").text("Clicked " + this.model.get("count") + " Wrinkler" + (this.model.get("count") > 1 ? "s.":"."));
					$(toChange).find(".goodState").toggleClass("currentState", this.model.get("running"));
					$(toChange).find(".badState").toggleClass("currentState", !this.model.get("running"));
					return (this);
				},
				clicked: function() {
					if (this.model.get("running"))
						this.model.stop();
					else
						this.model.go();
				}
			}),
			SafeCookiesView: Backbone.View.extend({
				elName: '#safeCookieDiv',
				initialize: function() {
					var that = this;
					CookieCheat.cookieToKeep = JSON.parse(localStorage["CookieClickerCheatsSafeAmount"] || 0);
					CookieCheat.godMustCheck = JSON.parse(localStorage["CookieClickerCheatsGodCheck"] || 0);
					this.radioChecked = JSON.parse(localStorage["CookieClickerCheatsRadioChecked"] || 3);
					this.f();
					this.render();
					_.bindAll(this, "f", "checkLimit");
					this.checkId = setInterval(this.checkLimit, 1000);
					return (this);
				},
				checkLimit: function () {
					var toChange = $(this.elName);
					$(toChange).find(".whatAboutYou").text((Game.cookies >= CookieCheat.cookieToKeep) ? "You are above the limit ! ;)" : "You are below the limit ! :(");
					$(toChange).find(".whatAboutYou").toggleClass("superGood", Game.cookies >= CookieCheat.cookieToKeep);
					$(toChange).find(".whatAboutYou").toggleClass("superBad", Game.cookies < CookieCheat.cookieToKeep);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					var textToDisplayInInfo = "";
					$(toChange).find("#fixCookies").off("click");
					$(toChange).find("#fixCookies").click(function() {if (confirm("CookieGod will reset your cookies ! Are you sure ?")) {Game.Popup("Respect from CookHeaven... - CookieGod");Game.cookies = Game.cookiesd = 0;}else Game.Popup('"Coward... - CookieGod"')});
					$(toChange).find("#checkBoxToKeepForLucky").toggleClass("superGood", this.radioChecked === 1);
					$(toChange).find("#checkBoxToKeepForLucky").off("click");
					$(toChange).find("#checkBoxToKeepForLucky").click(function() {that.radioChecked = 1;that.changed.apply(that)});
					$(toChange).find("#checkBoxToKeepForFrenzy").off("click");
					$(toChange).find("#checkBoxToKeepForFrenzy").toggleClass("superGood", this.radioChecked === 2);
					$(toChange).find("#checkBoxToKeepForFrenzy").click(function() {that.radioChecked = 2;that.changed.apply(that)});
					$(toChange).find("#checkBoxToKeepAny").toggleClass("superGood", this.radioChecked === 3);
					$(toChange).find("#checkBoxToKeepAny").off("click");
					$(toChange).find("#checkBoxToKeepAny").click(function() {that.radioChecked = 3;that.changed.apply(that)});
					$(toChange).find("#hitMePlease").off("change");
					$(toChange).find("#hitMePlease").change(function() {that.changedGod.apply(that)});
					$(toChange).find('#hitMePlease').prop("checked", CookieCheat.godMustCheck);
					$(toChange).find('.numberToKeep').off("change");
					$(toChange).find('.numberToKeep').change(function() {that.changed.apply(that)});
					$(toChange).find('.numberToKeep').val(CookieCheat.cookieToKeep);
					$(toChange).find('.numberToKeep').prop("disabled", this.radioChecked !== 3);
					$(toChange).find(".cookieGod").text((CookieCheat.godMustCheck) ? "The CookieGod look on your cookies. Trust him" : "The CookieGod doesn't care at all");
					$(toChange).find(".cookieGod").toggleClass("superGood", CookieCheat.godMustCheck > 0);
					$(toChange).find(".cookieGod").toggleClass("superBad", !CookieCheat.godMustCheck);
					$(toChange).find(".infoToDisplay").toggleClass("superGood", CookieCheat.cookieToKeep > 0 && !(this.radioChecked <= 2 && Game.cookiesPs <= 0));
					$(toChange).find(".infoToDisplay").toggleClass("superBad", CookieCheat.cookieToKeep <= 0 && !(this.radioChecked <= 2 && Game.cookiesPs <= 0));
					$(toChange).find(".infoToDisplay").toggleClass("superWarning", this.radioChecked <= 2 && Game.cookiesPs <= 0);
					if (CookieCheat.cookieToKeep <= 0)
						textToDisplayInInfo = "Your cookies aren't safe !";
					if (CookieCheat.cookieToKeep === 1)
						textToDisplayInInfo = "One cookie is safe !";
					if (CookieCheat.cookieToKeep > 1)
						textToDisplayInInfo = "" + Beautify(CookieCheat.cookieToKeep) + " cookies are safe !";
					if (this.radioChecked <= 2 && Game.cookiesPs <= 0)
						textToDisplayInInfo = "You do not product cookies... =/";
					$(toChange).find(".infoToDisplay").text(textToDisplayInInfo);
					this.checkLimit();
					return (this);
				},
				changed: function() {
					localStorage["CookieClickerCheatsRadioChecked"] = JSON.stringify(this.radioChecked);
					if (this.radioChecked === 3) {
						CookieCheat.cookieToKeep = parseInt("0" + $(this.elName).find(".numberToKeep").val(), 10);
						localStorage["CookieClickerCheatsSafeAmount"] = JSON.stringify(CookieCheat.cookieToKeep);
						this.render();
					} else {
						this.f();
					}
				},
				changedGod: function() {
					CookieCheat.godMustCheck = $("#hitMePlease").is(":checked") ? 1 : 0;
					localStorage["CookieClickerCheatsGodCheck"] = JSON.stringify(CookieCheat.godMustCheck);
					this.render();
				},
				f: function () {
					if (this.radioChecked === 1 || this.radioChecked === 2) {
						CookieCheat.cookieToKeep = Math.floor((this.radioChecked === 1 ? Game.cookiesPs * 12000 : Game.cookiesPs * 12000 * 7));
						this.render();
						setTimeout(this.f, 500)
					}
				}
			}),
			EarnChipsView: Backbone.View.extend({
				elName: '#earnHeavenDiv',
				initialize: function() {
					this.heavenEarned = JSON.parse(localStorage["CookieClickerCheatsEarnHeavenAmount"] || 0);
					this.render();
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).find('.numberToEarn').off("change");
					$(toChange).find('.numberToEarn').change(function() {that.changed.apply(that)});
					$(toChange).find(".numberToEarn").val("0");
					$(toChange).find(".infoToDisplay").text((that.heavenEarned <= 0) ? "You didn't cheat chips !" : (that.heavenEarned === 1) ? "You gave yourself one chip !" : Beautify(that.heavenEarned) + " chips were given to you by the CookieGod !");
					$(toChange).find(".infoToDisplay").toggleClass("superGood", that.heavenEarned > 0);
					$(toChange).find(".infoToDisplay").toggleClass("superBad", that.heavenEarned <= 0);
					return (this);
				},
				changed: function() {
					if (_.isUndefined(Game.prestige["Heavenly chips"]))
						Game.prestige["Heavenly chips"] = 0;
					var toGive = parseInt($(this.elName).find(".numberToEarn").val(), 10);
					if (_.isFinite(toGive + Game.prestige["Heavenly chips"])) {
						this.heavenEarned += toGive;
						Game.prestige["Heavenly chips"] += toGive;
						localStorage["CookieClickerCheatsEarnHeavenAmount"] = JSON.stringify(this.heavenEarned);
						Game.recalculateGains = 1;
						Game.Popup("The CookieGod gave you " + Beautify(toGive) + " chips from Heaven !");
					} else {
						Game.Popup("The CookieGod hates infinity, sorry...");
					}
					$(this.elName).find(".numberToEarn").val(0);
					this.render();
				}
			}),
			EarnCookiesView: Backbone.View.extend({
				elName: '#earnCookieDiv',
				initialize: function() {
					this.cookieEarned = JSON.parse(localStorage["CookieClickerCheatsEarnAmount"] || 0);
					this.render();
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).find('.numberToEarn').off("change");
					$(toChange).find('.numberToEarn').change(function() {that.changed.apply(that)});
					$(toChange).find(".numberToEarn").val("0");
					$(toChange).find(".infoToDisplay").text((that.cookieEarned <= 0) ? "You didn't cheat cookies !" : (that.cookieEarned === 1) ? "You gave yourself one cookie !" : Beautify(that.cookieEarned) + " cookies were given to you by the CookieGod !");
					$(toChange).find(".infoToDisplay").toggleClass("superGood", that.cookieEarned > 0);
					$(toChange).find(".infoToDisplay").toggleClass("superBad", that.cookieEarned <= 0);
					return (this);
				},
				changed: function() {
					var toGive = parseInt($(this.elName).find(".numberToEarn").val(), 10);
					if (_.isFinite(toGive + Game.cookies)) {
						this.cookieEarned += toGive;
						Game.Earn(toGive);
						localStorage["CookieClickerCheatsEarnAmount"] = JSON.stringify(this.cookieEarned);
						Game.Popup("The CookieGod gave you " + Beautify(toGive) + " cookies !");
					} else {
						Game.Popup("The CookieGod hates infinity, sorry...");
					}
					$(this.elName).find(".numberToEarn").val(0);
					this.render();
				}
			}),
			GoldenSpawnView: Backbone.View.extend({
				elName: '#goldenSpawnDiv',
				initialize: function() {
					this.listenTo(this.model, "change", this.render);
					this.render();
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).find('#goldenSpawnButton').off("click");
					$(toChange).find('#goldenSpawnButton').click(function() {that.clicked.apply(that)});
					$(toChange).find("#goldenSpawnedAmount").text(this.model.get("count") + " golden cookie" + (this.model.get("count") > 1 ? "s spawned.":" spawned."));
					return (this);
				},
				clicked: function() {
					Game.goldenCookie.life = 0;
					Game.goldenCookie.time = Game.goldenCookie.minTime;
					Game.goldenCookie.spawn();
					this.model.incr();
				}
			}),
			AutoClickView: Backbone.View.extend({
				elName: '#autoClickDiv',
				initialize: function() {
					this.listenTo(this.model, "change", this.render);
					this.render();
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					var perSecond = 1000 / this.model.get("timeOut");
					$(toChange).find('#autoClickButton').off("click");
					$(toChange).find('#clickingSpeed').off("change");
					$(toChange).find('#autoClickButton').click(function() {that.clicked.apply(that)});
					$(toChange).find('#clickingSpeed').change(function() {that.changed.apply(that)});
					$(toChange).find('#clickingSpeed').val(perSecond);
					$(toChange).find('#autoClickButton').toggleClass("superGood", this.model.get("running"));
					$(toChange).find('#autoClickButton').toggleClass("superBad", !this.model.get("running"));
					$(toChange).find("#clickAmount").text("Clicked " + this.model.get("count") + " time" + (this.model.get("count") > 1 ? "s.":"."));
					$(toChange).find(".goodState").toggleClass("currentState", this.model.get("running"));
					$(toChange).find(".badState").toggleClass("currentState", !this.model.get("running"));
					$(toChange).find("#clickingSpeedText").text("Clicking speed :   " + perSecond.toPrecision(5) + " clicks per second");
					return (this);
				},
				clicked: function() {
					if (this.model.get("running"))
						this.model.stop();
					else
						this.model.go();
				},
				changed: function() {
					var t = (1000 / parseInt($(this.elName).find('#clickingSpeed').val(), 10));
					this.model.set({
						timeOut: t
					});
					this.model.save();
				}
			}),
			AutoSpawnView: Backbone.View.extend({
				elName: '#autoSpawnDiv',
				initialize: function() {
					this.listenTo(this.model, "change", this.render);
					this.render();
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					var perSecond = this.model.get("timeOut");
					$(toChange).find('#autoSpawnButton').off("click");
					$(toChange).find('#spawningSpeed').off("change");
					$(toChange).find('#autoSpawnButton').click(function() {that.clicked.apply(that)});
					$(toChange).find('#spawningSpeed').change(function() {that.changed.apply(that)});
					$(toChange).find('#spawningSpeed').val(perSecond);
					$(toChange).find('#autoSpawnButton').toggleClass("superGood", this.model.get("running"));
					$(toChange).find('#autoSpawnButton').toggleClass("superBad", !this.model.get("running"));
					$(toChange).find("#spawnAmount").text("Spawned " + this.model.get("count") + " golden cookie" + (this.model.get("count") > 1 ? "s.":"."));
					$(toChange).find(".goodState").toggleClass("currentState", this.model.get("running"));
					$(toChange).find(".badState").toggleClass("currentState", !this.model.get("running"));
					$(toChange).find("#spawningSpeedText").text("Spawning interval :   " + CookieCheat.processMs(perSecond.toPrecision(5)));
					return (this);
				},
				clicked: function() {
					if (this.model.get("running"))
						this.model.stop();
					else
						this.model.go();
				},
				changed: function() {
					var t = parseInt($(this.elName).find('#spawningSpeed').val(), 10);
					this.model.stop();
					this.model.set({
						timeOut: t
					});
					this.model.go();
				}
			}),
			AutoGoldenClickView: Backbone.View.extend({
				elName: '#autoGoldenClickDiv',
				initialize: function() {
					this.listenTo(this.model, "change", this.render);
					this.render();
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).find('#autoGoldenClickButton').off("click");
					$(toChange).find('#autoGoldenClickButton').click(function() {that.clicked.apply(that)});
					$(toChange).find('#autoGoldenClickButton').toggleClass("superGood", this.model.get("running"));
					$(toChange).find('#autoGoldenClickButton').toggleClass("superBad", !this.model.get("running"));
					$(toChange).find("#goldenClickAmount").text("Clicked " + this.model.get("count") + " golden cookie" + (this.model.get("count") > 1 ? "s.":"."));
					$(toChange).find(".goodState").toggleClass("currentState", this.model.get("running"));
					$(toChange).find(".badState").toggleClass("currentState", !this.model.get("running"));
					return (this);
				},
				clicked: function() {
					if (this.model.get("running"))
						this.model.stop();
					else
						this.model.go();
				}
			}),
			AutoReindeerClickView: Backbone.View.extend({
				elName: '#autoReindeerClickDiv',
				initialize: function() {
					this.listenTo(this.model, "change", this.render);
					this.render();
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).find('#autoReindeerClickButton').off("click");
					$(toChange).find('#autoReindeerClickButton').click(function() {that.clicked.apply(that)});
					$(toChange).find('#autoReindeerClickButton').toggleClass("superGood", this.model.get("running"));
					$(toChange).find('#autoReindeerClickButton').toggleClass("superBad", !this.model.get("running"));
					$(toChange).find("#reindeerClickAmount").text("Clicked " + this.model.get("count") + " reindeer" + (this.model.get("count") > 1 ? "s.":"."));
					$(toChange).find(".goodState").toggleClass("currentState", this.model.get("running"));
					$(toChange).find(".badState").toggleClass("currentState", !this.model.get("running"));
					return (this);
				},
				clicked: function() {
					if (this.model.get("running"))
						this.model.stop();
					else
						this.model.go();
				}
			}),
 
			BuildingFormView: Backbone.View.extend({
				elName: '#newForm',
				addOne: function (id, q) {
					var m = new CookieCheat.Models.AutoBuyBuilding({
						maxAmount: q,
						buildingId: id
					});
					if (!m.isValid())
						alert(m.validationError);
					else {
						CookieCheat.collections.buildingsCollection.add(m);
						m.save();
					}
				},
				initialize: function() {
					this.render();
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).find('#newAutoBuyBuildingsButton').off("click");
					$(toChange).find('#newAutoBuyBuildingsButton').click(function(e) {that.clicked.call(that, e);});
					for (var i in Game.ObjectsById) {
						$(toChange).find("#selectBuilding").append('<option value="' + i + '">' + Game.ObjectsById[i].name + '</option>');
					}
					return (this);
				},
				clicked: function(e) {
					e.preventDefault();
					var toChange = $(this.elName);
					var selected = $(toChange).find("#selectBuilding").val();
					var quantity = parseInt($(toChange).find(".number").val(), 10);
					if (selected !== "all") {
						this.addOne(parseInt(selected, 10), quantity);
					}
					else if (selected === "all") {
						for (var i in Game.ObjectsById) {
							this.addOne(i, quantity);
						}
					}
				}
			}),
			BuildingListView: Backbone.View.extend({
				elName: '#buildingsListContainer',
				initialize: function() {
					var that = this;
					this.template = _.template(CookieCheat.miscVars.specialTemplate);
					this.listenTo(this.collection, "add", function() {that.update(); that.render();});
					this.listenTo(this.collection, "remove", function() {that.update(); that.render();});
					this.update();
					this.render();
					return (this);
				},
				update: function() {
					CookieCheat.views.buildingViews = [];
					_.each(this.collection.models, function (item) {
						CookieCheat.views.buildingViews.push(new CookieCheat.Views.BuildingView({model:item}));
					});
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).toggleClass("superHidden", CookieCheat.views.buildingViews.length === 0);
					$(toChange).html("");
					if (CookieCheat.views.buildingViews.length > 0) {
						$(toChange).append(this.template());
						$(toChange).find('.myPauseAllBtn').off("click");
						$(toChange).find('.myPauseAllBtn').click(function(e) {that.pauseAll.call(that, e);});
						$(toChange).find('.myRemoveAllBtn').off("click");
						$(toChange).find('.myRemoveAllBtn').click(function(e) {that.removeAll.call(that, e);});
						$(toChange).find('.myGoAllBtn').off("click");
						$(toChange).find('.myGoAllBtn').click(function(e) {that.goAll.call(that, e);});
						$(toChange).find('.myRemoveDoneBtn').off("click");
						$(toChange).find('.myRemoveDoneBtn').click(function(e) {that.removeBought.call(that, e);});
					}
					_.each(CookieCheat.views.buildingViews, function (item) {
						$(toChange).append(item.render().$el);
					});
					return (this);
				},
				goAll: function () {
					_.each(CookieCheat.views.buildingViews, function (view) {view.model.go();});
				},
				pauseAll: function () {
					_.each(CookieCheat.views.buildingViews, function (view) {view.model.stop();});
				},
				removeAll: function () {
					_.each(CookieCheat.views.buildingViews, function (view) {
						view.model.stop();
						view.model.destroy();
						CookieCheat.collections.buildingsCollection.remove(view.model);
						view.remove();
					});
				},
				removeBought: function () {
					_.each(CookieCheat.views.buildingViews, function (view) {
						if (view.model.get("count") >= view.model.get("maxAmount")) {
							view.model.stop();
							view.model.destroy();
							CookieCheat.collections.buildingsCollection.remove(view.model);
							view.remove();
						}
					});
				}
			}),
			BuildingView: Backbone.View.extend({
				tagName: "div",
				className: "tabElem",
				initialize: function() {
					this.listenTo(this.model, "change", this.render);
					this.template = _.template(CookieCheat.miscVars.buildingTemplate);
					return (this);
				},
				render: function() {
					this.$el.html(this.template());
					var toChange = this.$el;
					$(toChange).find('.myGoBtn').off("click");
					$(toChange).find('.myPauseBtn').off("click");
					$(toChange).find('.myRemoveBtn').off("click");
					var that = this;
					$(toChange).find('.myRemoveBtn').click(function() {that.removed.apply(that)});
					$(toChange).find('.myGoBtn').click(function() {that.went.apply(that)});
					$(toChange).find('.myPauseBtn').click(function() {that.paused.apply(that)});
					$(toChange).find(".goodState").toggleClass("currentState", this.model.get("running"));
					$(toChange).find(".badState").toggleClass("currentState", !this.model.get("running"));
					$(toChange).find(".howManyBought").text("Bought : " + this.model.get("bought") + ' (' + this.model.get("count") + "/" + this.model.get("maxAmount") + ')');
					$(toChange).find(".buildingName").text(Game.ObjectsById[this.model.get("buildingId")].name);
					$(toChange).find(".buildingName").toggleClass("superGood", this.model.get("running"));
					$(toChange).find(".buildingName").toggleClass("superBad", !this.model.get("running"));
					$(toChange).toggleClass("tabElemDone", this.model.get("count") >= this.model.get("maxAmount"));
					return (this);
				},
				removed: function() {
					var that = this;
					this.$el.fadeOut("fast", function () {
						that.model.stop();
						that.model.set({again: false});
						that.model.destroy();
						CookieCheat.collections.buildingsCollection.remove(that.model);
						that.remove();
					});
				},
				went: function() {
					this.model.go();
				},
				paused: function() {
					this.model.stop();
				}
			}),
 
			UpgradeFormView: Backbone.View.extend({
				elName: '#newUpgradeForm',
				addOne: function (id) {
					var m = new CookieCheat.Models.AutoBuyUpgrade({
						upgradeId: id
					});
					if (!m.isValid())
						alert(m.validationError);
					else {
						CookieCheat.collections.upgradesCollection.add(m);
						m.save();
					}
				},
				initialize: function() {
					CookieCheat.upgradeNames = {};
					_.each(_.pluck(Game.UpgradesById, "name"), function (item) {
						CookieCheat.upgradeNames[item.toLowerCase()] = item;
					});
					this.render();
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).find('#newAutoBuyUpgradesButton').off("click");
					$(toChange).find('#newAutoBuyUpgradesButton').click(function(e) {that.clicked.call(that, e);});
					for (var i in Game.UpgradesById) {
						if (!Game.UpgradesById[i].bought && CookieCheat.upgradeBlacklist.indexOf(Game.UpgradesById[i].name) === -1)
							$(toChange).find("#selectUpgrade").append('<option value="' + i + '">' + Game.UpgradesById[i].name + '</option>');
					}
					return (this);
				},
				clicked: function(e) {
					e.preventDefault();
					var toChange = $(this.elName);
					var id;
					var selected = $(toChange).find("#selectUpgrade").val();
					if ($(toChange).find("#enterNameUpgrade").val().length > 0) {
						var tmp = CookieCheat.upgradeNames[$(toChange).find("#enterNameUpgrade").val().toLowerCase()];
						id = (tmp) ? Game.Upgrades[tmp].id : -1;
					}
					else
						id = selected;
 
					if (id === selected && selected !== 'all') {
						this.addOne(parseInt(id, 10));
					}
					else if (selected === "all") {
						for (var i in Game.UpgradesById) {
							if (!Game.UpgradesById[i].bought && CookieCheat.upgradeBlacklist.indexOf(Game.UpgradesById[i].name) === -1)
								this.addOne(Game.UpgradesById[i].id);
						}
					}
					this.render();
				}
			}),
			UpgradeListView: Backbone.View.extend({
				elName: '#upgradesListContainer',
				initialize: function() {
					var that = this;
					this.template = _.template(CookieCheat.miscVars.specialTemplate);
					this.listenTo(this.collection, "add", function() {that.update(); that.render();});
					this.listenTo(this.collection, "remove", function() {that.update(); that.render();});
					this.update();
					this.render();
					return (this);
				},
				update: function() {
					CookieCheat.views.upgradeViews = [];
					_.each(this.collection.models, function (item) {
						CookieCheat.views.upgradeViews.push(new CookieCheat.Views.UpgradeView({model:item}));
					});
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).toggleClass("superHidden", CookieCheat.views.upgradeViews.length === 0);
					$(toChange).html("");
					if (CookieCheat.views.upgradeViews.length > 0) {
						$(toChange).append(this.template());
						$(toChange).find('.myPauseAllBtn').off("click");
						$(toChange).find('.myPauseAllBtn').click(function(e) {that.pauseAll.call(that, e);});
						$(toChange).find('.myRemoveAllBtn').off("click");
						$(toChange).find('.myRemoveAllBtn').click(function(e) {that.removeAll.call(that, e);});
						$(toChange).find('.myGoAllBtn').off("click");
						$(toChange).find('.myGoAllBtn').click(function(e) {that.goAll.call(that, e);});
						$(toChange).find('.myRemoveDoneBtn').off("click");
						$(toChange).find('.myRemoveDoneBtn').click(function(e) {that.removeBought.call(that, e);});
					}
					_.each(CookieCheat.views.upgradeViews, function (item) {
						$(toChange).append(item.render().$el);
					});
					return (this);
				},
				goAll: function () {
					_.each(CookieCheat.views.upgradeViews, function (view) {view.model.go();});
				},
				pauseAll: function () {
					_.each(CookieCheat.views.upgradeViews, function (view) {view.model.stop();});
				},
				removeAll: function () {
					_.each(CookieCheat.views.upgradeViews, function (view) {
						view.model.stop();
						view.model.destroy();
						CookieCheat.collections.upgradesCollection.remove(view.model);
						view.remove();
					});
				},
				removeBought: function () {
					_.each(CookieCheat.views.upgradeViews, function (view) {
						if (Game.UpgradesById[view.model.get("upgradeId")].bought > 0) {
							view.model.stop();
							view.model.destroy();
							CookieCheat.collections.upgradesCollection.remove(view.model);
							view.remove();
						}
					});
				}
			}),
			UpgradeView: Backbone.View.extend({
				tagName: "div",
				className: "tabElem",
				initialize: function() {
					this.listenTo(this.model, "change", this.render);
					this.template = _.template(CookieCheat.miscVars.upgradeTemplate);
					return (this);
				},
				render: function() {
					this.$el.html(this.template());
					var toChange = this.$el;
					$(toChange).find('.myGoBtn').off("click");
					$(toChange).find('.myPauseBtn').off("click");
					$(toChange).find('.myRemoveBtn').off("click");
					var that = this;
					$(toChange).find('.myRemoveBtn').click(function() {that.removed.apply(that)});
					$(toChange).find('.myGoBtn').click(function() {that.went.apply(that)});
					$(toChange).find('.myPauseBtn').click(function() {that.paused.apply(that)});
					$(toChange).find(".goodState").toggleClass("currentState", this.model.get("running"));
					$(toChange).find(".badState").toggleClass("currentState", !this.model.get("running"));
					$(toChange).find(".unlockedOrNot").text((Game.UpgradesById[that.model.get("upgradeId")].unlocked ? "Unlocked" : "Locked"));
					$(toChange).find(".unlockedOrNot").toggleClass("superGood", Game.UpgradesById[that.model.get("upgradeId")].unlocked);
					$(toChange).find(".unlockedOrNot").toggleClass("superBad", !Game.UpgradesById[that.model.get("upgradeId")].unlocked);
					$(toChange).find(".upgradeName").text(Game.UpgradesById[this.model.get("upgradeId")].name);
					$(toChange).find(".upgradeName").toggleClass("superGood", this.model.get("running"));
					$(toChange).find(".upgradeName").toggleClass("superBad", !this.model.get("running"));
					$(toChange).toggleClass("tabElemDone", Game.UpgradesById[that.model.get("upgradeId")].bought > 0);
					return (this);
				},
				removed: function() {
					var that = this;
					this.$el.fadeOut("slow", function () {
						that.model.stop();
						that.model.destroy();
						CookieCheat.collections.upgradesCollection.remove(that.model);
						that.remove();
					});
				},
				went: function() {
					this.model.go();
				},
				paused: function() {
					this.model.stop();
				}
			}),
 
			SaveFormView: Backbone.View.extend({
				elName: '#newSaveForm',
				initialize: function() {
					this.render();
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).find('#newSaveButton').off("click");
					$(toChange).find('#newSaveButton').click(function(e) {that.clicked.call(that, e);});
					$(toChange).find('#selectSaveCode').off("change");
					$(toChange).find('#selectSaveCode').change(function(e) {that.changed.call(that, e);});
					return (this);
				},
				clicked: function(e) {
					e.preventDefault();
					var toChange = $(this.elName);
					
					var m = new CookieCheat.Models.SaveModel({
						name: ($(toChange).find("#enterNameSave").val().length > 0) ? $(toChange).find("#enterNameSave").val() : "noname",
						code: ($(toChange).find("#saveCode").val().length > 0) ? $(toChange).find("#saveCode").val() : CookieCheat.miscVars.newGame,
						asked: false
					});
					if (!m.isValid())
						alert(m.validationError);
					else {
						CookieCheat.collections.savesCollection.add(m);
						$(toChange).find("#enterNameSave").val("");
						m.save();
						this.render();
					}
				},
				changed: function (e) {
					var toChange = $(this.elName);
					var val = $(toChange).find("#selectSaveCode").val();
					if (val === "manual") {
						$(toChange).find("#saveCode").removeAttr("disabled");
						$(toChange).find("#saveCode").val("");
						$(toChange).find("#saveCode").attr("placeholder", "Paste your code here");
					}
					else if (val === "current") {
						$(toChange).find("#saveCode").removeAttr("placeholder");
						$(toChange).find("#saveCode").val(Game.WriteSave(1));
						$(toChange).find("#saveCode").attr("disabled", "1");
					}
					else {
						$(toChange).find("#saveCode").removeAttr("placeholder");
						$(toChange).find("#saveCode").val($(toChange).find("#selectSaveCode").val());
						$(toChange).find("#saveCode").attr("disabled", "1");
					}
					this.render();
				}
			}),
			SaveListView: Backbone.View.extend({
				elName: '#savesListContainer',
				initialize: function() {
					var that = this;
					this.listenTo(this.collection, "add", function() {that.update(); that.render();});
					this.listenTo(this.collection, "remove", function() {that.update(); that.render();});
					this.noAsked();
					this.update();
					this.render();
					return (this);
				},
				update: function() {
					CookieCheat.views.saveViews = [];
					_.each(this.collection.models, function (item) {
						CookieCheat.views.saveViews.push(new CookieCheat.Views.SaveView({model:item}));
					});
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).toggleClass("superHidden", CookieCheat.views.saveViews.length === 0);
					$(toChange).html("");
					_.each(CookieCheat.views.saveViews, function (item) {
						$(toChange).append(item.render().$el);
					});
					return (this);
				},
				noAsked: function () {
					_.each(this.collection.models, function (model) {
						model.set({asked: false});
					});
				}
			}),
			SaveView: Backbone.View.extend({
				tagName: "div",
				className: "tabElem",
				initialize: function() {
					this.listenTo(this.model, "change", this.render);
					this.template = _.template(CookieCheat.miscVars.saveTemplate);
					return (this);
				},
				render: function() {
					this.$el.html(this.template());
					var toChange = this.$el;
					$(toChange).find('.myLoadBtn').off("click");
					$(toChange).find('.myRemoveBtn').off("click");
					$(toChange).find('.saveName').off("dblclick");
					$(toChange).find('.enterNameSave').off("blur");
					$(toChange).find('.myExportBtn').off("click");
					$(toChange).find('.mySaveHereBtn').off("click");
 
					var that = this;
					$(toChange).find('.mySaveHereBtn').click(function() {that.savedHere.apply(that)});
					$(toChange).find('.myExportBtn').click(function() {that.exported.apply(that)});
					$(toChange).find('.myLoadBtn').click(function() {that.loaded.apply(that)});
					$(toChange).find('.myRemoveBtn').click(function() {that.removed.apply(that)});
					$(toChange).find('.saveName').dblclick(function() {that.dblclicked.apply(that)});
					$(toChange).find('.enterNameSave').blur(function() {that.blured.apply(that)});
					$(toChange).find('.saveName').text(this.model.get("name"));
					$(toChange).find('.saveDate').text("Created : " + new Date(this.model.get("date")).toUTCString());
 
					return (this);
				},
				savedHere: function() {
					var that = this;
					if (this.model.get("asked") || confirm("Do you want to overwrite " + this.model.get("name") + " with your current save ? (You won't be asked again to save here !)")) {
						this.model.saveGame(Game.WriteSave(1));
						this.model.set({asked: false});
						CookieCheat.views.saveListView.noAsked();
						this.model.save();
						this.model.set({asked: true});
						CookieCheat.currentSave = this.model;
						Game.Popup("Game succesfully saved in the cheat interface !");
					}
				},
				removed: function() {
					var that = this;
					if (confirm("Do you really want to remove [" + this.model.get("name") + "] ?")) {
						this.$el.fadeOut("fast", function () {
							that.model.destroy();
							CookieCheat.collections.savesCollection.remove(that.model);
							that.remove();
						});
					}
				},
				exported: function() {
					prompt('Here is your exported save !', this.model.get("code"));
				},
				loaded: function() {
					if (confirm("Do you want to save before loading another game ?")) {
						if (typeof CookieCheat.currentSave !== "undefined" && CookieCheat.currentSave.get("asked") === true) {
							CookieCheat.currentSave.saveGame(Game.WriteSave(1));
							CookieCheat.currentSave.set({asked: false});
							CookieCheat.currentSave.save();
						}
						else {
							m = new CookieCheat.Models.SaveModel({
								name: "Safe save",
								code: Game.WriteSave(1),
							});
							CookieCheat.collections.savesCollection.add(m);
							m.save();
						}
					}
					CookieCheat.views.saveListView.noAsked();
					CookieCheat.currentSave = this.model;
					Game.LoadSave(this.model.get("code"));
				},
				dblclicked: function() {
					var toChange = this.$el;
					$(toChange).find('.saveName').hide();
					$(toChange).find('.enterNameSave').val(this.model.get("name"));
					$(toChange).find('.enterNameSave').show();
					$(toChange).find('.enterNameSave').select();
				},
				blured: function() {
					var toChange = this.$el;
					var newName = $(toChange).find('.enterNameSave').val() + "";
					if ((newName).length < 1)
						newName = "noname";
					$(toChange).find('.enterNameSave').hide();
					this.model.set({name: newName});
					$(toChange).find('.saveName').val(this.model.get("name"));
					$(toChange).find('.saveName').show();
					this.model.save();
				}
			}),
 
			ChoiceListView: Backbone.View.extend({
				elName: '#choicesListContainer',
				initialize: function() {
					var that = this;
					this.listenTo(this.collection, "add", function() {that.update(); that.render();});
					this.listenTo(this.collection, "remove", function() {that.update(); that.render();});
					this.update();
					this.render();
					return (this);
				},
				update: function() {
					var that = this;
					CookieCheat.views.choiceViews = [];
					_.each(this.collection.models, function (item) {
						CookieCheat.views.choiceViews.push(new CookieCheat.Views.ChoiceView({model:item, collection: that.collection}));
					});
					return (this);
				},
				render: function() {
					var toChange = $(this.elName);
					var that = this;
					$(toChange).toggleClass("superHidden", CookieCheat.views.choiceViews.length === 0);
					$(toChange).html("");
					_.each(CookieCheat.views.choiceViews, function (item) {
						$(toChange).append(item.render().$el);
					});
					return (this);
				}
			}),
			ChoiceView: Backbone.View.extend({
				tagName: "div",
				className: "tabElem",
				initialize: function() {
					this.listenTo(this.model, "change", this.render);
					this.template = _.template(CookieCheat.miscVars.choiceTemplate);
					return (this);
				},
				render: function() {
					this.$el.html(this.template());
					var toChange = this.$el;
					var active = this.model.get("active");
					$(toChange).find('.myToggleBtn').off("click");
					$(toChange).find('.mySpawnBtn').off("click");
					var that = this;
					$(toChange).find('.myToggleBtn').click(function() {that.toggle.apply(that)});
					$(toChange).find('.mySpawnBtn').click(function() {that.spawnNow.apply(that)});
					$(toChange).find(".goodState").toggleClass("currentState", active);
					$(toChange).find(".badState").toggleClass("currentState", !active);
					$(toChange).find(".activeOrNot").text((active) ? "Active" : "Inactive");
					$(toChange).find(".activeOrNot").toggleClass("superGood", active);
					$(toChange).find(".activeOrNot").toggleClass("superBad", !active);
					$(toChange).find(".choiceName").text(this.model.get("name"));
					$(toChange).find(".choiceName").toggleClass("superGood", active);
					$(toChange).find(".choiceName").toggleClass("superBad", !active);
					return (this);
				},
				spawnNow: function () {
					CookieCheat.executeChoice(this.model.toJSON());
				},
				toggle: function () {
					this.model.set({active: !this.model.get("active")});
					if (!this.model.get("active") && Game.goldenCookie.chainName === this.model.get("name"))
						Game.goldenCookie.chain = 0;
					this.model.save();
					this.collection.computeAndApply();
				}
			})
		};
	};
 
	CookieCheat.addButton = function () {
		$("#comments").append('<div id="cheatButton" class="warning button"><span style="top: -8px;font-size: 0.8em;position: relative;">More<br>Cheats</span></div>');
		l("cheatButton").onclick = function() {
			Game.ShowMenu('cheats');
		};
	};
 
	CookieCheat.processMs = function (amount) {
		var result = "", len;
		var _results = [];
		if (amount === Infinity)
			return 'a very long time...';
		var _datas = {
			years: {
				name: "year",
				plural: "years",
				num: 1000 * 60 * 60 * 24 * 30 * 12
			},
			months: {
				name: "month",
				plural: "months",
				num: 1000 * 60 * 60 * 24 * 30
			},
			days: {
				name: "day",
				plural: "days",
				num: 1000 * 60 * 60 * 24
			},
			hours: {
				name: "h",
				num: 1000 * 60 * 60
			},
			minutes: {
				name: "min",
				plural: "mins",
				num: 1000 * 60
			},
			seconds: {
				name: "sec",
				num: 1000
			},
			milliseconds: {
				name: "ms",
				num: 1
			}
		};
		_.each(_datas, function (data) {
			var tmpVal = 0;
			tmpVal = Math.floor(amount / data.num);
			amount -= (data.num * tmpVal);
			if (tmpVal != 0) {
				_results.push(tmpVal + ' ' + ((typeof data.plural !== "undefined" && tmpVal > 1) ? data.plural : data.name));
			}
		});
		len = _results.length;
		_.each(_results, function (str, index) {
			result += str;
			if (index === len - 1)
				result += '.';
			else
				result += ', ';
		});
		return result;
	};
 
	CookieCheat.protectToKeepSafe = function () {
		var replaceW1 = "var q = false;if ( !! CookieCheat.godMustCheck && (Game.cookies - price < CookieCheat.cookieToKeep)) q = confirm('The CookieGod warns you about the safe cookies... Are you sure ?');else if (!CookieCheat.godMustCheck || (Game.cookies - price >= CookieCheat.cookieToKeep && CookieCheat.godMustCheck)) q = true;if (q && Game.cookies >= price)";
		var replaceW2 = "var q = false;if ( !! CookieCheat.godMustCheck && (Game.cookies - price < CookieCheat.cookieToKeep)) q = confirm('The CookieGod warns you about the safe cookies... Are you sure ?');else if (!CookieCheat.godMustCheck || (Game.cookies - price >= CookieCheat.cookieToKeep && CookieCheat.godMustCheck)) q = true;if (q && Game.cookies>=price && !this.bought)";
		_.each(Game.ObjectsById, function (object, pos, collec) {
			var tmp = object.buy.toString().replace("if (Game.cookies>=price)",	replaceW1);
			tmp = tmp.substring(tmp.indexOf('{') + 1, tmp.lastIndexOf("}"));
			collec[pos].buy = new Function("amount", tmp);
		});
		_.each(Game.UpgradesById, function (upgrade, pos, collec) {
			var tmp = upgrade.buy.toString().replace("if (Game.cookies>=price && !this.bought)", replaceW2);
			tmp = tmp.substring(tmp.indexOf('{') + 1, tmp.lastIndexOf("}"));
			collec[pos].buy = new Function(tmp);
		});
	};
 
	// Base hashs
 
	CookieCheat.howManyCookies = function (type, vals, fixAdd, ctx) {
		if (!fixAdd)
			fixAdd = 0;
		if (!vals)
			return 0;
		if (!type)
			type = "min";
		if (typeof vals === "string" || !Array.isArray(vals))
			vals = [vals];
 
		if (!ctx)
			ctx = this;
 
		vals = _.map(vals, function (val) {
			if (typeof val === "string")
				val = new Function("return " + val);
			return (_.isFunction(val) ? val.call(ctx) : val);
		});
		if (typeof fixAdd === "function")
			fixAdd = fixAdd.call(ctx);
 
		var res = -1;
 
		if (type === "min") {
			vals.sort(function (a, b) {
				return (a - b);
			});
			res = vals[0]
		} else if (type === "max") {
			vals.sort(function (a, b) {
				return (b - a);
			});
			res = vals[0]
		} else if (type === "random") {
			res = vals[Math.floor(Math.random() * vals.length)];
		} else if (type === "exact") {
			res = vals[0];
		}
		return (res < 0 ? 0 + fixAdd : res + fixAdd);
	};
 
	CookieCheat.parseOrAnd = function (arr, cur) {
		var res = '(';
		var that = this;
		var passed = false;
		cur = cur || "and"; // De base, on est dans un "ET"
		var separator = (cur === "or" ? " || " : " && ");
		if (_.isArray(arr)) {
			for (var i in arr) {
				var hash = arr[i];
				for (var key in hash) {
					if (key === "or" || key === "and") {
						if (passed)
							res += separator;
						res += CookieCheat.parseOrAnd.call(this, hash[key], key);
						passed = true;
					}
					else if (key === "val" || key === "vals" || key === "value" || key === "values") {
						if (Array.isArray(hash[key])) {
							_.each(hash[key], function (item, index) {
								if (typeof item === "function") {
									hash[key][index] = "(" + _.bind(item, that) + ")()";
								}
							});
						}
						if (passed)
							res += separator;
						if (Array.isArray(hash[key]))
							res += hash[key].join(separator);
						else
							res += (typeof hash[key] === "function" ? "(" + _.bind(hash[key], that) + ")()" : hash[key]);
						passed = true;
					}
				}
			}
		}
		else {
			var hash = arr;
			for (var key in hash) {
				if (key === "or" || key === "and") {
					if (passed)
						res += separator;
					res += CookieCheat.parseOrAnd.call(this, hash[key], key);
					passed = true;
				}
				else if (key === "val" || key === "vals" || key === "value" || key === "values") {
					if (Array.isArray(hash[key])) {
						_.each(hash[key], function (item, index) {
							if (typeof item === "function") {
								hash[key][index] = "(" + _.bind(item, that) + ")()";
							}
						});
					}
					if (passed)
						res += separator;
					if (Array.isArray(hash[key]))
						res += hash[key].join(separator);
					else
						res += (typeof hash[key] === "function" ? "(" + _.bind(hash[key], that) + ")()" : hash[key]);
					passed = true;
				}
			}
		}
		res += ')';
		return (res);
	};
 
	CookieCheat.clone = function (hash) {
		var newObj;
		if (hash === null || typeof hash === "undefined")
			return hash;
		else if (typeof hash !== "string" && Array.isArray(hash)) {
			newObj = [];
			for (var i = 0, n = hash.length; i < n; i++) {
				newObj.push(CookieCheat.clone(hash[i]));
			}
		}
		else if (typeof hash === 'object' && hash.constructor === Object) {
			newObj = {};
			for (var key in hash) {
				if (typeof hash[key] !== "string" && Array.isArray(hash[key])) {
					newObj[key] = [];
					for (var i = 0, n = hash[key].length; i < n; i++) {
						newObj[key].push(CookieCheat.clone(hash[key][i]));
					}
				}
				else if (typeof hash[key] === 'object' && hash[key].constructor === Object) {
					newObj[key] = CookieCheat.clone(hash[key]);
				}
				else {
					newObj[key] = hash[key];
				}
			}
		}
		else
			newObj = hash;
		return (newObj);
	};
 
	CookieCheat.loadChoices = function () {
		CookieCheat.choices = {
			"frenzy": {
				active: true,
				name: "frenzy",
				condition: [{
					val: "Game.goldenCookie.wrath == 0"
				}],
				type: "cpsChange",
				message: "'Frenzy : cookie production x' + this.params.frenzy + ' for ' + this.realTime + ' seconds !'",
				recalculateGains: true,
				params: {
					frenzy: 7,
					baseTime: 77,
				}
			},
			"multiply cookies": {
				active: true,
				name: "multiply cookies",
				condition: [{
					val: "true"
				}],
				type: "cookieModif",
				message: "'Lucky ! +' + Beautify(this.cookies) + ' cookies !'",
				recalculateGains: false,
				params: {
					modifType: "earn",
					modifFunc: Game.Earn,
					type: "min",
					fixAdd: 13,
					vals: [
						"Game.cookies * 0.1",
						"Game.cookiesPs * 60 * 20"
					]
				}
			},
			"ruin cookies": {
				active: true,
				name: "ruin cookies",
				condition: [{
					val: "Game.goldenCookie.wrath > 0"
				}],
				type: "cookieModif",
				message: "'Ruin ! Lost ' + Beautify(this.cookies) + ' cookies !'",
				recalculateGains: false,
				params: {
					modifType: "lose",
					modifFunc: Game.Spend,
					type: "min",
					fixAdd: 13,
					val: [
						"Game.cookies * 0.05",
						"Game.cookiesPs * 60 * 10"
					]
				}
			},
			"blood frenzy": {
				active: true,
				name: "blood frenzy",
				condition: [{
					val: [
						"Game.goldenCookie.wrath > 0",
						"Math.random() < 0.3"
					]
				}],
				type: "cpsChange",
				message: "'Elder frenzy : cookie production x' + this.params.frenzy + ' for ' + this.realTime + ' seconds !'",
				recalculateGains: true,
				params: {
					frenzy: 666,
					baseTime: 6
				}
			},
			"clot": {
				active: true,
				name: "clot",
				condition: [{
					val: "Game.goldenCookie.wrath > 0"
				}],
				type: "cpsChange",
				message: "'Clot : cookie production halved for ' + this.realTime + ' seconds !'",
				recalculateGains: true,
				params: {
					frenzy: 0.5,
					baseTime: 66
				}
			},
			"auto click": {
				active: true,
				name: "auto click",
				condition: [{
					val: [
						"Math.random() < 0.05",
						"Game.cookieClicks > 1000"
					]
				}],
				type: "autoClick",
				message: "'Auto click ! Clicking ' + this.params.clicksPerSecond + ' times per second for ' + this.realTime + ' seconds !'",
				recalculateGains: false,
				params: {
					clicksPerSecond: 10,
					baseTime: 5
				}
			},
			"click frenzy": {
				active: true,
				name: "click frenzy",
				condition: [{
					val: "Math.random() < 0.05"
				}],
				type: "mouseChange",
				message: "'Click frenzy ! Clicking power x' + this.params.frenzy + ' for ' + this.realTime + ' seconds !'",
				recalculateGains: true,
				params: {
					frenzy: 777,
					baseTime: 13
				}
			},
			"chain cookie": {
				active: true,
				name: "chain cookie",
				condition: [{
					or: [{
						and: [{
							val: [
								"Game.cookiesEarned >= 100000",
								"Math.random() < 0.01"
							]
						}]
					}, {
						and: [{
							val: ["Game.goldenCookie.wrath > 0",
								"Math.random() < 0.3"
							]
						}]
					}]
				}],
				type: "chain",
				message: "(function () {" +
					"if (Game.goldenCookie.chain !== 0)" +
						"return 'Cookie chain : +' + Beautify(this.cookies) + ' cookies !';" +
					"else " +
						"return 'Cookie chain : +' + Beautify(this.cookies) + ' cookies !<br>Cookie chain over.';" +
					"}).call(this)",
				recalculateGains: false,
				params: {
					chainNumber: "i", // i = Game.goldenCookie.chain
					chainType: "cookieModif",
					chainStop: [{
						or: [{
							val: [
								"Math.random() < 0.1",
								'parseInt(this.cookies.toString() + this.cookies.toString()[0]) >= Game.cookies * 0.25',
								"this.cookies > Game.cookiesPs * 60 * 60 * 6"
							]
						}]
					}, {
						val: "this.chainRealNumber > 4"
					}],
 
					// Basic cookieModif params below
					modifType: "earn",
					modifFunc: Game.Earn,
					type: "exact",
					fixAdd: 0,
					val: "(function () {" +
						"var max = this.chainRealNumber;" +
						"var moni = '';" +
						"var digit = (Game.goldenCookie.wrath?'6':'7');" +
						"for (var i = 0; i < max; i++)" +
							"moni += digit;" +
							"return parseInt(moni);" +
						"}).call(this)"
				}
			},
			"chain multiplicator": {
				active: true,
				name: "chain multiplicator",
				condition: [{
					val: [
						"Math.random() < 0.01",
						"Game.cookiesEarned >= 1000000000",
						"Game.goldenCookie.wrath == 1",
						"Game.elderWrath > 1"
					]
				}],
				type: "chain",
				message: "(function () {" +
					"if (Game.goldenCookie.chain !== 0)" +
						"return 'Chain multiplicator : cookie production x' + this.params.frenzy + ' for ' + this.realTime + ' seconds !';" +
					"else " +
						"return 'Chain multiplicator : cookie production x' + this.params.frenzy + ' for ' + this.realTime + ' seconds !<br>Cookie chain over.';" +
					"}).call(this)",
				recalculateGains: true,
				params: {
					chainNumber: "4 + 0.5 * i", // i = Game.goldenCookie.chain
					chainType: "cpsChange",
					chainStop: [{
						or: [{
							vals: [
								"Math.random() < 0.1",
								"this.chainRealNumber > 15"
							]
						}],
						vals: "this.chainRealNumber > 4"
					}],
 
					// Basic cpschange params below
					frenzy: "this.chainRealNumber",
					baseTime: "20 + this.chainRealNumber * 3",
				}
			},
			"cheaper": {
				active: true,
				name: "cheaper",
				condition: [{
					vals: [
						"Math.random() < 0.2",
						"Game.HasAchiev('Architect')",
						"Game.HasAchiev('Mathematician')",
						"Game.HasAchiev('Base 10')"
					]
				}],
				type: "buildingSales",
				message: "'Cheaper : ' + this.params.buildingName + ' price x' + this.params.priceMultiplicator + ' for ' + this.realTime + ' seconds !'",
				recalculateGains: true,
				params: {
					baseTime: 12,
					priceMultiplicator: 0.2,
					buildingName: "choose(_.pluck(Game.ObjectsById, 'name'))"
				}
			}
		};
	};
 
	CookieCheat.updateMouseCps = function () {
		Game.mouseFrenzyPower = 1;
		CookieCheat.oldGameFuncs.mouseCps = Game.mouseCps;
		var newMouseCps = Game.mouseCps.toString().replace("if (Game.clickFrenzy>0) mult*=777", "if (Game.clickFrenzy > 0) mult *= (Game.mouseFrenzyPower || 777); else Game.mouseFrenzyPower = 1;")
		newMouseCps = newMouseCps.substring(newMouseCps.indexOf('{') + 1, newMouseCps.lastIndexOf("}"));
		Game.mouseCps = new Function(newMouseCps);
	};
 
	CookieCheat.executeChoice = function (hash) {
		var ctx = CookieCheat.clone(hash);
		var funcs = {
			"cpsChange": function(ctx) {
				var tmpTime = ctx.params.baseTime;
				if (typeof ctx.params.baseTime === "string")
					tmpTime = (new Function("return " + ctx.params.baseTime)).call(ctx);
				ctx.realTime = tmpTime + tmpTime * Game.Has('Get lucky');
				Game.frenzy = Game.fps * ctx.realTime;
				if (typeof ctx.params.frenzy === "string")
					ctx.params.frenzy = (new Function("return " + ctx.params.frenzy)).call(ctx);
				Game.frenzyPower = ctx.params.frenzy;
				funcs["finish"](ctx);
			},
			"cookieModif": function(ctx) {
				if (_.isUndefined(ctx.cookies))
					ctx.cookies = CookieCheat.howManyCookies(ctx.params.type, ctx.params.vals || ctx.params.val || ctx.params.value || ctx.params.values, ctx.params.fixAdd, ctx);
				if (typeof ctx.params.modifFunc !== "undefined")
					ctx.params.modifFunc(ctx.cookies);
				else {
					var f = (ctx.params.modifType === "earn" ? Game.Earn : Game.Spend);
					f(ctx.cookies);
				}
				funcs["finish"](ctx);
			},
			"chain": function(ctx) {
				Game.goldenCookie.chainName = ctx.name;
				Game.goldenCookie.chain++;
				ctx.chainRealNumber = (new Function("i", "return " + ctx.params.chainNumber)).call(ctx, Game.goldenCookie.chain);
				if (ctx.params.chainType === "cookieModif")
					ctx.cookies = CookieCheat.howManyCookies(ctx.params.type, ctx.params.vals || ctx.params.val || ctx.params.value || ctx.params.values, ctx.params.fixAdd, ctx);
				if ((new Function("return " + CookieCheat.parseOrAnd(ctx.params.chainStop))).call(ctx))
					Game.goldenCookie.chain = 0;
				funcs[ctx.params.chainType](ctx);
			},
			"autoClick": function(ctx) {
				var tmpTime = ctx.params.baseTime;
				if (typeof ctx.params.baseTime === "string")
					tmpTime = (new Function("return " + ctx.params.baseTime)).call(ctx);
				ctx.realTime = tmpTime + tmpTime * Game.Has('Get lucky');
				if (typeof ctx.params.clicksPerSecond === "string")
					ctx.params.clicksPerSecond = (new Function("return " + ctx.params.clicksPerSecond)).call(ctx);
				ctx.clickInterval = 1000 / ctx.params.clicksPerSecond;
				var f = function (clicks) {
					if (clicks > 0) {
						Game.ClickCookie();
						setTimeout(function() {f(clicks - 1);}, ctx.clickInterval);
					}
				};
				f(ctx.realTime * ctx.params.clicksPerSecond);
				funcs["finish"](ctx);
			},
			"mouseChange": function(ctx) {
				var tmpTime = ctx.params.baseTime;
				if (typeof ctx.params.baseTime === "string")
					tmpTime = (new Function("return " + ctx.params.baseTime)).call(ctx);
				ctx.realTime = tmpTime + tmpTime * Game.Has('Get lucky');
				if (typeof ctx.params.frenzy === "string")
					ctx.params.frenzy = (new Function("return " + ctx.params.frenzy)).call(ctx);
				Game.mouseFrenzyPower = ctx.params.frenzy;
				Game.clickFrenzy = Game.fps * ctx.realTime;
				funcs["finish"](ctx);
			},
			"buildingSales": function(ctx) {
				var tmpTime = ctx.params.baseTime;
				if (typeof ctx.params.baseTime === "string")
					tmpTime = (new Function("return " + ctx.params.baseTime)).call(ctx);
				ctx.realTime = tmpTime + tmpTime * Game.Has('Get lucky');
				if (typeof ctx.params.priceMultiplicator === "string")
					ctx.params.priceMultiplicator = (new Function("return " + ctx.params.priceMultiplicator)).call(ctx);
				if (typeof ctx.params.buildingName === "string")
					ctx.params.buildingName = (new Function("return " + ctx.params.buildingName)).call(ctx);
				if (typeof Game.Objects[ctx.params.buildingName].oldBasePrice === "undefined" || Game.Objects[ctx.params.buildingName].oldBasePrice === Game.Objects[ctx.params.buildingName].basePrice)
					Game.Objects[ctx.params.buildingName].oldBasePrice = Game.Objects[ctx.params.buildingName].basePrice;
				Game.Objects[ctx.params.buildingName].basePrice = Game.Objects[ctx.params.buildingName].oldBasePrice * ctx.params.priceMultiplicator;
				Game.Objects[ctx.params.buildingName].currentTime = 0;
				Game.Objects[ctx.params.buildingName].stopTime = ctx.realTime;
				Game.Objects[ctx.params.buildingName].refresh();
				Game.storeToRebuild = 1;
				var f = function () {
					if (Game.Objects[ctx.params.buildingName].currentTime == Game.Objects[ctx.params.buildingName].stopTime) {
						Game.Objects[ctx.params.buildingName].basePrice = Game.Objects[ctx.params.buildingName].oldBasePrice;
						Game.Objects[ctx.params.buildingName].refresh();
						Game.storeToRebuild = 1;
					}
					else {
						Game.Objects[ctx.params.buildingName].currentTime += 1;
						setTimeout(f, 1000);
					}
				};
				setTimeout(f, 1000);
				funcs["finish"](ctx);
			},
			"finish": function(ctx) {
				Game.Popup((new Function("return " + ctx.message)).call(ctx));
				if (ctx.recalculateGains)
					Game.recalculateGains = 1;
			}
		};
 
		funcs[hash.type](ctx);
	};
 
	CookieCheat.generateChooseFunc = function (choices) {
		var func = "var list = [];";
		for (var i in choices) {
			if (choices[i].active === true) {
				var tmp = 'if ' + CookieCheat.parseOrAnd.call(choices[i], choices[i].condition) + 'list.push("' + choices[i].name + '");';
				func += tmp;
			}
		}
		func += 'if (list.length > 1 && Game.goldenCookie.last != \'\' && Math.random() < 0.8 && list.indexOf(Game.goldenCookie.last) != -1)list.splice(list.indexOf(Game.goldenCookie.last), 1);return choose(list);';
		return (new Function(func));
	};
 
	CookieCheat.computeChoose = function() {
		Game.goldenCookie.choose = CookieCheat.generateChooseFunc(CookieCheat.choices);
	};
 
	CookieCheat.updateGoldenCookieclick = function () {
		CookieCheat.oldGameFuncs.goldenCookie = {
			click: Game.goldenCookie.click
		};
		l('goldenCookie').onclick = Game.goldenCookie.click = function() {
			if (Game.goldenCookie.life > 0) {
				Game.goldenCookie.toDie = 1;
				Game.goldenClicks++;
 
				if (Game.goldenClicks >= 1)
					Game.Win('Golden cookie');
				if (Game.goldenClicks >= 7)
					Game.Win('Lucky cookie');
				if (Game.goldenClicks >= 27)
					Game.Win('A stroke of luck');
				if (Game.goldenClicks >= 77)
					Game.Win('Fortune');
				if (Game.goldenClicks >= 777)
					Game.Win('Leprechaun');
				if (Game.goldenClicks >= 7777)
					Game.Win('Black cat\'s paw');
 
				if (Game.goldenClicks >= 7)
					Game.Unlock('Lucky day');
				if (Game.goldenClicks >= 27)
					Game.Unlock('Serendipity');
				if (Game.goldenClicks >= 77)
					Game.Unlock('Get lucky');
 
				l('goldenCookie').style.display = 'none';
 
				var choice = Game.goldenCookie.choose();
 
				if (Game.goldenCookie.chain > 0)
					choice = Game.goldenCookie.chainName;
 
				if (typeof choice !== "undefined") {
					Game.goldenCookie.last = choice;
 
					if (CookieCheat.choices[choice].type !== "chain")
						Game.goldenCookie.chain = 0;
 
					CookieCheat.executeChoice(CookieCheat.choices[choice]);
				}
				else {
					var f = function () {if (CookieCheat.timeToRemoveFace === 0) Game.removeClass("elderWrath"); else {CookieCheat.timeToRemoveFace--;setTimeout(f, 1000)}};
					Game.Popup("Nothing happened... Easter egg spotted !! Here is a face cookie.");
					Game.addClass("elderWrath");
					CookieCheat.timeToRemoveFace = 5;
					f();
				}
				Game.goldenCookie.minTime = Game.goldenCookie.getMinTime();
				Game.goldenCookie.maxTime = Game.goldenCookie.getMaxTime();
			}
		};
	};
 
	CookieCheat.initAllBackbone = function () {
		CookieCheat.views.safeCookiesView = new CookieCheat.Views.SafeCookiesView();
 
		CookieCheat.views.earnCookiesView = new CookieCheat.Views.EarnCookiesView();
 
		CookieCheat.views.earnChipsView = new CookieCheat.Views.EarnChipsView();
 
		CookieCheat.models.autoClickWrinklersModel = new CookieCheat.Models.AutoClickWrinklersModel();
		CookieCheat.views.autoClickWrinklersView = new CookieCheat.Views.AutoClickWrinklersView({model: CookieCheat.models.autoClickWrinklersModel});
 
		CookieCheat.models.autoClickModel = new CookieCheat.Models.AutoClickModel();
		CookieCheat.views.autoClickView = new CookieCheat.Views.AutoClickView({model: CookieCheat.models.autoClickModel});
 
		CookieCheat.models.autoSpawnModel = new CookieCheat.Models.AutoSpawnModel();
		CookieCheat.views.autoSpawnView = new CookieCheat.Views.AutoSpawnView({model: CookieCheat.models.autoSpawnModel});
 
		CookieCheat.models.autoGoldenClickModel = new CookieCheat.Models.AutoGoldenClickModel();
		CookieCheat.views.autoGoldenClickView = new CookieCheat.Views.AutoGoldenClickView({model: CookieCheat.models.autoGoldenClickModel});
 
		CookieCheat.models.autoReindeerClickModel = new CookieCheat.Models.AutoReindeerClickModel();
		CookieCheat.views.autoReindeerClickView = new CookieCheat.Views.AutoReindeerClickView({model: CookieCheat.models.autoReindeerClickModel});
 
		CookieCheat.models.goldenSpawnModel = new CookieCheat.Models.GoldenSpawnModel();
		CookieCheat.views.goldenSpawnView = new CookieCheat.Views.GoldenSpawnView({model: CookieCheat.models.goldenSpawnModel});
 
		CookieCheat.collections.buildingsCollection = new CookieCheat.Collections.BuildingsCollection();
		CookieCheat.collections.buildingsCollection.fetch();
		CookieCheat.views.buildingFormView = new CookieCheat.Views.BuildingFormView();
		CookieCheat.views.buildingListView = new CookieCheat.Views.BuildingListView({collection: CookieCheat.collections.buildingsCollection});
 
		CookieCheat.collections.upgradesCollection = new CookieCheat.Collections.UpgradesCollection();
		CookieCheat.collections.upgradesCollection.fetch();
		CookieCheat.views.upgradeFormView = new CookieCheat.Views.UpgradeFormView();
		CookieCheat.views.upgradeListView = new CookieCheat.Views.UpgradeListView({collection: CookieCheat.collections.upgradesCollection});
 
		CookieCheat.collections.savesCollection = new CookieCheat.Collections.SavesCollection();
		CookieCheat.collections.savesCollection.fetch();
		CookieCheat.views.saveFormView = new CookieCheat.Views.SaveFormView();
		CookieCheat.views.saveListView = new CookieCheat.Views.SaveListView({collection: CookieCheat.collections.savesCollection});
 
		CookieCheat.collections.choicesCollection = new CookieCheat.Collections.ChoicesCollection();
		CookieCheat.collections.choicesCollection.fetch();
		if (CookieCheat.collections.choicesCollection.models.length === 0) {
			CookieCheat.collections.choicesCollection.getFromArray(CookieCheat.choices);
		}
		CookieCheat.collections.choicesCollection.computeAndApply();
		CookieCheat.views.choiceListView = new CookieCheat.Views.ChoiceListView({collection: CookieCheat.collections.choicesCollection});
	};
 
	CookieCheat.changeTab = function (name) {
		delete CookieCheat.old;
		CookieCheat.currentTab = name;
		Game.UpdateMenu();
	};
 
	Game.oldUpdateMenu = Game.UpdateMenu;
	CookieCheat.oldGameFuncs.UpdateMenu = Game.UpdateMenu;
	Game.UpdateMenu = function() {
		if (Game.onMenu !== 'cheats') {
			delete CookieCheat.old;
			return Game.oldUpdateMenu();
		}
		if (typeof CookieCheat.old !== "undefined")
			return;
		else
			CookieCheat.old = "Used";
		var str = '';
		if (Game.onMenu != '')
			str += '<div style="position:absolute;top:8px;right:8px;cursor:pointer;font-size:16px;" onclick="Game.ShowMenu(Game.onMenu);">X</div>';
		if (Game.onMenu === "cheats") { // Cheat menu here
			str += CookieCheat.strForFeatures.topHeadBand();
			if (CookieCheat.currentTab === "tools")
				str += CookieCheat.strForFeatures.tools();
			else if (CookieCheat.currentTab === "cheats")
				str += CookieCheat.strForFeatures.cheats();
			else if (CookieCheat.currentTab === "mods")
				str += CookieCheat.strForFeatures.mods();
		}
		l('menu').innerHTML = str;
		if (CookieCheat.currentTab === "tools") {
			CookieCheat.views.safeCookiesView.render();
			CookieCheat.views.buildingFormView.render();
			CookieCheat.views.buildingListView.render();
			CookieCheat.views.upgradeFormView.render();
			CookieCheat.views.upgradeListView.render();
			CookieCheat.views.saveFormView.render();
			CookieCheat.views.saveListView.render();
		}
		else if (CookieCheat.currentTab === "cheats") {
			CookieCheat.views.earnCookiesView.render();
			CookieCheat.views.earnChipsView.render();
			CookieCheat.views.autoClickView.render();
			CookieCheat.views.autoSpawnView.render();
			CookieCheat.views.autoGoldenClickView.render();
			CookieCheat.views.autoReindeerClickView.render();
			CookieCheat.views.goldenSpawnView.render();
			CookieCheat.views.autoClickWrinklersView.render();
		}
		else if (CookieCheat.currentTab === "mods") {
			CookieCheat.views.choiceListView.render();
		}
	}
 
	CookieCheat.launch();
}