import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public class __2F_INCLUDES_5F_TESTS_2F_jsp_5F_include_5F_test_2E_jsp extends javax.servlet.http.HttpServlet{
 String argh = "argh"; 

 public String globalIncludedString = "included";

 protected String with_space = "withspace";

public void _jspService(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
		throws java.io.IOException, javax.servlet.ServletException {
javax.servlet.jsp.PageContext pageContext = JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, JspWriter.DEFAULT_BUFFER, true);
javax.servlet.ServletContext application = pageContext.getServletContext();
javax.servlet.ServletConfig config = pageContext.getServletConfig();
javax.servlet.jsp.JspWriter out = pageContext.getOut();
Object page = this;
javax.servlet.http.HttpSession session = pageContext.getSession();

try {
{out.print("");} //markup
{out.print("");} //markup
 String localIncludedString = globalIncludedString;
for(int i=0; i<5; i++) {
out.print(i);
}
javax.swing.JButton BEAN_includedBean = new javax.swing.JButton();
 int include_include_int = 5; 
javax.swing.JButton includesUseBean = new javax.swing.JButton();
{ // <gifts:gift>
} // </gifts:gift>
{out.print("");} //markup
out.print(   );
{out.print("");} //markup
 } catch (java.lang.Exception e) {} 
}}