jQuery.noConflict();

jQuery(document).ready(function(){

	k_menu(); // controls the dropdown menu
	k_pixelperfect();
	
	Cufon.replace('h1, h2, h3, .cufonme');
	jQuery("#feature_panel").tabs({ fx:{opacity: "toggle"}}).tabs("rotate", 8000, true);


		// accordion slider
	jQuery("#featured").not('.fadeslider, .newsslider').kricordion({
			slides: '.featured',		// wich element inside the container should serve as slide
			animationSpeed: 900,		// animation duration in milliseconds
			autorotation: true,			// autorotation true or false?
			autorotationSpeed:5,		// duration between autorotation switch in Seconds
			event: 'mouseover',			// event to focus a slide: mouseover or click
			imageShadow:true,			// should the image get a drop shadow to the left
			imageShadowStrength:0.5		// how dark should that shadow be, recommended values: between 0.3 and 0.8, allowed between 0 and 1
	});


});

// -------------------------------------------------------------------------------------------
// input field improvements
// -------------------------------------------------------------------------------------------

(function($)
{
	$.fn.kriesi_empty_input = function(options) 
	{
		return this.each(function()
		{
			var currentField = $(this);
			currentField.methods = 
			{
				startingValue:  currentField.val(),
				
				resetValue: function()
				{	
					var currentValue = currentField.val();
					if(currentField.methods.startingValue == currentValue) currentField.val('');
				},
				
				restoreValue: function()
				{	
					var currentValue = currentField.val();
					if(currentValue == '') currentField.val(currentField.methods.startingValue);
				}
			};
			
			currentField.bind('focus',currentField.methods.resetValue);
			currentField.bind('blur',currentField.methods.restoreValue);
		});
	}
})(jQuery);	

// -------------------------------------------------------------------------------------------
// The Image preloader
// -------------------------------------------------------------------------------------------


(function($)
{
	$.fn.kriesi_image_preloader = function(options) 
	{
		var defaults = 
		{
			repeatedCheck: 500,
			fadeInSpeed: 1000,
			delay:600,
			callback: ''
		};
		
		var options = $.extend(defaults, options);
		
		return this.each(function()
		{
			var imageContainer = jQuery(this),
				images = imageContainer.find('img').css({opacity:0, visibility:'hidden'}),
				imagesToLoad = images.length;				
				
				imageContainer.operations =
				{	
					preload: function()
					{	
						var stopPreloading = true;
						
						images.each(function(i, event)
						{	
							var image = $(this);
							
							
							if(event.complete == true)
							{	
								imageContainer.operations.showImage(image);
							}
							else
							{
								image.bind('error load',{currentImage: image}, imageContainer.operations.showImage);
							}
							
						});
						
						return this;
					},
					
					showImage: function(image)
					{	
						imagesToLoad --;
						if(image.data.currentImage != undefined) { image = image.data.currentImage;}
												
						if (options.delay <= 0) image.css('visibility','visible').animate({opacity:1}, options.fadeInSpeed);
												 
						if(imagesToLoad == 0)
						{
							if(options.delay > 0)
							{
								images.each(function(i, event)
								{	
									var image = $(this);
									setTimeout(function()
									{	
										image.css('visibility','visible').animate({opacity:1}, options.fadeInSpeed);
									},
									options.delay*(i+1));
								});
								
								if(options.callback != '')
								{
									setTimeout(options.callback, options.delay*images.length);
								}
							}
							else if(options.callback != '')
							{
								(options.callback)();
							}
							
						}
						
					}

				};
				
				imageContainer.operations.preload();
		});
		
	}
})(jQuery);
// -------------------------------------------------------------------------------------------
// The Main accordion slider - KRICORDION

// Dependencies: equalheight function, kriesi_image_preoloader. jquery easing
//
// -------------------------------------------------------------------------------------------
(function($)
{
	$.fn.kricordion = function(options) 
	{
		var defaults = 
		{
			slides: '>div',				// wich element inside the container should serve as slide
			animationSpeed: 900,		// animation duration
			autorotation: true,			// autorotation true or false?
			autorotationSpeed:3,		// duration between autorotation switch in Seconds
			easing: 'easeOutQuint',		// animation easing, more options at the bottom of this file
			event: 'mouseover',			// event to focus a slide: mouseover or click
			imageShadow:true,			// should the image get a drop shadow to the left
			imageShadowStrength:0.5,	// how dark should that shadow be, recommended values: between 0.3 and 0.8, allowed between 0 and 1
			fontOpacity: 1,				// opacity for font, if set to 1 it will be stronger but most browsers got a small rendering glitch at 1
			backgroundOpacity:0.8		// opacity for background
			
		};
		
		// merge default values with the values that were passed with the function call
		var options = $.extend(defaults, options);
		
		return this.each(function()
		{	
			// save some jQuery selections into variables, also calculate base values for each slide
			var slideWrapper 	= $(this),								// element that holds the slides
				slides			= slideWrapper.find(options.slides).css('display','block'),	// the slides
				slide_count 	= slides.length,						// number of slides
				slide_width		= slideWrapper.width() / slide_count	// width of the slides
				expand_slide 	= slides.width(),						// size of a slide when expanded, defined in css, class ".featured" by default
				minimized_slide	= (slideWrapper.width() - expand_slide) / (slide_count - 1), // remaining width is shared among the non-active slides
				overlay_modifier = 200 *(1- options.imageShadowStrength),					//increases the size of the minimized image div to avoid flickering
				excerptWrapper = slideWrapper.find('.feature_excerpt'),
				interval = '',
				current_slide = 0;
			
				
			//modify excerptWrapper and re-select it, also add positioning span -------------------------
			excerptWrapper.wrap('<span class="feature_excerpt"></span>').removeClass('feature_excerpt').addClass('position_excerpt');
			excerptWrapper = slideWrapper.find('.feature_excerpt').css('opacity',options.backgroundOpacity);
			// -------------------------------------------------------------------------------------------
			
				
			//equal heights for all excerpt containers, then hide basic excerpt content -----------------
			excerptWrapper.equalHeights().find('.position_excerpt').css({display:'block', opacity:0, position:'absolute'});
			var excerptWrapperHeight = excerptWrapper.height();
			// -------------------------------------------------------------------------------------------
			
						
			
			//iterate each slide and set new base values, also set positions for acitve and inactive states and event handlers
			slides.each(function(i)
			{
				var this_slide = $(this),											// current slide element
					this_slide_a = this_slide.find('a'),							// a tag inside the element
					real_excerpt = this_slide.find('.position_excerpt'),			// wrapper to center the excerpt content verticaly
					real_excerpt_height = real_excerpt.height(),					// height of the excerpt content
					slide_heading =this_slide.find('.sliderheading'),  				// slide heading
					cloned_heading =   slide_heading.clone().appendTo(this_slide_a) // clone heading for heading only view
													.addClass('heading_clone')
													.css({opacity:options.fontOpacity, width:slide_width-30}),
					clone_height = cloned_heading.height();							// height of clone heading, needed to center verticaly as well
					
					
					this_slide.css('backgroundPosition',parseInt(slide_width/2-8) + 'px ' + parseInt((this_slide.height()- real_excerpt_height)/2 -8) + 'px');						
					
					cloned_heading.css({bottom: (excerptWrapperHeight-clone_height)/2 +9});			//center clone heading
					real_excerpt.css({bottom: (excerptWrapperHeight-real_excerpt_height)/2 +9});	//center real excerpt
												
					this_slide.data( //save data of each slide via jquerys data method
					'data',
					{
						this_slides_position: i * slide_width,							// position if no item is active
						pos_active_higher: i * minimized_slide,							// position of the item if a higher item is active
						pos_active_lower: ((i-1) * minimized_slide) + expand_slide		// position of the item if a lower item is active
					});
					
				//set base properties	
				this_slide.css({zIndex:i+1, left: i * slide_width, width:slide_width + overlay_modifier});
								
				
				//apply the fading div if option is set to do so
				if(options.imageShadow)
				{
					this_slide.find('>a').prepend('<span class="fadeout ie6fix"></span>');
				}
								
			});
			
			// calls the preloader, kriesi_image_preloader plugin needed
			jQuery('#featured').kriesi_image_preloader({callback:add_functionality});
			
			function add_functionality()
			{
				
				//set autorotation ---------------------------------------------------------------------------
				
				
				if(options.autorotation)
				{
					interval = setInterval(function() { autorotation(); }, (parseInt(options.autorotationSpeed) * 1000));
				}
				
				slides.each(function(i)
				{	
					var this_slide = $(this), 
						real_excerpt = this_slide.find('.position_excerpt'), 
						cloned_heading = this_slide.find('.heading_clone');
						
					//set mouseover or click event
					this_slide.bind(options.event, function(event, continue_autoslide)
					{	
						//stop autoslide on userinteraction
						if(!continue_autoslide)
						{
							clearInterval(interval)
						}
						
						var objData = this_slide.data( 'data' );
						//on mouseover expand current slide to full size and fadeIn real content
						real_excerpt.stop().animate({opacity:options.fontOpacity},options.animationSpeed, options.easing);
						cloned_heading.stop().animate({opacity:0},options.animationSpeed, options.easing);
						
						this_slide.stop().animate({	width: expand_slide + (overlay_modifier * 1.2), 
													left: objData.pos_active_higher},
													options.animationSpeed, options.easing);
											
						//set and all other slides to small size
						slides.each(function(j){
						
							if (i !== j)
							{	
								var this_slide = $(this),
									real_excerpt = this_slide.find('.position_excerpt'),
									cloned_heading = this_slide.find('.heading_clone'),
									objData = this_slide.data( 'data' ),
									new_pos = objData.pos_active_higher;
									
								if(i < j) { new_pos = objData.pos_active_lower; }
								this_slide.stop().animate({left: new_pos, width:minimized_slide + overlay_modifier},options.animationSpeed, options.easing);
								real_excerpt.stop().animate({opacity:0},options.animationSpeed, options.easing);
								cloned_heading.stop().animate({opacity:options.fontOpacity},options.animationSpeed, options.easing);
							}
						
						});
						
					});
				});
				
				
				//set mouseout event: expand all slides to no-slide-active position and width
				slideWrapper.bind('mouseleave', function()
				{
					slides.each(function(i)
					{
						var this_slide = $(this),
							real_excerpt = this_slide.find('.position_excerpt'),
							cloned_heading = this_slide.find('.heading_clone'),
							objData = this_slide.data( 'data' ),
							new_pos = objData.this_slides_position;
							
							this_slide.stop().animate({left: new_pos, width:slide_width + overlay_modifier},options.animationSpeed, options.easing);
							real_excerpt.stop().animate({opacity:0},options.animationSpeed, options.easing);
							cloned_heading.stop().animate({opacity:options.fontOpacity},options.animationSpeed, options.easing);
					});
					
				});
			}
			
			
			// autorotation function for the image slider
			function autorotation()
			{	
				if(slide_count  == current_slide)
				{
					slideWrapper.trigger('mouseleave');
					current_slide = 0;
				}
				else
				{
					slides.filter(':eq('+current_slide+')').trigger(options.event,[true]);
					current_slide ++;
				}
			}
		});
	};
})(jQuery);
// -------------------------------------------------------------------------------------------
// END KRICORDION
// -------------------------------------------------------------------------------------------



function k_menu()
{
	// k_menu controlls the dropdown menus and improves them with javascript
	
	jQuery(".nav a, .catnav a").removeAttr('title');
	jQuery(" .nav ul, .catnav ul ").css({display: "none"}); // Opera Fix
	
	
	// remove the last border from category menu item if there are 7 items, that border is not needed
	if(jQuery(".catnav>li").length >= 7)
	{
		jQuery(".catnav>li:last").addClass('noborder');
	}
	
	
	//set equal height for all category main items, in case a description is too long
	var mainitem = jQuery(".catnav>li>a");
	mainitem.each(function()
	{
		if(jQuery(this).height() < 34)
		{
			jQuery(this).css({height:"34px"});
		}
	});
	mainitem.equalHeights();
	
	
	
	//smooth drop downs
	jQuery(".nav li, .catnav li").each(function()
	{	
		
		var $sublist = jQuery(this).find('ul:first');
		
		jQuery(this).hover(function()
		{	
			$sublist.stop().css({overflow:"hidden", height:"auto", display:"none"}).slideDown(400, function()
			{
				jQuery(this).css({overflow:"visible", height:"auto"});
			});	
		},
		function()
		{	
			$sublist.stop().slideUp(400, function()
			{	
				jQuery(this).css({overflow:"hidden", display:"none"});
			});
		});	
	});
}


//equalHeights by james padolsey
jQuery.fn.equalHeights = function() {
    return this.height(Math.max.apply(null,
        this.map(function() {
           return jQuery(this).height()
        }).get()
    ));
};


function k_pixelperfect()
{	
	// sometimes some elements are offset by one or two pixels. 
	// this isnt anything bad but i really like pixel perfection, therefore this function adds some css rules for specific browsers :)
	if((jQuery.browser.msie && jQuery.browser.version < 7 ) || jQuery.browser.opera)
	{	
		jQuery('#headextras #searchsubmit').css({top:"10px"});
	}
	
	//same size for sidebars:
	jQuery('.sidebar').equalHeights();
}



function my_lightbox($elements)
{	
	var usedCSS = 1;
	jQuery('link').each(function()
	{	
		styleURL = jQuery(this).attr('href'); 
		CSSnumber = styleURL.match(/style(\d).css/);
		if(CSSnumber && CSSnumber.length > 0)
		{
			usedCSS = CSSnumber[1];
		}
	});
		
	
	var theme_selected = 'light_rounded';
	if (usedCSS == 2 || usedCSS == 4)
	{
		theme_selected = 'dark_rounded';
	}
	
}


(function($)
{
	$.fn.kriesi_ajax_form = function(options) 
	{
		var defaults = 
		{
			sendPath: 'send.php',
			responseContainer: '.ajaxresponse'
		};
		
		var options = $.extend(defaults, options);
		
		return this.each(function()
		{
			var form = $(this),
				send = 
				{
					formElements: form.find('textarea, select, input:text, input[type=hidden]'),
					validationError:false,
					button : form.find('input:submit'),
					datastring : ''
				};
			
			send.button.bind('click', checkElements);
			
			function send_ajax_form()
			{
				send.button.fadeOut(300);	
									
				$.ajax({
					type: "POST",
					url: options.sendPath,
					data:send.datastring,
					success: function(response)
					{	
						
						var message =  $("<div'></div>").addClass(options.responseContainer)
														.css('display','none')
														.insertBefore(form)
														.html(response); 
														
						form.slideUp(400, function(){message.slideDown(400), send.formElements.val('');});
						
					}
				});
				
			}
			
			function checkElements()
			{	
				// reset validation var and send data
				send.validationError = false;
				send.datastring = 'ajax=true';
				
				send.formElements.each(function(i)
				{
					var currentElement = $(this),
						surroundingElement = currentElement.parent(),
						value = currentElement.val(),
						name = currentElement.attr('name'),
					 	classes = currentElement.attr('class'),
					 	nomatch = true;
					 	
					 	send.datastring  += "&" + name + "=" + value;
					 	
					 	if(classes.match(/is_empty/))
						{
							if(value == '')
							{
								surroundingElement.attr("class","").addClass("error");
								send.validationError = true;
							}
							else
							{
								surroundingElement.attr("class","").addClass("valid");
							}
							nomatch = false;
						}
						
						if(classes.match(/is_email/))
						{
							if(!value.match(/^\w[\w|\.|\-]+@\w[\w|\.|\-]+\.[a-zA-Z]{2,4}$/))
							{
								surroundingElement.attr("class","").addClass("error");
								send.validationError = true;
							}
							else
							{
								surroundingElement.attr("class","").addClass("valid");
							}	
							nomatch = false;
						}
						
						if(nomatch && value != '')
						{
							surroundingElement.attr("class","").addClass("valid");
						}
				});
				
				if(send.validationError == false)
				{
					send_ajax_form();
				}
				return false;
			}
		});
	}
})(jQuery);






/*
 * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
*/

// t: current time, b: begInnIng value, c: change In value, d: duration
jQuery.easing['jswing'] = jQuery.easing['swing'];

jQuery.extend( jQuery.easing,
{
	def: 'easeOutQuad',
	swing: function (x, t, b, c, d) {
		//alert(jQuery.easing.default);
		return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
	},
	easeInQuad: function (x, t, b, c, d) {
		return c*(t/=d)*t + b;
	},
	easeOutQuad: function (x, t, b, c, d) {
		return -c *(t/=d)*(t-2) + b;
	},
	easeInOutQuad: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t + b;
		return -c/2 * ((--t)*(t-2) - 1) + b;
	},
	easeInCubic: function (x, t, b, c, d) {
		return c*(t/=d)*t*t + b;
	},
	easeOutCubic: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t + 1) + b;
	},
	easeInOutCubic: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t + b;
		return c/2*((t-=2)*t*t + 2) + b;
	},
	easeInQuart: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t + b;
	},
	easeOutQuart: function (x, t, b, c, d) {
		return -c * ((t=t/d-1)*t*t*t - 1) + b;
	},
	easeInOutQuart: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
		return -c/2 * ((t-=2)*t*t*t - 2) + b;
	},
	easeInQuint: function (x, t, b, c, d) {
		return c*(t/=d)*t*t*t*t + b;
	},
	easeOutQuint: function (x, t, b, c, d) {
		return c*((t=t/d-1)*t*t*t*t + 1) + b;
	},
	easeInOutQuint: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
		return c/2*((t-=2)*t*t*t*t + 2) + b;
	},
	easeInSine: function (x, t, b, c, d) {
		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
	},
	easeOutSine: function (x, t, b, c, d) {
		return c * Math.sin(t/d * (Math.PI/2)) + b;
	},
	easeInOutSine: function (x, t, b, c, d) {
		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
	},
	easeInExpo: function (x, t, b, c, d) {
		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
	},
	easeOutExpo: function (x, t, b, c, d) {
		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
	},
	easeInOutExpo: function (x, t, b, c, d) {
		if (t==0) return b;
		if (t==d) return b+c;
		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
	},
	easeInCirc: function (x, t, b, c, d) {
		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
	},
	easeOutCirc: function (x, t, b, c, d) {
		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
	},
	easeInOutCirc: function (x, t, b, c, d) {
		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
	},
	easeInElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
	},
	easeOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
	},
	easeInOutElastic: function (x, t, b, c, d) {
		var s=1.70158;var p=0;var a=c;
		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
		if (a < Math.abs(c)) { a=c; var s=p/4; }
		else var s = p/(2*Math.PI) * Math.asin (c/a);
		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
	},
	easeInBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*(t/=d)*t*((s+1)*t - s) + b;
	},
	easeOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158;
		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
	},
	easeInOutBack: function (x, t, b, c, d, s) {
		if (s == undefined) s = 1.70158; 
		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
	},
	easeInBounce: function (x, t, b, c, d) {
		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
	},
	easeOutBounce: function (x, t, b, c, d) {
		if ((t/=d) < (1/2.75)) {
			return c*(7.5625*t*t) + b;
		} else if (t < (2/2.75)) {
			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
		} else if (t < (2.5/2.75)) {
			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
		} else {
			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
		}
	},
	easeInOutBounce: function (x, t, b, c, d) {
		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
	}
});

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;
 
	};
 
})());

/*!
 * The following copyright notice may not be removed under any circumstances.
 * 
 * Manufacturer:
 * Dalton Maag Ltd.
 */
Cufon.registerFont({"w":180,"face":{"font-family":"aller","font-weight":400,"font-stretch":"normal","units-per-em":"300","panose-1":"2 0 5 3 3 0 0 2 0 4","ascent":"240","descent":"-60","x-height":"4","bbox":"-12 -245.155 300.889 75","underline-thickness":"15","underline-position":"-15","unicode-range":"U+0020-U+2122"},"glyphs":{" ":{"w":71},"%":{"d":"70,-110v21,0,28,-19,28,-42v0,-24,-5,-42,-28,-42v-22,0,-29,18,-29,42v1,24,6,42,29,42xm70,-88v-38,0,-57,-26,-57,-64v0,-38,18,-64,57,-64v38,0,56,25,56,64v0,39,-19,64,-56,64xm244,-18v21,0,28,-19,28,-42v0,-24,-5,-42,-28,-42v-22,0,-29,18,-29,42v1,24,6,42,29,42xm244,3v-39,0,-57,-26,-57,-63v0,-38,18,-64,57,-64v38,0,56,25,56,64v0,38,-18,63,-56,63xm215,-212v10,-2,21,-2,31,0r-145,212v-10,1,-21,2,-31,0","w":315},"&":{"d":"121,-191v-26,-8,-65,-7,-65,25v0,42,62,25,101,28v11,-12,16,-30,30,-38r0,38r39,0v0,8,2,17,0,24r-39,0v8,77,-19,120,-89,118v-46,-2,-81,-19,-81,-65v0,-31,17,-51,39,-61v-17,-8,-31,-20,-31,-45v-2,-51,59,-60,102,-46v0,9,-3,16,-6,22xm50,-66v0,30,21,43,51,43v52,2,61,-36,57,-90v-53,-2,-109,-5,-108,47","w":228},"'":{"d":"19,-216v10,0,20,-2,29,0r0,82v-9,2,-20,1,-29,0r0,-82","w":66},"(":{"d":"81,-233v-46,64,-48,219,0,283v-10,0,-21,2,-30,0v-47,-65,-47,-218,0,-283v10,0,21,-2,30,0","w":95},")":{"d":"44,-233v48,65,48,219,0,283v-9,0,-21,2,-29,0v46,-66,46,-217,0,-283v10,0,20,-2,29,0","w":95},"*":{"d":"64,-216v6,-2,12,-1,18,0r3,39v-8,0,-17,2,-24,0xm55,-173v-1,8,-4,15,-7,22r-37,-14v1,-6,3,-12,6,-18xm50,-144v7,4,13,7,19,13r-25,31v-7,-3,-10,-7,-15,-12xm128,-183v3,6,5,12,6,18r-36,14v-3,-7,-6,-14,-7,-22xm116,-112v-5,5,-8,9,-15,12r-25,-31r19,-13","w":145},"+":{"d":"77,-92r-50,0v-1,-8,-2,-19,0,-27r50,0r0,-54v9,-2,18,-2,27,0r0,54r49,0v0,9,2,19,0,27r-49,0r0,54v-9,1,-19,2,-27,0r0,-54"},",":{"d":"24,-33v10,-1,18,-2,29,0r-19,67v-9,0,-19,2,-28,0","w":63},"-":{"d":"93,-98v0,9,2,19,0,28r-78,0v0,-9,-2,-19,0,-28r78,0","w":108},".":{"d":"53,0v-26,7,-44,-3,-33,-34v11,-1,21,0,33,0v0,11,2,24,0,34","w":72},"\/":{"d":"83,-216v10,0,20,-2,29,0r-73,216v-10,0,-20,2,-29,0","w":123},"0":{"d":"15,-96v0,-56,19,-100,76,-100v55,0,75,43,75,100v0,56,-21,100,-76,100v-54,0,-75,-43,-75,-100xm134,-96v0,-42,-10,-74,-44,-74v-34,0,-44,33,-44,74v0,41,10,73,44,73v34,0,44,-32,44,-73"},"1":{"d":"41,-135v-6,-7,-8,-12,-11,-22v29,-12,53,-29,84,-38r0,169r43,0v2,10,1,17,0,26r-117,0v-2,-8,-3,-18,0,-26r45,0r0,-128"},"2":{"d":"22,-184v40,-21,127,-18,122,44v-3,52,-45,80,-71,114r79,0v2,9,2,18,0,26r-133,0r-2,-4v30,-40,70,-72,93,-118v23,-46,-47,-58,-80,-37v-3,-7,-8,-16,-8,-25"},"3":{"d":"24,-13v36,16,99,12,99,-37v0,-32,-36,-41,-69,-34r-2,-4r50,-79r-77,0v-3,-8,-2,-18,0,-27r121,0r2,4r-54,83v37,0,58,20,59,55v3,70,-79,88,-139,64v2,-9,6,-18,10,-25"},"4":{"d":"12,-23r-2,-4r88,-172v10,0,19,5,26,10r-70,139r61,0r0,-57v10,0,20,-2,29,0r0,57r27,0v0,9,2,19,0,27r-27,0r0,41v-10,1,-19,0,-29,0r0,-41r-103,0"},"5":{"d":"66,-113v50,-10,87,14,87,62v0,69,-76,86,-134,64v2,-9,4,-18,8,-25v37,14,95,10,95,-38v0,-41,-48,-47,-82,-35r-3,-3r4,-106r102,0v0,9,2,19,0,27r-75,0"},"6":{"d":"93,4v-90,6,-86,-128,-46,-179v19,-24,47,-40,87,-43v3,9,2,16,1,25v-49,6,-76,36,-84,83v9,-15,26,-28,51,-27v41,1,64,27,64,69v0,46,-30,69,-73,72xm135,-68v0,-28,-13,-44,-41,-44v-27,1,-42,19,-42,45v0,28,13,45,40,45v28,0,43,-19,43,-46"},"7":{"d":"74,22v-12,-2,-20,-6,-28,-12r76,-177r-101,0v0,-9,-2,-19,0,-27r143,0v-23,73,-62,144,-90,216"},"8":{"d":"154,-164v1,26,-17,41,-35,50v24,10,45,26,45,59v0,43,-34,59,-74,59v-40,0,-74,-16,-74,-59v0,-33,21,-49,44,-59v-18,-9,-35,-24,-34,-50v1,-35,28,-52,64,-52v36,0,62,17,64,52xm90,-22v48,4,54,-60,17,-73v-25,-16,-58,7,-59,37v0,25,16,34,42,36xm90,-191v-40,-3,-46,51,-13,60v21,12,48,-6,48,-31v-1,-19,-14,-27,-35,-29"},"9":{"d":"88,-196v91,-7,87,127,47,178v-19,24,-47,41,-87,44v-4,-6,-2,-16,-2,-25v49,-6,79,-36,85,-84v-24,49,-122,30,-115,-41v5,-45,29,-69,72,-72xm47,-124v0,27,13,44,40,44v28,-1,43,-18,43,-45v0,-28,-13,-45,-41,-45v-26,0,-43,18,-42,46"},":":{"d":"53,-121v-26,7,-44,-3,-33,-34v11,-1,21,0,33,0v0,11,2,24,0,34xm53,0v-26,7,-44,-3,-33,-34v11,-1,21,0,33,0v0,11,2,24,0,34","w":72},";":{"d":"27,-33v10,-1,18,-2,29,0r-19,67v-9,0,-19,2,-28,0xm58,-121v-26,7,-44,-3,-33,-34v11,-1,21,0,33,0v0,11,2,24,0,34","w":78},"<":{"d":"153,-170v3,11,1,18,1,29r-99,38r99,36v1,10,1,21,-1,30r-125,-50v-1,-10,-2,-22,0,-32"},"=":{"d":"154,-89v1,9,0,17,0,27r-128,0r0,-27r128,0xm154,-147v1,10,0,18,0,28r-128,0r0,-28r128,0"},">":{"d":"27,-37v0,-9,-2,-19,0,-28r98,-38r-98,-37v-2,-10,-2,-21,0,-30r125,51v2,11,3,21,0,32"},"?":{"d":"135,-158v-2,36,-26,53,-52,63r0,31v-9,0,-19,2,-28,0r0,-49v24,-8,47,-14,48,-44v2,-37,-55,-38,-83,-26v-4,-8,-5,-15,-7,-25v49,-18,125,-8,122,50xm86,0v-27,6,-43,0,-34,-34v11,0,23,-2,34,0v1,12,0,22,0,34","w":146},"@":{"d":"178,-219v67,0,108,34,110,101v2,65,-53,122,-115,92v-32,21,-91,13,-89,-37v3,-70,59,-110,130,-87r-21,107v43,17,69,-32,68,-75v-1,-51,-34,-79,-86,-78v-81,2,-125,51,-130,131v-5,79,72,102,138,80r6,21v-80,29,-178,-7,-172,-100v6,-95,61,-155,161,-155xm113,-68v-2,30,29,34,53,24r16,-87v-43,-9,-66,23,-69,63","w":304},"A":{"d":"133,-50r-82,0r-15,50v-10,0,-22,2,-31,0r70,-216v12,0,24,-2,35,0r70,216v-10,0,-23,2,-32,0xm59,-76r65,0r-32,-111","w":185},"B":{"d":"165,-60v1,66,-77,69,-138,60r0,-216v54,-7,127,-7,125,53v-1,25,-14,42,-35,47v28,6,48,21,48,56xm133,-61v0,-38,-35,-41,-76,-39r0,76v36,5,76,2,76,-37xm121,-161v0,-30,-31,-38,-64,-33r0,68v35,2,64,-2,64,-35","w":178},"C":{"d":"51,-106v0,69,55,99,113,74v4,9,7,17,8,25v-76,32,-154,-11,-154,-99v0,-88,70,-133,151,-105v-1,10,-4,17,-7,25v-60,-22,-111,10,-111,80","w":185},"D":{"d":"192,-107v0,96,-74,122,-165,107r0,-216v95,-14,165,15,165,109xm160,-108v0,-63,-40,-92,-103,-82r0,165v66,8,103,-18,103,-83","w":209},"E":{"d":"26,-216r119,0v0,9,2,19,0,27r-88,0r0,62r70,0v0,9,2,19,0,27r-70,0r0,73r90,0v0,9,2,19,0,27r-121,0r0,-216","w":160},"F":{"d":"26,-216r113,0v0,9,2,19,0,27r-82,0r0,63r69,0v0,9,2,19,0,27r-69,0r0,99v-10,0,-22,2,-31,0r0,-216","w":151},"G":{"d":"50,-106v0,60,39,93,101,79r0,-85v11,-1,20,0,31,0r0,106v-82,29,-164,-7,-164,-100v0,-88,71,-132,153,-105v-1,10,-4,17,-7,25v-62,-22,-114,12,-114,80","w":204},"H":{"d":"26,-216v10,0,22,-2,31,0r0,89r92,0r0,-89v10,0,21,-2,30,0r0,216v-10,0,-21,2,-30,0r0,-100r-92,0r0,100v-10,0,-22,2,-31,0r0,-216","w":205},"I":{"d":"26,-216v10,0,22,-2,31,0r0,216v-10,0,-22,2,-31,0r0,-216","w":83},"J":{"d":"13,-26v23,7,50,2,50,-27r0,-136r-37,0v-2,-9,-2,-18,0,-27r68,0r0,156v5,54,-39,73,-86,60","w":118},"K":{"d":"66,-110r69,-106v11,0,23,-2,34,0r-69,104r77,112v-12,0,-24,2,-35,0xm26,-216v10,0,22,-2,31,0r0,216v-10,0,-22,2,-31,0r0,-216"},"L":{"d":"26,-216v10,0,22,-2,31,0r0,189r84,0v1,9,2,19,0,27r-115,0r0,-216","w":148},"M":{"d":"32,-216v11,0,25,-2,35,0r56,135r56,-135v11,0,23,-2,33,0r10,216v-10,0,-21,2,-30,0r-7,-168r-52,123v-8,1,-16,2,-24,0r-51,-124r-7,169v-9,0,-19,2,-28,0","w":244},"N":{"d":"26,-216v10,0,20,-2,29,0r93,162r0,-162v10,0,21,-2,30,0r0,216v-10,0,-20,2,-29,0r-94,-161r0,161v-10,0,-20,2,-29,0r0,-216","w":204},"O":{"d":"200,-108v0,66,-26,112,-90,112v-65,0,-92,-47,-92,-112v0,-64,26,-111,92,-111v65,0,90,46,90,111xm51,-108v0,47,13,85,59,85v45,0,58,-38,58,-85v0,-46,-13,-84,-58,-84v-46,0,-59,37,-59,84","w":218},"P":{"d":"158,-150v0,58,-43,77,-101,72r0,78v-10,0,-22,2,-31,0r0,-216v66,-8,132,-5,132,66xm127,-149v0,-38,-31,-48,-70,-43r0,87v40,5,70,-5,70,-44","w":169},"Q":{"d":"202,20v0,11,-2,18,-5,26r-69,-13v1,-11,3,-17,6,-25xm200,-108v0,65,-27,112,-91,112v-65,0,-92,-47,-92,-112v0,-64,26,-111,92,-111v65,1,91,47,91,111xm50,-108v0,47,13,85,59,85v45,0,58,-37,58,-85v0,-48,-13,-84,-58,-84v-46,0,-59,37,-59,84","w":217},"R":{"d":"124,-151v1,-35,-30,-48,-66,-41r0,192v-10,0,-22,2,-31,0r0,-216v69,-13,150,7,126,84v-6,20,-24,32,-42,41r62,91v-10,1,-24,2,-34,0r-69,-101v26,-8,53,-18,54,-50","w":179},"S":{"d":"147,-86v26,80,-71,107,-133,80v0,-9,3,-20,7,-27v39,24,127,0,86,-53v-30,-23,-87,-19,-87,-75v0,-58,70,-68,120,-50v-1,8,-3,17,-6,25v-34,-20,-109,-2,-73,43v27,20,75,22,86,57","w":163},"T":{"d":"64,-189r-56,0v-2,-9,-2,-18,0,-27r142,0v2,9,2,18,0,27r-56,0r0,189v-10,2,-21,1,-30,0r0,-189","w":157},"U":{"d":"101,4v-102,0,-73,-125,-77,-220v10,-1,21,-2,31,0r0,123v-1,40,7,70,46,69v76,-2,36,-122,46,-192v10,-2,21,-1,31,0v-4,95,26,220,-77,220","w":202},"V":{"d":"7,-216v11,0,23,-2,33,0r55,185r54,-185v10,-2,22,0,33,0r-70,216v-12,0,-25,2,-36,0","w":188},"W":{"d":"8,-216v11,0,24,-2,34,0r37,180r44,-180v10,0,23,-2,32,0r45,182r38,-182v10,0,21,-2,30,0r-52,216v-12,0,-24,2,-35,0r-43,-169r-43,169v-11,0,-25,2,-35,0","w":276},"X":{"d":"90,-113r-51,113v-12,2,-21,1,-33,0r54,-113r-45,-102v11,-1,21,-2,32,0xm92,-113r43,-102v11,0,23,-2,32,0r-45,101r54,114v-12,2,-19,1,-32,0","w":182},"Y":{"d":"74,-79r-69,-137v12,0,25,-2,35,0r50,107r50,-107v11,0,22,-2,32,0r-67,137r0,79v-10,0,-22,2,-31,0r0,-79","w":177},"Z":{"d":"7,-3r109,-186r-95,0v0,-9,-2,-19,0,-27r140,0r2,3r-109,186r101,0v0,9,2,19,0,27r-146,0","w":169},"[":{"d":"15,-228r65,0v1,8,0,16,0,24r-36,0r0,230r36,0v1,8,0,15,0,24r-65,0r0,-278","w":95},"\\":{"d":"112,0v-10,0,-20,2,-29,0r-73,-216v9,0,21,-2,29,0","w":123},"]":{"d":"16,50v-2,-7,-1,-18,0,-24r35,0r0,-229r-35,0v-1,-8,-2,-17,0,-25r65,0r0,278r-65,0","w":95},"^":{"d":"67,-216v10,0,22,-2,31,0r48,106r-28,0r-36,-80r-36,80r-28,0","w":165},"_":{"d":"150,4v1,6,2,16,0,22r-148,0v-2,-7,-2,-15,0,-22r148,0","w":151},"`":{"d":"39,-216v13,-2,25,-2,38,0r34,38v-10,0,-21,2,-30,0","w":150},"a":{"d":"105,-72v-52,-23,-90,51,-27,52v9,-1,19,-1,27,-3r0,-49xm14,-46v2,-43,43,-55,91,-50v6,-43,-42,-41,-72,-31v-4,-7,-6,-15,-6,-24v47,-14,107,-9,107,51r0,96v-45,12,-122,16,-120,-42","w":155},"b":{"d":"161,-81v4,74,-73,101,-137,76r0,-215v9,0,21,-2,29,0r0,85v8,-13,24,-23,45,-23v44,0,61,31,63,77xm92,-132v-49,-1,-38,60,-39,107v42,12,79,-10,77,-55v-1,-31,-10,-51,-38,-52","w":177},"c":{"d":"46,-77v0,49,41,67,81,50v4,6,5,15,6,24v-59,22,-118,-7,-118,-74v0,-64,57,-95,116,-74v-1,7,-2,17,-5,23v-41,-15,-80,4,-80,51","w":143},"d":{"d":"16,-74v0,-62,47,-94,107,-79r0,-67v9,0,21,-2,29,0r0,216v-62,19,-136,6,-136,-70xm47,-74v0,46,34,60,76,50r0,-104v-41,-15,-76,8,-76,54","w":175},"e":{"d":"87,-158v48,0,70,37,64,88r-105,0v-4,50,50,57,90,42v4,6,6,15,6,23v-58,24,-127,1,-127,-71v0,-50,24,-82,72,-82xm122,-92v5,-38,-42,-54,-64,-31v-6,7,-11,18,-12,31r76,0","w":166},"f":{"d":"110,-196v-30,-8,-52,5,-46,42r40,0r0,24r-40,0r0,130v-10,0,-21,2,-30,0r0,-130r-25,0v-2,-6,-1,-18,0,-24r25,0v-5,-52,30,-78,80,-66v1,10,-2,17,-4,24","w":111},"g":{"d":"17,-103v-3,-54,72,-68,106,-41v8,-7,24,-11,39,-11v0,9,2,19,0,27r-27,0v23,46,-19,91,-77,76v-5,3,-14,9,-13,18v1,21,39,13,61,14v32,2,51,12,51,41v0,41,-40,54,-83,54v-36,0,-63,-8,-63,-40v0,-18,11,-30,24,-38v-22,-10,-15,-48,4,-58v-13,-9,-21,-22,-22,-42xm76,51v42,8,75,-44,24,-47v-29,-2,-62,-3,-61,25v0,19,17,22,37,22xm48,-103v0,19,11,32,32,32v21,0,32,-13,32,-32v0,-20,-10,-33,-32,-33v-22,0,-32,13,-32,33","w":165},"h":{"d":"94,-131v-55,0,-39,77,-41,131v-9,0,-21,2,-29,0r0,-220v9,0,21,-2,29,0r0,90v9,-15,24,-27,47,-28v72,-3,48,92,52,158v-9,0,-21,2,-29,0v-6,-47,19,-131,-29,-131","w":173},"i":{"d":"33,-130v-18,4,-25,-6,-19,-24r48,0r0,154v-9,0,-21,2,-29,0r0,-130xm26,-188r0,-30v10,0,23,-2,32,0v1,17,7,38,-23,31v-3,0,-6,-1,-9,-1","w":86},"j":{"d":"-7,30v21,6,41,2,41,-23r0,-137r-20,0v-1,-8,0,-15,0,-24r49,0r0,163v3,42,-38,55,-75,43v0,-8,3,-16,5,-22xm27,-188v0,-10,-2,-20,0,-30v10,0,22,-2,31,0v2,10,2,19,0,30v-10,0,-22,2,-31,0","w":87},"k":{"d":"23,-220v9,0,21,-2,29,0r0,220v-9,0,-21,2,-29,0r0,-220xm61,-80r49,-74v11,0,22,-2,32,0r-49,72r58,82v-11,0,-23,2,-33,0","w":154},"l":{"d":"86,0v-34,8,-63,-5,-63,-40r0,-180v10,0,21,-2,30,0r0,174v-3,22,11,27,31,23v2,7,2,15,2,23","w":89},"m":{"d":"90,-132v-51,0,-33,80,-36,132v-10,0,-21,2,-30,0r0,-154v13,0,29,-6,27,12v1,5,1,9,1,12v11,-33,79,-38,88,0v9,-14,22,-27,44,-28v71,-2,48,92,52,158v-10,0,-21,2,-30,0v-6,-46,19,-131,-27,-131v-51,0,-30,81,-34,131v-10,0,-21,2,-30,0r0,-92v0,-22,-5,-40,-25,-40","w":256},"n":{"d":"95,-131v-55,0,-38,77,-41,131v-10,0,-21,2,-30,0r0,-154v13,0,29,-6,27,12v1,5,1,10,1,13v10,-15,25,-28,49,-29v71,-2,48,92,52,158v-10,0,-21,2,-30,0v-6,-46,19,-131,-28,-131","w":173},"o":{"d":"158,-77v0,49,-25,81,-72,81v-47,0,-71,-32,-71,-81v0,-49,24,-81,71,-81v47,0,72,32,72,81xm46,-77v0,32,9,56,40,57v30,0,41,-24,41,-57v0,-33,-11,-56,-41,-56v-30,0,-40,24,-40,56","w":173},"p":{"d":"161,-81v2,61,-48,97,-108,81r0,71v-9,0,-21,2,-29,0r0,-225v18,-3,30,-1,28,22v8,-16,24,-26,47,-26v44,0,61,32,62,77xm92,-132v-47,0,-39,59,-39,107v41,14,79,-8,77,-55v-1,-30,-10,-52,-38,-52","w":177},"q":{"d":"16,-73v0,-74,69,-98,136,-78r0,222v-10,0,-21,2,-30,0r0,-71v-59,12,-106,-11,-106,-73xm46,-72v0,44,37,59,76,47r0,-105v-41,-12,-76,13,-76,58","w":175},"r":{"d":"104,-127v-62,-13,-50,67,-50,127v-10,0,-21,2,-30,0r0,-154v13,0,29,-6,27,12v1,5,1,9,1,12v9,-14,27,-29,52,-24v2,8,2,18,0,27","w":111},"s":{"d":"112,-75v44,60,-47,97,-98,71r7,-24v32,22,105,-10,55,-37v-24,-13,-57,-15,-58,-48v-2,-47,62,-52,100,-37v-1,8,-3,17,-6,23v-25,-20,-95,5,-48,30v15,8,39,9,48,22","w":136},"t":{"d":"102,-1v-37,10,-72,-1,-72,-42r0,-87v-8,-2,-24,4,-25,-4v19,-19,33,-42,54,-58r0,38r39,0v0,8,2,17,0,24r-39,0r0,70v-4,30,11,45,40,36v3,7,3,14,3,23","w":107},"u":{"d":"149,-5v-56,19,-127,12,-127,-63r0,-86v10,0,21,-2,30,0v5,54,-19,137,42,133v10,0,19,-2,26,-4r0,-129v9,0,21,-2,29,0r0,149","w":172},"v":{"d":"5,-154v11,0,23,-2,33,0r42,127r43,-127v10,0,22,-2,31,0r-60,154v-10,0,-20,2,-29,0","w":159},"w":{"d":"7,-154v10,0,23,-2,32,0r30,126r34,-126v10,0,21,-2,30,0r33,124r30,-124v10,0,21,-2,30,0r-46,154v-10,0,-21,2,-30,0r-33,-116r-35,116v-10,0,-21,2,-30,0","w":232},"x":{"d":"47,-80r-36,-74v11,0,22,-2,32,0r32,74r-38,80v-11,0,-22,2,-32,0xm77,-80r33,-74v10,-1,21,-2,31,0r-35,73r41,81v-10,1,-21,2,-31,0","w":152},"y":{"d":"26,48v19,8,40,0,41,-19r9,-29v-7,2,-13,0,-21,0r-51,-154v11,0,23,-2,33,0r42,143r44,-143v10,0,22,-2,31,0r-68,206v-8,21,-40,28,-65,19v0,-10,2,-16,5,-23","w":158},"z":{"d":"9,-4r81,-126r-72,0v-2,-8,-1,-16,0,-24r116,0r1,4r-81,126r76,0v1,8,2,16,0,24r-120,0","w":143},"{":{"d":"108,50v-56,5,-63,-37,-63,-91v0,-26,-12,-37,-30,-47r0,-4v18,-10,31,-21,30,-51v-2,-53,7,-91,63,-87v0,8,2,17,0,24v-30,-1,-35,18,-34,48v1,34,-3,58,-25,68v22,11,26,35,25,70v0,29,3,49,34,46v0,8,2,17,0,24","w":124},"|":{"d":"35,-233v10,0,20,-2,29,0r0,283v-10,2,-20,2,-29,0r0,-283","w":99},"}":{"d":"109,-88v-62,14,11,144,-93,138v0,-8,-2,-17,0,-24v31,3,35,-18,34,-48v-1,-34,3,-58,25,-68v-47,-11,3,-121,-59,-116v0,-8,-2,-17,0,-24v56,-3,65,34,63,87v-1,30,12,41,30,51r0,4","w":124},"~":{"d":"100,-103v-28,0,-60,-25,-81,-1v-6,-6,-11,-12,-13,-19v25,-40,91,15,119,-17v6,5,10,13,13,21v-10,9,-21,16,-38,16","w":143},"\u00d7":{"d":"71,-106r-36,-36v4,-9,11,-14,19,-20r36,37r36,-36v7,5,14,12,19,19r-36,36r36,36v-6,7,-12,14,-19,19r-36,-36r-37,36v-7,-5,-14,-11,-19,-19"},"\u2013":{"d":"150,-98v0,9,2,19,0,28r-150,0v0,-9,-2,-19,0,-28r150,0","w":150},"\u2014":{"d":"300,-98v0,9,2,19,0,28r-300,0v0,-9,-2,-19,0,-28r300,0","w":300},"\u2018":{"d":"15,-215v10,-2,19,-2,29,0r18,67v-9,1,-19,2,-28,0","w":77},"\u2019":{"d":"33,-216v9,0,21,-2,29,0r-18,67v-10,0,-20,2,-29,0","w":77},"\u201c":{"d":"15,-215v10,-2,19,-2,29,0r18,67v-9,1,-19,2,-28,0xm73,-215v10,-2,19,-2,29,0r18,67v-9,1,-19,2,-28,0","w":135},"\u201d":{"d":"33,-216v9,0,21,-2,29,0r-18,67v-10,0,-20,2,-29,0xm91,-216v9,0,21,-2,29,0r-18,67v-10,0,-20,2,-29,0","w":135},"\u2026":{"d":"127,0v-26,7,-44,-3,-33,-34v11,-1,21,0,33,0v0,11,2,24,0,34xm201,0v-26,7,-44,-3,-33,-34v11,-1,21,0,33,0v0,11,2,24,0,34xm53,0v-26,7,-44,-3,-33,-34v11,-1,21,0,33,0v0,11,2,24,0,34","w":219},"\u2122":{"d":"42,-190r-34,0v-2,-9,-1,-13,0,-22r90,0v2,7,2,15,0,22r-33,0r0,98v-8,0,-16,2,-23,0r0,-98xm118,-212v8,0,17,-2,25,0r30,66r29,-66v8,0,17,-2,25,0r6,120v-8,0,-16,2,-23,0r-5,-77r-26,54v-6,1,-10,2,-17,0r-23,-53r-4,76v-8,2,-15,1,-23,0","w":247},"!":{"d":"28,-216v11,0,22,-2,32,0r-2,151v-9,2,-19,1,-28,0xm60,0v-27,6,-41,-1,-33,-34v11,-1,21,0,33,0v2,11,2,23,0,34","w":87},"\"":{"d":"78,-216v10,0,20,-2,29,0r0,82v-9,2,-20,1,-29,0r0,-82xm19,-216v10,0,20,-2,29,0r0,82v-9,2,-20,1,-29,0r0,-82","w":126},"#":{"d":"57,-63r-37,0v0,-8,-2,-16,0,-23r39,0r4,-50r-37,0v-1,-6,-2,-17,0,-23r39,0r4,-48v9,0,19,-2,27,0r-4,48r51,0r4,-48v9,0,19,-2,27,0r-4,48r35,0v2,7,1,16,0,23r-37,0r-4,50r35,0v0,8,2,16,0,23r-37,0r-4,54v-10,1,-19,2,-27,0r4,-54r-51,0r-4,54v-10,2,-18,1,-28,0xm137,-86r4,-50r-51,0r-4,50r51,0","w":220},"$":{"d":"131,-111v47,25,28,112,-28,112r0,34v-7,2,-14,2,-21,0r0,-32v-22,3,-43,-4,-60,-9r7,-26v35,15,112,13,94,-42v-24,-36,-96,-22,-95,-85v1,-32,23,-52,54,-56r0,-29v6,-2,15,-1,21,0r0,28v16,1,34,4,46,8v-1,8,-4,17,-7,25v-28,-13,-100,-11,-79,34v11,23,46,26,68,38"},"\u00a0":{"w":71}}});
