/*!
 * Copyright (c) 2009 Simo Kinnunen.
 * Licensed under the MIT license.
 *
 * @version ${Version}
 */

var Cufon = (function() {

	var api = function() {
		return api.replace.apply(null, arguments);
	};

	var DOM = api.DOM = {

		ready: (function() {

			var complete = false, readyStatus = { loaded: 1, complete: 1 };

			var queue = [], perform = function() {
				if (complete) return;
				complete = true;
				for (var fn; fn = queue.shift(); fn());
			};

			// Gecko, Opera, WebKit r26101+

			if (document.addEventListener) {
				document.addEventListener('DOMContentLoaded', perform, false);
				window.addEventListener('pageshow', perform, false); // For cached Gecko pages
			}

			// Old WebKit, Internet Explorer

			if (!window.opera && document.readyState) (function() {
				readyStatus[document.readyState] ? perform() : setTimeout(arguments.callee, 10);
			})();

			// Internet Explorer

			if (document.readyState && document.createStyleSheet) (function() {
				try {
					document.body.doScroll('left');
					perform();
				}
				catch (e) {
					setTimeout(arguments.callee, 1);
				}
			})();

			addEvent(window, 'load', perform); // Fallback

			return function(listener) {
				if (!arguments.length) perform();
				else complete ? listener() : queue.push(listener);
			};

		})(),

		root: function() {
			return document.documentElement || document.body;
		}

	};

	var CSS = api.CSS = {

		Size: function(value, base) {

			this.value = parseFloat(value);
			this.unit = String(value).match(/[a-z%]*$/)[0] || 'px';

			this.convert = function(value) {
				return value / base * this.value;
			};

			this.convertFrom = function(value) {
				return value / this.value * base;
			};

			this.toString = function() {
				return this.value + this.unit;
			};

		},

		addClass: function(el, className) {
			var current = el.className;
			el.className = current + (current && ' ') + className;
			return el;
		},

		color: cached(function(value) {
			var parsed = {};
			parsed.color = value.replace(/^rgba\((.*?),\s*([\d.]+)\)/, function($0, $1, $2) {
				parsed.opacity = parseFloat($2);
				return 'rgb(' + $1 + ')';
			});
			return parsed;
		}),

		// has no direct CSS equivalent.
		// @see http://msdn.microsoft.com/en-us/library/system.windows.fontstretches.aspx
		fontStretch: cached(function(value) {
			if (typeof value == 'number') return value;
			if (/%$/.test(value)) return parseFloat(value) / 100;
			return {
				'ultra-condensed': 0.5,
				'extra-condensed': 0.625,
				condensed: 0.75,
				'semi-condensed': 0.875,
				'semi-expanded': 1.125,
				expanded: 1.25,
				'extra-expanded': 1.5,
				'ultra-expanded': 2
			}[value] || 1;
		}),

		getStyle: function(el) {
			var view = document.defaultView;
			if (view && view.getComputedStyle) return new Style(view.getComputedStyle(el, null));
			if (el.currentStyle) return new Style(el.currentStyle);
			return new Style(el.style);
		},

		gradient: cached(function(value) {
			var gradient = {
				id: value,
				type: value.match(/^-([a-z]+)-gradient\(/)[1],
				stops: []
			}, colors = value.substr(value.indexOf('(')).match(/([\d.]+=)?(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)/ig);
			for (var i = 0, l = colors.length, stop; i < l; ++i) {
				stop = colors[i].split('=', 2).reverse();
				gradient.stops.push([ stop[1] || i / (l - 1), stop[0] ]);
			}
			return gradient;
		}),

		quotedList: cached(function(value) {
			// doesn't work properly with empty quoted strings (""), but
			// it's not worth the extra code.
			var list = [], re = /\s*((["'])([\s\S]*?[^\\])\2|[^,]+)\s*/g, match;
			while (match = re.exec(value)) list.push(match[3] || match[1]);
			return list;
		}),

		recognizesMedia: cached(function(media) {
			var el = document.createElement('style'), sheet, container, supported;
			el.type = 'text/css';
			el.media = media;
			try { // this is cached anyway
				el.appendChild(document.createTextNode('/**/'));
			} catch (e) {}
			container = elementsByTagName('head')[0];
			container.insertBefore(el, container.firstChild);
			sheet = (el.sheet || el.styleSheet);
			supported = sheet && !sheet.disabled;
			container.removeChild(el);
			return supported;
		}),

		removeClass: function(el, className) {
			var re = RegExp('(?:^|\\s+)' + className +  '(?=\\s|$)', 'g');
			el.className = el.className.replace(re, '');
			return el;
		},

		supports: function(property, value) {
			var checker = document.createElement('span').style;
			if (checker[property] === undefined) return false;
			checker[property] = value;
			return checker[property] === value;
		},

		textAlign: function(word, style, position, wordCount) {
			if (style.get('textAlign') == 'right') {
				if (position > 0) word = ' ' + word;
			}
			else if (position < wordCount - 1) word += ' ';
			return word;
		},

		textShadow: cached(function(value) {
			if (value == 'none') return null;
			var shadows = [], currentShadow = {}, result, offCount = 0;
			var re = /(#[a-f0-9]+|[a-z]+\(.*?\)|[a-z]+)|(-?[\d.]+[a-z%]*)|,/ig;
			while (result = re.exec(value)) {
				if (result[0] == ',') {
					shadows.push(currentShadow);
					currentShadow = {};
					offCount = 0;
				}
				else if (result[1]) {
					currentShadow.color = result[1];
				}
				else {
					currentShadow[[ 'offX', 'offY', 'blur' ][offCount++]] = result[2];
				}
			}
			shadows.push(currentShadow);
			return shadows;
		}),

		textTransform: (function() {
			var map = {
				uppercase: function(s) {
					return s.toUpperCase();
				},
				lowercase: function(s) {
					return s.toLowerCase();
				},
				capitalize: function(s) {
					return s.replace(/\b./g, function($0) {
						return $0.toUpperCase();
					});
				}
			};
			return function(text, style) {
				var transform = map[style.get('textTransform')];
				return transform ? transform(text) : text;
			};
		})(),

		whiteSpace: (function() {
			var ignore = {
				inline: 1,
				'inline-block': 1,
				'run-in': 1
			};
			var wsStart = /^\s+/, wsEnd = /\s+$/;
			return function(text, style, node, previousElement) {
				if (previousElement) {
					if (previousElement.nodeName.toLowerCase() == 'br') {
						text = text.replace(wsStart, '');
					}
				}
				if (ignore[style.get('display')]) return text;
				if (!node.previousSibling) text = text.replace(wsStart, '');
				if (!node.nextSibling) text = text.replace(wsEnd, '');
				return text;
			};
		})()

	};

	CSS.ready = (function() {

		// don't do anything in Safari 2 (it doesn't recognize any media type)
		var complete = !CSS.recognizesMedia('all'), hasLayout = false;

		var queue = [], perform = function() {
			complete = true;
			for (var fn; fn = queue.shift(); fn());
		};

		var links = elementsByTagName('link'), styles = elementsByTagName('style');

		function isContainerReady(el) {
			return el.disabled || isSheetReady(el.sheet, el.media || 'screen');
		}

		function isSheetReady(sheet, media) {
			// in Opera sheet.disabled is true when it's still loading,
			// even though link.disabled is false. they stay in sync if
			// set manually.
			if (!CSS.recognizesMedia(media || 'all')) return true;
			if (!sheet || sheet.disabled) return false;
			try {
				var rules = sheet.cssRules, rule;
				if (rules) {
					// needed for Safari 3 and Chrome 1.0.
					// in standards-conforming browsers cssRules contains @-rules.
					// Chrome 1.0 weirdness: rules[<number larger than .length - 1>]
					// returns the last rule, so a for loop is the only option.
					search: for (var i = 0, l = rules.length; rule = rules[i], i < l; ++i) {
						switch (rule.type) {
							case 2: // @charset
								break;
							case 3: // @import
								if (!isSheetReady(rule.styleSheet, rule.media.mediaText)) return false;
								break;
							default:
								// only @charset can precede @import
								break search;
						}
					}
				}
			}
			catch (e) {} // probably a style sheet from another domain
			return true;
		}

		function allStylesLoaded() {
			// Internet Explorer's style sheet model, there's no need to do anything
			if (document.createStyleSheet) return true;
			// standards-compliant browsers
			var el, i;
			for (i = 0; el = links[i]; ++i) {
				if (el.rel.toLowerCase() == 'stylesheet' && !isContainerReady(el)) return false;
			}
			for (i = 0; el = styles[i]; ++i) {
				if (!isContainerReady(el)) return false;
			}
			return true;
		}

		DOM.ready(function() {
			// getComputedStyle returns null in Gecko if used in an iframe with display: none
			if (!hasLayout) hasLayout = CSS.getStyle(document.body).isUsable();
			if (complete || (hasLayout && allStylesLoaded())) perform();
			else setTimeout(arguments.callee, 10);
		});

		return function(listener) {
			if (complete) listener();
			else queue.push(listener);
		};

	})();

	function Font(data) {

		var face = this.face = data.face, wordSeparators = {
			'\u0020': 1,
			'\u00a0': 1,
			'\u3000': 1
		};

		this.glyphs = data.glyphs;
		this.w = data.w;
		this.baseSize = parseInt(face['units-per-em'], 10);

		this.family = face['font-family'].toLowerCase();
		this.weight = face['font-weight'];
		this.style = face['font-style'] || 'normal';

		this.viewBox = (function () {
			var parts = face.bbox.split(/\s+/);
			var box = {
				minX: parseInt(parts[0], 10),
				minY: parseInt(parts[1], 10),
				maxX: parseInt(parts[2], 10),
				maxY: parseInt(parts[3], 10)
			};
			box.width = box.maxX - box.minX;
			box.height = box.maxY - box.minY;
			box.toString = function() {
				return [ this.minX, this.minY, this.width, this.height ].join(' ');
			};
			return box;
		})();

		this.ascent = -parseInt(face.ascent, 10);
		this.descent = -parseInt(face.descent, 10);

		this.height = -this.ascent + this.descent;

		this.spacing = function(chars, letterSpacing, wordSpacing) {
			var glyphs = this.glyphs, glyph,
				kerning, k,
				jumps = [],
				width = 0, w,
				i = -1, j = -1, chr;
			while (chr = chars[++i]) {
				glyph = glyphs[chr] || this.missingGlyph;
				if (!glyph) continue;
				if (kerning) {
					width -= k = kerning[chr] || 0;
					jumps[j] -= k;
				}
				w = glyph.w;
				if (isNaN(w)) w = +this.w; // may have been a String in old fonts
				if (w > 0) {
					w += letterSpacing;
					if (wordSeparators[chr]) w += wordSpacing;
				}
				width += jumps[++j] = ~~w; // get rid of decimals
				kerning = glyph.k;
			}
			jumps.total = width;
			return jumps;
		};

	}

	function FontFamily() {

		var styles = {}, mapping = {
			oblique: 'italic',
			italic: 'oblique'
		};

		this.add = function(font) {
			(styles[font.style] || (styles[font.style] = {}))[font.weight] = font;
		};

		this.get = function(style, weight) {
			var weights = styles[style] || styles[mapping[style]]
				|| styles.normal || styles.italic || styles.oblique;
			if (!weights) return null;
			// we don't have to worry about "bolder" and "lighter"
			// because IE's currentStyle returns a numeric value for it,
			// and other browsers use the computed value anyway
			weight = {
				normal: 400,
				bold: 700
			}[weight] || parseInt(weight, 10);
			if (weights[weight]) return weights[weight];
			// http://www.w3.org/TR/CSS21/fonts.html#propdef-font-weight
			// Gecko uses x99/x01 for lighter/bolder
			var up = {
				1: 1,
				99: 0
			}[weight % 100], alts = [], min, max;
			if (up === undefined) up = weight > 400;
			if (weight == 500) weight = 400;
			for (var alt in weights) {
				if (!hasOwnProperty(weights, alt)) continue;
				alt = parseInt(alt, 10);
				if (!min || alt < min) min = alt;
				if (!max || alt > max) max = alt;
				alts.push(alt);
			}
			if (weight < min) weight = min;
			if (weight > max) weight = max;
			alts.sort(function(a, b) {
				return (up
					? (a >= weight && b >= weight) ? a < b : a > b
					: (a <= weight && b <= weight) ? a > b : a < b) ? -1 : 1;
			});
			return weights[alts[0]];
		};

	}

	function HoverHandler() {

		function contains(node, anotherNode) {
			try {
				if (node.contains) return node.contains(anotherNode);
				return node.compareDocumentPosition(anotherNode) & 16;
			}
			catch(e) {} // probably a XUL element such as a scrollbar
			return false;
		}

		function onOverOut(e) {
			var related = e.relatedTarget;
			// there might be no relatedTarget if the element is right next
			// to the window frame
			if (related && contains(this, related)) return;
			trigger(this, e.type == 'mouseover');
		}

		function onEnterLeave(e) {
			trigger(this, e.type == 'mouseenter');
		}

		function trigger(el, hoverState) {
			// A timeout is needed so that the event can actually "happen"
			// before replace is triggered. This ensures that styles are up
			// to date.
			setTimeout(function() {
				var options = sharedStorage.get(el).options;
				api.replace(el, hoverState ? merge(options, options.hover) : options, true);
			}, 10);
		}

		this.attach = function(el) {
			if (el.onmouseenter === undefined) {
				addEvent(el, 'mouseover', onOverOut);
				addEvent(el, 'mouseout', onOverOut);
			}
			else {
				addEvent(el, 'mouseenter', onEnterLeave);
				addEvent(el, 'mouseleave', onEnterLeave);
			}
		};

	}

	function ReplaceHistory() {

		var list = [], map = {};

		function filter(keys) {
			var values = [], key;
			for (var i = 0; key = keys[i]; ++i) values[i] = list[map[key]];
			return values;
		}

		this.add = function(key, args) {
			map[key] = list.push(args) - 1;
		};

		this.repeat = function() {
			var snapshot = arguments.length ? filter(arguments) : list, args;
			for (var i = 0; args = snapshot[i++];) api.replace(args[0], args[1], true);
		};

	}

	function Storage() {

		var map = {}, at = 0;

		function identify(el) {
			return el.cufid || (el.cufid = ++at);
		}

		this.get = function(el) {
			var id = identify(el);
			return map[id] || (map[id] = {});
		};

	}

	function Style(style) {

		var custom = {}, sizes = {};

		this.extend = function(styles) {
			for (var property in styles) {
				if (hasOwnProperty(styles, property)) custom[property] = styles[property];
			}
			return this;
		};

		this.get = function(property) {
			return custom[property] != undefined ? custom[property] : style[property];
		};

		this.getSize = function(property, base) {
			return sizes[property] || (sizes[property] = new CSS.Size(this.get(property), base));
		};

		this.isUsable = function() {
			return !!style;
		};

	}

	function addEvent(el, type, listener) {
		if (el.addEventListener) {
			el.addEventListener(type, listener, false);
		}
		else if (el.attachEvent) {
			el.attachEvent('on' + type, function() {
				return listener.call(el, window.event);
			});
		}
	}

	function attach(el, options) {
		var storage = sharedStorage.get(el);
		if (storage.options) return el;
		if (options.hover && options.hoverables[el.nodeName.toLowerCase()]) {
			hoverHandler.attach(el);
		}
		storage.options = options;
		return el;
	}

	function cached(fun) {
		var cache = {};
		return function(key) {
			if (!hasOwnProperty(cache, key)) cache[key] = fun.apply(null, arguments);
			return cache[key];
		};
	}

	function getFont(el, style) {
		var families = CSS.quotedList(style.get('fontFamily').toLowerCase()), family;
		for (var i = 0; family = families[i]; ++i) {
			if (fonts[family]) return fonts[family].get(style.get('fontStyle'), style.get('fontWeight'));
		}
		return null;
	}

	function elementsByTagName(query) {
		return document.getElementsByTagName(query);
	}

	function hasOwnProperty(obj, property) {
		return obj.hasOwnProperty(property);
	}

	function merge() {
		var merged = {}, arg, key;
		for (var i = 0, l = arguments.length; arg = arguments[i], i < l; ++i) {
			for (key in arg) {
				if (hasOwnProperty(arg, key)) merged[key] = arg[key];
			}
		}
		return merged;
	}

	function process(font, text, style, options, node, el) {
		var fragment = document.createDocumentFragment(), processed;
		if (text === '') return fragment;
		var separate = options.separate;
		var parts = text.split(separators[separate]), needsAligning = (separate == 'words');
		if (needsAligning && HAS_BROKEN_REGEXP) {
			// @todo figure out a better way to do this
			if (/^\s/.test(text)) parts.unshift('');
			if (/\s$/.test(text)) parts.push('');
		}
		for (var i = 0, l = parts.length; i < l; ++i) {
			processed = engines[options.engine](font,
				needsAligning ? CSS.textAlign(parts[i], style, i, l) : parts[i],
				style, options, node, el, i < l - 1);
			if (processed) fragment.appendChild(processed);
		}
		return fragment;
	}

	function replaceElement(el, options) {
		var name = el.nodeName.toLowerCase();
		if (options.ignore[name]) return;
		var replace = !options.textless[name];
		var style = CSS.getStyle(attach(el, options)).extend(options);
		var font = getFont(el, style), node, type, next, anchor, text, lastElement;
		if (!font) return;
		for (node = el.firstChild; node; node = next) {
			type = node.nodeType;
			next = node.nextSibling;
			if (replace && type == 3) {
				// Node.normalize() is broken in IE 6, 7, 8
				if (anchor) {
					anchor.appendData(node.data);
					el.removeChild(node);
				}
				else anchor = node;
				if (next) continue;
			}
			if (anchor) {
				el.replaceChild(process(font,
					CSS.whiteSpace(anchor.data, style, anchor, lastElement),
					style, options, node, el), anchor);
				anchor = null;
			}
			if (type == 1) {
				if (node.firstChild) {
					if (node.nodeName.toLowerCase() == 'cufon') {
						engines[options.engine](font, null, style, options, node, el);
					}
					else arguments.callee(node, options);
				}
				lastElement = node;
			}
		}
	}

	var HAS_BROKEN_REGEXP = ' '.split(/\s+/).length == 0;

	var sharedStorage = new Storage();
	var hoverHandler = new HoverHandler();
	var replaceHistory = new ReplaceHistory();
	var initialized = false;

	var engines = {}, fonts = {}, defaultOptions = {
		autoDetect: false,
		engine: null,
		//fontScale: 1,
		//fontScaling: false,
		forceHitArea: false,
		hover: false,
		hoverables: {
			a: true
		},
		ignore: {
			applet: 1,
			canvas: 1,
			col: 1,
			colgroup: 1,
			head: 1,
			iframe: 1,
			map: 1,
			noscript: 1,
			optgroup: 1,
			option: 1,
			script: 1,
			select: 1,
			style: 1,
			textarea: 1,
			title: 1,
			pre: 1
		},
		printable: true,
		//rotation: 0,
		//selectable: false,
		selector: (
				window.Sizzle
			||	(window.jQuery && function(query) { return jQuery(query); }) // avoid noConflict issues
			||	(window.dojo && dojo.query)
			||	(window.glow && glow.dom && glow.dom.get)
			||	(window.Ext && Ext.query)
			||	(window.YAHOO && YAHOO.util && YAHOO.util.Selector && YAHOO.util.Selector.query)
			||	(window.$$ && function(query) { return $$(query); })
			||	(window.$ && function(query) { return $(query); })
			||	(document.querySelectorAll && function(query) { return document.querySelectorAll(query); })
			||	elementsByTagName
		),
		separate: 'words', // 'none' and 'characters' are also accepted
		textless: {
			dl: 1,
			html: 1,
			ol: 1,
			table: 1,
			tbody: 1,
			thead: 1,
			tfoot: 1,
			tr: 1,
			ul: 1
		},
		textShadow: 'none'
	};

	var separators = {
		// The first pattern may cause unicode characters above
		// code point 255 to be removed in Safari 3.0. Luckily enough
		// Safari 3.0 does not include non-breaking spaces in \s, so
		// we can just use a simple alternative pattern.
		words: /\s/.test('\u00a0') ? /[^\S\u00a0]+/ : /\s+/,
		characters: '',
		none: /^/
	};

	api.now = function() {
		DOM.ready();
		return api;
	};

	api.refresh = function() {
		replaceHistory.repeat.apply(replaceHistory, arguments);
		return api;
	};

	api.registerEngine = function(id, engine) {
		if (!engine) return api;
		engines[id] = engine;
		return api.set('engine', id);
	};

	api.registerFont = function(data) {
		if (!data) return api;
		var font = new Font(data), family = font.family;
		if (!fonts[family]) fonts[family] = new FontFamily();
		fonts[family].add(font);
		return api.set('fontFamily', '"' + family + '"');
	};

	api.replace = function(elements, options, ignoreHistory) {
		options = merge(defaultOptions, options);
		if (!options.engine) return api; // there's no browser support so we'll just stop here
		if (!initialized) {
			CSS.addClass(DOM.root(), 'cufon-active cufon-loading');
			CSS.ready(function() {
				// fires before any replace() calls, but it doesn't really matter
				CSS.addClass(CSS.removeClass(DOM.root(), 'cufon-loading'), 'cufon-ready');
			});
			initialized = true;
		}
		if (options.hover) options.forceHitArea = true;
		if (options.autoDetect) delete options.fontFamily;
		if (typeof options.textShadow == 'string') {
			options.textShadow = CSS.textShadow(options.textShadow);
		}
		if (typeof options.color == 'string' && /^-/.test(options.color)) {
			options.textGradient = CSS.gradient(options.color);
		}
		else delete options.textGradient;
		if (!ignoreHistory) replaceHistory.add(elements, arguments);
		if (elements.nodeType || typeof elements == 'string') elements = [ elements ];
		CSS.ready(function() {
			for (var i = 0, l = elements.length; i < l; ++i) {
				var el = elements[i];
				if (typeof el == 'string') api.replace(options.selector(el), options, true);
				else replaceElement(el, options);
			}
		});
		return api;
	};

	api.set = function(option, value) {
		defaultOptions[option] = value;
		return api;
	};

	return api;

})();

Cufon.registerEngine('canvas', (function() {

	// Safari 2 doesn't support .apply() on native methods

	var check = document.createElement('canvas');
	if (!check || !check.getContext || !check.getContext.apply) return;
	check = null;

	var HAS_INLINE_BLOCK = Cufon.CSS.supports('display', 'inline-block');

	// Firefox 2 w/ non-strict doctype (almost standards mode)
	var HAS_BROKEN_LINEHEIGHT = !HAS_INLINE_BLOCK && (document.compatMode == 'BackCompat' || /frameset|transitional/i.test(document.doctype.publicId));

	var styleSheet = document.createElement('style');
	styleSheet.type = 'text/css';
	styleSheet.appendChild(document.createTextNode((
		'cufon{text-indent:0;}' +
		'@media screen,projection{' +
			'cufon{display:inline;display:inline-block;position:relative;vertical-align:middle;' +
			(HAS_BROKEN_LINEHEIGHT
				? ''
				: 'font-size:1px;line-height:1px;') +
			'}cufon cufontext{display:-moz-inline-box;display:inline-block;width:0;height:0;text-indent:-10000in;}' +
			(HAS_INLINE_BLOCK
				? 'cufon canvas{position:relative;}'
				: 'cufon canvas{position:absolute;}') +
		'}' +
		'@media print{' +
			'cufon{padding:0;}' + // Firefox 2
			'cufon canvas{display:none;}' +
		'}'
	).replace(/;/g, '!important;')));
	document.getElementsByTagName('head')[0].appendChild(styleSheet);

	function generateFromVML(path, context) {
		var atX = 0, atY = 0;
		var code = [], re = /([mrvxe])([^a-z]*)/g, match;
		generate: for (var i = 0; match = re.exec(path); ++i) {
			var c = match[2].split(',');
			switch (match[1]) {
				case 'v':
					code[i] = { m: 'bezierCurveTo', a: [ atX + ~~c[0], atY + ~~c[1], atX + ~~c[2], atY + ~~c[3], atX += ~~c[4], atY += ~~c[5] ] };
					break;
				case 'r':
					code[i] = { m: 'lineTo', a: [ atX += ~~c[0], atY += ~~c[1] ] };
					break;
				case 'm':
					code[i] = { m: 'moveTo', a: [ atX = ~~c[0], atY = ~~c[1] ] };
					break;
				case 'x':
					code[i] = { m: 'closePath' };
					break;
				case 'e':
					break generate;
			}
			context[code[i].m].apply(context, code[i].a);
		}
		return code;
	}

	function interpret(code, context) {
		for (var i = 0, l = code.length; i < l; ++i) {
			var line = code[i];
			context[line.m].apply(context, line.a);
		}
	}

	return function(font, text, style, options, node, el) {

		var redraw = (text === null);

		if (redraw) text = node.getAttribute('alt');

		var viewBox = font.viewBox;

		var size = style.getSize('fontSize', font.baseSize);

		var expandTop = 0, expandRight = 0, expandBottom = 0, expandLeft = 0;
		var shadows = options.textShadow, shadowOffsets = [];
		if (shadows) {
			for (var i = shadows.length; i--;) {
				var shadow = shadows[i];
				var x = size.convertFrom(parseFloat(shadow.offX));
				var y = size.convertFrom(parseFloat(shadow.offY));
				shadowOffsets[i] = [ x, y ];
				if (y < expandTop) expandTop = y;
				if (x > expandRight) expandRight = x;
				if (y > expandBottom) expandBottom = y;
				if (x < expandLeft) expandLeft = x;
			}
		}

		var chars = Cufon.CSS.textTransform(text, style).split('');

		var jumps = font.spacing(chars,
			~~size.convertFrom(parseFloat(style.get('letterSpacing')) || 0),
			~~size.convertFrom(parseFloat(style.get('wordSpacing')) || 0)
		);

		if (!jumps.length) return null; // there's nothing to render

		var width = jumps.total;

		expandRight += viewBox.width - jumps[jumps.length - 1];
		expandLeft += viewBox.minX;

		var wrapper, canvas;

		if (redraw) {
			wrapper = node;
			canvas = node.firstChild;
		}
		else {
			wrapper = document.createElement('cufon');
			wrapper.className = 'cufon cufon-canvas';
			wrapper.setAttribute('alt', text);

			canvas = document.createElement('canvas');
			wrapper.appendChild(canvas);

			if (options.printable) {
				var print = document.createElement('cufontext');
				print.appendChild(document.createTextNode(text));
				wrapper.appendChild(print);
			}
		}

		var wStyle = wrapper.style;
		var cStyle = canvas.style;

		var height = size.convert(viewBox.height);
		var roundedHeight = Math.ceil(height);
		var roundingFactor = roundedHeight / height;
		var stretchFactor = roundingFactor * Cufon.CSS.fontStretch(style.get('fontStretch'));
		var stretchedWidth = width * stretchFactor;

		var canvasWidth = Math.ceil(size.convert(stretchedWidth + expandRight - expandLeft));
		var canvasHeight = Math.ceil(size.convert(viewBox.height - expandTop + expandBottom));

		canvas.width = canvasWidth;
		canvas.height = canvasHeight;

		// needed for WebKit and full page zoom
		cStyle.width = canvasWidth + 'px';
		cStyle.height = canvasHeight + 'px';

		// minY has no part in canvas.height
		expandTop += viewBox.minY;

		cStyle.top = Math.round(size.convert(expandTop - font.ascent)) + 'px';
		cStyle.left = Math.round(size.convert(expandLeft)) + 'px';

		var wrapperWidth = Math.max(Math.ceil(size.convert(stretchedWidth)), 0) + 'px';

		if (HAS_INLINE_BLOCK) {
			wStyle.width = wrapperWidth;
			wStyle.height = size.convert(font.height) + 'px';
		}
		else {
			wStyle.paddingLeft = wrapperWidth;
			wStyle.paddingBottom = (size.convert(font.height) - 1) + 'px';
		}

		var g = canvas.getContext('2d'), scale = height / viewBox.height;

		// proper horizontal scaling is performed later
		g.scale(scale, scale * roundingFactor);
		g.translate(-expandLeft, -expandTop);
		g.save();

		function renderText() {
			var glyphs = font.glyphs, glyph, i = -1, j = -1, chr;
			g.scale(stretchFactor, 1);
			while (chr = chars[++i]) {
				var glyph = glyphs[chars[i]] || font.missingGlyph;
				if (!glyph) continue;
				if (glyph.d) {
					g.beginPath();
					if (glyph.code) interpret(glyph.code, g);
					else glyph.code = generateFromVML('m' + glyph.d, g);
					g.fill();
				}
				g.translate(jumps[++j], 0);
			}
			g.restore();
		}

		if (shadows) {
			for (var i = shadows.length; i--;) {
				var shadow = shadows[i];
				g.save();
				g.fillStyle = shadow.color;
				g.translate.apply(g, shadowOffsets[i]);
				renderText();
			}
		}

		var gradient = options.textGradient;
		if (gradient) {
			var stops = gradient.stops, fill = g.createLinearGradient(0, viewBox.minY, 0, viewBox.maxY);
			for (var i = 0, l = stops.length; i < l; ++i) {
				fill.addColorStop.apply(fill, stops[i]);
			}
			g.fillStyle = fill;
		}
		else g.fillStyle = style.get('color');

		renderText();

		return wrapper;

	};

})());

Cufon.registerEngine('vml', (function() {

	var ns = document.namespaces;
	if (!ns) return;
	ns.add('cvml', 'urn:schemas-microsoft-com:vml');
	ns = null;

	var check = document.createElement('cvml:shape');
	check.style.behavior = 'url(#default#VML)';
	if (!check.coordsize) return; // VML isn't supported
	check = null;

	var HAS_BROKEN_LINEHEIGHT = (document.documentMode || 0) < 8;

	document.write(('<style type="text/css">' +
		'cufoncanvas{text-indent:0;}' +
		'@media screen{' +
			'cvml\\:shape,cvml\\:rect,cvml\\:fill,cvml\\:shadow{behavior:url(#default#VML);display:block;antialias:true;position:absolute;}' +
			'cufoncanvas{position:absolute;text-align:left;}' +
			'cufon{display:inline-block;position:relative;vertical-align:' +
			(HAS_BROKEN_LINEHEIGHT
				? 'middle'
				: 'text-bottom') +
			';}' +
			'cufon cufontext{position:absolute;left:-10000in;font-size:1px;}' +
			'a cufon{cursor:pointer}' + // ignore !important here
		'}' +
		'@media print{' +
			'cufon cufoncanvas{display:none;}' +
		'}' +
	'</style>').replace(/;/g, '!important;'));

	function getFontSizeInPixels(el, value) {
		return getSizeInPixels(el, /(?:em|ex|%)$|^[a-z-]+$/i.test(value) ? '1em' : value);
	}

	// Original by Dead Edwards.
	// Combined with getFontSizeInPixels it also works with relative units.
	function getSizeInPixels(el, value) {
		if (!isNaN(value) || /px$/i.test(value)) return parseFloat(value);
		var style = el.style.left, runtimeStyle = el.runtimeStyle.left;
		el.runtimeStyle.left = el.currentStyle.left;
		el.style.left = value.replace('%', 'em');
		var result = el.style.pixelLeft;
		el.style.left = style;
		el.runtimeStyle.left = runtimeStyle;
		return result;
	}

	function getSpacingValue(el, style, size, property) {
		var key = 'computed' + property, value = style[key];
		if (isNaN(value)) {
			value = style.get(property);
			style[key] = value = (value == 'normal') ? 0 : ~~size.convertFrom(getSizeInPixels(el, value));
		}
		return value;
	}

	var fills = {};

	function gradientFill(gradient) {
		var id = gradient.id;
		if (!fills[id]) {
			var stops = gradient.stops, fill = document.createElement('cvml:fill'), colors = [];
			fill.type = 'gradient';
			fill.angle = 180;
			fill.focus = '0';
			fill.method = 'none';
			fill.color = stops[0][1];
			for (var j = 1, k = stops.length - 1; j < k; ++j) {
				colors.push(stops[j][0] * 100 + '% ' + stops[j][1]);
			}
			fill.colors = colors.join(',');
			fill.color2 = stops[k][1];
			fills[id] = fill;
		}
		return fills[id];
	}

	return function(font, text, style, options, node, el, hasNext) {

		var redraw = (text === null);

		if (redraw) text = node.alt;

		var viewBox = font.viewBox;

		var size = style.computedFontSize || (style.computedFontSize = new Cufon.CSS.Size(getFontSizeInPixels(el, style.get('fontSize')) + 'px', font.baseSize));

		var wrapper, canvas;

		if (redraw) {
			wrapper = node;
			canvas = node.firstChild;
		}
		else {
			wrapper = document.createElement('cufon');
			wrapper.className = 'cufon cufon-vml';
			wrapper.alt = text;

			canvas = document.createElement('cufoncanvas');
			wrapper.appendChild(canvas);

			if (options.printable) {
				var print = document.createElement('cufontext');
				print.appendChild(document.createTextNode(text));
				wrapper.appendChild(print);
			}

			// ie6, for some reason, has trouble rendering the last VML element in the document.
			// we can work around this by injecting a dummy element where needed.
			// @todo find a better solution
			if (!hasNext) wrapper.appendChild(document.createElement('cvml:shape'));
		}

		var wStyle = wrapper.style;
		var cStyle = canvas.style;

		var height = size.convert(viewBox.height), roundedHeight = Math.ceil(height);
		var roundingFactor = roundedHeight / height;
		var stretchFactor = roundingFactor * Cufon.CSS.fontStretch(style.get('fontStretch'));
		var minX = viewBox.minX, minY = viewBox.minY;

		cStyle.height = roundedHeight;
		cStyle.top = Math.round(size.convert(minY - font.ascent));
		cStyle.left = Math.round(size.convert(minX));

		wStyle.height = size.convert(font.height) + 'px';

		var color = style.get('color');
		var chars = Cufon.CSS.textTransform(text, style).split('');

		var jumps = font.spacing(chars,
			getSpacingValue(el, style, size, 'letterSpacing'),
			getSpacingValue(el, style, size, 'wordSpacing')
		);

		if (!jumps.length) return null;

		var width = jumps.total;
		var fullWidth = -minX + width + (viewBox.width - jumps[jumps.length - 1]);

		var shapeWidth = size.convert(fullWidth * stretchFactor), roundedShapeWidth = Math.round(shapeWidth);

		var coordSize = fullWidth + ',' + viewBox.height, coordOrigin;
		var stretch = 'r' + coordSize + 'ns';

		var fill = options.textGradient && gradientFill(options.textGradient);

		var glyphs = font.glyphs, offsetX = 0;
		var shadows = options.textShadow;
		var i = -1, j = 0, chr;

		while (chr = chars[++i]) {

			var glyph = glyphs[chars[i]] || font.missingGlyph, shape;
			if (!glyph) continue;

			if (redraw) {
				// some glyphs may be missing so we can't use i
				shape = canvas.childNodes[j];
				while (shape.firstChild) shape.removeChild(shape.firstChild); // shadow, fill
			}
			else {
				shape = document.createElement('cvml:shape');
				canvas.appendChild(shape);
			}

			shape.stroked = 'f';
			shape.coordsize = coordSize;
			shape.coordorigin = coordOrigin = (minX - offsetX) + ',' + minY;
			shape.path = (glyph.d ? 'm' + glyph.d + 'xe' : '') + 'm' + coordOrigin + stretch;
			shape.fillcolor = color;

			if (fill) shape.appendChild(fill.cloneNode(false));

			// it's important to not set top/left or IE8 will grind to a halt
			var sStyle = shape.style;
			sStyle.width = roundedShapeWidth;
			sStyle.height = roundedHeight;

			if (shadows) {
				// due to the limitations of the VML shadow element there
				// can only be two visible shadows. opacity is shared
				// for all shadows.
				var shadow1 = shadows[0], shadow2 = shadows[1];
				var color1 = Cufon.CSS.color(shadow1.color), color2;
				var shadow = document.createElement('cvml:shadow');
				shadow.on = 't';
				shadow.color = color1.color;
				shadow.offset = shadow1.offX + ',' + shadow1.offY;
				if (shadow2) {
					color2 = Cufon.CSS.color(shadow2.color);
					shadow.type = 'double';
					shadow.color2 = color2.color;
					shadow.offset2 = shadow2.offX + ',' + shadow2.offY;
				}
				shadow.opacity = color1.opacity || (color2 && color2.opacity) || 1;
				shape.appendChild(shadow);
			}

			offsetX += jumps[j++];
		}

		// addresses flickering issues on :hover

		var cover = shape.nextSibling, coverFill, vStyle;

		if (options.forceHitArea) {

			if (!cover) {
				cover = document.createElement('cvml:rect');
				cover.stroked = 'f';
				cover.className = 'cufon-vml-cover';
				coverFill = document.createElement('cvml:fill');
				coverFill.opacity = 0;
				cover.appendChild(coverFill);
				canvas.appendChild(cover);
			}

			vStyle = cover.style;

			vStyle.width = roundedShapeWidth;
			vStyle.height = roundedHeight;

		}
		else if (cover) canvas.removeChild(cover);

		wStyle.width = Math.max(Math.ceil(size.convert(width * stretchFactor)), 0);

		if (HAS_BROKEN_LINEHEIGHT) {

			var yAdjust = style.computedYAdjust;

			if (yAdjust === undefined) {
				var lineHeight = style.get('lineHeight');
				if (lineHeight == 'normal') lineHeight = '1em';
				else if (!isNaN(lineHeight)) lineHeight += 'em'; // no unit
				style.computedYAdjust = yAdjust = 0.5 * (getSizeInPixels(el, lineHeight) - parseFloat(wStyle.height));
			}

			if (yAdjust) {
				wStyle.marginTop = Math.ceil(yAdjust) + 'px';
				wStyle.marginBottom = yAdjust + 'px';
			}

		}

		return wrapper;

	};

})());

// ALLER Font
Cufon.registerFont({"w":216,"face":{"font-family":"Aller","font-weight":400,"font-stretch":"normal","units-per-em":"360","panose-1":"2 0 5 3 3 0 0 2 0 4","ascent":"288","descent":"-72","x-height":"4","bbox":"-14 -322.084 360.889 90","underline-thickness":"18","underline-position":"-18","unicode-range":"U+0020-U+2014"},"glyphs":{" ":{"w":85},",":{"d":"28,-40v12,-1,23,-2,36,0r-23,81v-11,0,-24,2,-34,0","w":76},"-":{"d":"112,-117v0,10,2,23,0,32r-94,0v0,-10,-2,-23,0,-32r94,0","w":129},".":{"d":"23,0v0,-13,-2,-28,0,-40v13,-2,27,-2,40,0v3,11,3,29,0,40v-13,0,-28,2,-40,0","w":86},"0":{"d":"18,-116v0,-69,25,-120,91,-120v65,0,90,51,90,120v0,68,-25,120,-91,120v-66,0,-90,-52,-90,-120xm161,-116v0,-50,-12,-88,-53,-88v-41,0,-53,39,-53,88v0,50,11,89,53,89v41,0,53,-40,53,-89"},"1":{"d":"49,-162v-7,-8,-10,-14,-13,-26v35,-14,62,-36,101,-46r0,203r51,0v1,11,2,20,0,31r-140,0v-3,-9,-2,-21,0,-31r54,0r0,-154"},"2":{"d":"27,-221v50,-26,151,-21,146,53v-4,63,-54,95,-86,136r96,0v0,10,2,23,0,32r-160,0r-2,-5r102,-122v22,-29,13,-77,-35,-77v-23,0,-37,7,-52,13v-3,-9,-9,-19,-9,-30"},"3":{"d":"28,-16v42,19,119,17,119,-43v0,-41,-43,-51,-82,-41r-3,-5r60,-95r-92,0v-2,-9,-3,-23,0,-32r145,0r3,4r-66,100v43,-4,70,24,72,65v4,85,-94,105,-167,77v2,-11,6,-21,11,-30"},"4":{"d":"15,-28r-3,-4r105,-207v12,1,23,7,32,12r-84,167r73,0r0,-68v11,-2,23,-2,34,0r0,68r34,0v0,10,2,23,0,32r-34,0r0,49v-11,0,-24,2,-34,0r0,-49r-123,0"},"5":{"d":"79,-136v60,-10,105,17,105,74v0,82,-89,103,-161,78v1,-12,5,-21,10,-30v44,17,113,11,113,-46v0,-50,-57,-57,-98,-42r-4,-3r5,-127r122,0v0,11,2,22,0,32r-90,0"},"6":{"d":"112,4v-110,7,-104,-153,-55,-214v22,-30,56,-48,104,-52v4,11,3,20,1,30v-59,6,-91,45,-101,101v10,-18,31,-35,61,-34v49,2,77,31,77,83v0,54,-34,82,-87,86xm162,-81v0,-34,-16,-54,-49,-54v-32,0,-49,22,-50,55v-1,34,17,53,48,53v33,0,51,-21,51,-54"},"7":{"d":"88,27v-13,-3,-23,-7,-33,-15r92,-212r-122,0v0,-11,-2,-22,0,-32r173,2"},"8":{"d":"185,-197v1,32,-20,49,-42,60v28,13,54,31,54,71v0,49,-38,70,-89,70v-51,0,-89,-21,-89,-70v0,-40,26,-58,53,-71v-22,-11,-42,-29,-41,-60v1,-42,34,-62,77,-62v43,0,75,20,77,62xm108,-26v58,0,66,-72,20,-88v-6,-3,-13,-6,-20,-8v-26,9,-51,20,-51,53v0,28,21,43,51,43xm108,-230v-48,-4,-54,58,-16,73v26,11,58,-7,58,-37v0,-25,-16,-34,-42,-36"},"9":{"d":"106,-235v109,-7,103,153,55,214v-23,29,-55,49,-104,52v-4,-8,-3,-21,-1,-30v58,-7,93,-43,101,-100v-11,17,-32,34,-61,33v-51,0,-77,-32,-77,-82v0,-55,34,-83,87,-87xm57,-149v0,35,16,53,48,53v32,0,51,-21,51,-54v1,-34,-17,-54,-49,-54v-30,1,-50,21,-50,55"},"?":{"d":"162,-189v-2,42,-32,63,-62,75r0,37v-11,0,-24,2,-34,0r0,-58v29,-8,57,-18,58,-54v1,-44,-69,-46,-100,-30v-3,-10,-7,-18,-9,-30v58,-23,151,-10,147,60xm62,0v0,-13,-2,-28,0,-40v11,-3,29,-3,41,0v0,13,2,28,0,40v-13,0,-29,2,-41,0","w":175},"A":{"d":"159,-60r-98,0r-18,60v-12,0,-26,2,-37,0r84,-259v14,0,29,-2,42,0r84,259v-13,0,-27,2,-39,0xm71,-92r78,0r-39,-132","w":222},"B":{"d":"198,-72v1,80,-91,81,-166,72r0,-259v64,-9,153,-9,150,64v-2,29,-18,49,-42,56v34,6,58,25,58,67xm159,-73v0,-47,-43,-49,-91,-48r0,93v45,3,91,1,91,-45xm145,-193v0,-38,-37,-45,-77,-40r0,82v42,2,77,-2,77,-42","w":214},"C":{"d":"61,-128v0,82,66,119,136,90v5,10,9,20,10,30v-19,8,-40,12,-65,12v-81,-1,-118,-52,-121,-132v-4,-104,83,-159,182,-125v0,12,-6,21,-9,30v-69,-27,-133,13,-133,95","w":222},"D":{"d":"231,-129v0,114,-87,147,-199,129r0,-259v110,-19,199,18,199,130xm192,-130v0,-75,-44,-108,-123,-99r0,199v77,11,123,-21,123,-100","w":251},"E":{"d":"32,-259r142,0v0,10,2,23,0,32r-106,0r0,74r85,0v0,10,2,23,0,32r-85,0r0,89r109,0v0,10,2,23,0,32r-145,0r0,-259","w":192},"F":{"d":"32,-259r135,0v0,10,2,23,0,32r-99,0r0,76r83,0v0,11,2,23,0,33r-83,0r0,118v-12,0,-25,2,-36,0r0,-259","w":181},"G":{"d":"60,-128v-2,73,48,114,121,95r0,-101v12,0,26,-2,37,0r0,126v-20,8,-44,13,-73,12v-82,-2,-121,-50,-124,-132v-3,-104,85,-159,184,-125v0,12,-6,21,-9,30v-15,-4,-29,-9,-51,-8v-59,2,-83,43,-85,103","w":245},"H":{"d":"32,-259v12,0,25,-2,36,0r0,107r111,0r0,-107v12,0,25,-2,36,0r0,259v-12,0,-25,2,-36,0r0,-120r-111,0r0,120v-12,0,-25,2,-36,0r0,-259","w":246},"I":{"d":"32,-259v12,0,25,-2,36,0r0,259v-12,0,-25,2,-36,0r0,-259","w":100},"J":{"d":"16,-31v29,8,60,2,60,-33r0,-163r-45,0v-2,-10,-2,-22,0,-32r82,0r0,187v5,63,-44,87,-103,72v1,-12,3,-20,6,-31","w":142},"K":{"d":"79,-131r83,-128v13,0,27,-2,40,0r-82,124r93,135v-14,0,-28,2,-42,0xm32,-259v12,0,25,-2,36,0r0,259v-12,0,-25,2,-36,0r0,-259"},"L":{"d":"32,-259v12,0,25,-2,36,0r0,227r102,0v1,10,2,22,0,32r-138,0r0,-259","w":178},"M":{"d":"39,-259v13,0,29,-2,41,0r67,162r68,-162v13,0,27,-2,39,0r12,259v-12,0,-24,2,-35,0r-9,-201r-63,147v-9,1,-19,2,-28,0r-62,-148r-8,202v-11,0,-23,2,-34,0","w":293},"N":{"d":"32,-259v11,0,23,-2,34,0r112,195r0,-195v12,0,24,-2,35,0r0,259v-11,0,-23,2,-34,0r-113,-193r0,193v-11,0,-24,2,-34,0r0,-259","w":244},"O":{"d":"240,-129v0,79,-31,133,-109,133v-78,0,-109,-56,-109,-133v0,-77,31,-134,109,-134v78,0,109,55,109,134xm61,-129v0,55,15,102,70,102v55,0,71,-47,71,-102v0,-55,-15,-102,-71,-102v-55,0,-70,47,-70,102","w":262},"P":{"d":"190,-180v0,70,-52,92,-122,86r0,94v-12,0,-25,2,-36,0r0,-259v76,-12,158,-4,158,79xm152,-179v0,-46,-37,-57,-84,-51r0,104v45,6,84,-5,84,-53","w":203},"Q":{"d":"243,23v0,13,-3,22,-6,32r-83,-15v0,-15,3,-20,7,-31xm239,-129v0,79,-31,133,-109,133v-78,0,-109,-56,-109,-133v0,-77,31,-134,109,-134v78,0,109,55,109,134xm60,-129v1,57,16,102,70,102v55,0,71,-46,71,-102v0,-56,-16,-102,-71,-102v-55,0,-70,45,-70,102","w":260},"R":{"d":"149,-181v1,-43,-35,-56,-80,-50r0,231v-12,0,-25,2,-37,0r0,-259v83,-16,181,8,151,101v-8,24,-28,39,-50,49r75,109v-12,1,-28,2,-41,0r-83,-121v30,-10,64,-21,65,-60","w":214},"S":{"d":"145,-137v70,41,26,157,-62,141v-27,1,-47,-3,-66,-11v0,-10,5,-23,8,-32v43,20,140,14,112,-51v-21,-48,-114,-28,-114,-103v0,-70,87,-82,145,-60v-1,10,-3,20,-7,30v-34,-17,-120,-14,-96,41v12,27,55,30,80,45","w":196},"T":{"d":"76,-227r-67,0v0,-10,-2,-23,0,-32r171,0v2,10,2,22,0,32r-67,0r0,227v-12,2,-25,1,-37,0r0,-227","w":189},"U":{"d":"121,4v-124,0,-86,-150,-92,-263v12,-1,25,-2,37,0r0,147v1,47,7,83,55,83v48,0,56,-34,55,-83r0,-147v12,-1,26,-2,37,0v-6,114,33,263,-92,263","w":242},"V":{"d":"8,-259v13,0,29,-2,41,0r65,222r65,-222v13,0,28,-2,40,0r-85,259v-14,0,-29,2,-42,0","w":226},"W":{"d":"10,-259v13,0,28,-2,40,0r45,216r53,-216v12,0,27,-2,38,0r54,218r45,-218v12,0,26,-2,37,0r-62,259v-14,0,-30,2,-43,0r-51,-203r-52,203v-14,0,-29,2,-42,0","w":331},"X":{"d":"108,-135r-62,135v-14,2,-24,1,-38,0r64,-135r-54,-123v13,-2,26,-3,39,0xm111,-135r51,-123v12,-2,27,-3,39,0r-54,122r64,136v-15,2,-24,1,-39,0","w":219},"Y":{"d":"89,-95r-83,-164v14,0,29,-2,42,0r60,129r60,-129v13,0,27,-2,39,0r-81,164r0,95v-12,0,-26,2,-37,0r0,-95","w":213},"Z":{"d":"9,-3r130,-224r-114,0v-2,-10,-2,-22,0,-32r168,0r2,3r-130,224r121,0v2,10,2,22,0,32r-175,0","w":203},"a":{"d":"53,-55v0,36,45,34,73,27r0,-59v-34,-5,-73,-3,-73,32xm17,-55v3,-52,53,-68,109,-60v10,-52,-52,-49,-87,-37v-5,-8,-7,-18,-7,-29v56,-17,129,-11,129,61r0,115v-54,14,-148,20,-144,-50","w":186},"b":{"d":"193,-97v0,89,-86,119,-165,91r0,-258v12,0,25,-2,36,0r0,102v9,-15,28,-27,53,-27v54,1,76,36,76,92xm111,-158v-60,-2,-46,72,-47,128v50,14,94,-11,92,-65v-2,-36,-10,-62,-45,-63","w":212},"c":{"d":"55,-92v0,58,48,77,97,60v4,6,7,18,7,28v-71,25,-141,-9,-141,-88v0,-77,68,-114,139,-89v-1,9,-3,21,-6,28v-50,-19,-96,4,-96,61","w":172},"d":{"d":"19,-89v0,-74,55,-112,128,-95r0,-80v12,0,25,-2,36,0r0,259v-73,22,-164,7,-164,-84xm57,-89v-4,55,42,73,90,60r0,-124v-47,-20,-97,9,-90,64","w":210},"e":{"d":"164,-34v3,8,6,18,7,28v-69,27,-160,1,-153,-85v5,-59,28,-98,87,-98v58,0,82,44,76,105r-126,0v-5,60,62,69,109,50xm147,-110v4,-44,-50,-67,-77,-37v-8,9,-12,21,-14,37r91,0","w":200},"f":{"d":"132,-235v-34,-11,-62,7,-55,50r47,0v1,9,2,20,0,28r-47,0r0,157v-12,0,-25,2,-36,0r0,-157r-30,0v-2,-7,-1,-20,0,-28r30,0v-8,-64,37,-93,96,-79v0,12,-3,19,-5,29","w":133},"g":{"d":"54,-41v2,26,47,17,74,17v38,0,61,17,61,50v0,47,-49,64,-100,64v-43,0,-76,-10,-76,-48v0,-22,14,-37,29,-45v-26,-13,-18,-58,5,-70v-15,-10,-26,-27,-26,-51v0,-64,85,-81,127,-48v10,-8,27,-15,46,-14v0,11,2,22,0,32r-32,0v29,57,-27,112,-93,91v-6,4,-15,12,-15,22xm152,28v0,-30,-43,-22,-73,-23v-21,-2,-32,13,-32,30v0,46,105,31,105,-7xm58,-124v0,24,13,39,38,39v25,0,38,-15,38,-39v0,-25,-13,-39,-38,-39v-25,0,-38,14,-38,39","w":199},"h":{"d":"113,-157v-67,0,-46,92,-49,157v-12,0,-25,2,-36,0r0,-264v12,0,25,-2,36,0r0,107v11,-16,28,-32,57,-32v86,0,57,111,62,189v-12,0,-24,2,-35,0v-7,-56,23,-157,-35,-157","w":208},"i":{"d":"40,-157v-18,3,-32,0,-24,-28r59,0r0,185v-12,0,-24,2,-35,0r0,-157xm32,-225v0,-12,-2,-26,0,-37v12,0,27,-2,38,0v0,12,2,25,0,37v-12,0,-27,2,-38,0","w":103},"j":{"d":"-9,36v24,8,50,2,50,-28r0,-165v-18,3,-32,0,-24,-28r59,0r0,195v4,51,-45,65,-90,53v0,-10,2,-20,5,-27xm70,-226v-27,8,-48,1,-38,-35v10,-3,28,-3,38,0v2,12,2,23,0,35","w":104},"k":{"d":"27,-264v12,0,25,-2,36,0r0,264v-12,0,-25,2,-36,0r0,-264xm73,-96r58,-89v13,0,28,-2,40,0r-59,87r69,98v-13,0,-28,2,-40,0","w":185},"l":{"d":"104,0v-41,9,-76,-4,-76,-48r0,-216v12,0,24,-2,35,0r0,208v-2,25,13,34,37,28v2,8,4,18,4,28","w":107},"m":{"d":"108,-158v-62,0,-40,95,-44,158v-12,0,-24,2,-35,0r0,-185v10,0,20,-2,30,0r3,29v12,-39,95,-46,105,0v11,-17,26,-32,54,-33v86,-4,57,111,62,189v-12,0,-25,2,-36,0r0,-107v-1,-29,-5,-50,-32,-50v-61,0,-36,97,-41,157v-12,0,-25,2,-36,0r0,-110v0,-28,-5,-48,-30,-48","w":307},"n":{"d":"114,-157v-66,0,-48,91,-50,157v-12,0,-24,2,-35,0r0,-185v10,0,20,-2,30,0r3,30v11,-18,30,-33,59,-34v86,-4,57,111,62,189v-12,0,-24,2,-35,0r0,-107v-1,-30,-6,-50,-34,-50","w":208},"o":{"d":"190,-92v0,57,-27,96,-86,96v-59,0,-86,-38,-86,-96v0,-59,28,-97,86,-97v57,0,86,40,86,97xm55,-92v0,39,12,68,49,68v36,0,48,-30,48,-68v0,-38,-12,-68,-48,-68v-37,0,-49,30,-49,68","w":207},"p":{"d":"193,-97v0,75,-55,115,-129,97r0,85v-12,0,-25,2,-36,0r0,-270v21,-3,39,-2,34,26v11,-17,29,-30,56,-30v53,0,75,37,75,92xm111,-158v-59,-1,-46,71,-47,128v52,15,95,-11,92,-65v-2,-35,-11,-63,-45,-63","w":212},"q":{"d":"19,-87v0,-88,81,-119,163,-94r0,266v-12,0,-24,2,-35,0r0,-85v-68,15,-128,-13,-128,-87xm56,-86v0,54,44,69,91,56r0,-126v-53,-13,-91,15,-91,70","w":210},"r":{"d":"125,-153v-79,-10,-58,82,-61,153v-12,0,-24,2,-35,0r0,-185v10,0,21,-2,30,0r3,29v11,-18,32,-35,63,-29v2,10,2,21,0,32","w":133},"s":{"d":"144,-75v23,74,-70,93,-127,71v0,-11,6,-20,9,-29v32,20,113,2,76,-39v-30,-18,-80,-18,-80,-64v0,-56,74,-61,120,-44v-1,10,-4,20,-8,28v-25,-17,-102,-8,-67,30v25,17,68,15,77,47","w":163},"t":{"d":"123,-1v-44,11,-87,0,-87,-50r0,-105v-10,-2,-28,5,-30,-5r62,-69r3,0r0,45r47,0v0,10,2,20,0,29r-47,0r0,84v-6,39,16,54,48,43v4,8,3,19,4,28","w":128},"u":{"d":"179,-6v-67,21,-152,16,-152,-76r0,-103v12,0,24,-2,35,0v6,65,-23,165,51,159v12,0,22,-1,31,-4r0,-155v12,0,24,-2,35,0r0,179","w":206},"v":{"d":"6,-185v13,0,28,-2,40,0r50,153r51,-153v13,0,26,-2,38,0r-72,185v-12,0,-24,2,-35,0","w":191},"w":{"d":"8,-185v13,0,26,-2,38,0r36,151r41,-151v12,0,25,-2,36,0r41,149r36,-149v12,0,24,-2,35,0r-55,185v-12,0,-25,2,-36,0r-40,-140r-41,140v-12,0,-26,2,-37,0","w":279},"x":{"d":"57,-96r-44,-89v13,0,26,-2,39,0r38,90r-46,95v-13,0,-26,2,-38,0xm93,-95r38,-90v13,0,26,-2,39,0r-43,88r50,97v-13,0,-25,2,-38,0","w":183},"y":{"d":"31,58v23,8,48,0,50,-23r11,-35v-8,0,-19,2,-26,0r-61,-185v13,0,27,-2,39,0r51,172r53,-172v12,0,25,-2,37,0r-82,247v-11,26,-47,34,-78,23v0,-13,2,-19,6,-27","w":190},"z":{"d":"10,-5r98,-151r-86,0v-1,-8,-2,-21,0,-29r139,0r1,5r-98,152r92,0v2,9,1,19,0,28r-144,0","w":171},"\u00a7":{"d":"170,-49v-3,61,-93,61,-145,44v2,-11,5,-20,9,-28v29,19,128,12,91,-31v-36,-20,-101,-15,-101,-66v0,-19,11,-33,20,-44v-32,-40,8,-84,65,-84v24,0,39,3,57,9v1,11,-4,21,-8,28v-26,-18,-116,-10,-82,31v32,18,104,18,102,64v0,20,-10,35,-20,46v8,8,12,16,12,31xm69,-160v-16,12,-17,47,11,49r52,17v16,-11,19,-47,-9,-49v-17,-7,-38,-10,-54,-17","w":202},"\u00c1":{"d":"120,-280v-13,0,-27,2,-39,0v20,-21,38,-52,87,-39xm159,-60r-98,0r-18,60v-12,0,-26,2,-37,0r84,-259v14,0,29,-2,42,0r84,259v-13,0,-27,2,-39,0xm71,-92r78,0r-39,-132","w":222},"\u00c9":{"d":"108,-280v-13,0,-27,2,-39,0v21,-20,38,-52,88,-39xm32,-259r142,0v0,10,2,23,0,32r-106,0r0,74r85,0v0,10,2,23,0,32r-85,0r0,89r109,0v0,10,2,23,0,32r-145,0r0,-259","w":192},"\u00cd":{"d":"61,-280v-13,0,-26,2,-38,0v20,-21,38,-52,87,-39xm32,-259v12,0,25,-2,36,0r0,259v-12,0,-25,2,-36,0r0,-259","w":100},"\u00da":{"d":"135,-280v-13,0,-27,2,-39,0v20,-21,38,-52,88,-39xm121,4v-124,0,-86,-150,-92,-263v12,-1,25,-2,37,0r0,147v1,47,7,83,55,83v48,0,56,-34,55,-83r0,-147v12,-1,26,-2,37,0v-6,114,33,263,-92,263","w":242},"\u00e1":{"d":"93,-214v-12,2,-24,2,-36,0r42,-46v15,0,32,-2,45,0xm53,-55v0,36,45,34,73,27r0,-59v-34,-5,-73,-3,-73,32xm17,-55v3,-52,53,-68,109,-60v10,-52,-52,-49,-87,-37v-5,-8,-7,-18,-7,-29v56,-17,129,-11,129,61r0,115v-54,14,-148,20,-144,-50","w":186},"\u00e4":{"d":"39,-217v0,-12,-2,-25,0,-36v10,-3,27,-3,37,0v0,12,2,25,0,36v-13,2,-24,0,-37,0xm113,-217v-3,-12,-2,-24,0,-36v9,-3,26,-3,36,0v2,12,1,24,0,36v-12,2,-23,0,-36,0xm53,-55v0,36,45,34,73,27r0,-59v-34,-5,-73,-3,-73,32xm17,-55v3,-52,53,-68,109,-60v10,-52,-52,-49,-87,-37v-5,-8,-7,-18,-7,-29v56,-17,129,-11,129,61r0,115v-54,14,-148,20,-144,-50","w":186},"\u00e9":{"d":"108,-214v-12,2,-24,2,-35,0r41,-46v15,0,32,-2,45,0xm164,-34v3,8,6,18,7,28v-69,27,-160,1,-153,-85v5,-59,28,-98,87,-98v58,0,82,44,76,105r-126,0v-5,60,62,69,109,50xm147,-110v4,-44,-50,-67,-77,-37v-8,9,-12,21,-14,37r91,0","w":200},"\u00ed":{"d":"40,-157v-18,3,-32,0,-24,-28r59,0r0,185v-12,0,-24,2,-35,0r0,-157xm54,-214v-12,2,-24,2,-36,0r41,-46v15,0,32,-2,46,0","w":103},"\u00f4":{"d":"163,-214v-11,2,-24,2,-36,0r-24,-29v-12,18,-27,39,-60,29r39,-46v14,0,31,-3,43,1xm190,-92v0,57,-27,96,-86,96v-59,0,-86,-38,-86,-96v0,-59,28,-97,86,-97v57,0,86,40,86,97xm55,-92v0,39,12,68,49,68v36,0,48,-30,48,-68v0,-38,-12,-68,-48,-68v-37,0,-49,30,-49,68","w":207},"\u00fa":{"d":"113,-214v-12,2,-24,2,-36,0r41,-46v15,0,32,-2,46,0xm179,-6v-67,21,-152,16,-152,-76r0,-103v12,0,24,-2,35,0v6,65,-23,165,51,159v12,0,22,-1,31,-4r0,-155v12,0,24,-2,35,0r0,179","w":206},"\u00fd":{"d":"99,-214v-12,2,-24,2,-36,0r42,-46v15,0,32,-2,45,0xm31,58v23,8,48,0,50,-23r11,-35v-8,0,-19,2,-26,0r-61,-185v13,0,27,-2,39,0r51,172r53,-172v12,0,25,-2,37,0r-82,247v-11,26,-47,34,-78,23v0,-13,2,-19,6,-27","w":189},"\u010c":{"d":"76,-319v31,-7,50,6,63,22v13,-15,31,-31,63,-22r-42,39v-14,0,-29,2,-42,0xm61,-128v0,82,66,119,136,90v5,10,9,20,10,30v-19,8,-40,12,-65,12v-81,-1,-118,-52,-121,-132v-4,-104,83,-159,182,-125v0,12,-6,21,-9,30v-69,-27,-133,13,-133,95","w":222},"\u010d":{"d":"46,-259v12,-2,25,-2,37,0r24,29v12,-18,26,-39,60,-29r-40,46v-14,1,-29,1,-42,-1xm55,-92v0,58,48,77,97,60v4,6,7,18,7,28v-71,25,-141,-9,-141,-88v0,-77,68,-114,139,-89v-1,9,-3,21,-6,28v-50,-19,-96,4,-96,61","w":172},"\u010e":{"d":"44,-319v31,-8,50,6,63,22v13,-15,31,-31,63,-22r-42,39v-14,0,-29,2,-42,0xm231,-129v0,114,-87,147,-199,129r0,-259v110,-19,199,18,199,130xm192,-130v0,-75,-44,-108,-123,-99r0,199v77,11,123,-21,123,-100","w":251},"\u010f":{"d":"212,-263v9,-3,24,-2,34,0r-5,73v-10,0,-20,2,-29,0r0,-73xm19,-89v0,-74,55,-112,128,-95r0,-80v12,0,25,-2,36,0r0,259v-73,22,-164,7,-164,-84xm57,-89v-4,55,42,73,90,60r0,-124v-47,-20,-97,9,-90,64","w":240},"\u013d":{"d":"100,-259v9,-3,24,-2,34,0r-5,73v-10,0,-20,2,-29,0r0,-73xm32,-259v12,0,25,-2,36,0r0,227r102,0v1,10,2,22,0,32r-138,0r0,-259","w":174},"\u013e":{"d":"96,-264v11,0,24,-2,34,0r-5,73v-10,2,-19,2,-29,0r0,-73xm104,0v-41,9,-76,-4,-76,-48r0,-216v12,0,24,-2,35,0r0,208v-2,25,13,34,37,28v2,8,4,18,4,28","w":127},"\u0147":{"d":"60,-319v31,-7,52,6,63,22v13,-15,31,-31,63,-22r-42,39v-14,0,-29,2,-42,0xm32,-259v11,0,23,-2,34,0r112,195r0,-195v12,0,24,-2,35,0r0,259v-11,0,-23,2,-34,0r-113,-193r0,193v-11,0,-24,2,-34,0r0,-259","w":244},"\u0148":{"d":"47,-259v12,-2,25,-2,37,0r23,29v12,-18,27,-39,60,-29r-39,46v-14,1,-29,1,-42,-1xm114,-157v-66,0,-48,91,-50,157v-12,0,-24,2,-35,0r0,-185v10,0,20,-2,30,0r3,30v11,-18,30,-33,59,-34v86,-4,57,111,62,189v-12,0,-24,2,-35,0r0,-107v-1,-30,-6,-50,-34,-50","w":208},"\u0160":{"d":"41,-319v30,-8,51,6,62,22v13,-15,32,-31,64,-22r-43,39v-14,0,-29,2,-42,0xm145,-137v70,41,26,157,-62,141v-27,1,-47,-3,-66,-11v0,-10,5,-23,8,-32v43,20,140,14,112,-51v-21,-48,-114,-28,-114,-103v0,-70,87,-82,145,-60v-1,10,-3,20,-7,30v-34,-17,-120,-14,-96,41v12,27,55,30,80,45","w":196},"\u0161":{"d":"27,-259v11,-2,24,-2,36,0r24,29v12,-18,27,-39,60,-29r-39,46v-14,1,-29,1,-42,-1xm144,-75v23,74,-70,93,-127,71v0,-11,6,-20,9,-29v32,20,113,2,76,-39v-30,-18,-80,-18,-80,-64v0,-56,74,-61,120,-44v-1,10,-4,20,-8,28v-25,-17,-102,-8,-67,30v25,17,68,15,77,47","w":163},"\u0164":{"d":"32,-319v31,-7,52,6,63,22v13,-15,31,-31,63,-22r-42,39v-14,0,-29,2,-42,0xm76,-227r-67,0v0,-10,-2,-23,0,-32r171,0v2,10,2,22,0,32r-67,0r0,227v-12,2,-25,1,-37,0r0,-227","w":189},"\u0165":{"d":"102,-264v12,0,24,-2,35,0r-6,58v-10,2,-19,2,-29,0r0,-58xm123,-1v-44,11,-87,0,-87,-50r0,-105v-10,-2,-28,5,-30,-5r62,-69r3,0r0,45r47,0v0,10,2,20,0,29r-47,0r0,84v-6,39,16,54,48,43v4,8,3,19,4,28","w":128},"\u017d":{"d":"50,-319v31,-7,52,6,63,22v13,-15,31,-31,63,-22r-42,39v-14,0,-29,2,-42,0xm10,-3r130,-224r-114,0v-2,-10,-2,-22,0,-32r168,0r2,3r-130,224r121,0v2,10,2,22,0,32r-175,0","w":205},"\u017e":{"d":"34,-259v12,-2,25,-2,37,0r23,29v12,-18,27,-39,60,-29r-39,46v-14,1,-29,1,-42,-1xm10,-5r98,-151r-86,0v-1,-8,-2,-21,0,-29r139,0r1,5r-98,152r92,0v2,9,1,19,0,28r-144,0","w":171},"\u2014":{"d":"360,-117v0,10,2,23,0,32r-360,0v0,-11,-2,-22,0,-32r360,0","w":360},"!":{"d":"33,-259v13,0,27,-2,39,0r-2,181v-11,2,-23,3,-34,0xm32,0v0,-13,-2,-28,0,-40v13,-2,27,-2,40,0v2,13,2,27,0,40v-13,0,-28,2,-40,0","w":104},"\u00a0":{"w":85}}});

