/*
Script: Core.js
	MooTools - My Object Oriented JavaScript Tools.

License:
	MIT-style license.

Copyright:
	Copyright (c) 2006-2007 [Valerio Proietti](http://mad4milk.net/).

Code & Documentation:
	[The MooTools production team](http://mootools.net/developers/).

Inspiration:
	- Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
	- Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
*/

var MooTools = {
	'version': '1.2.0',
	'build': ''
};
      
var Native = function(options){
	options = options || {};

	var afterImplement = options.afterImplement || function(){};
	var generics = options.generics;
	generics = (generics !== false);
	var legacy = options.legacy;
	var initialize = options.initialize;
	var protect = options.protect;
	var name = options.name;

	var object = initialize || legacy;

	object.constructor = Native;
	object.$family = {name: 'native'};
	if (legacy && initialize) object.prototype = legacy.prototype;
	object.prototype.constructor = object;

	if (name){
		var family = name.toLowerCase();
		object.prototype.$family = {name: family};
		Native.typize(object, family);
	}

	var add = function(obj, name, method, force){
		if (!protect || force || !obj.prototype[name]) obj.prototype[name] = method;
		if (generics) Native.genericize(obj, name, protect);
		afterImplement.call(obj, name, method);
		return obj;
	};
	
	object.implement = function(a1, a2, a3){
		if (typeof a1 == 'string') return add(this, a1, a2, a3);
		for (var p in a1) add(this, p, a1[p], a2);
		return this;
	};
	
	object.alias = function(a1, a2, a3){
		if (typeof a1 == 'string'){
			a1 = this.prototype[a1];
			if (a1) add(this, a2, a1, a3);
		} else {
			for (var a in a1) this.alias(a, a1[a], a2);
		}
		return this;
	};

	return object;
};

Native.implement = function(objects, properties){
	for (var i = 0, l = objects.length; i < l; i++) objects[i].implement(properties);
};

Native.genericize = function(object, property, check){
	if ((!check || !object[property]) && typeof object.prototype[property] == 'function') object[property] = function(){
		var args = Array.prototype.slice.call(arguments);
		return object.prototype[property].apply(args.shift(), args);
	};
};

Native.typize = function(object, family){
	if (!object.type) object.type = function(item){
		return ($type(item) === family);
	};
};

Native.alias = function(objects, a1, a2, a3){
	for (var i = 0, j = objects.length; i < j; i++) objects[i].alias(a1, a2, a3);
};

(function(objects){
	for (var name in objects) Native.typize(objects[name], name);
})({'boolean': Boolean, 'native': Native, 'object': Object});

(function(objects){
	for (var name in objects) new Native({name: name, initialize: objects[name], protect: true});
})({'String': String, 'Function': Function, 'Number': Number, 'Array': Array, 'RegExp': RegExp, 'Date': Date});

(function(object, methods){
	for (var i = methods.length; i--; i) Native.genericize(object, methods[i], true);
	return arguments.callee;
})
(Array, ['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice', 'toString', 'valueOf', 'indexOf', 'lastIndexOf'])
(String, ['charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'replace', 'search', 'slice', 'split', 'substr', 'substring', 'toLowerCase', 'toUpperCase', 'valueOf']);

function $chk(obj){
	return !!(obj || obj === 0);
};

function $clear(timer){
	clearTimeout(timer);
	clearInterval(timer);
	return null;
};

function $defined(obj){
	return (obj != undefined);
};

function $empty(){};

function $arguments(i){
	return function(){
		return arguments[i];
	};
};

function $lambda(value){
	return (typeof value == 'function') ? value : function(){
		return value;
	};
};

function $extend(original, extended){
	for (var key in (extended || {})) original[key] = extended[key];
	return original;
};

function $unlink(object){
	var unlinked;
	
	switch ($type(object)){
		case 'object':
			unlinked = {};
			for (var p in object) unlinked[p] = $unlink(object[p]);
		break;
		case 'hash':
			unlinked = $unlink(object.getClean());
		break;
		case 'array':
			unlinked = [];
			for (var i = 0, l = object.length; i < l; i++) unlinked[i] = $unlink(object[i]);
		break;
		default: return object;
	}
	
	return unlinked;
};

function $merge(){
	var mix = {};
	for (var i = 0, l = arguments.length; i < l; i++){
		var object = arguments[i];
		if ($type(object) != 'object') continue;
		for (var key in object){
			var op = object[key], mp = mix[key];
			mix[key] = (mp && $type(op) == 'object' && $type(mp) == 'object') ? $merge(mp, op) : $unlink(op);
		}
	}
	return mix;
};

function $pick(){
	for (var i = 0, l = arguments.length; i < l; i++){
		if (arguments[i] != undefined) return arguments[i];
	}
	return null;
};

function $random(min, max){
	return Math.floor(Math.random() * (max - min + 1) + min);
};

function $splat(obj){
	var type = $type(obj);
	return (type) ? ((type != 'array' && type != 'arguments') ? [obj] : obj) : [];
};

var $time = Date.now || function(){
	return new Date().getTime();
};

function $try(){
	for (var i = 0, l = arguments.length; i < l; i++){
		try {
			return arguments[i]();
		} catch(e){}
	}
	return null;
};

function $type(obj){
	if (obj == undefined) return false;
	if (obj.$family) return (obj.$family.name == 'number' && !isFinite(obj)) ? false : obj.$family.name;
	if (obj.nodeName){
		switch (obj.nodeType){
			case 1: return 'element';
			case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
		}
	} else if (typeof obj.length == 'number'){
		if (obj.callee) return 'arguments';
		else if (obj.item) return 'collection';
	}
	return typeof obj;
};

var Hash = new Native({

	name: 'Hash',

	initialize: function(object){
		if ($type(object) == 'hash') object = $unlink(object.getClean());
		for (var key in object) this[key] = object[key];
		return this;
	}

});

Hash.implement({
	
	getLength: function(){
		var length = 0;
		for (var key in this){
			if (this.hasOwnProperty(key)) length++;
		}
		return length;
	},

	forEach: function(fn, bind){
		for (var key in this){
			if (this.hasOwnProperty(key)) fn.call(bind, this[key], key, this);
		}
	},
	
	getClean: function(){
		var clean = {};
		for (var key in this){
			if (this.hasOwnProperty(key)) clean[key] = this[key];
		}
		return clean;
	}

});

Hash.alias('forEach', 'each');

function $H(object){
	return new Hash(object);
};

Array.implement({

	forEach: function(fn, bind){
		for (var i = 0, l = this.length; i < l; i++) fn.call(bind, this[i], i, this);
	}

});

Array.alias('forEach', 'each');

function $A(iterable){
	if (iterable.item){
		var array = [];
		for (var i = 0, l = iterable.length; i < l; i++) array[i] = iterable[i];
		return array;
	}
	return Array.prototype.slice.call(iterable);
};

function $each(iterable, fn, bind){
	var type = $type(iterable);
	((type == 'arguments' || type == 'collection' || type == 'array') ? Array : Hash).each(iterable, fn, bind);
};


/*
Script: Browser.js
	The Browser Core. Contains Browser initialization, Window and Document, and the Browser Hash.

License:
	MIT-style license.
*/

var Browser = new Hash({
	Engine: {name: 'unknown', version: ''},
	Platform: {name: (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()},
	Features: {xpath: !!(document.evaluate), air: !!(window.runtime)},
	Plugins: {}
});

if (window.opera) Browser.Engine = {name: 'presto', version: (document.getElementsByClassName) ? 950 : 925};
else if (window.ActiveXObject) Browser.Engine = {name: 'trident', version: (window.XMLHttpRequest) ? 5 : 4};
else if (!navigator.taintEnabled) Browser.Engine = {name: 'webkit', version: (Browser.Features.xpath) ? 420 : 419};
else if (document.getBoxObjectFor != null) Browser.Engine = {name: 'gecko', version: (document.getElementsByClassName) ? 19 : 18};
Browser.Engine[Browser.Engine.name] = Browser.Engine[Browser.Engine.name + Browser.Engine.version] = true;

if (window.orientation != undefined) Browser.Platform.name = 'ipod';

Browser.Platform[Browser.Platform.name] = true;

Browser.Request = function(){
	return $try(function(){
		return new XMLHttpRequest();
	}, function(){
		return new ActiveXObject('MSXML2.XMLHTTP');
	});
};

Browser.Features.xhr = !!(Browser.Request());

Browser.Plugins.Flash = (function(){
	var version = ($try(function(){
		return navigator.plugins['Shockwave Flash'].description;
	}, function(){
		return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
	}) || '0 r0').match(/\d+/g);
	return {version: parseInt(version[0] || 0 + '.' + version[1] || 0), build: parseInt(version[2] || 0)};
})();

function $exec(text){
	if (!text) return text;
	if (window.execScript){
		window.execScript(text);
	} else {
		var script = document.createElement('script');
		script.setAttribute('type', 'text/javascript');
		script.text = text;
		document.head.appendChild(script);
		document.head.removeChild(script);
	}
	return text;
};

Native.UID = 1;

var $uid = (Browser.Engine.trident) ? function(item){
	return (item.uid || (item.uid = [Native.UID++]))[0];
} : function(item){
	return item.uid || (item.uid = Native.UID++);
};

var Window = new Native({

	name: 'Window',

	legacy: (Browser.Engine.trident) ? null: window.Window,

	initialize: function(win){
		$uid(win);
		if (!win.Element){
			win.Element = $empty;
			if (Browser.Engine.webkit) win.document.createElement("iframe"); //fixes safari 2
			win.Element.prototype = (Browser.Engine.webkit) ? window["[[DOMElement.prototype]]"] : {};
		}
		return $extend(win, Window.Prototype);
	},

	afterImplement: function(property, value){
		window[property] = Window.Prototype[property] = value;
	}

});

Window.Prototype = {$family: {name: 'window'}};

new Window(window);

var Document = new Native({

	name: 'Document',

	legacy: (Browser.Engine.trident) ? null: window.Document,

	initialize: function(doc){
		$uid(doc);
		doc.head = doc.getElementsByTagName('head')[0];
		doc.html = doc.getElementsByTagName('html')[0];
		doc.window = doc.defaultView || doc.parentWindow;
		if (Browser.Engine.trident4) $try(function(){
			doc.execCommand("BackgroundImageCache", false, true);
		});
		return $extend(doc, Document.Prototype);
	},

	afterImplement: function(property, value){
		document[property] = Document.Prototype[property] = value;
	}

});

Document.Prototype = {$family: {name: 'document'}};

new Document(document);

/*
Script: Array.js
	Contains Array Prototypes like copy, each, contains, and remove.

License:
	MIT-style license.
*/

Array.implement({

	every: function(fn, bind){
		for (var i = 0, l = this.length; i < l; i++){
			if (!fn.call(bind, this[i], i, this)) return false;
		}
		return true;
	},

	filter: function(fn, bind){
		var results = [];
		for (var i = 0, l = this.length; i < l; i++){
			if (fn.call(bind, this[i], i, this)) results.push(this[i]);
		}
		return results;
	},
	
	clean: function() {
		return this.filter($defined);
	},

	indexOf: function(item, from){
		var len = this.length;
		for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){
			if (this[i] === item) return i;
		}
		return -1;
	},

	map: function(fn, bind){
		var results = [];
		for (var i = 0, l = this.length; i < l; i++) results[i] = fn.call(bind, this[i], i, this);
		return results;
	},

	some: function(fn, bind){
		for (var i = 0, l = this.length; i < l; i++){
			if (fn.call(bind, this[i], i, this)) return true;
		}
		return false;
	},

	associate: function(keys){
		var obj = {}, length = Math.min(this.length, keys.length);
		for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
		return obj;
	},

	link: function(object){
		var result = {};
		for (var i = 0, l = this.length; i < l; i++){
			for (var key in object){
				if (object[key](this[i])){
					result[key] = this[i];
					delete object[key];
					break;
				}
			}
		}
		return result;
	},

	contains: function(item, from){
		return this.indexOf(item, from) != -1;
	},

	extend: function(array){
		for (var i = 0, j = array.length; i < j; i++) this.push(array[i]);
		return this;
	},

	getLast: function(){
		return (this.length) ? this[this.length - 1] : null;
	},

	getRandom: function(){
		return (this.length) ? this[$random(0, this.length - 1)] : null;
	},

	include: function(item){
		if (!this.contains(item)) this.push(item);
		return this;
	},

	combine: function(array){
		for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
		return this;
	},

	erase: function(item){
		for (var i = this.length; i--; i){
			if (this[i] === item) this.splice(i, 1);
		}
		return this;
	},

	empty: function(){
		this.length = 0;
		return this;
	},

	flatten: function(){
		var array = [];
		for (var i = 0, l = this.length; i < l; i++){
			var type = $type(this[i]);
			if (!type) continue;
			array = array.concat((type == 'array' || type == 'collection' || type == 'arguments') ? Array.flatten(this[i]) : this[i]);
		}
		return array;
	},

	hexToRgb: function(array){
		if (this.length != 3) return null;
		var rgb = this.map(function(value){
			if (value.length == 1) value += value;
			return value.toInt(16);
		});
		return (array) ? rgb : 'rgb(' + rgb + ')';
	},

	rgbToHex: function(array){
		if (this.length < 3) return null;
		if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
		var hex = [];
		for (var i = 0; i < 3; i++){
			var bit = (this[i] - 0).toString(16);
			hex.push((bit.length == 1) ? '0' + bit : bit);
		}
		return (array) ? hex : '#' + hex.join('');
	}

});

/*
Script: Function.js
	Contains Function Prototypes like create, bind, pass, and delay.

License:
	MIT-style license.
*/

Function.implement({

	extend: function(properties){
		for (var property in properties) this[property] = properties[property];
		return this;
	},

	create: function(options){
		var self = this;
		options = options || {};
		return function(event){
			var args = options.arguments;
			args = (args != undefined) ? $splat(args) : Array.slice(arguments, (options.event) ? 1 : 0);
			if (options.event) args = [event || window.event].extend(args);
			var returns = function(){
				return self.apply(options.bind || null, args);
			};
			if (options.delay) return setTimeout(returns, options.delay);
			if (options.periodical) return setInterval(returns, options.periodical);
			if (options.attempt) return $try(returns);
			return returns();
		};
	},

	pass: function(args, bind){
		return this.create({arguments: args, bind: bind});
	},

	attempt: function(args, bind){
		return this.create({arguments: args, bind: bind, attempt: true})();
	},

	bind: function(bind, args){
		return this.create({bind: bind, arguments: args});
	},

	bindWithEvent: function(bind, args){
		return this.create({bind: bind, event: true, arguments: args});
	},

	delay: function(delay, bind, args){
		return this.create({delay: delay, bind: bind, arguments: args})();
	},

	periodical: function(interval, bind, args){
		return this.create({periodical: interval, bind: bind, arguments: args})();
	},

	run: function(args, bind){
		return this.apply(bind, $splat(args));
	}

});

/*
Script: Number.js
	Contains Number Prototypes like limit, round, times, and ceil.

License:
	MIT-style license.
*/

Number.implement({

	limit: function(min, max){
		return Math.min(max, Math.max(min, this));
	},

	round: function(precision){
		precision = Math.pow(10, precision || 0);
		return Math.round(this * precision) / precision;
	},

	times: function(fn, bind){
		for (var i = 0; i < this; i++) fn.call(bind, i, this);
	},

	toFloat: function(){
		return parseFloat(this);
	},

	toInt: function(base){
		return parseInt(this, base || 10);
	}

});

Number.alias('times', 'each');

(function(math){
	var methods = {};
	math.each(function(name){
		if (!Number[name]) methods[name] = function(){
			return Math[name].apply(null, [this].concat($A(arguments)));
		};
	});
	Number.implement(methods);
})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);

/*
Script: String.js
	Contains String Prototypes like camelCase, capitalize, test, and toInt.

License:
	MIT-style license.
*/

String.implement({

	test: function(regex, params){
		return ((typeof regex == 'string') ? new RegExp(regex, params) : regex).test(this);
	},

	contains: function(string, separator){
		return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1;
	},

	trim: function(){
		return this.replace(/^\s+|\s+$/g, '');
	},

	clean: function(){
		return this.replace(/\s+/g, ' ').trim();
	},

	camelCase: function(){
		return this.replace(/-\D/g, function(match){
			return match.charAt(1).toUpperCase();
		});
	},

	hyphenate: function(){
		return this.replace(/[A-Z]/g, function(match){
			return ('-' + match.charAt(0).toLowerCase());
		});
	},

	capitalize: function(){
		return this.replace(/\b[a-z]/g, function(match){
			return match.toUpperCase();
		});
	},

	escapeRegExp: function(){
		return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
	},

	toInt: function(base){
		return parseInt(this, base || 10);
	},

	toFloat: function(){
		return parseFloat(this);
	},

	hexToRgb: function(array){
		var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
		return (hex) ? hex.slice(1).hexToRgb(array) : null;
	},

	rgbToHex: function(array){
		var rgb = this.match(/\d{1,3}/g);
		return (rgb) ? rgb.rgbToHex(array) : null;
	},

	stripScripts: function(option){
		var scripts = '';
		var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(){
			scripts += arguments[1] + '\n';
			return '';
		});
		if (option === true) $exec(scripts);
		else if ($type(option) == 'function') option(scripts, text);
		return text;
	},

	substitute: function(object, regexp){
		return this.replace(regexp || (/\\?\{([^}]+)\}/g), function(match, name){
			if (match.charAt(0) == '\\') return match.slice(1);
			return (object[name] != undefined) ? object[name] : '';
		});
	}

});

/*
Script: Hash.js
	Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects.

License:
	MIT-style license.
*/

Hash.implement({

	has: Object.prototype.hasOwnProperty,

	keyOf: function(value){
		for (var key in this){
			if (this.hasOwnProperty(key) && this[key] === value) return key;
		}
		return null;
	},

	hasValue: function(value){
		return (Hash.keyOf(this, value) !== null);
	},

	extend: function(properties){
		Hash.each(properties, function(value, key){
			Hash.set(this, key, value);
		}, this);
		return this;
	},

	combine: function(properties){
		Hash.each(properties, function(value, key){
			Hash.include(this, key, value);
		}, this);
		return this;
	},

	erase: function(key){
		if (this.hasOwnProperty(key)) delete this[key];
		return this;
	},

	get: function(key){
		return (this.hasOwnProperty(key)) ? this[key] : null;
	},

	set: function(key, value){
		if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
		return this;
	},

	empty: function(){
		Hash.each(this, function(value, key){
			delete this[key];
		}, this);
		return this;
	},

	include: function(key, value){
		var k = this[key];
		if (k == undefined) this[key] = value;
		return this;
	},

	map: function(fn, bind){
		var results = new Hash;
		Hash.each(this, function(value, key){
			results.set(key, fn.call(bind, value, key, this));
		}, this);
		return results;
	},

	filter: function(fn, bind){
		var results = new Hash;
		Hash.each(this, function(value, key){
			if (fn.call(bind, value, key, this)) results.set(key, value);
		}, this);
		return results;
	},

	every: function(fn, bind){
		for (var key in this){
			if (this.hasOwnProperty(key) && !fn.call(bind, this[key], key)) return false;
		}
		return true;
	},

	some: function(fn, bind){
		for (var key in this){
			if (this.hasOwnProperty(key) && fn.call(bind, this[key], key)) return true;
		}
		return false;
	},

	getKeys: function(){
		var keys = [];
		Hash.each(this, function(value, key){
			keys.push(key);
		});
		return keys;
	},

	getValues: function(){
		var values = [];
		Hash.each(this, function(value){
			values.push(value);
		});
		return values;
	},
	
	toQueryString: function(base){
		var queryString = [];
		Hash.each(this, function(value, key){
			if (base) key = base + '[' + key + ']';
			var result;
			switch ($type(value)){
				case 'object': result = Hash.toQueryString(value, key); break;
				case 'array':
					var qs = {};
					value.each(function(val, i){
						qs[i] = val;
					});
					result = Hash.toQueryString(qs, key);
				break;
				default: result = key + '=' + encodeURIComponent(value);
			}
			if (value != undefined) queryString.push(result);
		});
		
		return queryString.join('&');
	}

});

Hash.alias({keyOf: 'indexOf', hasValue: 'contains'});

/*
Script: Event.js
	Contains the Event Native, to make the event object completely crossbrowser.

License:
	MIT-style license.
*/

var Event = new Native({

	name: 'Event',

	initialize: function(event, win){
		win = win || window;
		var doc = win.document;
		event = event || win.event;
		if (event.$extended) return event;
		this.$extended = true;
		var type = event.type;
		var target = event.target || event.srcElement;
		while (target && target.nodeType == 3) target = target.parentNode;
		
		if (type.test(/key/)){
			var code = event.which || event.keyCode;
			var key = Event.Keys.keyOf(code);
			if (type == 'keydown'){
				var fKey = code - 111;
				if (fKey > 0 && fKey < 13) key = 'f' + fKey;
			}
			key = key || String.fromCharCode(code).toLowerCase();
		} else if (type.match(/(click|mouse|menu)/i)){
			doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
			var page = {
				x: event.pageX || event.clientX + doc.scrollLeft,
				y: event.pageY || event.clientY + doc.scrollTop
			};
			var client = {
				x: (event.pageX) ? event.pageX - win.pageXOffset : event.clientX,
				y: (event.pageY) ? event.pageY - win.pageYOffset : event.clientY
			};
			if (type.match(/DOMMouseScroll|mousewheel/)){
				var wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
			}
			var rightClick = (event.which == 3) || (event.button == 2);
			var related = null;
			if (type.match(/over|out/)){
				switch (type){
					case 'mouseover': related = event.relatedTarget || event.fromElement; break;
					case 'mouseout': related = event.relatedTarget || event.toElement;
				}
				if (!(function(){
					while (related && related.nodeType == 3) related = related.parentNode;
					return true;
				}).create({attempt: Browser.Engine.gecko})()) related = false;
			}
		}

		return $extend(this, {
			event: event,
			type: type,
			
			page: page,
			client: client,
			rightClick: rightClick,
			
			wheel: wheel,
			
			relatedTarget: related,
			target: target,
			
			code: code,
			key: key,
			
			shift: event.shiftKey,
			control: event.ctrlKey,
			alt: event.altKey,
			meta: event.metaKey
		});
	}

});

Event.Keys = new Hash({
	'enter': 13,
	'up': 38,
	'down': 40,
	'left': 37,
	'right': 39,
	'esc': 27,
	'space': 32,
	'backspace': 8,
	'tab': 9,
	'delete': 46
});

Event.implement({

	stop: function(){
		return this.stopPropagation().preventDefault();
	},

	stopPropagation: function(){
		if (this.event.stopPropagation) this.event.stopPropagation();
		else this.event.cancelBubble = true;
		return this;
	},

	preventDefault: function(){
		if (this.event.preventDefault) this.event.preventDefault();
		else this.event.returnValue = false;
		return this;
	}

});

/*
Script: Class.js
	Contains the Class Function for easily creating, extending, and implementing reusable Classes.

License:
	MIT-style license.
*/

var Class = new Native({

	name: 'Class',

	initialize: function(properties){
		properties = properties || {};
		var klass = function(empty){
			for (var key in this) this[key] = $unlink(this[key]);
			for (var mutator in Class.Mutators){
				if (!this[mutator]) continue;
				Class.Mutators[mutator](this, this[mutator]);
				delete this[mutator];
			}

			this.constructor = klass;
			if (empty === $empty) return this;
			
			var self = (this.initialize) ? this.initialize.apply(this, arguments) : this;
			if (this.options && this.options.initialize) this.options.initialize.call(this);
			return self;
		};

		$extend(klass, this);
		klass.constructor = Class;
		klass.prototype = properties;
		return klass;
	}

});

Class.implement({

	implement: function(){
		Class.Mutators.Implements(this.prototype, Array.slice(arguments));
		return this;
	}

});

Class.Mutators = {
  
  Implements: function(self, klasses){
  	$splat(klasses).each(function(klass){
  		$extend(self, ($type(klass) == 'class') ? new klass($empty) : klass);
  	});
  },
  
  Extends: function(self, klass){
  	var instance = new klass($empty);
  	delete instance.parent;
  	delete instance.parentOf;

  	for (var key in instance){
  		var current = self[key], previous = instance[key];
  		if (current == undefined){
  			self[key] = previous;
  			continue;
  		}

  		var ctype = $type(current), ptype = $type(previous);
  		if (ctype != ptype) continue;

  		switch (ctype){
  			case 'function': 
  				// this code will be only executed if the current browser does not support function.caller (currently only opera).
  				// we replace the function code with brute force. Not pretty, but it will only be executed if function.caller is not supported.

  				if (!arguments.callee.caller) self[key] = eval('(' + String(current).replace(/\bthis\.parent\(\s*(\))?/g, function(full, close){
  					return 'arguments.callee._parent_.call(this' + (close || ', ');
  				}) + ')');

  				// end "opera" code
  				self[key]._parent_ = previous;
  			  break;
  			case 'object': self[key] = $merge(previous, current);
  		}

  	}

  	self.parent = function(){
  		return arguments.callee.caller._parent_.apply(this, arguments);
  	};

  	self.parentOf = function(descendant){
  		return descendant._parent_.apply(this, Array.slice(arguments, 1));
  	};
  }
  
};


/*
Script: Class.Extras.js
	Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.

License:
	MIT-style license.
*/

var Chain = new Class({

	chain: function(){
		this.$chain = (this.$chain || []).extend(arguments);
		return this;
	},

	callChain: function(){
		return (this.$chain && this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
	},

	clearChain: function(){
		if (this.$chain) this.$chain.empty();
		return this;
	}

});

var Events = new Class({

	addEvent: function(type, fn, internal){
		type = Events.removeOn(type);
		if (fn != $empty){
			this.$events = this.$events || {};
			this.$events[type] = this.$events[type] || [];
			this.$events[type].include(fn);
			if (internal) fn.internal = true;
		}
		return this;
	},

	addEvents: function(events){
		for (var type in events) this.addEvent(type, events[type]);
		return this;
	},

	fireEvent: function(type, args, delay){
		type = Events.removeOn(type);
		if (!this.$events || !this.$events[type]) return this;
		this.$events[type].each(function(fn){
			fn.create({'bind': this, 'delay': delay, 'arguments': args})();
		}, this);
		return this;
	},

	removeEvent: function(type, fn){
		type = Events.removeOn(type);
		if (!this.$events || !this.$events[type]) return this;
		if (!fn.internal) this.$events[type].erase(fn);
		return this;
	},

	removeEvents: function(type){
		for (var e in this.$events){
			if (type && type != e) continue;
			var fns = this.$events[e];
			for (var i = fns.length; i--; i) this.removeEvent(e, fns[i]);
		}
		return this;
	}

});

Events.removeOn = function(string){
	return string.replace(/^on([A-Z])/, function(full, first) {
		return first.toLowerCase();
	});
};

var Options = new Class({

	setOptions: function(){
		this.options = $merge.run([this.options].extend(arguments));
		if (!this.addEvent) return this;
		for (var option in this.options){
			if ($type(this.options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
			this.addEvent(option, this.options[option]);
			delete this.options[option];
		}
		return this;
	}

});

/*
Script: Element.js
	One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser,
	time-saver methods to let you easily work with HTML Elements.

License:
	MIT-style license.
*/

Document.implement({

	newElement: function(tag, props){
		if (Browser.Engine.trident && props){
			['name', 'type', 'checked'].each(function(attribute){
				if (!props[attribute]) return;
				tag += ' ' + attribute + '="' + props[attribute] + '"';
				if (attribute != 'checked') delete props[attribute];
			});
			tag = '<' + tag + '>';
		}
		return $.element(this.createElement(tag)).set(props);
	},

	newTextNode: function(text){
		return this.createTextNode(text);
	},

	getDocument: function(){
		return this;
	},

	getWindow: function(){
		return this.defaultView || this.parentWindow;
	},

	purge: function(){
		var elements = this.getElementsByTagName('*');
		for (var i = 0, l = elements.length; i < l; i++) Browser.freeMem(elements[i]);
	}

});

var Element = new Native({

	name: 'Element',

	legacy: window.Element,

	initialize: function(tag, props){
		var konstructor = Element.Constructors.get(tag);
		if (konstructor) return konstructor(props);
		if (typeof tag == 'string') return document.newElement(tag, props);
		return $(tag).set(props);
	},

	afterImplement: function(key, value){
		if (!Array[key]) Elements.implement(key, Elements.multi(key));
		Element.Prototype[key] = value;
	}

});

Element.Prototype = {$family: {name: 'element'}};

Element.Constructors = new Hash;

var IFrame = new Native({

	name: 'IFrame',

	generics: false,

	initialize: function(){
		var params = Array.link(arguments, {properties: Object.type, iframe: $defined});
		var props = params.properties || {};
		var iframe = $(params.iframe) || false;
		var onload = props.onload || $empty;
		delete props.onload;
		props.id = props.name = $pick(props.id, props.name, iframe.id, iframe.name, 'IFrame_' + $time());
		iframe = new Element(iframe || 'iframe', props);
		var onFrameLoad = function(){
			var host = $try(function(){
				return iframe.contentWindow.location.host;
			});
			if (host && host == window.location.host){
				var win = new Window(iframe.contentWindow);
				var doc = new Document(iframe.contentWindow.document);
				$extend(win.Element.prototype, Element.Prototype);
			}
			onload.call(iframe.contentWindow, iframe.contentWindow.document);
		};
		(!window.frames[props.id]) ? iframe.addListener('load', onFrameLoad) : onFrameLoad();
		return iframe;
	}

});

var Elements = new Native({

	initialize: function(elements, options){
		options = $extend({ddup: true, cash: true}, options);
		elements = elements || [];
		if (options.ddup || options.cash){
			var uniques = {}, returned = [];
			for (var i = 0, l = elements.length; i < l; i++){
				var el = $.element(elements[i], !options.cash);
				if (options.ddup){
					if (uniques[el.uid]) continue;
					uniques[el.uid] = true;
				}
				returned.push(el);
			}
			elements = returned;
		}
		return (options.cash) ? $extend(elements, this) : elements;
	}

});

Elements.implement({

	filter: function(filter, bind){
		if (!filter) return this;
		return new Elements(Array.filter(this, (typeof filter == 'string') ? function(item){
			return item.match(filter);
		} : filter, bind));
	}

});

Elements.multi = function(property){
	return function(){
		var items = [];
		var elements = true;
		for (var i = 0, j = this.length; i < j; i++){
			var returns = this[i][property].apply(this[i], arguments);
			items.push(returns);
			if (elements) elements = ($type(returns) == 'element');
		}
		return (elements) ? new Elements(items) : items;
	};
};

Window.implement({

	$: function(el, nocash){
		if (el && el.$family && el.uid) return el;
		var type = $type(el);
		return ($[type]) ? $[type](el, nocash, this.document) : null;
	},

	$$: function(selector){
		if (arguments.length == 1 && typeof selector == 'string') return this.document.getElements(selector);
		var elements = [];
		var args = Array.flatten(arguments);
		for (var i = 0, l = args.length; i < l; i++){
			var item = args[i];
			switch ($type(item)){
				case 'element': item = [item]; break;
				case 'string': item = this.document.getElements(item, true); break;
				default: item = false;
			}
			if (item) elements.extend(item);
		}
		return new Elements(elements);
	},

	getDocument: function(){
		return this.document;
	},

	getWindow: function(){
		return this;
	}

});

$.string = function(id, nocash, doc){
	id = doc.getElementById(id);
	return (id) ? $.element(id, nocash) : null;
};

$.element = function(el, nocash){
	$uid(el);
	if (!nocash && !el.$family && !(/^object|embed$/i).test(el.tagName)){
		var proto = Element.Prototype;
		for (var p in proto) el[p] = proto[p];
	};
	return el;
};

$.object = function(obj, nocash, doc){
	if (obj.toElement) return $.element(obj.toElement(doc), nocash);
	return null;
};

$.textnode = $.whitespace = $.window = $.document = $arguments(0);

Native.implement([Element, Document], {

	getElement: function(selector, nocash){
		return $(this.getElements(selector, true)[0] || null, nocash);
	},

	getElements: function(tags, nocash){
		tags = tags.split(',');
		var elements = [];
		var ddup = (tags.length > 1);
		tags.each(function(tag){
			var partial = this.getElementsByTagName(tag.trim());
			(ddup) ? elements.extend(partial) : elements = partial;
		}, this);
		return new Elements(elements, {ddup: ddup, cash: !nocash});
	}

});

Element.Storage = {

	get: function(uid){
		return (this[uid] || (this[uid] = {}));
	}

};

Element.Inserters = new Hash({

	before: function(context, element){
		if (element.parentNode) element.parentNode.insertBefore(context, element);
	},

	after: function(context, element){
		if (!element.parentNode) return;
		var next = element.nextSibling;
		(next) ? element.parentNode.insertBefore(context, next) : element.parentNode.appendChild(context);
	},

	bottom: function(context, element){
		element.appendChild(context);
	},

	top: function(context, element){
		var first = element.firstChild;
		(first) ? element.insertBefore(context, first) : element.appendChild(context);
	}

});

Element.Inserters.inside = Element.Inserters.bottom;

Element.Inserters.each(function(value, key){

	var Key = key.capitalize();

	Element.implement('inject' + Key, function(el){
		value(this, $(el, true));
		return this;
	});

	Element.implement('grab' + Key, function(el){
		value($(el, true), this);
		return this;
	});

});

Element.implement({

	getDocument: function(){
		return this.ownerDocument;
	},

	getWindow: function(){
		return this.ownerDocument.getWindow();
	},

	getElementById: function(id, nocash){
		var el = this.ownerDocument.getElementById(id);
		if (!el) return null;
		for (var parent = el.parentNode; parent != this; parent = parent.parentNode){
			if (!parent) return null;
		}
		return $.element(el, nocash);
	},

	set: function(prop, value){
		switch ($type(prop)){
			case 'object':
				for (var p in prop) this.set(p, prop[p]);
				break;
			case 'string':
				var property = Element.Properties.get(prop);
				(property && property.set) ? property.set.apply(this, Array.slice(arguments, 1)) : this.setProperty(prop, value);
		}
		return this;
	},

	get: function(prop){
		var property = Element.Properties.get(prop);
		return (property && property.get) ? property.get.apply(this, Array.slice(arguments, 1)) : this.getProperty(prop);
	},

	erase: function(prop){
		var property = Element.Properties.get(prop);
		(property && property.erase) ? property.erase.apply(this, Array.slice(arguments, 1)) : this.removeProperty(prop);
		return this;
	},

	match: function(tag){
		return (!tag || Element.get(this, 'tag') == tag);
	},

	inject: function(el, where){
		Element.Inserters.get(where || 'bottom')(this, $(el, true));
		return this;
	},

	wraps: function(el, where){
		el = $(el, true);
		return this.replaces(el).grab(el, where);
	},

	grab: function(el, where){
		Element.Inserters.get(where || 'bottom')($(el, true), this);
		return this;
	},

	appendText: function(text, where){
		return this.grab(this.getDocument().newTextNode(text), where);
	},

	adopt: function(){
		Array.flatten(arguments).each(function(element){
			element = $(element, true);
			if (element) this.appendChild(element);
		}, this);
		return this;
	},

	dispose: function(){
		return (this.parentNode) ? this.parentNode.removeChild(this) : this;
	},

	clone: function(contents, keepid){
		switch ($type(this)){
			case 'element':
				var attributes = {};
				for (var j = 0, l = this.attributes.length; j < l; j++){
					var attribute = this.attributes[j], key = attribute.nodeName.toLowerCase();
					if (Browser.Engine.trident && (/input/i).test(this.tagName) && (/width|height/).test(key)) continue;
					var value = (key == 'style' && this.style) ? this.style.cssText : attribute.nodeValue;
					if (!$chk(value) || key == 'uid' || (key == 'id' && !keepid)) continue;
					if (value != 'inherit' && ['string', 'number'].contains($type(value))) attributes[key] = value;
				}
				var element = new Element(this.nodeName.toLowerCase(), attributes);
				if (contents !== false){
					for (var i = 0, k = this.childNodes.length; i < k; i++){
						var child = Element.clone(this.childNodes[i], true, keepid);
						if (child) element.grab(child);
					}
				}
				return element;
			case 'textnode': return document.newTextNode(this.nodeValue);
		}
		return null;
	},

	replaces: function(el){
		el = $(el, true);
		el.parentNode.replaceChild(this, el);
		return this;
	},

	hasClass: function(className){
		return this.className.contains(className, ' ');
	},

	addClass: function(className){
		if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();
		return this;
	},

	removeClass: function(className){
		this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1').clean();
		return this;
	},

	toggleClass: function(className){
		return this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
	},

	getComputedStyle: function(property){
		if (this.currentStyle) return this.currentStyle[property.camelCase()];
		var computed = this.getWindow().getComputedStyle(this, null);
		return (computed) ? computed.getPropertyValue([property.hyphenate()]) : null;
	},

	empty: function(){
		$A(this.childNodes).each(function(node){
			Browser.freeMem(node);
			Element.empty(node);
			Element.dispose(node);
		}, this);
		return this;
	},

	destroy: function(){
		Browser.freeMem(this.empty().dispose());
		return null;
	},

	getSelected: function(){
		return new Elements($A(this.options).filter(function(option){
			return option.selected;
		}));
	},

	toQueryString: function(){
		var queryString = [];
		this.getElements('input, select, textarea').each(function(el){
			if (!el.name || el.disabled) return;
			var value = (el.tagName.toLowerCase() == 'select') ? Element.getSelected(el).map(function(opt){
				return opt.value;
			}) : ((el.type == 'radio' || el.type == 'checkbox') && !el.checked) ? null : el.value;
			$splat(value).each(function(val){
				if (val) queryString.push(el.name + '=' + encodeURIComponent(val));
			});
		});
		return queryString.join('&');
	},

	getProperty: function(attribute){
		var EA = Element.Attributes, key = EA.Props[attribute];
		var value = (key) ? this[key] : this.getAttribute(attribute, 2);
		return (EA.Bools[attribute]) ? !!value : (key) ? value : value || null;
	},

	getProperties: function(){
		var args = $A(arguments);
		return args.map(function(attr){
			return this.getProperty(attr);
		}, this).associate(args);
	},

	setProperty: function(attribute, value){
		var EA = Element.Attributes, key = EA.Props[attribute], hasValue = $defined(value);
		if (key && EA.Bools[attribute]) value = (value || !hasValue) ? true : false;
		else if (!hasValue) return this.removeProperty(attribute);
		(key) ? this[key] = value : this.setAttribute(attribute, value);
		return this;
	},

	setProperties: function(attributes){
		for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
		return this;
	},

	removeProperty: function(attribute){
		var EA = Element.Attributes, key = EA.Props[attribute], isBool = (key && EA.Bools[attribute]);
		(key) ? this[key] = (isBool) ? false : '' : this.removeAttribute(attribute);
		return this;
	},

	removeProperties: function(){
		Array.each(arguments, this.removeProperty, this);
		return this;
	}

});

(function(){

var walk = function(element, walk, start, match, all, nocash){
	var el = element[start || walk];
	var elements = [];
	while (el){
		if (el.nodeType == 1 && (!match || Element.match(el, match))){
			elements.push(el);
			if (!all) break;
		}
		el = el[walk];
	}
	return (all) ? new Elements(elements, {ddup: false, cash: !nocash}) : $(elements[0], nocash);
};

Element.implement({

	getPrevious: function(match, nocash){
		return walk(this, 'previousSibling', null, match, false, nocash);
	},

	getAllPrevious: function(match, nocash){
		return walk(this, 'previousSibling', null, match, true, nocash);
	},

	getNext: function(match, nocash){
		return walk(this, 'nextSibling', null, match, false, nocash);
	},

	getAllNext: function(match, nocash){
		return walk(this, 'nextSibling', null, match, true, nocash);
	},

	getFirst: function(match, nocash){
		return walk(this, 'nextSibling', 'firstChild', match, false, nocash);
	},

	getLast: function(match, nocash){
		return walk(this, 'previousSibling', 'lastChild', match, false, nocash);
	},

	getParent: function(match, nocash){
		return walk(this, 'parentNode', null, match, false, nocash);
	},

	getParents: function(match, nocash){
		return walk(this, 'parentNode', null, match, true, nocash);
	},

	getChildren: function(match, nocash){
		return walk(this, 'nextSibling', 'firstChild', match, true, nocash);
	},

	hasChild: function(el){
		el = $(el, true);
		return (!!el && $A(this.getElementsByTagName(el.tagName)).contains(el));
	}

});

})();

Element.Properties = new Hash;

Element.Properties.style = {

	set: function(style){
		this.style.cssText = style;
	},

	get: function(){
		return this.style.cssText;
	},

	erase: function(){
		this.style.cssText = '';
	}

};

Element.Properties.tag = {get: function(){
	return this.tagName.toLowerCase();
}};

Element.Properties.href = {get: function(){
	return (!this.href) ? null : this.href.replace(new RegExp('^' + document.location.protocol + '\/\/' + document.location.host), '');
}};

Element.Properties.html = {set: function(){
	return this.innerHTML = Array.flatten(arguments).join('');
}};

Native.implement([Element, Window, Document], {

	addListener: function(type, fn){
		if (this.addEventListener) this.addEventListener(type, fn, false);
		else this.attachEvent('on' + type, fn);
		return this;
	},

	removeListener: function(type, fn){
		if (this.removeEventListener) this.removeEventListener(type, fn, false);
		else this.detachEvent('on' + type, fn);
		return this;
	},

	retrieve: function(property, dflt){
		var storage = Element.Storage.get(this.uid);
		var prop = storage[property];
		if ($defined(dflt) && !$defined(prop)) prop = storage[property] = dflt;
		return $pick(prop);
	},

	store: function(property, value){
		var storage = Element.Storage.get(this.uid);
		storage[property] = value;
		return this;
	},

	eliminate: function(property){
		var storage = Element.Storage.get(this.uid);
		delete storage[property];
		return this;
	}

});

Element.Attributes = new Hash({
	Props: {'html': 'innerHTML', 'class': 'className', 'for': 'htmlFor', 'text': (Browser.Engine.trident) ? 'innerText' : 'textContent'},
	Bools: ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readonly', 'multiple', 'selected', 'noresize', 'defer'],
	Camels: ['value', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly', 'rowSpan', 'tabIndex', 'useMap']
});

Browser.freeMem = function(item){
	if (!item) return;
	if (Browser.Engine.trident && (/object/i).test(item.tagName)){
		for (var p in item){
			if (typeof item[p] == 'function') item[p] = $empty;
		}
		Element.dispose(item);
	}
	if (item.uid && item.removeEvents) item.removeEvents();
};

(function(EA){

	var EAB = EA.Bools, EAC = EA.Camels;
	EA.Bools = EAB = EAB.associate(EAB);
	Hash.extend(Hash.combine(EA.Props, EAB), EAC.associate(EAC.map(function(v){
		return v.toLowerCase();
	})));
	EA.erase('Camels');

})(Element.Attributes);

window.addListener('unload', function(){
	window.removeListener('unload', arguments.callee);
	document.purge();
	if (Browser.Engine.trident) CollectGarbage();
});

/*
Script: Element.Event.js
	Contains Element methods for dealing with events, and custom Events.

License:
	MIT-style license.
*/

Element.Properties.events = {set: function(events){
	this.addEvents(events);
}};

Native.implement([Element, Window, Document], {

	addEvent: function(type, fn){
		var events = this.retrieve('events', {});
		events[type] = events[type] || {'keys': [], 'values': []};
		if (events[type].keys.contains(fn)) return this;
		events[type].keys.push(fn);
		var realType = type, custom = Element.Events.get(type), condition = fn, self = this;
		if (custom){
			if (custom.onAdd) custom.onAdd.call(this, fn);
			if (custom.condition){
				condition = function(event){
					if (custom.condition.call(this, event)) return fn.call(this, event);
					return false;
				};
			}
			realType = custom.base || realType;
		}
		var defn = function(){
			return fn.call(self);
		};
		var nativeEvent = Element.NativeEvents[realType] || 0;
		if (nativeEvent){
			if (nativeEvent == 2){
				defn = function(event){
					event = new Event(event, self.getWindow());
					if (condition.call(self, event) === false) event.stop();
				};
			}
			this.addListener(realType, defn);
		}
		events[type].values.push(defn);
		return this;
	},

	removeEvent: function(type, fn){
		var events = this.retrieve('events');
		if (!events || !events[type]) return this;
		var pos = events[type].keys.indexOf(fn);
		if (pos == -1) return this;
		var key = events[type].keys.splice(pos, 1)[0];
		var value = events[type].values.splice(pos, 1)[0];
		var custom = Element.Events.get(type);
		if (custom){
			if (custom.onRemove) custom.onRemove.call(this, fn);
			type = custom.base || type;
		}
		return (Element.NativeEvents[type]) ? this.removeListener(type, value) : this;
	},

	addEvents: function(events){
		for (var event in events) this.addEvent(event, events[event]);
		return this;
	},

	removeEvents: function(type){
		var events = this.retrieve('events');
		if (!events) return this;
		if (!type){
			for (var evType in events) this.removeEvents(evType);
			events = null;
		} else if (events[type]){
			while (events[type].keys[0]) this.removeEvent(type, events[type].keys[0]);
			events[type] = null;
		}
		return this;
	},

	fireEvent: function(type, args, delay){
		var events = this.retrieve('events');
		if (!events || !events[type]) return this;
		events[type].keys.each(function(fn){
			fn.create({'bind': this, 'delay': delay, 'arguments': args})();
		}, this);
		return this;
	},

	cloneEvents: function(from, type){
		from = $(from);
		var fevents = from.retrieve('events');
		if (!fevents) return this;
		if (!type){
			for (var evType in fevents) this.cloneEvents(from, evType);
		} else if (fevents[type]){
			fevents[type].keys.each(function(fn){
				this.addEvent(type, fn);
			}, this);
		}
		return this;
	}

});

Element.NativeEvents = {
	click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
	mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
	mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
	keydown: 2, keypress: 2, keyup: 2, //keyboard
	focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements
	load: 1, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
	error: 1, abort: 1, scroll: 1 //misc
};

(function(){

var $check = function(event){
	var related = event.relatedTarget;
	if (related == undefined) return true;
	if (related === false) return false;
	return ($type(this) != 'document' && related != this && related.prefix != 'xul' && !this.hasChild(related));
};

Element.Events = new Hash({

	mouseenter: {
		base: 'mouseover',
		condition: $check
	},

	mouseleave: {
		base: 'mouseout',
		condition: $check
	},

	mousewheel: {
		base: (Browser.Engine.gecko) ? 'DOMMouseScroll' : 'mousewheel'
	}

});

})();

/*
Script: Element.Style.js
	Contains methods for interacting with the styles of Elements in a fashionable way.

License:
	MIT-style license.
*/

Element.Properties.styles = {set: function(styles){
	this.setStyles(styles);
}};

Element.Properties.opacity = {

	set: function(opacity, novisibility){
		if (!novisibility){
			if (opacity == 0){
				if (this.style.visibility != 'hidden') this.style.visibility = 'hidden';
			} else {
				if (this.style.visibility != 'visible') this.style.visibility = 'visible';
			}
		}
		if (!this.currentStyle || !this.currentStyle.hasLayout) this.style.zoom = 1;
		if (Browser.Engine.trident) this.style.filter = (opacity == 1) ? '' : 'alpha(opacity=' + opacity * 100 + ')';
		this.style.opacity = opacity;
		this.store('opacity', opacity);
	},

	get: function(){
		return this.retrieve('opacity', 1);
	}

};

Element.implement({
	
	setOpacity: function(value){
		return this.set('opacity', value, true);
	},
	
	getOpacity: function(){
		return this.get('opacity');
	},

	setStyle: function(property, value){
		switch (property){
			case 'opacity': return this.set('opacity', parseFloat(value));
			case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat';
		}
		property = property.camelCase();
		if ($type(value) != 'string'){
			var map = (Element.Styles.get(property) || '@').split(' ');
			value = $splat(value).map(function(val, i){
				if (!map[i]) return '';
				return ($type(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
			}).join(' ');
		} else if (value == String(Number(value))){
			value = Math.round(value);
		}
		this.style[property] = value;
		return this;
	},

	getStyle: function(property){
		switch (property){
			case 'opacity': return this.get('opacity');
			case 'float': property = (Browser.Engine.trident) ? 'styleFloat' : 'cssFloat';
		}
		property = property.camelCase();
		var result = this.style[property];
		if (!$chk(result)){
			result = [];
			for (var style in Element.ShortStyles){
				if (property != style) continue;
				for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));
				return result.join(' ');
			}
			result = this.getComputedStyle(property);
		}
		if (result){
			result = String(result);
			var color = result.match(/rgba?\([\d\s,]+\)/);
			if (color) result = result.replace(color[0], color[0].rgbToHex());
		}
		if (Browser.Engine.presto || (Browser.Engine.trident && !$chk(parseInt(result)))){
			if (property.test(/^(height|width)$/)){
				var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
				values.each(function(value){
					size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
				}, this);
				return this['offset' + property.capitalize()] - size + 'px';
			}
			if (Browser.Engine.presto && String(result).test('px')) return result;
			if (property.test(/(border(.+)Width|margin|padding)/)) return '0px';
		}
		return result;
	},

	setStyles: function(styles){
		for (var style in styles) this.setStyle(style, styles[style]);
		return this;
	},

	getStyles: function(){
		var result = {};
		Array.each(arguments, function(key){
			result[key] = this.getStyle(key);
		}, this);
		return result;
	}

});

Element.Styles = new Hash({
	left: '@px', top: '@px', bottom: '@px', right: '@px',
	width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
	backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
	fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
	margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
	borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
	zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
});

Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};

['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
	var Short = Element.ShortStyles;
	var All = Element.Styles;
	['margin', 'padding'].each(function(style){
		var sd = style + direction;
		Short[style][sd] = All[sd] = '@px';
	});
	var bd = 'border' + direction;
	Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
	var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
	Short[bd] = {};
	Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
	Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
	Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
});


/*
Script: Element.Dimensions.js
	Contains methods to work with size, scroll, or positioning of Elements and the window object.

License:
	MIT-style license.

Credits:
	- Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).
	- Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).
*/

(function(){

Element.implement({

	scrollTo: function(x, y){
		if (isBody(this)){
			this.getWindow().scrollTo(x, y);
		} else {
			this.scrollLeft = x;
			this.scrollTop = y;
		}
		return this;
	},

	getSize: function(){
		if (isBody(this)) return this.getWindow().getSize();
		return {x: this.offsetWidth, y: this.offsetHeight};
	},

	getScrollSize: function(){
		if (isBody(this)) return this.getWindow().getScrollSize();
		return {x: this.scrollWidth, y: this.scrollHeight};
	},

	getScroll: function(){
		if (isBody(this)) return this.getWindow().getScroll();
		return {x: this.scrollLeft, y: this.scrollTop};
	},

	getScrolls: function(){
		var element = this, position = {x: 0, y: 0};
		while (element && !isBody(element)){
			position.x += element.scrollLeft;
			position.y += element.scrollTop;
			element = element.parentNode;
		}
		return position;
	},
	
	getOffsetParent: function(){
		var element = this;
		if (isBody(element)) return null; 
		if (!Browser.Engine.trident) return element.offsetParent;
		while ((element = element.parentNode) && !isBody(element)){ 
			if (styleString(element, 'position') != 'static') return element;
		} 
		return null;
	},

	getOffsets: function(){
		var element = this, position = {x: 0, y: 0};
		if (isBody(this)) return position;

		while (element && !isBody(element)){
			position.x += element.offsetLeft;
			position.y += element.offsetTop;

			if (Browser.Engine.gecko){
				if (!borderBox(element)){
					position.x += leftBorder(element);
					position.y += topBorder(element);
				}
				var parent = element.parentNode;
				if (parent && styleString(parent, 'overflow') != 'visible'){
					position.x += leftBorder(parent);
					position.y += topBorder(parent);
				}
			} else if (element != this && (Browser.Engine.trident || Browser.Engine.webkit)){
				position.x += leftBorder(element);
				position.y += topBorder(element);
			}

			element = element.offsetParent;
			if (Browser.Engine.trident){
				while (element && !element.currentStyle.hasLayout) element = element.offsetParent;
			}
		}
		if (Browser.Engine.gecko && !borderBox(this)){
			position.x -= leftBorder(this);
			position.y -= topBorder(this);
		}
		return position;
	},

	getPosition: function(relative){
		if (isBody(this)) return {x: 0, y: 0};
		var offset = this.getOffsets(), scroll = this.getScrolls();
		var position = {x: offset.x - scroll.x, y: offset.y - scroll.y};
		var relativePosition = (relative && (relative = $(relative))) ? relative.getPosition() : {x: 0, y: 0};
		return {x: position.x - relativePosition.x, y: position.y - relativePosition.y};
	},

	getCoordinates: function(element){
		if (isBody(this)) return this.getWindow().getCoordinates();
		var position = this.getPosition(element), size = this.getSize();
		var obj = {left: position.x, top: position.y, width: size.x, height: size.y};
		obj.right = obj.left + obj.width;
		obj.bottom = obj.top + obj.height;
		return obj;
	},

	computePosition: function(obj){
		return {left: obj.x - styleNumber(this, 'margin-left'), top: obj.y - styleNumber(this, 'margin-top')};
	},

	position: function(obj){
		return this.setStyles(this.computePosition(obj));
	}

});

Native.implement([Document, Window], {

	getSize: function(){
		var win = this.getWindow();
		if (Browser.Engine.presto || Browser.Engine.webkit) return {x: win.innerWidth, y: win.innerHeight};
		var doc = getCompatElement(this);
		return {x: doc.clientWidth, y: doc.clientHeight};
	},

	getScroll: function(){
		var win = this.getWindow();
		var doc = getCompatElement(this);
		return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
	},

	getScrollSize: function(){
		var doc = getCompatElement(this);
		var min = this.getSize();
		return {x: Math.max(doc.scrollWidth, min.x), y: Math.max(doc.scrollHeight, min.y)};
	},

	getPosition: function(){
		return {x: 0, y: 0};
	},

	getCoordinates: function(){
		var size = this.getSize();
		return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
	}

});

// private methods

var styleString = Element.getComputedStyle;

function styleNumber(element, style){
	return styleString(element, style).toInt() || 0;
};

function borderBox(element){
	return styleString(element, '-moz-box-sizing') == 'border-box';
};

function topBorder(element){
	return styleNumber(element, 'border-top-width');
};

function leftBorder(element){
	return styleNumber(element, 'border-left-width');
};

function isBody(element){
	return (/^(?:body|html)$/i).test(element.tagName);
};

function getCompatElement(element){
	var doc = element.getDocument();
	return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
};

})();

//aliases

Native.implement([Window, Document, Element], {

	getHeight: function(){
		return this.getSize().y;
	},

	getWidth: function(){
		return this.getSize().x;
	},

	getScrollTop: function(){
		return this.getScroll().y;
	},

	getScrollLeft: function(){
		return this.getScroll().x;
	},

	getScrollHeight: function(){
		return this.getScrollSize().y;
	},

	getScrollWidth: function(){
		return this.getScrollSize().x;
	},

	getTop: function(){
		return this.getPosition().y;
	},

	getLeft: function(){
		return this.getPosition().x;
	}

});

/*
Script: Selectors.js
	Adds advanced CSS Querying capabilities for targeting elements. Also includes pseudoselectors support.

License:
	MIT-style license.
*/

Native.implement([Document, Element], {
	
	getElements: function(expression, nocash){
		expression = expression.split(',');
		var items, local = {};
		for (var i = 0, l = expression.length; i < l; i++){
			var selector = expression[i], elements = Selectors.Utils.search(this, selector, local);
			if (i != 0 && elements.item) elements = $A(elements);
			items = (i == 0) ? elements : (items.item) ? $A(items).concat(elements) : items.concat(elements);
		}
		return new Elements(items, {ddup: (expression.length > 1), cash: !nocash});
	}
	
});

Element.implement({
	
	match: function(selector){
		if (!selector) return true;
		var tagid = Selectors.Utils.parseTagAndID(selector);
		var tag = tagid[0], id = tagid[1];
		if (!Selectors.Filters.byID(this, id) || !Selectors.Filters.byTag(this, tag)) return false;
		var parsed = Selectors.Utils.parseSelector(selector);
		return (parsed) ? Selectors.Utils.filter(this, parsed, {}) : true;
	}
	
});

var Selectors = {Cache: {nth: {}, parsed: {}}};

Selectors.RegExps = {
	id: (/#([\w-]+)/),
	tag: (/^(\w+|\*)/),
	quick: (/^(\w+|\*)$/),
	splitter: (/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),
	combined: (/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)["']?(.*?)["']?)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)
};

Selectors.Utils = {
	
	chk: function(item, uniques){
		if (!uniques) return true;
		var uid = $uid(item);
		if (!uniques[uid]) return uniques[uid] = true;
		return false;
	},
	
	parseNthArgument: function(argument){
		if (Selectors.Cache.nth[argument]) return Selectors.Cache.nth[argument];
		var parsed = argument.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);
		if (!parsed) return false;
		var inta = parseInt(parsed[1]);
		var a = (inta || inta === 0) ? inta : 1;
		var special = parsed[2] || false;
		var b = parseInt(parsed[3]) || 0;
		if (a != 0){
			b--;
			while (b < 1) b += a;
			while (b >= a) b -= a;
		} else {
			a = b;
			special = 'index';
		}
		switch (special){
			case 'n': parsed = {a: a, b: b, special: 'n'}; break;
			case 'odd': parsed = {a: 2, b: 0, special: 'n'}; break;
			case 'even': parsed =  {a: 2, b: 1, special: 'n'}; break;
			case 'first': parsed = {a: 0, special: 'index'}; break;
			case 'last': parsed = {special: 'last-child'}; break;
			case 'only': parsed = {special: 'only-child'}; break;
			default: parsed = {a: (a - 1), special: 'index'};
		}
		
		return Selectors.Cache.nth[argument] = parsed;
	},
	
	parseSelector: function(selector){
		if (Selectors.Cache.parsed[selector]) return Selectors.Cache.parsed[selector];
		var m, parsed = {classes: [], pseudos: [], attributes: []};
		while ((m = Selectors.RegExps.combined.exec(selector))){
			var cn = m[1], an = m[2], ao = m[3], av = m[4], pn = m[5], pa = m[6];
			if (cn){
				parsed.classes.push(cn);
			} else if (pn){
				var parser = Selectors.Pseudo.get(pn);
				if (parser) parsed.pseudos.push({parser: parser, argument: pa});
				else parsed.attributes.push({name: pn, operator: '=', value: pa});
			} else if (an){
				parsed.attributes.push({name: an, operator: ao, value: av});
			}
		}
		if (!parsed.classes.length) delete parsed.classes;
		if (!parsed.attributes.length) delete parsed.attributes;
		if (!parsed.pseudos.length) delete parsed.pseudos;
		if (!parsed.classes && !parsed.attributes && !parsed.pseudos) parsed = null;
		return Selectors.Cache.parsed[selector] = parsed;
	},
	
	parseTagAndID: function(selector){
		var tag = selector.match(Selectors.RegExps.tag);
		var id = selector.match(Selectors.RegExps.id);
		return [(tag) ? tag[1] : '*', (id) ? id[1] : false];
	},
	
	filter: function(item, parsed, local){
		var i;
		if (parsed.classes){
			for (i = parsed.classes.length; i--; i){
				var cn = parsed.classes[i];
				if (!Selectors.Filters.byClass(item, cn)) return false;
			}
		}
		if (parsed.attributes){
			for (i = parsed.attributes.length; i--; i){
				var att = parsed.attributes[i];
				if (!Selectors.Filters.byAttribute(item, att.name, att.operator, att.value)) return false;
			}
		}
		if (parsed.pseudos){
			for (i = parsed.pseudos.length; i--; i){
				var psd = parsed.pseudos[i];
				if (!Selectors.Filters.byPseudo(item, psd.parser, psd.argument, local)) return false;
			}
		}
		return true;
	},
	
	getByTagAndID: function(ctx, tag, id){
		if (id){
			var item = (ctx.getElementById) ? ctx.getElementById(id, true) : Element.getElementById(ctx, id, true);
			return (item && Selectors.Filters.byTag(item, tag)) ? [item] : [];
		} else {
			return ctx.getElementsByTagName(tag);
		}
	},
	
	search: function(self, expression, local){
		var splitters = [];
		
		var selectors = expression.trim().replace(Selectors.RegExps.splitter, function(m0, m1, m2){
			splitters.push(m1);
			return ':)' + m2;
		}).split(':)');
		
		var items, match, filtered, item;
		
		for (var i = 0, l = selectors.length; i < l; i++){
			
			var selector = selectors[i];
			
			if (i == 0 && Selectors.RegExps.quick.test(selector)){
				items = self.getElementsByTagName(selector);
				continue;
			}
			
			var splitter = splitters[i - 1];
			
			var tagid = Selectors.Utils.parseTagAndID(selector);
			var tag = tagid[0], id = tagid[1];

			if (i == 0){
				items = Selectors.Utils.getByTagAndID(self, tag, id);
			} else {
				var uniques = {}, found = [];
				for (var j = 0, k = items.length; j < k; j++) found = Selectors.Getters[splitter](found, items[j], tag, id, uniques);
				items = found;
			}
			
			var parsed = Selectors.Utils.parseSelector(selector);
			
			if (parsed){
				filtered = [];
				for (var m = 0, n = items.length; m < n; m++){
					item = items[m];
					if (Selectors.Utils.filter(item, parsed, local)) filtered.push(item);
				}
				items = filtered;
			}
			
		}
		
		return items;
		
	}
	
};

Selectors.Getters = {
	
	' ': function(found, self, tag, id, uniques){
		var items = Selectors.Utils.getByTagAndID(self, tag, id);
		for (var i = 0, l = items.length; i < l; i++){
			var item = items[i];
			if (Selectors.Utils.chk(item, uniques)) found.push(item);
		}
		return found;
	},
	
	'>': function(found, self, tag, id, uniques){
		var children = Selectors.Utils.getByTagAndID(self, tag, id);
		for (var i = 0, l = children.length; i < l; i++){
			var child = children[i];
			if (child.parentNode == self && Selectors.Utils.chk(child, uniques)) found.push(child);
		}
		return found;
	},
	
	'+': function(found, self, tag, id, uniques){
		while ((self = self.nextSibling)){
			if (self.nodeType == 1){
				if (Selectors.Utils.chk(self, uniques) && Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self);
				break;
			}
		}
		return found;
	},
	
	'~': function(found, self, tag, id, uniques){
		
		while ((self = self.nextSibling)){
			if (self.nodeType == 1){
				if (!Selectors.Utils.chk(self, uniques)) break;
				if (Selectors.Filters.byTag(self, tag) && Selectors.Filters.byID(self, id)) found.push(self);
			} 
		}
		return found;
	}
	
};

Selectors.Filters = {
	
	byTag: function(self, tag){
		return (tag == '*' || (self.tagName && self.tagName.toLowerCase() == tag));
	},
	
	byID: function(self, id){
		return (!id || (self.id && self.id == id));
	},
	
	byClass: function(self, klass){
		return (self.className && self.className.contains(klass, ' '));
	},
	
	byPseudo: function(self, parser, argument, local){
		return parser.call(self, argument, local);
	},
	
	byAttribute: function(self, name, operator, value){
		var result = Element.prototype.getProperty.call(self, name);
		if (!result) return false;
		if (!operator || value == undefined) return true;
		switch (operator){
			case '=': return (result == value);
			case '*=': return (result.contains(value));
			case '^=': return (result.substr(0, value.length) == value);
			case '$=': return (result.substr(result.length - value.length) == value);
			case '!=': return (result != value);
			case '~=': return result.contains(value, ' ');
			case '|=': return result.contains(value, '-');
		}
		return false;
	}
	
};

Selectors.Pseudo = new Hash({
	
	// w3c pseudo selectors
	
	empty: function(){
		return !(this.innerText || this.textContent || '').length;
	},
	
	not: function(selector){
		return !Element.match(this, selector);
	},
	
	contains: function(text){
		return (this.innerText || this.textContent || '').contains(text);
	},
	
	'first-child': function(){
		return Selectors.Pseudo.index.call(this, 0);
	},
	
	'last-child': function(){
		var element = this;
		while ((element = element.nextSibling)){
			if (element.nodeType == 1) return false;
		}
		return true;
	},
	
	'only-child': function(){
		var prev = this;
		while ((prev = prev.previousSibling)){
			if (prev.nodeType == 1) return false;
		}
		var next = this;
		while ((next = next.nextSibling)){
			if (next.nodeType == 1) return false;
		}
		return true;
	},
	
	'nth-child': function(argument, local){
		argument = (argument == undefined) ? 'n' : argument;
		var parsed = Selectors.Utils.parseNthArgument(argument);
		if (parsed.special != 'n') return Selectors.Pseudo[parsed.special].call(this, parsed.a, local);
		var count = 0;
		local.positions = local.positions || {};
		var uid = $uid(this);
		if (!local.positions[uid]){
			var self = this;
			while ((self = self.previousSibling)){
				if (self.nodeType != 1) continue;
				count ++;
				var position = local.positions[$uid(self)];
				if (position != undefined){
					count = position + count;
					break;
				}
			}
			local.positions[uid] = count;
		}
		return (local.positions[uid] % parsed.a == parsed.b);
	},
	
	// custom pseudo selectors
	
	index: function(index){
		var element = this, count = 0;
		while ((element = element.previousSibling)){
			if (element.nodeType == 1 && ++count > index) return false;
		}
		return (count == index);
	},
	
	even: function(argument, local){
		return Selectors.Pseudo['nth-child'].call(this, '2n+1', local);
	},

	odd: function(argument, local){
		return Selectors.Pseudo['nth-child'].call(this, '2n', local);
	}
	
});

/*
Script: Domready.js
	Contains the domready custom event.

License:
	MIT-style license.
*/

Element.Events.domready = {

	onAdd: function(fn){
		if (Browser.loaded) fn.call(this);
	}

};

(function(){
	
	var domready = function(){
		if (Browser.loaded) return;
		Browser.loaded = true;
		window.fireEvent('domready');
		document.fireEvent('domready');
	};
	
	switch (Browser.Engine.name){

		case 'webkit': (function(){
			(['loaded', 'complete'].contains(document.readyState)) ? domready() : arguments.callee.delay(50);
		})(); break;

		case 'trident':
			var temp = document.createElement('div');
			(function(){
				($try(function(){
					temp.doScroll('left');
					return $(temp).inject(document.body).set('html', 'temp').dispose();
				})) ? domready() : arguments.callee.delay(50);
			})();
		break;
		
		default:
			window.addEvent('load', domready);
			document.addEvent('DOMContentLoaded', domready);

	}
	
})();

/*
Script: JSON.js
	JSON encoder and decoder.

License:
	MIT-style license.

See Also:
	<http://www.json.org/>
*/

var JSON = new Hash({

	encode: function(obj){
		switch ($type(obj)){
			case 'string':
				return '"' + obj.replace(/[\x00-\x1f\\"]/g, JSON.$replaceChars) + '"';
			case 'array':
				return '[' + String(obj.map(JSON.encode).filter($defined)) + ']';
			case 'object': case 'hash':
				var string = [];
				Hash.each(obj, function(value, key){
					var json = JSON.encode(value);
					if (json) string.push(JSON.encode(key) + ':' + json);
				});
				return '{' + string + '}';
			case 'number': case 'boolean': return String(obj);
			case false: return 'null';
		}
		return null;
	},

	$specialChars: {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'},

	$replaceChars: function(chr){
		return JSON.$specialChars[chr] || '\\u00' + Math.floor(chr.charCodeAt() / 16).toString(16) + (chr.charCodeAt() % 16).toString(16);
	},

	decode: function(string, secure){
		if ($type(string) != 'string' || !string.length) return null;
		if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''))) return null;
		return eval('(' + string + ')');
	}

});

Native.implement([Hash, Array, String, Number], {

	toJSON: function(){
		return JSON.encode(this);
	}

});


/*
Script: Cookie.js
	Class for creating, loading, and saving browser Cookies.

License:
	MIT-style license.

Credits:
	Based on the functions by Peter-Paul Koch (http://quirksmode.org).
*/

var Cookie = new Class({

	Implements: Options,

	options: {
		path: false,
		domain: false,
		duration: false,
		secure: false,
		document: document
	},

	initialize: function(key, options){
		this.key = key;
		this.setOptions(options);
	},

	write: function(value){
		value = encodeURIComponent(value);
		if (this.options.domain) value += '; domain=' + this.options.domain;
		if (this.options.path) value += '; path=' + this.options.path;
		if (this.options.duration){
			var date = new Date();
			date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
			value += '; expires=' + date.toGMTString();
		}
		if (this.options.secure) value += '; secure';
		this.options.document.cookie = this.key + '=' + value;
		return this;
	},

	read: function(){
		var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
		return (value) ? decodeURIComponent(value[1]) : null;
	},

	dispose: function(){
		new Cookie(this.key, $merge(this.options, {duration: -1})).write('');
		return this;
	}

});

Cookie.write = function(key, value, options){
	return new Cookie(key, options).write(value);
};

Cookie.read = function(key){
	return new Cookie(key).read();
};

Cookie.dispose = function(key, options){
	return new Cookie(key, options).dispose();
};

/*
Script: Swiff.js
	Wrapper for embedding SWF movies. Supports (and fixes) External Interface Communication.

License:
	MIT-style license.

Credits:
	Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject.
*/

var Swiff = new Class({

	Implements: [Options],

	options: {
		id: null,
		height: 1,
		width: 1,
		container: null,
		properties: {},
		params: {
			quality: 'high',
			allowScriptAccess: 'always',
			wMode: 'transparent',
			swLiveConnect: true
		},
		callBacks: {},
		vars: {}
	},

	toElement: function(){
		return this.object;
	},

	initialize: function(path, options){
		this.instance = 'Swiff_' + $time();

		this.setOptions(options);
		options = this.options;
		var id = this.id = options.id || this.instance;
		var container = $(options.container);

		Swiff.CallBacks[this.instance] = {};

		var params = options.params, vars = options.vars, callBacks = options.callBacks;
		var properties = $extend({height: options.height, width: options.width}, options.properties);

		var self = this;

		for (var callBack in callBacks){
			Swiff.CallBacks[this.instance][callBack] = (function(option){
				return function(){
					return option.apply(self.object, arguments);
				};
			})(callBacks[callBack]);
			vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;
		}

		params.flashVars = Hash.toQueryString(vars);
		if (Browser.Engine.trident){
			properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
			params.movie = path;
		} else {
			properties.type = 'application/x-shockwave-flash';
			properties.data = path;
		}
		var build = '<object id="' + id + '"';
		for (var property in properties) build += ' ' + property + '="' + properties[property] + '"';
		build += '>';
		for (var param in params){
			if (params[param]) build += '<param name="' + param + '" value="' + params[param] + '" />';
		}
		build += '</object>';
		this.object =  ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
	},

	replaces: function(element){
		element = $(element, true);
		element.parentNode.replaceChild(this.toElement(), element);
		return this;
	},

	inject: function(element){
		$(element, true).appendChild(this.toElement());
		return this;
	},

	remote: function(){
		return Swiff.remote.apply(Swiff, [this.toElement()].extend(arguments));
	}

});

Swiff.CallBacks = {};

Swiff.remote = function(obj, fn){
	var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
	return eval(rs);
};

/*
Script: Fx.js
	Contains the basic animation logic to be extended by all other Fx Classes.

License:
	MIT-style license.
*/

var Fx = new Class({

	Implements: [Chain, Events, Options],

	options: {
		/*
		onStart: $empty,
		onCancel: $empty,
		onComplete: $empty,
		*/
		fps: 50,
		unit: false,
		duration: 500,
		link: 'ignore',
		transition: function(p){
			return -(Math.cos(Math.PI * p) - 1) / 2;
		}
	},

	initialize: function(options){
		this.subject = this.subject || this;
		this.setOptions(options);
		this.options.duration = Fx.Durations[this.options.duration] || this.options.duration.toInt();
		var wait = this.options.wait;
		if (wait === false) this.options.link = 'cancel';
	},

	step: function(){
		var time = $time();
		if (time < this.time + this.options.duration){
			var delta = this.options.transition((time - this.time) / this.options.duration);
			this.set(this.compute(this.from, this.to, delta));
		} else {
			this.set(this.compute(this.from, this.to, 1));
			this.complete();
		}
	},

	set: function(now){
		return now;
	},

	compute: function(from, to, delta){
		return Fx.compute(from, to, delta);
	},

	check: function(caller){
		if (!this.timer) return true;
		switch (this.options.link){
			case 'cancel': this.cancel(); return true;
			case 'chain': this.chain(caller.bind(this, Array.slice(arguments, 1))); return false;
		}
		return false;
	},

	start: function(from, to){
		if (!this.check(arguments.callee, from, to)) return this;
		this.from = from;
		this.to = to;
		this.time = 0;
		this.startTimer();
		this.onStart();
		return this;
	},

	complete: function(){
		if (this.stopTimer()) this.onComplete();
		return this;
	},

	cancel: function(){
		if (this.stopTimer()) this.onCancel();
		return this;
	},

	onStart: function(){
		this.fireEvent('start', this.subject);
	},

	onComplete: function(){
		this.fireEvent('complete', this.subject);
		if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
	},

	onCancel: function(){
		this.fireEvent('cancel', this.subject).clearChain();
	},

	pause: function(){
		this.stopTimer();
		return this;
	},

	resume: function(){
		this.startTimer();
		return this;
	},

	stopTimer: function(){
		if (!this.timer) return false;
		this.time = $time() - this.time;
		this.timer = $clear(this.timer);
		return true;
	},

	startTimer: function(){
		if (this.timer) return false;
		this.time = $time() - this.time;
		this.timer = this.step.periodical(Math.round(1000 / this.options.fps), this);
		return true;
	}

});

Fx.compute = function(from, to, delta){
	return (to - from) * delta + from;
};

Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000};


/*
Script: Fx.CSS.js
	Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.

License:
	MIT-style license.
*/

Fx.CSS = new Class({

	Extends: Fx,

	//prepares the base from/to object

	prepare: function(element, property, values){
		values = $splat(values);
		var values1 = values[1];
		if (!$chk(values1)){
			values[1] = values[0];
			values[0] = element.getStyle(property);
		}
		var parsed = values.map(this.parse);
		return {from: parsed[0], to: parsed[1]};
	},

	//parses a value into an array

	parse: function(value){
		value = $lambda(value)();
		value = (typeof value == 'string') ? value.split(' ') : $splat(value);
		return value.map(function(val){
			val = String(val);
			var found = false;
			Fx.CSS.Parsers.each(function(parser, key){
				if (found) return;
				var parsed = parser.parse(val);
				if ($chk(parsed)) found = {value: parsed, parser: parser};
			});
			found = found || {value: val, parser: Fx.CSS.Parsers.String};
			return found;
		});
	},

	//computes by a from and to prepared objects, using their parsers.

	compute: function(from, to, delta){
		var computed = [];
		(Math.min(from.length, to.length)).times(function(i){
			computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
		});
		computed.$family = {name: 'fx:css:value'};
		return computed;
	},

	//serves the value as settable

	serve: function(value, unit){
		if ($type(value) != 'fx:css:value') value = this.parse(value);
		var returned = [];
		value.each(function(bit){
			returned = returned.concat(bit.parser.serve(bit.value, unit));
		});
		return returned;
	},

	//renders the change to an element

	render: function(element, property, value, unit){
		element.setStyle(property, this.serve(value, unit));
	},

	//searches inside the page css to find the values for a selector

	search: function(selector){
		if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
		var to = {};
		Array.each(document.styleSheets, function(sheet, j){
			var href = sheet.href;
			if (href && href.contains('://') && !href.contains(document.domain)) return;
			var rules = sheet.rules || sheet.cssRules;
			Array.each(rules, function(rule, i){
				if (!rule.style) return;
				var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
					return m.toLowerCase();
				}) : null;
				if (!selectorText || !selectorText.test('^' + selector + '$')) return;
				Element.Styles.each(function(value, style){
					if (!rule.style[style] || Element.ShortStyles[style]) return;
					value = String(rule.style[style]);
					to[style] = (value.test(/^rgb/)) ? value.rgbToHex() : value;
				});
			});
		});
		return Fx.CSS.Cache[selector] = to;
	}

});

Fx.CSS.Cache = {};

Fx.CSS.Parsers = new Hash({

	Color: {
		parse: function(value){
			if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
			return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
		},
		compute: function(from, to, delta){
			return from.map(function(value, i){
				return Math.round(Fx.compute(from[i], to[i], delta));
			});
		},
		serve: function(value){
			return value.map(Number);
		}
	},

	Number: {
		parse: parseFloat,
		compute: Fx.compute,
		serve: function(value, unit){
			return (unit) ? value + unit : value;
		}
	},

	String: {
		parse: $lambda(false),
		compute: $arguments(1),
		serve: $arguments(0)
	}

});


/*
Script: Fx.Tween.js
	Formerly Fx.Style, effect to transition any CSS property for an element.

License:
	MIT-style license.
*/

Fx.Tween = new Class({

	Extends: Fx.CSS,

	initialize: function(element, options){
		this.element = this.subject = $(element);
		this.parent(options);
	},

	set: function(property, now){
		if (arguments.length == 1){
			now = property;
			property = this.property || this.options.property;
		}
		this.render(this.element, property, now, this.options.unit);
		return this;
	},

	start: function(property, from, to){
		if (!this.check(arguments.callee, property, from, to)) return this;
		var args = Array.flatten(arguments);
		this.property = this.options.property || args.shift();
		var parsed = this.prepare(this.element, this.property, args);
		return this.parent(parsed.from, parsed.to);
	}

});

Element.Properties.tween = {

	set: function(options){
		var tween = this.retrieve('tween');
		if (tween) tween.cancel();
		return this.eliminate('tween').store('tween:options', $extend({link: 'cancel'}, options));
	},

	get: function(options){
		if (options || !this.retrieve('tween')){
			if (options || !this.retrieve('tween:options')) this.set('tween', options);
			this.store('tween', new Fx.Tween(this, this.retrieve('tween:options')));
		}
		return this.retrieve('tween');
	}

};

Element.implement({

	tween: function(property, from, to){
		this.get('tween').start(arguments);
		return this;
	},

	fade: function(how){
		var fade = this.get('tween'), o = 'opacity', toggle;
		how = $pick(how, 'toggle');
		switch (how){
			case 'in': fade.start(o, 1); break;
			case 'out': fade.start(o, 0); break;
			case 'show': fade.set(o, 1); break;
			case 'hide': fade.set(o, 0); break;
			case 'toggle':
				var flag = this.retrieve('fade:flag', this.get('opacity') == 1);
				fade.start(o, (flag) ? 0 : 1);
				this.store('fade:flag', !flag);
				toggle = true;
			break;
			default: fade.start(o, arguments);
		}
		if (!toggle) this.eliminate('fade:flag');
		return this;
	},

	highlight: function(start, end){
		if (!end){
			end = this.retrieve('highlight:original', this.getStyle('background-color'));
			end = (end == 'transparent') ? '#fff' : end;
		}
		var tween = this.get('tween');
		tween.start('background-color', start || '#ffff88', end).chain(function(){
			this.setStyle('background-color', this.retrieve('highlight:original'));
			tween.callChain();
		}.bind(this));
		return this;
	}

});


/*
Script: Fx.Morph.js
	Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.

License:
	MIT-style license.
*/

Fx.Morph = new Class({

	Extends: Fx.CSS,

	initialize: function(element, options){
		this.element = this.subject = $(element);
		this.parent(options);
	},

	set: function(now){
		if (typeof now == 'string') now = this.search(now);
		for (var p in now) this.render(this.element, p, now[p], this.options.unit);
		return this;
	},

	compute: function(from, to, delta){
		var now = {};
		for (var p in from) now[p] = this.parent(from[p], to[p], delta);
		return now;
	},

	start: function(properties){
		if (!this.check(arguments.callee, properties)) return this;
		if (typeof properties == 'string') properties = this.search(properties);
		var from = {}, to = {};
		for (var p in properties){
			var parsed = this.prepare(this.element, p, properties[p]);
			from[p] = parsed.from;
			to[p] = parsed.to;
		}
		return this.parent(from, to);
	}

});

Element.Properties.morph = {

	set: function(options){
		var morph = this.retrieve('morph');
		if (morph) morph.cancel();
		return this.eliminate('morph').store('morph:options', $extend({link: 'cancel'}, options));
	},

	get: function(options){
		if (options || !this.retrieve('morph')){
			if (options || !this.retrieve('morph:options')) this.set('morph', options);
			this.store('morph', new Fx.Morph(this, this.retrieve('morph:options')));
		}
		return this.retrieve('morph');
	}

};

Element.implement({

	morph: function(props){
		this.get('morph').start(props);
		return this;
	}

});

/*
Script: Fx.Transitions.js
	Contains a set of advanced transitions to be used with any of the Fx Classes.

License:
	MIT-style license.

Credits:
	Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.
*/

(function(){

	var old = Fx.prototype.initialize;

	Fx.prototype.initialize = function(options){
		old.call(this, options);
		var trans = this.options.transition;
		if (typeof trans == 'string' && (trans = trans.split(':'))){
			var base = Fx.Transitions;
			base = base[trans[0]] || base[trans[0].capitalize()];
			if (trans[1]) base = base['ease' + trans[1].capitalize() + (trans[2] ? trans[2].capitalize() : '')];
			this.options.transition = base;
		}
	};

})();

Fx.Transition = function(transition, params){
	params = $splat(params);
	return $extend(transition, {
		easeIn: function(pos){
			return transition(pos, params);
		},
		easeOut: function(pos){
			return 1 - transition(1 - pos, params);
		},
		easeInOut: function(pos){
			return (pos <= 0.5) ? transition(2 * pos, params) / 2 : (2 - transition(2 * (1 - pos), params)) / 2;
		}
	});
};

Fx.Transitions = new Hash({

	linear: $arguments(0)

});

Fx.Transitions.extend = function(transitions){
	for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
};

Fx.Transitions.extend({

	Pow: function(p, x){
		return Math.pow(p, x[0] || 6);
	},

	Expo: function(p){
		return Math.pow(2, 8 * (p - 1));
	},

	Circ: function(p){
		return 1 - Math.sin(Math.acos(p));
	},

	Sine: function(p){
		return 1 - Math.sin((1 - p) * Math.PI / 2);
	},

	Back: function(p, x){
		x = x[0] || 1.618;
		return Math.pow(p, 2) * ((x + 1) * p - x);
	},

	Bounce: function(p){
		var value;
		for (var a = 0, b = 1; 1; a += b, b /= 2){
			if (p >= (7 - 4 * a) / 11){
				value = - Math.pow((11 - 6 * a - 11 * p) / 4, 2) + b * b;
				break;
			}
		}
		return value;
	},

	Elastic: function(p, x){
		return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x[0] || 1) / 3);
	}

});

['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
	Fx.Transitions[transition] = new Fx.Transition(function(p){
		return Math.pow(p, [i + 2]);
	});
});


/*
Script: Request.js
	Powerful all purpose Request Class. Uses XMLHTTPRequest.

License:
	MIT-style license.
*/

var Request = new Class({

	Implements: [Chain, Events, Options],

	options: {
		/*onRequest: $empty,
		onSuccess: $empty,
		onFailure: $empty,
		onException: $empty,*/
		url: '',
		data: '',
		headers: {
			'X-Requested-With': 'XMLHttpRequest',
			'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
		},
		async: true,
		format: false,
		method: 'post',
		link: 'ignore',
		isSuccess: null,
		emulation: true,
		urlEncoded: true,
		encoding: 'utf-8',
		evalScripts: false,
		evalResponse: false
	},

	initialize: function(options){
		this.xhr = new Browser.Request();
		this.setOptions(options);
		this.options.isSuccess = this.options.isSuccess || this.isSuccess;
		this.headers = new Hash(this.options.headers);
	},

	onStateChange: function(){
		if (this.xhr.readyState != 4 || !this.running) return;
		this.running = false;
		this.status = 0;
		$try(function(){
			this.status = this.xhr.status;
		}.bind(this));
		if (this.options.isSuccess.call(this, this.status)){
			this.response = {text: this.xhr.responseText, xml: this.xhr.responseXML};
			this.success(this.response.text, this.response.xml);
		} else {
			this.response = {text: null, xml: null};
			this.failure();
		}
		this.xhr.onreadystatechange = $empty;
	},

	isSuccess: function(){
		return ((this.status >= 200) && (this.status < 300));
	},

	processScripts: function(text){
		if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return $exec(text);
		return text.stripScripts(this.options.evalScripts);
	},

	success: function(text, xml){
		this.onSuccess(this.processScripts(text), xml);
	},
	
	onSuccess: function(){
		this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
	},
	
	failure: function(){
		this.onFailure();
	},

	onFailure: function(){
		this.fireEvent('complete').fireEvent('failure', this.xhr);
	},

	setHeader: function(name, value){
		this.headers.set(name, value);
		return this;
	},

	getHeader: function(name){
		return $try(function(){
			return this.xhr.getResponseHeader(name);
		}.bind(this));
	},

	check: function(caller){
		if (!this.running) return true;
		switch (this.options.link){
			case 'cancel': this.cancel(); return true;
			case 'chain': this.chain(caller.bind(this, Array.slice(arguments, 1))); return false;
		}
		return false;
	},

	send: function(options){
		if (!this.check(arguments.callee, options)) return this;
		this.running = true;

		var type = $type(options);
		if (type == 'string' || type == 'element') options = {data: options};

		var old = this.options;
		options = $extend({data: old.data, url: old.url, method: old.method}, options);
		var data = options.data, url = options.url, method = options.method;

		switch ($type(data)){
			case 'element': data = $(data).toQueryString(); break;
			case 'object': case 'hash': data = Hash.toQueryString(data);
		}

		if (this.options.format){
			var format = 'format=' + this.options.format;
			data = (data) ? format + '&' + data : format;
		}

		if (this.options.emulation && ['put', 'delete'].contains(method)){
			var _method = '_method=' + method;
			data = (data) ? _method + '&' + data : _method;
			method = 'post';
		}

		if (this.options.urlEncoded && method == 'post'){
			var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
			this.headers.set('Content-type', 'application/x-www-form-urlencoded' + encoding);
		}

		if (data && method == 'get'){
			url = url + (url.contains('?') ? '&' : '?') + data;
			data = null;
		}

		this.xhr.open(method.toUpperCase(), url, this.options.async);

		this.xhr.onreadystatechange = this.onStateChange.bind(this);

		this.headers.each(function(value, key){
			if (!$try(function(){
				this.xhr.setRequestHeader(key, value);
				return true;
			}.bind(this))) this.fireEvent('exception', [key, value]);
		}, this);

		this.fireEvent('request');
		this.xhr.send(data);
		if (!this.options.async) this.onStateChange();
		return this;
	},

	cancel: function(){
		if (!this.running) return this;
		this.running = false;
		this.xhr.abort();
		this.xhr.onreadystatechange = $empty;
		this.xhr = new Browser.Request();
		this.fireEvent('cancel');
		return this;
	}

});

(function(){

var methods = {};
['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){
	methods[method] = function(){
		var params = Array.link(arguments, {url: String.type, data: $defined});
		return this.send($extend(params, {method: method.toLowerCase()}));
	};
});

Request.implement(methods);

})();

Element.Properties.send = {
	
	set: function(options){
		var send = this.retrieve('send');
		if (send) send.cancel();
		return this.eliminate('send').store('send:options', $extend({
			data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
		}, options));
	},

	get: function(options){
		if (options || !this.retrieve('send')){
			if (options || !this.retrieve('send:options')) this.set('send', options);
			this.store('send', new Request(this.retrieve('send:options')));
		}
		return this.retrieve('send');
	}

};

Element.implement({

	send: function(url){
		var sender = this.get('send');
		sender.send({data: this, url: url || sender.options.url});
		return this;
	}

});


/*
Script: Request.HTML.js
	Extends the basic Request Class with additional methods for interacting with HTML responses.

License:
	MIT-style license.
*/

Request.HTML = new Class({

	Extends: Request,

	options: {
		update: false,
		evalScripts: true,
		filter: false
	},

	processHTML: function(text){
		var match = text.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
		text = (match) ? match[1] : text;
		
		var container = new Element('div');
		
		return $try(function(){
			var root = '<root>' + text + '</root>', doc;
			if (Browser.Engine.trident){
				doc = new ActiveXObject('Microsoft.XMLDOM');
				doc.async = false;
				doc.loadXML(root);
			} else {
				doc = new DOMParser().parseFromString(root, 'text/xml');
			}
			root = doc.getElementsByTagName('root')[0];
			for (var i = 0, k = root.childNodes.length; i < k; i++){
				var child = Element.clone(root.childNodes[i], true, true);
				if (child) container.grab(child);
			}
			return container;
		}) || container.set('html', text);
	},

	success: function(text){
		var options = this.options, response = this.response;
		
		response.html = text.stripScripts(function(script){
			response.javascript = script;
		});
		
		var temp = this.processHTML(response.html);
		
		response.tree = temp.childNodes;
		response.elements = temp.getElements('*');
		
		if (options.filter) response.tree = response.elements.filter(options.filter);
		if (options.update) $(options.update).empty().adopt(response.tree);
		if (options.evalScripts) $exec(response.javascript);
		
		this.onSuccess(response.tree, response.elements, response.html, response.javascript);
	}

});

Element.Properties.load = {
	
	set: function(options){
		var load = this.retrieve('load');
		if (load) send.cancel();
		return this.eliminate('load').store('load:options', $extend({data: this, link: 'cancel', update: this, method: 'get'}, options));
	},

	get: function(options){
		if (options || ! this.retrieve('load')){
			if (options || !this.retrieve('load:options')) this.set('load', options);
			this.store('load', new Request.HTML(this.retrieve('load:options')));
		}
		return this.retrieve('load');
	}

};

Element.implement({
	
	load: function(){
		this.get('load').send(Array.link(arguments, {data: Object.type, url: String.type}));
		return this;
	}

});


/*
Script: Request.JSON.js
	Extends the basic Request Class with additional methods for sending and receiving JSON data.

License:
	MIT-style license.
*/

Request.JSON = new Class({

	Extends: Request,

	options: {
		secure: true
	},

	initialize: function(options){
		this.parent(options);
		this.headers.extend({'Accept': 'application/json', 'X-Request': 'JSON'});
	},

	success: function(text){
		this.response.json = JSON.decode(text, this.options.secure);
		this.onSuccess(this.response.json, text);
	}

});

/**
 * Observer - Observe formelements for changes
 *
 * - Additional code from clientside.cnet.com
 *
 * @version		1.1
 *
 * @license		MIT-style license
 * @author		Harald Kirschner <mail [at] digitarald.de>
 * @copyright	Author
 */
var Observer = new Class({

	Implements: [Options, Events],

	options: {
		periodical: false,
		delay: 1000
	},

	initialize: function(el, onFired, options){
		this.element = $(el) || $$(el);
		this.addEvent('onFired', onFired);
		this.setOptions(options);
		this.bound = this.changed.bind(this);
		this.resume();
	},

	changed: function() {
		var value = this.element.get('value');
		if ($equals(this.value, value)) return;
		this.clear();
		this.value = value;
		this.timeout = this.onFired.delay(this.options.delay, this);
	},

	setValue: function(value) {
		this.value = value;
		this.element.set('value', value);
		return this.clear();
	},

	onFired: function() {
		this.fireEvent('onFired', [this.value, this.element]);
	},

	clear: function() {
		$clear(this.timeout || null);
		return this;
	},

	pause: function(){
		if (this.timer) $clear(this.timer);
		else this.element.removeEvent('keyup', this.bound);
		return this.clear();
	},

	resume: function(){
		this.value = this.element.get('value');
		if (this.options.periodical) this.timer = this.changed.periodical(this.options.periodical, this);
		else this.element.addEvent('keyup', this.bound);
		return this;
	}

});

var $equals = function(obj1, obj2) {
	return (obj1 == obj2 || JSON.encode(obj1) == JSON.encode(obj2));
};

/**
 * Autocompleter
 *
 * http://digitarald.de/project/autocompleter/
 *
 * @version		1.1.2
 *
 * @license		MIT-style license
 * @author		Harald Kirschner <mail [at] digitarald.de>
 * @copyright	Author
 */

var Autocompleter = new Class({

	Implements: [Options, Events],

	options: {/*
		onOver: $empty,
		onSelect: $empty,
		onSelection: $empty,
		onShow: $empty,
		onHide: $empty,
		onBlur: $empty,
		onFocus: $empty,*/
		minLength: 1,
		markQuery: true,
		width: 'inherit',
		maxChoices: 10,
		injectChoice: null,
		customChoices: null,
		emptyChoices: null,
		visibleChoices: true,
		className: 'autocompleter-choices',
		zIndex: 42,
		delay: 400,
		observerOptions: {},
		fxOptions: {},

		autoSubmit: false,
		overflow: false,
		overflowMargin: 25,
		selectFirst: false,
		filter: null,
		filterCase: false,
		filterSubset: false,
		forceSelect: false,
		selectMode: true,
		choicesMatch: null,

		multiple: false,
		separator: ', ',
		separatorSplit: /\s*[,;]\s*/,
		autoTrim: false,
		allowDupes: false,

		cache: true,
		relative: false
	},

	initialize: function(element, options) {
		this.element = $(element);
		this.setOptions(options);
		this.build();
		this.observer = new Observer(this.element, this.prefetch.bind(this), $merge({
			'delay': this.options.delay
		}, this.options.observerOptions));
		this.queryValue = null;
		if (this.options.filter) this.filter = this.options.filter.bind(this);
		var mode = this.options.selectMode;
		this.typeAhead = (mode == 'type-ahead');
		this.selectMode = (mode === true) ? 'selection' : mode;
		this.cached = [];
	},

	/**
	 * build - Initialize DOM
	 *
	 * Builds the html structure for choices and appends the events to the element.
	 * Override this function to modify the html generation.
	 */
	build: function() {
		if ($(this.options.customChoices)) {
			this.choices = this.options.customChoices;
		} else {
			this.choices = new Element('ul', {
				'class': this.options.className,
				'styles': {
					'zIndex': this.options.zIndex
				}
			}).inject(document.body);
			this.relative = false;
			if (this.options.relative) {
				this.choices.inject(this.element, 'after');
				this.relative = this.element.getOffsetParent();
			}
			this.fix = new OverlayFix(this.choices);
		}
		if (!this.options.separator.test(this.options.separatorSplit)) {
			this.options.separatorSplit = this.options.separator;
		}
		this.fx = (!this.options.fxOptions) ? null : new Fx.Tween(this.choices, $merge({
			'property': 'opacity',
			'link': 'cancel',
			'duration': 200
		}, this.options.fxOptions)).addEvent('onStart', Chain.prototype.clearChain).set(0);
		this.element.setProperty('autocomplete', 'off')
			.addEvent((Browser.Engine.trident || Browser.Engine.webkit) ? 'keydown' : 'keypress', this.onCommand.bind(this))
			.addEvent('click', this.onCommand.bind(this, [false]))
			.addEvent('focus', this.toggleFocus.create({bind: this, arguments: true, delay: 100}))
			.addEvent('blur', this.toggleFocus.create({bind: this, arguments: false, delay: 100}));
	},

	destroy: function() {
		if (this.fix) this.fix.destroy();
		this.choices = this.selected = this.choices.destroy();
	},

	toggleFocus: function(state) {
		this.focussed = state;
		if (!state) this.hideChoices(true);
		this.fireEvent((state) ? 'onFocus' : 'onBlur', [this.element]);
	},

	onCommand: function(e) {
		if (!e && this.focussed) return this.prefetch();
		if (e && e.key && !e.shift) {
			switch (e.key) {
				case 'enter':
					if (this.element.value != this.opted) return true;
					if (this.selected && this.visible) {
						this.choiceSelect(this.selected);
						return !!(this.options.autoSubmit);
					}
					break;
				case 'up': case 'down':
					if (!this.prefetch() && this.queryValue !== null) {
						var up = (e.key == 'up');
						this.choiceOver((this.selected || this.choices)[
							(this.selected) ? ((up) ? 'getPrevious' : 'getNext') : ((up) ? 'getLast' : 'getFirst')
						](this.options.choicesMatch), true);
					}
					return false;
				case 'esc': case 'tab':
					this.hideChoices(true);
					break;
			}
		}
		return true;
	},

	setSelection: function(finish) {
		var input = this.selected.inputValue, value = input;
		var start = this.queryValue.length, end = input.length;
		if (input.substr(0, start).toLowerCase() != this.queryValue.toLowerCase()) start = 0;
		if (this.options.multiple) {
			var split = this.options.separatorSplit;
			value = this.element.value;
			start += this.queryIndex;
			end += this.queryIndex;
			var old = value.substr(this.queryIndex).split(split, 1)[0];
			value = value.substr(0, this.queryIndex) + input + value.substr(this.queryIndex + old.length);
			if (finish) {
				var tokens = value.split(this.options.separatorSplit).filter(function(entry) {
					return this.test(entry);
				}, /[^\s,]+/);
				if (!this.options.allowDupes) tokens = [].combine(tokens);
				var sep = this.options.separator;
				value = tokens.join(sep) + sep;
				end = value.length;
			}
		}
		this.observer.setValue(value);
		this.opted = value;
		if (finish || this.selectMode == 'pick') start = end;
		this.element.selectRange(start, end);
		this.fireEvent('onSelection', [this.element, this.selected, value, input]);
	},

	showChoices: function() {
		var match = this.options.choicesMatch, first = this.choices.getFirst(match);
		this.selected = this.selectedValue = null;
		if (this.fix) {
			var pos = this.element.getCoordinates(this.relative), width = this.options.width || 'auto';
			this.choices.setStyles({
				'left': pos.left,
				'top': pos.bottom,
				'width': (width === true || width == 'inherit') ? pos.width : width
			});
		}
		if (!first) return;
		if (!this.visible) {
			this.visible = true;
			this.choices.setStyle('display', '');
			if (this.fx) this.fx.start(1);
			this.fireEvent('onShow', [this.element, this.choices]);
		}
		if (this.options.selectFirst || this.typeAhead || first.inputValue == this.queryValue) this.choiceOver(first, this.typeAhead);
		var items = this.choices.getChildren(match), max = this.options.maxChoices;
		var styles = {'overflowY': 'hidden', 'height': ''};
		this.overflown = false;
		if (items.length > max) {
			var item = items[max - 1];
			styles.overflowY = 'scroll';
			styles.height = item.getCoordinates(this.choices).bottom;
			this.overflown = true;
		};
		this.choices.setStyles(styles);
		this.fix.show();
		if (this.options.visibleChoices) {
			var scroll = document.getScroll(),
			size = document.getSize(),
			coords = this.choices.getCoordinates();
			if (coords.right > scroll.x + size.x) scroll.x = coords.right - size.x;
			if (coords.bottom > scroll.y + size.y) scroll.y = coords.bottom - size.y;
			window.scrollTo(Math.min(scroll.x, coords.left), Math.min(scroll.y, coords.top));
		}
	},

	hideChoices: function(clear) {
		if (clear) {
			var value = this.element.value;
			if (this.options.forceSelect) value = this.opted;
			if (this.options.autoTrim) {
				value = value.split(this.options.separatorSplit).filter($arguments(0)).join(this.options.separator);
			}
			this.observer.setValue(value);
		}
		if (!this.visible) return;
		this.visible = false;
		if (this.selected) this.selected.removeClass('autocompleter-selected');
		this.observer.clear();
		var hide = function(){
			this.choices.setStyle('display', 'none');
			this.fix.hide();
		}.bind(this);
		if (this.fx) this.fx.start(0).chain(hide);
		else hide();
		this.fireEvent('onHide', [this.element, this.choices]);
	},

	prefetch: function() {
		var value = this.element.value, query = value;
		if (this.options.multiple) {
			var split = this.options.separatorSplit;
			var values = value.split(split);
			var index = this.element.getSelectedRange().start;
			var toIndex = value.substr(0, index).split(split);
			var last = toIndex.length - 1;
			index -= toIndex[last].length;
			query = values[last];
		}
		if (query.length < this.options.minLength) {
			this.hideChoices();
		} else {
			if (query === this.queryValue || (this.visible && query == this.selectedValue)) {
				if (this.visible) return false;
				this.showChoices();
			} else {
				this.queryValue = query;
				this.queryIndex = index;
				if (!this.fetchCached()) this.query();
			}
		}
		return true;
	},

	fetchCached: function() {
		return false;
		if (!this.options.cache
			|| !this.cached
			|| !this.cached.length
			|| this.cached.length >= this.options.maxChoices
			|| this.queryValue) return false;
		this.update(this.filter(this.cached));
		return true;
	},

	update: function(tokens) {
		this.choices.empty();
		this.cached = tokens;
		var type = tokens && $type(tokens);
		if (!type || (type == 'array' && !tokens.length) || (type == 'hash' && !tokens.getLength())) {
			(this.options.emptyChoices || this.hideChoices).call(this);
		} else {
			if (this.options.maxChoices < tokens.length && !this.options.overflow) tokens.length = this.options.maxChoices;
			tokens.each(this.options.injectChoice || function(token){
				var choice = new Element('li', {'html': this.markQueryValue(token)});
				choice.inputValue = token;
				this.addChoiceEvents(choice).inject(this.choices);
			}, this);
			this.showChoices();
		}
	},

	choiceOver: function(choice, selection) {
		if (!choice || choice == this.selected) return;
		if (this.selected) this.selected.removeClass('autocompleter-selected');
		this.selected = choice.addClass('autocompleter-selected');
		this.fireEvent('onSelect', [this.element, this.selected, selection]);
		if (!this.selectMode) this.opted = this.element.value;
		if (!selection) return;
		this.selectedValue = this.selected.inputValue;
		if (this.overflown) {
			var coords = this.selected.getCoordinates(this.choices), margin = this.options.overflowMargin,
				top = this.choices.scrollTop, height = this.choices.offsetHeight, bottom = top + height;
			if (coords.top - margin < top && top) this.choices.scrollTop = Math.max(coords.top - margin, 0);
			else if (coords.bottom + margin > bottom) this.choices.scrollTop = Math.min(coords.bottom - height + margin, bottom);
		}
		if (this.selectMode) this.setSelection();
	},

	choiceSelect: function(choice) {
		if (choice) this.choiceOver(choice);
		this.setSelection(true);
		this.queryValue = false;
		this.hideChoices();
	},

	filter: function(tokens) {
		return (tokens || this.tokens).filter(function(token) {
			return this.test(token);
		}, new RegExp(((this.options.filterSubset) ? '' : '^') + this.queryValue.escapeRegExp(), (this.options.filterCase) ? '' : 'i'));
	},

	/**
	 * markQueryValue
	 *
	 * Marks the queried word in the given string with <span class="autocompleter-queried">*</span>
	 * Call this i.e. from your custom parseChoices, same for addChoiceEvents
	 *
	 * @param		{String} Text
	 * @return		{String} Text
	 */
	markQueryValue: function(str) {
		return (!this.options.markQuery || !this.queryValue) ? str
			: str.replace(new RegExp('(' + ((this.options.filterSubset) ? '' : '^') + this.queryValue.escapeRegExp() + ')', (this.options.filterCase) ? '' : 'i'), '<span class="autocompleter-queried">$1</span>');
	},

	/**
	 * addChoiceEvents
	 *
	 * Appends the needed event handlers for a choice-entry to the given element.
	 *
	 * @param		{Element} Choice entry
	 * @return		{Element} Choice entry
	 */
	addChoiceEvents: function(el) {
		return el.addEvents({
			'mouseover': this.choiceOver.bind(this, [el]),
			'click': this.choiceSelect.bind(this, [el])
		});
	}
});

var OverlayFix = new Class({

	initialize: function(el) {
		if (Browser.Engine.trident) {
			this.element = $(el);
			this.relative = this.element.getOffsetParent();
			this.fix = new Element('iframe', {
				'frameborder': '0',
				'scrolling': 'no',
				'src': 'javascript:false;',
				'styles': {
					'position': 'absolute',
					'border': 'none',
					'display': 'none',
					'filter': 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)'
				}
			}).inject(this.element, 'after');
		}
	},

	show: function() {
		if (this.fix) {
			var coords = this.element.getCoordinates(this.relative);
			delete coords.right;
			delete coords.bottom;
			this.fix.setStyles($extend(coords, {
				'display': '',
				'zIndex': (this.element.getStyle('zIndex') || 1) - 1
			}));
		}
		return this;
	},

	hide: function() {
		if (this.fix) this.fix.setStyle('display', 'none');
		return this;
	},

	destroy: function() {
		if (this.fix) this.fix = this.fix.destroy();
	}

});

Element.implement({

	getSelectedRange: function() {
		if (!Browser.Engine.trident) return {start: this.selectionStart, end: this.selectionEnd};
		var pos = {start: 0, end: 0};
		var range = this.getDocument().selection.createRange();
		if (!range || range.parentElement() != this) return pos;
		var dup = range.duplicate();
		if (this.type == 'text') {
			pos.start = 0 - dup.moveStart('character', -100000);
			pos.end = pos.start + range.text.length;
		} else {
			var value = this.value;
			var offset = value.length - value.match(/[\n\r]*$/)[0].length;
			dup.moveToElementText(this);
			dup.setEndPoint('StartToEnd', range);
			pos.end = offset - dup.text.length;
			dup.setEndPoint('StartToStart', range);
			pos.start = offset - dup.text.length;
		}
		return pos;
	},

	selectRange: function(start, end) {
		if (Browser.Engine.trident) {
			var diff = this.value.substr(start, end - start).replace(/\r/g, '').length;
			start = this.value.substr(0, start).replace(/\r/g, '').length;
			var range = this.createTextRange();
			range.collapse(true);
			range.moveEnd('character', start + diff);
			range.moveStart('character', start);
			range.select();
		} else {
			this.focus();
			this.setSelectionRange(start, end);
		}
		return this;
	}

});

/* compatibility */

Autocompleter.Base = Autocompleter;

/**
 * Autocompleter.Local
 *
 * http://digitarald.de/project/autocompleter/
 *
 * @version		1.1.2
 *
 * @license		MIT-style license
 * @author		Harald Kirschner <mail [at] digitarald.de>
 * @copyright	Author
 */

Autocompleter.Local = new Class({

	Extends: Autocompleter,

	options: {
		minLength: 0,
		delay: 200
	},

	initialize: function(element, tokens, options) {
		this.parent(element, options);
		this.tokens = tokens;
	},

	query: function() {
		this.update(this.filter());
	}

});

document.addEvent('domready', function() {

	// 
	var tokens = ['austin,tx', 'las vegas,nv', 'phoenix,az', 'chicago,il', 'houston,tx', 'los angeles,ca', 'new york,ny', 'atlanta,ga', 'portland,or', 'orlando,fl', 'tampa,fl', 'tucson,az', 'sacramento,ca', 'indianapolis,in', 'san antonio,tx', 'charlotte,nc', 'minneapolis,mn', 'san jose,ca', 'miami,fl', 'denver,co', 'baltimore,md', 'san francisco,ca', 'colorado springs,co', 'memphis,tn', 'columbus,oh', 'san diego,ca', 'richmond,va', 'albuquerque,nm', 'arlington,tx', 'dallas,tx', 'raleigh,nc', 'louisville,ky', 'jacksonville,fl', 'omaha,ne', 'anaheim,ca', 'cincinnati,oh', 'nashville,tn', 'seattle,wa', 'reno,nv', 'saint paul,mn', 'birmingham,al', 'kansas city,mo', 'riverside,ca', 'gainesville,fl', 'tallahassee,fl', 'philadelphia,pa', 'madison,wi', 'mesa,az', 'baton rouge,la', 'milwaukee,wi', 'salt lake city,ut', 'boston,ma', 'columbia,sc', 'greensboro,nc', 'arlington,va', 'lexington,ky', 'corpus christi,tx', 'sunnyvale,ca', 'oklahoma city,ok', 'tempe,az', 'tulsa,ok', 'el paso,tx', 'alexandria,va', 'aurora,co', 'beaverton,or', 'virginia beach,va', 'west palm beach,fl', 'knoxville,tn', 'bellevue,wa', 'hayward,ca', 'anchorage,ak', 'oakland,ca', 'bloomington,in', 'grand rapids,mi', 'rochester,ny', 'long beach,ca', 'scottsdale,az', 'new orleans,la', 'vancouver,wa', 'detroit,mi', 'st. louis,mo', 'boise,id', 'durham,nc', 'mountain view,ca', 'pittsburgh,pa', 'little rock,ar', 'silver spring,md', 'amarillo,tx', 'des moines,ia', 'sioux falls,sd', 'waco,tx', 'fremont,ca', 'everett,wa', 'lincoln,ne', 'huntsville,al', 'davis,ca', 'salem,or', 'jackson,ms', 'newport news,va', 'glendale,az', 'fort worth,tx', 'san bernardino,ca', 'norfolk,va', 'shreveport,la', 'cleveland,oh', 'carmichael,ca', 'belchertown,ma', 'montgomery,al', 'toledo,oh', 'santa clara,ca', 'hollywood,fl', 'eugene,or', 'costa mesa,ca', 'fresno,ca', 'charlottesville,va', 'torrance,ca', 'pensacola,fl', 'spokane,wa', 'sherman oaks,ca', 'mobile,al', 'sarasota,fl', 'east lansing,mi', 'lansing,mi', 'tacoma,wa', 'san leandro,ca', 'fullerton,ca', 'wilmington,de', 'athens,ga', 'denton,tx', 'ann arbor,mi', 'beaumont,tx', 'chattanooga,tn', 'greenville,sc', 'saint louis,mo', 'college station,tx', 'boulder,co', 'naples,fl', 'saint petersburg,fl', 'lubbock,tx', 'lynnwood,wa', 'metairie,la', 'newark,de', 'san angelo,tx', 'san mateo,ca', 'boca raton,fl', 'augusta,ga', 'huntington beach,ca', 'walnut creek,ca', 'savannah,ga', 'peoria,il', 'henderson,nv', 'bellingham,wa', 'west hollywood,ca', 'fort myers,fl', 'topeka,ks', 'chandler,az', 'lawrence,ks', 'fargo,nd', 'santa ana,ca', 'miami beach,fl', 'irvine,ca', 'kalamazoo,mi', 'plano,tx', 'hampton,va', 'irving,tx', 'dayton,oh', 'gresham,or', 'charleston,sc', 'carrollton,tx', 'north hollywood,ca', 'rockford,il', 'lafayette,la', 'fayetteville,nc', 'wilmington,nc', 'morgantown,wv', 'orange,ca', 'bradenton,fl', 'murfreesboro,tn', 'tuscaloosa,al', 'lakewood,co', 'clearwater,fl', 'evansville,in', 'southfield,mi', 'garden grove,ca', 'blacksburg,va', 'oxnard,ca', 'pasadena,ca', 'tustin,ca', 'winter park,fl', 'macon,ga', 'van nuys,ca', 'honolulu,hi', 'abilene,tx', 'fort wayne,in', 'citrus heights,ca', 'el cajon,ca', 'ypsilanti,mi', 'fort collins,co', 'kissimmee,fl', 'pompano beach,fl', 'marietta,ga', 'palo alto,ca', 'lakeland,fl', 'columbia,md', 'las cruces,nm', 'tyler,tx', 'bremerton,wa', 'springfield,il', 'provo,ut', 'auburn,wa', 'melbourne,fl', 'overland park,ks', 'buffalo,ny', 'ontario,ca', 'santa barbara,ca', 'rexburg,id', 'akron,oh', 'fayetteville,ar', 'st. petersburg,fl', 'columbus,ga', 'laurel,md', 'syracuse,ny', 'roanoke,va', 'downey,ca', 'rancho cordova,ca', 'panama city,fl', 'winston-salem,nc', 'allentown,pa', 'greeley,co', 'champaign,il', 'trenton,nj', 'hyattsville,md', 'bryan,tx', 'alameda,ca', 'pueblo,co', 'greenville,nc', 'erie,pa', 'providence,ri', 'campbell,ca', 'chula vista,ca', 'fort lauderdale,fl', 'north miami,fl', 'davenport,ia', 'columbia,mo', 'sparks,nv', 'winston salem,nc', 'nacogdoches,tx', 'altamonte springs,fl', 'hialeah,fl', 'urbana,il', 'cedar rapids,ia', 'gaithersburg,md', 'northridge,ca', 'santa cruz,ca', 'vista,ca', 'norcross,ga', 'hillsboro,or', 'baytown,tx', 'ogden,ut', 'falls church,va', 'west covina,ca', 'deerfield beach,fl', 'lafayette,in', 'iowa city,ia', 'hattiesburg,ms', 'chapel hill,nc', 'bedford,tx', 'chesapeake,va', 'green bay,wi', 'redlands,ca', 'roseville,ca', 'arvada,co', 'biloxi,ms', 'gulfport,ms', 'buena park,ca', 'glendale,ca', 'lancaster,ca', 'oceanside,ca', 'woodland,ca', 'aurora,il', 'bothell,wa', 'hemet,ca', 'palm springs,ca', 'ocala,fl', 'carbondale,il', 'naperville,il', 'cary,nc', 'fairfax,va', 'brandon,fl', 'west des moines,ia', 'monroe,la', 'conroe,tx', 'olympia,wa', 'rancho cucamonga,ca', 'hartford,ct', 'dekalb,il', 'glen burnie,md', 'burnsville,mn', 'wichita falls,tx', 'florence,al', 'concord,ca', 'largo,fl', 'corvallis,or', 'myrtle beach,sc', 'rock hill,sc', 'lewisville,tx', 'renton,wa', 'auburn,al', 'upland,ca', 'coral springs,fl', 'warner robins,ga', 'rochester,mn', 'saint cloud,mn', 'santa monica,ca', 'ventura,ca', 'littleton,co', 'boynton beach,fl', 'lake worth,fl', 'alpharetta,ga', 'evanston,il', 'waukegan,il', 'annapolis,md', 'rockville,md', 'santa fe,nm', 'albany,ny', 'north charleston,sc', 'berkeley,ca', 'woodland hills,ca', 'new haven,ct', 'stamford,ct', 'homestead,fl', 'vero beach,fl', 'bloomington,il', 'cambridge,ma', 'flint,mi', 'rapid city,sd', 'victoria,tx', 'portsmouth,va', 'palmdale,ca', 'redwood city,ca', 'lawrenceville,ga', 'ames,ia', 'billings,mt', 'manchester,nh', 'bethlehem,pa', 'spartanburg,sc', 'brownsville,tx', 'manassas,va', 'kent,wa', 'canoga park,ca', 'whittier,ca', 'bowling green,ky', 'north las vegas,nv', 'ithaca,ny', 'reynoldsburg,oh', 'state college,pa', 'summerville,sc', 'spokane valley,wa', 'burbank,ca', 'redondo beach,ca', 'sanford,fl', 'dunwoody,ga', 'smyrna,ga', 'florence,ky', 'jersey city,nj', 'huntsville,tx', 'puyallup,wa', 'decatur,al', 'fairbanks,ak', 'la habra,ca', 'moreno valley,ca', 'thousand oaks,ca', 'delray beach,fl', 'fort pierce,fl', 'decatur,il', 'frederick,md', 'bellevue,ne', 'bensalem,pa', 'fredericksburg,va', 'federal way,wa', 'kennewick,wa', 'escondido,ca', 'la mesa,ca', 'santa rosa,ca', 'wichita,ks', 'farmington hills,mi', 'sterling heights,mi', 'westland,mi', 'edison,nj', 'high point,nc', 'westerville,oh', 'killeen,tx', 'temple,tx', 'jonesboro,ar', 'bakersfield,ca', 'studio city,ca', 'duluth,ga', 'hopkins,mn', 'missoula,mt', 'jacksonville,nc', 'woodbridge,va', 'waukesha,wi', 'flagstaff,az', 'brea,ca', 'covina,ca', 'los feliz,ca', 'south coast metro,ca', 'englewood,co', 'daytona beach,fl', 'decatur,ga', 'sioux city,ia', 'bethesda,md', 'towson,md', 'hackensack,nj', 'brooklyn,ny', 'grand forks,nd', 'clarksville,tn', 'kenosha,wi', 'manchester,ct', 'dover,de', 'titusville,fl', 'concord,nc', 'ft. worth,tx', 'sherman,tx', 'lynchburg,va', 'appleton,wi', 'oshkosh,wi', 'belmont,ca', 'california,ca', 'fair oaks,ca', 'los gatos,ca', 'newport beach,ca', 'stockton,ca', 'orange park,fl', 'sunrise,fl', 'normal,il', 'west lafayette,in', 'allston,ma', 'pontiac,mi', 'saginaw,mi', 'starkville,ms', 'vicksburg,ms', 'springfield,mo', 'harrisburg,pa', 'madison,al', 'peoria,az', 'sierra vista,az', 'bellflower,ca', 'westminster,co', 'winter haven,fl', 'greenwood,in', 'lake charles,la', 'dorchester,ma', 'battle creek,mi', 'royal oak,mi', 'meridian,ms', 'carson city,nv', 'concord,nh', 'lake oswego,or', 'medford,or', 'azusa,ca', 'rocklin,ca', 'bossier city,la', 'owings mills,md', 'clinton township,mi', 'mount pleasant,mi', 'oxford,ms', 'pascagoula,ms', 'cordova,tn', 'longview,tx', 'mesquite,tx', 'spring,tx', 'edmonds,wa', 'huntington,wv', 'martinsburg,wv', 'cupertino,ca', 'vacaville,ca', 'fort walton beach,fl', 'plant city,fl', 'albany,ga', 'idaho falls,id', 'manhattan,ks', 'worcester,ma', 'bismarck,nd', 'euless,tx', 'grand prairie,tx', 'clovis,ca', 'encino,ca', 'goleta,ca', 'livermore,ca', 'victorville,ca', 'norwich,ct', 'gainesville,ga', 'valdosta,ga', 'schaumburg,il', 'elkhart,in', 'portland,me', 'novi,mi', 'duluth,mn', 'atlantic city,nj', 'asheville,nc', 'gastonia,nc', 'dublin,oh', 'tigard,or', 'anderson,sc', 'humble,tx', 'saint george,ut', 'herndon,va', 'fitchburg,wi', 'la crosse,wi', 'cypress,ca', 'la jolla,ca', 'marina del rey,ca', 'palm desert,ca', 'san ramon,ca', 'santa clarita,ca', 'westminster,ca', 'new britain,ct', 'new castle,de', 'palm harbor,fl', 'plantation,fl', 'tamarac,fl', 'palatine,il', 'terre haute,in', 'waterloo,ia', 'gretna,la', 'hagerstown,md', 'jackson,mi', 'great falls,mt', 'camden,nj', 'liverpool,ny', 'florence,sc', 'kerrville,tx', 'richardson,tx', 'lakewood,wa', 'gilbert,az', 'daly city,ca', 'elk grove,ca', 'fallbrook,ca', 'modesto,ca', 'pomona,ca', 'simi valley,ca', 'temecula,ca', 'davie,fl', 'leesburg,fl', 'north bay village,fl', 'kennesaw,ga', 'joliet,il', 'carmel,in', 'south bend,in', 'council bluffs,ia', 'dubuque,ia', 'quincy,ma', 'muskegon,mi', 'eden prairie,mn', 'mankato,mn', 'tupelo,ms', 'nashua,nh', 'elizabeth,nj', 'new brunswick,nj', 'poughkeepsie,ny', 'edmond,ok', 'norman,ok', 'west chester,pa', 'hendersonville,tn', 'johnson city,tn', 'lufkin,tx', 'logan,ut', 'harrisonburg,va', 'charleston,wv', 'parkersburg,wv', 'eau claire,wi', 'north little rock,ar', 'menlo park,ca', 'longmont,co', 'bridgeport,ct', 'deland,fl', 'new port richey,fl', 'statesboro,ga', 'coeur d alene,id', 'nampa,id', 'suitland,md', 'lindenwold,nj', 'springfield,or', 'butler,pa', 'reading,pa', 'alvin,tx', 'league city,tx', 'san marcos,tx', 'reston,va', 'pullman,wa', 'janesville,wi', 'athens,al', 'carlsbad,ca', 'fairfield,ca', 'placentia,ca', 'pleasanton,ca', 'west van nuys,ca', 'grand junction,co', 'middletown,ct', 'bay harbor islands,fl', 'clermont,fl', 'ft. myers,fl', 'austell,ga', 'mount prospect,il', 'muncie,in', 'springfield,ma', 'canton,mi', 'warren,mi', 'greenville,ms', 'rocky mount,nc', 'canton,oh', 'warwick,ri', 'greenwood,sc', 'addison,tx', 'garland,tx', 'dothan,al', 'yuma,az', 'chatsworth,ca', 'folsom,ca', 'lake forest,ca', 'san marcos,ca', 'san rafael,ca', 'loveland,co', 'pinellas park,fl', 'south miami,fl', 'arlington heights,il', 'oak park,il', 'anderson,in', 'columbus,in', 'mishawaka,in', 'covington,ky', 'ocean city,md', 'windsor mill,md', 'waterford,mi', 'plymouth,mn', 'ridgeland,ms', 'cherry hill,nj', 'newark,nj', 'burlington,nc', 'carrboro,nc', 'euclid,oh', 'bend,or', 'lancaster,pa', 'antioch,tn', 'williamsburg,va', 'redmond,wa', 'casper,wy', 'phenix city,al', 'juneau,ak', 'springdale,ar', 'camarillo,ca', 'chino,ca', 'pacifica,ca', 'stanton,ca', 'broomfield,co', 'thornton,co', 'cape coral,fl', 'florida,fl', 'new smyrna beach,fl', 'sebring,fl', 'carrollton,ga', 'lithonia,ga', 'pocatello,id', 'macomb,il', 'valparaiso,in', 'frankfort,ky', 'alexandria,la', 'cockeysville,md', 'germantown,md', 'takoma park,md', 'amherst,ma', 'auburn hills,mi', 'taylor,mi', 'independence,mo', 'hoboken,nj', 'north brunswick,nj', 'parsippany,nj', 'wildwood,nj', 'roswell,nm', 'troy,ny', 'morrisville,nc', 'broken arrow,ok', 'muskogee,ok', 'albany,or', 'aiken,sc', 'sumter,sc', 'hermitage,tn', 'jackson,tn', 'madison,tn', 'allen,tx', 'greenville,tx', 'round rock,tx', 'west jordan,ut', 'ellensburg,wa', 'middleton,wi', 'salinas,ca', 'valley village,ca', 'west los angeles,ca', 'coconut creek,fl', 'cartersville,ga', 'roswell,ga', 'twin falls,id', 'wheaton,il', 'shawnee,ks', 'natchitoches,la', 'slidell,la', 'capitol heights,md', 'temple hills,md', 'lowell,ma', 'portage,mi', 'rochester hills,mi', 'troy,mi', 'webster,ny', 'keizer,or', 'grapevine,tx', 'paris,tx', 'rosenberg,tx', 'leesburg,va', 'midlothian,va', 'kirkland,wa', 'marysville,wa', 'silverdale,wa', 'oak creek,wi', 'prescott,az', 'conway,ar', 'mountain home,ar', 'pleasant hill,ca', 'northglenn,co', 'hamden,ct', 'oakland park,fl', 'canton,ga', 'dalton,ga', 'belleville,il', 'charleston,il', 'ruston,la', 'ellicott city,md', 'pikesville,md', 'arlington,ma', 'framingham,ma', 'plymouth,mi', 'southaven,ms', 'grand island,ne', 'somerset,nj', 'scranton,pa', 'franklin,tn', 'smyrna,tn', 'bay city,tx', 'katy,tx', 'orem,ut', 'west valley city,ut', 'ashburn,va', 'petersburg,va', 'burien,wa', 'racine,wi', 'fort smith,ar', 'barstow,ca', 'chico,ca', 'corona,ca', 'laguna niguel,ca', 'north highlands,ca', 'rohnert park,ca', 'san luis obispo,ca', 'new london,ct', 'waterbury,ct', 'claymont,de', 'milton,fl', 'pembroke pines,fl', 'conyers,ga', 'moscow,id', 'urbandale,ia', 'kansas city,ks', 'hammond,la', 'houma,la', 'west monroe,la', 'holland,mi', 'traverse city,mi', 'wyoming,mi', 'kalispell,mt', 'kearney,ne', 'dover,nh', 'bronx,ny', 'athens,oh', 'bowling green,oh', 'fairborn,oh', 'oregon city,or', 'tualatin,or', 'altoona,pa', 'chester,pa', 'coraopolis,pa', 'kingsport,tn', 'cedar park,tx', 'seabrook,tx', 'layton,ut', 'glen allen,va', 'mill creek,wa', 'new berlin,wi', 'jacksonville,al', 'jacksonville,ar', 'burlingame,ca', 'dublin,ca', 'richmond,ca', 'san clemente,ca', 'south san francisco,ca', 'lake mary,fl', 'port orange,fl', 'newnan,ga', 'elmhurst,il', 'lombard,il', 'westmont,il', 'kokomo,in', 'burlington,ia', 'paducah,ky', 'richmond,ky', 'college park,md', 'salisbury,md', 'belleville,mi', 'big rapids,mi', 'grand blanc,mi', 'monroe,mi', 'fort lee,nj', 'kernersville,nc', 'forest grove,or', 'wilsonville,or', 'carlisle,pa', 'king of prussia,pa', 'beaufort,sc', 'greer,sc', 'brookings,sd', 'big spring,tx', 'corsicana,tx', 'texas city,tx', 'clearfield,ut', 'burlington,vt', 'gig harbor,wa', 'neenah,wi', 'cheyenne,wy', 'casa grande,az', 'russellville,ar', 'highland,ca', 'valencia,ca', 'groton,ct', 'vernon rockville,ct', 'atlantic beach,fl', 'cocoa,fl', 'coral gables,fl', 'fernandina beach,fl', 'lauderhill,fl', 'miami lakes,fl', 'brunswick,ga', 'mcdonough,ga', 'caldwell,id', 'lisle,il', 'woodridge,il', 'jeffersonville,in', 'merrillville,in', 'coralville,ia', 'pittsburg,ks', 'owensboro,ky', 'kenner,la', 'chevy chase,md', 'dundalk,md', 'elkton,md', 'brookline,ma', 'marlborough,ma', 'howell,mi', 'midland,mi', 'northville,mi', 'clinton,ms', 'greenwood,ms', 'natchez,ms', 'st. charles,mo', 'columbus,ne', 'gallup,nm', 'schenectady,ny', 'hickory,nc', 'mooresville,nc', 'miamisburg,oh', 'west chester,oh', 'westlake,oh', 'troutdale,or', 'levittown,pa', 'cranston,ri', 'lexington,sc', 'mt. pleasant,sc', 'north augusta,sc', 'columbia,tn', 'angleton,tx', 'beeville,tx', 'cleburne,tx', 'frisco,tx', 'kingwood,tx', 'new braunfels,tx', 'sandy,ut', 'chester,va', 'danville,va', 'lacey,wa', 'longview,wa', 'richland,wa', 'wheeling,wv', 'beloit,wi', 'sheboygan,wi', 'texarkana,ar', 'aliso viejo,ca', 'fountain valley,ca', 'milpitas,ca', 'mission viejo,ca', 'west haven,ct', 'brooksville,fl', 'casselberry,fl', 'haines city,fl', 'merritt island,fl', 'palm bay,fl', 'port richey,fl', 'spring hill,fl', 'stuart,fl', 'temple terrace,fl', 'stockbridge,ga', 'carol stream,il', 'richmond,in', 'ankeny,ia', 'clinton,ia', 'marshalltown,ia', 'mason city,ia', 'new iberia,la', 'bel air,md', 'greenbelt,md', 'malden,ma', 'livonia,mi', 'brandon,ms', 'helena,mt', 'blackwood,nj', 'highland park,nj', 'marlton,nj', 'vineland,nj', 'carlsbad,nm', 'farmington,nm', 'apex,nc', 'salisbury,nc', 'wilson,nc', 'delaware,oh', 'parma heights,oh', 'stow,oh', 'klamath falls,or', 'milwaukie,or', 'camp hill,pa', 'chambersburg,pa', 'goose creek,sc', 'n charleston,sc', 'pierre,sd', 'brownwood,tx', 'coppell,tx', 'laredo,tx', 'mcallen,tx', 'mountlake terrace,wa', 'port orchard,wa', 'nome,ak', 'avondale,az', 'bullhead city,az', 'fontana,ca', 'foster city,ca', 'loma linda,ca', 'murrieta,ca', 'pittsburg,ca', 'rowland heights,ca', 'union city,ca', 'castle rock,co', 'east hartford,ct', 'crystal river,fl', 'ft. lauderdale,fl', 'ft. walton beach,fl', 'lake city,fl', 'oviedo,fl', 'palm beach,fl', 'palm beach gardens,fl', 'sunny isles beach,fl', 'venice,fl', 'douglasville,ga', 'milledgeville,ga', 'riverdale,ga', 'calumet city,il', 'des plaines,il', 'wheeling,il', 'marion,ia', 'georgetown,ky', 'hopkinsville,ky', 'somerset,ky', 'essex,md', 'oxon hill,md', 'riverdale,md', 'chicopee,ma', 'pittsfield,ma', 'revere,ma', 'waltham,ma', 'davison,mi', 'clarksdale,ms', 'columbus,ms', 'blue springs,mo', 'hazelwood,mo', 'o fallon,mo', 'la vista,ne', 'north platte,ne', 'south sioux city,ne', 'elko,nv', 'lakewood,nj', 'maple shade,nj', 'morristown,nj', 'piscataway,nj', 'alamogordo,nm', 'clifton park,ny', 'huntersville,nc', 'minot,nd', 'bedford,oh', 'canal winchester,oh', 'cuyahoga falls,oh', 'hilliard,oh', 'lima,oh', 'lansdale,pa', 'pottstown,pa', 'conway,sc', 'hanahan,sc', 'mount pleasant,sc', 'cleveland,tn', 'cookeville,tn', 'oak ridge,tn', 'alice,tx', 'brenham,tx', 'canyon,tx', 'commerce,tx', 'del rio,tx', 'dickinson,tx', 'mc kinney,tx', 'palestine,tx', 'pasadena,tx', 'the woodlands,tx', 'universal city,tx', 'webster,tx', 'centreville,va', 'stafford,va', 'suffolk,va', 'des moines,wa', 'de pere,wi', 'stevens point,wi', 'greenville,al', 'opelika,al', 'prattville,al', 'selma,al', 'lakewood,ca', 'north santa ana,ca', 'san dimas,ca', 'englewood,fl', 'eustis,fl', 'lake wales,fl', 'saint augustine,fl', 'seminole,fl', 'south daytona,fl', 'st augustine,fl', 'st pete beach,fl', 'zephyrhills,fl', 'calhoun,ga', 'doraville,ga', 'jonesboro,ga', 'wailuku,hi', 'lewiston,id', 'bensenville,il', 'gurnee,il', 'crawfordsville,in', 'fishers,in', 'west layfayette,in', 'muscatine,ia', 'newton,ia', 'hays,ks', 'lenexa,ks', 'olathe,ks', 'elizabethtown,ky', 'henderson,ky', 'radcliff,ky', 'bangor,me', 'catonsville,md', 'district heights,md', 'gwynn oak,md', 'lexington park,md', 'randallstown,md', 'fall river,ma', 'allendale,mi', 'okemos,mi', 'trenton,mi', 'osseo,mn', 'st paul,mn', 'cleveland,ms', 'long beach,ms', 'pearl,ms', 'yazoo city,ms', 'florissant,mo', 'blair,ne', 'fremont,ne', 'norfolk,ne', 'old bridge,nj', 'plainsboro,nj', 'middletown,ny', 'white plains,ny', 'berea,oh', 'elyria,oh', 'grove city,oh', 'kettering,oh', 'lakewood,oh', 'lebanon,oh', 'middletown,oh', 'durant,ok', 'clackamas,or', 'york,pa', 'orangeburg,sc', 'simpsonville,sc', 'morristown,tn', 'benbrook,tx', 'clute,tx', 'copperas cove,tx', 'mount pleasant,tx', 'north richland hills,tx', 'stafford,tx', 'midvale,ut', 'colonial heights,va', 'sterling,va', 'cheney,wa', 'tukwila,wa', 'yakima,wa', 'fairmont,wv', 'fond du lac,wi', 'lake geneva,wi', 'whitewater,wi', 'laramie,wy', 'sheridan,wy', 'anniston,al', 'cullman,al', 'foley,al', 'kenai,ak', 'antelope,ca', 'antioch,ca', 'chino hills,ca', 'culver city,ca', 'vallejo,ca', 'brighton,co', 'durango,co', 'danbury,ct', 'avon park,fl', 'cape canaveral,fl', 'crestview,fl', 'dade city,fl', 'dunedin,fl', 'jupiter,fl', 'key west,fl', 'ponte vedra beach,fl', 'port saint lucie,fl', 'riverview,fl', 'south broward,fl', 'winter garden,fl', 'addison,il', 'alton,il', 'belvidere,il', 'glen ellyn,il', 'glenview,il', 'marion,in', 'speedway,in', 'cedar falls,ia', 'leavenworth,ks', 'erlanger,ky', 'madisonville,ky', 'bladensburg,md', 'landover,md', 'parkville,md', 'andover,ma', 'attleboro,ma', 'lawrence,ma', 'fenton,mi', 'madison heights,mi', 'roseville,mi', 'shelby township,mi', 'west bloomfield,mi', 'chaska,mn', 'coon rapids,mn', 'forest lake,mn', 'shakopee,mn', 'tunica,ms', 'walls,ms', 'chesterfield,mo', 'eatontown,nj', 'orchard park,ny', 'asheboro,nc', 'boone,nc', 'new bern,nc', 'brunswick,oh', 'maumee,oh', 'medina,oh', 'oxford,oh', 'perrysburg,oh', 'west linn,or', 'ardmore,pa', 'bethel park,pa', 'coatesville,pa', 'mechanicsburg,pa', 'newport,ri', 'easley,sc', 'hilton head island,sc', 'laurens,sc', 'seneca,sc', 'taylors,sc', 'west columbia,sc', 'vermillion,sd', 'dickson,tn', 'sweetwater,tx', 'texarkana,tx', 'wharton,tx', 'woodway,tx', 'cedar city,ut', 'south burlington,vt', 'issaquah,wa', 'poulsbo,wa', 'shelton,wa', 'menomonie,wi', 'sun prairie,wi', 'bessemer,al', 'gadsden,al', 'homewood,al', 'ozark,al', 'soldotna,ak', 'paragould,ar', 'siloam springs,ar', 'emeryville,ca', 'encinitas,ca', 'laguna hills,ca', 'norwalk,ca', 'orangevale,ca', 'commerce city,co', 'golden,co', 'parker,co', 'bristol,ct', 'norwalk,ct', 'rocky hill,ct', 'vernon,ct', 'apopka,fl', 'maitland,fl', 'margate,fl', 'mount dora,fl', 'palatka,fl', 'tarpon springs,fl', 'buford,ga', 'dallas,ga', 'griffin,ga', 'lagrange,ga', 'stone mountain,ga', 'hilo,hi', 'lahaina,hi', 'crystal lake,il', 'edwardsville,il', 'elk grove village,il', 'mundelein,il', 'quincy,il', 'university park,il', 'newburgh,in', 'burlington,ky', 'corbin,ky', 'nicholasville,ky', 'baker,la', 'denham springs,la', 'gonzales,la', 'mandeville,la', 'wheaton,md', 'white marsh,md', 'acton,ma', 'brockton,ma', 'holyoke,ma', 'new bedford,ma', 'somerville,ma', 'weymouth,ma', 'benton harbor,mi', 'birmingham,mi', 'dearborn,mi', 'haslett,mi', 'rochester,mi', 'bloomington,mn', 'eagan,mn', 'richfield,mn', 'st louis park,mn', 'winona,mn', 'corinth,ms', 'joplin,mo', 'bozeman,mt', 'laconia,nh', 'clifton,nj', 'perth amboy,nj', 'toms river,nj', 'clovis,nm', 'ruidoso,nm', 'flushing,ny', 'staten island,ny', 'clayton,nc', 'graham,nc', 'matthews,nc', 'amelia,oh', 'batavia,oh', 'kent,oh', 'loveland,oh', 'mansfield,oh', 'north olmsted,oh', 'parma,oh', 'duncan,ok', 'indiana,pa', 'gaffney,sc', 'mauldin,sc', 'aberdeen,sd', 'yankton,sd', 'gallatin,tn', 'lebanon,tn', 'athens,tx', 'balch springs,tx', 'denison,tx', 'gainesville,tx', 'galveston,tx', 'georgetown,tx', 'marble falls,tx', 'marshall,tx', 'pearland,tx', 'ephraim,ut', 'mechanicsville,va', 'newports news,va', 'mukilteo,wa', 'pasco,wa', 'shoreline,wa', 'beckley,wv', 'wausau,wi', 'gillette,wy', 'daphne,al', 'enterprise,al', 'ketchikan,ak', 'palmer,ak', 'kingman,az', 'lake havasu city,az', 'surprise,az', 'bentonville,ar', 'alta loma,ca', 'panorama city,ca', 'petaluma,ca', 'rancho santa margarita,ca', 'montrose,co', 'east haven,ct', 'enfield,ct', 'bartow,fl', 'indian rocks beach,fl', 'lauderdale lakes,fl', 'lutz,fl', 'north lauderdale,fl', 'north miami beach,fl', 'opa-locka,fl', 'orange city,fl', 'rockledge,fl', 'royal palm beach,fl', 'acworth,ga', 'clarkston,ga', 'forest park,ga', 'hinesville,ga', 'rome,ga', 'woodstock,ga', 'waipahu,hi', 'meridian,id', 'hinsdale,il', 'rantoul,il', 'rock island,il', 'rolling meadows,il', 'clarksville,in', 'madison,in', 'michigan city,in', 'new albany,in', 'noblesville,in', 'boone,ia', 'fairfield,ia', 'fort dodge,ia', 'ashland,ky', 'leesville,la', 'augusta,me', 'forestville,md', 'new carrollton,md', 'north bethesda,md', 'upper marlboro,md', 'waldorf,md', 'agawam,ma', 'beverly,ma', 'brighton,ma', 'lynn,ma', 'north adams,ma', 'west springfield,ma', 'adrian,mi', 'bay city,mi', 'dearborn heights,mi', 'harrison township,mi', 'oak park,mi', 'southgate,mi', 'inver grove,mn', 'waite park,mn', 'woodbury,mn', 'canton,ms', 'gautier,ms', 'saint charles,mo', 'hastings,ne', 'mesquite,nv', 'bloomfield,nj', 'east orange,nj', 'edgewater,nj', 'millville,nj', 'plainfield,nj', 'voorhees,nj', 'west new york,nj', 'hobbs,nm', 'silver city,nm', 'roanoke rapids,nc', 'beavercreek,oh', 'centerville,oh', 'hamilton,oh', 'milford,oh', 'new albany,oh', 'north royalton,oh', 'shaker heights,oh', 'sylvania,oh', 'youngstown,oh', 'hermiston,or', 'bryn mawr,pa', 'johnstown,pa', 'norristown,pa', 'phoenixville,pa', 'upper darby,pa', 'pawtucket,ri', 'west warwick,ri', 'woonsocket,ri', 'bluffton,sc', 'central,sc', 'fort mill,sc', 'walterboro,sc', 'goodlettsville,tn', 'hixson,tn', 'martin,tn', 'alpine,tx', 'lake jackson,tx', 'navasota,tx', 'richmond,tx', 'taylor,tx', 'bountiful,ut', 'brigham city,ut', 'hopewell,va', 'radford,va', 'salem,va', 'triangle,va', 'vienna,va', 'winchester,va', 'enumclaw,wa', 'sumner,wa', 'walla walla,wa', 'greendale,wi', 'menasha,wi', 'pewaukee,wi', 'watertown,wi', 'wisconsin rapids,wi', 'evanston,wy', 'jackson,wy', 'atmore,al', 'bay minette,al', 'demopolis,al', 'gulf shores,al', 'hoover,al', 'theodore,al', 'north pole,ak', 'goodyear,az', 'rogers,ar', 'anaheim hills,ca', 'mira mesa,ca', 'rialto,ca', 'san bruno,ca', 'santee,ca', 'canon city,co', 'greenwood village,co', 'wheat ridge,co', 'bear,de', 'bonita springs,fl', 'doral,fl', 'hudson,fl', 'longwood,fl', 'marianna,fl', 'nokomis,fl', 'port charlotte,fl', 'satellite beach,fl', 'winter springs,fl', 'covington,ga', 'lithia springs,ga', 'martinez,ga', 'moultrie,ga', 'blackfoot,id', 'post falls,id', 'bloomingdale,il', 'canton,il', 'danville,il', 'galesburg,il', 'hoffman estates,il', 'mattoon,il', 'gary,in', 'greenfield,in', 'bettendorf,ia', 'clear lake,ia', 'indianola,ia', 'oskaloosa,ia', 'atchison,ks', 'junction city,ks', 'murray,ky', 'beltsville,md', 'lanham,md', 'reisterstown,md', 'woodlawn,md', 'haverhill,ma', 'salem,ma', 'taunton,ma', 'clarkston,mi', 'comstock park,mi', 'highland park,mi', 'niles,mi', 'anoka,mn', 'austin,mn', 'minnetonka,mn', 'moorhead,mn', 'willmar,mn', 'brookhaven,ms', 'horn lake,ms', 'laurel,ms', 'magee,ms', 'mccomb,ms', 'ocean springs,ms', 'olive branch,ms', 'grandview,mo', 'liberty,mo', 'papillion,ne', 'fernley,nv', 'rochester,nh', 'hackettstown,nj', 'long branch,nj', 'matawan,nj', 'orange,nj', 'princeton,nj', 'deming,nm', 'baldwinsville,ny', 'brockport,ny', 'bronxville,ny', 'hamburg,ny', 'hempstead,ny', 'utica,ny', 'wappingers falls,ny', 'watertown,ny', 'yonkers,ny', 'lexington,nc', 'lumberton,nc', 'mebane,nc', 'reidsville,nc', 'statesville,nc', 'ashland,oh', 'fairfield,oh', 'strongsville,oh', 'troy,oh', 'aloha,or', 'fairview,or', 'gladstone,or', 'lincoln city,or', 'mcminnville,or', 'beaver falls,pa', 'drexel hill,pa', 'lebanon,pa', 'meadville,pa', 'monroeville,pa', 'washington,pa', 'wilkes barre,pa', 'north providence,ri', 'lancaster,sc', 'watertown,sd', 'germantown,tn', 'greeneville,tn', 'maryville,tn', 'burleson,tx', 'cleveland,tx', 'harlingen,tx', 'kaufman,tx', 'kilgore,tx', 'pampa,tx', 'portland,tx', 'stephenville,tx', 'texas,tx', 'uvalde,tx', 'ashland,va', 'culpeper,va', 'mclean,va', 'arlington,wa', 'steilacoom,wa', 'tumwater,wa', 'university pl,wa', 'wenatchee,wa', 'brookfield,wi', 'franklin,wi', 'manitowoc,wi', 'river falls,wi', 'green river,wy', 'rawlins,wy', 'rock springs,wy', 'albertville,al', 'fort payne,al', 'pell city,al', 'scottsboro,al', 'troy,al', 'tuskegee,al', 'cottonwood,az', 'cabot,ar', 'harrison,ar', 'maumelle,ar', 'stuttgart,ar', 'auburn,ca', 'canyon country,ca', 'castro valley,ca', 'colton,ca', 'hawthorne,ca', 'martinez,ca', 'mt. view,ca', 'san pablo,ca', 'tustin ranch,ca', 'winnetka,ca', 'fountain,co', 'bloomfield,ct', 'ellington,ct', 'newington,ct', 'torrington,ct', 'wallingford,ct', 'west hartford,ct', 'milford,de', 'seaford,de', 'cutler bay,fl', 'fort myers beach,fl', 'lady lake,fl', 'lynn haven,fl', 'miramar,fl', 'n ft myers,fl', 'punta gorda,fl', 'perry,ga', 'saint marys,ga', 'aiea,hi', 'kihei,hi', 'burley,id', 'mountain home,id', 'bolingbrook,il', 'buffalo grove,il', 'carpentersville,il', 'centralia,il', 'downers grove,il', 'east moline,il', 'glendale heights,il', 'grayslake,il', 'northbrook,il', 'willowbrook,il', 'hammond,in', 'portage,in', 'shelbyville,in', 'altoona,ia', 'carroll,ia', 'johnston,ia', 'hutchinson,ks', 'glasgow,ky', 'leitchfield,ky', 'manchester,ky', 'paris,ky', 'shelbyville,ky', 'shepherdsville,ky', 'bastrop,la', 'breaux bridge,la', 'opelousas,la', 'thibodaux,la', 'presque isle,me', 'cumberland,md', 'halethorpe,md', 'odenton,md', 'braintree,ma', 'norwood,ma', 'woburn,ma', 'flat rock,mi', 'grandville,mi', 'inkster,mi', 'owosso,mi', 'port huron,mi', 'sault sainte marie,mi', 'utica,mi', 'wayne,mi', 'elk river,mn', 'little falls,mn', 'new brighton,mn', 'bay saint louis,ms', 'booneville,ms', 'grenada,ms', 'holly springs,ms', 'ballwin,mo', 'creve coeur,mo', 'butte,mt', 'bridgeton,nj', 'burlington,nj', 'east brunswick,nj', 'lodi,nj', 'mount holly,nj', 'neptune,nj', 'paterson,nj', 'woodbury,nj', 'los alamos,nm', 'rio rancho,nm', 'socorro,nm', 'truth or consequencs,nm', 'amherst,ny', 'auburn,ny', 'binghamton,ny', 'endicott,ny', 'fairport,ny', 'latham,ny', 'new rochelle,ny', 'vestal,ny', 'watervliet,ny', 'elizabeth city,nc', 'garner,nc', 'goldsboro,nc', 'monroe,nc', 'sanford,nc', 'spring lake,nc', 'wake forest,nc', 'west fargo,nd', 'broadview heights,oh', 'cleveland heights,oh', 'findlay,oh', 'gahanna,oh', 'huber heights,oh', 'lancaster,oh', 'mason,oh', 'massillon,oh', 'mayfield heights,oh', 'newark,oh', 'niles,oh', 'oregon,oh', 'streetsboro,oh', 'twinsburg,oh', 'west carrollton,oh', 'whitehall,oh', 'worthington,oh', 'enid,ok', 'guymon,ok', 'bloomsburg,pa', 'bristol,pa', 'conshohocken,pa', 'doylestown,pa', 'morrisville,pa', 'royersford,pa', 'warren,pa', 'willow grove,pa', 'riverside,ri', 'abbeville,sc', 'bennettsville,sc', 'dillon,sc', 'georgetown,sc', 'kingstree,sc', 'moncks corner,sc', 'north myrtle beach,sc', 'union,sc', 'brownsville,tn', 'manchester,tn', 'millington,tn', 'sevierville,tn', 'shelbyville,tn', 'tullahoma,tn', 'aransas pass,tx', 'azle,tx', 'belton,tx', 'boerne,tx', 'borger,tx', 'breckenridge,tx', 'cedar hill,tx', 'channelview,tx', 'eagle pass,tx', 'kemah,tx', 'livingston,tx', 'sulphur springs,tx', 'park city,ut', 'taylorsville,ut', 'tooele,ut', 'brattleboro,vt', 'annandale,va', 'farmville,va', 'springfield,va', 'yorktown,va', 'moses lake,wa', 'north bend,wa', 'hurricane,wv', 'elkhorn,wi', 'greenfield,wi', 'hales corners,wi', 'marshfield,wi', 'tomah,wi', 'alexander city,al', 'eufaula,al', 'montevallo,al', 'northport,al', 'robertsdale,al', 'talladega,al', 'vestavia,al', 'eagle river,ak', 'seward,ak', 'apache junction,az', 'buckeye,az', 'douglas,az', 'green valley,az', 'safford,az', 'show low,az', 'huntsville,ar', 'big bear lake,ca', 'calabasas,ca', 'del mar,ca', 'la verne,ca', 'lemoore,ca', 'lompoc,ca', 'merced,ca', 'moorpark,ca', 'napa,ca', 'santa maria,ca', 'sausalito,ca', 'fort morgan,co', 'sterling,co', 'milford,ct', 'north haven,ct', 'cocoa beach,fl', 'destin,fl', 'gulf breeze,fl', 'hallandale beach,fl', 'immokalee,fl', 'inverness,fl', 'longboat key,fl', 'north port,fl', 'ocoee,fl', 'ormond beach,fl', 'p c beach,fl', 'palmetto,fl', 'south pasadena,fl', 'st. augustine,fl', 'st. cloud,fl', 'starke,fl', 'wellington,fl', 'college park,ga', 'cumming,ga', 'dublin,ga', 'fairburn,ga', 'jasper,ga', 'kingsland,ga', 'lilburn,ga', 'tucker,ga', 'union city,ga', 'rupert,id', 'weiser,id', 'antioch,il', 'blue island,il', 'elgin,il', 'justice,il', 'saint charles,il', 'zion,il', 'greensburg,in', 'huntington,in', 'laporte,in', 'lawrenceburg,in', 'plainfield,in', 'plymouth,in', 'seymour,in', 'pleasant hill,ia', 'shenandoah,ia', 'storm lake,ia', 'ottawa,ks', 'danville,ky', 'harrodsburg,ky', 'hazard,ky', 'london,ky', 'morehead,ky', 'oak grove,ky', 'prestonsburg,ky', 'russellville,ky', 'winchester,ky', 'deridder,la', 'harvey,la', 'minden,la', 'saint francisville,la', 'south portland,me', 'aberdeen,md', 'cambridge,md', 'fort washington,md', 'westminster,md', 'ayer,ma', 'burlington,ma', 'chelsea,ma', 'jamaica plain,ma', 'lexington,ma', 'bloomfield hills,mi', 'burton,mi', 'coldwater,mi', 'dewitt,mi', 'farmingtn hls,mi', 'marshall,mi', 'shelby twp,mi', 'wixom,mi', 'albert lea,mn', 'alexandria,mn', 'bemidji,mn', 'champlin,mn', 'edina,mn', 'hibbing,mn', 'hutchinson,mn', 'red wing,mn', 'flowood,ms', 'forest,ms', 'hernando,ms', 'new albany,ms', 'philadelphia,ms', 'jefferson city,mo', 'maryland heights,mo', 'saint joseph,mo', 'st louis,mo', 'alliance,ne', 'beatrice,ne', 'bedford,nh', 'derry,nh', 'hampton,nh', 'portsmouth,nh', 'budd lake,nj', 'cape may,nj', 'freehold,nj', 'glassboro,nj', 'lawrenceville,nj', 'nutley,nj', 'parlin,nj', 'passaic,nj', 'red bank,nj', 'wayne,nj', 'artesia,nm', 'belen,nm', 'grants,nm', 'las vegas,nm', 'taos,nm', 'camillus,ny', 'canandaigua,ny', 'coram,ny', 'east syracuse,ny', 'forest hills,ny', 'kingston,ny', 'long beach,ny', 'oswego,ny', 'tonawanda,ny', 'williamsville,ny', 'clemmons,nc', 'cornelius,nc', 'dunn,nc', 'fuquay varina,nc', 'henderson,nc', 'beachwood,oh', 'bellefontaine,oh', 'franklin,oh', 'galloway,oh', 'lewis center,oh', 'lorain,oh', 'marysville,oh', 'mentor,oh', 'painesville,oh', 'port clinton,oh', 'warren,oh', 'willowick,oh', 'lawton,ok', 'midwest city,ok', 'moore,ok', 'yukon,ok', 'canby,or', 'la grande,or', 'newberg,or', 'pendleton,or', 'allison park,pa', 'ambler,pa', 'aston,pa', 'blue bell,pa', 'downingtown,pa', 'exton,pa', 'malvern,pa', 'shippensburg,pa', 'slippery rock,pa', 'yardley,pa', 'bishopville,sc', 'camden,sc', 'cayce,sc', 'chester,sc', 'clemson,sc', 'clinton,sc', 'manning,sc', 'mitchell,sd', 'mc minnville,tn', 'bonham,tx', 'cypress,tx', 'dayton,tx', 'haltom city,tx', 'henderson,tx', 'hereford,tx', 'hillsboro,tx', 'jasper,tx', 'liberty,tx', 'mckinney,tx', 'palacios,tx', 'pleasanton,tx', 'port lavaca,tx', 'sugar land,tx', 'vernon,tx', 'vidor,tx', 'moab,ut', 'price,ut', 'vernal,ut', 'lorton,va', 'centralia,wa', 'kenmore,wa', 'monroe,wa', 'mount vernon,wa', 'oak harbor,wa', 'washougal,wa', 'bluefield,wv', 'princeton,wv', 'beaver dam,wi', 'cudahy,wi', 'germantown,wi', 'menomonee falls,wi', 'platteville,wi', 'portage,wi', 'andalusia,al', 'brewton,al', 'centreville,al', 'clanton,al', 'evergreen,al', 'sheffield,al', 'sylacauga,al', 'bethel,ak', 'nogales,az', 'payson,az', 'winslow,az', 'dumas,ar', 'hot springs,ar', 'mountain view,ar', 'pocahontas,ar', 'walnut ridge,ar', 'alpine,ca', 'claremont,ca', 'el monte,ca', 'hesperia,ca', 'la quinta,ca', 'laguna beach,ca', 'lake elsinore,ca', 'newark,ca', 'playa del rey,ca', 'rancho bernardo,ca', 'reseda,ca', 'venice,ca', 'watsonville,ca', 'brush,co', 'craig,co', 'estes park,co', 'glenwood springs,co', 'meriden,ct', 'naugatuck,ct', 'willimantic,ct', 'willington,ct', 'windsor,ct', 'winsted,ct', 'middletown,de', 'smyrna,de', 'belleview,fl', 'dania,fl', 'ellenton,fl', 'green cove springs,fl', 'indialantic,fl', 'labelle,fl', 'land o lakes,fl', 'lantana,fl', 'madison,fl', 'middleburg,fl', 'north palm beach,fl', 'okeechobee,fl', 'oldsmar,fl', 'pahokee,fl', 'perry,fl', 'quincy,fl', 'seffner,fl', 'tavares,fl', 'wauchula,fl', 'west melbourne,fl', 'americus,ga', 'chamblee,ga', 'ellijay,ga', 'evans,ga', 'hephzibah,ga', 'mableton,ga', 'morrow,ga', 'peachtree city,ga', 'pooler,ga', 'ewa beach,hi', 'hailey,id', 'payette,id', 'sandpoint,id', 'alsip,il', 'barrington,il', 'batavia,il', 'columbia,il', 'east saint louis,il', 'freeport,il', 'granite city,il', 'hoffman est,il', 'kankakee,il', 'oakbrook ter,il', 'ottawa,il', 'wood river,il', 'beech grove,in', 'chesterton,in', 'decatur,in', 'elwood,in', 'frankfort,in', 'franklin,in', 'goshen,in', 'logansport,in', 'monticello,in', 'peru,in', 'vincennes,in', 'atlantic,ia', 'fort madison,ia', 'grimes,ia', 'grinnell,ia', 'manchester,ia', 'norwalk,ia', 'ottumwa,ia', 'pella,ia', 'red oak,ia', 'waukee,ia', 'newton,ks', 'osawatomie,ks', 'barbourville,ky', 'bardstown,ky', 'columbia,ky', 'irvine,ky', 'middlesboro,ky', 'middletown,ky', 'monticello,ky', 'mount sterling,ky', 'newport,ky', 'princeton,ky', 'crowley,la', 'mansfield,la', 'natchez,la', 'pineville,la', 'sulphur,la', 'terrytown,la', 'ville platte,la', 'biddeford,me', 'sanford,me', 'scarborough,me', 'wells,me', 'bowie,md', 'glenarden,md', 'middle river,md', 'oxon hills,md', 'perry hall,md', 'savage,md', 'severn,md', 'west hyattsville,md', 'amesbury,ma', 'canton,ma', 'fitchburg,ma', 'hyannis,ma', 'medford,ma', 'methuen,ma', 'natick,ma', 'peabody,ma', 'randolph,ma', 'shrewsbury,ma', 'stoneham,ma', 'westborough,ma', 'westfield,ma', 'alpena,mi', 'chesterfield,mi', 'clawson,mi', 'clinton twp,mi', 'greenville,mi', 'harrison twp,mi', 'hillsdale,mi', 'holt,mi', 'kentwood,mi', 'lowell,mi', 'marquette,mi', 'milan,mi', 'mount clemens,mi', 'perry,mi', 'plainwell,mi', 'romulus,mi', 'saint joseph,mi', 'apple valley,mn', 'brooklyn park,mn', 'chanhassen,mn', 'faribault,mn', 'marshall,mn', 'prior lake,mn', 'roseville,mn', 'savage,mn', 'wayzata,mn', 'aberdeen,ms', 'batesville,ms', 'carthage,ms', 'drew,ms', 'louisville,ms', 'macon,ms', 'fenton,mo', 'lees summit,mo', 'riverside,mo', 'valley park,mo', 'whitefish,mt', 'auburn,ne', 'plattsmouth,ne', 'fallon,nv', 'winnemucca,nv', 'claremont,nh', 'keene,nh', 'asbury park,nj', 'bridgewater,nj', 'cedar grove,nj', 'clementon,nj', 'deptford,nj', 'dumont,nj', 'elmwood park,nj', 'englewood,nj', 'haddonfield,nj', 'keyport,nj', 'newton,nj', 'ocean city,nj', 'phillipsburg,nj', 'randolph,nj', 'stratford,nj', 'williamstown,nj', 'woodbridge,nj', 'astoria,ny', 'bay shore,ny', 'central islip,ny', 'corning,ny', 'cortland,ny', 'fredonia,ny', 'guilderland,ny', 'holbrook,ny', 'lockport,ny', 'manlius,ny', 'rensselaer,ny', 'spencerport,ny', 'albemarle,nc', 'eden,nc', 'elkin,nc', 'hendersonville,nc', 'jamestown,nc', 'newton,nc', 'shelby,nc', 'devils lake,nd', 'dickinson,nd', 'mandan,nd', 'alliance,oh', 'ashtabula,oh', 'aurora,oh', 'bedford heights,oh', 'north canton,oh', 'pataskala,oh', 'rocky river,oh', 'sandusky,oh', 'springfield,oh', 'warrensville heights,oh', 'elk city,ok', 'mannford,ok', 'owasso,ok', 'purcell,ok', 'wagoner,ok', 'grants pass,or', 'lebanon,or', 'madras,or', 'redmond,or', 'roseburg,or', 'saint helens,or', 'sherwood,or', 'woodburn,or', 'bradford,pa', 'bridgeville,pa', 'broomall,pa', 'canonsburg,pa', 'carnegie,pa', 'columbia,pa', 'east norriton,pa', 'easton,pa', 'elkins park,pa', 'gettysburg,pa', 'horsham,pa', 'langhorne,pa', 'new castle,pa', 'north wales,pa', 'philadephia,pa', 'plymouth meeting,pa', 'secane,pa', 'cumberland,ri', 'east providence,ri', 'johnston,ri', 'middletown,ri', 'north kingstown,ri', 'westerly,ri', 'hartsville,sc', 'little river,sc', 'pageland,sc', 'hot springs,sd', 'spearfish,sd', 'clinton,tn', 'covington,tn', 'crossville,tn', 'jamestown,tn', 'rogersville,tn', 'union city,tn', 'atlanta,tx', 'bastrop,tx', 'bridge city,tx', 'childress,tx', 'clarksville,tx', 'crosby,tx', 'fairfield,tx', 'farmers branch,tx', 'keller,tx', 'levelland,tx', 'lockhart,tx', 'lumberton,tx', 'plainview,tx', 'roanoke,tx', 'snyder,tx', 'sugarland,tx', 'the colony,tx', 'pleasant grove,ut', 'pulaski,va', 'south hill,va', 'staunton,va', 'bainbridge island,wa', 'ferndale,wa', 'mercer island,wa', 'stanwood,wa', 'university place,wa', 'bridgeport,wv', 'clarksburg,wv', 'cedarburg,wi', 'edgerton,wi', 'hudson,wi', 'plover,wi', 'plymouth,wi', 'saint francis,wi', 'verona,wi', 'waunakee,wi', 'buffalo,wy', 'lander,wy', 'arab,al', 'boaz,al', 'bridgeport,al', 'daleville,al', 'eutaw,al', 'greensboro,al', 'guntersville,al', 'haleyville,al', 'hamilton,al', 'hanceville,al', 'hartselle,al', 'heflin,al', 'leeds,al', 'linden,al', 'muscle shoals,al', 'pelham,al', 'roanoke,al', 'thomasville,al', 'wetumpka,al', 'kodiak,ak', 'wasilla,ak', 'bisbee,az', 'coolidge,az', 'fountain hills,az', 'huachuca city,az', 'prescott valley,az', 'tolleson,az', 'alma,ar', 'booneville,ar', 'clinton,ar', 'hope,ar', 'hot spgs nationl prk,ar', 'paris,ar', 'sherwood,ar', 'anderson,ca', 'bay point,ca', 'dana point,ca', 'el centro,ca', 'indio,ca', 'la costa,ca', 'ladera ranch,ca', 'lafayette,ca', 'lakeside,ca', 'marina,ca', 'mill valley,ca', 'millbrae,ca', 'montclair,ca', 'monterey,ca', 'rancho san diego,ca', 'redding,ca', 'san carlos,ca', 'san pedro,ca', 'spring valley,ca', 'sylmar,ca', 'yorba linda,ca', 'aspen,co', 'avon,co', 'centennial,co', 'cortez,co', 'manitou springs,co', 'avon,ct', 'branford,ct', 'farmington,ct', 'glastonbury,ct', 'plainville,ct', 'southington,ct', 'wethersfield,ct', 'arcadia,fl', 'bushnell,fl', 'clearwater beach,fl', 'de funiak springs,fl', 'edgewater,fl', 'fern park,fl', 'graceville,fl', 'greenacres,fl', 'holmes beach,fl', 'indian hrbr bch,fl', 'jensen beach,fl', 'niceville,fl', 'opa locka,fl', 'palm coast,fl', 'treasure island,fl', 'wesley chapel,fl', 'weston,fl', 'wildwood,fl', 'cordele,ga', 'dahlonega,ga', 'douglas,ga', 'east point,ga', 'fort oglethorpe,ga', 'hampton,ga', 'monroe,ga', 'sandy springs,ga', 'suwanee,ga', 'tifton,ga', 'toccoa,ga', 'vidalia,ga', 'villa rica,ga', 'kailua kona,hi', 'kaneohe,hi', 'waianae,hi', 'ammon,id', 'emmett,id', 'garden city,id', 'hayden,id', 'salmon,id', 'bourbonnais,il', 'lake zurich,il', 'loves park,il', 'morton,il', 'mount vernon,il', 'pekin,il', 'prospect heights,il', 'roselle,il', 'tinley park,il', 'vernon hills,il', 'west chicago,il', 'auburn,in', 'avon,in', 'bedford,in', 'bremen,in', 'brownsburg,in', 'camby,in', 'clinton,in', 'corydon,in', 'crown point,in', 'ft. wayne,in', 'kendallville,in', 'nappanee,in', 'new castle,in', 'sellersburg,in', 'wabash,in', 'warsaw,in', 'zionsville,in', 'denison,ia', 'huxley,ia', 'keokuk,ia', 'mount pleasant,ia', 'osceola,ia', 'spencer,ia', 'waverly,ia', 'gardner,ks', 'great bend,ks', 'hiawatha,ks', 'holton,ks', 'mission,ks', 'prairie village,ks', 'ulysses,ks', 'benton,ky', 'brandenburg,ky', 'campbellsville,ky', 'crescent springs,ky', 'crestwood,ky', 'dry ridge,ky', 'highland heights,ky', 'independence,ky', 'mayfield,ky', 'muldraugh,ky', 'pikeville,ky', 'russell springs,ky', 'tompkinsville,ky', 'abbeville,la', 'carencro,la', 'covington,la', 'eunice,la', 'ferriday,la', 'mamou,la', 'mansura,la', 'marksville,la', 'marrero,la', 'morgan city,la', 'new roads,la', 'oakdale,la', 'port allen,la', 'tallulah,la', 'auburn,me', 'orono,me', 'windham,me', 'yarmouth,me', 'abingdon,md', 'berlin,md', 'brooklyn,md', 'crofton,md', 'easton,md', 'edgewood,md', 'elkridge,md', 'frostburg,md', 'great mills,md', 'havre de grace,md', 'nottingham,md', 'timonium,md', 'abington,ma', 'adams,ma', 'ashland,ma', 'bedford,ma', 'charlestown,ma', 'chelmsford,ma', 'everett,ma', 'gardner,ma', 'greenfield,ma', 'hyde park,ma', 'leominster,ma', 'mansfield,ma', 'plymouth,ma', 'roxbury,ma', 'stoughton,ma', 'allen park,mi', 'brighton,mi', 'center line,mi', 'clio,mi', 'eaton rapids,mi', 'ecorse,mi', 'essexville,mi', 'farmington,mi', 'flushing,mi', 'fraser,mi', 'gaylord,mi', 'gladwin,mi', 'grand haven,mi', 'grand ledge,mi', 'hastings,mi', 'holly,mi', 'ionia,mi', 'lapeer,mi', 'mount morris,mi', 'redford,mi', 'riverview,mi', 'saint johns,mi', 'south lyon,mi', 'tecumseh,mi', 'walled lake,mi', 'washington,mi', 'west canton,mi', 'east grand forks,mn', 'excelsior,mn', 'fergus falls,mn', 'grand rapids,mn', 'hastings,mn', 'kasson,mn', 'litchfield,mn', 'monticello,mn', 'new ulm,mn', 'sartell,mn', 'south saint paul,mn', 'spring park,mn', 'st. louis park,mn', 'stillwater,mn', 'thief river falls,mn', 'virginia,mn', 'baldwyn,ms', 'crystal springs,ms', 'fulton,ms', 'hazlehurst,ms', 'indianola,ms', 'kosciusko,ms', 'newton,ms', 'picayune,ms', 'pontotoc,ms', 'richland,ms', 'ripley,ms', 'rolling fork,ms', 'senatobia,ms', 'waveland,ms', 'waynesboro,ms', 'west point,ms', 'cape girardeau,mo', 'lees summit,mo', 'hamilton,mt', 'havre,mt', 'cozad,ne', 'lexington,ne', 'ralston,ne', 'schuyler,ne', 'sidney,ne', 'wahoo,ne', 'york,ne', 'boulder city,nv', 'lovelock,nv', 'stateline,nv', 'west wendover,nv', 'durham,nh', 'lebanon,nh', 'milford,nh', 'seabrook,nh', 'brick,nj', 'collingswood,nj', 'dover,nj', 'flemington,nj', 'irvington,nj', 'iselin,nj', 'keasbey,nj', 'mays landing,nj', 'monmouth junction,nj', 'montclair,nj', 'new milford,nj', 'oaklyn,nj', 'palisades park,nj', 'pine hill,nj', 'rahway,nj', 'ridgewood,nj', 'river edge,nj', 'somerville,nj', 'spring lake,nj', 'springfield,nj', 'tenafly,nj', 'union,nj', 'west orange,nj', 'bloomfield,nm', 'espanola,nm', 'los lunas,nm', 'lovington,nm', 'portales,nm', 'santa teresa,nm', 'chester,ny', 'cohoes,ny', 'elmhurst,ny', 'farmington,ny', 'freeport,ny', 'herkimer,ny', 'horseheads,ny', 'hudson,ny', 'middle island,ny', 'niagara falls,ny', 'olean,ny', 'patchogue,ny', 'penfield,ny', 'rome,ny', 'saratoga springs,ny', 'tarrytown,ny', 'arden,nc', 'ayden,nc', 'beaufort,nc', 'conover,nc', 'creedmoor,nc', 'davidson,nc', 'hillsborough,nc', 'hope mills,nc', 'kannapolis,nc', 'lenoir,nc', 'lillington,nc', 'maxton,nc', 'morehead city,nc', 'washington,nc', 'waynesville,nc', 'whiteville,nc', 'jamestown,nd', 'wahpeton,nd', 'williston,nd', 'austintown,oh', 'avon lake,oh', 'blacklick,oh', 'cambridge,oh', 'chillicothe,oh', 'copley,oh', 'defiance,oh', 'east liverpool,oh', 'englewood,oh', 'forest park,oh', 'holland,oh', 'marion,oh', 'mentor-on-the-lake,oh', 'norwalk,oh', 'oberlin,oh', 'sharonville,oh', 'sidney,oh', 'steubenville,oh', 'washington township,oh', 'willoughby hills,oh', 'zanesville,oh', 'grove,ok', 'miami,ok', 'shawnee,ok', 'tahlequah,ok', 'dallas,or', 'north bend,or', 'seaside,or', 'tillamook,or', 'umatilla,or', 'bala-cynwyd,pa', 'beaver,pa', 'boothwyn,pa', 'brownsville,pa', 'clairton,pa', 'clarks summit,pa', 'connellsville,pa', 'dallas,pa', 'douglassville,pa', 'edinboro,pa', 'feasterville,pa', 'glenolden,pa', 'kingston,pa', 'lewisburg,pa', 'media,pa', 'uniontown,pa', 'whitehall,pa', 'williamsport,pa', 'east greenwich,ri', 'duncan,sc', 'edgefield,sc', 'lake city,sc', 'newberry,sc', 'pickens,sc', 'piedmont,sc', 'port royal,sc', 'ridgeland,sc', 'travelers rest,sc', 'winnsboro,sc', 'huron,sd', 'carthage,tn', 'dyersburg,tn', 'henderson,tn', 'lewisburg,tn', 'mount juliet,tn', 'paris,tn', 'savannah,tn', 'smithville,tn', 'sparta,tn', 'springfield,tn', 'sweetwater,tn', 'andrews,tx', 'brookshire,tx', 'brownfield,tx', 'burnet,tx', 'canton,tx', 'center,tx', 'columbus,tx', 'converse,tx', 'crockett,tx', 'crowley,tx', 'cuero,tx', 'decatur,tx', 'desoto,tx', 'eastland,tx', 'flower mound,tx', 'hooks,tx', 'jefferson,tx', 'lancaster,tx', 'mansfield,tx', 'marlin,tx', 'mcgregor,tx', 'perryton,tx', 'pflugerville,tx', 'terrell,tx', 'tomball,tx', 'blanding,ut', 'draper,ut', 'kaysville,ut', 'magna,ut', 'roosevelt,ut', 'wendover,ut', 'west valley,ut', 'montpelier,vt', 'springfield,vt', 'abingdon,va', 'chantilly,va', 'chesterfield,va', 'dumfries,va', 'lake ridge,va', 'prince george,va', 'spotsylvania,va', 'strasburg,va', 'waynesboro,va', 'aberdeen,wa', 'battle ground,wa', 'colville,wa', 'east wenatchee,wa', 'fircrest,wa', 'newcastle,wa', 'sammamish,wa', 'seatac,wa', 'barboursville,wv', 'lewisburg,wv', 'moundsville,wv', 'mount hope,wv', 'oak hill,wv', 'summersville,wv', 'weirton,wv', 'baraboo,wi', 'berlin,wi', 'burlington,wi', 'evansville,wi', 'fort atkinson,wi', 'mc farland,wi', 'monona,wi', 'onalaska,wi', 'rhinelander,wi', 'rice lake,wi', 'south milwaukee,wi', 'sturgeon bay,wi', 'cody,wy', 'douglas,wy', 'camden,al', 'cedar bluff,al', 'centre,al', 'eight mile,al', 'florala,al', 'livingston,al', 'moulton,al', 'rainbow city,al', 'rogersville,al', 'russellville,al', 'saraland,al', 'sulligent,al', 'tuscumbia,al', 'union springs,al', 'douglas,ak', 'homer,ak', 'sitka,ak', 'valdez,ak', 'cave creek,az', 'el mirage,az', 'florence,az', 'higley,az', 'lakeside,az', 'san luis,az', 'wickenburg,az', 'willcox,az', 'bald knob,ar', 'benton,ar', 'berryville,ar', 'bull shoals,ar', 'calico rock,ar', 'clarksville,ar', 'el dorado,ar', 'eureka springs,ar', 'flippin,ar', 'gentry,ar', 'jasper,ar', 'lake village,ar', 'morrilton,ar', 'ozark,ar', 'prescott,ar', 'trumann,ar', 'waldron,ar', 'west memphis,ar', 'agoura hills,ca', 'arcadia,ca', 'arvin,ca', 'carpinteria,ca', 'crescent city,ca', 'foothill ranch,ca', 'gardena,ca', 'gilroy,ca', 'grand terrace,ca', 'harbor city,ca', 'hermosa beach,ca', 'la palma,ca', 'lodi,ca', 'manhattan beach,ca', 'manteca,ca', 'morgan hill,ca', 'newbury park,ca', 'playa vista,ca', 'rancho palos verdes,ca', 'san lorenzo,ca', 'south pasadena,ca', 'turlock,ca', 'visalia,ca', 'wilmington,ca', 'dillon,co', 'edgewater,co', 'gunnison,co', 'idaho springs,co', 'leadville,co', 'limon,co', 'louisville,co', 'monte vista,co', 'monument,co', 'trinidad,co', 'windsor,co', 'woodland park,co', 'greenwich,ct', 'pawcatuck,ct', 'plainfield,ct', 'storrs mansfield,ct', 'windham,ct', 'greenwood,de', 'harrington,de', 'laurel,de', 'millsboro,de', 'auburndale,fl', 'aventura,fl', 'bal harbour,fl', 'blountstown,fl', 'chipley,fl', 'crescent city,fl', 'flagler beach,fl', 'frostproof,fl', 'holiday,fl', 'lake placid,fl', 'lehigh acres,fl', 'live oak,fl', 'miami springs,fl', 'monticello,fl', 'mulberry,fl', 'port saint joe,fl', 'ruskin,fl', 'safety harbor,fl', 'saint cloud,fl', 'sebastian,fl', 'st petersburg,fl', 'umatilla,fl', 'valrico,fl', 'avondale estates,ga', 'barnesville,ga', 'bonaire,ga', 'byron,ga', 'chatsworth,ga', 'commerce,ga', 'cornelia,ga', 'dawsonville,ga', 'fayetteville,ga', 'fitzgerald,ga', 'fort valley,ga', 'greensboro,ga', 'hiram,ga', 'jackson,ga', 'pearson,ga', 'rincon,ga', 'saint simons island,ga', 'thomaston,ga', 'thomasville,ga', 'thomson,ga', 'washington,ga', 'waycross,ga', 'waynesboro,ga', 'lihue,hi', 'mililani,hi', 'wahiawa,hi', 'american falls,id', 'bonners ferry,id', 'buhl,id', 'jerome,id', 'montpelier,id', 'rigby,id', 'shelley,id', 'soda springs,id', 'wallace,id', 'benton,il', 'bethalto,il', 'calumet park,il', 'carmi,il', 'carterville,il', 'cary,il', 'cherry valley,il', 'crest hill,il', 'darien,il', 'dixon,il', 'harrisburg,il', 'harvard,il', 'homewood,il', 'jacksonville,il', 'lake bluff,il', 'lake villa,il', 'lena,il', 'mchenry,il', 'morris,il', 'o fallon,il', 'palos hills,il', 'park city,il', 'park forest,il', 'richton park,il', 'romeoville,il', 'skokie,il', 'villa park,il', 'woodstock,il', 'yorkville,il', 'austin,in', 'butler,in', 'cannelton,in', 'columbia city,in', 'crown point/schererville,in', 'french lick,in', 'granger,in', 'griffith,in', 'lebanon,in', 'martinsville,in', 'mitchell,in', 'mooresville,in', 'osceola,in', 'princeton,in', 'rockville,in', 'salem,in', 'scottsburg,in', 'adel,ia', 'albia,ia', 'creston,ia', 'estherville,ia', 'glenwood,ia', 'hampton,ia', 'ida grove,ia', 'knoxville,ia', 'nevada,ia', 'sheldon,ia', 'webster city,ia', 'columbus,ks', 'derby,ks', 'dodge city,ks', 'eudora,ks', 'hesston,ks', 'norton,ks', 'wellington,ks', 'albany,ky', 'carlisle,ky', 'carrollton,ky', 'cloverport,ky', 'cumberland,ky', 'cynthiana,ky', 'elkton,ky', 'flatwoods,ky', 'flemingsburg,ky', 'fort knox,ky', 'grayson,ky', 'greenville,ky', 'hartford,ky', 'jamestown,ky', 'jeffersontown,ky', 'lebanon,ky', 'maysville,ky', 'munfordville,ky', 'paintsville,ky', 'pembroke,ky', 'providence,ky', 'sandy hook,ky', 'scottsville,ky', 'stanford,ky', 'stanton,ky', 'sturgis,ky', 'villa hills,ky', 'warsaw,ky', 'west liberty,ky', 'williamsburg,ky', 'williamstown,ky', 'cottonport,la', 'donaldsonville,la', 'grambling,la', 'jeanerette,la', 'jonesboro,la', 'lake providence,la', 'newllano,la', 'plaquemine,la', 'ringgold,la', 'saint martinville,la', 'vivian,la', 'westwego,la', 'winnfield,la', 'brunswick,me', 'ellsworth,me', 'lewiston,me', 'madawaska,me', 'rockland,me', 'searsport,me', 'skowhegan,me', 'chestertown,md', 'denton,md', 'kensington,md', 'largo,md', 'leonardtown,md', 'linthicum heights,md', 'middletown,md', 'mount rainier,md', 'north east,md', 'pocomoke city,md', 'rosedale,md', 'bellingham,ma', 'belmont,ma', 'billerica,ma', 'chestnut hill,ma', 'concord,ma', 'dorchester center,ma', 'east longmeadow,ma', 'falmouth,ma', 'franklin,ma', 'hudson,ma', 'lenox,ma', 'mattapan,ma', 'middleboro,ma', 'newton,ma', 'roslindale,ma', 'southbridge,ma', 'walpole,ma', 'wellesley,ma', 'wilmington,ma', 'allegan,mi', 'alma,mi', 'beaverton,mi', 'belding,mi', 'bronson,mi', 'brooklyn,mi', 'brownstown twp,mi', 'buchanan,mi', 'byron center,mi', 'caledonia,mi', 'caro,mi', 'dowagiac,mi', 'houghton,mi', 'imlay city,mi', 'jenison,mi', 'lincoln park,mi', 'ludington,mi', 'mason,mi', 'melvindale,mi', 'menominee,mi', 'new baltimore,mi', 'newaygo,mi', 'petoskey,mi', 'portland,mi', 'rockford,mi', 'saint clair,mi', 'saint clair shores,mi', 'sandusky,mi', 'south haven,mi', 'spring lake,mi', 'stevensville,mi', 'swartz creek,mi', 'temperance,mi', 'three rivers,mi', 'wayland,mi', 'whitmore lake,mi', 'baxter,mn', 'buffalo,mn', 'cambridge,mn', 'cloquet,mn', 'cokato,mn', 'cold spring,mn', 'cottage grove,mn', 'eden valley,mn', 'foley,mn', 'hayfield,mn', 'howard lake,mn', 'lakeville,mn', 'le sueur,mn', 'morris,mn', 'mound,mn', 'northfield,mn', 'owatonna,mn', 'park rapids,mn', 'sauk rapids,mn', 'shoreview,mn', 'st cloud,mn', 'st. paul,mn', 'stewartville,mn', 'wadena,mn', 'ackerman,ms', 'amory,ms', 'belzoni,ms', 'calhoun city,ms', 'columbia,ms', 'ellisville,ms', 'fayette,ms', 'houston,ms', 'jonestown,ms', 'morton,ms', 'pass christian,ms', 'rosedale,ms', 'shelby,ms', 'tchula,ms', 'bridgeton,mo', 'farmington,mo', 'gladstone,mo', 'hollister,mo', 'kirkwood,mo', 'lake saint louis,mo', 'manchester,mo', 'north kansas city,mo', 'ozark,mo', 'platte city,mo', 'raytown,mo', 'saint ann,mo', 'spanish lake,mo', 'warrensburg,mo', 'wentzville,mo', 'anaconda,mt', 'baker,mt', 'cut bank,mt', 'livingston,mt', 'polson,mt', 'sidney,mt', 'west yellowstone,mt', 'chadron,ne', 'falls city,ne', 'gothenburg,ne', 'gretna,ne', 'holdrege,ne', 'mc cook,ne', 'nebraska city,ne', 'ogallala,ne', 'scottsbluff,ne', 'superior,ne', 'ely,nv', 'gardnerville,nv', 'laughlin,nv', 'pahrump,nv', 'tonopah,nv', 'littleton,nh', 'londonderry,nh', 'plymouth,nh', 'west lebanon,nh', 'absecon,nj', 'atlantic highlands,nj', 'avenel,nj', 'bayonne,nj', 'bellmawr,nj', 'bloomingdale,nj', 'bordentown,nj', 'browns mills,nj', 'carteret,nj', 'east rutherford,nj', 'east windsor,nj', 'farmingdale,nj', 'gloucester city,nj', 'hamilton township,nj', 'hammonton,nj', 'little falls,nj', 'little ferry,nj', 'lumberton,nj', 'madison,nj', 'magnolia,nj', 'medford,nj', 'morris plains,nj', 'mount laurel,nj', 'mt. laurel,nj', 'north bergen,nj', 'north plainfield,nj', 'ocean,nj', 'pleasantville,nj', 'ramsey,nj', 'scotch plains,nj', 'south amboy,nj', 'union city,nj', 'verona,nj', 'westfield,nj', 'westwood,nj', 'wharton,nj', 'aztec,nm', 'santa rosa,nm', 'sunland park,nm', 'croton on hudson,ny', 'delmar,ny', 'depew,ny', 'east amherst,ny', 'east greenbush,ny', 'elmira,ny', 'fishkill,ny', 'garnerville,ny', 'glen cove,ny', 'glens falls,ny', 'grand island,ny', 'great neck,ny', 'henrietta,ny', 'jamestown,ny', 'lancaster,ny', 'long island city,ny', 'monsey,ny', 'mount kisco,ny', 'nanuet,ny', 'new windsor,ny', 'north chili,ny', 'oneonta,ny', 'ossining,ny', 'painted post,ny', 'potsdam,ny', 'rye,ny', 'seneca falls,ny', 'slingerlands,ny', 'smithtown,ny', 'west babylon,ny', 'aberdeen,nc', 'belmont,nc', 'chadbourn,nc', 'cherryville,nc', 'clinton,nc', 'edenton,nc', 'holly springs,nc', 'king,nc', 'knightdale,nc', 'laurinburg,nc', 'lincolnton,nc', 'oxford,nc', 'pembroke,nc', 'pineville,nc', 'siler city,nc', 'southern pines,nc', 'southport,nc', 'tarboro,nc', 'thomasville,nc', 'wendell,nc', 'baltimore,oh', 'bellaire,oh', 'bellbrook,oh', 'bellevue,oh', 'belpre,oh', 'bucyrus,oh', 'carrollton,oh', 'centerburg,oh', 'chagrin falls,oh', 'circleville,oh', 'fairlawn,oh', 'fairview park,oh', 'georgetown,oh', 'maineville,oh', 'middleburg heights,oh', 'mount sterling,oh', 'mount vernon,oh', 'north lewisburg,oh', 'olmsted falls,oh', 'pickerington,oh', 'piqua,oh', 'portsmouth,oh', 'richmond heights,oh', 'rossford,oh', 'sebring,oh', 'sheffield lake,oh', 'solon,oh', 'tipp city,oh', 'trotwood,oh', 'uhrichsville,oh', 'vandalia,oh', 'wadsworth,oh', 'washington court house,oh', 'west park,oh', 'wickliffe,oh', 'alva,ok', 'bethany,ok', 'claremore,ok', 'clinton,ok', 'coweta,ok', 'del city,ok', 'eufaula,ok', 'stillwater,ok', 'stroud,ok', 'sulphur,ok', 'warr acres,ok', 'weatherford,ok', 'ashland,or', 'astoria,or', 'boardman,or', 'coos bay,or', 'cottage grove,or', 'happy valley,or', 'hood river,or', 'independence,or', 'junction city,or', 'molalla,or', 'newport,or', 'ontario,or', 'prineville,or', 'reedsport,or', 'sandy,or', 'scappoose,or', 'stayton,or', 'sweet home,or', 'warrenton,or', 'aliquippa,pa', 'bangor,pa', 'bedford,pa', 'bridgeport,pa', 'carmichaels,pa', 'conneaut lake,pa', 'glen mills,pa', 'greensburg,pa', 'greenville,pa', 'grove city,pa', 'harleysville,pa', 'hazleton,pa', 'lansdowne,pa', 'latrobe,pa', 'mount joy,pa', 'narberth,pa', 'new kensington,pa', 'perkasie,pa', 'red lion,pa', 'ridley park,pa', 'saint marys,pa', 'sayre,pa', 'sharon,pa', 'stroudsburg,pa', 'tarentum,pa', 'warminster,pa', 'wayne,pa', 'coventry,ri', 'portsmouth,ri', 'smithfield,ri', 'belton,sc', 'darlington,sc', 'elgin,sc', 'holly hill,sc', 'inman,sc', 'james island,sc', 'mc coll,sc', 'mc cormick,sc', 'mullins,sc', 'york,sc', 'madison,sd', 'milbank,sd', 'sturgis,sd', 'ashland city,tn', 'athens,tn', 'bartlett,tn', 'bolivar,tn', 'bristol,tn', 'collierville,tn', 'gainesboro,tn', 'gatlinburg,tn', 'harriman,tn', 'humboldt,tn', 'jefferson city,tn', 'louisville,tn', 'powell,tn', 'pulaski,tn', 'rutledge,tn', 'trenton,tn', 'anthony,tx', 'brazoria,tx', 'buffalo,tx', 'caldwell,tx', 'cameron,tx', 'carthage,tx', 'chandler,tx', 'colorado city,tx', 'cotulla,tx', 'deer park,tx', 'dimmitt,tx', 'dumas,tx', 'friendswood,tx', 'harker heights,tx', 'hempstead,tx', 'hurst,tx', 'keene,tx', 'kingsland,tx', 'la porte,tx', 'leander,tx', 'littlefield,tx', 'orange,tx', 'princeton,tx', 'sanger,tx', 'schertz,tx', 'wake village,tx', 'waxahachie,tx', 'west,tx', 'whitesboro,tx', 'wills point,tx', 'winnsboro,tx', 'hurricane,ut', 'murray,ut', 'north salt lake,ut', 'richfield,ut', 'riverton,ut', 'roy,ut', 'bennington,vt', 'rutland,vt', 'winooski,vt', 'bluefield,va', 'bristol,va', 'chase city,va', 'christiansburg,va', 'galax,va', 'highland springs,va', 'mc lean,va', 'orange,va', 'richlands,va', 'sandston,va', 'south arlington,va', 'tazewell,va', 'warrenton,va', 'blaine,wa', 'cle elum,wa', 'coupeville,wa', 'elma,wa', 'ephrata,wa', 'fife,wa', 'kelso,wa', 'othello,wa', 'sea tac,wa', 'sunnyside,wa', 'woodinville,wa', 'buckhannon,wv', 'chester,wv', 'elkins,wv', 'hinton,wv', 'kingwood,wv', 'milton,wv', 'point pleasant,wv', 'shinnston,wv', 'spencer,wv', 'vienna,wv', 'weston,wv', 'white sulphur springs,wv', 'altoona,wi', 'ashland,wi', 'delafield,wi', 'delavan,wi', 'jefferson,wi', 'kaukauna,wi', 'mequon,wi', 'mineral point,wi', 'monroe,wi', 'north fond du lac,wi', 'phillips,wi', 'port washington,wi', 'prairie du chien,wi', 'sparta,wi', 'stoughton,wi', 'superior,wi', 'waupun,wi', 'west bend,wi', 'wisconsin dells,wi', 'afton,wy', 'kemmerer,wy', 'torrington,wy', 'alabaster,al', 'bayou la batre,al', 'brundidge,al', 'butler,al', 'calera,al', 'childersburg,al', 'clio,al', 'columbiana,al', 'cordova,al', 'cottondale,al', 'courtland,al', 'dadeville,al', 'elba,al', 'fayette,al', 'fort deposit,al', 'fyffe,al', 'gordo,al', 'guin,al', 'headland,al', 'hurtsboro,al', 'jackson,al', 'jasper,al', 'lanett,al', 'lincoln,al', 'lineville,al', 'luverne,al', 'marion,al', 'millbrook,al', 'monroeville,al', 'moundville,al', 'new hope,al', 'oakman,al', 'oneonta,al', 'opp,al', 'orange beach,al', 'pisgah,al', 'rainsville,al', 'tallassee,al', 'trussville,al', 'valley,al', 'vestavia hills,al', 'west blocton,al', 'winfield,al', 'naknek,ak', 'arizona city,az', 'eloy,az', 'gila bend,az', 'guadalupe,az', 'holbrook,az', 'litchfield park,az', 'page,az', 'sedona,az', 'somerton,az', 'springerville,az', 'sun city,az', 'bono,ar', 'bryant,ar', 'clarendon,ar', 'dardanelle,ar', 'dermott,ar', 'elaine,ar', 'eudora,ar', 'fordyce,ar', 'greenwood,ar', 'holly grove,ar', 'kensett,ar', 'lewisville,ar', 'marked tree,ar', 'marshall,ar', 'mc crory,ar', 'melbourne,ar', 'mount ida,ar', 'murfreesboro,ar', 'piggott,ar', 'pine bluff,ar', 'quitman,ar', 'rector,ar', 'salem,ar', 'yellville,ar', 'alhambra,ca', 'alpine mdws,ca', 'arcata,ca', 'arleta,ca', 'atwater,ca', 'beaumont,ca', 'bell,ca', 'benicia,ca', 'bermuda dunes,ca', 'bloomington,ca', 'blythe,ca', 'cameron park,ca', 'ceres,ca', 'corona del mar,ca', 'desert hot springs,ca', 'diamond bar,ca', 'el cerrito,ca', 'el dorado hills,ca', 'el segundo,ca', 'el sobrante,ca', 'glendora,ca', 'greenbrae,ca', 'hacienda heights,ca', 'hanford,ca', 'hollywood,ca', 'la mirada,ca', 'la puente,ca', 'larkspur,ca', 'madera,ca', 'mira loma,ca', 'mount shasta,ca', 'national city,ca', 'north hills,ca', 'novato,ca', 'oroville,ca', 'pacific grove,ca', 'paramount,ca', 'pinole,ca', 'ramona,ca', 'rancho pls vrds,ca', 'red bluff,ca', 'redwood shores,ca', 'san juan capistrano,ca', 'saugus,ca', 'scotts valley,ca', 'seaside,ca', 'south lake tahoe,ca', 'stevenson ranch,ca', 'suisun city,ca', 'sun city,ca', 'toluca lake,ca', 'tracy,ca', 'tulare,ca', 'westlake village,ca', 'westminister,ca', 'wildomar,ca', 'breckenridge,co', 'burlington,co', 'center,co', 'central city,co', 'cripple creek,co', 'delta,co', 'eagle,co', 'eaton,co', 'evans,co', 'fort lupton,co', 'glendale,co', 'lafayette,co', 'laporte,co', 'litttleton,co', 'lone tree,co', 'lonetree,co', 'ordway,co', 'pagosa springs,co', 'parachute,co', 'rangely,co', 'salida,co', 'steamboat springs,co', 'ansonia,ct', 'colchester,ct', 'derby,ct', 'east windsor,ct', 'ledyard,ct', 'moosup,ct', 'mystic,ct', 'orange,ct', 'stafford springs,ct', 'terryville,ct', 'tolland,ct', 'windsor locks,ct', 'bridgeville,de', 'christiana,de', 'delmar,de', 'alachua,fl', 'apollo beach,fl', 'archer,fl', 'belle glade,fl', 'bonifay,fl', 'bunnell,fl', 'cantonment,fl', 'celebration,fl', 'century,fl', 'chattahoochee,fl', 'chiefland,fl', 'cottondale,fl', 'davenport,fl', 'dunnellon,fl', 'florida city,fl', 'fort meade,fl', 'groveland,fl', 'gulfport,fl', 'high springs,fl', 'hilliard,fl', 'holly hill,fl', 'inglis,fl', 'kenneth city,fl', 'key biscayne,fl', 'key largo,fl', 'keystone heights,fl', 'lake butler,fl', 'lakewood ranch,fl', 'laud lakes,fl', 'macclenny,fl', 'marathon,fl', 'marco island,fl', 'mary esther,fl', 'melbourne beach,fl', 'neptune beach,fl', 'pass a grille branch,fl', 'silver springs,fl', 'st cloud,fl', 'valparaiso,fl', 'wilton manors,fl', 'wimauma,fl', 'yulee,fl', 'adairsville,ga', 'alma,ga', 'baxley,ga', 'blackshear,ga', 'blue ridge,ga', 'bowdon,ga', 'butler,ga', 'camilla,ga', 'cedartown,ga', 'cleveland,ga', 'cochran,ga', 'eastman,ga', 'eatonton,ga', 'forsyth,ga', 'franklin,ga', 'gray,ga', 'hiawassee,ga', 'jesup,ga', 'kathleen,ga', 'la fayette,ga', 'lake park,ga', 'loganville,ga', 'manchester,ga', 'mount vernon,ga', 'oakwood,ga', 'rossville,ga', 'royston,ga', 'sandersville,ga', 'snellville,ga', 'sparta,ga', 'stockton,ga', 'kahului,hi', 'kailua,hi', 'papaikou,hi', 'pearl city,hi', 'arco,id', 'eagle,id', 'glenns ferry,id', 'gooding,id', 'grangeville,id', 'hazelton,id', 'mccall,id', 'preston,id', 'rathdrum,id', 'bartlett,il', 'beach park,il', 'beardstown,il', 'bellwood,il', 'benld,il', 'bradley,il', 'brookfield,il', 'carlinville,il', 'chicago ridge,il', 'clarendon hills,il', 'collinsville,il', 'crete,il', 'deerfield,il', 'east peoria,il', 'effingham,il', 'fairview heights,il', 'forest park,il', 'geneva,il', 'gibson city,il', 'hanover park,il', 'highland park,il', 'illinois,il', 'itasca,il', 'lansing,il', 'le roy,il', 'lincoln,il', 'machesney park,il', 'manteno,il', 'maywood,il', 'moline,il', 'montgomery,il', 'mount sterling,il', 'north aurora,il', 'oakbrook terrace,il', 'olney,il', 'peoria heights,il', 'polo,il', 'princeton,il', 'riverdale,il', 'roscoe,il', 'sauk village,il', 'st charles,il', 'st. charles,il', 'steger,il', 'sterling,il', 'vandalia,il', 'washington,il', 'wilmette,il', 'albion,in', 'alexandria,in', 'angola,in', 'ashley,in', 'batesville,in', 'berne,in', 'bluffton,in', 'bristol,in', 'brownstown,in', 'carthage,in', 'chandler,in', 'connersville,in', 'converse,in', 'culver,in', 'dillsboro,in', 'ellettsville,in', 'galveston,in', 'greencastle,in', 'highland,in', 'hobart,in', 'linton,in', 'north manchester,in', 'north vernon,in', 'portland,in', 'rushville,in', 'tipton,in', 'versailles,in', 'westfield,in', 'algona,ia', 'anamosa,ia', 'bancroft,ia', 'belmond,ia', 'carlisle,ia', 'chariton,ia', 'cherokee,ia', 'clarinda,ia', 'clarion,ia', 'clive,ia', 'cresco,ia', 'de witt,ia', 'eldridge,ia', 'emmetsburg,ia', 'evansdale,ia', 'garner,ia', 'hiawatha,ia', 'lamoni,ia', 'lenox,ia', 'leon,ia', 'maquoketa,ia', 'milford,ia', 'missouri valley,ia', 'monticello,ia', 'orange city,ia', 'parkersburg,ia', 'perry,ia', 'rock rapids,ia', 'sac city,ia', 'sidney,ia', 'sioux center,ia', 'state center,ia', 'underwood,ia', 'vinton,ia', 'washington,ia', 'west burlington,ia', 'west union,ia', 'arkansas city,ks', 'baxter springs,ks', 'bonner springs,ks', 'clay center,ks', 'clearwater,ks', 'colby,ks', 'council grove,ks', 'deerfield,ks', 'fort scott,ks', 'garden city,ks', 'highland,ks', 'hillsboro,ks', 'kingman,ks', 'liberal,ks', 'merriam,ks', 'mulvane,ks', 'ness city,ks', 'ogden,ks', 'osage city,ks', 'paola,ks', 'plainville,ks', 'russell,ks', 'sabetha,ks', 'shawnee mission,ks', 'tonganoxie,ks', 'valley falls,ks', 'wa keeney,ks', 'wathena,ks', 'wellsville,ks', 'alexandria,ky', 'augusta,ky', 'bedford,ky', 'berea,ky', 'brodhead,ky', 'brownsville,ky', 'burkesville,ky', 'cadiz,ky', 'calvert city,ky', 'clearfield,ky', 'clinton,ky', 'crab orchard,ky', 'crofton,ky', 'dawson springs,ky', 'edmonton,ky', 'fort thomas,ky', 'frenchburg,ky', 'ft. mitchell,ky', 'ft. thomas,ky', 'ft. wright,ky', 'fulton,ky', 'greensburg,ky', 'harlan,ky', 'hawesville,ky', 'hebron,ky', 'hickman,ky', 'horse cave,ky', 'hyden,ky', 'jenkins,ky', 'la center,ky', 'la grange,ky', 'lancaster,ky', 'lebanon junction,ky', 'lewisburg,ky', 'liberty,ky', 'livermore,ky', 'louisa,ky', 'mc kee,ky', 'morgantown,ky', 'mount vernon,ky', 'mount washington,ky', 'new castle,ky', 'new haven,ky', 'russell,ky', 'southgate,ky', 'taylor mill,ky', 'taylorsville,ky', 'vanceburg,ky', 'wilder,ky', 'wilmore,ky', 'abita springs,la', 'arcadia,la', 'benton,la', 'bernice,la', 'blanchard,la', 'bogalusa,la', 'broussard,la', 'cameron,la', 'church point,la', 'cullen,la', 'duson,la', 'farmerville,la', 'gibsland,la', 'grand isle,la', 'greenwell springs,la', 'greenwood,la', 'independence,la', 'jackson,la', 'jennings,la', 'kaplan,la', 'kinder,la', 'lockport,la', 'luling,la', 'many,la', 'marion,la', 'mer rouge,la', 'ponchatoula,la', 'prairieville,la', 'rayne,la', 'saint rose,la', 'sterlington,la', 'bar harbor,me', 'camden,me', 'caribou,me', 'dexter,me', 'dover foxcroft,me', 'falmouth,me', 'farmingdale,me', 'farmington,me', 'greenville,me', 'lincoln,me', 'milo,me', 'oakland,me', 'pittsfield,me', 'saco,me', 'thomaston,me', 'waldoboro,me', 'waterville,me', 'westbrook,me', 'belcamp,md', 'burtonsville,md', 'chesapeake beach,md', 'delmar,md', 'ellicott,md', 'federalsburg,md', 'forest hill,md', 'ft. washington,md', 'hanover,md', 'hurlock,md', 'indian head,md', 'joppatowne,md', 'la plata,md', 'lutherville timonium,md', 'mt. rainier,md', 'myersville,md', 'oakland,md', 'perryville,md', 'pittsville,md', 'prince frederick,md', 'silver springs,md', 'snow hill,md', 'sparrows point,md', 'sykesville,md', 'westernport,md', 'acushnet,ma', 'athol,ma', 'auburn,ma', 'danvers,ma', 'dracut,ma', 'feeding hills,ma', 'foxboro,ma', 'gloucester,ma', 'great barrington,ma', 'hanover,ma', 'hull,ma', 'ipswich,ma', 'lee,ma', 'longmeadow,ma', 'melrose,ma', 'millbury,ma', 'milton,ma', 'newburyport,ma', 'newton highlands,ma', 'north attleboro,ma', 'north dartmouth,ma', 'northampton,ma', 'plainville,ma', 'reading,ma', 'rockland,ma', 'roxbury crossing,ma', 'south easton,ma', 'sunderland,ma', 'swampscott,ma', 'turners falls,ma', 'vineyard haven,ma', 'ware,ma', 'watertown,ma', 'webster,ma', 'west roxbury,ma', 'weston,ma', 'winthrop,ma', 'addison,mi', 'boyne city,mi', 'charlevoix,mi', 'cheboygan,mi', 'chelsea,mi', 'clare,mi', 'croswell,mi', 'escanaba,mi', 'evart,mi', 'ferrysburg,mi', 'fort gratiot,mi', 'franklin,mi', 'garden city,mi', 'hartford,mi', 'homer,mi', 'lake orion,mi', 'lexington,mi', 'lomira,mi', 'manistee,mi', 'marlette,mi', 'marysville,mi', 'montague,mi', 'mt pleasant,mi', 'new hudson,mi', 'newport,mi', 'orion,mi', 'ortonville,mi', 'oscoda,mi', 'oshtemo,mi', 'otsego,mi', 'oxford,mi', 'paw paw,mi', 'springfield,mi', 'stockbridge,mi', 'waterford township,mi', 'woodhaven,mi', 'wyandotte,mi', 'aitkin,mn', 'albany,mn', 'annandale,mn', 'belle plaine,mn', 'brainerd,mn', 'brooklyn center,mn', 'chisago city,mn', 'clarissa,mn', 'crookston,mn', 'dassel,mn', 'eveleth,mn', 'fairmont,mn', 'glencoe,mn', 'glenwood,mn', 'golden valley,mn', 'granite falls,mn', 'inver grove heights,mn', 'la crescent,mn', 'long lake,mn', 'madelia,mn', 'maplewood,mn', 'montevideo,mn', 'mounds view,mn', 'nashwauk,mn', 'new hope,mn', 'new london,mn', 'new york mills,mn', 'olivia,mn', 'paynesville,mn', 'perham,mn', 'pierz,mn', 'pine island,mn', 'plainview,mn', 'robbinsdale,mn', 'saint joseph,mn', 'saint peter,mn', 'st peter,mn', 'st. cloud,mn', 'two harbors,mn', 'waconia,mn', 'west saint paul,mn', 'white bear lake,mn', 'windom,mn', 'winsted,mn', 'worthington,mn', 'young america,mn', 'zumbrota,mn', 'bay springs,ms', 'boyle,ms', 'byhalia,ms', 'centreville,ms', 'charleston,ms', 'church hill,ms', 'decatur,ms', 'edwards,ms', 'flora,ms', 'friars point,ms', 'itta bena,ms', 'iuka,ms', 'leland,ms', 'lucedale,ms', 'madison,ms', 'metcalfe,ms', 'moss point,ms', 'new augusta,ms', 'petal,ms', 'poplarville,ms', 'port gibson,ms', 'purvis,ms', 'quitman,ms', 'robinsonville,ms', 'saltillo,ms', 'sardis,ms', 'shannon,ms', 'shaw,ms', 'smithville,ms', 'stonewall,ms', 'summit,ms', 'terry,ms', 'vaiden,ms', 'verona,ms', 'wiggins,ms', 'aurora,mo', 'bolivar,mo', 'cameron,mo', 'carthage,mo', 'excelsior springs,mo', 'high ridge,mo', 'kennett,mo', 'knob noster,mo', 'maryville,mo', 'moberly,mo', 'parkville,mo', 'republic,mo', 'rolla,mo', 'saint robert,mo', 'wildwood,mo', 'belgrade,mt', 'columbia falls,mt', 'dillon,mt', 'forsyth,mt', 'glendive,mt', 'laurel,mt', 'libby,mt', 'shelby,mt', 'ainsworth,ne', 'albion,ne', 'bennington,ne', 'bloomfield,ne', 'crete,ne', 'elkhorn,ne', 'fort calhoun,ne', 'seward,ne', 'valentine,ne', 'carlin,nv', 'dayton,nv', 'incline village,nv', 'overton,nv', 'yerington,nv', 'zephyr cove,nv', 'barrington,nh', 'belmont,nh', 'berlin,nh', 'bristol,nh', 'charlestown,nh', 'franklin,nh', 'goffstown,nh', 'hanover,nh', 'hillsboro,nh', 'hooksett,nh', 'hudson,nh', 'newmarket,nh', 'raymond,nh', 'annandale,nj', 'audubon,nj', 'barrington,nj', 'bayville,nj', 'beach haven,nj', 'beverly,nj', 'brielle,nj', 'chatham,nj', 'clayton,nj', 'colonia,nj', 'cranford,nj', 'dayton,nj', 'delran,nj', 'edgewater park,nj', 'egg harbor city,nj', 'fair lawn,nj', 'flanders,nj', 'florham park,nj', 'franklin lakes,nj', 'franklin park,nj', 'glen ridge,nj', 'haddon heights,nj', 'haddon township,nj', 'hamilton,nj', 'hawthorne,nj', 'hillsborough,nj', 'ivy hill,nj', 'jackson,nj', 'keansburg,nj', 'kendall park,nj', 'lake hiawatha,nj', 'lambertville,nj', 'lawnside,nj', 'linden,nj', 'mahwah,nj', 'mantua,nj', 'metuchen,nj', 'moorestown,nj', 'mt laurel,nj', 'mt. arlington,nj', 'palmyra,nj', 'penns grove,nj', 'pennsville,nj', 'pitman,nj', 'point pleasant beach,nj', 'riverside,nj', 'rockaway,nj', 'runnemede,nj', 'sea isle city,nj', 'seaside heights,nj', 'short hills,nj', 'sicklerville,nj', 'somers point,nj', 'south plainfield,nj', 'south river,nj', 'thorofare,nj', 'tuckerton,nj', 'west deptford,nj', 'westville,nj', 'woodbridge township,nj', 'woodstown,nj', 'angel fire,nm', 'anthony,nm', 'cloudcroft,nm', 'hatch,nm', 'tucumcari,nm', 'tularosa,nm', 'adams,ny', 'altamont,ny', 'amityville,ny', 'arcade,ny', 'bath,ny', 'beacon,ny', 'bellport,ny', 'brentwood,ny', 'carthage,ny', 'catskill,ny', 'cazenovia,ny', 'clinton,ny', 'east aurora,ny', 'elmsford,ny', 'farmingville,ny', 'fayetteville,ny', 'gansevoort,ny', 'garden city,ny', 'geneseo,ny', 'goshen,ny', 'hauppauge,ny', 'holtsville,ny', 'hyde park,ny', 'jamaica,ny', 'jamesville,ny', 'la fayette,ny', 'lake grove,ny', 'levittown,ny', 'lewiston,ny', 'mamaroneck,ny', 'montauk,ny', 'monticello,ny', 'mount vernon,ny', 'new hartford,ny', 'new york mills,ny', 'newark,ny', 'newburgh,ny', 'north babylon,ny', 'north tonawanda,ny', 'ontario,ny', 'plattsburgh,ny', 'pleasant valley,ny', 'port jefferson station,ny', 'ronkonkoma,ny', 'saranac lake,ny', 'scarsdale,ny', 'scottsville,ny', 'suffern,ny', 'victor,ny', 'walden,ny', 'warwick,ny', 'west henrietta,ny', 'westbury,ny', 'whitestone,ny', 'wilmington,ny', 'angier,nc', 'archdale,nc', 'bayboro,nc', 'belhaven,nc', 'bryson city,nc', 'burgaw,nc', 'cleveland,nc', 'coats,nc', 'conway,nc', 'cullowhee,nc', 'denver,nc', 'elizabethtown,nc', 'farmville,nc', 'forest city,nc', 'four oaks,nc', 'gibsonville,nc', 'grifton,nc', 'havelock,nc', 'hayesville,nc', 'hudson,nc', 'jonesville,nc', 'kings mountain,nc', 'lewisville,nc', 'louisburg,nc', 'manteo,nc', 'marion,nc', 'mocksville,nc', 'morganton,,nc', 'murfreesboro,nc', 'nashville,nc', 'north wilkesboro,nc', 'raeford,nc', 'rose hill,nc', 'roxboro,nc', 'shallotte,nc', 'smithfield,nc', 'tabor city,nc', 'walnut cove,nc', 'wilkesboro,nc', 'youngsville,nc', 'beulah,nd', 'grafton,nd', 'rolla,nd', 'avon,oh', 'barnesville,oh', 'bay village,oh', 'bexley,oh', 'blue ash,oh', 'bryan,oh', 'byesville,oh', 'cadiz,oh', 'canfield,oh', 'cardington,oh', 'celina,oh', 'chardon,oh', 'coshocton,oh', 'eastgate,oh', 'eastlake,oh', 'eaton,oh', 'garfield heights,oh', 'groveport,oh', 'huron,oh', 'jackson,oh', 'liberty township,oh', 'marietta,oh', 'monroe,oh', 'new carlisle,oh', 'north college hill,oh', 'north ridgeville,oh', 'oakwood village,oh', 'olmsted township,oh', 'ontario,oh', 'ravenna,oh', 'sagamore hills,oh', 'south charleston,oh', 'springboro,oh', 'sunbury,oh', 'the plains,oh', 'tiffin,oh', 'twinsburg township,oh', 'university heights,oh', 'wauseon,oh', 'waverly,oh', 'willoughby,oh', 'woodmere,oh', 'wooster,oh', 'wyoming,oh', 'altus,ok', 'bartlesville,ok', 'bixby,ok', 'blanchard,ok', 'broken bow,ok', 'checotah,ok', 'choctaw,ok', 'guthrie,ok', 'hominy,ok', 'jones,ok', 'kingfisher,ok', 'lindsay,ok', 'meeker,ok', 'ponca city,ok', 'pryor,ok', 'spiro,ok', 'tecumseh,ok', 'warner,ok', 'brookings,or', 'cornelius,or', 'estacada,or', 'glendale,or', 'heppner,or', 'lakeview,or', 'milton freewater,or', 'monmouth,or', 'mount angel,or', 'myrtle creek,or', 'north plains,or', 'oakridge,or', 'philomath,or', 'sheridan,or', 'silverton,or', 'talent,or', 'the dalles,or', 'winston,or', 'abington,pa', 'annville,pa', 'athens,pa', 'audubon,pa', 'berwyn,pa', 'boyertown,pa', 'brookhaven,pa', 'cambridge springs,pa', 'canton,pa', 'catawissa,pa', 'chadds ford,pa', 'chalfont,pa', 'charleroi,pa', 'chester heights,pa', 'clarion,pa', 'clifton heights,pa', 'collegeville,pa', 'corry,pa', 'cranberry,pa', 'croydon,pa', 'curwensville,pa', 'danville,pa', 'derry,pa', 'donora,pa', 'dover,pa', 'eagleville,pa', 'east berlin,pa', 'ebensburg,pa', 'ephrata,pa', 'falls township,pa', 'franklin,pa', 'freeland,pa', 'glen lyon,pa', 'glenside,pa', 'hanover,pa', 'hatboro,pa', 'hatfield,pa', 'havertown,pa', 'hawley,pa', 'hershey,pa', 'hollidaysburg,pa', 'hummelstown,pa', 'huntingdon,pa', 'huntingdon valley,pa', 'jeffersonville,pa', 'jenkintown,pa', 'kennett square,pa', 'kutztown,pa', 'lafayette hill,pa', 'lehighton,pa', 'limerick,pa', 'mc kees rocks,pa', 'mercer,pa', 'middletown,pa', 'millersville,pa', 'murrysville,pa', 'northeast philadelphia,pa', 'northern cambria,pa', 'penndel,pa', 'pittston,pa', 'plymouth township,pa', 'sewickley,pa', 'shillington,pa', 'strafford-wayne,pa', 'tamaqua,pa', 'towanda,pa', 'union city,pa', 'warrington,pa', 'waynesburg,pa', 'wexford,pa', 'wilkinsburg,pa', 'wynnewood,pa', 'yeadon,pa', 'central falls,ri', 'n providence,ri', 'andrews,sc', 'bamberg,sc', 'barnwell,sc', 'batesburg,sc', 'blacksburg,sc', 'boiling springs,sc', 'denmark,sc', 'elloree,sc', 'estill,sc', 'fairfax,sc', 'greeleyville,sc', 'hardeeville,sc', 'hemingway,sc', 'iva,sc', 'johns island,sc', 'johnston,sc', 'ladson,sc', 'lake view,sc', 'latta,sc', 'loris,sc', 'lugoff,sc', 'marion,sc', 'mt pleasant,sc', 'pawleys island,sc', 'saint matthews,sc', 'saint stephen,sc', 'summerton,sc', 'turbeville,sc', 'wagener,sc', 'williamston,sc', 'belle fourche,sd', 'box elder,sd', 'brandon,sd', 'chamberlain,sd', 'dakota dunes,sd', 'flandreau,sd', 'north sioux city,sd', 'salem,sd', 'winner,sd', 'ardmore,tn', 'baxter,tn', 'centerville,tn', 'church hill,tn', 'decherd,tn', 'dover,tn', 'dunlap,tn', 'elizabethton,tn', 'erwin,tn', 'fairview,tn', 'fayetteville,tn', 'greenbrier,tn', 'hartsville,tn', 'hohenwald,tn', 'huntingdon,tn', 'huntsville,tn', 'jonesborough,tn', 'la follette,tn', 'la vergne,tn', 'lake city,tn', 'lavergne,tn', 'lenoir city,tn', 'madisonville,tn', 'maynardville,tn', 'mountain city,tn', 'old hickory,tn', 'ooltewah,tn', 'pikeville,tn', 'portland,tn', 'selmer,tn', 'seymour,tn', 'somerville,tn', 'spencer,tn', 'spring hill,tn', 'tazewell,tn', 'wartburg,tn', 'waverly,tn', 'white house,tn', 'white pine,tn', 'winchester,tn', 'woodbury,tn', 'alamo,tx', 'alvarado,tx', 'bellville,tx', 'big sandy,tx', 'blanco,tx', 'brady,tx', 'bridgeport,tx', 'burkburnett,tx', 'canyon lake,tx', 'castroville,tx', 'cibolo,tx', 'cisco,tx', 'comanche,tx', 'corinth,tx', 'crosbyton,tx', 'dalhart,tx', 'de kalb,tx', 'del valle,tx', 'dilley,tx', 'duncanville,tx', 'edcouch,tx', 'edinburg,tx', 'farmersville,tx', 'ferris,tx', 'forney,tx', 'fredericksburg,tx', 'hearne,tx', 'hemphill,tx', 'hewitt,tx', 'horizon city,tx', 'howe,tx', 'ingleside,tx', 'jacksboro,tx', 'justin,tx', 'kingsville,tx', 'la feria,tx', 'lake dallas,tx', 'linden,tx', 'mercedes,tx', 'midland,tx', 'new boston,tx', 'olney,tx', 'pearsall,tx', 'port isabel,tx', 'port neches,tx', 'quitman,tx', 'rio grande city,tx', 'rockdale,tx', 'rockwall,tx', 'rusk,tx', 'san benito,tx', 'seagoville,tx', 'silsbee,tx', 'sweeny,tx', 'troup,tx', 'van,tx', 'delta,ut', 'heber city,ut', 'holladay,ut', 'payson,ut', 'riverdale,ut', 'salt lake cty,ut', 'south jordan,ut', 'tremonton,ut', 'washington,ut', 'woods cross,ut', 'barre,vt', 'essex junction,vt', 'newport,vt', 'williston,vt', 'altavista,va', 'appalachia,va', 'bealeton,va', 'broadway,va', 'covington,va', 'crewe,va', 'franklin,va', 'fredericksbrg,va', 'front royal,va', 'gainesville,va', 'gate city,va', 'gretna,va', 'grottoes,va', 'hillsville,va', 'independence,va', 'kilmarnock,va', 'king george,va', 'lawrenceville,va', 'marion,va', 'oakton,va', 'rocky mount,va', 'stuarts draft,va', 'tappahannock,va', 'vinton,va', 'zanoni,va', 'buckley,wa', 'burlington,wa', 'camas,wa', 'cashmere,wa', 'chehalis,wa', 'chelan,wa', 'clallam bay,wa', 'clarkston,wa', 'dupont,wa', 'goldendale,wa', 'kingston,wa', 'lake forest park,wa', 'lake stevens,wa', 'leavenworth,wa', 'lynden,wa', 'normandy park,wa', 'port angeles,wa', 'port townsend,wa', 'prosser,wa', 'sedro woolley,wa', 'spanaway,wa', 'beaver,wv', 'belmont,wv', 'cowen,wv', 'cross lanes,wv', 'elizabeth,wv', 'elkview,wv', 'falling waters,wv', 'fayetteville,wv', 'follansbee,wv', 'gassaway,wv', 'keyser,wv', 'man,wv', 'new martinsville,wv', 'nitro,wv', 'pineville,wv', 'ravenswood,wv', 'ripley,wv', 'romney,wv', 'ronceverte,wv', 'salem,wv', 'sophia,wv', 'union,wv', 'wellsburg,wv', 'williamson,wv', 'williamstown,wv', 'winfield,wv', 'antigo,wi', 'baldwin,wi', 'brillion,wi', 'cadott,wi', 'chilton,wi', 'chippewa fls,wi', 'columbus,wi', 'florence,wi', 'grafton,wi', 'hartland,wi', 'hayward,wi', 'kimberly,wi', 'marinette,wi', 'mercer,wi', 'merrill,wi', 'milton,wi', 'minocqua,wi', 'mondovi,wi', 'new london,wi', 'oregon,wi', 'osseo,wi', 'pleasant prairie,wi', 'pulaski,wi', 'ripon,wi', 'sussex,wi', 'waterloo,wi', 'west salem,wi', 'glenrock,wy', 'pinedale,wy', 'abbeville,al', 'addison,al', 'alexandria,al', 'aliceville,al', 'ardmore,al', 'ashland,al', 'ashville,al', 'autaugaville,al', 'berry,al', 'boligee,al', 'brantley,al', 'brent,al', 'cahaba heights,al', 'carbon hill,al', 'chatom,al', 'citronelle,al', 'clayton,al', 'coffeeville,al', 'collinsville,al', 'dora,al', 'eclectic,al', 'elberta,al', 'elkmont,al', 'fairfield,al', 'fairhope,al', 'flomaton,al', 'fort mc clellan,al', 'fultondale,al', 'gilbertown,al', 'goodwater,al', 'grove hill,al', 'hartford,al', 'irvington,al', 'killen,al', 'kinsey,al', 'lafayette,al', 'leighton,al', 'lexington,al', 'louisville,al', 'loxley,al', 'maylene,al', 'moody,al', 'morris,al', 'munford,al', 'orrville,al', 'owens cross roads,al', 'oxford,al', 'phil campbell,al', 'piedmont,al', 'pine hill,al', 'pleasant grove,al', 'portland,al', 'ragland,al', 'red bay,al', 'reform,al', 'riverside,al', 'rockford,al', 'seale,al', 'section,al', 'shannon,al', 'stevenson,al', 'tolleson,al', 'town creek,al', 'tucson,al', 'tuskegee institute,al', 'uniontown,al', 'vernon,al', 'vinemont,al', 'wadley,al', 'warrior,al', 'aniak,ak', 'chugiak,ak', 'delta junction,ak', 'haines,ak', 'king cove,ak', 'kotzebue,ak', 'skagway,ak', 'wrangell,ak', 'ajo,az', 'anthem,az', 'bellemont,az', 'benson,az', 'camp verde,az', 'duncan,az', 'eagar,az', 'ehrenberg,az', 'fort defiance,az', 'fort mohave,az', 'marana,az', 'miami,az', 'paradise valley,az', 'parker,az', 'peach springs,az', 'pearce,az', 'pinetop,az', 'saint johns,az', 'thatcher,az', 'tombstone,az', 'van buren,az', 'altus,ar', 'ash flat,ar', 'atkins,ar', 'augusta,ar', 'beebe,ar', 'bradford,ar', 'brookland,ar', 'carlisle,ar', 'centerton,ar', 'charleston,ar', 'corning,ar', 'danville,ar', 'de queen,ar', 'de valls bluff,ar', 'de witt,ar', 'des arc,ar', 'dierks,ar', 'dover,ar', 'elkins,ar', 'fairfield bay,ar', 'farmington,ar', 'gassville,ar', 'glenwood,ar', 'gould,ar', 'green forest,ar', 'hardy,ar', 'hartman,ar', 'hazen,ar', 'helena,ar', 'hollforrest city,ar', 'horatio,ar', 'horseshoe bend,ar', 'hot springs village,ar', 'hoxie,ar', 'humphrey,ar', 'imboden,ar', 'judsonia,ar', 'junction city,ar', 'lamar,ar', 'lavaca,ar', 'lincoln,ar', 'malvern,ar', 'mammoth spring,ar', 'manila,ar', 'mansfield,ar', 'marion,ar', 'maynard,ar', 'mc gehee,ar', 'monette,ar', 'monticello,ar', 'mulberry,ar', 'n little rock,ar', 'nashville,ar', 'norman,ar', 'oxford,ar', 'perryville,ar', 'plainview,ar', 'redfield,ar', 'reyno,ar', 'rison,ar', 'searcy,ar', 'sheridan,ar', 'star city,ar', 'tillar,ar', 'tuckerman,ar', 'van buren,ar', 'waldo,ar', 'west helena,ar', 'white hall,ar', 'wickes,ar', '2400 ridgeview dr,ca', 'acton,ca', 'altadena,ca', 'alturas,ca', 'american canyon,ca', 'american cyn,ca', 'angels camp,ca', 'arbuckle,ca', 'armona,ca', 'arroyo grande,ca', 'artesia,ca', 'atascadero,ca', 'brawley,ca', 'brentwood,ca', 'calexico,ca', 'canyon cntry,ca', 'cardiff by the sea,ca', 'casa de oro,ca', 'clearlake,ca', 'compton,ca', 'coronado,ca', 'corte madera,ca', 'danville,ca', 'delhi,ca', 'duarte,ca', 'esparto,ca', 'fort bragg,ca', 'freedom,ca', 'gold river,ca', 'granada hills,ca', 'hacienda hts,ca', 'hamilton city,ca', 'hawaiian gardens,ca', 'imperial beach,ca', 'inglewood,ca', 'joshua tree,ca', 'kings beach,ca', 'la jollasan diego,ca', 'lake natoma,ca', 'lemon grove,ca', 'lincoln,ca', 'lindsay,ca', 'los alamitos,ca', 'los altos,ca', 'lost hills,ca', 'malibu,ca', 'mckinleyville,ca', 'menifee,ca', 'montebello,ca', 'n hollywood,ca', 'newport coast,ca', 'niland,ca', 'oceano,ca', 'pacific palisades,ca', 'paradise,ca', 'piedmont,ca', 'planada,ca', 'porterville,ca', 'redondo+beach,ca', 'redway,ca', 'rio linda,ca', 'ripon,ca', 'river pines,ca', 'riverbank,ca', 's san francisco,ca', 'san andreas,ca', 'san anselmo,ca', 'san juan bautista,ca', 'san ysidro,ca', 'sanger,ca', 'seal beach,ca', 'seeley,ca', 'shaver lake,ca', 'shingle springs,ca', 'solana beach,ca', 'solvang,ca', 'sonoma,ca', 'soquel,ca', 'south bay,ca', 'south gate,ca', 'sunland,ca', 'sutter creek,ca', 'temple city,ca', 'topanga,ca', 'trabuco canyon,ca', 'truckee,ca', 'twentynine palms,ca', 'villa park,ca', 'w sacramento,ca', 'wasco,ca', 'west palmdale,ca', 'winters,ca', 'akron,co', 'alamosa,co', 'ault,co', 'bennett,co', 'berthoud,co', 'carbondale,co', 'clifton,co', 'dacono,co', 'del norte,co', 'evergreen,co', 'florence,co', 'fraser,co', 'fruita,co', 'ft. collins,co', 'gypsum,co', 'henderson,co', 'highlands ranch,co', 'holyoke,co', 'hudson,co', 'julesburg,co', 'kersey,co', 'kremmling,co', 'la jara,co', 'la junta,co', 'la veta,co', 'lamar,co', 'meeker,co', 'milliken,co', 'mountain village,co', 'northglenn,,co', 'palisade,co', 'platteville,co', 'sheridan,co', 'silverthorne,co', 'snowmass village,co', 'superior,co', 'telluride,co', 'walsenburg,co', 'widefield,co', 'beacon falls,ct', 'berlin,ct', 'bethel,ct', 'broad brook,ct', 'canaan,ct', 'canterbury,ct', 'danielson,ct', 'darien,ct', 'east granby,ct', 'fairfield,ct', 'mansfield center,ct', 'marlborough,ct', 'new brit,ct', 'new canaan,ct', 'niantic,ct', 'old lyme,ct', 'portland,ct', 'putnam,ct', 'riverside,ct', 'seymour,ct', 'sharon,ct', 'simsbury,ct', 'stratford,ct', 'trumbull,ct', 'watertown,ct', 'weatogue,ct', 'wilton,ct', 'wolcott,ct', 'camden wyoming,de', 'chadds ford,de', 'delaware city,de', 'felton,de', 'greenville,de', 'ocean view,de', 'altamonte spgs,fl', 'big pine key,fl', 'bowling green,fl', 'bradenton beach,fl', 'branford,fl', 'brookwood,fl', 'callahan,fl', 'carl fisher,fl', 'cedar hammock,fl', 'champions gate,fl', 'clewiston,fl', 'coco river,fl', 'coconut grove,fl', 'dania beach,fl', 'daphne,fl', 'debary,fl', 'dover,fl', 'dundee,fl', 'eagle lake,fl', 'eastpoint,fl', 'estero,fl', 'fifty seventh avenue,fl', 'floral city,fl', 'freeport,fl', 'fruitland park,fl', 'ft lauderdale,fl', 'gardendale,fl', 'gibsonton,fl', 'greenville,fl', 'hallendale beach,fl', 'havana,fl', 'helena,fl', 'hernando,fl', 'hialea,fl', 'hillsboro bch,fl', 'hobe sound,fl', 'indian harbour beach,fl', 'indiantown,fl', 'johns pass,fl', 'lake alfred,fl', 'lake carroll,fl', 'lake panasoffkee,fl', 'lake park,fl', 'laud by sea,fl', 'lauderdl by sea,fl', 'lawtey,fl', 'lighthouse point,fl', 'melrose,fl', 'micanopy,fl', 'moore haven,fl', 'mt. dora,fl', 'navarre,fl', 'newberry,fl', 'ocean breeze park,fl', 'ocklawaha,fl', 'odessa,fl', 'orlo vista,fl', 'ormond,fl', 'palm city,fl', 'parkland,fl', 'pembroke park,fl', 'polk city,fl', 'port st. lucie,fl', 'redingtn shor,fl', 'santa rosa beach,fl', 'shalimar,fl', 'sneads,fl', 'south bay,fl', 'st. marys,fl', 'sunny isles,fl', 'surfside,fl', 'trenton,fl', 'viera,fl', 'village of n palm beach,fl', 'webster,fl', 'williston,fl', 'windermere,fl', '1222 nw 8th ave,ga', 'abbeville,ga', 'allenhurst,ga', 'ashburn,ga', 'baldwin,ga', 'bartow,ga', 'bowman,ga', 'bremen,ga', 'buena vista,ga', 'centerville,ga', 'clayton,ga', 'crawford,ga', 'crawfordville,ga', 'culloden,ga', 'darien,ga', 'demorest,ga', 'dillard,ga', 'east ellijay,ga', 'elberton,ga', 'folkston,ga', 'fort benning,ga', 'garden city,ga', 'gibson,ga', 'glennville,ga', 'gordon,ga', 'grayson,ga', 'greenville,ga', 'grovetown,ga', 'hahira,ga', 'harlem,ga', 'hartwell,ga', 'hawkinsville,ga', 'hazlehurst,ga', 'high shoals,ga', 'homerville,ga', 'jefferson,ga', 'jeffersonville,ga', 'lakeland,ga', 'lenox,ga', 'louisville,ga', 'maysville,ga', 'mc rae,ga', 'metter,ga', 'millen,ga', 'montezuma,ga', 'nashville,ga', 'palmetto,ga', 'peachtree cty,ga', 'pelham,ga', 'quitman,ga', 'richmond hill,ga', 'rockmart,ga', 'soperton,ga', 'st simons island,ga', 'swainsboro,ga', 'sylvester,ga', 'trenton,ga', 'unadilla,ga', 'vienna,ga', 'wadley,ga', 'warrenton,ga', 'watkinsville,ga', 'waverly,ga', 'west point,ga', 'wrens,ga', 'wrightsville,ga', 'kalaheo,hi', 'kamuela,hi', 'koloa,hi', 'waimanalo,hi', 'cascade,id', 'challis,id', 'driggs,id', 'dubois,id', 'filer,id', 'fruitland,id', 'grand view,id', 'hagerman,id', 'heyburn,id', 'homedale,id', 'idaho city,id', 'kamiah,id', 'kellogg,id', 'kooskia,id', 'lava hot springs,id', 'malad city,id', 'marsing,id', 'orofino,id', 'pinehurst,id', 'potlatch,id', 'saint anthony,id', 'saint maries,id', 'shoshone,id', 'spirit lake,id', 'victor,id', 'wendell,id', 'aledo,il', 'algonquin,il', 'alorton,il', 'altamont,il', 'amboy,il', 'anna,il', 'argenta,il', 'barry,il', 'berwyn,il', 'bethany,il', 'braidwood,il', 'broadview,il', 'burbank,il', 'bushnell,il', 'catlin,il', 'channahon,il', 'chester,il', 'chicago heights,il', 'chillicothe,il', 'chrisman,il', 'cicero,il', 'cortland,il', 'countryside,il', 'dalzell,il', 'damiansville,il', 'danvers,il', 'dunlap,il', 'dwight,il', 'east alton,il', 'elk grove vlg,il', 'elmwood park,il', 'evergreen park,il', 'fairfield,il', 'forreston,il', 'franklin grove,il', 'franklin park,il', 'galena,il', 'galva,il', 'gardner,il', 'germantown,il', 'glen carbon,il', 'glenwood,il', 'great lakes,il', 'hanna city,il', 'harvey,il', 'hebron,il', 'herrin,il', 'hoopeston,il', 'indian creek,il', 'indianhead park,il', 'jerseyville,il', 'kewanee,il', 'la grange,il', 'la grange highlands,il', 'la grange park,il', 'lacon,il', 'lake barrington,il', 'lake county,il', 'lakemoor,il', 'lawrenceville,il', 'lebanon,il', 'lemont,il', 'libertyville,il', 'lindenhurst,il', 'lockport,il', 'lyons,il', 'mahomet,il', 'marion,il', 'maroa,il', 'merrillville,il', 'metropolis,il', 'midlothian,il', 'mokena,il', 'mount carmel,il', 'mount carroll,il', 'mount morris,il', 'moweaqua,il', 'mulberry grove,il', 'murphysboro,il', 'north riverside,il', 'oak brook,il', 'oak forest,il', 'oak lawn,il', 'oregon,il', 'orland hills,il', 'orland park,il', 'oswego,il', 'paxton,il', 'peru,il', 'plano,il', 'pontoon beach,il', 'portage,il', 'riverside,il', 'robinson,il', 'rochelle,il', 'rock falls,il', 'rockton,il', 'round lake,il', 'round lake beach,il', 'salem,il', 'savoy,il', 'schiller park,il', 'silvis,il', 'south beloit,il', 'south elgin,il', 'south roxana,il', 'summit argo,il', 'teutopolis,il', 'thomson,il', 'tolono,il', 'venice,il', 'vienna,il', 'villa grove,il', 'walnut,il', 'warrenville,il', 'watseka,il', 'wauconda,il', 'wayne city,il', 'west dundee,il', 'wood dale,il', 'akron,in', 'andrews,in', 'arcadia,in', 'argos,in', 'attica,in', 'aurora,in', 'avilla,in', 'bicknell,in', 'boonville,in', 'brooklyn,in', 'brookston,in', 'burlington,in', 'campbellsburg,in', 'carlisle,in', 'chrisney,in', 'cicero,in', 'clay city,in', 'cloverdale,in', 'cromwell,in', 'crothersville,in', 'danville,in', 'demotte,in', 'dubois,in', 'dunkirk,in', 'dyer,in', 'east chicago,in', 'edinburgh,in', 'english,in', 'fairmount,in', 'flora,in', 'fort branch,in', 'fowler,in', 'fremont,in', 'garrett,in', 'gas city,in', 'geneva,in', 'goodland,in', 'greendale,in', 'greentown,in', 'hamlet,in', 'hartford city,in', 'indianpolis,in', 'jasonville,in', 'jasper,in', 'kentland,in', 'knightstown,in', 'knox,in', 'la porte,in', 'lagrange,in', 'liberty,in', 'loogootee,in', 'lowell,in', 'markle,in', 'mccordsville,in', 'milan,in', 'mooreland,in', 'mount vernon,in', 'mulberry,in', 'new haven,in', 'odon,in', 'oldenburg,in', 'ossian,in', 'paoli,in', 'pekin,in', 'pendleton,in', 'porter/chesterton,in', 'rensselaer,in', 'rochester,in', 'rossville,in', 'russiaville,in', 'schererville,in', 'sharpsville,in', 'south whitley,in', 'spencer,in', 'sweetser,in', 'syracuse,in', 'tell city,in', 'twelve mile,in', 'upland,in', 'w. lafayette,in', 'wadesville,in', 'walkerton,in', 'washington,in', 'west baden springs,in', 'west terre haute,in', 'westville,in', 'williamsport,in', 'winchester,in', 'winslow,in', 'wolcottville,in', 'yorktown,in', 'akron,ia', 'aplington,ia', 'avoca,ia', 'battle creek,ia', 'baxter,ia', 'bloomfield,ia', 'camanche,ia', 'centerville,ia', 'central city,ia', 'charles city,ia', 'cleghorn,ia', 'colfax,ia', 'columbus junction,ia', 'de soto,ia', 'donnellson,ia', 'eagle grove,ia', 'eddyville,ia', 'ely,ia', 'essex,ia', 'farragut,ia', 'forest city,ia', 'fremont,ia', 'garrison,ia', 'gilbert,ia', 'glidden,ia', 'greenfield,ia', 'griswold,ia', 'grundy center,ia', 'harlan,ia', 'hawarden,ia', 'holstein,ia', 'iowa falls,ia', 'jefferson,ia', 'kellogg,ia', 'keosauqua,ia', 'kingsley,ia', 'lake mills,ia', 'lawton,ia', 'le grand,ia', 'le mars,ia', 'lynnville,ia', 'manning,ia', 'manson,ia', 'marengo,ia', 'marquette,ia', 'mc gregor,ia', 'mitchellville,ia', 'monroe,ia', 'mount ayr,ia', 'moville,ia', 'north english,ia', 'north liberty,ia', 'oakland,ia', 'oelwein,ia', 'osage,ia', 'postville,ia', 'ridgeway,ia', 'rockford,ia', 'rockwell,ia', 'story city,ia', 'stuart,ia', 'tama,ia', 'terril,ia', 'tipton,ia', 'toledo,ia', 'tripoli,ia', 'w des moines,ia', 'whitten,ia', 'winfield,ia', 'woodward,ia', 'agra,ks', 'allen,ks', 'alma,ks', 'anthony,ks', 'arma,ks', 'ashland,ks', 'beattie,ks', 'bonner sprngs,ks', 'caldwell,ks', 'carbondale,ks', 'cimarron,ks', 'conway springs,ks', 'el dorado,ks', 'elwood,ks', 'eskridge,ks', 'frontenac,ks', 'galena,ks', 'galva,ks', 'garnett,ks', 'gaylord,ks', 'girard,ks', 'greenleaf,ks', 'harveyville,ks', 'haven,ks', 'hill city,ks', 'holyrood,ks', 'horton,ks', 'hoxie,ks', 'iola,ks', 'johnson,ks', 'kiowa,ks', 'kirwin,ks', 'lakin,ks', 'lansing,ks', 'leawood,ks', 'leonardville,ks', 'madison,ks', 'mcpherson,ks', 'medicine lodge,ks', 'meriden,ks', 'oberlin,ks', 'onaga,ks', 'osborne,ks', 'oswego,ks', 'oxford,ks', 'palco,ks', 'phillipsburg,ks', 'pomona,ks', 'pratt,ks', 'quinter,ks', 'roeland park,ks', 'rolla,ks', 'rossville,ks', 'saint john,ks', 'saint marys,ks', 'satanta,ks', 'sedgwick,ks', 'seneca,ks', 'silver lake,ks', 'smith center,ks', 'spring hill,ks', 'sterling,ks', 'stockton,ks', 'troy,ks', 'udall,ks', 'wakefield,ks', 'wamego,ks', 'whiting,ks', 'aaron,ky', 'altro,ky', 'arlington,ky', 'barlow,ky', 'beattyville,ky', 'beaver dam,ky', 'belfry,ky', 'beverly,ky', 'booneville,ky', 'brooksville,ky', 'burnside,ky', 'calhoun,ky', 'campton,ky', 'cave city,ky', 'clarkson,ky', 'clay,ky', 'clay city,ky', 'corinth,ky', 'corydon,ky', 'crestview hills,ky', 'crittenden,ky', 'dayton,ky', 'dixon,ky', 'earlington,ky', 'eddyville,ky', 'ekron,ky', 'elkhorn city,ky', 'eminence,ky', 'evarts,ky', 'fairdale,ky', 'falmouth,ky', 'fancy farm,ky', 'ft mitchell,ky', 'gilbertsville,ky', 'gracey,ky', 'hardin,ky', 'harold,ky', 'hindman,ky', 'hodgenville,ky', 'huddy,ky', 'hustonville,ky', 'irvington,ky', 'jackson,ky', 'lakeside park,ky', 'lawrenceburg,ky', 'lewisport,ky', 'livingston,ky', 'lucas,ky', 'ludlow,ky', 'lynch,ky', 'marion,ky', 'masonic home,ky', 'mayslick,ky', 'midway,ky', 'millersburg,ky', 'milton,ky', 'minnie,ky', 'morganfield,ky', 'mount olivet,ky', 'nazareth,ky', 'neon,ky', 'nortonville,ky', 'owenton,ky', 'owingsville,ky', 'pine knot,ky', 'pineville,ky', 'raceland,ky', 'sacramento,ky', 'salyersville,ky', 'sharpsburg,ky', 'simpsonville,ky', 'st matthews,ky', 'stearns,ky', 'tomahawk,ky', 'van lear,ky', 'versailles,ky', 'walton,ky', 'waynesburg,ky', 'wheelwright,ky', 'whitley city,ky', 'wickliffe,ky', '#a,la', 'addis,la', 'albany,la', 'amite,la', 'anacoco,la', 'basile,la', 'belle chasse,la', 'berwick,la', 'bunkie,la', 'castor,la', 'chalmette,la', 'chatham,la', 'clinton,la', 'cloutierville,la', 'colfax,la', 'collinston,la', 'columbia,la', 'coushatta,la', 'delta,la', 'destrehan,la', 'deville,la', 'dixie,la', 'doyline,la', 'dubach,la', 'elizabeth,la', 'florien,la', 'folsom,la', 'franklinton,la', 'gilbert,la', 'gray,la', 'grayson,la', 'greensburg,la', 'hagewood,la', 'harrisonburg,la', 'haynesville,la', 'hodge,la', 'homer,la', 'iota,la', 'iowa,la', 'jefferson,la', 'jonesville,la', 'kentwood,la', 'lawtell,la', 'livingston,la', 'logansport,la', 'mangham,la', 'melville,la', 'montgomery,la', 'mooringsport,la', 'morse,la', 'newellton,la', 'norco,la', 'norwood,la', 'oak grove,la', 'oberlin,la', 'olla,la', 'paradis,la', 'patterson,la', 'pierre part,la', 'pitkin,la', 'plain dealing,la', 'reserve,la', 'river ridge,la', 'robert,la', 'saint amant,la', 'simsboro,la', 'springhill,la', 'start,la', 'sunset,la', 'swartz,la', 'vinton,la', 'walker,la', 'waterproof,la', 'welsh,la', 'wisner,la', 'youngsville,la', 'zachary,la', 'bath,me', 'belfast,me', 'boothbay harbor,me', 'brewer,me', 'bridgton,me', 'bucksport,me', 'calais,me', 'cape eliz,me', 'deer isle,me', 'eagle lake,me', 'easton,me', 'edgecomb,me', 'fairfield,me', 'fort kent,me', 'freeport,me', 'fryeburg,me', 'gorham,me', 'gray,me', 'greene,me', 'guilford,me', 'hallowell,me', 'harpswell,me', 'holden,me', 'hollis center,me', 'houlton,me', 'jay,me', 'kittery,me', 'leeds,me', 'limestone,me', 'lisbon,me', 'lisbon falls,me', 'milbridge,me', 'monmouth,me', 'monson,me', 'newport,me', 'north vassalboro,me', 'norway,me', 'ogunquit,me', 'old orchard beach,me', 'palermo,me', 'passadumkeag,me', 'phillips,me', 'richmond,me', 'rumford,me', 'sabattus,me', 'sangerville,me', 'sedgwick,me', 'south berwick,me', 'southwest harbor,me', 'turner,me', 'van buren,me', 'wilton,me', 'woodland,me', 'ardmore,md', 'arlington,md', 'arnold,md', 'brunswick,md', 'bryans road,md', 'callaway,md', 'camp spring,md', 'chase,md', 'chesapeake city,md', 'chester,md', 'cheverly,md', 'clinton,md', 'damascus,md', 'derwood,md', 'emmitsburg,md', 'fort meade,md', 'galena,md', 'garrison,md', 'grasonville,md', 'greensboro,md', 'hampstead,md', 'harwood,md', 'jessup,md', 'lanham/seabrook,md', 'lonaconing,md', 'lutherville,md', 'maugansville,md', 'mc henry,md', 'millersville,md', 'mitchellville,md', 'montgomery village,md', 'n potomac,md', 'north beach,md', 'olney,md', 'pasadena,md', 'potomac,md', 'prnc frederck,md', 'ridgely,md', 'rising sun,md', 'rock hall,md', 'seabrook,md', 'seat pleasant,md', 'springdale,md', 'williamsport,md', 'berlin,ma', 'bosotn,ma', 'brewster,ma', 'bridgewater,ma', 'buzzards bay,ma', 'clinton,ma', 'dalton,ma', 'dedham,ma', 'devens,ma', 'douglas,ma', 'duxbury,ma', 'east falmouth,ma', 'easthampton,ma', 'edgartown,ma', 'fiskdale,ma', 'forest lake,ma', 'georgetown,ma', 'groton,ma', 'hingham,ma', 'holbrook,ma', 'holliston,ma', 'hubbardston,ma', 'littleton,ma', 'ludlow,ma', 'marblehead,ma', 'marshfield,ma', 'mashpee,ma', 'mattapoisett,ma', 'milford,ma', 'millis,ma', 'monson,ma', 'nahant,ma', 'newton l f,ma', 'newtonville,ma', 'north andover,ma', 'north quincy,ma', 'norton,ma', 'orange,ma', 'oxford,ma', 'palmer,ma', 'pembroke,ma', 'pepperell,ma', 'provincetown,ma', 'raynham,ma', 'rowley,ma', 'rutland,ma', 'sagamore,ma', 'saugus,ma', 'sharon,ma', 'shirley,ma', 'somerset,ma', 'south boston,ma', 'south dennis,ma', 'south lawrence,ma', 'southwick,ma', 'swansea,ma', 'tewksbury,ma', 'three rivers,ma', 'townsend,ma', 'tyngsboro,ma', 'wakefield,ma', 'warren,ma', 'west boylston,ma', 'west dennis,ma', 'west yarmouth,ma', 'westwood,ma', 'williamstown,ma', 'winchendon,ma', 'woonsocket,ma', 'wrentham,ma', 'alanson,mi', 'albion,mi', 'algonac,mi', 'bad axe,mi', 'bangor,mi', 'bath,mi', 'bellevue,mi', 'breckenridge,mi', 'bridgman,mi', 'brimley,mi', 'britton,mi', 'brown city,mi', 'brownstown,mi', 'byron,mi', 'camden,mi', 'carleton,mi', 'carrollton,mi', 'carson city,mi', 'cass city,mi', 'cedar springs,mi', 'charlotte,mi', 'chassell,mi', 'chatham,mi', 'clarksville,mi', 'colon,mi', 'commerce township,mi', 'corunna,mi', 'crystal,mi', 'decatur,mi', 'deerfield,mi', 'delton,mi', 'dexter,mi', 'drummond island,mi', 'dundee,mi', 'durand,mi', 'east china,mi', 'eastpointe,mi', 'edmore,mi', 'edwardsburg,mi', 'elsie,mi', 'ferndale,mi', 'fowlerville,mi', 'frankfort,mi', 'gobles,mi', 'goodrich,mi', 'grant,mi', 'grayling,mi', 'hancock,mi', 'harbor beach,mi', 'harper woods,mi', 'harrisville,mi', 'hart,mi', 'hartland,mi', 'hazel park,mi', 'houghton lake,mi', 'hubbard lake,mi', 'hubbell,mi', 'hudsonville,mi', 'iron mountain,mi', 'iron river,mi', 'ishpeming,mi', 'keego harbor,mi', 'kingsford,mi', 'lakeview,mi', 'leslie,mi', 'little lake,mi', 'macomb township,mi', 'martin,mi', 'mattawan,mi', 'mc bain,mi', 'memphis,mi', 'michigan,mi', 'montrose,mi', 'mt. morris,mi', 'nashotah,mi', 'nazareth,mi', 'new haven,mi', 'norton shores,mi', 'oconomowoc,mi', 'otisville,mi', 'ottawa lake,mi', 'ovid,mi', 'painesdale,mi', 'pewamo,mi', 'port austin,mi', 'quincy,mi', 'ravenna,mi', 'richland,mi', 'rockwood,mi', 'rogers city,mi', 'romeo,mi', 'saint charles,mi', 'saint ignace,mi', 'saline,mi', 'saugatuck,mi', 'scottville,mi', 'sebewaing,mi', 'shelby,mi', 'sparta,mi', 'spring arbor,mi', 'st clair shores,mi', 'st johns,mi', 'st joseph,mi', 'twin lake,mi', 'ubly,mi', 'union city,mi', 'vanderbilt,mi', 'vicksburg,mi', 'walker,mi', 'williamston,mi', 'wood haven,mi', 'woodbine,mi', 'albertville,mn', 'arlington,mn', 'aurora,mn', 'bagley,mn', 'battle lake,mn', 'becker,mn', 'benson,mn', 'bigfork,mn', 'blackduck,mn', 'blue earth,mn', 'braham,mn', 'chokio,mn', 'circle pines,mn', 'clara city,mn', 'clearbrook,mn', 'clearwater,mn', 'crosby,mn', 'crystal,mn', 'deer river,mn', 'delano,mn', 'detroit lakes,mn', 'dodge center,mn', 'ely,mn', 'evansville,mn', 'farmington,mn', 'garfield,mn', 'grand marais,mn', 'hallock,mn', 'harmony,mn', 'hermantown,mn', 'international falls,mn', 'ironton,mn', 'isle,mn', 'janesville,mn', 'kelliher,mn', 'lake benton,mn', 'lake city,mn', 'lakeland,mn', 'little canada,mn', 'luverne,mn', 'madison,mn', 'maple grove,mn', 'maple plain,mn', 'milaca,mn', 'motley,mn', 'new prague,mn', 'newport,mn', 'north branch,mn', 'orr,mn', 'pequot lakes,mn', 'pine city,mn', 'pine river,mn', 'princeton,mn', 'proctor,mn', 'red lake falls,mn', 'redwood falls,mn', 'rockford,mn', 'rogers,mn', 'rosemount,mn', 'royalton,mn', 'rushford,mn', 'russell,mn', 'saint charles,mn', 'saint michael,mn', 'sauk centre,mn', 'slayton,mn', 'spicer,mn', 'spring valley,mn', 'springfield,mn', 'st anthony,mn', 'st. anthony,mn', 'starbuck,mn', 'taconite,mn', 'wabasso,mn', 'walker,mn', 'wanamingo,mn', 'waseca,mn', 'watertown,mn', 'waterville,mn', 'wells,mn', 'wheaton,mn', 'white bear lk,mn', 'winnebago,mn', 'winthrop,mn', 'wright,mn', 'beaumont,ms', 'belmont,ms', 'blue mountain,ms', 'brooksville,ms', 'bude,ms', 'burnsville,ms', 'byram,ms', 'carrollton,ms', 'coffeeville,ms', 'coldwater,ms', 'collins,ms', 'courtland,ms', 'crenshaw,ms', 'de kalb,ms', 'diberville,ms', 'durant,ms', 'ecru,ms', 'florence,ms', 'gloster,ms', 'heidelberg,ms', 'hermanville,ms', 'hickory flat,ms', 'hollandale,ms', 'inverness,ms', 'isola,ms', 'lakeshore,ms', 'leakesville,ms', 'lexington,ms', 'liberty,ms', 'lula,ms', 'maben,ms', 'mantachie,ms', 'marks,ms', 'mayersville,ms', 'mayhew,ms', 'meadville,ms', 'mineral wells,ms', 'money,ms', 'monticello,ms', 'moorhead,ms', 'myrtle,ms', 'nettleton,ms', 'oakland,ms', 'pace,ms', 'plantersville,ms', 'prentiss,ms', 'raleigh,ms', 'raymond,ms', 'richton,ms', 'ruleville,ms', 'schlater,ms', 'scooba,ms', 'sebastopol,ms', 'sherman,ms', 'shubuta,ms', 'shuqualak,ms', 'state line,ms', 'sumrall,ms', 'taylorsville,ms', 'tutwiler,ms', 'water valley,ms', 'wesson,ms', 'winona,ms', 'woodville,ms', 'arcadia,mo', 'arnold,mo', 'ashland,mo', 'branson,mo', 'brookline station,mo', 'clinton,mo', 'crystal city,mo', 'eureka,mo', 'ferguson,mo', 'fredericktown,mo', 'holden,mo', 'imperial,mo', 'lake st louis,mo', 'marionville,mo', 'monett,mo', 'monroe city,mo', 'nixa,mo', 'oak grove,mo', 'overland,mo', 'piedmont,mo', 'plattsburg,mo', 'pleasant hill,mo', 'purdy,mo', 'reeds spring,mo', 'sedalia,mo', 'st ann,mo', 'st charles,mo', 'st peters,mo', 'st. peters,mo', 'steele,mo', 'thayer,mo', 'town and country,mo', 'trenton,mo', 'union,mo', 'university city,mo', 'warsaw,mo', 'webb city,mo', 'winfield,mo', 'absarokee,mt', 'big sandy,mt', 'big sky,mt', 'big timber,mt', 'bigfork,mt', 'browning,mt', 'chester,mt', 'choteau,mt', 'colstrip,mt', 'deer lodge,mt', 'ennis,mt', 'fort benton,mt', 'hardin,mt', 'hot springs,mt', 'lewistown,mt', 'malta,mt', 'manhattan,mt', 'miles city,mt', 'poplar,mt', 'reed point,mt', 'roundup,mt', 'stanford,mt', 'terry,mt', 'thompson falls,mt', 'winifred,mt', 'apartment 15,ne', 'apartment k-1,ne', 'arnold,ne', 'ashland,ne', 'atkinson,ne', 'bancroft,ne', 'beemer,ne', 'bellvue,ne', 'benkelman,ne', 'bridgeport,ne', 'broken bow,ne', 'central city,ne', 'clarks,ne', 'clarkson,ne', 'culbertson,ne', 'dannebrog,ne', 'deshler,ne', 'emerson,ne', 'emmet,ne', 'fairbury,ne', 'franklin,ne', 'fullerton,ne', 'gering,ne', 'hebron,ne', 'hemingford,ne', 'imperial,ne', 'loup city,ne', 'minden,ne', 'mitchell,ne', 'nelson,ne', 'oakland,ne', 'oneill,ne', 'ord,ne', 'orleans,ne', 'papillon,ne', 'pender,ne', 'rushville,ne', 'saint paul,ne', 'shelton,ne', 'silver creek,ne', 'tecumseh,ne', 'uehling,ne', 'valley,ne', 'waterloo,ne', 'waverly,ne', 'wayne,ne', 'west point,ne', 'wilber,ne', 'battle mountain,nv', 'beatty,nv', 'caliente,nv', 'indian springs,nv', 'jackpot,nv', 'minden,nv', 'searchlight,nv', 'sun valley,nv', 'winchester,nv', 'antrim,nh', 'ashland,nh', 'atkinson,nh', 'candia,nh', 'colebrook,nh', 'contoocook,nh', 'east hampstead,nh', 'epping,nh', 'exeter,nh', 'farmington,nh', 'hampton beach,nh', 'henniker,nh', 'lincoln,nh', 'litchfield,nh', 'loudon,nh', 'meredith,nh', 'merrimack,nh', 'new ipswich,nh', 'newport,nh', 'newton junction,nh', 'northfield,nh', 'peterborough,nh', 'pittsfield,nh', 'salem,nh', 'sanbornville,nh', 'somersworth,nh', 'swanzey,nh', 'weare,nh', 'whitefield,nh', 'avon by the sea,nj', 'barnegat,nj', 'basking ridge,nj', 'bay head,nj', 'bedminster,nj', 'belle mead,nj', 'belleville,nj', 'belmar,nj', 'berkeley heights,nj', 'boonton,nj', 'bound brook,nj', 'bradley beach,nj', 'bricktown,nj', 'brigantine,nj', 'brooklawn,nj', 'buena,nj', 'butler,nj', 'caldwell,nj', 'carneys point,nj', 'cedar knolls,nj', 'chester,nj', 'clark,nj', 'cliffside park,nj', 'cliffwood,nj', 'clinton,nj', 'cranbury,nj', 'cresskill,nj', 'dennisville,nj', 'eastampton,nj', 'englishtown,nj', 'ewing,nj', 'fairlawn,nj', 'fairview,nj', 'florence,nj', 'flushing,nj', 'fords,nj', 'frenchtown,nj', 'galloway township,nj', 'garfield,nj', 'glen rock,nj', 'guttenberg,nj', 'haddon twp,nj', 'haledon,nj', 'hamburg,nj', 'hampton,nj', 'hasbrouck heights,nj', 'havertown,nj', 'helmetta,nj', 'hi nella,nj', 'hightstown,nj', 'hillside,nj', 'howell,nj', 'kingston,nj', 'kinnelon,nj', 'lafayette,nj', 'landing,nj', 'laurel springs,nj', 'leonia,nj', 'lincoln park,nj', 'little egg hbr twp,nj', 'livingston,nj', 'long island city,nj', 'longport,nj', 'manahawkin,nj', 'manasquan,nj', 'mansfield,nj', 'margate city,nj', 'maywood,nj', 'merchantville,nj', 'middlesex,nj', 'middletown,nj', 'milford,nj', 'monmouth jct,nj', 'montvale,nj', 'montville,nj', 'mullica hill,nj', 'n plainfield,nj', 'netcong,nj', 'newfoundland,nj', 'north arlington,nj', 'north wildwood,nj', 'oakhurst,nj', 'ocean grove,nj', 'ocean township,nj', 'park ridge,nj', 'pennsauken,nj', 'pequannock,nj', 'philadelphia,nj', 'pine brook,nj', 'port monmouth,nj', 'raritan,nj', 'ridgefield,nj', 'ridgefield park,nj', 'rockaway township,nj', 'roselle,nj', 'roselle park,nj', 'rutherford,nj', 'saddle brook,nj', 'salem,nj', 'sayreville,nj', 'sea girt,nj', 'seaside park,nj', 'secaucus,nj', 'somerdale,nj', 'south bound brook,nj', 'south brunswick,nj', 'south orange,nj', 'spring lake heights,nj', 'summit,nj', 'swedesboro,nj', 'teaneck,nj', 'upper saddle river,nj', 'villas,nj', 'wall township,nj', 'wallington,nj', 'waretown,nj', 'washington,nj', 'washington township,nj', 'watchung,nj', 'wenonah,nj', 'west berlin,nj', 'west end,nj', 'west windsor,nj', 'white plains,nj', 'whitehouse station,nj', 'whitesboro,nj', 'willingboro,nj', 'wood ridge,nj', 'woolwich township,nj', 'wrightstown,nj', 'bernalillo,nm', 'cuba,nm', 'dexter,nm', 'elephant butte,nm', 'eunice,nm', 'fort wingate,nm', 'hagerman,nm', 'la luz,nm', 'lordsburg,nm', 'moriarty,nm', 'navajo,nm', 'ranchos de taos,nm', 'raton,nm', 'ruidoso downs,nm', 'santa clara,nm', 'sante fe,nm', 'taos ski valley,nm', 'thoreau,nm', '1,ny', 'addison,ny', 'afton,ny', 'alexandria bay,ny', 'alley stream,ny', 'amsterdam,ny', 'angola,ny', 'antwerp,ny', 'bainbridge,ny', 'ballston lake,ny', 'ballston spa,ny', 'barker,ny', 'bayport,ny', 'bayside,ny', 'bedford hills,ny', 'bellerose,ny', 'bemus point,ny', 'bethlehem,ny', 'black river,ny', 'bloomfield,ny', 'blue point,ny', 'bohemia,ny', 'breesport,ny', 'brewerton,ny', 'burnt hills,ny', 'calcium,ny', 'calverton,ny', 'camden,ny', 'canajoharie,ny', 'canisteo,ny', 'canton,ny', 'castletn on hdsn,ny', 'castleton on hudson,ny', 'cattaraugus,ny', 'cayuta,ny', 'central square,ny', 'chatham,ny', 'cheektowaga,ny', 'churchville,ny', 'cicero,ny', 'clarence,ny', 'clifton springs,ny', 'cobleskill,ny', 'coeymans,ny', 'cold spring,ny', 'commack,ny', 'cooperstown,ny', 'cornwall,ny', 'delevan,ny', 'derby,ny', 'east hampton,ny', 'east meadow,ny', 'east moriches,ny', 'east rochester,ny', 'east rockaway,ny', 'east setauket,ny', 'eastchester,ny', 'etna,ny', 'farmingdale,ny', 'frankfort,ny', 'fresh meadows,ny', 'frewsburg,ny', 'fulton,ny', 'glenmont,ny', 'green island,ny', 'greenwood lake,ny', 'hamlin,ny', 'hampton bays,ny', 'harriman,ny', 'harrison,ny', 'hicksville,ny', 'hilton,ny', 'honeoye falls,ny', 'ilion,ny', 'inwood,ny', 'irvington,ny', 'islip,ny', 'johnson city,ny', 'johnstown,ny', 'kauneonga lake,ny', 'lakewood,ny', 'larchmont,ny', 'lawrence,ny', 'liberty,ny', 'livingston manor,ny', 'lynbrook,ny', 'madison square sta,ny', 'manhasset,ny', 'manhattan,ny', 'manorville,ny', 'marcellus,ny', 'maspeth,ny', 'massapequa,ny', 'meadows,ny', 'medford,ny', 'melville,ny', 'mineola,ny', 'mohegan lake,ny', 'morrisville,ny', 'nassau,ny', 'nesconset,ny', 'new paltz,ny', 'north bellmore,ny', 'norwich,ny', 'norwood,ny', 'nyack,ny', 'oakdale,ny', 'oakland gdns,ny', 'orangeburg,ny', 'oriskany falls,ny', 'ozone park,ny', 'palatine bridge,ny', 'peekskill,ny', 'peru,ny', 'phoenix,ny', 'pittsford,ny', 'pomona,ny', 'port byron,ny', 'port chester,ny', 'port ewen,ny', 'port jefferson,ny', 'port jervis,ny', 'pulaski,ny', 'ravena,ny', 'riverhead,ny', 'rochster,ny', 'romulus,ny', 'saint james,ny', 'salamanca,ny', 'sandy creek,ny', 'saugerties,ny', 'sayville,ny', 'sea cliff,ny', 'seaford,ny', 'selkirk,ny', 'shirley,ny', 'sidney,ny', 'sinclairville,ny', 'south fallsburg,ny', 'southampton,ny', 'southold,ny', 'spring valley,ny', 'vernon,ny', 'washingtonville,ny', 'wassaic,ny', 'waterford,ny', 'weedsport,ny', 'west chazy,ny', 'west coxsackie,ny', 'westfield,ny', 'whitesboro,ny', 'windsor,ny', 'woodridge,ny', 'woodside,ny', 'ahoskie,nc', 'aurora,nc', 'banner elk,nc', 'benson,nc', 'beulaville,nc', 'biscoe,nc', 'black mountain,nc', 'brevard,nc', 'buies creek,nc', 'candler,nc', 'carolina beach,nc', 'cashiers,nc', 'china grove,nc', 'clarkton,nc', 'clyde,nc', 'cramerton,nc', 'dobson,nc', 'drexel,nc', 'ellerbe,nc', 'elm city,nc', 'erwin,nc', 'fair bluff,nc', 'fairmont,nc', 'franklinton,nc', 'fuquay-varina,nc', 'gibson,nc', 'hampstead,nc', 'haw river,nc', 'hertford,nc', 'hookerton,nc', 'hot springs,nc', 'indian trail,nc', 'kinston,nc', 'leland,nc', 'middlesex,nc', 'morganton,nc', 'mount gilead,nc', 'mt. holly,nc', 'murphy,nc', 'new york,nc', 'newland,nc', 'newport,nc', 'north carolina,nc', 'norwood,nc', 'pikeville,nc', 'pinetops,nc', 'pittsboro,nc', 'princeton,nc', 'randleman,nc', 'richlands,nc', 'riegelwood,nc', 'rockingham,nc', 'rutherfordton,nc', 'sapphire,nc', 'seaboard,nc', 'sharpsburg,nc', 'sparta,nc', 'spindale,nc', 'swansboro,nc', 'taylorsville,nc', 'valdese,nc', 'vanceboro,nc', 'walkertown,nc', 'wallace,nc', 'warrenton,nc', 'warsaw,nc', 'weaverville,nc', 'west jefferson,nc', 'whitakers,nc', 'whitsett,nc', 'williamston,nc', 'wingate,nc', 'winterville,nc', 'woodland,nc', 'yadkinville,nc', 'zebulon,nc', 'aneta,nd', 'beach,nd', 'belcourt,nd', 'bottineau,nd', 'burlington,nd', 'cando,nd', 'carrington,nd', 'cavalier,nd', 'cooperstown,nd', 'dunseith,nd', 'emerado,nd', 'finley,nd', 'forman,nd', 'langdon,nd', 'leeds,nd', 'park river,nd', 'saint john,nd', 'walhalla,nd', 'washburn,nd', 'addyston,oh', 'albany,oh', 'amherst,oh', 'andover,oh', 'anna,oh', 'arlington,oh', 'ashley,oh', 'ashville,oh', 'bainbridge,oh', 'barberton,oh', 'beallsville,oh', 'bellville,oh', 'bethel,oh', 'bethesda,oh', 'blue ash montgomery,oh', 'blue ash(cincinnati),oh', 'bolivar,oh', 'botkins,oh', 'brecksville,oh', 'bridgeport,oh', 'brook park,oh', 'brookpark,oh', 'brookville,oh', 'burlington,oh', 'burton,oh', 'canal fulton,oh', 'clayton,oh', 'cleves,oh', 'clifton,oh', 'colerain,oh', 'columbiana,oh', 'conneaut,oh', 'cortland,oh', 'cridersville,oh', 'de graff,oh', 'delphos,oh', 'delta,oh', 'dover,oh', 'doylestown,oh', 'east cleveland,oh', 'ellet,oh', 'enon,oh', 'fayette,oh', 'felicity,oh', 'fremont,oh', 'galion,oh', 'gallipolis,oh', 'geneva,oh', 'goshen,oh', 'granville,oh', 'greenville,oh', 'harrison,oh', 'heath,oh', 'hebron,oh', 'hillsboro,oh', 'ironton,oh', 'jackson center,oh', 'johnstown,oh', 'killbuck,oh', 'kirtland,oh', 'lockbourne,oh', 'london,oh', 'maimisburg,oh', 'mc comb,oh', 'mentor on lake,oh', 'mentor on the,oh', 'moraine,oh', 'mount gilead,oh', 'mt vernon,oh', 'napoleon,oh', 'new concord,oh', 'new lexington,oh', 'new london,oh', 'new vienna,oh', 'newcomerstown,oh', 'north baltimore,oh', 'northfield,oh', 'northwood,oh', 'ottawa,oh', 'owensville,oh', 'painsville township,oh', 'paulding,oh', 'perrysville,oh', 'plymouth,oh', 'powell,oh', 'sabina,oh', 'saint marys,oh', 'salineville,oh', 'sheffield village,oh', 'south lebanon,oh', 'south vienna,oh', 'springdale,oh', 'sugarcreek,oh', 'swanton,oh', 'uniontown,oh', 'urbana,oh', 'versailles,oh', 'walbridge,oh', 'wapakoneta,oh', 'warsaw,oh', 'west jefferson,oh', 'west union,oh', 'wheelersburg,oh', 'williamsburg,oh', 'wilowick,oh', 'xenia,oh', 'ada,ok', 'adair,ok', 'afton,ok', 'alex,ok', 'apache,ok', 'beaver,ok', 'boise city,ok', 'buffalo,ok', 'cache,ok', 'calera,ok', 'canute,ok', 'catoosa,ok', 'cherokee,ok', 'chouteau,ok', 'commerce,ok', 'cyril,ok', 'elgin,ok', 'frederick,ok', 'gore,ok', 'harrah,ok', 'haskell,ok', 'helena,ok', 'idabel,ok', 'inola,ok', 'jay,ok', 'jenks,ok', 'laverne,ok', 'locust grove,ok', 'mcalester,ok', 'mcloud,ok', 'moffett,ok', 'mooreland,ok', 'morris,ok', 'mustang,ok', 'okarche,ok', 'okmulgee,ok', 'panama,ok', 'poteau,ok', 'prague,ok', 'salina,ok', 'sallisaw,ok', 'sand springs,ok', 'sapulpa,ok', 'seiling,ok', 'shattuck,ok', 'stigler,ok', 'stilwell,ok', 'talihina,ok', 'valliant,ok', 'van buren,ok', 'vici,ok', 'webbers falls,ok', 'welch,ok', 'wister,ok', 'bandon,or', 'cannon beach,or', 'canyon city,or', 'canyonville,or', 'college crest,or', 'coquille,or', 'creswell,or', 'dayton,or', 'eagle point,or', 'elgin,or', 'enterprise,or', 'florence,or', 'gold beach,or', 'hammond,or', 'hillboro,or', 'hines,or', 'jacksonville,or', 'john day,or', 'joseph,or', 'kerby,or', 'king city,or', 'lafayette,or', 'lowell,or', 'merrill,or', 'myrtle point,or', 'nehalem,or', 'phoenix,or', 'riddle,or', 'vale,or', 'vernonia,or', 'white city,or', 'albion,pa', 'aldan,pa', 'aqua,pa', 'aspers,pa', 'aspinwall,pa', 'atglen,pa', 'avalon,pa', 'avonmore,pa', 'baden,,pa', 'bellefonte,pa', 'bellwood,pa', 'bentleyville,pa', 'blairsville,pa', 'boalsburg,pa', 'boiling springs,pa', 'brackenridge,pa', 'brookville,pa', 'california,pa', 'catasauqua,pa', 'chester springs,pa', 'chesterbrook,pa', 'chestnut hill,pa', 'clintonville,pa', 'coal township,pa', 'conway,pa', 'dallastown,pa', 'denver,pa', 'devon,pa', 'dillsburg,pa', 'duncansville,pa', 'east brady,pa', 'edwardsville,pa', 'ellsworth,pa', 'emlenton,pa', 'emmaus,pa', 'emporium,pa', 'everett,pa', 'exeter,pa', 'fairless hills,pa', 'fairview,pa', 'farrell,pa', 'feasterville trevose,pa', 'folcroft,pa', 'folsom,pa', 'ford city,pa', 'fort washington,pa', 'freedom,pa', 'gallitzin,pa', 'gilbertsville,pa', 'girardville,pa', 'halifax,pa', 'hallstead,pa', 'hamburg,pa', 'harborcreek,pa', 'hermitage,pa', 'honesdale,pa', 'hughesville,pa', 'irwin,pa', 'kane,pa', 'kulpmont,pa', 'leechburg,pa', 'lemoyne,pa', 'leola,pa', 'lewes,pa', 'lititz,pa', 'lock haven,pa', 'manchester,pa', 'mansfield,pa', 'marcus hook,pa', 'mars,pa', 'marshalls creek,pa', 'matamoras,pa', 'mc alisterville,pa', 'mc keesport,pa', 'mc sherrystown,pa', 'melrose park,pa', 'mercersburg,pa', 'mexico,pa', 'mifflintown,pa', 'millville,pa', 'milton,pa', 'monaca,pa', 'monessen,pa', 'montrose,pa', 'moscow,pa', 'mount pocono,pa', 'muncy,pa', 'munhall,pa', 'myerstown,pa', 'nanticoke,pa', 'nazareth,pa', 'new bethlehem,pa', 'new brighton,pa', 'new cumberland,pa', 'new hope,pa', 'new wilmington,pa', 'newport,pa', 'newtown,pa', 'northampton,pa', 'oakdale,pa', 'oil city,pa', 'olyphant,pa', 'oreland,pa', 'palmerton,pa', 'paoli,pa', 'penn hills,pa', 'perry square,pa', 'phila,pa', 'philipsburg,pa', 'pleasant hills,pa', 'prospect park,pa', 'quakertown,pa', 'reedsville,pa', 'ridgway,pa', 'robesonia,pa', 'rochester,pa', 'saxonburg,pa', 'sellersville,pa', 'shamokin,pa', 'sharpsville,pa', 'shoemakersville,pa', 'south park,pa', 'southpointe,pa', 'springboro,pa', 'state colleg,pa', 'steelton,pa', 'stowe,pa', 'susquehanna,pa', 'swarthmore,pa', 'thompsontown,pa', 'thorndale,pa', 'tidioute,pa', 'titusville,pa', 'tobyhanna,pa', 'trevose,pa', 'trexlertown,pa', 'ulysses,pa', 'verona,pa', 'wellsboro,pa', 'west lawn,pa', 'west newton,pa', 'west norriton,pa', 'west pittston,pa', 'west reading,pa', 'wilkes-barre,pa', 'wilmerding,pa', 'wind gap,pa', 'wyncote,pa', 'wyoming,pa', 'barrington,ri', 'block island,ri', 'bristol,ri', 'harmony,ri', 'hope valley,ri', 'manville,ri', 'narragansett,ri', 'north smithfield,ri', 'rumford,ri', 'wakefield,ri', 'warren,ri', 'west greenwich,ri', 'allendale,sc', 'blackville,sc', 'bowman,sc', 'calhoun falls,sc', 'cheraw,sc', 'chesnee,sc', 'chesterfield,sc', 'clearwater,sc', 'clio,sc', 'clover,sc', 'edisto island,sc', 'ehrhardt,sc', 'fountain inn,sc', 'graniteville,sc', 'hampton,sc', 'hilton head,sc', 'honea path,sc', 'irmo,sc', 'jackson,sc', 'kershaw,sc', 'lake wylie,sc', 'lamar,sc', 'landrum,sc', 'leesville,sc', 'liberty,sc', 'lyman,sc', 'moore,sc', 'murrells inlet,sc', 'n myrtle beach,sc', 'pacolet,sc', 'pamplico,sc', 'pelzer,sc', 'pendleton,sc', 'prosperity,sc', 'ridge spring,sc', 'ridgeway,sc', 'saint george,sc', 'saluda,sc', 'swansea,sc', 'walhalla,sc', 'ware shoals,sc', 'warrenville,sc', 'wellford,sc', 'whitmire,sc', 'williston,sc', 'windsor,sc', 'woodruff,sc', 'alcester,sd', 'arlington,sd', 'armour,sd', 'canton,sd', 'carthage,sd', 'castlewood,sd', 'centerville,sd', 'de smet,sd', 'deadwood,sd', 'eagle butte,sd', 'elk point,sd', 'gary,sd', 'gettysburg,sd', 'gregory,sd', 'groton,sd', 'hartford,sd', 'highmore,sd', 'hill city,sd', 'lead,sd', 'mission,sd', 'newell,sd', 'tyndall,sd', 'volga,sd', 'wagner,sd', 'wakonda,sd', 'webster,sd', 'alamo,tn', 'arlington,tn', 'atoka,tn', 'blountville,tn', 'bradford,tn', 'brentwood,tn', 'brighton,tn', 'byrdstown,tn', 'celina,tn', 'charlotte,tn', 'coalmont,tn', 'collinwood,tn', 'cornersville,tn', 'cumberland city,tn', 'dayton,tn', 'dyer,tn', 'east ridge,tn', 'ellendale,tn', 'etowah,tn', 'gallaway,tn', 'granville,tn', 'halls,tn', 'henning,tn', 'jasper,tn', 'jellico,tn', 'joelton,tn', 'kenton,tn', 'kingston,tn', 'lafayette,tn', 'lakeland,tn', 'lawrenceburg,tn', 'lexington,tn', 'linden,tn', 'livingston,tn', 'mc ewen,tn', 'mc kenzie,tn', 'middleton,tn', 'milan,tn', 'millersville,tn', 'monterey,tn', 'mount pleasant,tn', 'mt. juliet,tn', 'new tazewell,tn', 'newport,tn', 'ocoee,tn', 'oneida,tn', 'parsons,tn', 'ridgely,tn', 'ripley,tn', 'rockwood,tn', 'saint bethlehem,tn', 'soddy daisy,tn', 'south fulton,tn', 'spring city,tn', 'tiptonville,tn', 'tracy city,tn', 'unicoi,tn', 'watertown,tn', 'waynesboro,tn', 'westmoreland,tn', 'white bluff,tn', 'abernathy,tx', 'alamo heights,tx', 'alto,tx', 'anson,tx', 'aubrey,tx', 'ballinger,tx', 'barker,tx', 'bells,tx', 'big lake,tx', 'bishop,tx', 'bogata,tx', 'bowie,tx', 'boyd,tx', 'buda,tx', 'bullard,tx', 'caddo mills,tx', 'calvert,tx', 'canadian,tx', 'carrizo springs,tx', 'carrolton,tx', 'centerville,tx', 'clifton,tx', 'coldspring,tx', 'coleman,tx', 'coolidge,tx', 'cooper,tx', 'corrigan,tx', 'crane,tx', 'danbury,tx', 'darrouzett,tx', 'de soto,tx', 'detroit,tx', 'devine,tx', 'diboll,tx', 'donna,tx', 'dripping springs,tx', 'early,tx', 'edgewood,tx', 'electra,tx', 'elkhart,tx', 'elmwood,tx', 'fabens,tx', 'floresville,tx', 'franklin,tx', 'frankston,tx', 'freeport,tx', 'friona,tx', 'fruitvale,tx', 'ftworth,tx', 'gatesville,tx', 'gonzales,tx', 'granbury,tx', 'grandview,tx', 'grapeland,tx', 'gregory,tx', 'groesbeck,tx', 'groveton,tx', 'hallsville,tx', 'hamlin,tx', 'helotes,tx', 'hidalgo,tx', 'highlands,tx', 'hitchcock,tx', 'hubbard,tx', 'ingram,tx', 'jacksonville,tx', 'johnson city,tx', 'jourdanton,tx', 'junction,tx', 'kirbyville,tx', 'kosse,tx', 'la vernia,tx', 'leonard,tx', 'little river-academy,tx', 'llano,tx', 'lorena,tx', 'mabank,tx', 'madisonville,tx', 'malakoff,tx', 'manvel,tx', 'mart,tx', 'mathis,tx', 'menard,tx', 'merkel,tx', 'mexia,tx', 'midlothian,tx', 'mineola,tx', 'mission,tx', 'morrison,tx', 'mount vernon,tx', 'muleshoe,tx', 'n richland hills,tx', 'needville,tx', 'newton,tx', 'nocona,tx', 'pantego,tx', 'pharr,tx', 'pilot point,tx', 'port aransas,tx', 'port arthur,tx', 'presidio,tx', 'red oak,tx', 'richwood,tx', 'rio hondo,tx', 'rogers,tx', 'rosebud,tx', 'san antonio tx,tx', 'san juan,tx', 'san+antonio,tx', 'savoy,tx', 'selma,tx', 'seymour,tx', 'shepherd,tx', 'slaton,tx', 'somerville,tx', 'sour lake,tx', 'south houston,tx', 'south padre island,tx', 'southlake,tx', 'stamford,tx', 'sundown,tx', 'tatum,tx', 'trinity,tx', 'valley view,tx', 'van alstyne,tx', 'venus,tx', 'wallis,tx', 'watauga,tx', 'weatherford,tx', 'weimar,tx', 'wellington,tx', 'weslaco,tx', 'west columbia,tx', 'whitehouse,tx', 'whitney,tx', 'wilmer,tx', 'winters,tx', 'woodville,tx', 'wylie,tx', 'yantis,tx', 'american fork,ut', 'beaver,ut', 'bluffdale,ut', 'centerville,ut', 'farmington,ut', 'heber,ut', 'herriman,ut', 'huntington,ut', 'hyrum,ut', 'kanab,ut', 'kearns,ut', 'lehi,ut', 'manti,ut', 'midway,ut', 'nephi,ut', 'parowan,ut', 'salina,ut', 'smithfield,ut', 'springville,ut', 'st george,ut', 'washington terrace,ut', 'west haven,ut', 'barton,vt', 'bellows falls,vt', 'brandon,vt', 'center rutland,vt', 'charlotte,vt', 'chelsea,vt', 'chester,vt', 'colchester,vt', 'hartland,vt', 'jeffersonville,vt', 'ludlow,vt', 'morrisville,vt', 'newark hollow,vt', 'poultney,vt', 'putney,vt', 'sharon,vt', 'stowe,vt', 'vergennes,vt', 'west wardsboro,vt', 'white river junction,vt', 'williamstown,vt', 'windsor,vt', 'amelia court house,va', 'annadale,va', 'bassett,va', 'boones mill,va', 'bowling green,va', 'burke,va', 'cape charles,va', 'carrollton,va', 'charleston,va', 'chatham,va', 'clifton forge,va', 'cloverdale,va', 'collinsville,va', 'colonial beach,va', 'columbia,va', 'craigsville,va', 'daleville,va', 'dayton,va', 'deltaville,va', 'dillwyn,va', 'drakes branch,va', 'dunbar,va', 'elkton,va', 'emporia,va', 'fairfax city,va', 'fort belvoir,va', 'glen lyn,va', 'gloucester point,va', 'gordonsville,va', 'hayes,va', 'haysi,va', 'jarratt,va', 'jonesville,va', 'keysville,va', 'king william,va', 'lebanon,va', 'lexington,va', 'louisa,va', 'manassas park,va', 'mannassas,va', 'martinsville,va', 'mathews,va', 'new canton,va', 'new market,va', 'norton,va', 'pearisburg,va', 'pocahontas,va', 'poquoson,va', 'rosslyn,va', 'saint paul,va', 'saltville,va', 'scottsville,va', 'shenandoah,va', 'smithfield,va', 'south boston,va', 'south riding,va', 'stuart,va', 'toano,va', 'verona,va', 'virgina beach,va', 'virginia bch,va', 'warsaw,va', 'waverly,va', 'wise,va', 'woodstock,va', 'wytheville,va', 'alderwood manor,wa', 'anacortes,wa', 'bothell,,wa', 'brewster,wa', 'carnation,wa', 'cathlamet,wa', 'chewelah,wa', 'chuckanut,wa', 'college place,wa', 'concrete,wa', 'coulee city,wa', 'covington,wa', 'davenport,wa', 'dayton,wa', 'deer park,wa', 'everson,wa', 'fairfield,wa', 'grandview,wa', 'granite falls,wa', 'hoquiam,wa', 'kalama,wa', 'liberty lake,wa', 'maple valley,wa', 'mccleary,wa', 'milton,wa', 'montesano,wa', 'ocean shores,wa', 'pacific,wa', 'quincy,wa', 'ridgefield,wa', 'ritzville,wa', 'selah,wa', 'snoqualmie,wa', 'stevenson,wa', 'suite 134,wa', 'tonasket,wa', 'vashon,wa', 'wapato,wa', 'warden,wa', 'west richland,wa', 'white salmon,wa', 'winlock,wa', 'winthrop,wa', 'woodland,wa', 'zillah,wa', 'alderson,wv', 'ansted,wv', 'belington,wv', 'berkeley springs,wv', 'beverly,wv', 'branchland,wv', 'buffalo,wv', 'cabin creek,wv', 'charles town,wv', 'craigsville,wv', 'daniels,wv', 'eleanor,wv', 'fairlea,wv', 'fort gay,wv', 'gauley bridge,wv', 'gilbert,wv', 'glen daniel,wv', 'glenville,wv', 'grafton,wv', 'hamlin,wv', 'harpers ferry,wv', 'harrisville,wv', 'jane lew,wv', 'kenova,wv', 'kermit,wv', 'logan,wv', 'mabscott,wv', 'madison,wv', 'mannington,wv', 'matewan,wv', 'maysel,wv', 'mineral wells,wv', 'montgomery,wv', 'moorefield,wv', 'mullens,wv', 'new cumberland,wv', 'new haven,wv', 'newtown,wv', 'northfork,wv', 'oceana,wv', 'pennsboro,wv', 'peterstown,wv', 'philippi,wv', 'prosperity,wv', 'red house,wv', 'richwood,wv', 'ridgeley,wv', 'saint albans,wv', 'saint marys,wv', 'sarah ann,wv', 'scott depot,wv', 'shepherdstown,wv', 'shoals,wv', 'smithers,wv', 'sutton,wv', 'switzer,wv', 'teays,wv', 'webster springs,wv', 'welch,wv', 'white oak,wv', 'whitesville,wv', 'algoma,wi', 'augusta,wi', 'barron,wi', 'belmont,wi', 'black river falls,wi', 'blair,wi', 'blue river,wi', 'boulder junction,wi', 'brodhead,wi', 'brown deer,wi', 'casco,wi', 'centuria,wi', 'chaseburg,wi', 'chippewa falls,wi', 'christie,wi', 'clinton,wi', 'clintonville,wi', 'colfax,wi', 'coon valley,wi', 'cornell,wi', 'cottage grove,wi', 'crandon,wi', 'cross plains,wi', 'cuba city,wi', 'de forest,wi', 'denmark,wi', 'dickeyville,wi', 'dodge,wi', 'durand,wi', 'eagle river,wi', 'east troy,wi', 'ellsworth,wi', 'fennimore,wi', 'fountain city,wi', 'francis creek,wi', 'genoa city,wi', 'glendale,wi', 'glidden,wi', 'green lake,wi', 'greenwood,wi', 'hatley,wi', 'haven,wi', 'hazel green,wi', 'highland,wi', 'hillsboro,wi', 'holmen,wi', 'hurley,wi', 'iola,wi', 'jackson,wi', 'kellnersville,wi', 'kewaunee,wi', 'ladysmith,wi', 'lake tomahawk,wi', 'little chute,wi', 'loyal,wi', 'mauston,wi', 'mayville,wi', 'mellen,wi', 'milwaukee,,wi', 'mt horeb,wi', 'muskego,wi', 'new holstein,wi', 'north freedom,wi', 'oconto,wi', 'oconto falls,wi', 'omro,wi', 'owen,wi', 'oxford,wi', 'pell lake,wi', 'pepin,wi', 'plain,wi', 'prescott,wi', 'randolph,wi', 'reedsburg,wi', 'richland center,wi', 'ridgeway,wi', 'rudolph,wi', 'saint germain,wi', 'salem,wi', 'saukville,wi', 'seymour,wi', 'sharon,wi', 'sheboygan falls,wi', 'shorewood,wi', 'silver lake,wi', 'slinger,wi', 'somerset,wi', 'spooner,wi', 'stanley,wi', 'thiensville,wi', 'thorp,wi', 'turtle lake,wi', 'two rivers,wi', 'union grove,wi', 'walworth,wi', 'washburn,wi', 'wausaukee,wi', 'west allis,wi', 'westby,wi', 'weyauwega,wi', 'whitehall,wi', 'whitelaw,wi', 'wild rose,wi', 'williams bay,wi', 'winneconne,wi', 'woodruff,wi', 'bitter creek,wy', 'etna,wy', 'greybull,wy', 'lovell,wy', 'lusk,wy', 'mountain view,wy', 'newcastle,wy', 'powell,wy', 'ranchester,wy', 'sundance,wy', 'worland,wy', 'wright,wy',];

	//
	new Autocompleter.Local('demo-local', tokens, {
		'minLength': 1, // 
		'overflow': true // 
	});

});
