-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsubmission.html
More file actions
365 lines (333 loc) · 26.8 KB
/
Copy pathsubmission.html
File metadata and controls
365 lines (333 loc) · 26.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Build, test, package, and submit a runnable Agent for the Build-Bench Challenge." />
<title>Participate | Build-Bench Challenge</title>
<link rel="canonical" href="https://aiops-lab-nku.github.io/BuildBench/submission.html" />
<link rel="icon" type="image/svg+xml" href="assets/logo.svg" />
<link rel="alternate icon" type="image/png" href="assets/favicon.png" />
<link rel="stylesheet" href="styles.css?v=20260810-7" />
<script src="assets/vendor/lucide.min.js?v=20260810-7" defer></script>
<script src="i18n/submission.js?v=20260810-1" defer></script>
<script src="i18n.js?v=20260810-7" defer></script>
<script src="auth-client.js?v=20260810-7" defer></script>
<script src="app.js?v=20260810-7" defer></script>
</head>
<body data-page="submission">
<a class="skip-link" href="#main-content">Skip to main content</a>
<header class="site-header">
<div class="header-inner">
<a class="brand" href="index.html" aria-label="Build-Bench Challenge home"><span class="brand-mark" aria-hidden="true"><img src="assets/logo.svg" alt="" /></span><span>Build-Bench</span></a>
<button class="icon-button menu-button" type="button" aria-label="Open navigation" aria-expanded="false" aria-controls="site-nav" title="Open navigation" data-menu-button><i data-lucide="menu" aria-hidden="true"></i></button>
<nav class="site-nav" id="site-nav" aria-label="Primary navigation" data-nav>
<a href="index.html">Overview</a>
<a href="task.html">Challenge</a>
<a class="active" href="submission.html" aria-current="page">Participate</a>
<a href="evaluation.html">Evaluation</a>
<a class="nav-emphasis" href="leaderboard.html"><i data-lucide="trophy" aria-hidden="true"></i>Leaderboard</a>
<a href="rules.html">Rules</a>
<div class="nav-more" data-nav-more>
<button class="nav-more-toggle" type="button" aria-expanded="false" aria-controls="nav-more-menu" data-nav-more-toggle>
<span>More</span><span class="nav-more-caret" aria-hidden="true">▾</span>
</button>
<div class="nav-more-menu" id="nav-more-menu" data-nav-more-menu>
<a href="timeline.html"><span>Timeline</span><small>Competition dates and milestones</small></a>
<a href="faq.html"><span>FAQ</span><small>Common questions and participant support</small></a>
</div>
</div>
</nav>
</div>
</header>
<main id="main-content">
<section class="page-masthead submission-guide-masthead">
<div class="content-wrap submission-hero-grid">
<div class="submission-hero-copy">
<span class="page-kicker"><i data-lucide="package-open" aria-hidden="true"></i>Participation</span>
<h1>Build, test, and submit your Agent</h1>
<p>Build-Bench participants submit a runnable repair Agent, not Case-specific answers or pre-generated patches.</p>
<p>Use the Starter Kit with a coding assistant or follow the manual workflow to develop, test, package, and upload an immutable Agent version. After upload, the platform performs submission checks and runs the Hosted Smoke Test. A qualified version can then be selected for Full Evaluation.</p>
</div>
</div>
</section>
<div class="content-wrap page-layout right-doc-layout submission-guide-layout">
<aside class="page-rail submission-guide-rail competition-page-rail" aria-label="Participation navigation">
<div class="rail-navigation-group">
<strong>Competition</strong>
<nav class="competition-navigation" aria-label="Competition pages">
<a class="active" href="submission.html" aria-current="page"><i data-lucide="book-open" aria-hidden="true"></i>Get Started</a>
<a href="data-downloads.html"><i data-lucide="database" aria-hidden="true"></i>Data & Downloads</a>
<a href="my-submissions.html"><i data-lucide="inbox" aria-hidden="true"></i>My Submissions</a>
</nav>
</div>
<div class="rail-navigation-group on-page-navigation">
<strong>On this page</strong>
<nav aria-label="On this page">
<a href="#quick-start">Quick start</a>
<a href="#agent-package">Agent package</a>
<a href="#runtime-interface">Runtime interface</a>
<a href="#test-and-qualify">Test and qualify</a>
<a href="#final-checklist">Final checklist</a>
</nav>
</div>
</aside>
<article class="page-document submission-guide-document">
<section class="doc-section" id="quick-start">
<span class="section-label">01 / Start</span>
<h2>Quick start</h2>
<p>Choose the coding-agent path for tools such as Codex, Claude Code, Cursor, or Copilot, or follow the same workflow manually. Both paths produce the same submission ZIP and are evaluated identically.</p>
<nav class="quick-start-path-links" aria-label="Quick start paths">
<a href="#coding-agent-quick-start">Coding Agent Quick Start</a>
<a href="#manual-quick-start">Manual Quick Start</a>
</nav>
<section class="coding-agent-start" id="coding-agent-quick-start" aria-labelledby="coding-agent-quick-start-title">
<span class="quick-start-path-label">Recommended for coding assistants</span>
<h3 id="coding-agent-quick-start-title">Coding Agent Quick Start</h3>
<p>Download and extract Starter Kit <code>v0.1.0-rc.2</code>, open its root directory in your coding assistant, and give it this instruction:</p>
<div class="code-block quick-start-command coding-agent-prompt"><pre><code>Read AGENTS.md before changing files. Bootstrap my-agent, implement the Repair Agent only in the generated Agent directory, then run the readiness workflow. Explain any failed check before changing configuration.</code></pre></div>
<p>The coding assistant should use the versioned contract in <code>AGENTS.md</code> and run:</p>
<div class="code-block quick-start-command"><pre><code>./bb bootstrap my-agent --json
# After implementing agents/my-agent/src/
./bb ready --agent ./agents/my-agent --json</code></pre></div>
<ol class="coding-agent-checks">
<li><code>bootstrap</code> checks the local environment and creates <code>agents/my-agent/</code> without silently overwriting existing work.</li>
<li><code>ready</code> snapshots that Agent, runs the released Example Cases and submission checks, and packages only a passing version.</li>
<li>Completion requires a JSON result with <code>"status": "succeeded"</code>, an existing ZIP, and a matching SHA-256.</li>
</ol>
<p class="quick-start-result"><i data-lucide="check-circle-2" aria-hidden="true"></i><span>Expected: <code>dist/agent-submission.zip</code> is ready to upload. The coding assistant should report changed files, checks run, test results, ZIP path, and SHA-256.</span></p>
<p>bootstrap and ready provide the high-level coding-assistant workflow; the equivalent granular commands are documented in Manual Quick Start below.</p>
</section>
<section class="human-quick-start" id="manual-quick-start" aria-labelledby="manual-quick-start-title">
<h3 id="manual-quick-start-title">Manual Quick Start</h3>
<p>You need a Linux or WSL2 shell, Git, and Docker Engine 24+ or Docker Desktop with Linux containers. The following granular commands expose every preparation step for manual use and debugging.</p>
<ol class="quick-start-steps" aria-label="Manual submission preparation steps">
<li>
<span class="quick-start-number">01</span>
<div class="quick-start-step">
<strong>Get the Starter Kit</strong>
<p>Download the current ZIP from <a href="data-downloads.html">Data & Downloads</a>, extract it in a Linux or WSL2 shell, and enter the versioned directory.</p>
<div class="code-block quick-start-command"><pre><code>KIT_VERSION=0.1.0-rc.2
unzip "buildbench-starter-kit-${KIT_VERSION}.zip"
cd "buildbench-starter-kit-${KIT_VERSION}"</code></pre></div>
<dl class="quick-start-details">
<div><dt>Configure</dt><dd>No project configuration is required at this step. Keep the entire extracted directory together.</dd></div>
<div><dt>Verify</dt><dd>Run <code>pwd</code> and <code>ls</code>; all later <code>./bb</code> commands must be executed from this directory.</dd></div>
</dl>
<p class="quick-start-result"><i data-lucide="check-circle-2" aria-hidden="true"></i><span>Expected: the current directory contains <code>bb</code>, <code>agents/</code>, and <code>example-cases/</code>.</span></p>
</div>
</li>
<li>
<span class="quick-start-number">02</span>
<div class="quick-start-step">
<strong>Run the official demo</strong>
<p>Check Git, Docker, and the versioned images, then run the complete failure-to-success example.</p>
<div class="code-block quick-start-command"><pre><code>./bb doctor
./bb demo</code></pre></div>
<dl class="quick-start-details">
<div><dt>Configure</dt><dd>Use the image references pinned by the release. If the organizer provides a registry mirror, set <code>BB_AGENT_IMAGE</code>, <code>BB_VALIDATOR_IMAGE</code>, and <code>BB_EXAMPLE_ASSETS_IMAGE</code> before running <code>doctor</code>.</dd></div>
<div><dt>What it runs</dt><dd><code>doctor</code> performs environment checks only. <code>demo</code> uses the official Example Agent and the self-contained <code>hello</code> Case; it does not use your Agent code.</dd></div>
</dl>
<p class="quick-start-result"><i data-lucide="check-circle-2" aria-hidden="true"></i><span>Expected: <code>Final validation succeeded</code>; evidence is saved under <code>runs/demo/</code>.</span></p>
</div>
</li>
<li>
<span class="quick-start-number">03</span>
<div class="quick-start-step">
<strong>Create your Agent</strong>
<p>Copy the managed Python template into a new editable Agent directory.</p>
<div class="code-block quick-start-command"><pre><code>./bb init my-agent</code></pre></div>
<dl class="quick-start-details">
<div><dt>Argument</dt><dd><code>my-agent</code> becomes both the directory name and default <code>agent.name</code>. Use 2–64 lowercase letters, digits, or hyphens.</dd></div>
<div><dt>Configure</dt><dd>Edit repair logic under <code>src/</code>, pin Python dependencies with <code>==</code> in <code>requirements.lock</code>, and change name, version, or entrypoint in <code>agent.yaml</code>.</dd></div>
</dl>
<p class="quick-start-result"><i data-lucide="check-circle-2" aria-hidden="true"></i><span>Expected: a new Agent is created at <code>agents/my-agent/</code>; existing directories are never overwritten.</span></p>
</div>
</li>
<li>
<span class="quick-start-number">04</span>
<div class="quick-start-step">
<strong>Develop and test your Agent</strong>
<p>Implement the repair logic in <code>agents/my-agent/src/</code>, then run every bundled Example Case.</p>
<div class="code-block quick-start-command"><pre><code># Edit agents/my-agent/src/main.py
./bb test --agent ./agents/my-agent</code></pre></div>
<dl class="quick-start-details">
<div><dt>Input</dt><dd><code>--agent</code> must point to the Agent directory that contains <code>agent.yaml</code>. The command runs each ID listed in <code>example-cases/cases.txt</code>; release <code>v0.1.0-rc.2</code> contains one local Example Case, <code>hello</code>.</dd></div>
<div><dt>Agent behavior</dt><dd>The entrypoint declared in <code>agent.yaml</code> runs once per Case. It reads <code>/workspace/input</code>, edits <code>/workspace/work/repo</code>, and writes <code>/workspace/output/agent-result.json</code>.</dd></div>
</dl>
<p class="quick-start-result"><i data-lucide="check-circle-2" aria-hidden="true"></i><span>Expected: per-Case patches, logs, and validation results are written under <code>runs/tests/my-agent/</code>.</span></p>
</div>
</li>
<li>
<span class="quick-start-number">05</span>
<div class="quick-start-step">
<strong>Check and package</strong>
<p>Validate the manifest, entrypoint, dependencies, and files before creating a deterministic upload bundle.</p>
<div class="code-block quick-start-command"><pre><code>./bb check --agent ./agents/my-agent
./bb package --agent ./agents/my-agent</code></pre></div>
<dl class="quick-start-details">
<div><dt>Check</dt><dd>Rejects missing required files, unsupported manifest fields, invalid entrypoints, unpinned dependencies, generated outputs, caches, symbolic links, and likely credentials.</dd></div>
<div><dt>Package</dt><dd>Writes <code>dist/agent-submission.zip</code> by default. Use <code>--output path/name.zip</code> only when you need a different local filename.</dd></div>
</dl>
<p class="quick-start-result"><i data-lucide="check-circle-2" aria-hidden="true"></i><span>Expected: both checks pass and the command prints the ZIP path, size, and SHA-256.</span></p>
</div>
</li>
<li>
<span class="quick-start-number">06</span>
<div class="quick-start-step">
<strong>Upload your Agent</strong>
<p>Open <a href="my-submissions.html">My Submissions</a>, choose <strong>Make new submission</strong>, and upload the generated ZIP.</p>
<div class="code-block quick-start-command"><pre><code>ls -lh dist/agent-submission.zip</code></pre></div>
<dl class="quick-start-details">
<div><dt>Upload</dt><dd>Select the ZIP produced by <code>./bb package</code>, not the whole Starter Kit directory and not a ZIP you assembled manually.</dd></div>
<div><dt>After upload</dt><dd>The platform stores an immutable Agent version, performs static checks, and then runs the hosted Smoke Test. Full evaluation starts only after you explicitly select a qualified version.</dd></div>
</dl>
<p class="quick-start-result"><i data-lucide="check-circle-2" aria-hidden="true"></i><span>Expected: a new immutable Agent version appears in the submission table and enters the Checking state.</span></p>
</div>
</li>
</ol>
</section>
<p class="submission-case-scope">Different versioned Case sets are used for local examples, development, hosted Smoke Tests, and Full Evaluation. See <a href="data-downloads.html">Data & Downloads</a> for their scope and release status.</p>
</section>
<section class="doc-section" id="agent-package">
<span class="section-label">02 / Package</span>
<h2>Agent package</h2>
<p>Upload one ZIP archive with a shallow, inspectable root. The platform reads the manifest before building the Agent runtime.</p>
<div class="submission-package-grid">
<div class="code-block submission-code">
<div class="code-toolbar"><span>agent-submission.zip</span><small>archive root</small></div>
<pre><code>agent-submission.zip
├── agent.yaml
├── src/
├── requirements.lock
└── README.md</code></pre>
</div>
<dl class="submission-file-notes">
<div><dt><code>agent.yaml</code></dt><dd><strong>Required.</strong> Declares Agent identity, managed runtime, entrypoint, and protocol version.</dd></div>
<div><dt><code>src/</code></dt><dd><strong>Required.</strong> Contains the Agent implementation and the declared Python module or script.</dd></div>
<div><dt><code>requirements.lock</code></dt><dd><strong>Required.</strong> Declare every third-party Python dependency with an exact <code>==</code> version.</dd></div>
<div><dt><code>README.md</code></dt><dd><strong>Required in v0.1.</strong> Describes how the Agent works and any participant-facing notes.</dd></div>
</dl>
</div>
<aside class="submission-warning" role="note">
<i data-lucide="circle-slash-2" aria-hidden="true"></i>
<div><strong>Do not include secrets or evaluation answers.</strong><p>Exclude <code>.env</code> files, API keys, pre-generated patches, hidden Case information, caches, and runtime artifacts.</p></div>
</aside>
<h3>Minimum <code>agent.yaml</code></h3>
<p>The manifest declares how the platform builds and starts the Agent. Version <code>0.1</code> supports the managed Python 3.11 profile; the Starter Kit validates this exact contract before packaging.</p>
<div class="code-block submission-code manifest-example">
<div class="code-toolbar"><span>agent.yaml</span><small>minimum managed-runtime example</small></div>
<pre><code>schema_version: "0.1"
agent:
name: "example-agent"
version: "1.0.0"
runtime:
type: "managed"
profile: "python-3.11"
entrypoint:
- "python"
- "-m"
- "src.main"
protocol:
version: "0.1"</code></pre>
</div>
</section>
<section class="doc-section" id="runtime-interface">
<span class="section-label">03 / Runtime</span>
<h2>Runtime interface</h2>
<p>Each Case starts in a fresh workspace. The original input remains unchanged while the Agent works on a writable copy.</p>
<h3>Execution contract</h3>
<dl class="submission-prose-definitions" aria-label="Agent execution contract">
<div><dt>Invocation</dt><dd>The platform starts the <code>entrypoint</code> list from <code>agent.yaml</code> once for each Case, with the Agent bundle as the process working directory.</dd></div>
<div><dt>Workspace variable</dt><dd><code>BB_WORKSPACE=/workspace</code>. Resolve all Case input, worktree, and structured output paths from this root.</dd></div>
<div><dt>Completion</dt><dd>For the current v0.1 local protocol, exit with code <code>0</code> and write <code>/workspace/output/agent-result.json</code> with <code>status: "completed"</code>. A non-zero exit is an Agent error.</dd></div>
<div><dt>Diagnostics</dt><dd>Write human-readable progress to stdout or stderr. Do not place secrets in logs; both streams are retained by the platform.</dd></div>
</dl>
<h3>Workspace</h3>
<div class="runtime-interface-grid">
<div class="code-block submission-code">
<div class="code-toolbar"><span>/workspace</span><small>one Case run</small></div>
<pre><code>/workspace/
├── input/ # read-only
├── work/
│ └── repo/ # writable
└── output/ # writable</code></pre>
</div>
<ul class="runtime-rules">
<li><strong>Read <code>input/</code>.</strong><span>It contains the task metadata, initial failure evidence, and original package tree.</span></li>
<li><strong>Modify only <code>work/repo/</code>.</strong><span>This is the candidate package tree used for build requests.</span></li>
<li><strong>Use stdout and stderr for logs.</strong><span>The platform captures both streams for diagnostics.</span></li>
<li><strong>Write <code>agent-result.json</code>.</strong><span>Place machine-readable completion status and diagnostics in <code>output/</code>.</span></li>
</ul>
</div>
<div class="code-block submission-code agent-result-example">
<div class="code-toolbar"><span>output/agent-result.json</span><small>minimal successful result</small></div>
<pre><code>{
"schema_version": "0.1",
"status": "completed",
"message": "Repair attempt completed.",
"modified_paths": ["input/package.spec"]
}</code></pre>
</div>
<h3>Build feedback</h3>
<p class="submission-inline-note info-note"><strong>Planned feature.</strong> Bounded hosted build feedback will be introduced in a later protocol release. Its CLI, limits, and response schema are not part of Starter Kit <code>v0.1.0-rc.2</code>.</p>
<h3>Canonical patch</h3>
<p>The platform derives the canonical patch from the modified worktree. How that patch is checked and rebuilt is defined in the <a href="evaluation.html#case-evaluation">Evaluation Protocol</a>.</p>
</section>
<section class="doc-section" id="test-and-qualify">
<span class="section-label">04 / Qualify</span>
<h2>Test and qualify</h2>
<p class="submission-section-intro">Test the exact Agent version you intend to evaluate. Local checks catch packaging errors; the hosted Smoke Test checks that the same bundle can run under the competition protocol.</p>
<div class="submission-guide-subsection">
<h3>Before full evaluation</h3>
<p>Before spending a Full Evaluation attempt, run <code>./bb check</code>, test the Agent on all released Example Cases, package that exact version, upload it, and pass the Hosted Smoke Test. Full Evaluation begins only after you explicitly select the qualified immutable version.</p>
</div>
<div class="submission-guide-subsection">
<h3>Testing locally</h3>
<p>Local testing should confirm that the submission contract works before organizer resources are used. Check all of the following:</p>
<ul class="submission-checklist">
<li>The ZIP opens with <code>agent.yaml</code> and <code>src/</code> at its root.</li>
<li>The manifest passes <code>./bb check</code> and declares one valid managed-Python entrypoint.</li>
<li>The entrypoint starts without interactive input, writes the required structured result, and exits with code <code>0</code> when it completes normally.</li>
<li><code>/workspace/input</code> remains unchanged; repository edits are confined to <code>/workspace/work/repo</code>.</li>
<li><code>/workspace/output/agent-result.json</code> contains <code>schema_version: "0.1"</code> and a supported status.</li>
<li>The Agent completes at least one released local Example Case.</li>
</ul>
<p class="submission-inline-note info-note"><span>Release candidate</span>Starter Kit <code>v0.1.0-rc.2</code> adds the coding-agent guide and high-level readiness workflow while retaining the local Runner, managed-Python template, one <code>hello</code> Example Case, conformance checks, and deterministic packaging. Development Cases and standalone protocol schemas remain on the release roadmap.</p>
</div>
<div class="submission-guide-subsection">
<h3>Smoke tests</h3>
<p>A hosted Smoke Test uses the same Agent Runner, workspace layout, and status schema as formal evaluation, but runs only a small set of lightweight public Cases. It is intended to expose missing dependencies, invalid entrypoints, permission errors, and malformed output before a full evaluation.</p>
<p>Smoke Test results include more detailed logs and diagnostics than the leaderboard. They do not contribute to the official score, and passing a Smoke Test does not guarantee success on the full Case set.</p>
</div>
</section>
<section class="doc-section" id="final-checklist">
<span class="section-label">05 / Final</span>
<h2>Final checklist</h2>
<p class="submission-section-intro">Use this checklist on the exact immutable Agent version that you intend to upload and evaluate.</p>
<div class="submission-guide-subsection">
<h3>Final submission checklist</h3>
<ul class="submission-checklist">
<li>Required files exist at the ZIP root.</li>
<li><code>./bb check</code> passes.</li>
<li>The entrypoint is deterministic and non-interactive.</li>
<li>All dependencies are exactly pinned.</li>
<li>No secrets, caches, generated patches, or run artifacts are included.</li>
<li>Only <code>/workspace/work/repo</code> is modified.</li>
<li><code>agent-result.json</code> follows protocol <code>v0.1</code>.</li>
<li>The uploaded version passes the Hosted Smoke Test.</li>
<li>The intended immutable version is selected for Full Evaluation.</li>
</ul>
</div>
<div class="submission-guide-subsection">
<h3>Runtime and policy</h3>
<p>The Agent runs as a non-root user in an isolated runtime, <code>/workspace/input</code> is read-only, and the Docker Socket is not provided. Remaining network, resource, quota, and submission policies will be published before submissions open.</p>
</div>
</section>
<nav class="next-page" aria-label="Next page"><span>Next</span><a href="data-downloads.html"><strong>Data & Downloads</strong><small>See the competition resources and release status</small><i data-lucide="arrow-right" aria-hidden="true"></i></a></nav>
</article>
</div>
</main>
<footer class="site-footer"><div class="footer-inner"><div class="footer-brand"><span class="brand-mark" aria-hidden="true"><img src="assets/logo.svg" alt="" /></span><div><strong>Build-Bench Challenge</strong><small>ICSE 2027 Competition Track</small></div></div><nav class="footer-links" aria-label="Footer navigation"><a href="submission.html">Participate</a><a href="evaluation.html">Evaluation</a><a href="timeline.html">Timeline</a><a href="faq.html">FAQ</a></nav><a href="#main-content">Back to top<i data-lucide="arrow-up" aria-hidden="true"></i></a></div></footer>
</body>
</html>