// Path: src/uk/ac/open/lts/webmaths/WebMathsService.java
// public class WebMathsService
// {
// 	@Resource
// 	private WebServiceContext context;
// 
// 	/**
// 	 * MathML namespace.
// 	 */
// 	public final static String NS = "http://www.w3.org/1998/Math/MathML";
// 
// 	private final static Pattern REGEX_DOCTYPE = Pattern.compile(
// 		"^\\s*<!DOCTYPE[^>]+>");
// 
// 	/**
// 	 * Parses a MathML string.
// 	 * @param xml MathML content
// 	 * @return XML document
// 	 * @throws IOException Any error
// 	 */
// 	public Document parseMathml(String xml) throws Exception
// 	{
// 		ServletContext servletContext = null;
// 		if(context != null)
// 		{
// 			servletContext = (ServletContext)context.getMessageContext().get(
// 				MessageContext.SERVLET_CONTEXT);
// 		}
// 		return parseMathml(servletContext, xml);
// 
// 	}
// 
// 	/**
// 	 * Parses a MathML string.
// 	 * @param context Servlet context
// 	 * @param xml MathML content
// 	 * @return XML document
// 	 * @throws IOException Any error
// 	 */
// 	public static Document parseMathml(ServletContext context, String xml)
// 		throws IOException
// 	{
// 		// Get rid of doctype if supplied.
// 		xml = REGEX_DOCTYPE.matcher(xml).replaceFirst("");
// 		// Fix entities.
// 		xml = MathmlEntityFixer.getFixer(context).fix(xml);
// 		// Parse.
// 		return parseXml(context, xml);
// 	}
// 
// 	/**
// 	 * Parses an XML document
// 	 * @param context Servlet context
// 	 * @param xml XML string
// 	 * @return XML document
// 	 * @throws IOException Any error
// 	 */
// 	public static Document parseXml(ServletContext context, String xml)
// 		throws IOException
// 	{
//   	// Parse final string
// 		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 		factory.setNamespaceAware(true);
// 		DocumentBuilder builder;
// 		try
// 		{
// 			builder = factory.newDocumentBuilder();
// 			return builder.parse(new InputSource(new StringReader(xml)));
// 		}
// 		catch(ParserConfigurationException e)
// 		{
// 			throw new IOException("Error with parser setup", e);
// 		}
// 		catch(SAXException e)
// 		{
// 			throw new IOException("Invalid XML", e);
// 		}
// 	}
// 
// 	/**
// 	 * @return The fixer object
// 	 */
// 	protected MathmlEntityFixer getFixer()
// 	{
// 		ServletContext servletContext = null;
// 		if(context != null)
// 		{
// 			servletContext = (ServletContext)context.getMessageContext().get(
// 				MessageContext.SERVLET_CONTEXT);
// 		}
// 		return MathmlEntityFixer.getFixer(servletContext);
// 	}
// }


import net.sourceforge.jeuclid.elements.generic.DocumentElement;
import net.sourceforge.jeuclid.layout.JEuclidView;
import org.w3c.dom.*;
import org.xml.sax.SAXParseException;
import uk.ac.open.lts.webmaths.WebMathsService;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.regex.*;
import javax.imageio.ImageIO;
import javax.jws.WebService;
import net.sourceforge.jeuclid.DOMBuilder;
import net.sourceforge.jeuclid.context.*;
				continue;
			}
			if(parentName.equals("munder") && isTextChild(mo, "\ufe38"))
			{
				mo.setAttribute("stretchy", "true");
				mo.removeChild(mo.getFirstChild());
				mo.appendChild(doc.createTextNode("\u23df"));
			}
			else if(parentName.equals("mover") && isTextChild(mo, "\ufe37"))
			{
				mo.setAttribute("stretchy", "true");
				mo.removeChild(mo.getFirstChild());
				mo.appendChild(doc.createTextNode("\u23de"));
			}
		}

		// menclose for long division doesn't allow enough top padding. Oh, and
		// <mpadded> isn't implemented. And there isn't enough padding to left of
		// the bar either. Solve by adding an <mover> with just an <mspace> over#
		// the longdiv, contained within an mrow that adds a <mspace> before it.
		list = doc.getElementsByTagName("menclose");
		for(int i=0; i<list.getLength(); i++)
		{
			Element menclose = (Element)list.item(i);
			// Only for longdiv
			if(!"longdiv".equals(menclose.getAttribute("notation")))
			{
				continue;
			}
			Element mrow = doc.createElementNS(WebMathsService.NS, "mrow");
// Path: src/uk/ac/open/lts/webmaths/WebMathsService.java
// public class WebMathsService
// {
// 	@Resource
// 	private WebServiceContext context;
// 
// 	/**
// 	 * MathML namespace.
// 	 */
// 	public final static String NS = "http://www.w3.org/1998/Math/MathML";
// 
// 	private final static Pattern REGEX_DOCTYPE = Pattern.compile(
// 		"^\\s*<!DOCTYPE[^>]+>");
// 
// 	/**
// 	 * Parses a MathML string.
// 	 * @param xml MathML content
// 	 * @return XML document
// 	 * @throws IOException Any error
// 	 */
// 	public Document parseMathml(String xml) throws Exception
// 	{
// 		ServletContext servletContext = null;
// 		if(context != null)
// 		{
// 			servletContext = (ServletContext)context.getMessageContext().get(
// 				MessageContext.SERVLET_CONTEXT);
// 		}
// 		return parseMathml(servletContext, xml);
// 
// 	}
// 
// 	/**
// 	 * Parses a MathML string.
// 	 * @param context Servlet context
// 	 * @param xml MathML content
// 	 * @return XML document
// 	 * @throws IOException Any error
// 	 */
// 	public static Document parseMathml(ServletContext context, String xml)
// 		throws IOException
// 	{
// 		// Get rid of doctype if supplied.
// 		xml = REGEX_DOCTYPE.matcher(xml).replaceFirst("");
// 		// Fix entities.
// 		xml = MathmlEntityFixer.getFixer(context).fix(xml);
// 		// Parse.
// 		return parseXml(context, xml);
// 	}
// 
// 	/**
// 	 * Parses an XML document
// 	 * @param context Servlet context
// 	 * @param xml XML string
// 	 * @return XML document
// 	 * @throws IOException Any error
// 	 */
// 	public static Document parseXml(ServletContext context, String xml)
// 		throws IOException
// 	{
//   	// Parse final string
// 		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 		factory.setNamespaceAware(true);
// 		DocumentBuilder builder;
// 		try
// 		{
// 			builder = factory.newDocumentBuilder();
// 			return builder.parse(new InputSource(new StringReader(xml)));
// 		}
// 		catch(ParserConfigurationException e)
// 		{
// 			throw new IOException("Error with parser setup", e);
// 		}
// 		catch(SAXException e)
// 		{
// 			throw new IOException("Invalid XML", e);
// 		}
// 	}
// 
// 	/**
// 	 * @return The fixer object
// 	 */
// 	protected MathmlEntityFixer getFixer()
// 	{
// 		ServletContext servletContext = null;
// 		if(context != null)
// 		{
// 			servletContext = (ServletContext)context.getMessageContext().get(
// 				MessageContext.SERVLET_CONTEXT);
// 		}
// 		return MathmlEntityFixer.getFixer(servletContext);
// 	}
// }


// Path: src/uk/ac/open/lts/webmaths/image/WebMathsImage.java
import net.sourceforge.jeuclid.elements.generic.DocumentElement;
import net.sourceforge.jeuclid.layout.JEuclidView;
import org.w3c.dom.*;
import org.xml.sax.SAXParseException;
import uk.ac.open.lts.webmaths.WebMathsService;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.regex.*;
import javax.imageio.ImageIO;
import javax.jws.WebService;
import net.sourceforge.jeuclid.DOMBuilder;
import net.sourceforge.jeuclid.context.*;

				continue;
			}
			if(parentName.equals("munder") && isTextChild(mo, "\ufe38"))
			{
				mo.setAttribute("stretchy", "true");
				mo.removeChild(mo.getFirstChild());
				mo.appendChild(doc.createTextNode("\u23df"));
			}
			else if(parentName.equals("mover") && isTextChild(mo, "\ufe37"))
			{
				mo.setAttribute("stretchy", "true");
				mo.removeChild(mo.getFirstChild());
				mo.appendChild(doc.createTextNode("\u23de"));
			}
		}

		// menclose for long division doesn't allow enough top padding. Oh, and
		// <mpadded> isn't implemented. And there isn't enough padding to left of
		// the bar either. Solve by adding an <mover> with just an <mspace> over#
		// the longdiv, contained within an mrow that adds a <mspace> before it.
		list = doc.getElementsByTagName("menclose");
		for(int i=0; i<list.getLength(); i++)
		{
			Element menclose = (Element)list.item(i);
			// Only for longdiv
			if(!"longdiv".equals(menclose.getAttribute("notation")))
			{
				continue;
			}
			Element mrow = doc.createElementNS(WebMathsService.NS, "mrow");
			Element mover = doc.createElementNS(WebMathsService.NS, "mover");