(function(e, t, n) {
	"use strict";

	function r(e, t, n) {
		var r = e.runtimeStyle && e.runtimeStyle[t],
			i, s = e.style;
		return !/^-?[0-9]+\.?[0-9]*(?:px)?$/i.test(n) && /^-?\d/.test(n) && (i = s.left, r && (e.runtimeStyle.left = e.currentStyle.left), s.left = t === "fontSize" ? "1em" : n || 0, n = s.pixelLeft + "px", s.left = i, r && (e.runtimeStyle.left = r)), /^(thin|medium|thick)$/i.test(n) ? n : Math.round(parseFloat(n)) + "px"
	}

	function i(e) {
		return parseInt(e, 10)
	}

	function s(e, t, i, s) {
		e = (e || "").split(","), e = e[s || 0] || e[0] || "auto", e = f.Util.trimText(e).split(" ");
		if(i !== "backgroundSize" || !!e[0] && !e[0].match(/cover|contain|auto/)) {
			e[0] = e[0].indexOf("%") === -1 ? r(t, i + "X", e[0]) : e[0];
			if(e[1] === n) {
				if(i === "backgroundSize") return e[1] = "auto", e;
				e[1] = e[0]
			}
			e[1] = e[1].indexOf("%") === -1 ? r(t, i + "Y", e[1]) : e[1]
		}
		return e
	}

	function o(e, t, n, r, i, s) {
		var o = f.Util.getCSS(t, e, i),
			u, a, l, c;
		o.length === 1 && (c = o[0], o = [], o[0] = c, o[1] = c);
		if(o[0].toString().indexOf("%") !== -1) l = parseFloat(o[0]) / 100, a = n.width * l, e !== "backgroundSize" && (a -= (s || r).width * l);
		else if(e === "backgroundSize")
			if(o[0] === "auto") a = r.width;
			else if(/contain|cover/.test(o[0])) {
			var h = f.Util.resizeBounds(r.width, r.height, n.width, n.height, o[0]);
			a = h.width, u = h.height
		} else a = parseInt(o[0], 10);
		else a = parseInt(o[0], 10);
		return o[1] === "auto" ? u = a / r.width * r.height : o[1].toString().indexOf("%") !== -1 ? (l = parseFloat(o[1]) / 100, u = n.height * l, e !== "backgroundSize" && (u -= (s || r).height * l)) : u = parseInt(o[1], 10), [a, u]
	}

	function u(e, t) {
		var n = [];
		return {
			storage: n,
			width: e,
			height: t,
			clip: function() {
				n.push({
					type: "function",
					name: "clip",
					arguments: arguments
				})
			},
			translate: function() {
				n.push({
					type: "function",
					name: "translate",
					arguments: arguments
				})
			},
			fill: function() {
				n.push({
					type: "function",
					name: "fill",
					arguments: arguments
				})
			},
			save: function() {
				n.push({
					type: "function",
					name: "save",
					arguments: arguments
				})
			},
			restore: function() {
				n.push({
					type: "function",
					name: "restore",
					arguments: arguments
				})
			},
			fillRect: function() {
				n.push({
					type: "function",
					name: "fillRect",
					arguments: arguments
				})
			},
			createPattern: function() {
				n.push({
					type: "function",
					name: "createPattern",
					arguments: arguments
				})
			},
			drawShape: function() {
				var e = [];
				return n.push({
					type: "function",
					name: "drawShape",
					arguments: e
				}), {
					moveTo: function() {
						e.push({
							name: "moveTo",
							arguments: arguments
						})
					},
					lineTo: function() {
						e.push({
							name: "lineTo",
							arguments: arguments
						})
					},
					arcTo: function() {
						e.push({
							name: "arcTo",
							arguments: arguments
						})
					},
					bezierCurveTo: function() {
						e.push({
							name: "bezierCurveTo",
							arguments: arguments
						})
					},
					quadraticCurveTo: function() {
						e.push({
							name: "quadraticCurveTo",
							arguments: arguments
						})
					}
				}
			},
			drawImage: function() {
				n.push({
					type: "function",
					name: "drawImage",
					arguments: arguments
				})
			},
			fillText: function() {
				n.push({
					type: "function",
					name: "fillText",
					arguments: arguments
				})
			},
			setVariable: function(e, t) {
				return n.push({
					type: "variable",
					name: e,
					arguments: t
				}), t
			}
		}
	}

	function a(e) {
		return {
			zindex: e,
			children: []
		}
	}
	var f = {},
		l, c, h;
	f.Util = {}, f.Util.log = function(t) {
			f.logging && e.console && e.console.log && e.console.log(t)
		}, f.Util.trimText = function(e) {
			return function(t) {
				return e ? e.apply(t) : ((t || "") + "").replace(/^\s+|\s+$/g, "")
			}
		}(String.prototype.trim), f.Util.asFloat = function(e) {
			return parseFloat(e)
		},
		function() {
			var e = /((rgba|rgb)\([^\)]+\)(\s-?\d+px){0,})/g,
				t = /(-?\d+px)|(#.+)|(rgb\(.+\))|(rgba\(.+\))/g;
			f.Util.parseTextShadows = function(n) {
				if(!n || n === "none") return [];
				var r = n.match(e),
					i = [];
				for(var s = 0; r && s < r.length; s++) {
					var o = r[s].match(t);
					i.push({
						color: o[0],
						offsetX: o[1] ? o[1].replace("px", "") : 0,
						offsetY: o[2] ? o[2].replace("px", "") : 0,
						blur: o[3] ? o[3].replace("px", "") : 0
					})
				}
				return i
			}
		}(), f.Util.parseBackgroundImage = function(e) {
			var t = " \r\n	",
				n, r, i, s, o, u = [],
				a, f = 0,
				l = 0,
				c, h, p = function() {
					n && (r.substr(0, 1) === '"' && (r = r.substr(1, r.length - 2)), r && h.push(r), n.substr(0, 1) === "-" && (s = n.indexOf("-", 1) + 1) > 0 && (i = n.substr(0, s), n = n.substr(s)), u.push({
						prefix: i,
						method: n.toLowerCase(),
						value: o,
						args: h
					})), h = [], n = i = r = o = ""
				};
			p();
			for(var d = 0, v = e.length; d < v; d++) {
				a = e[d];
				if(f === 0 && t.indexOf(a) > -1) continue;
				switch(a) {
					case '"':
						c ? c === a && (c = null) : c = a;
						break;
					case "(":
						if(c) break;
						if(f === 0) {
							f = 1, o += a;
							continue
						}
						l++;
						break;
					case ")":
						if(c) break;
						if(f === 1) {
							if(l === 0) {
								f = 0, o += a, p();
								continue
							}
							l--
						}
						break;
					case ",":
						if(c) break;
						if(f === 0) {
							p();
							continue
						}
						if(f === 1 && l === 0 && !n.match(/^url$/i)) {
							h.push(r), r = "", o += a;
							continue
						}
				}
				o += a, f === 0 ? n += a : r += a
			}
			return p(), u
		}, f.Util.Bounds = function(e) {
			var t, n = {};
			return e.getBoundingClientRect && (t = e.getBoundingClientRect(), n.top = t.top, n.bottom = t.bottom || t.top + t.height, n.left = t.left, n.width = e.offsetWidth, n.height = e.offsetHeight), n
		}, f.Util.OffsetBounds = function(e) {
			var t = e.offsetParent ? f.Util.OffsetBounds(e.offsetParent) : {
				top: 0,
				left: 0
			};
			return {
				top: e.offsetTop + t.top,
				bottom: e.offsetTop + e.offsetHeight + t.top,
				left: e.offsetLeft + t.left,
				width: e.offsetWidth,
				height: e.offsetHeight
			}
		}, f.Util.getCSS = function(e, n, r) {
			l !== e && (c = t.defaultView.getComputedStyle(e, null));
			var o = c[n];
			if(/^background(Size|Position)$/.test(n)) return s(o, e, n, r);
			if(/border(Top|Bottom)(Left|Right)Radius/.test(n)) {
				var u = o.split(" ");
				return u.length <= 1 && (u[1] = u[0]), u.map(i)
			}
			return o
		}, f.Util.resizeBounds = function(e, t, n, r, i) {
			var s = n / r,
				o = e / t,
				u, a;
			return !i || i === "auto" ? (u = n, a = r) : s < o ^ i === "contain" ? (a = r, u = r * o) : (u = n, a = n / o), {
				width: u,
				height: a
			}
		}, f.Util.BackgroundPosition = function(e, t, n, r, i) {
			var s = o("backgroundPosition", e, t, n, r, i);
			return {
				left: s[0],
				top: s[1]
			}
		}, f.Util.BackgroundSize = function(e, t, n, r) {
			var i = o("backgroundSize", e, t, n, r);
			return {
				width: i[0],
				height: i[1]
			}
		}, f.Util.Extend = function(e, t) {
			for(var n in e) e.hasOwnProperty(n) && (t[n] = e[n]);
			return t
		}, f.Util.Children = function(e) {
			var t;
			try {
				t = e.nodeName && e.nodeName.toUpperCase() === "IFRAME" ? e.contentDocument || e.contentWindow.document : function(e) {
					var t = [];
					return e !== null && function(e, t) {
						var r = e.length,
							i = 0;
						if(typeof t.length == "number")
							for(var s = t.length; i < s; i++) e[r++] = t[i];
						else
							while(t[i] !== n) e[r++] = t[i++];
						return e.length = r, e
					}(t, e), t
				}(e.childNodes)
			} catch(r) {
				f.Util.log("html2canvas.Util.Children failed with exception: " + r.message), t = []
			}
			return t
		}, f.Util.isTransparent = function(e) {
			return e === "transparent" || e === "rgba(0, 0, 0, 0)"
		}, f.Util.Font = function() {
			var e = {};
			return function(t, r, i) {
				if(e[t + "-" + r] !== n) return e[t + "-" + r];
				var s = i.createElement("div"),
					o = i.createElement("img"),
					u = i.createElement("span"),
					a = "Hidden Text",
					f, l, c;
				return s.style.visibility = "hidden", s.style.fontFamily = t, s.style.fontSize = r, s.style.margin = 0, s.style.padding = 0, i.body.appendChild(s), o.src = "data:image/gif;base64,R0lGODlhAQABAIABAP///wAAACwAAAAAAQABAAACAkQBADs=", o.width = 1, o.height = 1, o.style.margin = 0, o.style.padding = 0, o.style.verticalAlign = "baseline", u.style.fontFamily = t, u.style.fontSize = r, u.style.margin = 0, u.style.padding = 0, u.appendChild(i.createTextNode(a)), s.appendChild(u), s.appendChild(o), f = o.offsetTop - u.offsetTop + 1, s.removeChild(u), s.appendChild(i.createTextNode(a)), s.style.lineHeight = "normal", o.style.verticalAlign = "super", l = o.offsetTop - s.offsetTop + 1, c = {
					baseline: f,
					lineWidth: 1,
					middle: l
				}, e[t + "-" + r] = c, i.body.removeChild(s), c
			}
		}(),
		function() {
			function e(e) {
				return function(t) {
					try {
						e.addColorStop(t.stop, t.color)
					} catch(r) {
						n.log(["failed to add color stop: ", r, "; tried to add: ", t])
					}
				}
			}
			var n = f.Util,
				r = {};
			f.Generate = r;
			var i = [/^(-webkit-linear-gradient)\(([a-z\s]+)([\w\d\.\s,%\(\)]+)\)$/, /^(-o-linear-gradient)\(([a-z\s]+)([\w\d\.\s,%\(\)]+)\)$/, /^(-webkit-gradient)\((linear|radial),\s((?:\d{1,3}%?)\s(?:\d{1,3}%?),\s(?:\d{1,3}%?)\s(?:\d{1,3}%?))([\w\d\.\s,%\(\)\-]+)\)$/, /^(-moz-linear-gradient)\(((?:\d{1,3}%?)\s(?:\d{1,3}%?))([\w\d\.\s,%\(\)]+)\)$/, /^(-webkit-radial-gradient)\(((?:\d{1,3}%?)\s(?:\d{1,3}%?)),\s(\w+)\s([a-z\-]+)([\w\d\.\s,%\(\)]+)\)$/, /^(-moz-radial-gradient)\(((?:\d{1,3}%?)\s(?:\d{1,3}%?)),\s(\w+)\s?([a-z\-]*)([\w\d\.\s,%\(\)]+)\)$/, /^(-o-radial-gradient)\(((?:\d{1,3}%?)\s(?:\d{1,3}%?)),\s(\w+)\s([a-z\-]+)([\w\d\.\s,%\(\)]+)\)$/];
			r.parseGradient = function(e, t) {
				var n, r, s = i.length,
					o, u, a, f, l, c, h, p, d, v;
				for(r = 0; r < s; r += 1) {
					o = e.match(i[r]);
					if(o) break
				}
				if(o) switch(o[1]) {
					case "-webkit-linear-gradient":
					case "-o-linear-gradient":
						n = {
							type: "linear",
							x0: null,
							y0: null,
							x1: null,
							y1: null,
							colorStops: []
						}, a = o[2].match(/\w+/g);
						if(a) {
							f = a.length;
							for(r = 0; r < f; r += 1) switch(a[r]) {
								case "top":
									n.y0 = 0, n.y1 = t.height;
									break;
								case "right":
									n.x0 = t.width, n.x1 = 0;
									break;
								case "bottom":
									n.y0 = t.height, n.y1 = 0;
									break;
								case "left":
									n.x0 = 0, n.x1 = t.width
							}
						}
						n.x0 === null && n.x1 === null && (n.x0 = n.x1 = t.width / 2), n.y0 === null && n.y1 === null && (n.y0 = n.y1 = t.height / 2), a = o[3].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\)(?:\s\d{1,3}(?:%|px))?)+/g);
						if(a) {
							f = a.length, l = 1 / Math.max(f - 1, 1);
							for(r = 0; r < f; r += 1) c = a[r].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\))\s*(\d{1,3})?(%|px)?/), c[2] ? (u = parseFloat(c[2]), c[3] === "%" ? u /= 100 : u /= t.width) : u = r * l, n.colorStops.push({
								color: c[1],
								stop: u
							})
						}
						break;
					case "-webkit-gradient":
						n = {
							type: o[2] === "radial" ? "circle" : o[2],
							x0: 0,
							y0: 0,
							x1: 0,
							y1: 0,
							colorStops: []
						}, a = o[3].match(/(\d{1,3})%?\s(\d{1,3})%?,\s(\d{1,3})%?\s(\d{1,3})%?/), a && (n.x0 = a[1] * t.width / 100, n.y0 = a[2] * t.height / 100, n.x1 = a[3] * t.width / 100, n.y1 = a[4] * t.height / 100), a = o[4].match(/((?:from|to|color-stop)\((?:[0-9\.]+,\s)?(?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\)\))+/g);
						if(a) {
							f = a.length;
							for(r = 0; r < f; r += 1) c = a[r].match(/(from|to|color-stop)\(([0-9\.]+)?(?:,\s)?((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\))\)/), u = parseFloat(c[2]), c[1] === "from" && (u = 0), c[1] === "to" && (u = 1), n.colorStops.push({
								color: c[3],
								stop: u
							})
						}
						break;
					case "-moz-linear-gradient":
						n = {
							type: "linear",
							x0: 0,
							y0: 0,
							x1: 0,
							y1: 0,
							colorStops: []
						}, a = o[2].match(/(\d{1,3})%?\s(\d{1,3})%?/), a && (n.x0 = a[1] * t.width / 100, n.y0 = a[2] * t.height / 100, n.x1 = t.width - n.x0, n.y1 = t.height - n.y0), a = o[3].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\)(?:\s\d{1,3}%)?)+/g);
						if(a) {
							f = a.length, l = 1 / Math.max(f - 1, 1);
							for(r = 0; r < f; r += 1) c = a[r].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\))\s*(\d{1,3})?(%)?/), c[2] ? (u = parseFloat(c[2]), c[3] && (u /= 100)) : u = r * l, n.colorStops.push({
								color: c[1],
								stop: u
							})
						}
						break;
					case "-webkit-radial-gradient":
					case "-moz-radial-gradient":
					case "-o-radial-gradient":
						n = {
							type: "circle",
							x0: 0,
							y0: 0,
							x1: t.width,
							y1: t.height,
							cx: 0,
							cy: 0,
							rx: 0,
							ry: 0,
							colorStops: []
						}, a = o[2].match(/(\d{1,3})%?\s(\d{1,3})%?/), a && (n.cx = a[1] * t.width / 100, n.cy = a[2] * t.height / 100), a = o[3].match(/\w+/), c = o[4].match(/[a-z\-]*/);
						if(a && c) switch(c[0]) {
							case "farthest-corner":
							case "cover":
							case "":
								h = Math.sqrt(Math.pow(n.cx, 2) + Math.pow(n.cy, 2)), p = Math.sqrt(Math.pow(n.cx, 2) + Math.pow(n.y1 - n.cy, 2)), d = Math.sqrt(Math.pow(n.x1 - n.cx, 2) + Math.pow(n.y1 - n.cy, 2)), v = Math.sqrt(Math.pow(n.x1 - n.cx, 2) + Math.pow(n.cy, 2)), n.rx = n.ry = Math.max(h, p, d, v);
								break;
							case "closest-corner":
								h = Math.sqrt(Math.pow(n.cx, 2) + Math.pow(n.cy, 2)), p = Math.sqrt(Math.pow(n.cx, 2) + Math.pow(n.y1 - n.cy, 2)), d = Math.sqrt(Math.pow(n.x1 - n.cx, 2) + Math.pow(n.y1 - n.cy, 2)), v = Math.sqrt(Math.pow(n.x1 - n.cx, 2) + Math.pow(n.cy, 2)), n.rx = n.ry = Math.min(h, p, d, v);
								break;
							case "farthest-side":
								a[0] === "circle" ? n.rx = n.ry = Math.max(n.cx, n.cy, n.x1 - n.cx, n.y1 - n.cy) : (n.type = a[0], n.rx = Math.max(n.cx, n.x1 - n.cx), n.ry = Math.max(n.cy, n.y1 - n.cy));
								break;
							case "closest-side":
							case "contain":
								a[0] === "circle" ? n.rx = n.ry = Math.min(n.cx, n.cy, n.x1 - n.cx, n.y1 - n.cy) : (n.type = a[0], n.rx = Math.min(n.cx, n.x1 - n.cx), n.ry = Math.min(n.cy, n.y1 - n.cy))
						}
						a = o[5].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\)(?:\s\d{1,3}(?:%|px))?)+/g);
						if(a) {
							f = a.length, l = 1 / Math.max(f - 1, 1);
							for(r = 0; r < f; r += 1) c = a[r].match(/((?:rgb|rgba)\(\d{1,3},\s\d{1,3},\s\d{1,3}(?:,\s[0-9\.]+)?\))\s*(\d{1,3})?(%|px)?/), c[2] ? (u = parseFloat(c[2]), c[3] === "%" ? u /= 100 : u /= t.width) : u = r * l, n.colorStops.push({
								color: c[1],
								stop: u
							})
						}
				}
				return n
			}, r.Gradient = function(n, r) {
				if(r.width === 0 || r.height === 0) return;
				var i = t.createElement("canvas"),
					s = i.getContext("2d"),
					o, u;
				i.width = r.width, i.height = r.height, o = f.Generate.parseGradient(n, r);
				if(o) switch(o.type) {
					case "linear":
						u = s.createLinearGradient(o.x0, o.y0, o.x1, o.y1), o.colorStops.forEach(e(u)), s.fillStyle = u, s.fillRect(0, 0, r.width, r.height);
						break;
					case "circle":
						u = s.createRadialGradient(o.cx, o.cy, 0, o.cx, o.cy, o.rx), o.colorStops.forEach(e(u)), s.fillStyle = u, s.fillRect(0, 0, r.width, r.height);
						break;
					case "ellipse":
						var a = t.createElement("canvas"),
							l = a.getContext("2d"),
							c = Math.max(o.rx, o.ry),
							h = c * 2;
						a.width = a.height = h, u = l.createRadialGradient(o.rx, o.ry, 0, o.rx, o.ry, c), o.colorStops.forEach(e(u)), l.fillStyle = u, l.fillRect(0, 0, h, h), s.fillStyle = o.colorStops[o.colorStops.length - 1].color, s.fillRect(0, 0, i.width, i.height), s.drawImage(a, o.cx - o.rx, o.cy - o.ry, 2 * o.rx, 2 * o.ry)
				}
				return i
			}, r.ListAlpha = function(e) {
				var t = "",
					n;
				do n = e % 26, t = String.fromCharCode(n + 64) + t, e /= 26; while (e * 26 > 26);
				return t
			}, r.ListRoman = function(e) {
				var t = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"],
					n = [1e3, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1],
					r = "",
					i, s = t.length;
				if(e <= 0 || e >= 4e3) return e;
				for(i = 0; i < s; i += 1)
					while(e >= n[i]) e -= n[i], r += t[i];
				return r
			}
		}(), f.Parse = function(r, i) {
			function s() {
				return Math.max(Math.max(lt.body.scrollWidth, lt.documentElement.scrollWidth), Math.max(lt.body.offsetWidth, lt.documentElement.offsetWidth), Math.max(lt.body.clientWidth, lt.documentElement.clientWidth))
			}

			function o() {
				return Math.max(Math.max(lt.body.scrollHeight, lt.documentElement.scrollHeight), Math.max(lt.body.offsetHeight, lt.documentElement.offsetHeight), Math.max(lt.body.clientHeight, lt.documentElement.clientHeight))
			}

			function l(e, t) {
				var n = parseInt(vt(e, t), 10);
				return isNaN(n) ? 0 : n
			}

			function c(e, t, n, r, i, s) {
				s !== "transparent" && (e.setVariable("fillStyle", s), e.fillRect(t, n, r, i), ft += 1)
			}

			function h(e, t, n) {
				if(e.length > 0) return t + n.toUpperCase()
			}

			function p(e, t) {
				switch(t) {
					case "lowercase":
						return e.toLowerCase();
					case "capitalize":
						return e.replace(/(^|\s|:|-|\(|\))([a-z])/g, h);
					case "uppercase":
						return e.toUpperCase();
					default:
						return e
				}
			}

			function d(e) {
				return /^(normal|none|0px)$/.test(e)
			}

			function v(e, t, n, r) {
				e !== null && ct.trimText(e).length > 0 && (r.fillText(e, t, n), ft += 1)
			}

			function m(e, t, n, r) {
				var i = !1,
					s = vt(t, "fontWeight"),
					o = vt(t, "fontFamily"),
					u = vt(t, "fontSize"),
					a = ct.parseTextShadows(vt(t, "textShadow"));
				switch(parseInt(s, 10)) {
					case 401:
						s = "bold";
						break;
					case 400:
						s = "normal"
				}
				e.setVariable("fillStyle", r), e.setVariable("font", [vt(t, "fontStyle"), vt(t, "fontVariant"), s, u, o].join(" ")), e.setVariable("textAlign", i ? "right" : "left"), a.length && (e.setVariable("shadowColor", a[0].color), e.setVariable("shadowOffsetX", a[0].offsetX), e.setVariable("shadowOffsetY", a[0].offsetY), e.setVariable("shadowBlur", a[0].blur));
				if(n !== "none") return ct.Font(o, u, lt)
			}

			function g(e, t, n, r, i) {
				switch(t) {
					case "underline":
						c(e, n.left, Math.round(n.top + r.baseline + r.lineWidth), n.width, 1, i);
						break;
					case "overline":
						c(e, n.left, Math.round(n.top), n.width, 1, i);
						break;
					case "line-through":
						c(e, n.left, Math.ceil(n.top + r.middle + r.lineWidth), n.width, 1, i)
				}
			}

			function y(e, t, n, r, i) {
				var s;
				if(ht.rangeBounds && !i) {
					if(n !== "none" || ct.trimText(t).length !== 0) s = b(t, e.node, e.textOffset);
					e.textOffset += t.length
				} else if(e.node && typeof e.node.nodeValue == "string") {
					var o = r ? e.node.splitText(t.length) : null;
					s = w(e.node, i), e.node = o
				}
				return s
			}

			function b(e, t, n) {
				var r = lt.createRange();
				return r.setStart(t, n), r.setEnd(t, n + e.length), r.getBoundingClientRect()
			}

			function w(e, t) {
				var n = e.parentNode,
					r = lt.createElement("wrapper"),
					i = e.cloneNode(!0);
				r.appendChild(e.cloneNode(!0)), n.replaceChild(r, e);
				var s = t ? ct.OffsetBounds(r) : ct.Bounds(r);
				return n.replaceChild(i, r), s
			}

			function E(e, t, n) {
				var r = n.ctx,
					s = vt(e, "color"),
					o = vt(e, "textDecoration"),
					u = vt(e, "textAlign"),
					a, f, l = {
						node: t,
						textOffset: 0
					};
				ct.trimText(t.nodeValue).length > 0 && (t.nodeValue = p(t.nodeValue, vt(e, "textTransform")), u = u.replace(["-webkit-auto"], ["auto"]), f = !i.letterRendering && /^(left|right|justify|auto)$/.test(u) && d(vt(e, "letterSpacing")) ? t.nodeValue.split(/(\b| )/) : t.nodeValue.split(""), a = m(r, e, o, s), i.chinese && f.forEach(function(e, t) {
					/.*[\u4E00-\u9FA5].*$/.test(e) && (e = e.split(""), e.unshift(t, 1), f.splice.apply(f, e))
				}), f.forEach(function(e, t) {
					var i = y(l, e, o, t < f.length - 1, n.transform.matrix);
					i && (v(e, i.left, i.bottom, r), g(r, o, i, a, s))
				}))
			}

			function S(e, t) {
				var n = lt.createElement("boundelement"),
					r, i;
				return n.style.display = "inline", r = e.style.listStyleType, e.style.listStyleType = "none", n.appendChild(lt.createTextNode(t)), e.insertBefore(n, e.firstChild), i = ct.Bounds(n), e.removeChild(n), e.style.listStyleType = r, i
			}

			function x(e) {
				var t = -1,
					n = 1,
					r = e.parentNode.childNodes;
				if(e.parentNode) {
					while(r[++t] !== e) r[t].nodeType === 1 && n++;
					return n
				}
				return -1
			}

			function T(e, t) {
				var n = x(e),
					r;
				switch(t) {
					case "decimal":
						r = n;
						break;
					case "decimal-leading-zero":
						r = n.toString().length === 1 ? n = "0" + n.toString() : n.toString();
						break;
					case "upper-roman":
						r = f.Generate.ListRoman(n);
						break;
					case "lower-roman":
						r = f.Generate.ListRoman(n).toLowerCase();
						break;
					case "lower-alpha":
						r = f.Generate.ListAlpha(n).toLowerCase();
						break;
					case "upper-alpha":
						r = f.Generate.ListAlpha(n)
				}
				return r + ". "
			}

			function N(e, t, n) {
				var r, i, s = t.ctx,
					o = vt(e, "listStyleType"),
					u;
				if(/^(decimal|decimal-leading-zero|upper-alpha|upper-latin|upper-roman|lower-alpha|lower-greek|lower-latin|lower-roman)$/i.test(o)) {
					i = T(e, o), u = S(e, i), m(s, e, "none", vt(e, "color"));
					if(vt(e, "listStylePosition") !== "inside") return;
					s.setVariable("textAlign", "left"), r = n.left, v(i, r, u.bottom, s)
				}
			}

			function C(e) {
				var t = r[e];
				return t && t.succeeded === !0 ? t.img : !1
			}

			function k(e, t) {
				var n = Math.max(e.left, t.left),
					r = Math.max(e.top, t.top),
					i = Math.min(e.left + e.width, t.left + t.width),
					s = Math.min(e.top + e.height, t.top + t.height);
				return {
					left: n,
					top: r,
					width: i - n,
					height: s - r
				}
			}

			function L(e, t, n) {
				var r, i = t.cssPosition !== "static",
					s = i ? vt(e, "zIndex") : "auto",
					o = vt(e, "opacity"),
					u = vt(e, "cssFloat") !== "none";
				t.zIndex = r = a(s), r.isPositioned = i, r.isFloated = u, r.opacity = o, r.ownStacking = s !== "auto" || o < 1, n && n.zIndex.children.push(t)
			}

			function A(e, t, n, r, i) {
				var s = l(t, "paddingLeft"),
					o = l(t, "paddingTop"),
					u = l(t, "paddingRight"),
					a = l(t, "paddingBottom");
				R(e, n, 0, 0, n.width, n.height, r.left + s + i[3].width, r.top + o + i[0].width, r.width - (i[1].width + i[3].width + s + u), r.height - (i[0].width + i[2].width + o + a))
			}

			function O(e) {
				return ["Top", "Right", "Bottom", "Left"].map(function(t) {
					return {
						width: l(e, "border" + t + "Width"),
						color: vt(e, "border" + t + "Color")
					}
				})
			}

			function M(e) {
				return ["TopLeft", "TopRight", "BottomRight", "BottomLeft"].map(function(t) {
					return vt(e, "border" + t + "Radius")
				})
			}

			function _(e, t, n, r) {
				var i = function(e, t, n) {
					return {
						x: e.x + (t.x - e.x) * n,
						y: e.y + (t.y - e.y) * n
					}
				};
				return {
					start: e,
					startControl: t,
					endControl: n,
					end: r,
					subdivide: function(s) {
						var o = i(e, t, s),
							u = i(t, n, s),
							a = i(n, r, s),
							f = i(o, u, s),
							l = i(u, a, s),
							c = i(f, l, s);
						return [_(e, o, f, c), _(c, l, a, r)]
					},
					curveTo: function(e) {
						e.push(["bezierCurve", t.x, t.y, n.x, n.y, r.x, r.y])
					},
					curveToReversed: function(r) {
						r.push(["bezierCurve", n.x, n.y, t.x, t.y, e.x, e.y])
					}
				}
			}

			function D(e, t, n, r, i, s, o) {
				t[0] > 0 || t[1] > 0 ? (e.push(["line", r[0].start.x, r[0].start.y]), r[0].curveTo(e), r[1].curveTo(e)) : e.push(["line", s, o]), (n[0] > 0 || n[1] > 0) && e.push(["line", i[0].start.x, i[0].start.y])
			}

			function P(e, t, n, r, i, s, o) {
				var u = [];
				return t[0] > 0 || t[1] > 0 ? (u.push(["line", r[1].start.x, r[1].start.y]), r[1].curveTo(u)) : u.push(["line", e.c1[0], e.c1[1]]), n[0] > 0 || n[1] > 0 ? (u.push(["line", s[0].start.x, s[0].start.y]), s[0].curveTo(u), u.push(["line", o[0].end.x, o[0].end.y]), o[0].curveToReversed(u)) : (u.push(["line", e.c2[0], e.c2[1]]), u.push(["line", e.c3[0], e.c3[1]])), t[0] > 0 || t[1] > 0 ? (u.push(["line", i[1].end.x, i[1].end.y]), i[1].curveToReversed(u)) : u.push(["line", e.c4[0], e.c4[1]]), u
			}

			function H(e, t, n) {
				var r = e.left,
					i = e.top,
					s = e.width,
					o = e.height,
					u = t[0][0],
					a = t[0][1],
					f = t[1][0],
					l = t[1][1],
					c = t[2][0],
					h = t[2][1],
					p = t[3][0],
					d = t[3][1],
					v = s - f,
					m = o - h,
					g = s - c,
					y = o - d;
				return {
					topLeftOuter: yt(r, i, u, a).topLeft.subdivide(.5),
					topLeftInner: yt(r + n[3].width, i + n[0].width, Math.max(0, u - n[3].width), Math.max(0, a - n[0].width)).topLeft.subdivide(.5),
					topRightOuter: yt(r + v, i, f, l).topRight.subdivide(.5),
					topRightInner: yt(r + Math.min(v, s + n[3].width), i + n[0].width, v > s + n[3].width ? 0 : f - n[3].width, l - n[0].width).topRight.subdivide(.5),
					bottomRightOuter: yt(r + g, i + m, c, h).bottomRight.subdivide(.5),
					bottomRightInner: yt(r + Math.min(g, s + n[3].width), i + Math.min(m, o + n[0].width), Math.max(0, c - n[1].width), Math.max(0, h - n[2].width)).bottomRight.subdivide(.5),
					bottomLeftOuter: yt(r, i + y, p, d).bottomLeft.subdivide(.5),
					bottomLeftInner: yt(r + n[3].width, i + y, Math.max(0, p - n[3].width), Math.max(0, d - n[2].width)).bottomLeft.subdivide(.5)
				}
			}

			function B(e, t, n, r, i) {
				var s = vt(e, "backgroundClip"),
					o = [];
				switch(s) {
					case "content-box":
					case "padding-box":
						D(o, r[0], r[1], t.topLeftInner, t.topRightInner, i.left + n[3].width, i.top + n[0].width), D(o, r[1], r[2], t.topRightInner, t.bottomRightInner, i.left + i.width - n[1].width, i.top + n[0].width), D(o, r[2], r[3], t.bottomRightInner, t.bottomLeftInner, i.left + i.width - n[1].width, i.top + i.height - n[2].width), D(o, r[3], r[0], t.bottomLeftInner, t.topLeftInner, i.left + n[3].width, i.top + i.height - n[2].width);
						break;
					default:
						D(o, r[0], r[1], t.topLeftOuter, t.topRightOuter, i.left, i.top), D(o, r[1], r[2], t.topRightOuter, t.bottomRightOuter, i.left + i.width, i.top), D(o, r[2], r[3], t.bottomRightOuter, t.bottomLeftOuter, i.left + i.width, i.top + i.height), D(o, r[3], r[0], t.bottomLeftOuter, t.topLeftOuter, i.left, i.top + i.height)
				}
				return o
			}

			function j(e, t, n) {
				var r = t.left,
					i = t.top,
					s = t.width,
					o = t.height,
					u, a, f, l, c, h, p = M(e),
					d = H(t, p, n),
					v = {
						clip: B(e, d, n, p, t),
						borders: []
					};
				for(u = 0; u < 4; u++)
					if(n[u].width > 0) {
						a = r, f = i, l = s, c = o - n[2].width;
						switch(u) {
							case 0:
								c = n[0].width, h = P({
									c1: [a, f],
									c2: [a + l, f],
									c3: [a + l - n[1].width, f + c],
									c4: [a + n[3].width, f + c]
								}, p[0], p[1], d.topLeftOuter, d.topLeftInner, d.topRightOuter, d.topRightInner);
								break;
							case 1:
								a = r + s - n[1].width, l = n[1].width, h = P({
									c1: [a + l, f],
									c2: [a + l, f + c + n[2].width],
									c3: [a, f + c],
									c4: [a, f + n[0].width]
								}, p[1], p[2], d.topRightOuter, d.topRightInner, d.bottomRightOuter, d.bottomRightInner);
								break;
							case 2:
								f = f + o - n[2].width, c = n[2].width, h = P({
									c1: [a + l, f + c],
									c2: [a, f + c],
									c3: [a + n[3].width, f],
									c4: [a + l - n[3].width, f]
								}, p[2], p[3], d.bottomRightOuter, d.bottomRightInner, d.bottomLeftOuter, d.bottomLeftInner);
								break;
							case 3:
								l = n[3].width, h = P({
									c1: [a, f + c + n[2].width],
									c2: [a, f],
									c3: [a + l, f + n[0].width],
									c4: [a + l, f + c]
								}, p[3], p[0], d.bottomLeftOuter, d.bottomLeftInner, d.topLeftOuter, d.topLeftInner)
						}
						v.borders.push({
							args: h,
							color: n[u].color
						})
					}
				return v
			}

			function F(e, t) {
				var n = e.drawShape();
				return t.forEach(function(e, t) {
					n[t === 0 ? "moveTo" : e[0] + "To"].apply(null, e.slice(1))
				}), n
			}

			function I(e, t, n) {
				n !== "transparent" && (e.setVariable("fillStyle", n), F(e, t), e.fill(), ft += 1)
			}

			function q(e, t, n) {
				var r = lt.createElement("valuewrap"),
					i = ["lineHeight", "textAlign", "fontFamily", "color", "fontSize", "paddingLeft", "paddingTop", "width", "height", "border", "borderLeftWidth", "borderTopWidth"],
					s, o;
				i.forEach(function(t) {
					try {
						r.style[t] = vt(e, t)
					} catch(n) {
						ct.log("html2canvas: Parse: Exception caught in renderFormValue: " + n.message)
					}
				}), r.style.borderColor = "black", r.style.borderStyle = "solid", r.style.display = "block", r.style.position = "absolute";
				if(/^(submit|reset|button|text|password)$/.test(e.type) || e.nodeName === "SELECT") r.style.lineHeight = vt(e, "height");
				r.style.top = t.top + "px", r.style.left = t.left + "px", s = e.nodeName === "SELECT" ? (e.options[e.selectedIndex] || 0).text : e.value, s || (s = e.placeholder), o = lt.createTextNode(s), r.appendChild(o), dt.appendChild(r), E(e, o, n), dt.removeChild(r)
			}

			function R(e) {
				e.drawImage.apply(e, Array.prototype.slice.call(arguments, 1)), ft += 1
			}

			function U(n, r) {
				var i = e.getComputedStyle(n, r);
				if(!i || !i.content || i.content === "none" || i.content === "-moz-alt-content" || i.display === "none") return;
				var s = i.content + "",
					o = s.substr(0, 1);
				o === s.substr(s.length - 1) && o.match(/'|"/) && (s = s.substr(1, s.length - 2));
				var u = s.substr(0, 3) === "url",
					a = t.createElement(u ? "img" : "span");
				return a.className = mt + "-before " + mt + "-after", Object.keys(i).filter(z).forEach(function(e) {
					try {
						a.style[e] = i[e]
					} catch(t) {
						ct.log(["Tried to assign readonly property ", e, "Error:", t])
					}
				}), u ? a.src = ct.parseBackgroundImage(s)[0].args[0] : a.innerHTML = s, a
			}

			function z(t) {
				return isNaN(e.parseInt(t, 10))
			}

			function W(e, t) {
				var n = U(e, ":before"),
					r = U(e, ":after");
				if(!n && !r) return;
				n && (e.className += " " + mt + "-before", e.parentNode.insertBefore(n, e), st(n, t, !0), e.parentNode.removeChild(n), e.className = e.className.replace(mt + "-before", "").trim()), r && (e.className += " " + mt + "-after", e.appendChild(r), st(r, t, !0), e.removeChild(r), e.className = e.className.replace(mt + "-after", "").trim())
			}

			function X(e, t, n, r) {
				var i = Math.round(r.left + n.left),
					s = Math.round(r.top + n.top);
				e.createPattern(t), e.translate(i, s), e.fill(), e.translate(-i, -s)
			}

			function V(e, t, n, r, i, s, o, u) {
				var a = [];
				a.push(["line", Math.round(i), Math.round(s)]), a.push(["line", Math.round(i + o), Math.round(s)]), a.push(["line", Math.round(i + o), Math.round(u + s)]), a.push(["line", Math.round(i), Math.round(u + s)]), F(e, a), e.save(), e.clip(), X(e, t, n, r), e.restore()
			}

			function $(e, t, n) {
				c(e, t.left, t.top, t.width, t.height, n)
			}

			function J(e, t, n, r, i) {
				var s = ct.BackgroundSize(e, t, r, i),
					o = ct.BackgroundPosition(e, t, r, i, s),
					u = vt(e, "backgroundRepeat").split(",").map(ct.trimText);
				r = Q(r, s), u = u[i] || u[0];
				switch(u) {
					case "repeat-x":
						V(n, r, o, t, t.left, t.top + o.top, 99999, r.height);
						break;
					case "repeat-y":
						V(n, r, o, t, t.left + o.left, t.top, r.width, 99999);
						break;
					case "no-repeat":
						V(n, r, o, t, t.left + o.left, t.top + o.top, r.width, r.height);
						break;
					default:
						X(n, r, o, {
							top: t.top,
							left: t.left,
							width: r.width,
							height: r.height
						})
				}
			}

			function K(e, t, n) {
				var r = vt(e, "backgroundImage"),
					i = ct.parseBackgroundImage(r),
					s, o = i.length;
				while(o--) {
					r = i[o];
					if(!r.args || r.args.length === 0) continue;
					var u = r.method === "url" ? r.args[0] : r.value;
					s = C(u), s ? J(e, t, n, s, o) : ct.log("html2canvas: Error loading background:", r)
				}
			}

			function Q(e, t) {
				if(e.width === t.width && e.height === t.height) return e;
				var n, r = lt.createElement("canvas");
				return r.width = t.width, r.height = t.height, n = r.getContext("2d"), R(n, e, 0, 0, e.width, e.height, 0, 0, t.width, t.height), r
			}

			function G(e, t, n) {
				return e.setVariable("globalAlpha", vt(t, "opacity") * (n ? n.opacity : 1))
			}

			function Y(e) {
				return e.replace("px", "")
			}

			function Z(e, t) {
				var n = vt(e, "transform") || vt(e, "-webkit-transform") || vt(e, "-moz-transform") || vt(e, "-ms-transform") || vt(e, "-o-transform"),
					r = vt(e, "transform-origin") || vt(e, "-webkit-transform-origin") || vt(e, "-moz-transform-origin") || vt(e, "-ms-transform-origin") || vt(e, "-o-transform-origin") || "0px 0px";
				r = r.split(" ").map(Y).map(ct.asFloat);
				var i;
				if(n && n !== "none") {
					var s = n.match(bt);
					if(s) switch(s[1]) {
						case "matrix":
							i = s[2].split(",").map(ct.trimText).map(ct.asFloat)
					}
				}
				return {
					origin: r,
					matrix: i
				}
			}

			function et(e, t, n, r) {
				var a = u(t ? n.width : s(), t ? n.height : o()),
					f = {
						ctx: a,
						opacity: G(a, e, t),
						cssPosition: vt(e, "position"),
						borders: O(e),
						transform: r,
						clip: t && t.clip ? ct.Extend({}, t.clip) : null
					};
				return L(e, f, t), i.useOverflow === !0 && /(hidden|scroll|auto)/.test(vt(e, "overflow")) === !0 && /(BODY)/i.test(e.nodeName) === !1 && (f.clip = f.clip ? k(f.clip, n) : n), f
			}

			function tt(e, t, n) {
				var r = {
					left: t.left + e[3].width,
					top: t.top + e[0].width,
					width: t.width - (e[1].width + e[3].width),
					height: t.height - (e[0].width + e[2].width)
				};
				return n && (r = k(r, n)), r
			}

			function nt(e, t) {
				var n = t.matrix ? ct.OffsetBounds(e) : ct.Bounds(e);
				return t.origin[0] += n.left, t.origin[1] += n.top, n
			}

			function rt(e, t, n, r) {
				var i = Z(e, t),
					s = nt(e, i),
					o, u = et(e, t, s, i),
					a = u.borders,
					f = u.ctx,
					l = tt(a, s, u.clip),
					c = j(e, s, a),
					h = pt.test(e.nodeName) ? "#efefef" : vt(e, "backgroundColor");
				F(f, c.clip), f.save(), f.clip(), l.height > 0 && l.width > 0 && !r ? ($(f, s, h), K(e, l, f)) : r && (u.backgroundColor = h), f.restore(), c.borders.forEach(function(e) {
					I(f, e.args, e.color)
				}), n || W(e, u);
				switch(e.nodeName) {
					case "IMG":
						(o = C(e.getAttribute("src"))) ? A(f, e, o, s, a): ct.log("html2canvas: Error loading <img>:" + e.getAttribute("src"));
						break;
					case "INPUT":
						/^(text|url|email|submit|button|reset)$/.test(e.type) && (e.value || e.placeholder || "").length > 0 && q(e, s, u);
						break;
					case "TEXTAREA":
						(e.value || e.placeholder || "").length > 0 && q(e, s, u);
						break;
					case "SELECT":
						(e.options || e.placeholder || "").length > 0 && q(e, s, u);
						break;
					case "LI":
						N(e, u, l);
						break;
					case "CANVAS":
						A(f, e, e, s, a)
				}
				return u
			}

			function it(e) {
				return vt(e, "display") !== "none" && vt(e, "visibility") !== "hidden" && !e.hasAttribute("data-html2canvas-ignore")
			}

			function st(e, t, n) {
				it(e) && (t = rt(e, t, n, !1) || t, pt.test(e.nodeName) || ot(e, t, n))
			}

			function ot(e, t, n) {
				ct.Children(e).forEach(function(r) {
					r.nodeType === r.ELEMENT_NODE ? st(r, t, n) : r.nodeType === r.TEXT_NODE && E(e, r, t)
				})
			}

			function ut() {
				var e = vt(t.documentElement, "backgroundColor"),
					n = ct.isTransparent(e) && at === t.body,
					r = rt(at, null, !1, n);
				return ot(at, r), n && (e = r.backgroundColor), dt.removeChild(gt), {
					backgroundColor: e,
					stack: r
				}
			}
			e.scroll(0, 0);
			var at = i.elements === n ? t.body : i.elements[0],
				ft = 0,
				lt = at.ownerDocument,
				ct = f.Util,
				ht = ct.Support(i, lt),
				pt = new RegExp("(" + i.ignoreElements + ")"),
				dt = lt.body,
				vt = ct.getCSS,
				mt = "___html2canvas___pseudoelement",
				gt = lt.createElement("style");
			gt.innerHTML = "." + mt + '-before:before { content: "" !important; display: none !important; }' + "." + mt + '-after:after { content: "" !important; display: none !important; }', dt.appendChild(gt), r = r || {};
			var yt = function(e) {
					return function(t, n, r, i) {
						var s = r * e,
							o = i * e,
							u = t + r,
							a = n + i;
						return {
							topLeft: _({
								x: t,
								y: a
							}, {
								x: t,
								y: a - o
							}, {
								x: u - s,
								y: n
							}, {
								x: u,
								y: n
							}),
							topRight: _({
								x: t,
								y: n
							}, {
								x: t + s,
								y: n
							}, {
								x: u,
								y: a - o
							}, {
								x: u,
								y: a
							}),
							bottomRight: _({
								x: u,
								y: n
							}, {
								x: u,
								y: n + o
							}, {
								x: t + s,
								y: a
							}, {
								x: t,
								y: a
							}),
							bottomLeft: _({
								x: u,
								y: a
							}, {
								x: u - s,
								y: a
							}, {
								x: t,
								y: n + o
							}, {
								x: t,
								y: n
							})
						}
					}
				}(4 * ((Math.sqrt(2) - 1) / 3)),
				bt = /(matrix)\((.+)\)/;
			return ut()
		}, f.Preload = function(r) {
			function i(e) {
				N.href = e, N.href = N.href;
				var t = N.protocol + N.host;
				return t === m
			}

			function s() {
				g.log("html2canvas: start: images: " + v.numLoaded + " / " + v.numTotal + " (failed: " + v.numFailed + ")"), !v.firstRun && v.numLoaded >= v.numTotal && (g.log("Finished loading images: # " + v.numTotal + " (failed: " + v.numFailed + ")"), typeof r.complete == "function" && r.complete(v))
			}

			function o(t, i, o) {
				var u, a = r.proxy,
					f;
				N.href = t, t = N.href, u = "html2canvas_" + w++, o.callbackname = u, a.indexOf("?") > -1 ? a += "&" : a += "?", a += "url=" + encodeURIComponent(t) + "&callback=" + u, f = S.createElement("script"), e[u] = function(t) {
					t.substring(0, 6) === "error:" ? (o.succeeded = !1, v.numLoaded++, v.numFailed++, s()) : (d(i, o), i.src = t), e[u] = n;
					try {
						delete e[u]
					} catch(r) {}
					f.parentNode.removeChild(f), f = null, delete o.script, delete o.callbackname
				}, f.setAttribute("type", "text/javascript"), f.setAttribute("src", a), o.script = f, e.document.body.appendChild(f)
			}

			function u(t, n) {
				var r = e.getComputedStyle(t, n),
					i = r.content;
				i.substr(0, 3) === "url" && y.loadImage(f.Util.parseBackgroundImage(i)[0].args[0]), h(r.backgroundImage, t)
			}

			function a(e) {
				u(e, ":before"), u(e, ":after")
			}

			function l(e, t) {
				var r = f.Generate.Gradient(e, t);
				r !== n && (v[e] = {
					img: r,
					succeeded: !0
				}, v.numTotal++, v.numLoaded++, s())
			}

			function c(e) {
				return e && e.method && e.args && e.args.length > 0
			}

			function h(e, t) {
				var r;
				f.Util.parseBackgroundImage(e).filter(c).forEach(function(e) {
					e.method === "url" ? y.loadImage(e.args[0]) : e.method.match(/\-?gradient$/) && (r === n && (r = f.Util.Bounds(t)), l(e.value, r))
				})
			}

			function p(e) {
				var t = !1;
				try {
					g.Children(e).forEach(p)
				} catch(r) {}
				try {
					t = e.nodeType
				} catch(i) {
					t = !1, g.log("html2canvas: failed to access some element's nodeType - Exception: " + i.message)
				}
				if(t === 1 || t === n) {
					a(e);
					try {
						h(g.getCSS(e, "backgroundImage"), e)
					} catch(r) {
						g.log("html2canvas: failed to get background-image - Exception: " + r.message)
					}
					h(e)
				}
			}

			function d(t, i) {
				t.onload = function() {
					i.timer !== n && e.clearTimeout(i.timer), v.numLoaded++, i.succeeded = !0, t.onerror = t.onload = null, s()
				}, t.onerror = function() {
					if(t.crossOrigin === "anonymous") {
						e.clearTimeout(i.timer);
						if(r.proxy) {
							var n = t.src;
							t = new Image, i.img = t, t.src = n, o(t.src, t, i);
							return
						}
					}
					v.numLoaded++, v.numFailed++, i.succeeded = !1, t.onerror = t.onload = null, s()
				}
			}
			var v = {
					numLoaded: 0,
					numFailed: 0,
					numTotal: 0,
					cleanupDone: !1
				},
				m, g = f.Util,
				y, b, w = 0,
				E = r.elements[0] || t.body,
				S = E.ownerDocument,
				x = E.getElementsByTagName("img"),
				T = x.length,
				N = S.createElement("a"),
				C = function(e) {
					return e.crossOrigin !== n
				}(new Image),
				k;
			N.href = e.location.href, m = N.protocol + N.host, y = {
				loadImage: function(e) {
					var t, s;
					e && v[e] === n && (t = new Image, e.match(/data:image\/.*;base64,/i) ? (t.src = e.replace(/url\(['"]{0,}|['"]{0,}\)$/ig, ""), s = v[e] = {
						img: t
					}, v.numTotal++, d(t, s)) : i(e) || r.allowTaint === !0 ? (s = v[e] = {
						img: t
					}, v.numTotal++, d(t, s), t.src = e) : C && !r.allowTaint && r.useCORS ? (t.crossOrigin = "anonymous", s = v[e] = {
						img: t
					}, v.numTotal++, d(t, s), t.src = e) : r.proxy && (s = v[e] = {
						img: t
					}, v.numTotal++, o(e, t, s)))
				},
				cleanupDOM: function(i) {
					var o, u;
					if(!v.cleanupDone) {
						i && typeof i == "string" ? g.log("html2canvas: Cleanup because: " + i) : g.log("html2canvas: Cleanup after timeout: " + r.timeout + " ms.");
						for(u in v)
							if(v.hasOwnProperty(u)) {
								o = v[u];
								if(typeof o == "object" && o.callbackname && o.succeeded === n) {
									e[o.callbackname] = n;
									try {
										delete e[o.callbackname]
									} catch(a) {}
									o.script && o.script.parentNode && (o.script.setAttribute("src", "about:blank"), o.script.parentNode.removeChild(o.script)), v.numLoaded++, v.numFailed++, g.log("html2canvas: Cleaned up failed img: '" + u + "' Steps: " + v.numLoaded + " / " + v.numTotal)
								}
							}
						e.stop !== n ? e.stop() : t.execCommand !== n && t.execCommand("Stop", !1), t.close !== n && t.close(), v.cleanupDone = !0, (!i || typeof i != "string") && s()
					}
				},
				renderingDone: function() {
					k && e.clearTimeout(k)
				}
			}, r.timeout > 0 && (k = e.setTimeout(y.cleanupDOM, r.timeout)), g.log("html2canvas: Preload starts: finding background-images"), v.firstRun = !0, p(E), g.log("html2canvas: Preload: Finding images");
			for(b = 0; b < T; b += 1) y.loadImage(x[b].getAttribute("src"));
			return v.firstRun = !1, g.log("html2canvas: Preload: Done."), v.numTotal === v.numLoaded && s(), y
		}, f.Renderer = function(e, r) {
			function i(e) {
				function t(e) {
					Object.keys(e).sort().forEach(function(n) {
						var i = [],
							s = [],
							o = [],
							u = [];
						e[n].forEach(function(e) {
								e.node.zIndex.isPositioned || e.node.zIndex.opacity < 1 ? o.push(e) : e.node.zIndex.isFloated ? s.push(e) : i.push(e)
							}),
							function a(e) {
								e.forEach(function(e) {
									u.push(e), e.children && a(e.children)
								})
							}(i.concat(s, o)), u.forEach(function(e) {
								e.context ? t(e.context) : r.push(e.node)
							})
					})
				}
				var r = [],
					i;
				return i = function(e) {
					function t(e, r, i) {
						var s = r.zIndex.zindex === "auto" ? 0 : Number(r.zIndex.zindex),
							o = e,
							u = r.zIndex.isPositioned,
							a = r.zIndex.isFloated,
							f = {
								node: r
							},
							l = i;
						if(r.zIndex.ownStacking) o = f.context = {
							"!": [{
								node: r,
								children: []
							}]
						}, l = n;
						else if(u || a) l = f.children = [];
						s === 0 && i ? i.push(f) : (e[s] || (e[s] = []), e[s].push(f)), r.zIndex.children.forEach(function(e) {
							t(o, e, l)
						})
					}
					var r = {};
					return t(r, e), r
				}(e), t(i), r
			}

			function s(e) {
				var t;
				if(typeof r.renderer == "string" && f.Renderer[e] !== n) t = f.Renderer[e](r);
				else {
					if(typeof e != "function") throw new Error("Unknown renderer");
					t = e(r)
				}
				if(typeof t != "function") throw new Error("Invalid renderer defined");
				return t
			}
			return s(r.renderer)(e, r, t, i(e.stack), f)
		}, f.Util.Support = function(e, t) {
			function r() {
				var e = new Image,
					r = t.createElement("canvas"),
					i = r.getContext === n ? !1 : r.getContext("2d");
				if(i === !1) return !1;
				r.width = r.height = 10, e.src = ["data:image/svg+xml,", "<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10'>", "<foreignObject width='10' height='10'>", "<div xmlns='http://www.w3.org/1999/xhtml' style='width:10;height:10;'>", "sup", "</div>", "</foreignObject>", "</svg>"].join("");
				try {
					i.drawImage(e, 0, 0), r.toDataURL()
				} catch(s) {
					return !1
				}
				return f.Util.log("html2canvas: Parse: SVG powered rendering available"), !0
			}

			function i() {
				var e, n, r, i, s = !1;
				return t.createRange && (e = t.createRange(), e.getBoundingClientRect && (n = t.createElement("boundtest"), n.style.height = "123px", n.style.display = "block", t.body.appendChild(n), e.selectNode(n), r = e.getBoundingClientRect(), i = r.height, i === 123 && (s = !0), t.body.removeChild(n))), s
			}
			return {
				rangeBounds: i(),
				svgRendering: e.svgRendering && r()
			}
		}, e.html2canvas = function(t, n) {
			t = t.length ? t : [t];
			var r, i, s = {
				logging: !1,
				elements: t,
				background: "#fff",
				proxy: null,
				timeout: 0,
				useCORS: !1,
				allowTaint: !1,
				svgRendering: !1,
				ignoreElements: "IFRAME|OBJECT|PARAM",
				useOverflow: !0,
				letterRendering: !1,
				chinese: !1,
				width: null,
				height: null,
				taintTest: !0,
				renderer: "Canvas"
			};
			return s = f.Util.Extend(n, s), f.logging = s.logging, s.complete = function(e) {
				if(typeof s.onpreloaded == "function" && s.onpreloaded(e) === !1) return;
				r = f.Parse(e, s);
				if(typeof s.onparsed == "function" && s.onparsed(r) === !1) return;
				i = f.Renderer(r, s), typeof s.onrendered == "function" && s.onrendered(i)
			}, e.setTimeout(function() {
				f.Preload(s)
			}, 0), {
				render: function(e, t) {
					return f.Renderer(e, f.Util.Extend(t, s))
				},
				parse: function(e, t) {
					return f.Parse(e, f.Util.Extend(t, s))
				},
				preload: function(e) {
					return f.Preload(f.Util.Extend(e, s))
				},
				log: f.Util.log
			}
		}, e.html2canvas.log = f.Util.log, e.html2canvas.Renderer = {
			Canvas: n
		}, f.Renderer.Canvas = function(e) {
			function r(e, t) {
				e.beginPath(), t.forEach(function(t) {
					e[t.name].apply(e, t.arguments)
				}), e.closePath()
			}

			function i(e) {
				if(u.indexOf(e.arguments[0].src) === -1) {
					l.drawImage(e.arguments[0], 0, 0);
					try {
						l.getImageData(0, 0, 1, 1)
					} catch(t) {
						return a = o.createElement("canvas"), l = a.getContext("2d"), !1
					}
					u.push(e.arguments[0].src)
				}
				return !0
			}

			function s(t, n) {
				switch(n.type) {
					case "variable":
						t[n.name] = n.arguments;
						break;
					case "function":
						switch(n.name) {
							case "createPattern":
								if(n.arguments[0].width > 0 && n.arguments[0].height > 0) try {
									t.fillStyle = t.createPattern(n.arguments[0], "repeat")
								} catch(s) {
									c.log("html2canvas: Renderer: Error creating pattern", s.message)
								}
								break;
							case "drawShape":
								r(t, n.arguments);
								break;
							case "drawImage":
								n.arguments[8] > 0 && n.arguments[7] > 0 && (!e.taintTest || e.taintTest && i(n)) && t.drawImage.apply(t, n.arguments);
								break;
							default:
								t[n.name].apply(t, n.arguments)
						}
				}
			}
			e = e || {};
			var o = t,
				u = [],
				a = t.createElement("canvas"),
				l = a.getContext("2d"),
				c = f.Util,
				h = e.canvas || o.createElement("canvas");
			return function(e, t, r, i, o) {
				var u = h.getContext("2d"),
					a, f, l, p = e.stack;
				return h.width = h.style.width = t.width || p.ctx.width, h.height = h.style.height = t.height || p.ctx.height, l = u.fillStyle, u.fillStyle = c.isTransparent(p.backgroundColor) && t.background !== n ? t.background : e.backgroundColor, u.fillRect(0, 0, h.width, h.height), u.fillStyle = l, i.forEach(function(e) {
					u.textBaseline = "bottom", u.save(), e.transform.matrix && (u.translate(e.transform.origin[0], e.transform.origin[1]), u.transform.apply(u, e.transform.matrix), u.translate(-e.transform.origin[0], -e.transform.origin[1])), e.clip && (u.beginPath(), u.rect(e.clip.left, e.clip.top, e.clip.width, e.clip.height), u.clip()), e.ctx.storage && e.ctx.storage.forEach(function(e) {
						s(u, e)
					}), u.restore()
				}), c.log("html2canvas: Renderer: Canvas renderer done - returning canvas obj"), t.elements.length === 1 && typeof t.elements[0] == "object" && t.elements[0].nodeName !== "BODY" ? (f = o.Util.Bounds(t.elements[0]), a = r.createElement("canvas"), a.width = Math.ceil(f.width), a.height = Math.ceil(f.height), u = a.getContext("2d"), u.drawImage(h, f.left, f.top, f.width, f.height, 0, 0, f.width, f.height), h = null, a) : h
			}
		}
})(window, document);
var detectEdge = function() {
	function e(e, t, s) {
		var o = n.createImageData(r, i),
			u = e.width,
			a = e.height,
			f = e.data,
			l = o.data,
			c = u * 4,
			h = c + 4,
			p = a - 1,
			d = u - 1,
			v = new Date;
		for(var m = 1; m < p; ++m) {
			var g = h - 4,
				y = g - c,
				b = g + c,
				w = -f[y] - f[g] - f[b],
				E = -f[++y] - f[++g] - f[++b],
				S = -f[++y] - f[++g] - f[++b],
				x = f[y += 2],
				T = f[g += 2],
				N = f[b += 2],
				C = -x - T - N,
				k = f[++y],
				L = f[++g],
				A = f[++b],
				O = -k - L - A,
				M = f[++y],
				_ = f[++g],
				D = f[++b],
				P = -M - _ - D;
			for(var H = 1; H < d; ++H) {
				g = h + 4, y = g - c, b = g + c;
				var B = t + w - x - T * -8 - N,
					j = t + E - k - L * -8 - A,
					F = t + S - M - _ * -8 - D;
				w = C, E = O, S = P, x = f[y], T = f[g], N = f[b], C = -x - T - N, k = f[++y], L = f[++g], A = f[++b], O = -k - L - A, M = f[++y], _ = f[++g], D = f[++b], P = -M - _ - D, s ? (factor = .3 * (B + C) + .59 * (j + O) + .11 * (F + P), l[h] = factor, l[++h] = factor, l[++h] = factor) : (l[h] = B + C, l[++h] = j + O, l[++h] = F + P), l[++h] = 255, ++h
			}
			h += 8
		}
		return o
	}

	function t(t) {
		var n = t.width,
			r = t.height,
			i = e(t, 255, 1),
			s = i.data,
			o = 0;
		for(var u = 0; u < r; ++u)
			for(var a = 0; a < n; ++a) s[o] < 240 ? (s[o] = 0, s[++o] = 0, s[++o] = 0) : (s[o] = 255, s[++o] = 255, s[++o] = 255), s[++o] = 255, ++o;
		return i
	}
	var n, r, i, s, o;
	return function(e) {
		r = e.width, i = e.height, o = new Array(r), s = new Array(r), n = e.getContext("2d");
		var u = n.getImageData(0, 0, r, i),
			a = t(u),
			f = a.data;
		for(var l = 0; l < r; l++) {
			s[l] = new Array(i), o[l] = new Array(i);
			for(var c = 0; c < i; c++) {
				o[l][c] = 0;
				var h = (c * r + l) * 4;
				f[h] < 255 || f[h + 1] < 255 || f[h + 2] < 255 ? (s[l][c] = !0, f[h] = f[h + 1] = f[h + 2] = 255) : f[h] = f[h + 1] = f[h + 2] = 0
			}
		}
		return n.putImageData(a, 0, 0), {
			dropPoints: s,
			dropCount: o,
			cw: r,
			ch: i
		}
	}
}();
Animation = function() {
	"use strict";

	function e(e, t) {
		e && typeof e == "function" && (i = e, s = t)
	}

	function t(e) {
		return window.requestAnimationFrame ? function() {
			window.requestAnimationFrame(e)
		} : window.msRequestAnimationFrame ? function() {
			window.msRequestAnimationFrame(e)
		} : window.webkitRequestAnimationFrame ? function() {
			window.webkitRequestAnimationFrame(e)
		} : window.mozRequestAnimationFrame ? function() {
			window.mozRequestAnimationFrame(e)
		} : function() {
			setTimeout(e, o)
		}
	}

	function n() {
		i(s), u()
	}

	function r() {
		u = t(n), u()
	}
	var i, s, o = 16.7,
		u;
	return {
		addFrameRenderer: e,
		start: r
	}
}(), Snowflakes = function() {
	"use strict";

	function e(e, n) {
		var r = new Image;
		r.onload = function() {
			for(var i = 0; i < h; i++) {
				var s = document.createElement("canvas");
				s.width = p, s.height = d;
				var a = s.getContext("2d");
				a.drawImage(r, i * p, 0, p, d, 0, 0, p, d), c.push(s)
			}
			e && (u = e), n || (o = []);
			for(var i = 0; i < u; i++) o.push(t())
		}, r.src = l
	}

	function t() {
		var e = Math.random() * (E - w) + w,
			t = Math.random() * v.width,
			n = Math.random() * v.height;
		return {
			x: t,
			y: n,
			vv: Math.random() * (g - m) + m,
			hv: Math.random() * (b - y) + y,
			sw: e * p,
			sh: e * d,
			hsw: e * p * .5,
			hsh: e * d * .5,
			mhd: Math.random() * (x - S) + S,
			hd: 0,
			hdi: Math.random() / (b * S),
			o: Math.random() * (N - T) + T,
			oi: Math.random() / C,
			si: Math.ceil(Math.random() * (h - 1)),
			nl: !1
		}
	}

	function n(e) {
		P.globalAlpha = e.o, P.drawImage(c[e.si], 0, 0, p, d, e.x, e.y, e.sw, e.sh)
	}

	function r() {
		for(var e = 0; e < o.length; e++) {
			var t = o[e],
				r = parseInt(t.x + t.hsw),
				i = parseInt(t.y + t.hsh);
			if(j[r] && j[r][i] && !F[r][i]) {
				var s = 0;
				F[r] && F[r][i - 1] && (s += 1), F[r + 1] && F[r + 1][i - 1] && (s += 1), F[r + 1] && F[r + 1][i] && (s += 1), F[r + 1] && F[r + 1][i + 1] && (s += 1), F[r] && F[r][i + 1] && (s += 1), F[r - 1] && F[r - 1][i + 1] && (s += 1), F[r - 1] && F[r - 1][i] && (s += 1), F[r - 1] && F[r - 1][i - 1] && (s += 1);
				if(s * Math.random() < 1) {
					F[r][i] = 1, n(t), t.y = 0, t.x = Math.random() * v.width;
					continue
				}
			}
			t.y += t.vv * A, t.x += (t.hd + t.hv) * A, t.hd += t.hdi;
			if(t.hd < -t.mhd || t.hd > t.mhd) t.hdi = -t.hdi;
			t.o += t.oi;
			if(t.o > N || t.o < T) t.oi = -t.oi;
			t.o > N && (t.o = N), t.o < T && (t.o = T);
			var u = !1;
			t.y > v.height + d / 2 && (t.y = 0, u = !0), t.y < 0 && (t.y = v.height, u = !0), t.x > v.width + p / 2 && (t.x = 0, u = !0), t.x < 0 && (t.x = v.width, u = !0), u && (t.nl = !1)
		}
	}

	function i(e) {
		r(), e.clearRect(0, 0, e.canvas.width, e.canvas.height);
		for(var t = 0; t < o.length; t++) {
			var n = o[t];
			e.globalAlpha = n.o, e.drawImage(c[n.si], 0, 0, p, d, n.x, n.y, n.sw, n.sh)
		}
	}

	function s(t) {
		var n = "position:absolute;left:0;top:0;z-index:100001;pointer-events: none;";
		v.width = t.cw, v.height = t.ch, e(t.flakeCount), D = document.createElement("canvas"), H = document.createElement("canvas"), D.style.cssText = n, H.style.cssText = n, document.body.appendChild(D), document.body.appendChild(H), P = D.getContext("2d"), B = H.getContext("2d"), D.width = H.width = t.cw, D.height = H.height = t.ch, j = t.dropPoints, F = t.dropCount, I = t.maxPointDrop, Animation.addFrameRenderer(i, B), Animation.start()
	}
	var o = [],
		u = 1,
		a = .1,
		f = 2,
		l = "http://p8.qhimg.com/d/inn/43158a81/Snowflakes.png",
		c = [],
		h = 1,//间隔
		p = 20,
		d = 20,
		v = {},
		m = 1,
		g = 4,//速度
		y = -1,
		b = 3,
		w = .2,
		E = 1.25,//大小缩放
		S = 2,
		x = 3,//偏度
		T = .2,
		N = 0.9,//透明度
		C = 50,
		k = 60,
		L = 0,
		A = 1,//速度
		O = .1,
		M = 1.5,
		_ = .05,
		D, P, H, B, j, F, I;
	return {
		init: s
	}
}(), html2canvas([document.getElementById("container_snow")], {
	onrendered: function(e) {
		try {
			var t = detectEdge(e);
			t.flakeCount = 20, Snowflakes.init(t)
		} catch(n) {}
	}
});