/*! Hanzi Writer v2.3.0 | https://chanind.github.io/hanzi-writer */
!(function(t, i) {
	'object' == typeof exports && 'object' == typeof module
		? (module.exports = i())
		: 'function' == typeof define && define.amd
		? define([], i)
		: 'object' == typeof exports
		? (exports.HanziWriter = i())
		: (t.HanziWriter = i());
})('undefined' != typeof self ? self : this, function() {
	return (function(n) {
		var r = {};
		function o(t) {
			if (r[t]) return r[t].exports;
			var i = (r[t] = { i: t, l: !1, exports: {} });
			return n[t].call(i.exports, i, i.exports, o), (i.l = !0), i.exports;
		}
		return (
			(o.m = n),
			(o.c = r),
			(o.d = function(t, i, n) {
				o.o(t, i) ||
					Object.defineProperty(t, i, { configurable: !1, enumerable: !0, get: n });
			}),
			(o.n = function(t) {
				var i =
					t && t.t
						? function() {
								return t.default;
						  }
						: function() {
								return t;
						  };
				return o.d(i, 'a', i), i;
			}),
			(o.o = function(t, i) {
				return Object.prototype.hasOwnProperty.call(t, i);
			}),
			(o.p = ''),
			o((o.s = 9))
		);
	})([
		function(c, t, i) {
			'use strict';
			(function(t) {
				var u =
					'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator
						? function(t) {
								return typeof t;
						  }
						: function(t) {
								return t &&
									'function' == typeof Symbol &&
									t.constructor === Symbol &&
									t !== Symbol.prototype
									? 'symbol'
									: typeof t;
						  };
				var i =
						(t.performance &&
							function() {
								return t.performance.now();
							}) ||
						function() {
							return Date.now();
						},
					n =
						t.requestAnimationFrame ||
						function(t) {
							return setTimeout(function() {
								return t(i());
							}, 1e3 / 60);
						},
					r = t.cancelAnimationFrame || clearTimeout,
					o = function(t) {
						for (
							var n = Object(t),
								i = arguments.length,
								r = Array(1 < i ? i - 1 : 0),
								o = 1;
							o < i;
							o++
						)
							r[o - 1] = arguments[o];
						return (
							r.forEach(function(t) {
								if (null != t)
									for (var i in t)
										Object.prototype.hasOwnProperty.call(t, i) && (n[i] = t[i]);
							}),
							n
						);
					},
					h = Object.assign || o;
				var s = 0;
				var e = (t.navigator && t.navigator.userAgent) || '',
					a =
						0 < e.indexOf('MSIE ') ||
						0 < e.indexOf('Trident/') ||
						0 < e.indexOf('Edge/');
				c.exports = {
					e: o,
					arrLast: function(t) {
						return t[t.length - 1];
					},
					assign: h,
					average: function(t) {
						return (
							t.reduce(function(t, i) {
								return i + t;
							}, 0) / t.length
						);
					},
					callIfExists: function(t, i) {
						return t && t(i), i;
					},
					cancelAnimationFrame: r,
					colorStringToVals: function(t) {
						var i = t.toUpperCase().trim();
						if (/^#([A-F0-9]{3}){1,2}$/.test(i)) {
							var n = i.substring(1).split('');
							3 === n.length && (n = [n[0], n[0], n[1], n[1], n[2], n[2]]);
							var r = '' + n.join('');
							return {
								r: parseInt(r.slice(0, 2), 16),
								g: parseInt(r.slice(2, 4), 16),
								b: parseInt(r.slice(4, 6), 16),
								a: 1
							};
						}
						var o = i.match(
							/^RGBA?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*(\d*\.?\d+))?\)$/
						);
						if (o)
							return {
								r: parseInt(o[1], 10),
								g: parseInt(o[2], 10),
								b: parseInt(o[3], 10),
								a: parseFloat(o[4] || 1, 10)
							};
						throw new Error('Invalid color: ' + t);
					},
					copyAndMergeDeep: function t(i, n) {
						var r = h({}, i);
						for (var o in n) {
							var s = i[o],
								e = n[o];
							s !== e &&
								(s &&
								e &&
								'object' === (void 0 === s ? 'undefined' : u(s)) &&
								'object' === (void 0 === e ? 'undefined' : u(e)) &&
								!Array.isArray(e)
									? (r[o] = t(s, e))
									: (r[o] = e));
						}
						return r;
					},
					counter: function() {
						return ++s;
					},
					emptyFunc: function() {},
					inflate: function(t, i) {
						for (var n = t.split('.'), r = {}, o = r, s = 0; s < n.length; s++) {
							var e = s === n.length - 1 ? i : {};
							(o[n[s]] = e), (o = e);
						}
						return r;
					},
					objRepeat: function(t, i) {
						for (var n = {}, r = 0; r < i; r++) n[r] = t;
						return n;
					},
					performanceNow: i,
					requestAnimationFrame: n,
					timeout: function() {
						var n = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : 0;
						return new Promise(function(t, i) {
							setTimeout(t, n);
						});
					},
					trim: function(t) {
						return t.replace(/^\s+/, '').replace(/\s+$/, '');
					},
					isMsBrowser: a
				};
			}.call(t, i(1)));
		},
		function(Ia, Ja) {
			var Ka;
			Ka = (function() {
				return this;
			})();
			try {
				Ka = Ka || Function('return this')() || eval('this');
			} catch (t) {
				'object' == typeof window && (Ka = window);
			}
			Ia.exports = Ka;
		},
		function(t, i, n) {
			'use strict';
			var r = n(0),
				e = r.average,
				v = r.arrLast,
				u = function(t, i) {
					return { x: t.x - i.x, y: t.y - i.y };
				},
				s = function(t) {
					return Math.sqrt(Math.pow(t.x, 2) + Math.pow(t.y, 2));
				},
				l = function(t, i) {
					return s(u(t, i));
				},
				h = function(t) {
					var i =
						10 * (1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : 1);
					return { x: Math.round(i * t.x) / i, y: Math.round(i * t.y) / i };
				},
				d = function(t) {
					var r = t[0];
					return t.slice(1).reduce(function(t, i) {
						var n = l(i, r);
						return (r = i), t + n;
					}, 0);
				},
				p = function(t, i, n) {
					var r = u(i, t),
						o = n / s(r);
					return { x: i.x + o * r.x, y: i.y + o * r.y };
				},
				a = function(t) {
					var e = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : 0.05,
						u = t.slice(0, 1);
					return (
						t.slice(1).forEach(function(t) {
							var i = u[u.length - 1],
								n = l(t, i);
							if (e < n)
								for (var r = Math.ceil(n / e), o = n / r, s = 0; s < r; s++)
									u.push(p(t, i, -1 * o * (s + 1)));
							else u.push(t);
						}),
						u
					);
				},
				c = function(t) {
					for (
						var i = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : 30,
							n = d(t) / (i - 1),
							r = [t[0]],
							o = v(t),
							s = t.slice(1),
							e = 0;
						e < i - 2;
						e++
					)
						for (var u = v(r), h = n, a = !1; !a; ) {
							var c = l(u, s[0]);
							if (c < h) (h -= c), (u = s.shift());
							else {
								var f = p(u, s[0], h - c);
								r.push(f), (a = !0);
							}
						}
					return r.push(o), r;
				},
				f = function(t) {
					if (t.length < 3) return t;
					var s = [t[0], t[1]];
					return (
						t.slice(2).forEach(function(t, i) {
							var n = s.length,
								r = u(t, s[n - 1]),
								o = u(s[n - 1], s[n - 2]);
							r.y * o.x - r.x * o.y == 0 && s.pop(), s.push(t);
						}),
						s
					);
				};
			t.exports = {
				round: h,
				equals: function(t, i) {
					return t.x === i.x && t.y === i.y;
				},
				distance: l,
				getPathString: function(t) {
					var i = 1 < arguments.length && void 0 !== arguments[1] && arguments[1],
						n = h(t[0]),
						r = t.slice(1),
						o = 'M ' + n.x + ' ' + n.y;
					return (
						r.forEach(function(t) {
							var i = h(t);
							o += ' L ' + i.x + ' ' + i.y;
						}),
						i && (o += 'Z'),
						o
					);
				},
				frechetDist: function(r, o) {
					for (var s = [], t = 0; t < r.length; t++) {
						s.push([]);
						for (var i = 0; i < o.length; i++) s[t].push(-1);
					}
					return (function t(i, n) {
						return (
							-1 < s[i][n] ||
								(s[i][n] =
									0 === i && 0 === n
										? l(r[0], o[0])
										: 0 < i && 0 === n
										? Math.max(t(i - 1, 0), l(r[i], o[0]))
										: 0 === i && 0 < n
										? Math.max(t(0, n - 1), l(r[0], o[n]))
										: 0 < i && 0 < n
										? Math.max(
												Math.min(t(i - 1, n), t(i - 1, n - 1), t(i, n - 1)),
												l(r[i], o[n])
										  )
										: 1 / 0),
							s[i][n]
						);
					})(r.length - 1, o.length - 1);
				},
				length: d,
				rotate: function(t, i) {
					return t.map(function(t) {
						return {
							x: Math.cos(i) * t.x - Math.sin(i) * t.y,
							y: Math.sin(i) * t.x + Math.cos(i) * t.y
						};
					});
				},
				subtract: u,
				extendStart: function(t, i) {
					var n = f(t);
					if (n.length < 2) return n;
					var r = n[1],
						o = n[0],
						s = p(r, o, i),
						e = n.slice(1);
					return e.unshift(s), e;
				},
				cosineSimilarity: function(t, i) {
					return (t.x * i.x + t.y * i.y) / s(t) / s(i);
				},
				outlineCurve: c,
				u: p,
				h: f,
				subdivideCurve: a,
				normalizeCurve: function(t) {
					var i = c(t),
						n = {
							x: e(
								i.map(function(t) {
									return t.x;
								})
							),
							y: e(
								i.map(function(t) {
									return t.y;
								})
							)
						},
						r = i.map(function(t) {
							return u(t, n);
						}),
						o = Math.sqrt(
							e([
								Math.pow(r[0].x, 2) + Math.pow(r[0].y, 2),
								Math.pow(v(r).x, 2) + Math.pow(v(r).y, 2)
							])
						),
						s = r.map(function(t) {
							return { x: t.x / o, y: t.y / o };
						});
					return a(s);
				}
			};
		},
		function(t, i, n) {
			'use strict';
			(function(n) {
				function r(t, i, n) {
					t.setAttributeNS(null, i, n);
				}
				t.exports = {
					createElm: function(t) {
						return n.document.createElementNS('http://www.w3.org/2000/svg', t);
					},
					attrs: function(i, n) {
						Object.keys(n).forEach(function(t) {
							return r(i, t, n[t]);
						});
					},
					attr: r,
					removeElm: function(t) {
						t && t.parentNode.removeChild(t);
					},
					urlIdRef: function(t) {
						var i = '';
						return (
							n.location &&
								n.location.href &&
								(i = n.location.href.replace(/#[^#]*$/, '')),
							'url(' + i + '#' + t + ')'
						);
					}
				};
			}.call(i, n(1)));
		},
		function(t, i, n) {
			'use strict';
			function s(t, i, n) {
				return (
					i in t
						? Object.defineProperty(t, i, {
								value: n,
								enumerable: !0,
								configurable: !0,
								writable: !0
						  })
						: (t[i] = n),
					t
				);
			}
			var u = n(5),
				e = n(0).objRepeat,
				h = function(t, i, n) {
					return [
						new u(
							'character.' + t + '.strokes',
							e({ opacity: 1, displayPortion: 1 }, i.strokes.length),
							{ duration: n, force: !0 }
						)
					];
				},
				a = function(t, i, n) {
					return [
						new u('character.' + t + '.opacity', 0, { duration: n, force: !0 })
					].concat(h(t, i, 0));
				},
				c = function(t, i, n) {
					var r = i.strokeNum,
						o = (i.getLength() + 600) / (3 * n);
					return [
						new u('character.' + t, {
							opacity: 1,
							strokes: s({}, r, { displayPortion: 0, opacity: 1 })
						}),
						new u('character.' + t + '.strokes.' + r + '.displayPortion', 1, {
							duration: o
						})
					];
				},
				f = function(n, t, i, r, o) {
					var s = a(n, t, i);
					return (
						(s = s.concat(h(n, t, 0))).push(
							new u(
								'character.' + n,
								{ opacity: 1, strokes: e({ opacity: 0 }, t.strokes.length) },
								{ force: !0 }
							)
						),
						t.strokes.forEach(function(t, i) {
							0 < i && s.push(new u.Delay(o)), (s = s.concat(c(n, t, r)));
						}),
						s
					);
				};
			t.exports = {
				showStrokes: h,
				showCharacter: function(t, i, n) {
					return [
						new u(
							'character.' + t,
							{
								opacity: 1,
								strokes: e({ opacity: 1, displayPortion: 1 }, i.strokes.length)
							},
							{ duration: n, force: !0 }
						)
					];
				},
				hideCharacter: a,
				highlightStroke: function(t, i, n) {
					var r = t.strokeNum,
						o = (t.getLength() + 600) / (3 * n);
					return [
						new u('character.highlight.strokeColor', i),
						new u('character.highlight', {
							opacity: 1,
							strokes: s({}, r, { displayPortion: 0, opacity: 0 })
						}),
						new u(
							'character.highlight.strokes.' + r,
							{ displayPortion: 1, opacity: 1 },
							{ duration: o }
						),
						new u('character.highlight.strokes.' + r + '.opacity', 0, { duration: o })
					];
				},
				animateCharacter: f,
				animateCharacterLoop: function(t, i, n, r, o, s) {
					var e = f(t, i, n, r, o);
					return e.push(new u.Delay(s)), e;
				},
				animateStroke: c,
				animateSingleStroke: function(o, s, t, i) {
					return [
						new u('character.' + o, function(t) {
							for (
								var i = t.character[o], n = { opacity: 1, strokes: {} }, r = 0;
								r < s.strokes.length;
								r++
							)
								n.strokes[r] = { opacity: i.opacity * i.strokes[r].opacity };
							return n;
						})
					].concat(c(o, s.strokes[t], i));
				},
				showStroke: function(t, i, n) {
					return [
						new u(
							'character.' + t + '.strokes.' + i,
							{ displayPortion: 1, opacity: 1 },
							{ duration: n, force: !0 }
						)
					];
				},
				updateColor: function(t, i, n) {
					return [new u('options.' + t, i, { duration: n })];
				}
			};
		},
		function(t, i, n) {
			'use strict';
			var r = n(0),
				o = r.inflate,
				s = r.performanceNow,
				e = r.requestAnimationFrame,
				u = r.cancelAnimationFrame;
			function h(t, i) {
				var n = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : {};
				(this.scope = t),
					(this.f = i),
					(this.v = n.duration || 0),
					(this.w = n.force),
					(this.k = 0),
					(this.C = this.M.bind(this)),
					(this.S = null);
			}
			function a(t) {
				(this.v = t), (this.j = null), (this.P = !1);
			}
			(h.prototype.run = function(t) {
				var i = this;
				return (
					this.O || this.A(t),
					0 === this.v && t.updateState(this.O),
					0 === this.v ||
					(function t(i, n) {
						for (var r in n)
							if (n.hasOwnProperty(r)) {
								var o = n[r],
									s = i[r];
								if (0 <= o) {
									if (o !== s) return !1;
								} else if (!t(s, o)) return !1;
							}
						return !0;
					})(t.state, this.O)
						? Promise.resolve()
						: ((this.F = t),
						  (this.D = t.state),
						  (this.j = s()),
						  (this.T = e(this.C)),
						  new Promise(function(t) {
								i.I = t;
						  }))
				);
			}),
				(h.prototype.pause = function() {
					null === this.S && (this.T && u(this.T), (this.S = s()));
				}),
				(h.prototype.resume = function() {
					null !== this.S &&
						((this.T = e(this.C)), (this.k += s() - this.S), (this.S = null));
				}),
				(h.prototype.M = function(t) {
					if (null === this.S) {
						var i,
							n = Math.min(1, (t - this.j - this.k) / this.v);
						if (1 === n)
							this.F.updateState(this.O), (this.T = null), this.cancel(this.F);
						else {
							var r = ((i = n), -Math.cos(i * Math.PI) / 2 + 0.5);
							this.F.updateState(
								(function t(i, n, r) {
									var o = {};
									for (var s in n) {
										var e = n[s],
											u = i[s];
										o[s] = 0 <= e ? r * (e - u) + u : t(u, e, r);
									}
									return o;
								})(this.D, this.O, r)
							),
								(this.T = e(this.C));
						}
					}
				}),
				(h.prototype.A = function(t) {
					var i = this.f;
					'function' == typeof this.f && (i = this.f(t.state)),
						(this.O = o(this.scope, i));
				}),
				(h.prototype.cancel = function(t) {
					this.I && this.I(),
						(this.I = null),
						this.T && u(this.T),
						(this.T = null),
						this.w && (this.O || this.A(t), t.updateState(this.O));
				}),
				(a.prototype.pause = function() {
					if (!this.P) {
						var t = s() - this.j;
						(this.v = Math.max(0, this.v - t)), clearTimeout(this.W), (this.P = !0);
					}
				}),
				(a.prototype.resume = function() {
					var t = this;
					this.P &&
						((this.j = s()),
						(this.W = setTimeout(function() {
							return t.cancel();
						}, this.v)),
						(this.P = !1));
				}),
				(a.prototype.run = function() {
					var i = this,
						t = new Promise(function(t) {
							i.I = t;
						});
					return (
						(this.j = s()),
						(this.W = setTimeout(function() {
							return i.cancel();
						}, this.v)),
						t
					);
				}),
				(a.prototype.cancel = function() {
					clearTimeout(this.W), this.I && this.I(), (this.I = !1);
				}),
				(h.Delay = a),
				(t.exports = h);
		},
		function(t, i, n) {
			'use strict';
			function r() {}
			(r.prototype.z = function(t) {
				return 0.999 * this.R * (1 - t);
			}),
				(r.prototype.H = function(t) {
					var i = t.strokeColor,
						n = t.radicalColor;
					return n && this.L.isInRadical ? n : i;
				}),
				(t.exports = r);
		},
		function(n, t, i) {
			'use strict';
			(function(i) {
				function t() {}
				(t.prototype.addPointerStartListener = function(i) {
					var n = this;
					this.node.addEventListener('mousedown', function(t) {
						i(n.U(t, n._));
					}),
						this.node.addEventListener('touchstart', function(t) {
							i(n.U(t, n.K));
						});
				}),
					(t.prototype.addPointerMoveListener = function(i) {
						var n = this;
						this.node.addEventListener('mousemove', function(t) {
							i(n.U(t, n._));
						}),
							this.node.addEventListener('touchmove', function(t) {
								i(n.U(t, n.K));
							});
					}),
					(t.prototype.addPointerEndListener = function(t) {
						i.document.addEventListener('mouseup', t),
							i.document.addEventListener('touchend', t);
					}),
					(t.prototype.getBoundingClientRect = function() {
						return this.node.getBoundingClientRect();
					}),
					(t.prototype.U = function(t, i) {
						var n = this;
						return {
							getPoint: function() {
								return i.call(n, t);
							},
							preventDefault: function() {
								return t.preventDefault();
							}
						};
					}),
					(t.prototype._ = function(t) {
						var i = this.getBoundingClientRect();
						return { x: t.clientX - i.left, y: t.clientY - i.top };
					}),
					(t.prototype.K = function(t) {
						var i = this.getBoundingClientRect();
						return {
							x: t.touches[0].clientX - i.left,
							y: t.touches[0].clientY - i.top
						};
					}),
					(n.exports = t);
			}.call(t, i(1)));
		},
		function(t, i, n) {
			'use strict';
			t.exports = {
				drawPath: function(i, t) {
					i.beginPath();
					var n = t[0],
						r = t.slice(1);
					i.moveTo(n.x, n.y),
						r.forEach(function(t) {
							i.lineTo(t.x, t.y);
						}),
						i.stroke();
				},
				pathStringToCanvas: function(t) {
					var i = t.split(/(^|\s+)(?=[A-Z])/).filter(function(t) {
							return ' ' !== t;
						}),
						e = [
							function(t) {
								return t.beginPath();
							}
						];
					return (
						i.forEach(function(t) {
							var i,
								n = t.split(/\s+/),
								r = ((i = n), Array.isArray(i) ? i : Array.from(i)),
								o = r[0],
								s = r.slice(1).map(function(t) {
									return parseFloat(t);
								});
							'M' === o
								? e.push(function(t) {
										return t.moveTo.apply(t, s);
								  })
								: 'L' === o
								? e.push(function(t) {
										return t.lineTo.apply(t, s);
								  })
								: 'C' === o
								? e.push(function(t) {
										return t.bezierCurveTo.apply(t, s);
								  })
								: 'Q' === o &&
								  e.push(function(t) {
										return t.quadraticCurveTo.apply(t, s);
								  });
						}),
						function(i) {
							return e.forEach(function(t) {
								return t(i);
							});
						}
					);
				}
			};
		},
		function(t, i, n) {
			'use strict';
			var o = n(10),
				s = n(11),
				e = n(14),
				r = n(15),
				u = n(19),
				h = n(25),
				a = n(31),
				c = n(32),
				f = n(4),
				v = n(0),
				l = v.assign,
				d = v.callIfExists,
				p = v.trim,
				y = v.colorStringToVals,
				w = {
					charDataLoader: a,
					onLoadCharDataError: null,
					onLoadCharDataSuccess: null,
					showOutline: !0,
					showCharacter: !0,
					renderer: 'svg',
					width: null,
					height: null,
					padding: 20,
					strokeAnimationSpeed: 1,
					strokeFadeDuration: 400,
					strokeHighlightDuration: 200,
					strokeHighlightSpeed: 2,
					delayBetweenStrokes: 1e3,
					delayBetweenLoops: 2e3,
					strokeColor: '#555',
					radicalColor: null,
					highlightColor: '#AAF',
					outlineColor: '#DDD',
					drawingColor: '#333',
					leniency: 1,
					showHintAfterMisses: 3,
					highlightOnComplete: !0,
					highlightCompleteColor: null,
					drawingFadeDuration: 300,
					drawingWidth: 4,
					strokeWidth: 2,
					outlineWidth: 2,
					rendererOverride: {}
				};
			function g() {
				if (0 < arguments.length) {
					var t = void 0,
						i = {},
						n = arguments.length <= 0 ? void 0 : arguments[0];
					1 < arguments.length &&
						(i =
							'string' == typeof (arguments.length <= 1 ? void 0 : arguments[1])
								? (console.warn(
										'Using new HanziWriter() to set a character is deprecated. Use HanziWriter.create() instead'
								  ),
								  (t = arguments.length <= 1 ? void 0 : arguments[1]),
								  (arguments.length <= 2 ? void 0 : arguments[2]) || {})
								: arguments.length <= 1
								? void 0
								: arguments[1]),
						this.N(n, i),
						t && this.setCharacter(t);
				}
			}
			(g.prototype.showCharacter = function() {
				var t = this,
					i = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {};
				return (
					(this.B.showCharacter = !0),
					this.G(function() {
						return t.F.run(
							f.showCharacter(
								'main',
								t.V,
								'number' == typeof i.duration ? i.duration : t.B.strokeFadeDuration
							)
						).then(function(t) {
							return d(i.onComplete, t);
						});
					})
				);
			}),
				(g.prototype.hideCharacter = function() {
					var t = this,
						i = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {};
					return (
						(this.B.showCharacter = !1),
						this.G(function() {
							return t.F.run(
								f.hideCharacter(
									'main',
									t.V,
									'number' == typeof i.duration
										? i.duration
										: t.B.strokeFadeDuration
								)
							).then(function(t) {
								return d(i.onComplete, t);
							});
						})
					);
				}),
				(g.prototype.animateCharacter = function() {
					var t = this,
						i = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {};
					return (
						this.cancelQuiz(),
						this.G(function() {
							return t.F.run(
								f.animateCharacter(
									'main',
									t.V,
									t.B.strokeFadeDuration,
									t.B.strokeAnimationSpeed,
									t.B.delayBetweenStrokes
								)
							).then(function(t) {
								return d(i.onComplete, t);
							});
						})
					);
				}),
				(g.prototype.animateStroke = function(t) {
					var i = this,
						n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {};
					return (
						this.cancelQuiz(),
						this.G(function() {
							return i.F.run(
								f.animateSingleStroke('main', i.V, t, i.B.strokeAnimationSpeed)
							).then(function(t) {
								return d(n.onComplete, t);
							});
						})
					);
				}),
				(g.prototype.highlightStroke = function(t) {
					var i = this,
						n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {};
					return this.G(function() {
						return i.F.run(
							f.highlightStroke(
								i.V.strokes[t],
								i.B.highlightColor,
								i.B.strokeHighlightSpeed
							)
						).then(function(t) {
							return d(n.onComplete, t);
						});
					});
				}),
				(g.prototype.loopCharacterAnimation = function() {
					var t = this;
					0 < arguments.length && void 0 !== arguments[0] && arguments[0];
					return (
						this.cancelQuiz(),
						this.G(function() {
							return t.F.run(
								f.animateCharacterLoop(
									'main',
									t.V,
									t.B.strokeFadeDuration,
									t.B.strokeAnimationSpeed,
									t.B.delayBetweenStrokes,
									t.B.delayBetweenLoops
								),
								{ loop: !0 }
							);
						})
					);
				}),
				(g.prototype.pauseAnimation = function() {
					var t = this;
					return this.G(function() {
						return t.F.pauseAll();
					});
				}),
				(g.prototype.resumeAnimation = function() {
					var t = this;
					return this.G(function() {
						return t.F.resumeAll();
					});
				}),
				(g.prototype.showOutline = function() {
					var t = this,
						i = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {};
					return (
						(this.B.showOutline = !0),
						this.G(function() {
							return t.F.run(
								f.showCharacter(
									'outline',
									t.V,
									'number' == typeof i.duration
										? i.duration
										: t.B.strokeFadeDuration
								)
							).then(function(t) {
								return d(i.onComplete, t);
							});
						})
					);
				}),
				(g.prototype.hideOutline = function() {
					var t = this,
						i = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {};
					return (
						(this.B.showOutline = !1),
						this.G(function() {
							return t.F.run(
								f.hideCharacter(
									'outline',
									t.V,
									'number' == typeof i.duration
										? i.duration
										: t.B.strokeFadeDuration
								)
							).then(function(t) {
								return d(i.onComplete, t);
							});
						})
					);
				}),
				(g.prototype.updateColor = function(o, s) {
					var e = this,
						u = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : {};
					return this.G(function() {
						var t = 'number' == typeof u.duration ? u.duration : e.B.strokeFadeDuration,
							i = s;
						'radicalColor' !== o || s || (i = e.B.strokeColor);
						var n = y(i);
						e.B[o] = s;
						var r = f.updateColor(o, n, t);
						return (
							'radicalColor' !== o || s || (r = r.concat(f.updateColor(o, null, 0))),
							e.F.run(r).then(function(t) {
								return d(u.onComplete, t);
							})
						);
					});
				}),
				(g.prototype.quiz = function() {
					var t = this,
						i = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {};
					this.G(function() {
						t.cancelQuiz(), (t.$ = new r(t.V, t.F, t.q)), t.$.startQuiz(l({}, t.B, i));
					});
				}),
				(g.prototype.cancelQuiz = function() {
					this.$ && (this.$.cancel(), (this.$ = null));
				}),
				(g.prototype.setCharacter = function(n) {
					var r = this;
					return (
						this.cancelQuiz(),
						(this.J = n),
						this.Q && this.Q.destroy(),
						this.F && this.F.cancelAll(),
						(this.Q = null),
						(this.Z = this.X.loadCharData(n).then(function(t) {
							if (!r.X.loadingFailed) {
								(r.V = s(n, t)), (r.q = new e(r.B));
								var i = new r.Y.HanziWriterRenderer(r.V, r.q);
								(r.Q = i),
									(r.F = new o(r.V, r.B, function(t) {
										i.render(t);
									})),
									r.Q.mount(r.target),
									r.Q.render(r.F.state);
							}
						})),
						this.Z
					);
				}),
				(g.prototype.N = function(t, i) {
					var n = 'canvas' === i.renderer ? h : u,
						r = i.rendererOverride || {};
					return (
						(this.Y = {
							HanziWriterRenderer: r.HanziWriterRenderer || n.HanziWriterRenderer,
							createRenderTarget: r.createRenderTarget || n.createRenderTarget
						}),
						(this.target = this.Y.createRenderTarget(t, i.width, i.height)),
						(this.B = this.tt(i)),
						(this.X = new c(this.B)),
						this.it(),
						(this.$ = null),
						this
					);
				}),
				(g.prototype.tt = function(t) {
					var i = l({}, w, t);
					return (
						t.strokeAnimationDuration &&
							!t.strokeAnimationSpeed &&
							(i.strokeAnimationSpeed = 500 / i.strokeAnimationDuration),
						t.strokeHighlightDuration &&
							!t.strokeHighlightSpeed &&
							(i.strokeHighlightSpeed = 500 / i.strokeHighlightDuration),
						t.highlightCompleteColor || (i.highlightCompleteColor = i.highlightColor),
						this.nt(i)
					);
				}),
				(g.prototype.nt = function(t) {
					var i = l({}, t);
					if (i.width && !i.height) i.height = i.width;
					else if (i.height && !i.width) i.width = i.height;
					else if (!i.width && !i.height) {
						var n = this.target.getBoundingClientRect(),
							r = n.width,
							o = n.height,
							s = Math.min(r, o);
						(i.width = s), (i.height = s);
					}
					return i;
				}),
				(g.prototype.G = function(t) {
					var i = this;
					if (this.X.loadingFailed)
						throw Error(
							'Failed to load character data. Call setCharacter and try again.'
						);
					return this.Z.then(function() {
						if (!i.X.loadingFailed) return t();
					});
				}),
				(g.prototype.it = function() {
					var i = this;
					this.target.addPointerStartListener(function(t) {
						i.$ && (t.preventDefault(), i.rt('startUserStroke', t.getPoint()));
					}),
						this.target.addPointerMoveListener(function(t) {
							i.$ && (t.preventDefault(), i.rt('continueUserStroke', t.getPoint()));
						}),
						this.target.addPointerEndListener(function() {
							return i.rt('endUserStroke');
						});
				}),
				(g.prototype.rt = function(t) {
					var i;
					if (this.$) {
						for (
							var n = arguments.length, r = Array(1 < n ? n - 1 : 0), o = 1;
							o < n;
							o++
						)
							r[o - 1] = arguments[o];
						(i = this.$)[t].apply(i, r);
					}
				}),
				(g.create = function(t, i) {
					var n = new g(
						t,
						2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : {}
					);
					return n.setCharacter(i), n;
				});
			var k = null,
				m = null;
			(g.loadCharacterData = function(t) {
				var i = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},
					n = void 0;
				return (
					(n = k && m === i ? k : new c(l({}, w, i))), (m = i), (k = n).loadCharData(t)
				);
			}),
				(g.getScalingTransform = function(t, i) {
					var n = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : 0,
						r = new e({ width: t, height: i, padding: n });
					return {
						x: r.xOffset,
						y: r.yOffset,
						scale: r.scale,
						transform: p(
							'\n      translate(' +
								r.xOffset +
								', ' +
								(r.height - r.yOffset) +
								')\n      scale(' +
								r.scale +
								', ' +
								-1 * r.scale +
								')\n    '
						).replace(/\s+/g, ' ')
					};
				}),
				(t.exports = g);
		},
		function(t, i, n) {
			'use strict';
			var r = n(0),
				o = r.copyAndMergeDeep,
				s = r.colorStringToVals;
			function e(t, i, n) {
				(this.ot = n),
					(this.st = []),
					(this.state = {
						options: {
							drawingFadeDuration: i.drawingFadeDuration,
							drawingWidth: i.drawingWidth,
							drawingColor: s(i.drawingColor),
							strokeColor: s(i.strokeColor),
							outlineColor: s(i.outlineColor),
							radicalColor: s(i.radicalColor || i.strokeColor),
							highlightColor: s(i.highlightColor)
						},
						character: {
							main: { opacity: i.showCharacter ? 1 : 0, strokes: {} },
							outline: { opacity: i.showOutline ? 1 : 0, strokes: {} },
							highlight: { opacity: 1, strokes: {} }
						},
						userStrokes: null
					});
				for (var r = 0; r < t.strokes.length; r++)
					(this.state.character.main.strokes[r] = { opacity: 1, displayPortion: 1 }),
						(this.state.character.outline.strokes[r] = {
							opacity: 1,
							displayPortion: 1
						}),
						(this.state.character.highlight.strokes[r] = {
							opacity: 0,
							displayPortion: 1
						});
			}
			(e.prototype.updateState = function(t) {
				var i = o(this.state, t);
				this.ot(i, this.state), (this.state = i);
			}),
				(e.prototype.run = function(n) {
					var r = this,
						o = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},
						s = n
							.map(function(t) {
								return t.scope;
							})
							.filter(function(t) {
								return t;
							});
					return (
						this.cancelMutations(s),
						new Promise(function(t) {
							var i = { et: !0, ut: 0, I: t, ht: n, at: o.loop, ct: s };
							r.st.push(i), r.ft(i);
						})
					);
				}),
				(e.prototype.ft = function(i) {
					var t = this;
					if (i.et) {
						var n = i.ht;
						if (i.ut >= n.length) {
							if (!i.at)
								return (
									(i.et = !1),
									(this.st = this.st.filter(function(t) {
										return t !== i;
									})),
									void i.I({ canceled: !1 })
								);
							i.ut = 0;
						}
						i.ht[i.ut].run(this).then(function() {
							i.et && (i.ut++, t.ft(i));
						});
					}
				}),
				(e.prototype.vt = function() {
					return this.st.map(function(t) {
						return t.ht[t.ut];
					});
				}),
				(e.prototype.pauseAll = function() {
					this.vt().forEach(function(t) {
						return t.pause();
					});
				}),
				(e.prototype.resumeAll = function() {
					this.vt().forEach(function(t) {
						return t.resume();
					});
				}),
				(e.prototype.cancelMutations = function(t) {
					var r = this;
					this.st.forEach(function(n) {
						n.ct.forEach(function(i) {
							t.forEach(function(t) {
								(0 <= i.indexOf(t) || 0 <= t.indexOf(i)) && r.lt(n);
							});
						});
					});
				}),
				(e.prototype.cancelAll = function() {
					this.cancelMutations(['']);
				}),
				(e.prototype.lt = function(i) {
					i.et = !1;
					for (var t = i.ut; t < i.ht.length; t++) i.ht[t].cancel(this);
					i.I && i.I({ canceled: !0 }),
						(this.st = this.st.filter(function(t) {
							return t !== i;
						}));
				}),
				(t.exports = e);
		},
		function(t, i, n) {
			'use strict';
			var s = function(t, i) {
					if (Array.isArray(t)) return t;
					if (Symbol.iterator in Object(t))
						return (function(t, i) {
							var n = [],
								r = !0,
								o = !1,
								s = void 0;
							try {
								for (
									var e, u = t[Symbol.iterator]();
									!(r = (e = u.next()).done) &&
									(n.push(e.value), !i || n.length !== i);
									r = !0
								);
							} catch (t) {
								(o = !0), (s = t);
							} finally {
								try {
									!r && u.return && u.return();
								} finally {
									if (o) throw s;
								}
							}
							return n;
						})(t, i);
					throw new TypeError('Invalid attempt to destructure non-iterable instance');
				},
				e = n(12),
				r = n(13),
				o = function(o) {
					return o.strokes.map(function(t, i) {
						var n,
							r = o.medians[i].map(function(t) {
								var i = s(t, 2);
								return { x: i[0], y: i[1] };
							});
						return new e(
							t,
							r,
							i,
							((n = i), o.radStrokes && 0 <= o.radStrokes.indexOf(n))
						);
					});
				};
			t.exports = function(t, i) {
				var n = o(i);
				return new r(t, n);
			};
		},
		function(t, i, n) {
			'use strict';
			var r = n(2),
				o = r.subtract,
				s = r.distance,
				e = r.length;
			function u(t, i, n) {
				var r = 3 < arguments.length && void 0 !== arguments[3] && arguments[3];
				(this.path = t), (this.points = i), (this.strokeNum = n), (this.isInRadical = r);
			}
			(u.prototype.getStartingPoint = function() {
				return this.points[0];
			}),
				(u.prototype.getEndingPoint = function() {
					return this.points[this.points.length - 1];
				}),
				(u.prototype.getLength = function() {
					return e(this.points);
				}),
				(u.prototype.getVectors = function() {
					var n = this.points[0];
					return this.points.slice(1).map(function(t) {
						var i = o(t, n);
						return (n = t), i;
					});
				}),
				(u.prototype.getDistance = function(i) {
					var t = this.points.map(function(t) {
						return s(t, i);
					});
					return Math.min.apply(Math, t);
				}),
				(u.prototype.getAverageDistance = function(t) {
					var n = this;
					return (
						t.reduce(function(t, i) {
							return t + n.getDistance(i);
						}, 0) / t.length
					);
				}),
				(t.exports = u);
		},
		function(t, i, n) {
			'use strict';
			t.exports = function(t, i) {
				(this.symbol = t), (this.strokes = i);
			};
		},
		function(t, i, n) {
			'use strict';
			var a = [
				{ x: 0, y: -124 },
				{ x: 1024, y: 900 }
			];
			function r(t) {
				(this.B = t), (this.width = t.width), (this.height = t.height), this.dt();
			}
			(r.prototype.convertExternalPoint = function(t) {
				return {
					x: (t.x - this.xOffset) / this.scale,
					y: (this.height - this.yOffset - t.y) / this.scale
				};
			}),
				(r.prototype.dt = function() {
					var t = a,
						i = t[1].x - t[0].x,
						n = t[1].y - t[0].y,
						r = this.width - 2 * this.B.padding,
						o = this.height - 2 * this.B.padding,
						s = r / i,
						e = o / n;
					this.scale = Math.min(s, e);
					var u = this.B.padding + (r - this.scale * i) / 2,
						h = this.B.padding + (o - this.scale * n) / 2;
					(this.xOffset = -1 * t[0].x * this.scale + u),
						(this.yOffset = -1 * t[0].y * this.scale + h);
				}),
				(t.exports = r);
		},
		function(t, i, n) {
			'use strict';
			var r = n(16),
				o = n(17),
				s = n(0),
				e = s.callIfExists,
				u = s.counter,
				h = n(18),
				a = n(2),
				c = n(4),
				f = function(t) {
					return {
						pathString: a.getPathString(t.externalPoints),
						points: t.points.map(function(t) {
							return a.round(t);
						})
					};
				};
			function v(t, i, n) {
				(this.V = t), (this.F = i), (this.et = !1), (this.q = n);
			}
			(v.prototype.startQuiz = function(t) {
				(this.et = !0),
					(this.B = t),
					(this.pt = 0),
					(this.yt = 0),
					(this.wt = 0),
					this.F.run(h.startQuiz(this.V, t.strokeFadeDuration));
			}),
				(v.prototype.startUserStroke = function(t) {
					var i = this.q.convertExternalPoint(t);
					if (!this.et) return null;
					if (this.gt) return this.endUserStroke();
					var n = u();
					(this.gt = new o(n, i, t)), this.F.run(h.startUserStroke(n, i));
				}),
				(v.prototype.continueUserStroke = function(t) {
					if (this.gt) {
						var i = this.q.convertExternalPoint(t);
						this.gt.appendPoint(i, t);
						var n = this.gt.points.slice(0);
						this.F.run(h.updateUserStroke(this.gt.id, n));
					}
				}),
				(v.prototype.endUserStroke = function() {
					if (this.gt)
						if (
							(this.F.run(h.removeUserStroke(this.gt.id, this.B.drawingFadeDuration)),
							1 !== this.gt.points.length)
						) {
							var t = this.kt(),
								i = 0 < this.F.state.character.outline.opacity;
							r(this.gt, this.V, this.pt, {
								isOutlineVisible: i,
								leniency: this.B.leniency
							})
								? this.mt()
								: (this.bt(),
								  this.yt >= this.B.showHintAfterMisses &&
										!1 !== this.B.showHintAfterMisses &&
										this.F.run(
											h.highlightStroke(
												t,
												this.B.highlightColor,
												this.B.strokeHighlightSpeed
											)
										)),
								(this.gt = null);
						} else this.gt = null;
				}),
				(v.prototype.cancel = function() {
					(this.et = !1),
						this.gt &&
							this.F.run(h.removeUserStroke(this.gt.id, this.B.drawingFadeDuration));
				}),
				(v.prototype.mt = function() {
					e(this.B.onCorrectStroke, {
						character: this.V.symbol,
						strokeNum: this.pt,
						mistakesOnStroke: this.yt,
						totalMistakes: this.wt,
						strokesRemaining: this.V.strokes.length - this.pt - 1,
						drawnPath: f(this.gt)
					});
					var t = c.showStroke('main', this.pt, this.B.strokeFadeDuration);
					(this.pt += 1),
						(this.yt = 0),
						this.pt === this.V.strokes.length &&
							((this.et = !1),
							e(this.B.onComplete, {
								character: this.V.symbol,
								totalMistakes: this.wt
							}),
							this.B.highlightOnComplete &&
								(t = t.concat(
									h.highlightCompleteChar(
										this.V,
										this.B.highlightCompleteColor,
										2 * this.B.strokeHighlightDuration
									)
								))),
						this.F.run(t);
				}),
				(v.prototype.bt = function() {
					(this.yt += 1),
						(this.wt += 1),
						e(this.B.onMistake, {
							character: this.V.symbol,
							strokeNum: this.pt,
							mistakesOnStroke: this.yt,
							totalMistakes: this.wt,
							strokesRemaining: this.V.strokes.length - this.pt,
							drawnPath: f(this.gt)
						});
				}),
				(v.prototype.kt = function() {
					return this.V.strokes[this.pt];
				}),
				(t.exports = v);
		},
		function(t, i, n) {
			'use strict';
			var r = n(0),
				h = r.average,
				l = r.assign,
				o = n(2),
				a = o.cosineSimilarity,
				d = o.equals,
				j = o.frechetDist,
				P = o.distance,
				c = o.subtract,
				x = o.normalizeCurve,
				O = o.rotate,
				A = o.length,
				F = function(t, i) {
					var n,
						r,
						o,
						s =
							((r = []),
							(o = (n = t)[0]),
							n.slice(1).forEach(function(t) {
								r.push(c(t, o)), (o = t);
							}),
							r),
						e = i.getVectors(),
						u = s.map(function(i) {
							var t = e.map(function(t) {
								return a(t, i);
							});
							return Math.max.apply(Math, t);
						});
					return 0 < h(u);
				},
				D = [Math.PI / 16, Math.PI / 32, 0, (-1 * Math.PI) / 32, (-1 * Math.PI) / 16],
				p = function(t, i, n) {
					var r = n.leniency,
						o = void 0 === r ? 1 : r,
						s = n.isOutlineVisible,
						e = void 0 !== s && s,
						u = i.getAverageDistance(t),
						h = u <= 350 * (e || 0 < i.strokeNum ? 0.5 : 1) * o;
					if (!h) return { isMatch: !1, avgDist: u };
					var a,
						c,
						f,
						v,
						l,
						d,
						p,
						y,
						w,
						g,
						k,
						m,
						b =
							((a = t),
							(f = o),
							(v = P((c = i).getStartingPoint(), a[0])),
							(l = P(c.getEndingPoint(), a[a.length - 1])),
							v <= 250 * f && l <= 250 * f),
						C = F(t, i),
						M =
							((d = t),
							(p = i.points),
							(y = o),
							(w = x(d)),
							(g = x(p)),
							(k = 1 / 0),
							D.forEach(function(t) {
								var i = j(w, O(g, t));
								i < k && (k = i);
							}),
							k <= 0.4 * y),
						S = ((m = i), 0.35 <= (o * (A(t) + 25)) / (m.getLength() + 25));
					return { isMatch: h && b && C && M && S, avgDist: u };
				};
			t.exports = function(t, i, n) {
				var r = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : {},
					o = (function(t) {
						if (t.length < 2) return t;
						var i = [t[0]];
						return (
							t.slice(1).forEach(function(t) {
								d(t, i[i.length - 1]) || i.push(t);
							}),
							i
						);
					})(t.points);
				if (o.length < 2) return null;
				var s = p(o, i.strokes[n], r);
				if (!s.isMatch) return !1;
				for (var e = i.strokes.slice(n + 1), u = s.avgDist, h = 0; h < e.length; h++) {
					var a = p(o, e[h], r);
					a.isMatch && a.avgDist < u && (u = a.avgDist);
				}
				if (u < s.avgDist) {
					var c = (0.6 * (u + s.avgDist)) / (2 * s.avgDist),
						f = (r.leniency || 1) * c,
						v = l({}, r, { leniency: f });
					return p(o, i.strokes[n], v).isMatch;
				}
				return !0;
			};
		},
		function(t, i, n) {
			'use strict';
			function r(t, i, n) {
				(this.id = t), (this.points = [i]), (this.externalPoints = [n]);
			}
			(r.prototype.appendPoint = function(t, i) {
				this.points.push(t), this.externalPoints.push(i);
			}),
				(t.exports = r);
		},
		function(t, i, n) {
			'use strict';
			var r = n(5),
				o = n(4),
				s = n(0).objRepeat;
			t.exports = {
				highlightCompleteChar: function(t, i, n) {
					return [new r('character.highlight.strokeColor', i)]
						.concat(o.hideCharacter('highlight', t))
						.concat(o.showCharacter('highlight', t, n / 2))
						.concat(o.hideCharacter('highlight', t, n / 2));
				},
				highlightStroke: o.highlightStroke,
				startQuiz: function(t, i) {
					return o
						.hideCharacter('main', t, i)
						.concat([
							new r(
								'character.highlight',
								{ opacity: 1, strokes: s({ opacity: 0 }, t.strokes.length) },
								{ force: !0 }
							),
							new r(
								'character.main',
								{ opacity: 1, strokes: s({ opacity: 0 }, t.strokes.length) },
								{ force: !0 }
							)
						]);
				},
				startUserStroke: function(t, i) {
					return [
						new r('quiz.activeUserStrokeId', t, { force: !0 }),
						new r('userStrokes.' + t, { points: [i], opacity: 1 }, { force: !0 })
					];
				},
				updateUserStroke: function(t, i) {
					return [new r('userStrokes.' + t + '.points', i, { force: !0 })];
				},
				removeUserStroke: function(t, i) {
					return [
						new r('userStrokes.' + t + '.opacity', 0, { duration: i }),
						new r('userStrokes.' + t, null, { force: !0 })
					];
				}
			};
		},
		function(t, i, n) {
			'use strict';
			var r = n(20),
				o = n(24);
			t.exports = { HanziWriterRenderer: r, createRenderTarget: o.init };
		},
		function(t, i, n) {
			'use strict';
			var r = n(21),
				e = n(23),
				u = n(0).assign,
				o = n(3);
			function s(t, i) {
				(this.V = t),
					(this.q = i),
					(this.Ct = new r(t)),
					(this.Mt = new r(t)),
					(this.St = new r(t)),
					(this.jt = {});
			}
			(s.prototype.mount = function(t) {
				var i = t.createSubRenderTarget(),
					n = i.svg;
				o.attr(
					n,
					'transform',
					'\n    translate(' +
						this.q.xOffset +
						', ' +
						(this.q.height - this.q.yOffset) +
						')\n    scale(' +
						this.q.scale +
						', ' +
						-1 * this.q.scale +
						')\n  '
				),
					this.Mt.mount(i),
					this.Ct.mount(i),
					this.St.mount(i),
					(this.Pt = i);
			}),
				(s.prototype.render = function(r) {
					var o = this;
					this.Mt.render({
						opacity: r.character.outline.opacity,
						strokes: r.character.outline.strokes,
						strokeColor: r.options.outlineColor
					}),
						this.Ct.render({
							opacity: r.character.main.opacity,
							strokes: r.character.main.strokes,
							strokeColor: r.options.strokeColor,
							radicalColor: r.options.radicalColor
						}),
						this.St.render({
							opacity: r.character.highlight.opacity,
							strokes: r.character.highlight.strokes,
							strokeColor: r.options.highlightColor
						});
					var s = r.userStrokes || {};
					Object.keys(this.jt).forEach(function(t) {
						s[t] || (o.jt[t].destroy(), delete o.jt[t]);
					}),
						Object.keys(s).forEach(function(t) {
							if (s[t]) {
								var i = u(
										{
											strokeWidth: r.options.drawingWidth,
											strokeColor: r.options.drawingColor
										},
										s[t]
									),
									n = o.jt[t];
								n || ((n = new e()).mount(o.Pt), (o.jt[t] = n)), n.render(i);
							}
						});
				}),
				(s.prototype.destroy = function() {
					o.removeElm(this.Pt.svg), (this.Pt.defs.innerHTML = '');
				}),
				(t.exports = s);
		},
		function(t, i, n) {
			'use strict';
			var r = n(0).isMsBrowser,
				o = n(22);
			function s(t) {
				(this.xt = {}),
					(this.Ot = t.strokes.map(function(t) {
						return new o(t);
					}));
			}
			(s.prototype.mount = function(t) {
				var n = t.createSubRenderTarget();
				(this.At = n.svg),
					this.Ot.forEach(function(t, i) {
						t.mount(n);
					});
			}),
				(s.prototype.render = function(t) {
					if (t !== this.xt) {
						t.opacity !== this.xt.opacity &&
							((this.At.style.opacity = t.opacity),
							r ||
								(0 === t.opacity
									? (this.At.style.display = 'none')
									: 0 === this.xt.opacity &&
									  this.At.style.removeProperty('display')));
						var i =
							!this.xt ||
							t.strokeColor !== this.xt.strokeColor ||
							t.radicalColor !== this.xt.radicalColor;
						if (i || t.strokes !== this.xt.strokes)
							for (var n = 0; n < this.Ot.length; n++)
								(!i && this.xt.strokes && t.strokes[n] === this.xt.strokes[n]) ||
									this.Ot[n].render({
										strokeColor: t.strokeColor,
										radicalColor: t.radicalColor,
										opacity: t.strokes[n].opacity,
										displayPortion: t.strokes[n].displayPortion
									});
						this.xt = t;
					}
				}),
				(t.exports = s);
		},
		function(t, i, n) {
			'use strict';
			var r = n(0).counter,
				e = n(3),
				o = n(2),
				s = o.extendStart,
				u = o.getPathString,
				h = n(6);
			function a(t) {
				(this.xt = {}), (this.L = t), (this.R = t.getLength() + 100);
			}
			((a.prototype = Object.create(h.prototype)).mount = function(t) {
				(this.Ft = e.createElm('path')),
					(this.Dt = e.createElm('clipPath')),
					(this.Tt = e.createElm('path'));
				var i = 'mask-' + r();
				e.attr(this.Dt, 'id', i),
					e.attr(this.Tt, 'd', this.L.path),
					(this.Ft.style.opacity = 0),
					e.attr(this.Ft, 'clip-path', e.urlIdRef(i));
				var n = s(this.L.points, 100);
				return (
					e.attr(this.Ft, 'd', u(n)),
					e.attrs(this.Ft, {
						stroke: '#FFFFFF',
						'stroke-width': 200,
						fill: 'none',
						'stroke-linecap': 'round',
						'stroke-linejoin': 'miter',
						'stroke-dasharray': this.R + ',' + this.R
					}),
					this.Dt.appendChild(this.Tt),
					t.defs.appendChild(this.Dt),
					t.svg.appendChild(this.Ft),
					this
				);
			}),
				(a.prototype.render = function(t) {
					if (t !== this.xt) {
						t.displayPortion !== this.xt.displayPortion &&
							(this.Ft.style.strokeDashoffset = this.z(t.displayPortion));
						var i = this.H(t);
						if (i !== this.H(this.xt)) {
							var n = i.r,
								r = i.g,
								o = i.b,
								s = i.a;
							e.attrs(this.Ft, {
								stroke: 'rgba(' + n + ',' + r + ',' + o + ',' + s + ')'
							});
						}
						t.opacity !== this.xt.opacity && (this.Ft.style.opacity = t.opacity),
							(this.xt = t);
					}
				}),
				(t.exports = a);
		},
		function(t, i, n) {
			'use strict';
			var e = n(3),
				u = n(2).getPathString;
			function r() {
				this.xt = {};
			}
			(r.prototype.mount = function(t) {
				(this.Et = e.createElm('path')), t.svg.appendChild(this.Et);
			}),
				(r.prototype.render = function(t) {
					if (t !== this.xt) {
						if (
							t.strokeColor !== this.xt.strokeColor ||
							t.strokeWidth !== this.xt.strokeWidth
						) {
							var i = t.strokeColor,
								n = i.r,
								r = i.g,
								o = i.b,
								s = i.a;
							e.attrs(this.Et, {
								fill: 'none',
								stroke: 'rgba(' + n + ',' + r + ',' + o + ',' + s + ')',
								'stroke-width': t.strokeWidth,
								'stroke-linecap': 'round',
								'stroke-linejoin': 'round'
							});
						}
						t.opacity !== this.xt.opacity && e.attr(this.Et, 'opacity', t.opacity),
							t.points !== this.xt.points && e.attr(this.Et, 'd', u(t.points)),
							(this.xt = t);
					}
				}),
				(r.prototype.destroy = function() {
					e.removeElm(this.Et);
				}),
				(t.exports = r);
		},
		function(i, t, r) {
			'use strict';
			(function(u) {
				var t = r(3),
					h = t.createElm,
					a = t.attrs,
					n = r(7);
				function c(t, i) {
					(this.svg = t),
						(this.defs = i),
						(this.node = t),
						this.node.createSVGPoint && (this.It = this.node.createSVGPoint());
				}
				((c.prototype = Object.create(n.prototype)).createSubRenderTarget = function() {
					var t = h('g');
					return this.svg.appendChild(t), new c(t, this.defs);
				}),
					(c.prototype._ = function(t) {
						if (this.It) {
							(this.It.x = t.clientX), (this.It.y = t.clientY);
							var i = this.It.matrixTransform(this.node.getScreenCTM().inverse());
							return { x: i.x, y: i.y };
						}
						return n.prototype._.call(this, t);
					}),
					(c.prototype.K = function(t) {
						if (this.It) {
							(this.It.x = t.touches[0].clientX), (this.It.y = t.touches[0].clientY);
							var i = this.It.matrixTransform(this.node.getScreenCTM().inverse());
							return { x: i.x, y: i.y };
						}
						return n.prototype.K.call(this, t);
					}),
					(c.init = function(t) {
						var i =
								1 < arguments.length && void 0 !== arguments[1]
									? arguments[1]
									: '100%',
							n =
								2 < arguments.length && void 0 !== arguments[2]
									? arguments[2]
									: '100%',
							r = void 0,
							o = t;
						if (('string' == typeof t && (o = u.document.getElementById(t)), !o))
							throw new Error('HanziWriter target element not found: ' + t);
						var s = o.nodeName.toUpperCase();
						'SVG' === s || 'G' === s ? (r = o) : ((r = h('svg')), o.appendChild(r)),
							a(r, { width: i, height: n });
						var e = h('defs');
						return r.appendChild(e), new c(r, e);
					}),
					(i.exports = c);
			}.call(t, r(1)));
		},
		function(t, i, n) {
			'use strict';
			var r = n(26),
				o = n(30);
			t.exports = { HanziWriterRenderer: r, createRenderTarget: o.init };
		},
		function(t, i, n) {
			'use strict';
			var r = n(27),
				s = n(29),
				e = n(0).assign;
			function o(t, i) {
				(this.V = t),
					(this.q = i),
					(this.Ct = new r(t)),
					(this.Mt = new r(t)),
					(this.St = new r(t));
			}
			(o.prototype.mount = function(t) {
				this.Wt = t;
			}),
				(o.prototype.zt = function(t) {
					var i = this.Wt.getContext();
					i.clearRect(0, 0, this.q.width, this.q.height),
						i.save(),
						i.translate(this.q.xOffset, this.q.height - this.q.yOffset),
						i.transform(1, 0, 0, -1, 0, 0),
						i.scale(this.q.scale, this.q.scale),
						t(i),
						i.restore(),
						i.draw && i.draw();
				}),
				(o.prototype.render = function(o) {
					var t = this;
					this.zt(function(n) {
						t.Mt.render(n, {
							opacity: o.character.outline.opacity,
							strokes: o.character.outline.strokes,
							strokeColor: o.options.outlineColor
						}),
							t.Ct.render(n, {
								opacity: o.character.main.opacity,
								strokes: o.character.main.strokes,
								strokeColor: o.options.strokeColor,
								radicalColor: o.options.radicalColor
							}),
							t.St.render(n, {
								opacity: o.character.highlight.opacity,
								strokes: o.character.highlight.strokes,
								strokeColor: o.options.highlightColor
							});
						var r = o.userStrokes || {};
						Object.keys(r).forEach(function(t) {
							if (r[t]) {
								var i = e(
									{
										strokeWidth: o.options.drawingWidth,
										strokeColor: o.options.drawingColor
									},
									r[t]
								);
								s(n, i);
							}
						});
					});
				}),
				(o.prototype.destroy = function() {}),
				(t.exports = o);
		},
		function(t, i, n) {
			'use strict';
			var r = n(28);
			function o(t) {
				this.Ot = t.strokes.map(function(t) {
					return new r(t);
				});
			}
			(o.prototype.render = function(t, i) {
				if (!(i.opacity < 0.05))
					for (var n = 0; n < this.Ot.length; n++)
						this.Ot[n].render(t, {
							strokeColor: i.strokeColor,
							radicalColor: i.radicalColor,
							opacity: i.strokes[n].opacity * i.opacity,
							displayPortion: i.strokes[n].displayPortion
						});
			}),
				(t.exports = o);
		},
		function(e, t, u) {
			'use strict';
			(function(n) {
				var r = u(2).extendStart,
					t = u(8),
					a = t.drawPath,
					o = t.pathStringToCanvas,
					i = u(6);
				function s(t) {
					var i = !(1 < arguments.length && void 0 !== arguments[1]) || arguments[1];
					(this.L = t),
						(this.R = t.getLength() + 100),
						i && n.Path2D
							? (this.Rt = new n.Path2D(this.L.path))
							: (this.Ht = o(this.L.path)),
						(this.Lt = r(this.L.points, 100));
				}
				((s.prototype = Object.create(i.prototype)).render = function(t, i) {
					if (!(i.opacity < 0.05)) {
						t.save(),
							this.Rt
								? t.clip(this.Rt)
								: (this.Ht(t), (t.globalAlpha = 0), t.stroke(), t.clip());
						var n = this.H(i),
							r = n.r,
							o = n.g,
							s = n.b,
							e = n.a,
							u =
								1 === e
									? 'rgb(' + r + ',' + o + ',' + s + ')'
									: 'rgb(' + r + ',' + o + ',' + s + ',' + e + ')',
							h = this.z(i.displayPortion);
						(t.globalAlpha = i.opacity),
							(t.strokeStyle = u),
							(t.fillStyle = u),
							(t.lineWidth = 200),
							(t.lineCap = 'round'),
							(t.lineJoin = 'round'),
							t.setLineDash([this.R, this.R], h),
							(t.lineDashOffset = h),
							a(t, this.Lt),
							t.restore();
					}
				}),
					(e.exports = s);
			}.call(t, u(1)));
		},
		function(t, i, n) {
			'use strict';
			var u = n(8).drawPath;
			t.exports = function(t, i) {
				if (!(i.opacity < 0.05)) {
					var n = i.strokeColor,
						r = n.r,
						o = n.g,
						s = n.b,
						e = n.a;
					t.save(),
						(t.globalAlpha = i.opacity),
						(t.lineWidth = i.strokeWidth),
						(t.strokeStyle = 'rgba(' + r + ',' + o + ',' + s + ',' + e + ')'),
						(t.lineCap = 'round'),
						(t.lineJoin = 'round'),
						u(t, i.points),
						t.restore();
				}
			};
		},
		function(i, t, n) {
			'use strict';
			(function(s) {
				var t = n(7);
				function e(t) {
					this.node = t;
				}
				((e.prototype = Object.create(t.prototype)).getContext = function() {
					return this.node.getContext('2d');
				}),
					(e.init = function(t) {
						var i =
								1 < arguments.length && void 0 !== arguments[1]
									? arguments[1]
									: '100%',
							n =
								2 < arguments.length && void 0 !== arguments[2]
									? arguments[2]
									: '100%',
							r = void 0,
							o = t;
						if (('string' == typeof t && (o = s.document.getElementById(t)), !o))
							throw new Error('HanziWriter target element not found: ' + t);
						return (
							'CANVAS' === o.nodeName.toUpperCase()
								? (r = o)
								: ((r = s.document.createElement('canvas')), o.appendChild(r)),
							r.setAttribute('width', i),
							r.setAttribute('height', n),
							new e(r)
						);
					}),
					(i.exports = e);
			}.call(t, n(1)));
		},
		function(t, i, n) {
			'use strict';
			(function(o) {
				t.exports = function(t, i, n) {
					var r = new o.XMLHttpRequest();
					r.overrideMimeType && r.overrideMimeType('application/json'),
						r.open(
							'GET',
							'https://cdn.jsdelivr.net/npm/hanzi-writer-data@2.0/' + t + '.json',
							!0
						),
						(r.onerror = function(t) {
							n(r, t);
						}),
						(r.onreadystatechange = function() {
							4 === r.readyState &&
								(200 === r.status
									? i(JSON.parse(r.responseText))
									: 0 !== r.status && n && n(r));
						}),
						r.send(null);
				};
			}.call(i, n(1)));
		},
		function(t, i, n) {
			'use strict';
			var r = n(0).callIfExists;
			function o(t) {
				(this.Ut = 0), (this.B = t), (this._t = !1), (this.loadingFailed = !1);
			}
			(o.prototype.Kt = function(t, i) {
				var n = this,
					r = function(t) {
						i === n.Ut && n.I(t);
					},
					o = this.B.charDataLoader(t, r, function(t) {
						i === n.Ut && n.Nt(t);
					});
				o && r(o);
			}),
				(o.prototype.Bt = function() {
					var n = this;
					return new Promise(function(t, i) {
						(n.I = t), (n.Nt = i);
					}).then(
						function(t) {
							return (n._t = !1), r(n.B.onLoadCharDataSuccess, t), t;
						},
						function(t) {
							if (
								((n._t = !1),
								(n.loadingFailed = !0),
								r(n.B.onLoadCharDataError, t),
								!n.B.onLoadCharDataError)
							) {
								if (t instanceof Error) throw t;
								var i = new Error('Failed to load char data for ' + n.Gt);
								throw ((i.reason = t), i);
							}
						}
					);
				}),
				(o.prototype.loadCharData = function(t) {
					this.Gt = t;
					var i = this.Bt();
					return (
						(this.loadingFailed = !1), (this._t = !0), this.Ut++, this.Kt(t, this.Ut), i
					);
				}),
				(t.exports = o);
		}
	]);
});
