From bddf2a866c38792fa8be5c657e23728c0f5b38e6 Mon Sep 17 00:00:00 2001 From: Shulhan Date: Sat, 11 Nov 2023 02:20:42 +0700 Subject: _www: update wui module While at it reformat all files using default prettier. --- _www/environment.js | 1 - _www/environment.ts | 232 +++++++------ _www/functions.js | 71 ++-- _www/functions.ts | 412 +++++++++++------------ _www/http_target.js | 124 +++---- _www/http_target.ts | 864 ++++++++++++++++++++++++------------------------ _www/index.js | 18 +- _www/index.ts | 8 +- _www/interface.js | 1 - _www/interface.ts | 200 ++++++------ _www/nav_links.ts | 133 ++++---- _www/target.js | 22 +- _www/target.ts | 461 ++++++++++++-------------- _www/trunks.js | 404 +++++++++++------------ _www/trunks.ts | 923 ++++++++++++++++++++++++++-------------------------- _www/tsconfig.json | 33 +- _www/vars.js | 1 - _www/vars.ts | 4 +- _www/ws_target.js | 36 +- _www/ws_target.ts | 318 +++++++++--------- _www/wui | 2 +- memfs_www_embed.go | 79 +++-- 22 files changed, 2127 insertions(+), 2220 deletions(-) diff --git a/_www/environment.js b/_www/environment.js index ccd9216..6d26afb 100644 --- a/_www/environment.js +++ b/_www/environment.js @@ -102,4 +102,3 @@ export class Environment { this.com_results_suffix.Set(opts.ResultsSuffix); } } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJlbnZpcm9ubWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0REFBNEQ7QUFDNUQsNENBQTRDO0FBRTVDLE9BQU8sRUFBRSxjQUFjLEVBQXNCLE1BQU0sdUJBQXVCLENBQUE7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBc0IsTUFBTSx1QkFBdUIsQ0FBQTtBQUUxRSxPQUFPLEVBQ04sV0FBVyxFQUNYLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEdBR2hCLE1BQU0sZ0JBQWdCLENBQUE7QUFFdkIsTUFBTSxPQUFPLFdBQVc7SUFVdkIsWUFDUSxNQUF1QixFQUN2QixJQUEwQjtRQUQxQixXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUN2QixTQUFJLEdBQUosSUFBSSxDQUFzQjtRQVhsQyxXQUFNLEdBQWdCLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbEQsZUFBVSxHQUFnQixRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBWXRELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQTtRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUU7WUFDMUIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDckQsQ0FBQyxDQUFBO1FBRUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQ3ZCLENBQUM7SUFFTyxlQUFlO1FBQ3RCLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDM0MsUUFBUSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUE7UUFFbEMsSUFBSSxtQkFB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 \ No newline at end of file diff --git a/_www/environment.ts b/_www/environment.ts index 6cc643d..d68eb09 100644 --- a/_www/environment.ts +++ b/_www/environment.ts @@ -1,140 +1,132 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -import { WuiInputString, WuiInputStringOpts } from "./wui/input/string.js" -import { WuiInputNumber, WuiInputNumberOpts } from "./wui/input/number.js" +import { WuiInputString, WuiInputStringOpts } from "./wui/input/string.js"; +import { WuiInputNumber, WuiInputNumberOpts } from "./wui/input/number.js"; import { - CLASS_INPUT, - CLASS_INPUT_LABEL, - CLASS_NAV_TARGET, - HASH_ENVIRONMENT, - EnvironmentInterface, - TrunksInterface, -} from "./interface.js" + CLASS_INPUT, + CLASS_INPUT_LABEL, + CLASS_NAV_TARGET, + HASH_ENVIRONMENT, + EnvironmentInterface, + TrunksInterface, +} from "./interface.js"; export class Environment { - el_nav: HTMLElement = document.createElement("h3") - el_content: HTMLElement = document.createElement("div") + el_nav: HTMLElement = document.createElement("h3"); + el_content: HTMLElement = document.createElement("div"); - com_listen_address!: WuiInputString - com_max_attack_dur!: WuiInputNumber - com_max_attack_rate!: WuiInputNumber - com_results_dir!: WuiInputString - com_results_suffix!: WuiInputString + com_listen_address!: WuiInputString; + com_max_attack_dur!: WuiInputNumber; + com_max_attack_rate!: WuiInputNumber; + com_results_dir!: WuiInputString; + com_results_suffix!: WuiInputString; - constructor( - public trunks: TrunksInterface, - public opts: EnvironmentInterface, - ) { - this.el_nav.classList.add(CLASS_NAV_TARGET) - this.el_nav.innerText = "Environment" - this.el_nav.onclick = () => { - trunks.SetContent(HASH_ENVIRONMENT, this.el_content) - } + constructor( + public trunks: TrunksInterface, + public opts: EnvironmentInterface, + ) { + this.el_nav.classList.add(CLASS_NAV_TARGET); + this.el_nav.innerText = "Environment"; + this.el_nav.onclick = () => { + trunks.SetContent(HASH_ENVIRONMENT, this.el_content); + }; - this.generateContent() - } + this.generateContent(); + } - private generateContent() { - let el_title = document.createElement("h2") - el_title.innerText = "Environment" + private generateContent() { + let el_title = document.createElement("h2"); + el_title.innerText = "Environment"; - let opts_listen_address: WuiInputStringOpts = { - label: "Listen address", - hint: "The address and port where Trunks is running.", - value: this.opts.ListenAddress, - is_disabled: true, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_hint_toggled: true, - onChangeHandler: (v: string) => { - this.opts.ListenAddress = v - }, - } - this.com_listen_address = new WuiInputString( - opts_listen_address, - ) + let opts_listen_address: WuiInputStringOpts = { + label: "Listen address", + hint: "The address and port where Trunks is running.", + value: this.opts.ListenAddress, + is_disabled: true, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_hint_toggled: true, + onChangeHandler: (v: string) => { + this.opts.ListenAddress = v; + }, + }; + this.com_listen_address = new WuiInputString(opts_listen_address); - let opts_max_attack_dur: WuiInputNumberOpts = { - label: "Max. attack duration (seconds)", - hint: "Maximum attack duration for all targets, in seconds.", - value: this.opts.MaxAttackDuration / 1e9, - min: 1, - is_disabled: true, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_hint_toggled: true, - onChangeHandler: (v: number) => { - this.opts.MaxAttackDuration = v * 1e9 - }, - } - this.com_max_attack_dur = new WuiInputNumber( - opts_max_attack_dur, - ) + let opts_max_attack_dur: WuiInputNumberOpts = { + label: "Max. attack duration (seconds)", + hint: "Maximum attack duration for all targets, in seconds.", + value: this.opts.MaxAttackDuration / 1e9, + min: 1, + is_disabled: true, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_hint_toggled: true, + onChangeHandler: (v: number) => { + this.opts.MaxAttackDuration = v * 1e9; + }, + }; + this.com_max_attack_dur = new WuiInputNumber(opts_max_attack_dur); - let opts_max_attack_rate: WuiInputNumberOpts = { - label: "Max. attack rate", - hint: "Maximum attack rate for all targets.", - value: this.opts.MaxAttackRate, - min: 1, - is_disabled: true, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_hint_toggled: true, - onChangeHandler: (v: number) => { - this.opts.MaxAttackRate = v - }, - } - this.com_max_attack_rate = new WuiInputNumber( - opts_max_attack_rate, - ) + let opts_max_attack_rate: WuiInputNumberOpts = { + label: "Max. attack rate", + hint: "Maximum attack rate for all targets.", + value: this.opts.MaxAttackRate, + min: 1, + is_disabled: true, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_hint_toggled: true, + onChangeHandler: (v: number) => { + this.opts.MaxAttackRate = v; + }, + }; + this.com_max_attack_rate = new WuiInputNumber(opts_max_attack_rate); - let opts_results_dir: WuiInputStringOpts = { - label: "Results directory", - hint: "The directory where the attack result will be saved.", - value: this.opts.ResultsDir, - is_disabled: true, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_hint_toggled: true, - onChangeHandler: (v: string) => { - this.opts.ResultsDir = v - }, - } - this.com_results_dir = new WuiInputString(opts_results_dir) + let opts_results_dir: WuiInputStringOpts = { + label: "Results directory", + hint: "The directory where the attack result will be saved.", + value: this.opts.ResultsDir, + is_disabled: true, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_hint_toggled: true, + onChangeHandler: (v: string) => { + this.opts.ResultsDir = v; + }, + }; + this.com_results_dir = new WuiInputString(opts_results_dir); - let opts_results_suffix: WuiInputStringOpts = { - label: "Results suffix", - hint: "Optional suffix for the file name of attack result.", - value: this.opts.ResultsSuffix, - is_disabled: true, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_hint_toggled: true, - onChangeHandler: (v: string) => { - this.opts.ResultsSuffix = v - }, - } - this.com_results_suffix = new WuiInputString( - opts_results_suffix, - ) + let opts_results_suffix: WuiInputStringOpts = { + label: "Results suffix", + hint: "Optional suffix for the file name of attack result.", + value: this.opts.ResultsSuffix, + is_disabled: true, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_hint_toggled: true, + onChangeHandler: (v: string) => { + this.opts.ResultsSuffix = v; + }, + }; + this.com_results_suffix = new WuiInputString(opts_results_suffix); - this.el_content.appendChild(el_title) - this.el_content.appendChild(this.com_listen_address.el) - this.el_content.appendChild(this.com_max_attack_dur.el) - this.el_content.appendChild(this.com_max_attack_rate.el) - this.el_content.appendChild(this.com_results_dir.el) - this.el_content.appendChild(this.com_results_suffix.el) - } + this.el_content.appendChild(el_title); + this.el_content.appendChild(this.com_listen_address.el); + this.el_content.appendChild(this.com_max_attack_dur.el); + this.el_content.appendChild(this.com_max_attack_rate.el); + this.el_content.appendChild(this.com_results_dir.el); + this.el_content.appendChild(this.com_results_suffix.el); + } - Set(opts: EnvironmentInterface) { - this.opts = opts + Set(opts: EnvironmentInterface) { + this.opts = opts; - this.com_listen_address.Set(opts.ListenAddress) - this.com_max_attack_dur.Set(opts.MaxAttackDuration / 1e9) - this.com_max_attack_rate.Set(opts.MaxAttackRate) - this.com_results_dir.Set(opts.ResultsDir) - this.com_results_suffix.Set(opts.ResultsSuffix) - } + this.com_listen_address.Set(opts.ListenAddress); + this.com_max_attack_dur.Set(opts.MaxAttackDuration / 1e9); + this.com_max_attack_rate.Set(opts.MaxAttackRate); + this.com_results_dir.Set(opts.ResultsDir); + this.com_results_suffix.Set(opts.ResultsSuffix); + } } diff --git a/_www/functions.js b/_www/functions.js index baded27..d151cf6 100644 --- a/_www/functions.js +++ b/_www/functions.js @@ -76,8 +76,15 @@ export function HttpMethodToString(m) { // export function LoadHttpTargetHeader(target, httpTarget, key) { let storageKey = `${target.ID}.http.${httpTarget.ID}.header.${key}`; - return (window.localStorage.getItem(storageKey) || - httpTarget.Headers[key].value); + const val = window.localStorage.getItem(storageKey); + if (val) { + return val; + } + const header = httpTarget.Headers[key]; + if (header) { + return header.value; + } + return ""; } function saveHttpTargetHeader(target, httpTarget, key, value) { let storageKey = `${target.ID}.http.${httpTarget.ID}.header.${key}`; @@ -89,8 +96,15 @@ function saveHttpTargetHeader(target, httpTarget, key, value) { // export function LoadHttpTargetParam(target, httpTarget, key) { let storageKey = `${target.ID}.http.${httpTarget.ID}.param.${key}`; - return (window.localStorage.getItem(storageKey) || - httpTarget.Params[key].value); + const val = window.localStorage.getItem(storageKey); + if (val) { + return val; + } + const param = httpTarget.Params[key]; + if (param) { + return param.value; + } + return ""; } function saveHttpTargetParam(target, httpTarget, key, value) { let storageKey = `${target.ID}.http.${httpTarget.ID}.param.${key}`; @@ -138,8 +152,15 @@ function saveTargetOptTimeout(target) { // export function LoadTargetVar(target, key) { let storageKey = `${target.ID}.var.${key}`; - return (window.localStorage.getItem(storageKey) || - target.Vars[key].value); + const val = window.localStorage.getItem(storageKey); + if (val) { + return val; + } + const tvar = target.Vars[key]; + if (tvar) { + return tvar.value; + } + return ""; } function saveTargetVar(target, key, value) { let storageKey = `${target.ID}.var.${key}`; @@ -150,8 +171,15 @@ function saveTargetVar(target, key, value) { // export function LoadWsTargetHeader(target, wsTarget, key) { let storageKey = `${target.ID}.ws.${wsTarget.ID}.header.${key}`; - return (window.localStorage.getItem(storageKey) || - wsTarget.Headers[key].value); + const val = window.localStorage.getItem(storageKey); + if (val) { + return val; + } + const header = wsTarget.Headers[key]; + if (header) { + return header.value; + } + return ""; } function saveWsTargetHeader(target, wsTarget, key, value) { let storageKey = `${target.ID}.ws.${wsTarget.ID}.header.${key}`; @@ -163,8 +191,15 @@ function saveWsTargetHeader(target, wsTarget, key, value) { // export function LoadWsTargetParam(target, wsTarget, key) { let storageKey = `${target.ID}.ws.${wsTarget.ID}.param.${key}`; - return (window.localStorage.getItem(storageKey) || - wsTarget.Params[key].value); + let val = window.localStorage.getItem(storageKey); + if (val) { + return val; + } + const param = wsTarget.Params[key]; + if (param) { + return param.value; + } + return ""; } function saveWsTargetParam(target, wsTarget, key, value) { let storageKey = `${target.ID}.ws.${wsTarget.ID}.param.${key}`; @@ -178,29 +213,23 @@ export function Save(target, httpTarget, wsTarget) { saveTargetOptDuration(target); saveTargetOptRatePerSecond(target); saveTargetOptTimeout(target); - for (const k in target.Vars) { - let fi = target.Vars[k]; + for (const [k, fi] of Object.entries(target.Vars)) { saveTargetVar(target, k, fi.value); } if (httpTarget) { - for (const k in httpTarget.Headers) { - let fi = httpTarget.Headers[k]; + for (const [k, fi] of Object.entries(httpTarget.Headers)) { saveHttpTargetHeader(target, httpTarget, k, fi.value); } - for (const k in httpTarget.Params) { - let fi = httpTarget.Params[k]; + for (const [k, fi] of Object.entries(httpTarget.Params)) { saveHttpTargetParam(target, httpTarget, k, fi.value); } } if (wsTarget) { - for (const k in wsTarget.Headers) { - let fi = wsTarget.Headers[k]; + for (const [k, fi] of Object.entries(wsTarget.Headers)) { saveWsTargetHeader(target, wsTarget, k, fi.value); } - for (const k in wsTarget.Params) { - let fi = wsTarget.Params[k]; + for (const [k, fi] of Object.entries(wsTarget.Params)) { saveWsTargetParam(target, wsTarget, k, fi.value); } } } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDREQUE0RDtBQUM1RCw0Q0FBNEM7QUFFNUMsT0FBTyxFQUFFLGNBQWMsRUFBc0IsTUFBTSx1QkFBdUIsQ0FBQTtBQUMxRSxPQUFPLEVBQUUsY0FBYyxFQUFzQixNQUFNLHVCQUF1QixDQUFBO0FBRTFFLE9BQU8sRUFDTixXQUFXLEVBQ1gsaUJBQWlCLEVBRWpCLG1CQUFtQixHQUtuQixNQUFNLGdCQUFnQixDQUFBO0FBRXZCLE1BQU0sVUFBVSxpQkFBaUI7SUFDaEMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFBO0lBQ2hCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FDZCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLEVBQzdELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsRUFDN0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUM3RCxDQUFBO0FBQ0YsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxNQUFtQixFQUFFLEVBQWE7SUFDbkUsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFO1FBQ2hCLEtBQUssbUJBQW1CO1lBQ3ZCLElBQUkscUJBQXFCLEdBQXVCO2dCQUMvQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUs7Z0JBQ2YsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJO2dCQUNiLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLO2dCQUNoQixXQUFXLEVBQUUsV0FBVztnQkFDeEIsV0FBVyxFQUFFLGlCQUFp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 \ No newline at end of file diff --git a/_www/functions.ts b/_www/functions.ts index 60d3af2..8810640 100644 --- a/_www/functions.ts +++ b/_www/functions.ts @@ -1,97 +1,92 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -import { WuiInputNumber, WuiInputNumberOpts } from "./wui/input/number.js" -import { WuiInputString, WuiInputStringOpts } from "./wui/input/string.js" +import { WuiInputNumber, WuiInputNumberOpts } from "./wui/input/number.js"; +import { WuiInputString, WuiInputStringOpts } from "./wui/input/string.js"; import { - CLASS_INPUT, - CLASS_INPUT_LABEL, - FormInput, - FormInputKindNumber, - FormInputKindString, - HttpTargetInterface, - TargetInterface, - WebSocketTargetInterface, -} from "./interface.js" + CLASS_INPUT, + CLASS_INPUT_LABEL, + FormInput, + FormInputKindNumber, + HttpTargetInterface, + TargetInterface, + WebSocketTargetInterface, +} from "./interface.js"; export function GetDocumentHeight() { - var D = document - return Math.max( - Math.max(D.body.scrollHeight, D.documentElement.scrollHeight), - Math.max(D.body.offsetHeight, D.documentElement.offsetHeight), - Math.max(D.body.clientHeight, D.documentElement.clientHeight), - ) + var D = document; + return Math.max( + Math.max(D.body.scrollHeight, D.documentElement.scrollHeight), + Math.max(D.body.offsetHeight, D.documentElement.offsetHeight), + Math.max(D.body.clientHeight, D.documentElement.clientHeight), + ); } export function GenerateFormInput(parent: HTMLElement, fi: FormInput) { - switch (fi.kind) { - case FormInputKindNumber: - let wui_input_number_opts: WuiInputNumberOpts = { - label: fi.label, - hint: fi.hint, - value: +fi.value, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_hint_toggled: true, - onChangeHandler: (new_value: number) => { - fi.value = "" + new_value - }, - } - if (fi.max) { - wui_input_number_opts.max = fi.max - } - if (fi.min) { - wui_input_number_opts.min = fi.min - } - let wui_input_number = new WuiInputNumber( - wui_input_number_opts, - ) - parent.appendChild(wui_input_number.el) - break + switch (fi.kind) { + case FormInputKindNumber: + let wui_input_number_opts: WuiInputNumberOpts = { + label: fi.label, + hint: fi.hint, + value: +fi.value, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_hint_toggled: true, + onChangeHandler: (new_value: number) => { + fi.value = "" + new_value; + }, + }; + if (fi.max) { + wui_input_number_opts.max = fi.max; + } + if (fi.min) { + wui_input_number_opts.min = fi.min; + } + let wui_input_number = new WuiInputNumber(wui_input_number_opts); + parent.appendChild(wui_input_number.el); + break; - default: - let wui_input_string_opts: WuiInputStringOpts = { - label: fi.label, - hint: fi.hint, - value: fi.value, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_hint_toggled: true, - onChangeHandler: (new_value: string) => { - fi.value = new_value - }, - } - let wui_input_string = new WuiInputString( - wui_input_string_opts, - ) - parent.appendChild(wui_input_string.el) - break - } + default: + let wui_input_string_opts: WuiInputStringOpts = { + label: fi.label, + hint: fi.hint, + value: fi.value, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_hint_toggled: true, + onChangeHandler: (new_value: string) => { + fi.value = new_value; + }, + }; + let wui_input_string = new WuiInputString(wui_input_string_opts); + parent.appendChild(wui_input_string.el); + break; + } } export function HttpMethodToString(m: number): string { - switch (m) { - case 0: - return "GET" - case 1: - return "CONNECT" - case 2: - return "DELETE" - case 3: - return "HEAD" - case 4: - return "OPTIONS" - case 5: - return "PATCH" - case 6: - return "POST" - case 7: - return "PUT" - case 8: - return "TRACE" - } - return "???" + switch (m) { + case 0: + return "GET"; + case 1: + return "CONNECT"; + case 2: + return "DELETE"; + case 3: + return "HEAD"; + case 4: + return "OPTIONS"; + case 5: + return "PATCH"; + case 6: + return "POST"; + case 7: + return "PUT"; + case 8: + return "TRACE"; + } + return "???"; } // @@ -99,25 +94,30 @@ export function HttpMethodToString(m: number): string { // If no header exist in storage return the one from HttpTarget itself. // export function LoadHttpTargetHeader( - target: TargetInterface, - httpTarget: HttpTargetInterface, - key: string, + target: TargetInterface, + httpTarget: HttpTargetInterface, + key: string, ): string { - let storageKey = `${target.ID}.http.${httpTarget.ID}.header.${key}` - return ( - window.localStorage.getItem(storageKey) || - httpTarget.Headers[key].value - ) + let storageKey = `${target.ID}.http.${httpTarget.ID}.header.${key}`; + const val = window.localStorage.getItem(storageKey); + if (val) { + return val; + } + const header = httpTarget.Headers[key]; + if (header) { + return header.value; + } + return ""; } function saveHttpTargetHeader( - target: TargetInterface, - httpTarget: HttpTargetInterface, - key: string, - value: string, + target: TargetInterface, + httpTarget: HttpTargetInterface, + key: string, + value: string, ) { - let storageKey = `${target.ID}.http.${httpTarget.ID}.header.${key}` - window.localStorage.setItem(storageKey, value) + let storageKey = `${target.ID}.http.${httpTarget.ID}.header.${key}`; + window.localStorage.setItem(storageKey, value); } // @@ -125,70 +125,72 @@ function saveHttpTargetHeader( // If no parameter exist in storage return the one from HttpTarget itself. // export function LoadHttpTargetParam( - target: TargetInterface, - httpTarget: HttpTargetInterface, - key: string, + target: TargetInterface, + httpTarget: HttpTargetInterface, + key: string, ): string { - let storageKey = `${target.ID}.http.${httpTarget.ID}.param.${key}` - return ( - window.localStorage.getItem(storageKey) || - httpTarget.Params[key].value - ) + let storageKey = `${target.ID}.http.${httpTarget.ID}.param.${key}`; + const val = window.localStorage.getItem(storageKey); + if (val) { + return val; + } + const param = httpTarget.Params[key]; + if (param) { + return param.value; + } + return ""; } function saveHttpTargetParam( - target: TargetInterface, - httpTarget: HttpTargetInterface, - key: string, - value: string, + target: TargetInterface, + httpTarget: HttpTargetInterface, + key: string, + value: string, ) { - let storageKey = `${target.ID}.http.${httpTarget.ID}.param.${key}` - window.localStorage.setItem(storageKey, value) + let storageKey = `${target.ID}.http.${httpTarget.ID}.param.${key}`; + window.localStorage.setItem(storageKey, value); } export function LoadTargetOptDuration(target: TargetInterface): number { - let storageKey = `${target.ID}.opt.Duration` - let val = window.localStorage.getItem(storageKey) - if (val) { - return +val / 1e9 - } - return target.Opts.Duration / 1e9 + let storageKey = `${target.ID}.opt.Duration`; + let val = window.localStorage.getItem(storageKey); + if (val) { + return +val / 1e9; + } + return target.Opts.Duration / 1e9; } function saveTargetOptDuration(target: TargetInterface) { - let storageKey = `${target.ID}.opt.Duration` - window.localStorage.setItem(storageKey, "" + target.Opts.Duration) + let storageKey = `${target.ID}.opt.Duration`; + window.localStorage.setItem(storageKey, "" + target.Opts.Duration); } export function LoadTargetOptRatePerSecond(target: TargetInterface): number { - let storageKey = `${target.ID}.opt.RatePerSecond` - let val = window.localStorage.getItem(storageKey) - if (val) { - return +val - } - return target.Opts.RatePerSecond + let storageKey = `${target.ID}.opt.RatePerSecond`; + let val = window.localStorage.getItem(storageKey); + if (val) { + return +val; + } + return target.Opts.RatePerSecond; } function saveTargetOptRatePerSecond(target: TargetInterface) { - let storageKey = `${target.ID}.opt.RatePerSecond` - window.localStorage.setItem( - storageKey, - "" + target.Opts.RatePerSecond, - ) + let storageKey = `${target.ID}.opt.RatePerSecond`; + window.localStorage.setItem(storageKey, "" + target.Opts.RatePerSecond); } export function LoadTargetOptTimeout(target: TargetInterface): number { - let storageKey = `${target.ID}.opt.Timeout` - let val = window.localStorage.getItem(storageKey) - if (val) { - return +val / 1e9 - } - return target.Opts.Timeout / 1e9 + let storageKey = `${target.ID}.opt.Timeout`; + let val = window.localStorage.getItem(storageKey); + if (val) { + return +val / 1e9; + } + return target.Opts.Timeout / 1e9; } function saveTargetOptTimeout(target: TargetInterface) { - let storageKey = `${target.ID}.opt.Timeout` - window.localStorage.setItem(storageKey, "" + target.Opts.Timeout) + let storageKey = `${target.ID}.opt.Timeout`; + window.localStorage.setItem(storageKey, "" + target.Opts.Timeout); } // @@ -196,41 +198,51 @@ function saveTargetOptTimeout(target: TargetInterface) { // value. // export function LoadTargetVar(target: TargetInterface, key: string): string { - let storageKey = `${target.ID}.var.${key}` - return ( - window.localStorage.getItem(storageKey) || - target.Vars[key].value - ) + let storageKey = `${target.ID}.var.${key}`; + const val = window.localStorage.getItem(storageKey); + if (val) { + return val; + } + const tvar = target.Vars[key]; + if (tvar) { + return tvar.value; + } + return ""; } function saveTargetVar(target: TargetInterface, key: string, value: string) { - let storageKey = `${target.ID}.var.${key}` - window.localStorage.setItem(storageKey, value) + let storageKey = `${target.ID}.var.${key}`; + window.localStorage.setItem(storageKey, value); } // // LoadWsTargetHeader get the WebSocketTarget from local storage by key. // export function LoadWsTargetHeader( - target: TargetInterface, - wsTarget: WebSocketTargetInterface, - key: string, + target: TargetInterface, + wsTarget: WebSocketTargetInterface, + key: string, ): string { - let storageKey = `${target.ID}.ws.${wsTarget.ID}.header.${key}` - return ( - window.localStorage.getItem(storageKey) || - wsTarget.Headers[key].value - ) + let storageKey = `${target.ID}.ws.${wsTarget.ID}.header.${key}`; + const val = window.localStorage.getItem(storageKey); + if (val) { + return val; + } + const header = wsTarget.Headers[key]; + if (header) { + return header.value; + } + return ""; } function saveWsTargetHeader( - target: TargetInterface, - wsTarget: WebSocketTargetInterface, - key: string, - value: string, + target: TargetInterface, + wsTarget: WebSocketTargetInterface, + key: string, + value: string, ) { - let storageKey = `${target.ID}.ws.${wsTarget.ID}.header.${key}` - window.localStorage.setItem(storageKey, value) + let storageKey = `${target.ID}.ws.${wsTarget.ID}.header.${key}`; + window.localStorage.setItem(storageKey, value); } // @@ -238,25 +250,30 @@ function saveWsTargetHeader( // return the one from wsTarget if its not exist. // export function LoadWsTargetParam( - target: TargetInterface, - wsTarget: WebSocketTargetInterface, - key: string, + target: TargetInterface, + wsTarget: WebSocketTargetInterface, + key: string, ): string { - let storageKey = `${target.ID}.ws.${wsTarget.ID}.param.${key}` - return ( - window.localStorage.getItem(storageKey) || - wsTarget.Params[key].value - ) + let storageKey = `${target.ID}.ws.${wsTarget.ID}.param.${key}`; + let val = window.localStorage.getItem(storageKey); + if (val) { + return val; + } + const param = wsTarget.Params[key]; + if (param) { + return param.value; + } + return ""; } function saveWsTargetParam( - target: TargetInterface, - wsTarget: WebSocketTargetInterface, - key: string, - value: string, + target: TargetInterface, + wsTarget: WebSocketTargetInterface, + key: string, + value: string, ) { - let storageKey = `${target.ID}.ws.${wsTarget.ID}.param.${key}` - window.localStorage.setItem(storageKey, value) + let storageKey = `${target.ID}.ws.${wsTarget.ID}.param.${key}`; + window.localStorage.setItem(storageKey, value); } // @@ -264,36 +281,31 @@ function saveWsTargetParam( // WebSocket to local storage. // export function Save( - target: TargetInterface, - httpTarget: HttpTargetInterface | null, - wsTarget: WebSocketTargetInterface | null, + target: TargetInterface, + httpTarget: HttpTargetInterface | null, + wsTarget: WebSocketTargetInterface | null, ) { - saveTargetOptDuration(target) - saveTargetOptRatePerSecond(target) - saveTargetOptTimeout(target) + saveTargetOptDuration(target); + saveTargetOptRatePerSecond(target); + saveTargetOptTimeout(target); - for (const k in target.Vars) { - let fi = target.Vars[k] - saveTargetVar(target, k, fi.value) - } - if (httpTarget) { - for (const k in httpTarget.Headers) { - let fi = httpTarget.Headers[k] - saveHttpTargetHeader(target, httpTarget, k, fi.value) - } - for (const k in httpTarget.Params) { - let fi = httpTarget.Params[k] - saveHttpTargetParam(target, httpTarget, k, fi.value) - } - } - if (wsTarget) { - for (const k in wsTarget.Headers) { - let fi = wsTarget.Headers[k] - saveWsTargetHeader(target, wsTarget, k, fi.value) - } - for (const k in wsTarget.Params) { - let fi = wsTarget.Params[k] - saveWsTargetParam(target, wsTarget, k, fi.value) - } - } + for (const [k, fi] of Object.entries(target.Vars)) { + saveTargetVar(target, k, fi.value); + } + if (httpTarget) { + for (const [k, fi] of Object.entries(httpTarget.Headers)) { + saveHttpTargetHeader(target, httpTarget, k, fi.value); + } + for (const [k, fi] of Object.entries(httpTarget.Params)) { + saveHttpTargetParam(target, httpTarget, k, fi.value); + } + } + if (wsTarget) { + for (const [k, fi] of Object.entries(wsTarget.Headers)) { + saveWsTargetHeader(target, wsTarget, k, fi.value); + } + for (const [k, fi] of Object.entries(wsTarget.Params)) { + saveWsTargetParam(target, wsTarget, k, fi.value); + } + } } diff --git a/_www/http_target.js b/_www/http_target.js index 1b66a93..7bcb08e 100644 --- a/_www/http_target.js +++ b/_www/http_target.js @@ -1,14 +1,5 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; import { WuiInputSelect } from "./wui/input/select.js"; import { WuiInputString } from "./wui/input/string.js"; import { GenerateFormInput, LoadHttpTargetHeader, LoadHttpTargetParam, } from "./functions.js"; @@ -126,7 +117,7 @@ export class HttpTarget { }, }, is_disabled: !this.opts.IsCustomizable, - onChangeHandler: (key, value) => { + onChangeHandler: (_, value) => { this.opts.Method = parseInt(value); }, }; @@ -174,7 +165,7 @@ export class HttpTarget { class_input: CLASS_INPUT, class_label: CLASS_INPUT_LABEL, is_disabled: !this.opts.IsCustomizable, - onChangeHandler: (key, value) => { + onChangeHandler: (_, value) => { this.opts.RequestType = parseInt(value); }, }; @@ -193,8 +184,7 @@ export class HttpTarget { let legend = document.createElement("legend"); legend.innerText = "Headers"; wrapper.appendChild(legend); - for (let key in this.opts.Headers) { - let fi = this.opts.Headers[key]; + for (const [key, fi] of Object.entries(this.opts.Headers)) { fi.value = LoadHttpTargetHeader(this.target, this.opts, key); GenerateFormInput(wrapper, fi); } @@ -212,8 +202,7 @@ export class HttpTarget { let title = document.createElement("legend"); title.innerText = "Parameters"; wrapper.appendChild(title); - for (let key in this.opts.Params) { - let fi = this.opts.Params[key]; + for (const [key, fi] of Object.entries(this.opts.Params)) { fi.value = LoadHttpTargetParam(this.target, this.opts, key); GenerateFormInput(wrapper, fi); } @@ -289,75 +278,62 @@ export class HttpTarget { parent.appendChild(wrapper); } } - onClickAttack() { - return __awaiter(this, void 0, void 0, function* () { - yield this.trunks.AttackHttp(this.target, this.opts); - }); + async onClickAttack() { + await this.trunks.AttackHttp(this.target, this.opts); } - onClickAttackDelete(result) { - return __awaiter(this, void 0, void 0, function* () { - let res = yield this.trunks.AttackHttpDelete(result.Name); - if (!res) { + async onClickAttackDelete(result) { + let res = await this.trunks.AttackHttpDelete(result.Name); + if (!res) { + return; + } + this.opts.Results.forEach((r, x) => { + if (r.Name == result.Name) { + this.opts.Results.splice(x, 1); + this.generateAttackResults(this.el_out_attack_results); return; } - for (let x = 0; x < this.opts.Results.length; x++) { - let r = this.opts.Results[x]; - if (r.Name == result.Name) { - this.opts.Results.splice(x, 1); - this.generateAttackResults(this.el_out_attack_results); - return; - } - } }); } - onClickAttackShow(result_name, btn, el_report_text, el_report_hist) { - return __awaiter(this, void 0, void 0, function* () { - if (btn.innerText === "Hide") { - btn.innerText = "Show"; - el_report_text.style.display = "none"; - el_report_hist.style.display = "none"; - return; - } - let res_json = yield this.trunks.AttackHttpGet(result_name); - if (res_json.code != 200) { - return; - } - let res = res_json.data; - el_report_text.innerText = atob(res.TextReport); - el_report_text.style.display = "block"; - el_report_hist.innerText = atob(res.HistReport); - el_report_hist.style.display = "block"; - btn.innerText = "Hide"; - }); + async onClickAttackShow(result_name, btn, el_report_text, el_report_hist) { + if (btn.innerText === "Hide") { + btn.innerText = "Show"; + el_report_text.style.display = "none"; + el_report_hist.style.display = "none"; + return; + } + let res_json = await this.trunks.AttackHttpGet(result_name); + if (res_json.code != 200) { + return; + } + let res = res_json.data; + el_report_text.innerText = atob(res.TextReport); + el_report_text.style.display = "block"; + el_report_hist.innerText = atob(res.HistReport); + el_report_hist.style.display = "block"; + btn.innerText = "Hide"; } - onClickClearOutput() { - return __awaiter(this, void 0, void 0, function* () { - this.el_out_request.innerText = "Raw request"; - this.el_out_response.innerText = "Raw response"; - this.el_out_response_body.innerText = - "JSON formatted response body"; - }); + async onClickClearOutput() { + this.el_out_request.innerText = "Raw request"; + this.el_out_response.innerText = "Raw response"; + this.el_out_response_body.innerText = "JSON formatted response body"; } - onClickRun() { - return __awaiter(this, void 0, void 0, function* () { - let res = yield this.trunks.RunHttp(this.target, this.opts); - if (!res) { - return; - } - this.el_out_request.innerText = atob(res.DumpRequest); - this.el_out_response.innerText = atob(res.DumpResponse); - let body = atob(res.ResponseBody); - if (res.ResponseType === CONTENT_TYPE_JSON) { - this.el_out_response_body.innerText = JSON.stringify(JSON.parse(body), null, 2); - } - else { - this.el_out_response_body.innerText = body; - } - }); + async onClickRun() { + let res = await this.trunks.RunHttp(this.target, this.opts); + if (!res) { + return; + } + this.el_out_request.innerText = atob(res.DumpRequest); + this.el_out_response.innerText = atob(res.DumpResponse); + let body = atob(res.ResponseBody); + if (res.ResponseType === CONTENT_TYPE_JSON) { + this.el_out_response_body.innerText = JSON.stringify(JSON.parse(body), null, 2); + } + else { + this.el_out_response_body.innerText = body; + } } AddAttackResult(result) { this.opts.Results.push(result); this.generateAttackResults(this.el_out_attack_results); } } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cF90YXJnZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJodHRwX3RhcmdldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0REFBNEQ7QUFDNUQsNENBQTRDOzs7Ozs7Ozs7O0FBRzVDLE9BQU8sRUFBRSxjQUFjLEVBQXNCLE1BQU0sdUJBQXVCLENBQUE7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBc0IsTUFBTSx1QkFBdUIsQ0FBQTtBQUUxRSxPQUFPLEVBQ04saUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixtQkFBbUIsR0FDbkIsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN2QixPQUFPLEVBQ04sV0FBVyxFQUNYLGlCQUFpQixHQVFqQixNQUFNLGdCQUFnQixDQUFBO0FBRXZCLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFBO0FBQ3ZDLE1BQU0seUJBQXlCLEdBQUcscUJBQXFCLENBQUE7QUFDdkQsTUFBTSwrQkFBK0IsR0FBRywyQkFBMkIsQ0FBQTtBQUNuRSxNQUFNLHVDQUF1QyxHQUM1QyxtQ0FBbUMsQ0FBQTtBQUNwQyxNQUFNLHVCQUF1QixHQUFHLG1CQUFtQixDQUFBO0FBQ25ELE1BQU0sOEJBQThCLEdBQUcsMEJBQTBCLENBQUE7QUFDakUsTUFBTSw4QkFBOEIsR0FBRywwQkFBMEIsQ0FBQTtBQUNqRSxNQUFNLDRCQUE0QixHQUFHLHdCQUF3QixDQUFBO0FBQzdELE1BQU0sMEJBQTBCLEdBQUcsc0JBQXNCLENBQUE7QUFDekQsTUFBTSx5QkFBeUIsR0FBRyxxQkFBcUIsQ0FBQTtBQUV2RCxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUFBO0FBRTVDLE1BQU0sT0FBTyxVQUFVO0lBV3RCLFlBQ1EsTUFBdUIsRUFDdkIsTUFBdUIsRUFDdkIsSUFBeUI7UUFGekIsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDdkIsU0FBSSxHQUFKLElBQUksQ0FBcUI7UUFiakMsT0FBRSxHQUFnQixR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 \ No newline at end of file diff --git a/_www/http_target.ts b/_www/http_target.ts index 922eee9..a275908 100644 --- a/_www/http_target.ts +++ b/_www/http_target.ts @@ -1,456 +1,430 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -import { WuiInputNumber, WuiInputNumberOpts } from "./wui/input/number.js" -import { WuiInputSelect, WuiInputSelectOpts } from "./wui/input/select.js" -import { WuiInputString, WuiInputStringOpts } from "./wui/input/string.js" +import { WuiInputSelect, WuiInputSelectOpts } from "./wui/input/select.js"; +import { WuiInputString, WuiInputStringOpts } from "./wui/input/string.js"; import { - GenerateFormInput, - LoadHttpTargetHeader, - LoadHttpTargetParam, -} from "./functions.js" + GenerateFormInput, + LoadHttpTargetHeader, + LoadHttpTargetParam, +} from "./functions.js"; import { - CLASS_INPUT, - CLASS_INPUT_LABEL, - AttackResult, - FormInputKindNumber, - FormInputKindString, - HttpTargetInterface, - KeyFormInput, - TargetInterface, - TrunksInterface, -} from "./interface.js" - -const CLASS_HTTP_TARGET = "http_target" -const CLASS_HTTP_TARGET_ACTIONS = "http_target_actions" -const CLASS_HTTP_TARGET_ATTACK_RESULT = "http_target_attack_result" + CLASS_INPUT, + CLASS_INPUT_LABEL, + AttackResult, + HttpTargetInterface, + TargetInterface, + TrunksInterface, +} from "./interface.js"; + +const CLASS_HTTP_TARGET = "http_target"; +const CLASS_HTTP_TARGET_ACTIONS = "http_target_actions"; +const CLASS_HTTP_TARGET_ATTACK_RESULT = "http_target_attack_result"; const CLASS_HTTP_TARGET_ATTACK_RESULT_ACTIONS = - "http_target_attack_result_actions" -const CLASS_HTTP_TARGET_INPUT = "http_target_input" -const CLASS_HTTP_TARGET_INPUT_HEADER = "http_target_input_header" -const CLASS_HTTP_TARGET_INPUT_PARAMS = "http_target_input_params" -const CLASS_HTTP_TARGET_OUT_ATTACK = "http_target_out_attack" -const CLASS_HTTP_TARGET_OUT_MONO = "http_target_out_mono" -const CLASS_HTTP_TARGET_OUT_RUN = "http_target_out_run" + "http_target_attack_result_actions"; +const CLASS_HTTP_TARGET_INPUT = "http_target_input"; +const CLASS_HTTP_TARGET_INPUT_HEADER = "http_target_input_header"; +const CLASS_HTTP_TARGET_INPUT_PARAMS = "http_target_input_params"; +const CLASS_HTTP_TARGET_OUT_ATTACK = "http_target_out_attack"; +const CLASS_HTTP_TARGET_OUT_MONO = "http_target_out_mono"; +const CLASS_HTTP_TARGET_OUT_RUN = "http_target_out_run"; -const CONTENT_TYPE_JSON = "application/json" +const CONTENT_TYPE_JSON = "application/json"; export class HttpTarget { - el: HTMLElement = document.createElement("div") - el_button_run: HTMLButtonElement = document.createElement("button") - el_button_attack: HTMLButtonElement = document.createElement("button") - el_request_input: HTMLElement = document.createElement("div") - el_out_request: HTMLElement = document.createElement("div") - el_out_response: HTMLElement = document.createElement("div") - el_out_response_body: HTMLElement = document.createElement("div") - el_out_attack: HTMLElement = document.createElement("fieldset") - el_out_attack_results: HTMLElement = document.createElement("div") - - constructor( - public trunks: TrunksInterface, - public target: TargetInterface, - public opts: HttpTargetInterface, - ) { - this.el.id = opts.ID - this.el.classList.add(CLASS_HTTP_TARGET) - - let el_title = document.createElement("h3") - el_title.innerText = opts.Name - this.el.appendChild(el_title) - - this.generateActions(el_title) - this.generateHint(this.el) - this.generateInput(this.el) - this.generateOutput(this.el) - this.generateOutputAttack(this.el) - } - - private generateActions(parent: HTMLElement) { - let el_actions = document.createElement("span") - el_actions.classList.add(CLASS_HTTP_TARGET_ACTIONS) - - this.el_button_run.innerText = "Run" - this.el_button_run.onclick = () => { - this.onClickRun() - } - el_actions.appendChild(this.el_button_run) - - if (this.opts.AllowAttack) { - this.el_button_attack.innerText = "Attack" - this.el_button_attack.onclick = () => { - this.onClickAttack() - } - el_actions.appendChild(this.el_button_attack) - } - - parent.appendChild(el_actions) - } - - private generateHint(parent: HTMLElement) { - if (!this.opts.Hint) { - return - } - let el_hint = document.createElement("p") - el_hint.innerHTML = this.opts.Hint - parent.appendChild(el_hint) - } - - private generateInput(parent: HTMLElement) { - this.el_request_input.classList.add(CLASS_HTTP_TARGET_INPUT) - - this.generateRequestMethod(this.el_request_input) - this.generateRequestContentType(this.el_request_input) - this.generateRequestHeaders(this.el_request_input) - this.generateRequestParameters(this.el_request_input) - - parent.appendChild(this.el_request_input) - } - - private generateRequestMethod(parent: HTMLElement) { - let m = "" + this.opts.Method - let select_opts: WuiInputSelectOpts = { - label: "", - name: "", - options: { - GET: { - value: "0", - selected: m === "0", - }, - CONNECT: { - value: "1", - selected: m === "1", - }, - DELETE: { - value: "2", - selected: m === "2", - }, - HEAD: { - value: "3", - selected: m === "3", - }, - OPTIONS: { - value: "4", - selected: m === "4", - }, - PATCH: { - value: "5", - selected: m === "5", - }, - POST: { - value: "6", - selected: m === "6", - }, - PUT: { - value: "7", - selected: m === "7", - }, - TRACE: { - value: "8", - selected: m === "8", - }, - }, - is_disabled: !this.opts.IsCustomizable, - onChangeHandler: (key: string, value: string) => { - this.opts.Method = parseInt(value) - }, - } - let wui_request_method = new WuiInputSelect(select_opts) - - let path_opts: WuiInputStringOpts = { - label: wui_request_method.el, - value: this.opts.Path, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_disabled: !this.opts.IsCustomizable, - onChangeHandler: (path: string) => { - this.opts.Path = path - }, - } - let wui_request_path = new WuiInputString(path_opts) - - parent.appendChild(wui_request_path.el) - } - - private generateRequestContentType(parent: HTMLElement) { - let ct = "" + this.opts.RequestType - let select_opts: WuiInputSelectOpts = { - label: "Content type", - name: "", - options: { - "(none)": { - value: "0", - selected: ct === "0", - }, - "(query)": { - value: "1", - selected: ct === "1", - }, - "application/x-www-form-urlencoded": { - value: "2", - selected: ct === "2", - }, - "multipart/form-data": { - value: "3", - selected: ct === "3", - }, - "application/json": { - value: "4", - selected: ct === "4", - }, - }, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_disabled: !this.opts.IsCustomizable, - onChangeHandler: (key: string, value: string) => { - this.opts.RequestType = parseInt(value) - }, - } - let wui_request_type = new WuiInputSelect(select_opts) - - parent.appendChild(wui_request_type.el) - } - - private generateRequestHeaders(parent: HTMLElement) { - if (!this.opts.Headers) { - return - } - if (Object.keys(this.opts.Headers).length === 0) { - return - } - - let wrapper = document.createElement("fieldset") - wrapper.classList.add(CLASS_HTTP_TARGET_INPUT_HEADER) - - let legend = document.createElement("legend") - legend.innerText = "Headers" - wrapper.appendChild(legend) - - for (let key in this.opts.Headers) { - let fi = this.opts.Headers[key] - fi.value = LoadHttpTargetHeader( - this.target, - this.opts, - key, - ) - GenerateFormInput(wrapper, fi) - } - - parent.appendChild(wrapper) - } - - private generateRequestParameters(parent: HTMLElement) { - if (!this.opts.Params) { - return - } - if (Object.keys(this.opts.Params).length === 0) { - return - } - - let wrapper = document.createElement("fieldset") - wrapper.classList.add(CLASS_HTTP_TARGET_INPUT_PARAMS) - - let title = document.createElement("legend") - title.innerText = "Parameters" - wrapper.appendChild(title) - - for (let key in this.opts.Params) { - let fi = this.opts.Params[key] - fi.value = LoadHttpTargetParam( - this.target, - this.opts, - key, - ) - GenerateFormInput(wrapper, fi) - } - - parent.appendChild(wrapper) - } - - private generateOutput(parent: HTMLElement) { - let wrapper = document.createElement("fieldset") - wrapper.classList.add(CLASS_HTTP_TARGET_OUT_RUN) - - let title = document.createElement("legend") - title.innerText = "Run output" - - let btn_clear = document.createElement("button") - btn_clear.innerText = "Clear" - btn_clear.onclick = () => { - this.onClickClearOutput() - } - title.appendChild(btn_clear) - - this.el_out_request.classList.add(CLASS_HTTP_TARGET_OUT_MONO) - this.el_out_response.classList.add(CLASS_HTTP_TARGET_OUT_MONO) - this.el_out_response_body.classList.add( - CLASS_HTTP_TARGET_OUT_MONO, - ) - - wrapper.appendChild(title) - wrapper.appendChild(this.el_out_request) - wrapper.appendChild(this.el_out_response) - wrapper.appendChild(this.el_out_response_body) - - parent.appendChild(wrapper) - this.onClickClearOutput() - } - - private generateOutputAttack(parent: HTMLElement) { - if (!this.opts.AllowAttack) { - return - } - - this.el_out_attack.classList.add(CLASS_HTTP_TARGET_OUT_ATTACK) - - let title = document.createElement("legend") - title.innerText = "Attack results" - - this.generateAttackResults(this.el_out_attack_results) - - this.el_out_attack.appendChild(title) - this.el_out_attack.appendChild(this.el_out_attack_results) - parent.appendChild(this.el_out_attack) - } - - private generateAttackResults(parent: HTMLElement) { - parent.innerText = "" - - if (!this.opts.Results) { - return - } - - for (let result of this.opts.Results) { - let wrapper = document.createElement("div") - wrapper.classList.add(CLASS_HTTP_TARGET_ATTACK_RESULT) - - let el_report_text = document.createElement("div") - el_report_text.style.display = "none" - el_report_text.classList.add( - CLASS_HTTP_TARGET_OUT_MONO, - ) - - let el_report_hist = document.createElement("div") - el_report_hist.style.display = "none" - el_report_hist.classList.add( - CLASS_HTTP_TARGET_OUT_MONO, - ) - - let el = document.createElement("div") - el.innerText = result.Name - - let actions = document.createElement("span") - actions.classList.add( - CLASS_HTTP_TARGET_ATTACK_RESULT_ACTIONS, - ) - - let btn_attack_show = document.createElement("button") - btn_attack_show.innerText = "Show" - btn_attack_show.onclick = () => { - this.onClickAttackShow( - result.Name, - btn_attack_show, - el_report_text, - el_report_hist, - ) - } - - let btn_attack_del = document.createElement("button") - btn_attack_del.innerText = "Delete" - btn_attack_del.onclick = () => { - this.onClickAttackDelete(result) - } - - actions.appendChild(btn_attack_show) - actions.appendChild(btn_attack_del) - el.appendChild(actions) - - wrapper.appendChild(el) - wrapper.appendChild(el_report_text) - wrapper.appendChild(el_report_hist) - - parent.appendChild(wrapper) - } - } - - private async onClickAttack() { - await this.trunks.AttackHttp(this.target, this.opts) - } - - private async onClickAttackDelete(result: AttackResult) { - let res = await this.trunks.AttackHttpDelete(result.Name) - if (!res) { - return - } - for (let x = 0; x < this.opts.Results.length; x++) { - let r = this.opts.Results[x] - if (r.Name == result.Name) { - this.opts.Results.splice(x, 1) - this.generateAttackResults( - this.el_out_attack_results, - ) - return - } - } - } - - private async onClickAttackShow( - result_name: string, - btn: HTMLButtonElement, - el_report_text: HTMLElement, - el_report_hist: HTMLElement, - ) { - if (btn.innerText === "Hide") { - btn.innerText = "Show" - el_report_text.style.display = "none" - el_report_hist.style.display = "none" - return - } - - let res_json = await this.trunks.AttackHttpGet(result_name) - if (res_json.code != 200) { - return - } - - let res = res_json.data as AttackResult - - el_report_text.innerText = atob(res.TextReport) - el_report_text.style.display = "block" - - el_report_hist.innerText = atob(res.HistReport) - el_report_hist.style.display = "block" - - btn.innerText = "Hide" - } - - private async onClickClearOutput() { - this.el_out_request.innerText = "Raw request" - this.el_out_response.innerText = "Raw response" - this.el_out_response_body.innerText = - "JSON formatted response body" - } - - private async onClickRun() { - let res = await this.trunks.RunHttp(this.target, this.opts) - if (!res) { - return - } - this.el_out_request.innerText = atob(res.DumpRequest) - this.el_out_response.innerText = atob(res.DumpResponse) - let body = atob(res.ResponseBody) - if (res.ResponseType === CONTENT_TYPE_JSON) { - this.el_out_response_body.innerText = JSON.stringify( - JSON.parse(body), - null, - 2, - ) - } else { - this.el_out_response_body.innerText = body - } - } - - AddAttackResult(result: AttackResult) { - this.opts.Results.push(result) - this.generateAttackResults(this.el_out_attack_results) - } + el: HTMLElement = document.createElement("div"); + el_button_run: HTMLButtonElement = document.createElement("button"); + el_button_attack: HTMLButtonElement = document.createElement("button"); + el_request_input: HTMLElement = document.createElement("div"); + el_out_request: HTMLElement = document.createElement("div"); + el_out_response: HTMLElement = document.createElement("div"); + el_out_response_body: HTMLElement = document.createElement("div"); + el_out_attack: HTMLElement = document.createElement("fieldset"); + el_out_attack_results: HTMLElement = document.createElement("div"); + + constructor( + public trunks: TrunksInterface, + public target: TargetInterface, + public opts: HttpTargetInterface, + ) { + this.el.id = opts.ID; + this.el.classList.add(CLASS_HTTP_TARGET); + + let el_title = document.createElement("h3"); + el_title.innerText = opts.Name; + this.el.appendChild(el_title); + + this.generateActions(el_title); + this.generateHint(this.el); + this.generateInput(this.el); + this.generateOutput(this.el); + this.generateOutputAttack(this.el); + } + + private generateActions(parent: HTMLElement) { + let el_actions = document.createElement("span"); + el_actions.classList.add(CLASS_HTTP_TARGET_ACTIONS); + + this.el_button_run.innerText = "Run"; + this.el_button_run.onclick = () => { + this.onClickRun(); + }; + el_actions.appendChild(this.el_button_run); + + if (this.opts.AllowAttack) { + this.el_button_attack.innerText = "Attack"; + this.el_button_attack.onclick = () => { + this.onClickAttack(); + }; + el_actions.appendChild(this.el_button_attack); + } + + parent.appendChild(el_actions); + } + + private generateHint(parent: HTMLElement) { + if (!this.opts.Hint) { + return; + } + let el_hint = document.createElement("p"); + el_hint.innerHTML = this.opts.Hint; + parent.appendChild(el_hint); + } + + private generateInput(parent: HTMLElement) { + this.el_request_input.classList.add(CLASS_HTTP_TARGET_INPUT); + + this.generateRequestMethod(this.el_request_input); + this.generateRequestContentType(this.el_request_input); + this.generateRequestHeaders(this.el_request_input); + this.generateRequestParameters(this.el_request_input); + + parent.appendChild(this.el_request_input); + } + + private generateRequestMethod(parent: HTMLElement) { + let m = "" + this.opts.Method; + let select_opts: WuiInputSelectOpts = { + label: "", + name: "", + options: { + GET: { + value: "0", + selected: m === "0", + }, + CONNECT: { + value: "1", + selected: m === "1", + }, + DELETE: { + value: "2", + selected: m === "2", + }, + HEAD: { + value: "3", + selected: m === "3", + }, + OPTIONS: { + value: "4", + selected: m === "4", + }, + PATCH: { + value: "5", + selected: m === "5", + }, + POST: { + value: "6", + selected: m === "6", + }, + PUT: { + value: "7", + selected: m === "7", + }, + TRACE: { + value: "8", + selected: m === "8", + }, + }, + is_disabled: !this.opts.IsCustomizable, + onChangeHandler: (_: string, value: string) => { + this.opts.Method = parseInt(value); + }, + }; + let wui_request_method = new WuiInputSelect(select_opts); + + let path_opts: WuiInputStringOpts = { + label: wui_request_method.el, + value: this.opts.Path, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_disabled: !this.opts.IsCustomizable, + onChangeHandler: (path: string) => { + this.opts.Path = path; + }, + }; + let wui_request_path = new WuiInputString(path_opts); + + parent.appendChild(wui_request_path.el); + } + + private generateRequestContentType(parent: HTMLElement) { + let ct = "" + this.opts.RequestType; + let select_opts: WuiInputSelectOpts = { + label: "Content type", + name: "", + options: { + "(none)": { + value: "0", + selected: ct === "0", + }, + "(query)": { + value: "1", + selected: ct === "1", + }, + "application/x-www-form-urlencoded": { + value: "2", + selected: ct === "2", + }, + "multipart/form-data": { + value: "3", + selected: ct === "3", + }, + "application/json": { + value: "4", + selected: ct === "4", + }, + }, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_disabled: !this.opts.IsCustomizable, + onChangeHandler: (_: string, value: string) => { + this.opts.RequestType = parseInt(value); + }, + }; + let wui_request_type = new WuiInputSelect(select_opts); + + parent.appendChild(wui_request_type.el); + } + + private generateRequestHeaders(parent: HTMLElement) { + if (!this.opts.Headers) { + return; + } + if (Object.keys(this.opts.Headers).length === 0) { + return; + } + + let wrapper = document.createElement("fieldset"); + wrapper.classList.add(CLASS_HTTP_TARGET_INPUT_HEADER); + + let legend = document.createElement("legend"); + legend.innerText = "Headers"; + wrapper.appendChild(legend); + + for (const [key, fi] of Object.entries(this.opts.Headers)) { + fi.value = LoadHttpTargetHeader(this.target, this.opts, key); + GenerateFormInput(wrapper, fi); + } + + parent.appendChild(wrapper); + } + + private generateRequestParameters(parent: HTMLElement) { + if (!this.opts.Params) { + return; + } + if (Object.keys(this.opts.Params).length === 0) { + return; + } + + let wrapper = document.createElement("fieldset"); + wrapper.classList.add(CLASS_HTTP_TARGET_INPUT_PARAMS); + + let title = document.createElement("legend"); + title.innerText = "Parameters"; + wrapper.appendChild(title); + + for (const [key, fi] of Object.entries(this.opts.Params)) { + fi.value = LoadHttpTargetParam(this.target, this.opts, key); + GenerateFormInput(wrapper, fi); + } + + parent.appendChild(wrapper); + } + + private generateOutput(parent: HTMLElement) { + let wrapper = document.createElement("fieldset"); + wrapper.classList.add(CLASS_HTTP_TARGET_OUT_RUN); + + let title = document.createElement("legend"); + title.innerText = "Run output"; + + let btn_clear = document.createElement("button"); + btn_clear.innerText = "Clear"; + btn_clear.onclick = () => { + this.onClickClearOutput(); + }; + title.appendChild(btn_clear); + + this.el_out_request.classList.add(CLASS_HTTP_TARGET_OUT_MONO); + this.el_out_response.classList.add(CLASS_HTTP_TARGET_OUT_MONO); + this.el_out_response_body.classList.add(CLASS_HTTP_TARGET_OUT_MONO); + + wrapper.appendChild(title); + wrapper.appendChild(this.el_out_request); + wrapper.appendChild(this.el_out_response); + wrapper.appendChild(this.el_out_response_body); + + parent.appendChild(wrapper); + this.onClickClearOutput(); + } + + private generateOutputAttack(parent: HTMLElement) { + if (!this.opts.AllowAttack) { + return; + } + + this.el_out_attack.classList.add(CLASS_HTTP_TARGET_OUT_ATTACK); + + let title = document.createElement("legend"); + title.innerText = "Attack results"; + + this.generateAttackResults(this.el_out_attack_results); + + this.el_out_attack.appendChild(title); + this.el_out_attack.appendChild(this.el_out_attack_results); + parent.appendChild(this.el_out_attack); + } + + private generateAttackResults(parent: HTMLElement) { + parent.innerText = ""; + + if (!this.opts.Results) { + return; + } + + for (let result of this.opts.Results) { + let wrapper = document.createElement("div"); + wrapper.classList.add(CLASS_HTTP_TARGET_ATTACK_RESULT); + + let el_report_text = document.createElement("div"); + el_report_text.style.display = "none"; + el_report_text.classList.add(CLASS_HTTP_TARGET_OUT_MONO); + + let el_report_hist = document.createElement("div"); + el_report_hist.style.display = "none"; + el_report_hist.classList.add(CLASS_HTTP_TARGET_OUT_MONO); + + let el = document.createElement("div"); + el.innerText = result.Name; + + let actions = document.createElement("span"); + actions.classList.add(CLASS_HTTP_TARGET_ATTACK_RESULT_ACTIONS); + + let btn_attack_show = document.createElement("button"); + btn_attack_show.innerText = "Show"; + btn_attack_show.onclick = () => { + this.onClickAttackShow( + result.Name, + btn_attack_show, + el_report_text, + el_report_hist, + ); + }; + + let btn_attack_del = document.createElement("button"); + btn_attack_del.innerText = "Delete"; + btn_attack_del.onclick = () => { + this.onClickAttackDelete(result); + }; + + actions.appendChild(btn_attack_show); + actions.appendChild(btn_attack_del); + el.appendChild(actions); + + wrapper.appendChild(el); + wrapper.appendChild(el_report_text); + wrapper.appendChild(el_report_hist); + + parent.appendChild(wrapper); + } + } + + private async onClickAttack() { + await this.trunks.AttackHttp(this.target, this.opts); + } + + private async onClickAttackDelete(result: AttackResult) { + let res = await this.trunks.AttackHttpDelete(result.Name); + if (!res) { + return; + } + this.opts.Results.forEach((r: AttackResult, x: number) => { + if (r.Name == result.Name) { + this.opts.Results.splice(x, 1); + this.generateAttackResults(this.el_out_attack_results); + return; + } + }); + } + + private async onClickAttackShow( + result_name: string, + btn: HTMLButtonElement, + el_report_text: HTMLElement, + el_report_hist: HTMLElement, + ) { + if (btn.innerText === "Hide") { + btn.innerText = "Show"; + el_report_text.style.display = "none"; + el_report_hist.style.display = "none"; + return; + } + + let res_json = await this.trunks.AttackHttpGet(result_name); + if (res_json.code != 200) { + return; + } + + let res = res_json.data as AttackResult; + + el_report_text.innerText = atob(res.TextReport); + el_report_text.style.display = "block"; + + el_report_hist.innerText = atob(res.HistReport); + el_report_hist.style.display = "block"; + + btn.innerText = "Hide"; + } + + private async onClickClearOutput() { + this.el_out_request.innerText = "Raw request"; + this.el_out_response.innerText = "Raw response"; + this.el_out_response_body.innerText = "JSON formatted response body"; + } + + private async onClickRun() { + let res = await this.trunks.RunHttp(this.target, this.opts); + if (!res) { + return; + } + this.el_out_request.innerText = atob(res.DumpRequest); + this.el_out_response.innerText = atob(res.DumpResponse); + let body = atob(res.ResponseBody); + if (res.ResponseType === CONTENT_TYPE_JSON) { + this.el_out_response_body.innerText = JSON.stringify( + JSON.parse(body), + null, + 2, + ); + } else { + this.el_out_response_body.innerText = body; + } + } + + AddAttackResult(result: AttackResult) { + this.opts.Results.push(result); + this.generateAttackResults(this.el_out_attack_results); + } } diff --git a/_www/index.js b/_www/index.js index 0832d94..a900993 100644 --- a/_www/index.js +++ b/_www/index.js @@ -1,20 +1,8 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; import { Trunks } from "./trunks.js"; -function main() { - return __awaiter(this, void 0, void 0, function* () { - let trunks = new Trunks(); - yield trunks.Init(); - }); +async function main() { + let trunks = new Trunks(); + await trunks.Init(); } main(); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0REFBNEQ7QUFDNUQsNENBQTRDOzs7Ozs7Ozs7O0FBRTVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFcEMsU0FBZSxJQUFJOztRQUNsQixJQUFJLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFBO1FBRXpCLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3BCLENBQUM7Q0FBQTtBQUVELElBQUksRUFBRSxDQUFBIn0= \ No newline at end of file diff --git a/_www/index.ts b/_www/index.ts index 6d605f4..8a1bf84 100644 --- a/_www/index.ts +++ b/_www/index.ts @@ -1,12 +1,12 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -import { Trunks } from "./trunks.js" +import { Trunks } from "./trunks.js"; async function main() { - let trunks = new Trunks() + let trunks = new Trunks(); - await trunks.Init() + await trunks.Init(); } -main() +main(); diff --git a/_www/interface.js b/_www/interface.js index ff6425f..d01baf1 100644 --- a/_www/interface.js +++ b/_www/interface.js @@ -8,4 +8,3 @@ export const HASH_ENVIRONMENT = "environment"; export const HASH_LINKS = "links"; export const FormInputKindNumber = "number"; export const FormInputKindString = "string"; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDREQUE0RDtBQUM1RCw0Q0FBNEM7QUFFNUMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsb0JBQW9CLENBQUE7QUFDckQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQTtBQUN6QyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFBO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQTtBQUU1QyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUE7QUFDN0MsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQTtBQUVqQyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUE7QUFDM0MsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFBIn0= \ No newline at end of file diff --git a/_www/interface.ts b/_www/interface.ts index 55ce91d..503480d 100644 --- a/_www/interface.ts +++ b/_www/interface.ts @@ -1,150 +1,150 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -export const CLASS_INPUT_LABEL = "trunks_input_label" -export const CLASS_INPUT = "trunks_input" -export const CLASS_NAV_LINK = "nav_link" -export const CLASS_NAV_TARGET = "nav_target" +export const CLASS_INPUT_LABEL = "trunks_input_label"; +export const CLASS_INPUT = "trunks_input"; +export const CLASS_NAV_LINK = "nav_link"; +export const CLASS_NAV_TARGET = "nav_target"; -export const HASH_ENVIRONMENT = "environment" -export const HASH_LINKS = "links" +export const HASH_ENVIRONMENT = "environment"; +export const HASH_LINKS = "links"; -export const FormInputKindNumber = "number" -export const FormInputKindString = "string" +export const FormInputKindNumber = "number"; +export const FormInputKindString = "string"; export interface AttackOptionsInterface { - Duration: number - RatePerSecond: number - Timeout: number + Duration: number; + RatePerSecond: number; + Timeout: number; } export interface AttackResult { - TargetID: string - HttpTargetID: string - Name: string - TextReport: string - HistReport: string + TargetID: string; + HttpTargetID: string; + Name: string; + TextReport: string; + HistReport: string; } export interface EnvironmentInterface { - ListenAddress: string - MaxAttackDuration: number - MaxAttackRate: number - ResultsDir: string - ResultsSuffix: string - AttackRunning: RunRequestInterface | null + ListenAddress: string; + MaxAttackDuration: number; + MaxAttackRate: number; + ResultsDir: string; + ResultsSuffix: string; + AttackRunning: RunRequestInterface | null; } export interface FormInput { - label: string - hint: string - kind: string - value: string - max?: number - min?: number + label: string; + hint: string; + kind: string; + value: string; + max?: number; + min?: number; } export interface HttpResponseInterface { - code: number - message: string - data?: any + code: number; + message: string; + data?: any; } export interface HttpTargetInterface { - Name: string - Hint?: string - ID: string - Method: number - Path: string - RequestType: number - Headers: KeyFormInput - Params: KeyFormInput - Results: AttackResult[] - AllowAttack: boolean - IsCustomizable: boolean + Name: string; + Hint?: string; + ID: string; + Method: number; + Path: string; + RequestType: number; + Headers: KeyFormInput; + Params: KeyFormInput; + Results: AttackResult[]; + AllowAttack: boolean; + IsCustomizable: boolean; } export interface KeyFormInput { - [key: string]: FormInput + [key: string]: FormInput; } export interface MapIdTarget { - [key: string]: TargetInterface + [key: string]: TargetInterface; } export interface MapNumberString { - [key: number]: string + [key: number]: string; } export interface NavLinkInterface { - ID: string - Text: string - Href: string - OpenInIFrame: boolean + ID: string; + Text: string; + Href: string; + OpenInIFrame: boolean; } export interface RunRequestInterface { - Target: TargetInterface - HttpTarget: HttpTargetInterface | null - WebSocketTarget: WebSocketTargetInterface | null - Result?: AttackResult | null + Target: TargetInterface; + HttpTarget: HttpTargetInterface | null; + WebSocketTarget: WebSocketTargetInterface | null; + Result?: AttackResult | null; } export interface RunResponseInterface { - DumpRequest: string - DumpResponse: string - ResponseStatus: string - ResponseStatusCode: number - ResponseType: string - ResponseBody: string + DumpRequest: string; + DumpResponse: string; + ResponseStatus: string; + ResponseStatusCode: number; + ResponseType: string; + ResponseBody: string; } export interface TargetInterface { - ID: string - Name: string - Hint?: string - BaseUrl: string - Opts: AttackOptionsInterface - Vars: KeyFormInput - HttpTargets: HttpTargetInterface[] - WebSocketTargets: WebSocketTargetInterface[] + ID: string; + Name: string; + Hint?: string; + BaseUrl: string; + Opts: AttackOptionsInterface; + Vars: KeyFormInput; + HttpTargets: HttpTargetInterface[]; + WebSocketTargets: WebSocketTargetInterface[]; } export interface TrunksInterface { - AttackHttp( - target: TargetInterface, - http_target: HttpTargetInterface, - ): Promise - - AttackHttpDelete(name: string): Promise - - AttackHttpGet(name: string): Promise - - ContentRenderer( - target: TargetInterface, - http_target: HttpTargetInterface | null, - ws_target: WebSocketTargetInterface | null, - nav_link: NavLinkInterface | null, - el: HTMLElement, - ): void - - SetContent(path: string, el: HTMLElement | null): void - - RunHttp( - target: TargetInterface, - http_target: HttpTargetInterface, - ): Promise - - RunWebSocket( - target: TargetInterface, - WebSocketTargetInterface: WebSocketTargetInterface, - ): Promise + AttackHttp( + target: TargetInterface, + http_target: HttpTargetInterface, + ): Promise; + + AttackHttpDelete(name: string): Promise; + + AttackHttpGet(name: string): Promise; + + ContentRenderer( + target: TargetInterface, + http_target: HttpTargetInterface | null, + ws_target: WebSocketTargetInterface | null, + nav_link: NavLinkInterface | null, + el: HTMLElement, + ): void; + + SetContent(path: string, el: HTMLElement | null): void; + + RunHttp( + target: TargetInterface, + http_target: HttpTargetInterface, + ): Promise; + + RunWebSocket( + target: TargetInterface, + WebSocketTargetInterface: WebSocketTargetInterface, + ): Promise; } export interface WebSocketTargetInterface { - ID: string - Name: string - Hint?: string - Headers: KeyFormInput - Params: KeyFormInput + ID: string; + Name: string; + Hint?: string; + Headers: KeyFormInput; + Params: KeyFormInput; } diff --git a/_www/nav_links.ts b/_www/nav_links.ts index 5d5079d..92cf667 100644 --- a/_www/nav_links.ts +++ b/_www/nav_links.ts @@ -2,84 +2,77 @@ // SPDX-License-Identifier: GPL-3.0-or-later import { - HASH_LINKS, - CLASS_NAV_LINK, - CLASS_NAV_TARGET, - AttackOptionsInterface, - KeyFormInput, - NavLinkInterface, - TargetInterface, - TrunksInterface, -} from "./interface.js" -import { GetDocumentHeight } from "./functions.js" + HASH_LINKS, + CLASS_NAV_LINK, + CLASS_NAV_TARGET, + AttackOptionsInterface, + KeyFormInput, + NavLinkInterface, + TargetInterface, + TrunksInterface, +} from "./interface.js"; +import { GetDocumentHeight } from "./functions.js"; export class NavLinks { - el_nav: HTMLElement = document.createElement("div") - el_src: HTMLElement = document.createElement("div") - el_content: HTMLElement = document.createElement("div") - el_iframe: HTMLIFrameElement = document.createElement("iframe") + el_nav: HTMLElement = document.createElement("div"); + el_src: HTMLElement = document.createElement("div"); + el_content: HTMLElement = document.createElement("div"); + el_iframe: HTMLIFrameElement = document.createElement("iframe"); - constructor( - public trunks: TrunksInterface, - public navs: NavLinkInterface[], - ) { - let hdr = document.createElement("h3") - hdr.innerText = "Links" - hdr.onclick = () => { - trunks.SetContent(HASH_LINKS, null) - } + constructor( + public trunks: TrunksInterface, + public navs: NavLinkInterface[], + ) { + let hdr = document.createElement("h3"); + hdr.innerText = "Links"; + hdr.onclick = () => { + trunks.SetContent(HASH_LINKS, null); + }; - this.el_nav.classList.add(CLASS_NAV_TARGET) - this.el_nav.appendChild(hdr) + this.el_nav.classList.add(CLASS_NAV_TARGET); + this.el_nav.appendChild(hdr); - this.generateNav() - this.generateContent() - } + this.generateNav(); + this.generateContent(); + } - generateNav() { - for (let x = 0; x < this.navs.length; x++) { - let nav = this.navs[x] - let el = document.createElement("div") - el.classList.add(CLASS_NAV_LINK) - el.textContent = nav.Text - el.onclick = () => { - this.open(nav) - } + generateNav() { + this.navs.forEach((nav: NavLinkInterface) => { + let el = document.createElement("div"); + el.classList.add(CLASS_NAV_LINK); + el.textContent = nav.Text; + el.onclick = () => { + this.open(nav); + }; - this.el_nav.appendChild(el) - } - } + this.el_nav.appendChild(el); + }); + } - generateContent() { - this.el_iframe.width = "100%" - this.el_iframe.height = GetDocumentHeight() - 60 + "" + generateContent() { + this.el_iframe.width = "100%"; + this.el_iframe.height = GetDocumentHeight() - 60 + ""; - this.el_content.appendChild(this.el_src) - this.el_content.appendChild(this.el_iframe) - } + this.el_content.appendChild(this.el_src); + this.el_content.appendChild(this.el_iframe); + } - open(nav: NavLinkInterface) { - if (nav.OpenInIFrame) { - this.el_src.textContent = "Source: " + nav.Href - this.el_iframe.src = nav.Href - let target: TargetInterface = { - ID: "nav", - Name: "", - BaseUrl: "", - Opts: {} as AttackOptionsInterface, - Vars: {} as KeyFormInput, - HttpTargets: [], - WebSocketTargets: [], - } - this.trunks.ContentRenderer( - target, - null, - null, - nav, - this.el_content, - ) - } else { - window.open(nav.Href, "_blank") - } - } + open(nav: NavLinkInterface) { + if (nav.OpenInIFrame) { + this.el_src.textContent = "Source: " + nav.Href; + this.el_iframe.src = nav.Href; + let target: TargetInterface = { + ID: "nav", + Name: "", + BaseUrl: "", + Opts: {} as AttackOptionsInterface, + Vars: {} as KeyFormInput, + HttpTargets: [], + WebSocketTargets: [], + }; + this.trunks.ContentRenderer(target, null, null, nav, this.el_content); + } else { + window.open(nav.Href, "_blank"); + } + } } diff --git a/_www/target.js b/_www/target.js index d8f412b..4f2391d 100644 --- a/_www/target.js +++ b/_www/target.js @@ -141,8 +141,7 @@ export class Target { let legend = document.createElement("legend"); legend.innerText = "Variables"; wrapper.appendChild(legend); - for (const key in this.opts.Vars) { - let fi = this.opts.Vars[key]; + for (const [key, fi] of Object.entries(this.opts.Vars)) { fi.value = LoadTargetVar(this.opts, key); GenerateFormInput(wrapper, fi); } @@ -152,23 +151,20 @@ export class Target { if (!this.opts.HttpTargets) { return; } - for (let x = 0; x < this.opts.HttpTargets.length; x++) { - let http_target = this.opts.HttpTargets[x]; - let com_http_target = new HttpTarget(trunks, this.opts, http_target); - this.http_targets[http_target.ID] = com_http_target; + this.opts.HttpTargets.forEach((httpTarget) => { + let com_http_target = new HttpTarget(trunks, this.opts, httpTarget); + this.http_targets[httpTarget.ID] = com_http_target; this.el_content.appendChild(com_http_target.el); - } + }); } generateWebSocketTargets(trunks) { if (!this.opts.WebSocketTargets) { return; } - for (let x = 0; x < this.opts.WebSocketTargets.length; x++) { - let ws_target = this.opts.WebSocketTargets[x]; - let com_ws_target = new WebSocketTarget(trunks, this.opts, ws_target); - this.ws_targets[ws_target.ID] = com_ws_target; + this.opts.WebSocketTargets.forEach((wsTarget) => { + let com_ws_target = new WebSocketTarget(trunks, this.opts, wsTarget); + this.ws_targets[wsTarget.ID] = com_ws_target; this.el_content.appendChild(com_ws_target.el); - } + }); } } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidGFyZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDREQUE0RDtBQUM1RCw0Q0FBNEM7QUFFNUMsT0FBTyxFQUFFLGNBQWMsRUFBc0IsTUFBTSx1QkFBdUIsQ0FBQTtBQUMxRSxPQUFPLEVBQUUsY0FBYyxFQUFzQixNQUFNLHVCQUF1QixDQUFBO0FBRTFFLE9BQU8sRUFDTixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLDBCQUEwQixFQUMxQixvQkFBb0IsRUFDcEIsYUFBYSxHQUNiLE1BQU0sZ0JBQWdCLENBQUE7QUFDdkIsT0FBTyxFQUNOLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZ0JBQWdCLEdBT2hCLE1BQU0sZ0JBQWdCLENBQUE7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUVoRCxNQUFNLHFCQUFxQixHQUFHLGlCQUFpQixDQUFBO0FBQy9DLE1BQU0sbUJBQW1CLEdBQUcsZUFBZSxDQUFBO0FBVTNDLE1BQU0sT0FBTyxNQUFNO0lBT2xCLFlBQ1EsTUFBdUIsRUFDdkIsSUFBcUI7UUFEckIsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDdkIsU0FBSSxHQUFKLElBQUksQ0FBaUI7UUFSN0IsV0FBTSxHQUFnQixRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25ELGVBQVUsR0FBZ0IsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUV2RCxpQkFBWSxHQUFrQixFQUFFLENBQUE7UUFDaEMsZUFBVSxHQUF1QixFQUFFLENBQUE7UUFNbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzdCLENBQUM7SUFFTyxXQUFXLENBQUMsTUFB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 \ No newline at end of file diff --git a/_www/target.ts b/_www/target.ts index 52d6a5a..214abec 100644 --- a/_www/target.ts +++ b/_www/target.ts @@ -1,265 +1,226 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -import { WuiInputNumber, WuiInputNumberOpts } from "./wui/input/number.js" -import { WuiInputString, WuiInputStringOpts } from "./wui/input/string.js" +import { WuiInputNumber, WuiInputNumberOpts } from "./wui/input/number.js"; +import { WuiInputString, WuiInputStringOpts } from "./wui/input/string.js"; import { - GenerateFormInput, - LoadTargetOptDuration, - LoadTargetOptRatePerSecond, - LoadTargetOptTimeout, - LoadTargetVar, -} from "./functions.js" + GenerateFormInput, + LoadTargetOptDuration, + LoadTargetOptRatePerSecond, + LoadTargetOptTimeout, + LoadTargetVar, +} from "./functions.js"; import { - CLASS_INPUT, - CLASS_INPUT_LABEL, - CLASS_NAV_TARGET, - AttackOptionsInterface, - HttpTargetInterface, - KeyFormInput, - TargetInterface, - TrunksInterface, - WebSocketTargetInterface, -} from "./interface.js" -import { HttpTarget } from "./http_target.js" -import { WebSocketTarget } from "./ws_target.js" - -const CLASS_NAV_TARGET_HTTP = "nav_http_target" -const CLASS_NAV_TARGET_WS = "nav_ws_target" + CLASS_INPUT, + CLASS_INPUT_LABEL, + CLASS_NAV_TARGET, + HttpTargetInterface, + TargetInterface, + TrunksInterface, + WebSocketTargetInterface, +} from "./interface.js"; +import { HttpTarget } from "./http_target.js"; +import { WebSocketTarget } from "./ws_target.js"; + +const CLASS_NAV_TARGET_HTTP = "nav_http_target"; +const CLASS_NAV_TARGET_WS = "nav_ws_target"; interface MapHttpTarget { - [key: string]: HttpTarget + [key: string]: HttpTarget; } interface MapWebSocketTarget { - [key: string]: WebSocketTarget + [key: string]: WebSocketTarget; } export class Target { - el_nav: HTMLElement = document.createElement("div") - el_content: HTMLElement = document.createElement("div") - - http_targets: MapHttpTarget = {} - ws_targets: MapWebSocketTarget = {} - - constructor( - public trunks: TrunksInterface, - public opts: TargetInterface, - ) { - this.generateNav(trunks) - this.generateContent(trunks) - } - - private generateNav(trunks: TrunksInterface) { - this.el_nav.classList.add(CLASS_NAV_TARGET) - - let el_target_menu = document.createElement("h3") - el_target_menu.innerHTML = this.opts.Name - el_target_menu.onclick = () => { - trunks.ContentRenderer( - this.opts, - null, - null, - null, - this.el_content, - ) - } - - this.el_nav.appendChild(el_target_menu) - - if (this.opts.HttpTargets) { - for (let ht of this.opts.HttpTargets) { - let el_target_http = - document.createElement("div") - el_target_http.innerHTML = ht.Name - el_target_http.id = `/http/${this.opts.ID}/${ht.ID}` - el_target_http.classList.add( - CLASS_NAV_TARGET_HTTP, - ) - el_target_http.onclick = () => { - trunks.ContentRenderer( - this.opts, - ht, - null, - null, - this.el_content, - ) - } - this.el_nav.appendChild(el_target_http) - } - } - - if (this.opts.WebSocketTargets) { - for (let wst of this.opts.WebSocketTargets) { - let el_target_ws = - document.createElement("div") - el_target_ws.innerHTML = wst.Name - el_target_ws.id = `/ws/${this.opts.ID}/${wst.ID}` - el_target_ws.classList.add( - CLASS_NAV_TARGET_WS, - ) - el_target_ws.onclick = () => { - trunks.ContentRenderer( - this.opts, - null, - wst, - null, - this.el_content, - ) - } - this.el_nav.appendChild(el_target_ws) - } - } - } - - private generateContent(trunks: TrunksInterface) { - this.generateContentBaseURL() - this.generateContentAttackOptions() - this.generateContentVars() - this.generateHttpTargets(trunks) - this.generateWebSocketTargets(trunks) - } - - private generateContentBaseURL() { - let hdr_target = document.createElement("h2") - hdr_target.innerText = this.opts.Name - hdr_target.id = this.opts.ID - - let el_hint = document.createElement("p") - el_hint.innerHTML = this.opts.Hint || "" - - let opts_base_url: WuiInputStringOpts = { - label: "Base URL", - hint: "The base URL where the HTTP request will be send or the target of attack.", - value: this.opts.BaseUrl, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_hint_toggled: true, - is_disabled: true, - onChangeHandler: (v: string) => { - this.opts.BaseUrl = v - }, - } - let com_input_base_url = new WuiInputString(opts_base_url) - - this.el_content.appendChild(hdr_target) - if (this.opts.Hint) { - this.el_content.appendChild(el_hint) - } - this.el_content.appendChild(com_input_base_url.el) - } - - private generateContentAttackOptions() { - let wrapper = document.createElement("fieldset") - - let legend = document.createElement("legend") - legend.innerText = "Attack options" - - let opts_duration: WuiInputNumberOpts = { - label: "Duration", - hint: "The duration of attack, in seconds.", - value: LoadTargetOptDuration(this.opts), - min: 1, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_hint_toggled: true, - onChangeHandler: (v: number) => { - this.opts.Opts.Duration = v * 1e9 - }, - } - let com_input_duration = new WuiInputNumber(opts_duration) - - let opts_rate: WuiInputNumberOpts = { - label: "Rate per second", - hint: "The number of request send per second when attacking target.", - value: LoadTargetOptRatePerSecond(this.opts), - min: 1, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_hint_toggled: true, - onChangeHandler: (v: number) => { - this.opts.Opts.RatePerSecond = v - }, - } - let com_input_rate = new WuiInputNumber(opts_rate) - - let opts_timeout: WuiInputNumberOpts = { - label: "Timeout (seconds)", - hint: "Timeout for each request, in seconds.", - value: LoadTargetOptTimeout(this.opts), - min: 5, - class_input: CLASS_INPUT, - class_label: CLASS_INPUT_LABEL, - is_hint_toggled: true, - onChangeHandler: (v: number) => { - this.opts.Opts.Timeout = v * 1e9 - }, - } - let com_input_timeout = new WuiInputNumber(opts_timeout) - - wrapper.appendChild(legend) - wrapper.appendChild(com_input_duration.el) - wrapper.appendChild(com_input_rate.el) - wrapper.appendChild(com_input_timeout.el) - this.el_content.appendChild(wrapper) - } - - private generateContentVars() { - if (!this.opts.Vars) { - return - } - - let wrapper = document.createElement("fieldset") - - let legend = document.createElement("legend") - legend.innerText = "Variables" - wrapper.appendChild(legend) - - for (const key in this.opts.Vars) { - let fi = this.opts.Vars[key] - fi.value = LoadTargetVar(this.opts, key) - GenerateFormInput(wrapper, fi) - } - - this.el_content.appendChild(wrapper) - } - - private generateHttpTargets(trunks: TrunksInterface) { - if (!this.opts.HttpTargets) { - return - } - - for (let x = 0; x < this.opts.HttpTargets.length; x++) { - let http_target = this.opts.HttpTargets[x] - - let com_http_target = new HttpTarget( - trunks, - this.opts, - http_target, - ) - this.http_targets[http_target.ID] = com_http_target - - this.el_content.appendChild(com_http_target.el) - } - } - - private generateWebSocketTargets(trunks: TrunksInterface) { - if (!this.opts.WebSocketTargets) { - return - } - - for (let x = 0; x < this.opts.WebSocketTargets.length; x++) { - let ws_target = this.opts.WebSocketTargets[x] - - let com_ws_target = new WebSocketTarget( - trunks, - this.opts, - ws_target, - ) - this.ws_targets[ws_target.ID] = com_ws_target - - this.el_content.appendChild(com_ws_target.el) - } - } + el_nav: HTMLElement = document.createElement("div"); + el_content: HTMLElement = document.createElement("div"); + + http_targets: MapHttpTarget = {}; + ws_targets: MapWebSocketTarget = {}; + + constructor( + public trunks: TrunksInterface, + public opts: TargetInterface, + ) { + this.generateNav(trunks); + this.generateContent(trunks); + } + + private generateNav(trunks: TrunksInterface) { + this.el_nav.classList.add(CLASS_NAV_TARGET); + + let el_target_menu = document.createElement("h3"); + el_target_menu.innerHTML = this.opts.Name; + el_target_menu.onclick = () => { + trunks.ContentRenderer(this.opts, null, null, null, this.el_content); + }; + + this.el_nav.appendChild(el_target_menu); + + if (this.opts.HttpTargets) { + for (let ht of this.opts.HttpTargets) { + let el_target_http = document.createElement("div"); + el_target_http.innerHTML = ht.Name; + el_target_http.id = `/http/${this.opts.ID}/${ht.ID}`; + el_target_http.classList.add(CLASS_NAV_TARGET_HTTP); + el_target_http.onclick = () => { + trunks.ContentRenderer(this.opts, ht, null, null, this.el_content); + }; + this.el_nav.appendChild(el_target_http); + } + } + + if (this.opts.WebSocketTargets) { + for (let wst of this.opts.WebSocketTargets) { + let el_target_ws = document.createElement("div"); + el_target_ws.innerHTML = wst.Name; + el_target_ws.id = `/ws/${this.opts.ID}/${wst.ID}`; + el_target_ws.classList.add(CLASS_NAV_TARGET_WS); + el_target_ws.onclick = () => { + trunks.ContentRenderer(this.opts, null, wst, null, this.el_content); + }; + this.el_nav.appendChild(el_target_ws); + } + } + } + + private generateContent(trunks: TrunksInterface) { + this.generateContentBaseURL(); + this.generateContentAttackOptions(); + this.generateContentVars(); + this.generateHttpTargets(trunks); + this.generateWebSocketTargets(trunks); + } + + private generateContentBaseURL() { + let hdr_target = document.createElement("h2"); + hdr_target.innerText = this.opts.Name; + hdr_target.id = this.opts.ID; + + let el_hint = document.createElement("p"); + el_hint.innerHTML = this.opts.Hint || ""; + + let opts_base_url: WuiInputStringOpts = { + label: "Base URL", + hint: "The base URL where the HTTP request will be send or the target of attack.", + value: this.opts.BaseUrl, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_hint_toggled: true, + is_disabled: true, + onChangeHandler: (v: string) => { + this.opts.BaseUrl = v; + }, + }; + let com_input_base_url = new WuiInputString(opts_base_url); + + this.el_content.appendChild(hdr_target); + if (this.opts.Hint) { + this.el_content.appendChild(el_hint); + } + this.el_content.appendChild(com_input_base_url.el); + } + + private generateContentAttackOptions() { + let wrapper = document.createElement("fieldset"); + + let legend = document.createElement("legend"); + legend.innerText = "Attack options"; + + let opts_duration: WuiInputNumberOpts = { + label: "Duration", + hint: "The duration of attack, in seconds.", + value: LoadTargetOptDuration(this.opts), + min: 1, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_hint_toggled: true, + onChangeHandler: (v: number) => { + this.opts.Opts.Duration = v * 1e9; + }, + }; + let com_input_duration = new WuiInputNumber(opts_duration); + + let opts_rate: WuiInputNumberOpts = { + label: "Rate per second", + hint: "The number of request send per second when attacking target.", + value: LoadTargetOptRatePerSecond(this.opts), + min: 1, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_hint_toggled: true, + onChangeHandler: (v: number) => { + this.opts.Opts.RatePerSecond = v; + }, + }; + let com_input_rate = new WuiInputNumber(opts_rate); + + let opts_timeout: WuiInputNumberOpts = { + label: "Timeout (seconds)", + hint: "Timeout for each request, in seconds.", + value: LoadTargetOptTimeout(this.opts), + min: 5, + class_input: CLASS_INPUT, + class_label: CLASS_INPUT_LABEL, + is_hint_toggled: true, + onChangeHandler: (v: number) => { + this.opts.Opts.Timeout = v * 1e9; + }, + }; + let com_input_timeout = new WuiInputNumber(opts_timeout); + + wrapper.appendChild(legend); + wrapper.appendChild(com_input_duration.el); + wrapper.appendChild(com_input_rate.el); + wrapper.appendChild(com_input_timeout.el); + this.el_content.appendChild(wrapper); + } + + private generateContentVars() { + if (!this.opts.Vars) { + return; + } + + let wrapper = document.createElement("fieldset"); + + let legend = document.createElement("legend"); + legend.innerText = "Variables"; + wrapper.appendChild(legend); + + for (const [key, fi] of Object.entries(this.opts.Vars)) { + fi.value = LoadTargetVar(this.opts, key); + GenerateFormInput(wrapper, fi); + } + + this.el_content.appendChild(wrapper); + } + + private generateHttpTargets(trunks: TrunksInterface) { + if (!this.opts.HttpTargets) { + return; + } + + this.opts.HttpTargets.forEach((httpTarget: HttpTargetInterface) => { + let com_http_target = new HttpTarget(trunks, this.opts, httpTarget); + this.http_targets[httpTarget.ID] = com_http_target; + + this.el_content.appendChild(com_http_target.el); + }); + } + + private generateWebSocketTargets(trunks: TrunksInterface) { + if (!this.opts.WebSocketTargets) { + return; + } + + this.opts.WebSocketTargets.forEach((wsTarget: WebSocketTargetInterface) => { + let com_ws_target = new WebSocketTarget(trunks, this.opts, wsTarget); + this.ws_targets[wsTarget.ID] = com_ws_target; + + this.el_content.appendChild(com_ws_target.el); + }); + } } diff --git a/_www/trunks.js b/_www/trunks.js index aa68147..ae1d421 100644 --- a/_www/trunks.js +++ b/_www/trunks.js @@ -1,14 +1,5 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; import { Environment } from "./environment.js"; import { Save } from "./functions.js"; import { HASH_ENVIRONMENT, } from "./interface.js"; @@ -83,76 +74,66 @@ export class Trunks { wrapper.appendChild(this.el_content); this.el.appendChild(wrapper); } - Init() { - return __awaiter(this, void 0, void 0, function* () { - yield this.apiEnvironmentGet(); - yield this.initTargets(); - yield this.initNavLinks(); + async Init() { + await this.apiEnvironmentGet(); + await this.initTargets(); + await this.initNavLinks(); + this.windowOnHashChange(); + window.onhashchange = () => { this.windowOnHashChange(); - window.onhashchange = () => { - this.windowOnHashChange(); - }; - }); + }; } - apiEnvironmentGet() { - return __awaiter(this, void 0, void 0, function* () { - let http_res = yield fetch(API_ENVIRONMENT); - let res = yield http_res.json(); - if (res.code != 200) { - wui_notif.Error(res.message); - return; - } - this.env = res.data; - this.setAttackRunning(this.env.AttackRunning); - this.com_env.Set(this.env); - }); + async apiEnvironmentGet() { + let http_res = await fetch(API_ENVIRONMENT); + let res = await http_res.json(); + if (res.code != 200) { + wui_notif.error(res.message); + return; + } + this.env = res.data; + this.setAttackRunning(this.env.AttackRunning); + this.com_env.Set(this.env); } - initNavLinks() { - return __awaiter(this, void 0, void 0, function* () { - let http_res = yield fetch(API_NAVLINKS); - let res = yield http_res.json(); - if (res.code != 200) { - wui_notif.Error(res.message); - return; - } - this.com_nav_links = new NavLinks(this, res.data); - this.el_nav_links.appendChild(this.com_nav_links.el_nav); - for (let nav of res.data) { - this.navLinks[nav.ID] = nav; - } - }); + async initNavLinks() { + let http_res = await fetch(API_NAVLINKS); + let res = await http_res.json(); + if (res.code != 200) { + wui_notif.error(res.message); + return; + } + this.com_nav_links = new NavLinks(this, res.data); + this.el_nav_links.appendChild(this.com_nav_links.el_nav); + for (let nav of res.data) { + this.navLinks[nav.ID] = nav; + } } - initTargets() { - return __awaiter(this, void 0, void 0, function* () { - let http_res = yield fetch(API_TARGETS); - let res = yield http_res.json(); - if (res.code != 200) { - wui_notif.Error(res.message); - return; - } - let targets = res.data; - this.el_nav_content.innerHTML = ""; - for (let target of targets) { - let com_target = new Target(this, target); - this.targets[target.ID] = com_target; - this.el_nav_content.appendChild(com_target.el_nav); - } - }); + async initTargets() { + let http_res = await fetch(API_TARGETS); + let res = await http_res.json(); + if (res.code != 200) { + wui_notif.error(res.message); + return; + } + let targets = res.data; + this.el_nav_content.innerHTML = ""; + for (let target of targets) { + let com_target = new Target(this, target); + this.targets[target.ID] = com_target; + this.el_nav_content.appendChild(com_target.el_nav); + } } - onClickAttackCancel() { - return __awaiter(this, void 0, void 0, function* () { - let fres = yield fetch(API_ATTACK_HTTP, { - method: "DELETE", - }); - let json_res = yield fres.json(); - if (json_res.code != 200) { - wui_notif.Error(json_res.message); - return null; - } - wui_notif.Info(json_res.message); - this.setAttackRunning(null); - return json_res; + async onClickAttackCancel() { + let fres = await fetch(API_ATTACK_HTTP, { + method: "DELETE", }); + let json_res = await fres.json(); + if (json_res.code != 200) { + wui_notif.error(json_res.message); + return null; + } + wui_notif.info(json_res.message); + this.setAttackRunning(null); + return json_res; } windowOnHashChange() { // Parse the location hash. @@ -168,7 +149,13 @@ export class Trunks { } console.log("paths: ", paths); let el; + if (!paths[1]) { + return; + } let target = this.targets[paths[1]]; + if (!target) { + return; + } switch (paths.length) { case 2: case 3: @@ -191,9 +178,13 @@ export class Trunks { this.el_content.appendChild(target.el_content); } else if (paths[2] === "link") { - let nav = this.navLinks[paths[3]]; - this.el_content.innerHTML = ""; - this.com_nav_links.open(nav); + if (paths[3]) { + let nav = this.navLinks[paths[3]]; + if (nav) { + this.el_content.innerHTML = ""; + this.com_nav_links.open(nav); + } + } } el = document.getElementById(paths[3]); if (el) { @@ -220,80 +211,74 @@ export class Trunks { this.onClickAttackCancel(); }; this.el_attack_running.appendChild(this.el_attack_cancel); - wui_notif.Info(`Attacking "${runRequest.Target.Name}/${runRequest.HttpTarget.Name}" ...`); + wui_notif.info(`Attacking "${runRequest.Target.Name}/${runRequest.HttpTarget.Name}" ...`); } - AttackHttp(target, http_target) { - return __awaiter(this, void 0, void 0, function* () { - Save(target, http_target, null); - let attackReq = { - Target: { - ID: target.ID, - Opts: target.Opts, - Vars: target.Vars, - Name: target.Name, - BaseUrl: target.BaseUrl, - HttpTargets: [], - WebSocketTargets: [], - }, - HttpTarget: { - ID: http_target.ID, - Name: http_target.Name, - Method: http_target.Method, - Path: http_target.Path, - RequestType: http_target.RequestType, - Headers: http_target.Headers, - Params: http_target.Params, - Results: [], - AllowAttack: http_target.AllowAttack, - IsCustomizable: http_target.IsCustomizable, - }, - WebSocketTarget: null, - }; - let http_res = yield fetch(API_ATTACK_HTTP, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(attackReq), - }); - let json_res = yield http_res.json(); - if (json_res.code != 200) { - wui_notif.Error(json_res.message); - return null; - } - this.setAttackRunning(attackReq); - return json_res; + async AttackHttp(target, http_target) { + Save(target, http_target, null); + let attackReq = { + Target: { + ID: target.ID, + Opts: target.Opts, + Vars: target.Vars, + Name: target.Name, + BaseUrl: target.BaseUrl, + HttpTargets: [], + WebSocketTargets: [], + }, + HttpTarget: { + ID: http_target.ID, + Name: http_target.Name, + Method: http_target.Method, + Path: http_target.Path, + RequestType: http_target.RequestType, + Headers: http_target.Headers, + Params: http_target.Params, + Results: [], + AllowAttack: http_target.AllowAttack, + IsCustomizable: http_target.IsCustomizable, + }, + WebSocketTarget: null, + }; + let http_res = await fetch(API_ATTACK_HTTP, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(attackReq), }); + let json_res = await http_res.json(); + if (json_res.code != 200) { + wui_notif.error(json_res.message); + return null; + } + this.setAttackRunning(attackReq); + return json_res; } - AttackHttpDelete(name) { - return __awaiter(this, void 0, void 0, function* () { - let msg = `Are you sure you want to delete the result: ${name}?`; - let yes = window.confirm(msg); - if (!yes) { - return null; - } - let url = API_ATTACK_RESULT + "?name=" + name; - let fres = yield fetch(url, { - method: "DELETE", - }); - let json_res = yield fres.json(); - if (json_res.code != 200) { - wui_notif.Error(json_res.message); - return null; - } - return json_res; + async AttackHttpDelete(name) { + let msg = `Are you sure you want to delete the result: ${name}?`; + let yes = window.confirm(msg); + if (!yes) { + return null; + } + let url = API_ATTACK_RESULT + "?name=" + name; + let fres = await fetch(url, { + method: "DELETE", }); + let json_res = await fres.json(); + if (json_res.code != 200) { + wui_notif.error(json_res.message); + return null; + } + return json_res; } - AttackHttpGet(name) { - return __awaiter(this, void 0, void 0, function* () { - let url = API_ATTACK_RESULT + "?name=" + name; - let fres = yield fetch(url); - let res = yield fres.json(); - if (res.code != 200) { - wui_notif.Error(res.message); - } - return res; - }); + async AttackHttpGet(name) { + let url = API_ATTACK_RESULT + "?name=" + name; + let fres = await fetch(url); + let res = await fres.json(); + if (res.code != 200) { + wui_notif.error(res.message); + } + return res; } ContentRenderer(target, http_target, ws_target, nav_link, el) { let hash = "#/" + target.ID; @@ -310,75 +295,71 @@ export class Trunks { this.el_content.innerHTML = ""; this.el_content.appendChild(el); } - RunHttp(target, http_target) { - return __awaiter(this, void 0, void 0, function* () { - Save(target, http_target, null); - let req = { - Target: { - ID: target.ID, - Opts: target.Opts, - Vars: target.Vars, - Name: "", - BaseUrl: "", - HttpTargets: [], - WebSocketTargets: [], - }, - HttpTarget: http_target, - WebSocketTarget: null, - }; - let http_res = yield fetch(API_TARGET_RUN_HTTP, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(req), - }); - let json_res = yield http_res.json(); - if (json_res.code != 200) { - wui_notif.Error(json_res.message); - return null; - } - let res = json_res.data; - if (res.ResponseStatusCode != 200) { - wui_notif.Error(`${http_target.Name}: ${res.ResponseStatus}`); - } - else { - wui_notif.Info(`${http_target.Name}: ${res.ResponseStatus}`); - } - return res; + async RunHttp(target, http_target) { + Save(target, http_target, null); + let req = { + Target: { + ID: target.ID, + Opts: target.Opts, + Vars: target.Vars, + Name: "", + BaseUrl: "", + HttpTargets: [], + WebSocketTargets: [], + }, + HttpTarget: http_target, + WebSocketTarget: null, + }; + let http_res = await fetch(API_TARGET_RUN_HTTP, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(req), }); + let json_res = await http_res.json(); + if (json_res.code != 200) { + wui_notif.error(json_res.message); + return null; + } + let res = json_res.data; + if (res.ResponseStatusCode != 200) { + wui_notif.error(`${http_target.Name}: ${res.ResponseStatus}`); + } + else { + wui_notif.info(`${http_target.Name}: ${res.ResponseStatus}`); + } + return res; } - RunWebSocket(target, ws_target) { - return __awaiter(this, void 0, void 0, function* () { - Save(target, null, ws_target); - let req = { - Target: { - ID: target.ID, - Opts: target.Opts, - Vars: target.Vars, - Name: "", - BaseUrl: "", - HttpTargets: [], - WebSocketTargets: [], - }, - HttpTarget: null, - WebSocketTarget: ws_target, - }; - let fres = yield fetch(API_TARGET_RUN_WEBSOCKET, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(req), - }); - let json_res = yield fres.json(); - if (json_res.code != 200) { - wui_notif.Error(json_res.message); - return null; - } - wui_notif.Info(`${ws_target.Name}: success.`); - return json_res; + async RunWebSocket(target, ws_target) { + Save(target, null, ws_target); + let req = { + Target: { + ID: target.ID, + Opts: target.Opts, + Vars: target.Vars, + Name: "", + BaseUrl: "", + HttpTargets: [], + WebSocketTargets: [], + }, + HttpTarget: null, + WebSocketTarget: ws_target, + }; + let fres = await fetch(API_TARGET_RUN_WEBSOCKET, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(req), }); + let json_res = await fres.json(); + if (json_res.code != 200) { + wui_notif.error(json_res.message); + return null; + } + wui_notif.info(`${ws_target.Name}: success.`); + return json_res; } SetContent(path, el) { this.el_content.innerHTML = ""; @@ -388,4 +369,3 @@ export class Trunks { window.location.hash = "#/" + path; } } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1bmtzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidHJ1bmtzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDREQUE0RDtBQUM1RCw0Q0FBNEM7Ozs7Ozs7Ozs7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNyQyxPQUFPLEVBR04sZ0JBQWdCLEdBWWhCLE1BQU0sZ0JBQWdCLENBQUE7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUVyQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQTtBQUNsRCxNQUFNLGlCQUFpQixHQUFHLDRCQUE0QixDQUFBO0FBQ3RELE1BQU0sZUFBZSxHQUFHLDBCQUEwQixDQUFBO0FBQ2xELE1BQU0sWUFBWSxHQUFHLHVCQUF1QixDQUFBO0FBQzVDLE1BQU0sV0FBVyxHQUFHLHNCQUFzQixDQUFBO0FBRTFDLE1BQU0sbUJBQW1CLEdBQUcsOEJBQThCLENBQUE7QUFDMUQsTUFBTSx3QkFBd0IsR0FBRyxtQ0FBbUMsQ0FBQTtBQUVwRSxNQUFNLG9CQUFvQixHQUFHLHVCQUF1QixDQUFBO0FBQ3BELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQTtBQUNwQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUE7QUFDaEMsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFBO0FBVTlCLE1BQU0sT0FBTyxNQUFNO0lBdUJsQjtRQWRBLFFBQUcsR0FBeUI7WUFDM0IsYUFBYSxFQUFFLEVBQUU7WUFDakIsaUJBQWlCLEVBQUUsQ0FBQztZQUNwQixhQUFhLEVBQUUsQ0FBQztZQUNoQixVQUFVLEVBQUUsRUFBRTtZQUNkLGFBQWEsRUFBRSxFQUFF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 \ No newline at end of file diff --git a/_www/trunks.ts b/_www/trunks.ts index 9b90c11..154fa41 100644 --- a/_www/trunks.ts +++ b/_www/trunks.ts @@ -1,485 +1,478 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -import { Environment } from "./environment.js" -import { Save } from "./functions.js" +import { Environment } from "./environment.js"; +import { Save } from "./functions.js"; import { - CLASS_NAV_LINK, - CLASS_NAV_TARGET, - HASH_ENVIRONMENT, - AttackResult, - EnvironmentInterface, - HttpResponseInterface, - HttpTargetInterface, - MapIdTarget, - MapNumberString, - NavLinkInterface, - RunRequestInterface, - RunResponseInterface, - TargetInterface, - WebSocketTargetInterface, -} from "./interface.js" -import { NavLinks } from "./nav_links.js" -import { Target } from "./target.js" -import { wui_notif } from "./vars.js" - -const API_ATTACK_HTTP = "/_trunks/api/attack/http" -const API_ATTACK_RESULT = "/_trunks/api/attack/result" -const API_ENVIRONMENT = "/_trunks/api/environment" -const API_NAVLINKS = "/_trunks/api/navlinks" -const API_TARGETS = "/_trunks/api/targets" - -const API_TARGET_RUN_HTTP = "/_trunks/api/target/run/http" -const API_TARGET_RUN_WEBSOCKET = "/_trunks/api/target/run/websocket" - -const CLASS_ATTACK_RUNNING = "trunks_attack_running" -const CLASS_FOOTER = "trunks_footer" -const CLASS_MAIN = "trunks_main" -const CLASS_NAV = "trunks_nav" + HASH_ENVIRONMENT, + EnvironmentInterface, + HttpResponseInterface, + HttpTargetInterface, + NavLinkInterface, + RunRequestInterface, + RunResponseInterface, + TargetInterface, + WebSocketTargetInterface, +} from "./interface.js"; +import { NavLinks } from "./nav_links.js"; +import { Target } from "./target.js"; +import { wui_notif } from "./vars.js"; + +const API_ATTACK_HTTP = "/_trunks/api/attack/http"; +const API_ATTACK_RESULT = "/_trunks/api/attack/result"; +const API_ENVIRONMENT = "/_trunks/api/environment"; +const API_NAVLINKS = "/_trunks/api/navlinks"; +const API_TARGETS = "/_trunks/api/targets"; + +const API_TARGET_RUN_HTTP = "/_trunks/api/target/run/http"; +const API_TARGET_RUN_WEBSOCKET = "/_trunks/api/target/run/websocket"; + +const CLASS_ATTACK_RUNNING = "trunks_attack_running"; +const CLASS_FOOTER = "trunks_footer"; +const CLASS_MAIN = "trunks_main"; +const CLASS_NAV = "trunks_nav"; interface MapIDTarget { - [key: string]: Target + [key: string]: Target; } interface MapIDNavLink { - [key: string]: NavLinkInterface + [key: string]: NavLinkInterface; } export class Trunks { - el!: HTMLDivElement - el_attack_running!: HTMLElement - el_attack_cancel!: HTMLButtonElement - el_content!: HTMLElement - el_nav_content!: HTMLElement - el_nav_links!: HTMLElement - el_ws_conn_status!: HTMLElement - - env: EnvironmentInterface = { - ListenAddress: "", - MaxAttackDuration: 0, - MaxAttackRate: 0, - ResultsDir: "", - ResultsSuffix: "", - AttackRunning: null, - } - - com_env!: Environment - com_nav_links!: NavLinks - targets: MapIDTarget = {} - navLinks: MapIDNavLink = {} - - constructor() { - this.el = document.createElement("div") - - this.com_env = new Environment(this, this.env) - this.generateNav() - this.generateContent() - - document.body.appendChild(this.el) - } - - private generateNav() { - let el_nav = document.createElement("div") - el_nav.classList.add(CLASS_NAV) - - this.el_ws_conn_status = document.createElement("div") - - let fs_attack_running = document.createElement("fieldset") - let legend = document.createElement("legend") - legend.innerText = "Attack running" - - this.el_attack_running = document.createElement("span") - this.el_attack_running.classList.add(CLASS_ATTACK_RUNNING) - - this.el_nav_content = document.createElement("div") - this.el_nav_links = document.createElement("div") - - let el_nav_footer = document.createElement("div") - el_nav_footer.classList.add(CLASS_FOOTER) - el_nav_footer.innerHTML = ` + el!: HTMLDivElement; + el_attack_running!: HTMLElement; + el_attack_cancel!: HTMLButtonElement; + el_content!: HTMLElement; + el_nav_content!: HTMLElement; + el_nav_links!: HTMLElement; + el_ws_conn_status!: HTMLElement; + + env: EnvironmentInterface = { + ListenAddress: "", + MaxAttackDuration: 0, + MaxAttackRate: 0, + ResultsDir: "", + ResultsSuffix: "", + AttackRunning: null, + }; + + com_env!: Environment; + com_nav_links!: NavLinks; + targets: MapIDTarget = {}; + navLinks: MapIDNavLink = {}; + + constructor() { + this.el = document.createElement("div"); + + this.com_env = new Environment(this, this.env); + this.generateNav(); + this.generateContent(); + + document.body.appendChild(this.el); + } + + private generateNav() { + let el_nav = document.createElement("div"); + el_nav.classList.add(CLASS_NAV); + + this.el_ws_conn_status = document.createElement("div"); + + let fs_attack_running = document.createElement("fieldset"); + let legend = document.createElement("legend"); + legend.innerText = "Attack running"; + + this.el_attack_running = document.createElement("span"); + this.el_attack_running.classList.add(CLASS_ATTACK_RUNNING); + + this.el_nav_content = document.createElement("div"); + this.el_nav_links = document.createElement("div"); + + let el_nav_footer = document.createElement("div"); + el_nav_footer.classList.add(CLASS_FOOTER); + el_nav_footer.innerHTML = `
Powered by Trunks
- ` - - el_nav.appendChild(this.el_ws_conn_status) - - fs_attack_running.appendChild(legend) - fs_attack_running.appendChild(this.el_attack_running) - el_nav.appendChild(fs_attack_running) - - el_nav.appendChild(this.com_env.el_nav) - el_nav.appendChild(this.el_nav_content) - el_nav.appendChild(document.createElement("hr")) - el_nav.appendChild(this.el_nav_links) - el_nav.appendChild(el_nav_footer) - this.el.appendChild(el_nav) - } - - private generateContent() { - let wrapper = document.createElement("div") - wrapper.classList.add(CLASS_MAIN) - - this.el_attack_cancel = document.createElement("button") - this.el_attack_cancel.innerHTML = "Cancel" - - this.el_content = document.createElement("div") - wrapper.appendChild(this.el_content) - - this.el.appendChild(wrapper) - } - - async Init() { - await this.apiEnvironmentGet() - await this.initTargets() - await this.initNavLinks() - - this.windowOnHashChange() - window.onhashchange = () => { - this.windowOnHashChange() - } - } - - async apiEnvironmentGet() { - let http_res = await fetch(API_ENVIRONMENT) - let res = await http_res.json() - if (res.code != 200) { - wui_notif.Error(res.message) - return - } - - this.env = res.data - - this.setAttackRunning(this.env.AttackRunning) - this.com_env.Set(this.env) - } - - async initNavLinks() { - let http_res = await fetch(API_NAVLINKS) - let res = await http_res.json() - if (res.code != 200) { - wui_notif.Error(res.message) - return - } - - this.com_nav_links = new NavLinks(this, res.data) - this.el_nav_links.appendChild(this.com_nav_links.el_nav) - - for (let nav of res.data) { - this.navLinks[nav.ID] = nav - } - } - - async initTargets() { - let http_res = await fetch(API_TARGETS) - let res = await http_res.json() - if (res.code != 200) { - wui_notif.Error(res.message) - return - } - - let targets = res.data - - this.el_nav_content.innerHTML = "" - - for (let target of targets) { - let com_target = new Target(this, target) - this.targets[target.ID] = com_target - - this.el_nav_content.appendChild(com_target.el_nav) - } - } - - private async onClickAttackCancel() { - let fres = await fetch(API_ATTACK_HTTP, { - method: "DELETE", - }) - let json_res = await fres.json() - if (json_res.code != 200) { - wui_notif.Error(json_res.message) - return null - } - wui_notif.Info(json_res.message) - this.setAttackRunning(null) - return json_res - } - - private windowOnHashChange() { - // Parse the location hash. - let path = window.location.hash.substring(1) - let paths = path.split("/") - if (paths.length < 2) { - return - } - - if (paths[1] === HASH_ENVIRONMENT) { - this.el_content.innerHTML = "" - this.el_content.appendChild(this.com_env.el_content) - return - } - - console.log("paths: ", paths) - - let el: HTMLElement | null - let target = this.targets[paths[1]] - switch (paths.length) { - case 2: - case 3: - if (target) { - this.el_content.innerHTML = "" - this.el_content.appendChild( - target.el_content, - ) - el = document.getElementById(paths[1]) - if (el) { - el.scrollIntoView() - } - } - break - - case 4: - if (paths[2] === "http") { - this.el_content.innerHTML = "" - this.el_content.appendChild( - target.el_content, - ) - } else if (paths[2] === "ws") { - this.el_content.innerHTML = "" - this.el_content.appendChild( - target.el_content, - ) - } else if (paths[2] === "link") { - let nav = this.navLinks[paths[3]] - this.el_content.innerHTML = "" - this.com_nav_links.open(nav) - } - el = document.getElementById(paths[3]) - if (el) { - el.scrollIntoView() - } - break - } - } - - setAttackRunning(runRequest: RunRequestInterface | null) { - if (!runRequest) { - this.el_attack_running.innerHTML = "-" - return - } - if (!runRequest.Target || !runRequest.HttpTarget) { - this.el_attack_running.innerHTML = "-" - return - } - this.el_attack_running.innerHTML = ` + `; + + el_nav.appendChild(this.el_ws_conn_status); + + fs_attack_running.appendChild(legend); + fs_attack_running.appendChild(this.el_attack_running); + el_nav.appendChild(fs_attack_running); + + el_nav.appendChild(this.com_env.el_nav); + el_nav.appendChild(this.el_nav_content); + el_nav.appendChild(document.createElement("hr")); + el_nav.appendChild(this.el_nav_links); + el_nav.appendChild(el_nav_footer); + this.el.appendChild(el_nav); + } + + private generateContent() { + let wrapper = document.createElement("div"); + wrapper.classList.add(CLASS_MAIN); + + this.el_attack_cancel = document.createElement("button"); + this.el_attack_cancel.innerHTML = "Cancel"; + + this.el_content = document.createElement("div"); + wrapper.appendChild(this.el_content); + + this.el.appendChild(wrapper); + } + + async Init() { + await this.apiEnvironmentGet(); + await this.initTargets(); + await this.initNavLinks(); + + this.windowOnHashChange(); + window.onhashchange = () => { + this.windowOnHashChange(); + }; + } + + async apiEnvironmentGet() { + let http_res = await fetch(API_ENVIRONMENT); + let res = await http_res.json(); + if (res.code != 200) { + wui_notif.error(res.message); + return; + } + + this.env = res.data; + + this.setAttackRunning(this.env.AttackRunning); + this.com_env.Set(this.env); + } + + async initNavLinks() { + let http_res = await fetch(API_NAVLINKS); + let res = await http_res.json(); + if (res.code != 200) { + wui_notif.error(res.message); + return; + } + + this.com_nav_links = new NavLinks(this, res.data); + this.el_nav_links.appendChild(this.com_nav_links.el_nav); + + for (let nav of res.data) { + this.navLinks[nav.ID] = nav; + } + } + + async initTargets() { + let http_res = await fetch(API_TARGETS); + let res = await http_res.json(); + if (res.code != 200) { + wui_notif.error(res.message); + return; + } + + let targets = res.data; + + this.el_nav_content.innerHTML = ""; + + for (let target of targets) { + let com_target = new Target(this, target); + this.targets[target.ID] = com_target; + + this.el_nav_content.appendChild(com_target.el_nav); + } + } + + private async onClickAttackCancel() { + let fres = await fetch(API_ATTACK_HTTP, { + method: "DELETE", + }); + let json_res = await fres.json(); + if (json_res.code != 200) { + wui_notif.error(json_res.message); + return null; + } + wui_notif.info(json_res.message); + this.setAttackRunning(null); + return json_res; + } + + private windowOnHashChange() { + // Parse the location hash. + let path = window.location.hash.substring(1); + let paths = path.split("/"); + if (paths.length < 2) { + return; + } + + if (paths[1] === HASH_ENVIRONMENT) { + this.el_content.innerHTML = ""; + this.el_content.appendChild(this.com_env.el_content); + return; + } + + console.log("paths: ", paths); + + let el: HTMLElement | null; + if (!paths[1]) { + return; + } + let target = this.targets[paths[1]]; + if (!target) { + return; + } + switch (paths.length) { + case 2: + case 3: + if (target) { + this.el_content.innerHTML = ""; + this.el_content.appendChild(target.el_content); + el = document.getElementById(paths[1]!); + if (el) { + el.scrollIntoView(); + } + } + break; + + case 4: + if (paths[2] === "http") { + this.el_content.innerHTML = ""; + this.el_content.appendChild(target.el_content); + } else if (paths[2] === "ws") { + this.el_content.innerHTML = ""; + this.el_content.appendChild(target.el_content); + } else if (paths[2] === "link") { + if (paths[3]) { + let nav = this.navLinks[paths[3]]; + if (nav) { + this.el_content.innerHTML = ""; + this.com_nav_links.open(nav); + } + } + } + el = document.getElementById(paths[3]!); + if (el) { + el.scrollIntoView(); + } + break; + } + } + + setAttackRunning(runRequest: RunRequestInterface | null) { + if (!runRequest) { + this.el_attack_running.innerHTML = "-"; + return; + } + if (!runRequest.Target || !runRequest.HttpTarget) { + this.el_attack_running.innerHTML = "-"; + return; + } + this.el_attack_running.innerHTML = ` ${runRequest.Target.Name}
/ ${runRequest.HttpTarget.Name}

- ` - this.el_attack_cancel.onclick = () => { - this.onClickAttackCancel() - } - this.el_attack_running.appendChild(this.el_attack_cancel) - - wui_notif.Info( - `Attacking "${runRequest.Target.Name}/${runRequest.HttpTarget.Name}" ...`, - ) - } - - async AttackHttp( - target: TargetInterface, - http_target: HttpTargetInterface, - ): Promise { - Save(target, http_target, null) - - let attackReq: RunRequestInterface = { - Target: { - ID: target.ID, - Opts: target.Opts, - Vars: target.Vars, - Name: target.Name, - BaseUrl: target.BaseUrl, - HttpTargets: [], - WebSocketTargets: [], - }, - HttpTarget: { - ID: http_target.ID, - Name: http_target.Name, - Method: http_target.Method, - Path: http_target.Path, - RequestType: http_target.RequestType, - Headers: http_target.Headers, - Params: http_target.Params, - Results: [], - AllowAttack: http_target.AllowAttack, - IsCustomizable: http_target.IsCustomizable, - }, - WebSocketTarget: null, - } - - let http_res = await fetch(API_ATTACK_HTTP, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(attackReq), - }) - let json_res = await http_res.json() - if (json_res.code != 200) { - wui_notif.Error(json_res.message) - return null - } - - this.setAttackRunning(attackReq) - - return json_res - } - - async AttackHttpDelete( - name: string, - ): Promise { - let msg = `Are you sure you want to delete the result: ${name}?` - let yes = window.confirm(msg) - if (!yes) { - return null - } - - let url = API_ATTACK_RESULT + "?name=" + name - let fres = await fetch(url, { - method: "DELETE", - }) - let json_res = await fres.json() - if (json_res.code != 200) { - wui_notif.Error(json_res.message) - return null - } - return json_res - } - - async AttackHttpGet(name: string): Promise { - let url = API_ATTACK_RESULT + "?name=" + name - let fres = await fetch(url) - let res = await fres.json() - if (res.code != 200) { - wui_notif.Error(res.message) - } - return res - } - - ContentRenderer( - target: TargetInterface, - http_target: HttpTargetInterface, - ws_target: WebSocketTargetInterface, - nav_link: NavLinkInterface, - el: HTMLElement, - ): void { - let hash = "#/" + target.ID - if (http_target) { - hash += "/http/" + http_target.ID - } else if (ws_target) { - hash += "/ws/" + ws_target.ID - } else if (nav_link) { - hash += "/link/" + nav_link.ID - } - window.location.hash = hash - - this.el_content.innerHTML = "" - this.el_content.appendChild(el) - } - - async RunHttp( - target: TargetInterface, - http_target: HttpTargetInterface, - ): Promise { - Save(target, http_target, null) - - let req: RunRequestInterface = { - Target: { - ID: target.ID, - Opts: target.Opts, - Vars: target.Vars, - Name: "", - BaseUrl: "", - HttpTargets: [], - WebSocketTargets: [], - }, - HttpTarget: http_target, - WebSocketTarget: null, - } - - let http_res = await fetch(API_TARGET_RUN_HTTP, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(req), - }) - - let json_res = await http_res.json() - if (json_res.code != 200) { - wui_notif.Error(json_res.message) - return null - } - - let res = json_res.data as RunResponseInterface - - if (res.ResponseStatusCode != 200) { - wui_notif.Error( - `${http_target.Name}: ${res.ResponseStatus}`, - ) - } else { - wui_notif.Info( - `${http_target.Name}: ${res.ResponseStatus}`, - ) - } - - return res - } - - async RunWebSocket( - target: TargetInterface, - ws_target: WebSocketTargetInterface, - ): Promise { - Save(target, null, ws_target) - - let req: RunRequestInterface = { - Target: { - ID: target.ID, - Opts: target.Opts, - Vars: target.Vars, - Name: "", - BaseUrl: "", - HttpTargets: [], - WebSocketTargets: [], - }, - HttpTarget: null, - WebSocketTarget: ws_target, - } - - let fres = await fetch(API_TARGET_RUN_WEBSOCKET, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(req), - }) - - let json_res = await fres.json() - if (json_res.code != 200) { - wui_notif.Error(json_res.message) - return null - } - wui_notif.Info(`${ws_target.Name}: success.`) - return json_res - } - - SetContent(path: string, el: HTMLElement | null): void { - this.el_content.innerHTML = "" - - if (el) { - this.el_content.appendChild(el) - } - - window.location.hash = "#/" + path - } + `; + this.el_attack_cancel.onclick = () => { + this.onClickAttackCancel(); + }; + this.el_attack_running.appendChild(this.el_attack_cancel); + + wui_notif.info( + `Attacking "${runRequest.Target.Name}/${runRequest.HttpTarget.Name}" ...`, + ); + } + + async AttackHttp( + target: TargetInterface, + http_target: HttpTargetInterface, + ): Promise { + Save(target, http_target, null); + + let attackReq: RunRequestInterface = { + Target: { + ID: target.ID, + Opts: target.Opts, + Vars: target.Vars, + Name: target.Name, + BaseUrl: target.BaseUrl, + HttpTargets: [], + WebSocketTargets: [], + }, + HttpTarget: { + ID: http_target.ID, + Name: http_target.Name, + Method: http_target.Method, + Path: http_target.Path, + RequestType: http_target.RequestType, + Headers: http_target.Headers, + Params: http_target.Params, + Results: [], + AllowAttack: http_target.AllowAttack, + IsCustomizable: http_target.IsCustomizable, + }, + WebSocketTarget: null, + }; + + let http_res = await fetch(API_ATTACK_HTTP, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(attackReq), + }); + let json_res = await http_res.json(); + if (json_res.code != 200) { + wui_notif.error(json_res.message); + return null; + } + + this.setAttackRunning(attackReq); + + return json_res; + } + + async AttackHttpDelete(name: string): Promise { + let msg = `Are you sure you want to delete the result: ${name}?`; + let yes = window.confirm(msg); + if (!yes) { + return null; + } + + let url = API_ATTACK_RESULT + "?name=" + name; + let fres = await fetch(url, { + method: "DELETE", + }); + let json_res = await fres.json(); + if (json_res.code != 200) { + wui_notif.error(json_res.message); + return null; + } + return json_res; + } + + async AttackHttpGet(name: string): Promise { + let url = API_ATTACK_RESULT + "?name=" + name; + let fres = await fetch(url); + let res = await fres.json(); + if (res.code != 200) { + wui_notif.error(res.message); + } + return res; + } + + ContentRenderer( + target: TargetInterface, + http_target: HttpTargetInterface, + ws_target: WebSocketTargetInterface, + nav_link: NavLinkInterface, + el: HTMLElement, + ): void { + let hash = "#/" + target.ID; + if (http_target) { + hash += "/http/" + http_target.ID; + } else if (ws_target) { + hash += "/ws/" + ws_target.ID; + } else if (nav_link) { + hash += "/link/" + nav_link.ID; + } + window.location.hash = hash; + + this.el_content.innerHTML = ""; + this.el_content.appendChild(el); + } + + async RunHttp( + target: TargetInterface, + http_target: HttpTargetInterface, + ): Promise { + Save(target, http_target, null); + + let req: RunRequestInterface = { + Target: { + ID: target.ID, + Opts: target.Opts, + Vars: target.Vars, + Name: "", + BaseUrl: "", + HttpTargets: [], + WebSocketTargets: [], + }, + HttpTarget: http_target, + WebSocketTarget: null, + }; + + let http_res = await fetch(API_TARGET_RUN_HTTP, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(req), + }); + + let json_res = await http_res.json(); + if (json_res.code != 200) { + wui_notif.error(json_res.message); + return null; + } + + let res = json_res.data as RunResponseInterface; + + if (res.ResponseStatusCode != 200) { + wui_notif.error(`${http_target.Name}: ${res.ResponseStatus}`); + } else { + wui_notif.info(`${http_target.Name}: ${res.ResponseStatus}`); + } + + return res; + } + + async RunWebSocket( + target: TargetInterface, + ws_target: WebSocketTargetInterface, + ): Promise { + Save(target, null, ws_target); + + let req: RunRequestInterface = { + Target: { + ID: target.ID, + Opts: target.Opts, + Vars: target.Vars, + Name: "", + BaseUrl: "", + HttpTargets: [], + WebSocketTargets: [], + }, + HttpTarget: null, + WebSocketTarget: ws_target, + }; + + let fres = await fetch(API_TARGET_RUN_WEBSOCKET, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(req), + }); + + let json_res = await fres.json(); + if (json_res.code != 200) { + wui_notif.error(json_res.message); + return null; + } + wui_notif.info(`${ws_target.Name}: success.`); + return json_res; + } + + SetContent(path: string, el: HTMLElement | null): void { + this.el_content.innerHTML = ""; + + if (el) { + this.el_content.appendChild(el); + } + + window.location.hash = "#/" + path; + } } diff --git a/_www/tsconfig.json b/_www/tsconfig.json index 1fe9bae..217e570 100644 --- a/_www/tsconfig.json +++ b/_www/tsconfig.json @@ -1,12 +1,25 @@ { - "compilerOptions": { - "esModuleInterop": true, - "inlineSourceMap": true, - "lib": ["es2015", "dom", "es2015.promise"], - "module": "es2015", - "moduleResolution": "node", - "strict": true, - "target": "es2015" - }, - "exclude": ["doc"] + "compilerOptions": { + "target": "es2018", + "module": "es2020", + "isolatedModules": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitAny": true, + "noImplicitThis": true, + "useUnknownInCatchVariables": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "exactOptionalPropertyTypes": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "skipLibCheck": true, + }, + "files": [ + "index.ts" + ] } diff --git a/_www/vars.js b/_www/vars.js index 5cc2559..9639fc3 100644 --- a/_www/vars.js +++ b/_www/vars.js @@ -2,4 +2,3 @@ // SPDX-License-Identifier: GPL-3.0-or-later import { WuiNotif } from "./wui/notif/notif.js"; export let wui_notif = new WuiNotif(); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInZhcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNERBQTREO0FBQzVELDRDQUE0QztBQUU1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFFL0MsTUFBTSxDQUFDLElBQUksU0FBUyxHQUFHLElBQUksUUFBUSxFQUFFLENBQUEifQ== \ No newline at end of file diff --git a/_www/vars.ts b/_www/vars.ts index b613499..a175016 100644 --- a/_www/vars.ts +++ b/_www/vars.ts @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -import { WuiNotif } from "./wui/notif/notif.js" +import { WuiNotif } from "./wui/notif/notif.js"; -export let wui_notif = new WuiNotif() +export let wui_notif = new WuiNotif(); diff --git a/_www/ws_target.js b/_www/ws_target.js index b1425f5..d7dc1bd 100644 --- a/_www/ws_target.js +++ b/_www/ws_target.js @@ -1,14 +1,5 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; import { GenerateFormInput, LoadWsTargetHeader, LoadWsTargetParam, } from "./functions.js"; const CLASS_WS_TARGET = "ws_target"; const CLASS_WS_TARGET_ACTIONS = "ws_target_actions"; @@ -72,8 +63,7 @@ export class WebSocketTarget { let title = document.createElement("h4"); title.innerText = "Headers"; wrapper.appendChild(title); - for (let key in this.opts.Headers) { - let fi = this.opts.Headers[key]; + for (const [key, fi] of Object.entries(this.opts.Headers)) { fi.value = LoadWsTargetHeader(this.target, this.opts, key); GenerateFormInput(wrapper, fi); } @@ -91,8 +81,7 @@ export class WebSocketTarget { let title = document.createElement("legend"); title.innerText = "Parameters"; wrapper.appendChild(title); - for (let key in this.opts.Params) { - let fi = this.opts.Params[key]; + for (const [key, fi] of Object.entries(this.opts.Params)) { fi.value = LoadWsTargetParam(this.target, this.opts, key); GenerateFormInput(wrapper, fi); } @@ -114,19 +103,14 @@ export class WebSocketTarget { wrapper.appendChild(this.el_out_response); parent.appendChild(wrapper); } - onClickClearOutput() { - return __awaiter(this, void 0, void 0, function* () { - this.el_out_response.innerText = ""; - }); + async onClickClearOutput() { + this.el_out_response.innerText = ""; } - onClickRun() { - return __awaiter(this, void 0, void 0, function* () { - let res = yield this.trunks.RunWebSocket(this.target, this.opts); - if (!res) { - return; - } - this.el_out_response.innerText = JSON.stringify(res.data, null, 2); - }); + async onClickRun() { + let res = await this.trunks.RunWebSocket(this.target, this.opts); + if (!res) { + return; + } + this.el_out_response.innerText = JSON.stringify(res.data, null, 2); } } -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NfdGFyZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid3NfdGFyZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDREQUE0RDtBQUM1RCw0Q0FBNEM7Ozs7Ozs7Ozs7QUFHNUMsT0FBTyxFQUNOLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsaUJBQWlCLEdBQ2pCLE1BQU0sZ0JBQWdCLENBQUE7QUFTdkIsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFBO0FBQ25DLE1BQU0sdUJBQXVCLEdBQUcsbUJBQW1CLENBQUE7QUFDbkQsTUFBTSxxQkFBcUIsR0FBRyxpQkFBaUIsQ0FBQTtBQUMvQyxNQUFNLDRCQUE0QixHQUFHLHdCQUF3QixDQUFBO0FBQzdELE1BQU0sMkJBQTJCLEdBQUcsdUJBQXVCLENBQUE7QUFDM0QsTUFBTSx3QkFBd0IsR0FBRyxvQkFBb0IsQ0FBQTtBQUNyRCxNQUFNLHVCQUF1QixHQUFHLG1CQUFtQixDQUFBO0FBRW5ELE1BQU0sT0FBTyxlQUFlO0lBTTNCLFlBQ1EsTUFBdUIsRUFDdkIsTUFBdUIsRUFDdkIsSUFBOEI7UUFGOUIsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDdkIsU0FBSSxHQUFKLElBQUksQ0FBMEI7UUFSdEMsT0FBRSxHQUFnQixRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQy9DLGtCQUFhLEdBQXNCLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbkUscUJBQWdCLEdBQWdCLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDN0Qsb0JBQWUsR0FBZ0IsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQU8zRCxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFBO1FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcs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 \ No newline at end of file diff --git a/_www/ws_target.ts b/_www/ws_target.ts index 4a92e2e..928300b 100644 --- a/_www/ws_target.ts +++ b/_www/ws_target.ts @@ -1,177 +1,157 @@ // SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later -import { WuiInputString, WuiInputStringOpts } from "./wui/input/string.js" import { - GenerateFormInput, - LoadWsTargetHeader, - LoadWsTargetParam, -} from "./functions.js" + GenerateFormInput, + LoadWsTargetHeader, + LoadWsTargetParam, +} from "./functions.js"; import { - CLASS_INPUT, - CLASS_INPUT_LABEL, - TargetInterface, - TrunksInterface, - WebSocketTargetInterface, -} from "./interface.js" - -const CLASS_WS_TARGET = "ws_target" -const CLASS_WS_TARGET_ACTIONS = "ws_target_actions" -const CLASS_WS_TARGET_INPUT = "ws_target_input" -const CLASS_WS_TARGET_INPUT_HEADER = "ws_target_input_header" -const CLASS_WS_TARGET_INPUT_PARAM = "ws_target_input_param" -const CLASS_WS_TARGET_OUT_MONO = "ws_target_out_mono" -const CLASS_WS_TARGET_OUT_RUN = "ws_target_out_run" + TargetInterface, + TrunksInterface, + WebSocketTargetInterface, +} from "./interface.js"; + +const CLASS_WS_TARGET = "ws_target"; +const CLASS_WS_TARGET_ACTIONS = "ws_target_actions"; +const CLASS_WS_TARGET_INPUT = "ws_target_input"; +const CLASS_WS_TARGET_INPUT_HEADER = "ws_target_input_header"; +const CLASS_WS_TARGET_INPUT_PARAM = "ws_target_input_param"; +const CLASS_WS_TARGET_OUT_MONO = "ws_target_out_mono"; +const CLASS_WS_TARGET_OUT_RUN = "ws_target_out_run"; export class WebSocketTarget { - el: HTMLElement = document.createElement("div") - el_button_run: HTMLButtonElement = document.createElement("button") - el_request_input: HTMLElement = document.createElement("div") - el_out_response: HTMLElement = document.createElement("pre") - - constructor( - public trunks: TrunksInterface, - public target: TargetInterface, - public opts: WebSocketTargetInterface, - ) { - this.el.id = opts.ID - this.el.classList.add(CLASS_WS_TARGET) - - let el_title = document.createElement("h3") - el_title.innerText = opts.Name - this.el.appendChild(el_title) - - this.generateActions(el_title) - this.generateHint(this.el) - this.generateInput(this.el) - this.generateOutput(this.el) - } - - private generateActions(parent: HTMLElement) { - let el_actions = document.createElement("span") - el_actions.classList.add(CLASS_WS_TARGET_ACTIONS) - - this.el_button_run.innerText = "Run" - this.el_button_run.onclick = () => { - this.onClickRun() - } - el_actions.appendChild(this.el_button_run) - - parent.appendChild(el_actions) - } - - private generateHint(parent: HTMLElement) { - if (!this.opts.Hint) { - return - } - let el_hint = document.createElement("p") - el_hint.innerHTML = this.opts.Hint - parent.appendChild(el_hint) - } - - private generateInput(parent: HTMLElement) { - this.el_request_input.classList.add(CLASS_WS_TARGET_INPUT) - - this.generateRequestHeaders(this.el_request_input) - this.generateRequestParameters(this.el_request_input) - - parent.appendChild(this.el_request_input) - } - - private generateRequestHeaders(parent: HTMLElement) { - if (!this.opts.Headers) { - return - } - if (Object.keys(this.opts.Headers).length === 0) { - return - } - - let wrapper = document.createElement("div") - wrapper.classList.add(CLASS_WS_TARGET_INPUT_HEADER) - - let title = document.createElement("h4") - title.innerText = "Headers" - wrapper.appendChild(title) - - for (let key in this.opts.Headers) { - let fi = this.opts.Headers[key] - fi.value = LoadWsTargetHeader( - this.target, - this.opts, - key, - ) - GenerateFormInput(wrapper, fi) - } - - parent.appendChild(wrapper) - } - - private generateRequestParameters(parent: HTMLElement) { - if (!this.opts.Params) { - return - } - if (Object.keys(this.opts.Params).length === 0) { - return - } - - let wrapper = document.createElement("fieldset") - wrapper.classList.add(CLASS_WS_TARGET_INPUT_PARAM) - - let title = document.createElement("legend") - title.innerText = "Parameters" - wrapper.appendChild(title) - - for (let key in this.opts.Params) { - let fi = this.opts.Params[key] - fi.value = LoadWsTargetParam( - this.target, - this.opts, - key, - ) - GenerateFormInput(wrapper, fi) - } - - parent.appendChild(wrapper) - } - - private generateOutput(parent: HTMLElement) { - let wrapper = document.createElement("fieldset") - wrapper.classList.add(CLASS_WS_TARGET_OUT_RUN) - - let title = document.createElement("legend") - title.innerText = "Run output" - - let btn_clear = document.createElement("button") - btn_clear.innerText = "Clear" - btn_clear.onclick = () => { - this.onClickClearOutput() - } - title.appendChild(btn_clear) - - this.el_out_response.classList.add(CLASS_WS_TARGET_OUT_MONO) - - wrapper.appendChild(title) - wrapper.appendChild(this.el_out_response) - - parent.appendChild(wrapper) - } - - private async onClickClearOutput() { - this.el_out_response.innerText = "" - } - - private async onClickRun() { - let res = await this.trunks.RunWebSocket( - this.target, - this.opts, - ) - if (!res) { - return - } - this.el_out_response.innerText = JSON.stringify( - res.data, - null, - 2, - ) - } + el: HTMLElement = document.createElement("div"); + el_button_run: HTMLButtonElement = document.createElement("button"); + el_request_input: HTMLElement = document.createElement("div"); + el_out_response: HTMLElement = document.createElement("pre"); + + constructor( + public trunks: TrunksInterface, + public target: TargetInterface, + public opts: WebSocketTargetInterface, + ) { + this.el.id = opts.ID; + this.el.classList.add(CLASS_WS_TARGET); + + let el_title = document.createElement("h3"); + el_title.innerText = opts.Name; + this.el.appendChild(el_title); + + this.generateActions(el_title); + this.generateHint(this.el); + this.generateInput(this.el); + this.generateOutput(this.el); + } + + private generateActions(parent: HTMLElement) { + let el_actions = document.createElement("span"); + el_actions.classList.add(CLASS_WS_TARGET_ACTIONS); + + this.el_button_run.innerText = "Run"; + this.el_button_run.onclick = () => { + this.onClickRun(); + }; + el_actions.appendChild(this.el_button_run); + + parent.appendChild(el_actions); + } + + private generateHint(parent: HTMLElement) { + if (!this.opts.Hint) { + return; + } + let el_hint = document.createElement("p"); + el_hint.innerHTML = this.opts.Hint; + parent.appendChild(el_hint); + } + + private generateInput(parent: HTMLElement) { + this.el_request_input.classList.add(CLASS_WS_TARGET_INPUT); + + this.generateRequestHeaders(this.el_request_input); + this.generateRequestParameters(this.el_request_input); + + parent.appendChild(this.el_request_input); + } + + private generateRequestHeaders(parent: HTMLElement) { + if (!this.opts.Headers) { + return; + } + if (Object.keys(this.opts.Headers).length === 0) { + return; + } + + let wrapper = document.createElement("div"); + wrapper.classList.add(CLASS_WS_TARGET_INPUT_HEADER); + + let title = document.createElement("h4"); + title.innerText = "Headers"; + wrapper.appendChild(title); + + for (const [key, fi] of Object.entries(this.opts.Headers)) { + fi.value = LoadWsTargetHeader(this.target, this.opts, key); + GenerateFormInput(wrapper, fi); + } + + parent.appendChild(wrapper); + } + + private generateRequestParameters(parent: HTMLElement) { + if (!this.opts.Params) { + return; + } + if (Object.keys(this.opts.Params).length === 0) { + return; + } + + let wrapper = document.createElement("fieldset"); + wrapper.classList.add(CLASS_WS_TARGET_INPUT_PARAM); + + let title = document.createElement("legend"); + title.innerText = "Parameters"; + wrapper.appendChild(title); + + for (const [key, fi] of Object.entries(this.opts.Params)) { + fi.value = LoadWsTargetParam(this.target, this.opts, key); + GenerateFormInput(wrapper, fi); + } + + parent.appendChild(wrapper); + } + + private generateOutput(parent: HTMLElement) { + let wrapper = document.createElement("fieldset"); + wrapper.classList.add(CLASS_WS_TARGET_OUT_RUN); + + let title = document.createElement("legend"); + title.innerText = "Run output"; + + let btn_clear = document.createElement("button"); + btn_clear.innerText = "Clear"; + btn_clear.onclick = () => { + this.onClickClearOutput(); + }; + title.appendChild(btn_clear); + + this.el_out_response.classList.add(CLASS_WS_TARGET_OUT_MONO); + + wrapper.appendChild(title); + wrapper.appendChild(this.el_out_response); + + parent.appendChild(wrapper); + } + + private async onClickClearOutput() { + this.el_out_response.innerText = ""; + } + + private async onClickRun() { + let res = await this.trunks.RunWebSocket(this.target, this.opts); + if (!res) { + return; + } + this.el_out_response.innerText = JSON.stringify(res.data, null, 2); + } } diff --git a/_www/wui b/_www/wui index a798d32..65eb8e9 160000 --- a/_www/wui +++ b/_www/wui @@ -1 +1 @@ -Subproject commit a798d320563a1f9061a572e2b00537b38e34c4f0 +Subproject commit 65eb8e99d6dfdfdf419254cbb7e26b7afe426691 diff --git a/memfs_www_embed.go b/memfs_www_embed.go index 8e61274..afa91fe 100644 --- a/memfs_www_embed.go +++ b/memfs_www_embed.go @@ -16,7 +16,7 @@ func generate__www() *memfs.Node { GenFuncName: "generate__www", } node.SetMode(2147484141) - node.SetModTimeUnix(1684221952, 861122284) + node.SetModTimeUnix(1699636914, 529207340) node.SetName("/") node.SetSize(0) node.AddChild(_memfsWWW_getNode(memfsWWW, "/doc", generate__www_doc)) @@ -61,12 +61,12 @@ func generate__www_doc_CHANGELOG_html() *memfs.Node { Path: "/doc/CHANGELOG.html", ContentType: "text/html; charset=utf-8", GenFuncName: "generate__www_doc_CHANGELOG_html", - Content: []byte("\x3C\x21\x44\x4F\x43\x54\x59\x50\x45\x20\x68\x74\x6D\x6C\x3E\x0A\x3C\x68\x74\x6D\x6C\x3E\x0A\x09\x3C\x68\x65\x61\x64\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x68\x74\x74\x70\x2D\x65\x71\x75\x69\x76\x3D\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x3B\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x75\x74\x66\x2D\x38\x22\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x76\x69\x65\x77\x70\x6F\x72\x74\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x77\x69\x64\x74\x68\x3D\x64\x65\x76\x69\x63\x65\x2D\x77\x69\x64\x74\x68\x2C\x20\x69\x6E\x69\x74\x69\x61\x6C\x2D\x73\x63\x61\x6C\x65\x3D\x31\x22\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x74\x68\x65\x6D\x65\x2D\x63\x6F\x6C\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x23\x33\x37\x35\x45\x41\x42\x22\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x61\x75\x74\x68\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x53\x68\x75\x6C\x68\x61\x6E\x22\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x67\x65\x6E\x65\x72\x61\x74\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x61\x73\x63\x69\x69\x64\x6F\x63\x74\x6F\x72\x2D\x67\x6F\x20\x30\x2E\x34\x2E\x31\x22\x3E\x0A\x09\x09\x3C\x74\x69\x74\x6C\x65\x3E\x74\x72\x75\x6E\x6B\x73\x20\x43\x48\x41\x4E\x47\x45\x4C\x4F\x47\x3C\x2F\x74\x69\x74\x6C\x65\x3E\x0A\x09\x09\x3C\x73\x74\x79\x6C\x65\x3E\x0A\x09\x09\x0A\x62\x6F\x64\x79\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x41\x72\x69\x61\x6C\x2C\x20\x73\x61\x6E\x73\x2D\x73\x65\x72\x69\x66\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x66\x66\x66\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x33\x3B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x63\x65\x6E\x74\x65\x72\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x32\x32\x32\x3B\x0A\x7D\x0A\x70\x72\x65\x2C\x0A\x63\x6F\x64\x65\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x4D\x65\x6E\x6C\x6F\x2C\x20\x6D\x6F\x6E\x6F\x73\x70\x61\x63\x65\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x30\x2E\x38\x37\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x70\x72\x65\x20\x7B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x34\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x2D\x78\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x65\x66\x65\x66\x65\x66\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x2E\x36\x32\x35\x72\x65\x6D\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x72\x61\x64\x69\x75\x73\x3A\x20\x30\x2E\x33\x31\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x61\x20\x7B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x61\x3A\x68\x6F\x76\x65\x72\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x20\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65\x3B\x0A\x7D\x0A\x0A\x70\x2C\x0A\x6C\x69\x20\x7B\x0A\x09\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x35\x30\x72\x65\x6D\x3B\x0A\x09\x77\x6F\x72\x64\x2D\x77\x72\x61\x70\x3A\x20\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64\x3B\x0A\x7D\x0A\x6C\x69\x20\x70\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x32\x70\x78\x3B\x0A\x7D\x0A\x70\x2C\x0A\x70\x72\x65\x2C\x0A\x75\x6C\x2C\x0A\x6F\x6C\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x68\x31\x2C\x0A\x68\x32\x2C\x0A\x68\x33\x2C\x0A\x68\x34\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x20\x30\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x7D\x0A\x68\x31\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x37\x35\x72\x65\x6D\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x3B\x0A\x7D\x0A\x68\x31\x20\x2E\x74\x65\x78\x74\x2D\x6D\x75\x74\x65\x64\x20\x7B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x37\x37\x37\x3B\x0A\x7D\x0A\x68\x32\x20\x7B\x0A\x09\x63\x6C\x65\x61\x72\x3A\x20\x72\x69\x67\x68\x74\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x65\x30\x65\x62\x66\x35\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x2E\x35\x72\x65\x6D\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x32\x35\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x6E\x6F\x72\x6D\x61\x6C\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x2D\x77\x72\x61\x70\x3A\x20\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64\x3B\x0A\x7D\x0A\x68\x32\x20\x61\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x7D\x0A\x68\x33\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x32\x35\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x2D\x77\x72\x61\x70\x3A\x20\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64\x3B\x0A\x7D\x0A\x68\x33\x2C\x0A\x68\x34\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x20\x30\x2E\x33\x31\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x68\x34\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x68\x32\x20\x3E\x20\x73\x70\x61\x6E\x2C\x0A\x68\x33\x20\x3E\x20\x73\x70\x61\x6E\x20\x7B\x0A\x09\x66\x6C\x6F\x61\x74\x3A\x20\x72\x69\x67\x68\x74\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x20\x32\x35\x70\x78\x20\x30\x20\x30\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x6E\x6F\x72\x6D\x61\x6C\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x35\x32\x37\x39\x63\x37\x3B\x0A\x7D\x0A\x0A\x64\x6C\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x64\x74\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x0A\x7D\x0A\x64\x64\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x20\x30\x20\x30\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2F\x2A\x2A\x0A\x20\x2A\x20\x43\x75\x73\x74\x6F\x6D\x20\x63\x6C\x61\x73\x73\x65\x73\x20\x66\x6F\x72\x20\x70\x61\x67\x65\x73\x0A\x20\x2A\x2F\x0A\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x7B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x63\x6F\x6C\x6C\x61\x70\x73\x65\x3A\x20\x73\x65\x70\x61\x72\x61\x74\x65\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x3A\x20\x30\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x30\x30\x25\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x63\x65\x6E\x74\x65\x72\x3B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x32\x30\x70\x78\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x69\x6D\x67\x20\x7B\x0A\x09\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x2E\x74\x69\x74\x6C\x65\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x22\x4F\x70\x65\x6E\x20\x53\x61\x6E\x73\x22\x2C\x22\x44\x65\x6A\x61\x56\x75\x20\x53\x61\x6E\x73\x22\x2C\x73\x61\x6E\x73\x2D\x73\x65\x72\x69\x66\x3B\x0A\x09\x74\x65\x78\x74\x2D\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D\x3A\x20\x75\x70\x70\x65\x72\x63\x61\x73\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x63\x6F\x6E\x74\x65\x6E\x74\x20\x7B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x2D\x6C\x65\x66\x74\x3A\x20\x31\x2E\x31\x32\x35\x65\x6D\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x2D\x72\x69\x67\x68\x74\x3A\x20\x31\x2E\x32\x35\x65\x6D\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x6C\x65\x66\x74\x3A\x20\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x23\x64\x64\x64\x64\x64\x66\x3B\x0A\x09\x77\x6F\x72\x64\x2D\x77\x72\x61\x70\x3A\x20\x61\x6E\x79\x77\x68\x65\x72\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x63\x6F\x6E\x74\x65\x6E\x74\x3E\x3A\x6C\x61\x73\x74\x2D\x63\x68\x69\x6C\x64\x3E\x3A\x6C\x61\x73\x74\x2D\x63\x68\x69\x6C\x64\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x30\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x6E\x6F\x74\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x77\x68\x69\x74\x65\x73\x6D\x6F\x6B\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x74\x69\x70\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x61\x7A\x75\x72\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x69\x6D\x70\x6F\x72\x74\x61\x6E\x74\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x68\x6F\x6E\x65\x79\x64\x65\x77\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x63\x61\x75\x74\x69\x6F\x6E\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x6C\x61\x76\x65\x6E\x64\x65\x72\x62\x75\x73\x68\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x77\x61\x72\x6E\x69\x6E\x67\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x6D\x69\x73\x74\x79\x72\x6F\x73\x65\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x65\x30\x65\x62\x66\x35\x3B\x0A\x09\x68\x65\x69\x67\x68\x74\x3A\x20\x34\x72\x65\x6D\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x68\x69\x64\x64\x65\x6E\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x2C\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x7B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x31\x2E\x33\x31\x33\x72\x65\x6D\x20\x30\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x6E\x6F\x72\x6D\x61\x6C\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x20\x7B\x0A\x09\x66\x6C\x6F\x61\x74\x3A\x20\x6C\x65\x66\x74\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x20\x61\x20\x7B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x32\x32\x32\x3B\x0A\x09\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x20\x2E\x68\x65\x61\x64\x65\x72\x2D\x6C\x6F\x67\x6F\x20\x7B\x0A\x09\x68\x65\x69\x67\x68\x74\x3A\x20\x32\x72\x65\x6D\x3B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x35\x2E\x31\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x7B\x0A\x09\x66\x6C\x6F\x61\x74\x3A\x20\x72\x69\x67\x68\x74\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x61\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x2E\x36\x32\x35\x72\x65\x6D\x20\x30\x2E\x31\x32\x35\x72\x65\x6D\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x2E\x36\x32\x35\x72\x65\x6D\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x77\x68\x69\x74\x65\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x3A\x20\x30\x2E\x30\x36\x32\x35\x72\x65\x6D\x20\x73\x6F\x6C\x69\x64\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x72\x61\x64\x69\x75\x73\x3A\x20\x35\x70\x78\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x66\x6F\x72\x6D\x20\x7B\x0A\x09\x64\x69\x73\x70\x6C\x61\x79\x3A\x20\x69\x6E\x6C\x69\x6E\x65\x2D\x62\x6C\x6F\x63\x6B\x3B\x0A\x7D\x0A\x0A\x2E\x70\x61\x67\x65\x20\x7B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x30\x30\x25\x3B\x0A\x7D\x0A\x0A\x2E\x70\x61\x67\x65\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x2C\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x2C\x0A\x2E\x66\x6F\x6F\x74\x65\x72\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x6C\x65\x66\x74\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x72\x69\x67\x68\x74\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x35\x39\x2E\x33\x38\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x70\x61\x67\x65\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x6C\x65\x66\x74\x3B\x0A\x7D\x0A\x0A\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x2E\x6D\x65\x74\x61\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x74\x79\x6C\x65\x3A\x20\x69\x74\x61\x6C\x69\x63\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x66\x6F\x6F\x74\x65\x72\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x63\x65\x6E\x74\x65\x72\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x36\x36\x36\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x30\x2E\x38\x37\x35\x72\x65\x6D\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x32\x2E\x35\x72\x65\x6D\x20\x30\x3B\x0A\x7D\x0A\x0A\x2E\x75\x6C\x69\x73\x74\x20\x6C\x69\x20\x2E\x70\x61\x72\x61\x67\x72\x61\x70\x68\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x31\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x75\x6C\x69\x73\x74\x20\x6C\x69\x20\x2E\x70\x61\x72\x61\x67\x72\x61\x70\x68\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x31\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2F\x2A\x2A\x20\x43\x75\x73\x74\x6F\x6D\x20\x63\x6C\x61\x73\x73\x65\x73\x20\x2A\x2F\x0A\x23\x74\x6F\x63\x74\x69\x74\x6C\x65\x20\x7B\x0A\x09\x64\x69\x73\x70\x6C\x61\x79\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x23\x74\x6F\x63\x20\x6C\x69\x20\x7B\x0A\x09\x6C\x69\x73\x74\x2D\x73\x74\x79\x6C\x65\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x23\x74\x6F\x63\x20\x75\x6C\x20\x2E\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x31\x20\x7B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x70\x78\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x34\x70\x78\x3B\x0A\x7D\x0A\x23\x74\x6F\x63\x20\x75\x6C\x20\x2E\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x32\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x34\x70\x78\x3B\x0A\x7D\x0A\x0A\x40\x6D\x65\x64\x69\x61\x20\x73\x63\x72\x65\x65\x6E\x20\x61\x6E\x64\x20\x28\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x39\x39\x32\x70\x78\x29\x20\x7B\x0A\x09\x23\x74\x6F\x63\x20\x7B\x0A\x09\x09\x61\x6C\x6C\x3A\x20\x75\x6E\x73\x65\x74\x3B\x0A\x09\x7D\x0A\x7D\x0A\x0A\x09\x09\x3C\x2F\x73\x74\x79\x6C\x65\x3E\x0A\x09\x3C\x2F\x68\x65\x61\x64\x3E\x0A\x09\x3C\x62\x6F\x64\x79\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x22\x3E\x0A\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x22\x3E\x0A\x09\x09\x09\x09\x09\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x43\x48\x41\x4E\x47\x45\x4C\x4F\x47\x3C\x2F\x61\x3E\x0A\x09\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6D\x65\x6E\x75\x22\x3E\x0A\x09\x09\x09\x09\x09\x3C\x66\x6F\x72\x6D\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x74\x65\x6D\x22\x20\x61\x63\x74\x69\x6F\x6E\x3D\x22\x2F\x5F\x69\x6E\x74\x65\x72\x6E\x61\x6C\x2F\x73\x65\x61\x72\x63\x68\x22\x3E\x0A\x09\x09\x09\x09\x09\x09\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x20\x6E\x61\x6D\x65\x3D\x22\x71\x22\x20\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72\x3D\x22\x53\x65\x61\x72\x63\x68\x22\x20\x2F\x3E\x0A\x09\x09\x09\x09\x09\x3C\x2F\x66\x6F\x72\x6D\x3E\x0A\x09\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x67\x65\x22\x3E\x0A\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x68\x65\x61\x64\x65\x72\x22\x3E\x0A\x3C\x68\x31\x3E\x74\x72\x75\x6E\x6B\x73\x20\x43\x48\x41\x4E\x47\x45\x4C\x4F\x47\x3C\x2F\x68\x31\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x65\x74\x61\x69\x6C\x73\x22\x3E\x0A\x3C\x73\x70\x61\x6E\x20\x69\x64\x3D\x22\x61\x75\x74\x68\x6F\x72\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x75\x74\x68\x6F\x72\x22\x3E\x53\x68\x75\x6C\x68\x61\x6E\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x3E\x0A\x3C\x73\x70\x61\x6E\x20\x69\x64\x3D\x22\x65\x6D\x61\x69\x6C\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x65\x6D\x61\x69\x6C\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x6D\x61\x69\x6C\x74\x6F\x3A\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x22\x3E\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x3C\x2F\x61\x3E\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x74\x6F\x63\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x63\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x74\x6F\x63\x74\x69\x74\x6C\x65\x22\x3E\x54\x61\x62\x6C\x65\x20\x6F\x66\x20\x43\x6F\x6E\x74\x65\x6E\x74\x73\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x75\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x31\x22\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x74\x72\x75\x6E\x6B\x73\x5F\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x5F\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x34\x2E\x30\x20\x28\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x29\x3C\x2F\x61\x3E\x0A\x3C\x75\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x32\x22\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x62\x75\x67\x5F\x66\x69\x78\x65\x73\x22\x3E\x42\x75\x67\x20\x66\x69\x78\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x65\x6E\x68\x61\x6E\x63\x65\x6D\x65\x6E\x74\x73\x22\x3E\x45\x6E\x68\x61\x6E\x63\x65\x6D\x65\x6E\x74\x73\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x43\x68\x6F\x72\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x33\x5F\x30\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x33\x2E\x30\x20\x28\x32\x30\x32\x32\x2D\x30\x38\x2D\x32\x35\x29\x3C\x2F\x61\x3E\x0A\x3C\x75\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x32\x22\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x33\x5F\x30\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x43\x68\x6F\x72\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x32\x5F\x30\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x32\x2E\x30\x20\x28\x32\x30\x32\x32\x2D\x30\x33\x2D\x31\x33\x29\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x31\x5F\x30\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x31\x2E\x30\x20\x28\x32\x30\x32\x32\x2D\x30\x32\x2D\x30\x35\x29\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x70\x72\x65\x61\x6D\x62\x6C\x65\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x74\x72\x75\x6E\x6B\x73\x5F\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x5F\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x74\x72\x75\x6E\x6B\x73\x5F\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x5F\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x74\x72\x75\x6E\x6B\x73\x5F\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x5F\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x34\x2E\x30\x20\x28\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x29\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x32\x22\x3E\x0A\x3C\x68\x33\x20\x69\x64\x3D\x22\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x62\x75\x67\x5F\x66\x69\x78\x65\x73\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x62\x75\x67\x5F\x66\x69\x78\x65\x73\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x62\x75\x67\x5F\x66\x69\x78\x65\x73\x22\x3E\x42\x75\x67\x20\x66\x69\x78\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x64\x6C\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x66\x69\x78\x20\x70\x61\x6E\x69\x63\x20\x77\x68\x65\x6E\x20\x61\x74\x74\x61\x63\x6B\x69\x6E\x67\x20\x48\x54\x54\x50\x20\x64\x75\x65\x20\x74\x6F\x20\x6E\x69\x6C\x20\x41\x74\x74\x61\x63\x6B\x20\x68\x61\x6E\x64\x6C\x65\x72\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x49\x6E\x20\x61\x74\x74\x61\x63\x6B\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x2C\x20\x63\x68\x65\x63\x6B\x20\x69\x66\x20\x74\x68\x65\x20\x41\x74\x74\x61\x63\x6B\x20\x69\x73\x20\x6E\x69\x6C\x20\x62\x65\x66\x6F\x72\x65\x20\x77\x65\x20\x70\x75\x73\x68\x20\x74\x68\x65\x20\x72\x65\x71\x75\x65\x73\x74\x0A\x74\x6F\x20\x61\x74\x74\x61\x63\x6B\x20\x71\x75\x65\x75\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x2F\x64\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x32\x22\x3E\x0A\x3C\x68\x33\x20\x69\x64\x3D\x22\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x65\x6E\x68\x61\x6E\x63\x65\x6D\x65\x6E\x74\x73\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x65\x6E\x68\x61\x6E\x63\x65\x6D\x65\x6E\x74\x73\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x65\x6E\x68\x61\x6E\x63\x65\x6D\x65\x6E\x74\x73\x22\x3E\x45\x6E\x68\x61\x6E\x63\x65\x6D\x65\x6E\x74\x73\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x64\x6C\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x5F\x77\x77\x77\x3A\x20\x72\x65\x70\x6C\x61\x63\x65\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x68\x61\x6E\x64\x6C\x65\x72\x73\x20\x77\x69\x74\x68\x20\x48\x54\x54\x50\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x41\x74\x74\x61\x63\x6B\x20\x61\x6E\x64\x20\x61\x74\x74\x61\x63\x6B\x20\x43\x61\x6E\x63\x65\x6C\x20\x6E\x6F\x77\x20\x63\x61\x6C\x6C\x20\x74\x68\x65\x20\x48\x54\x54\x50\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x61\x64\x64\x20\x62\x6F\x6F\x6C\x65\x61\x6E\x20\x4B\x69\x6E\x64\x20\x66\x6F\x72\x20\x46\x6F\x72\x6D\x49\x6E\x70\x75\x74\x2C\x20\x46\x6F\x72\x6D\x49\x6E\x70\x75\x74\x4B\x69\x6E\x64\x42\x6F\x6F\x6C\x65\x61\x6E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6F\x70\x65\x6E\x62\x6C\x6F\x63\x6B\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x46\x6F\x72\x6D\x49\x6E\x70\x75\x74\x4B\x69\x6E\x64\x42\x6F\x6F\x6C\x65\x61\x6E\x20\x6F\x6E\x6C\x79\x20\x75\x73\x65\x64\x20\x66\x6F\x72\x20\x63\x6F\x6E\x76\x65\x72\x74\x69\x6F\x6E\x2C\x20\x66\x6F\x72\x20\x65\x78\x61\x6D\x70\x6C\x65\x0A\x54\x6F\x4A\x73\x6F\x6E\x4F\x62\x6A\x65\x63\x74\x2E\x0A\x49\x6E\x20\x74\x68\x65\x20\x57\x55\x49\x2C\x20\x69\x74\x20\x73\x74\x69\x6C\x6C\x20\x72\x65\x6E\x64\x65\x72\x65\x64\x20\x61\x73\x20\x73\x74\x72\x69\x6E\x67\x2C\x20\x6E\x6F\x74\x20\x61\x73\x20\x63\x68\x65\x63\x6B\x62\x6F\x78\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x46\x6F\x72\x6D\x49\x6E\x70\x75\x74\x20\x77\x69\x74\x68\x20\x74\x68\x69\x73\x20\x4B\x69\x6E\x64\x20\x77\x69\x6C\x6C\x20\x62\x65\x20\x63\x6F\x6E\x76\x65\x72\x74\x65\x64\x20\x74\x6F\x20\x74\x72\x75\x65\x20\x69\x6E\x20\x54\x6F\x4A\x73\x6F\x6E\x4F\x62\x6A\x65\x63\x74\x20\x69\x66\x0A\x74\x68\x65\x20\x56\x61\x6C\x75\x65\x20\x69\x73\x20\x65\x69\x74\x68\x65\x72\x20\x22\x74\x72\x75\x65\x22\x2C\x20\x22\x79\x65\x73\x22\x2C\x20\x6F\x72\x20\x22\x31\x22\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x63\x68\x65\x63\x6B\x20\x61\x6E\x64\x20\x63\x61\x6C\x6C\x20\x43\x6F\x6E\x76\x65\x72\x74\x50\x61\x72\x61\x6D\x73\x20\x77\x68\x65\x6E\x20\x72\x75\x6E\x6E\x69\x6E\x67\x20\x48\x74\x74\x70\x54\x61\x72\x67\x65\x74\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x49\x66\x20\x74\x68\x65\x20\x43\x6F\x6E\x76\x65\x72\x74\x50\x61\x72\x61\x6D\x73\x20\x66\x69\x65\x6C\x64\x20\x69\x73\x20\x73\x65\x74\x2C\x20\x75\x73\x65\x20\x69\x74\x20\x74\x6F\x20\x63\x6F\x6E\x76\x65\x72\x74\x20\x74\x68\x65\x20\x70\x61\x72\x61\x6D\x65\x74\x65\x72\x73\x20\x69\x6E\x74\x6F\x0A\x64\x65\x73\x69\x72\x65\x64\x20\x74\x79\x70\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x2F\x64\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x32\x22\x3E\x0A\x3C\x68\x33\x20\x69\x64\x3D\x22\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x43\x68\x6F\x72\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x64\x6C\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x6D\x6F\x76\x65\x20\x74\x68\x65\x20\x5F\x64\x6F\x63\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79\x20\x75\x6E\x64\x65\x72\x20\x5F\x77\x77\x77\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x63\x6F\x6E\x76\x65\x72\x74\x20\x74\x68\x65\x20\x52\x45\x41\x44\x4D\x45\x20\x66\x72\x6F\x6D\x20\x61\x73\x63\x69\x69\x64\x6F\x63\x20\x74\x6F\x20\x6D\x61\x72\x6B\x64\x6F\x77\x6E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x72\x65\x6D\x6F\x76\x65\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x73\x65\x72\x76\x65\x72\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x55\x73\x69\x6E\x67\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x66\x6F\x72\x20\x63\x6F\x6D\x6D\x75\x6E\x69\x63\x61\x74\x69\x6F\x6E\x20\x69\x6E\x20\x63\x6C\x69\x65\x6E\x74\x20\x72\x65\x71\x75\x69\x72\x65\x20\x61\x64\x64\x69\x74\x69\x6F\x6E\x61\x6C\x0A\x73\x65\x74\x75\x70\x2C\x20\x65\x73\x70\x65\x63\x69\x61\x6C\x6C\x79\x20\x69\x66\x20\x69\x74\x73\x20\x62\x65\x68\x69\x6E\x64\x20\x70\x72\x6F\x78\x79\x2E\x0A\x46\x6F\x72\x20\x65\x78\x61\x6D\x70\x6C\x65\x2C\x20\x69\x66\x20\x77\x65\x20\x73\x65\x72\x76\x65\x20\x74\x68\x65\x20\x74\x72\x75\x6E\x6B\x73\x20\x73\x65\x72\x76\x65\x72\x20\x75\x6E\x64\x65\x72\x20\x64\x6F\x6D\x61\x69\x6E\x20\x74\x65\x73\x74\x69\x6E\x67\x2E\x6C\x6F\x63\x61\x6C\x0A\x62\x65\x68\x69\x6E\x64\x20\x70\x72\x6F\x78\x79\x2C\x20\x77\x65\x20\x6E\x65\x65\x64\x20\x74\x6F\x20\x73\x65\x74\x75\x70\x20\x72\x6F\x75\x74\x65\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x74\x6F\x6F\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x67\x6F\x2E\x6D\x6F\x64\x3A\x20\x73\x65\x74\x20\x47\x6F\x20\x76\x65\x72\x73\x69\x6F\x6E\x20\x74\x6F\x20\x31\x2E\x31\x39\x20\x61\x6E\x64\x20\x75\x70\x64\x61\x74\x65\x20\x61\x6C\x6C\x20\x64\x65\x70\x65\x6E\x64\x65\x6E\x63\x69\x65\x73\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x2F\x64\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x76\x30\x5F\x33\x5F\x30\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x33\x5F\x30\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x33\x5F\x30\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x33\x2E\x30\x20\x28\x32\x30\x32\x32\x2D\x30\x38\x2D\x32\x35\x29\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x54\x68\x69\x73\x20\x72\x65\x6C\x65\x61\x73\x65\x20\x73\x65\x74\x20\x74\x68\x65\x20\x6D\x69\x6E\x69\x6D\x75\x6D\x20\x47\x6F\x20\x76\x65\x72\x73\x69\x6F\x6E\x20\x74\x6F\x20\x31\x2E\x31\x38\x20\x61\x6E\x64\x20\x75\x70\x64\x61\x74\x65\x20\x61\x6C\x6C\x20\x6D\x6F\x64\x75\x6C\x65\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x32\x22\x3E\x0A\x3C\x68\x33\x20\x69\x64\x3D\x22\x76\x30\x5F\x33\x5F\x30\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x33\x5F\x30\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x33\x5F\x30\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x43\x68\x6F\x72\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x64\x6C\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x67\x72\x6F\x75\x70\x20\x61\x6C\x6C\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x73\x20\x75\x6E\x64\x65\x72\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79\x20\x5F\x64\x6F\x63\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x5F\x64\x6F\x63\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79\x20\x70\x72\x6F\x76\x69\x64\x65\x73\x20\x61\x6E\x20\x65\x6E\x74\x72\x79\x20\x70\x6F\x69\x6E\x74\x20\x66\x6F\x72\x20\x61\x6C\x6C\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x2E\x0A\x57\x68\x69\x6C\x65\x20\x61\x74\x20\x69\x74\x20\x77\x65\x20\x72\x65\x66\x6F\x72\x6D\x61\x74\x20\x74\x68\x65\x20\x52\x45\x41\x44\x4D\x45\x20\x74\x6F\x20\x75\x73\x65\x20\x41\x73\x63\x69\x69\x44\x6F\x63\x20\x6D\x61\x72\x6B\x75\x70\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x65\x78\x61\x6D\x70\x6C\x65\x3A\x20\x66\x69\x78\x20\x74\x68\x65\x20\x48\x54\x54\x50\x20\x50\x4F\x53\x54\x20\x68\x61\x6E\x64\x6C\x65\x72\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x52\x65\x6D\x6F\x76\x65\x20\x63\x61\x6C\x6C\x20\x74\x6F\x20\x50\x61\x72\x73\x65\x4D\x75\x6C\x74\x69\x70\x61\x72\x74\x66\x6F\x72\x6D\x20\x73\x69\x6E\x63\x65\x20\x74\x68\x65\x20\x72\x65\x71\x75\x65\x73\x74\x20\x74\x79\x70\x65\x20\x69\x73\x0A\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64\x20\x6E\x6F\x74\x20\x6D\x75\x6C\x74\x69\x70\x61\x72\x74\x2F\x66\x6F\x72\x6D\x2D\x64\x61\x74\x61\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x72\x65\x6D\x6F\x76\x65\x20\x75\x6E\x75\x73\x65\x64\x20\x66\x69\x65\x6C\x64\x20\x4C\x6F\x63\x6B\x65\x72\x20\x69\x6E\x20\x52\x75\x6E\x52\x65\x71\x75\x65\x73\x74\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x66\x69\x78\x20\x61\x6C\x6C\x20\x6C\x69\x6E\x74\x65\x72\x20\x77\x61\x72\x6E\x69\x6E\x67\x73\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x53\x6F\x6D\x65\x20\x6C\x69\x6E\x74\x65\x72\x2C\x20\x67\x6F\x76\x65\x74\x2C\x20\x77\x61\x72\x6E\x73\x20\x61\x62\x6F\x75\x74\x20\x70\x6F\x73\x73\x69\x62\x6C\x65\x20\x63\x6F\x70\x69\x65\x64\x20\x4D\x75\x74\x65\x78\x20\x6F\x6E\x20\x48\x74\x74\x70\x52\x65\x71\x75\x65\x73\x74\x2E\x0A\x54\x6F\x20\x66\x69\x78\x20\x74\x68\x69\x73\x20\x77\x65\x20\x69\x6D\x70\x6C\x65\x6D\x65\x6E\x74\x20\x6D\x65\x74\x68\x6F\x64\x20\x63\x6C\x6F\x6E\x65\x20\x61\x6E\x64\x20\x53\x74\x72\x69\x6E\x67\x65\x72\x20\x6F\x6E\x20\x48\x74\x74\x70\x52\x65\x71\x75\x65\x73\x74\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x2F\x64\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x76\x30\x5F\x32\x5F\x30\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x32\x5F\x30\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x32\x5F\x30\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x32\x2E\x30\x20\x28\x32\x30\x32\x32\x2D\x30\x33\x2D\x31\x33\x29\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x52\x65\x6C\x65\x61\x73\x65\x20\x74\x72\x75\x6E\x6B\x73\x20\x75\x6E\x64\x65\x72\x20\x47\x50\x4C\x20\x33\x2E\x30\x20\x6F\x72\x20\x6C\x61\x74\x65\x72\x20\x6C\x69\x63\x65\x6E\x73\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x53\x65\x65\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x2F\x6A\x6F\x75\x72\x6E\x61\x6C\x2F\x32\x30\x32\x32\x2F\x67\x70\x6C\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x62\x61\x72\x65\x22\x3E\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x2F\x6A\x6F\x75\x72\x6E\x61\x6C\x2F\x32\x30\x32\x32\x2F\x67\x70\x6C\x3C\x2F\x61\x3E\x20\x66\x6F\x72\x20\x6D\x6F\x72\x65\x20\x69\x6E\x66\x6F\x72\x6D\x61\x74\x69\x6F\x6E\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x76\x30\x5F\x31\x5F\x30\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x31\x5F\x30\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x31\x5F\x30\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x31\x2E\x30\x20\x28\x32\x30\x32\x32\x2D\x30\x32\x2D\x30\x35\x29\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x4D\x6F\x64\x75\x6C\x65\x20\x74\x72\x75\x6E\x6B\x73\x20\x69\x73\x20\x61\x20\x6C\x69\x62\x72\x61\x72\x79\x20\x61\x6E\x64\x20\x48\x54\x54\x50\x20\x73\x65\x72\x76\x69\x63\x65\x20\x74\x68\x61\x74\x20\x70\x72\x6F\x76\x69\x64\x65\x20\x77\x65\x62\x20\x75\x73\x65\x72\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x0A\x74\x6F\x20\x74\x65\x73\x74\x20\x48\x54\x54\x50\x20\x73\x65\x72\x76\x69\x63\x65\x2C\x20\x73\x69\x6D\x69\x6C\x61\x72\x20\x74\x6F\x20\x50\x6F\x73\x74\x6D\x61\x6E\x2C\x20\x61\x6E\x64\x20\x66\x6F\x72\x20\x6C\x6F\x61\x64\x20\x74\x65\x73\x74\x69\x6E\x67\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x46\x6F\x72\x20\x74\x68\x65\x20\x6C\x6F\x61\x64\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x77\x65\x20\x75\x73\x65\x20\x76\x65\x67\x65\x74\x61\x20\x5B\x31\x5D\x20\x61\x73\x20\x74\x68\x65\x20\x62\x61\x63\x6B\x65\x6E\x64\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x5B\x31\x5D\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x74\x73\x65\x6E\x61\x72\x74\x2F\x76\x65\x67\x65\x74\x61\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x62\x61\x72\x65\x22\x3E\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x74\x73\x65\x6E\x61\x72\x74\x2F\x76\x65\x67\x65\x74\x61\x3C\x2F\x61\x3E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x74\x65\x72\x2D\x74\x65\x78\x74\x22\x3E\x0A\x4C\x61\x73\x74\x20\x75\x70\x64\x61\x74\x65\x64\x20\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x20\x31\x34\x3A\x34\x30\x3A\x30\x37\x20\x2B\x30\x37\x30\x30\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x09\x09\x09\x50\x6F\x77\x65\x72\x65\x64\x20\x62\x79\x20\x3C\x61\x0A\x09\x09\x09\x09\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x63\x69\x69\x67\x6F\x22\x0A\x09\x09\x09\x3E\x0A\x09\x09\x09\x09\x63\x69\x69\x67\x6F\x0A\x09\x09\x09\x3C\x2F\x61\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x3C\x2F\x62\x6F\x64\x79\x3E\x0A\x3C\x2F\x68\x74\x6D\x6C\x3E"), + Content: []byte("\x3C\x21\x44\x4F\x43\x54\x59\x50\x45\x20\x68\x74\x6D\x6C\x3E\x0A\x3C\x68\x74\x6D\x6C\x20\x6C\x61\x6E\x67\x3D\x22\x65\x6E\x22\x3E\x0A\x20\x20\x3C\x68\x65\x61\x64\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x74\x61\x20\x68\x74\x74\x70\x2D\x65\x71\x75\x69\x76\x3D\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x3B\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x75\x74\x66\x2D\x38\x22\x20\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x76\x69\x65\x77\x70\x6F\x72\x74\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x77\x69\x64\x74\x68\x3D\x64\x65\x76\x69\x63\x65\x2D\x77\x69\x64\x74\x68\x2C\x20\x69\x6E\x69\x74\x69\x61\x6C\x2D\x73\x63\x61\x6C\x65\x3D\x31\x22\x20\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x74\x68\x65\x6D\x65\x2D\x63\x6F\x6C\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x23\x33\x37\x35\x45\x41\x42\x22\x20\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x74\x69\x74\x6C\x65\x3E\x74\x72\x75\x6E\x6B\x73\x20\x43\x48\x41\x4E\x47\x45\x4C\x4F\x47\x3C\x2F\x74\x69\x74\x6C\x65\x3E\x0A\x20\x20\x20\x20\x3C\x6C\x69\x6E\x6B\x20\x68\x72\x65\x66\x3D\x22\x2F\x69\x6E\x64\x65\x78\x2E\x63\x73\x73\x22\x20\x72\x65\x6C\x3D\x22\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x2F\x63\x73\x73\x22\x20\x6D\x65\x64\x69\x61\x3D\x22\x70\x72\x69\x6E\x74\x22\x20\x6F\x6E\x6C\x6F\x61\x64\x3D\x22\x74\x68\x69\x73\x2E\x6D\x65\x64\x69\x61\x3D\x27\x61\x6C\x6C\x27\x22\x20\x2F\x3E\x0A\x20\x20\x3C\x2F\x68\x65\x61\x64\x3E\x0A\x0A\x20\x20\x3C\x62\x6F\x64\x79\x3E\x0A\x20\x20\x20\x20\x3C\x69\x6D\x67\x0A\x20\x20\x20\x20\x20\x20\x61\x6C\x74\x3D\x22\x22\x0A\x20\x20\x20\x20\x20\x20\x63\x6C\x61\x73\x73\x3D\x22\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x22\x0A\x20\x20\x20\x20\x20\x20\x73\x72\x63\x3D\x22\x2F\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x61\x70\x6C\x65\x2D\x6C\x65\x61\x66\x2D\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x2D\x35\x34\x30\x2E\x6A\x70\x67\x22\x0A\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3D\x22\x39\x32\x30\x22\x0A\x20\x20\x20\x20\x2F\x3E\x0A\x0A\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x2D\x6C\x65\x66\x74\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x22\x3E\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x3C\x2F\x61\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x2D\x72\x69\x67\x68\x74\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x62\x75\x69\x6C\x64\x2E\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x42\x75\x69\x6C\x64\x20\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x73\x68\x75\x4C\x68\x61\x6E\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x47\x69\x74\x48\x75\x62\x20\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x72\x65\x6C\x3D\x22\x6D\x65\x22\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x66\x6F\x73\x73\x74\x6F\x64\x6F\x6E\x2E\x6F\x72\x67\x2F\x40\x73\x68\x75\x4C\x68\x61\x6E\x22\x3E\x4D\x61\x73\x74\x6F\x64\x6F\x6E\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x73\x72\x2E\x68\x74\x20\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x74\x77\x69\x74\x74\x65\x72\x2E\x63\x6F\x6D\x2F\x5F\x73\x68\x75\x4C\x68\x61\x6E\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x54\x77\x69\x74\x74\x65\x72\x20\x3C\x2F\x61\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x0A\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x67\x65\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x68\x65\x61\x64\x65\x72\x22\x3E\x0A\x3C\x68\x31\x3E\x74\x72\x75\x6E\x6B\x73\x20\x43\x48\x41\x4E\x47\x45\x4C\x4F\x47\x3C\x2F\x68\x31\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x65\x74\x61\x69\x6C\x73\x22\x3E\x0A\x3C\x73\x70\x61\x6E\x20\x69\x64\x3D\x22\x61\x75\x74\x68\x6F\x72\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x75\x74\x68\x6F\x72\x22\x3E\x53\x68\x75\x6C\x68\x61\x6E\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x3E\x0A\x3C\x73\x70\x61\x6E\x20\x69\x64\x3D\x22\x65\x6D\x61\x69\x6C\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x65\x6D\x61\x69\x6C\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x6D\x61\x69\x6C\x74\x6F\x3A\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x22\x3E\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x3C\x2F\x61\x3E\x3C\x2F\x73\x70\x61\x6E\x3E\x3C\x62\x72\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x74\x6F\x63\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x63\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x74\x6F\x63\x74\x69\x74\x6C\x65\x22\x3E\x54\x61\x62\x6C\x65\x20\x6F\x66\x20\x43\x6F\x6E\x74\x65\x6E\x74\x73\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x75\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x31\x22\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x74\x72\x75\x6E\x6B\x73\x5F\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x5F\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x34\x2E\x30\x20\x28\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x29\x3C\x2F\x61\x3E\x0A\x3C\x75\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x32\x22\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x62\x75\x67\x5F\x66\x69\x78\x65\x73\x22\x3E\x42\x75\x67\x20\x66\x69\x78\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x65\x6E\x68\x61\x6E\x63\x65\x6D\x65\x6E\x74\x73\x22\x3E\x45\x6E\x68\x61\x6E\x63\x65\x6D\x65\x6E\x74\x73\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x43\x68\x6F\x72\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x33\x5F\x30\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x33\x2E\x30\x20\x28\x32\x30\x32\x32\x2D\x30\x38\x2D\x32\x35\x29\x3C\x2F\x61\x3E\x0A\x3C\x75\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x32\x22\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x33\x5F\x30\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x43\x68\x6F\x72\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x32\x5F\x30\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x32\x2E\x30\x20\x28\x32\x30\x32\x32\x2D\x30\x33\x2D\x31\x33\x29\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x31\x5F\x30\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x31\x2E\x30\x20\x28\x32\x30\x32\x32\x2D\x30\x32\x2D\x30\x35\x29\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x70\x72\x65\x61\x6D\x62\x6C\x65\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x74\x72\x75\x6E\x6B\x73\x5F\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x5F\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x74\x72\x75\x6E\x6B\x73\x5F\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x5F\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x74\x72\x75\x6E\x6B\x73\x5F\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x5F\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x34\x2E\x30\x20\x28\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x29\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x32\x22\x3E\x0A\x3C\x68\x33\x20\x69\x64\x3D\x22\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x62\x75\x67\x5F\x66\x69\x78\x65\x73\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x62\x75\x67\x5F\x66\x69\x78\x65\x73\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x62\x75\x67\x5F\x66\x69\x78\x65\x73\x22\x3E\x42\x75\x67\x20\x66\x69\x78\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x64\x6C\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x66\x69\x78\x20\x70\x61\x6E\x69\x63\x20\x77\x68\x65\x6E\x20\x61\x74\x74\x61\x63\x6B\x69\x6E\x67\x20\x48\x54\x54\x50\x20\x64\x75\x65\x20\x74\x6F\x20\x6E\x69\x6C\x20\x41\x74\x74\x61\x63\x6B\x20\x68\x61\x6E\x64\x6C\x65\x72\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x49\x6E\x20\x61\x74\x74\x61\x63\x6B\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x2C\x20\x63\x68\x65\x63\x6B\x20\x69\x66\x20\x74\x68\x65\x20\x41\x74\x74\x61\x63\x6B\x20\x69\x73\x20\x6E\x69\x6C\x20\x62\x65\x66\x6F\x72\x65\x20\x77\x65\x20\x70\x75\x73\x68\x20\x74\x68\x65\x20\x72\x65\x71\x75\x65\x73\x74\x0A\x74\x6F\x20\x61\x74\x74\x61\x63\x6B\x20\x71\x75\x65\x75\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x2F\x64\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x32\x22\x3E\x0A\x3C\x68\x33\x20\x69\x64\x3D\x22\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x65\x6E\x68\x61\x6E\x63\x65\x6D\x65\x6E\x74\x73\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x65\x6E\x68\x61\x6E\x63\x65\x6D\x65\x6E\x74\x73\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x65\x6E\x68\x61\x6E\x63\x65\x6D\x65\x6E\x74\x73\x22\x3E\x45\x6E\x68\x61\x6E\x63\x65\x6D\x65\x6E\x74\x73\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x64\x6C\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x5F\x77\x77\x77\x3A\x20\x72\x65\x70\x6C\x61\x63\x65\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x68\x61\x6E\x64\x6C\x65\x72\x73\x20\x77\x69\x74\x68\x20\x48\x54\x54\x50\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x41\x74\x74\x61\x63\x6B\x20\x61\x6E\x64\x20\x61\x74\x74\x61\x63\x6B\x20\x43\x61\x6E\x63\x65\x6C\x20\x6E\x6F\x77\x20\x63\x61\x6C\x6C\x20\x74\x68\x65\x20\x48\x54\x54\x50\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x61\x64\x64\x20\x62\x6F\x6F\x6C\x65\x61\x6E\x20\x4B\x69\x6E\x64\x20\x66\x6F\x72\x20\x46\x6F\x72\x6D\x49\x6E\x70\x75\x74\x2C\x20\x46\x6F\x72\x6D\x49\x6E\x70\x75\x74\x4B\x69\x6E\x64\x42\x6F\x6F\x6C\x65\x61\x6E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6F\x70\x65\x6E\x62\x6C\x6F\x63\x6B\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x46\x6F\x72\x6D\x49\x6E\x70\x75\x74\x4B\x69\x6E\x64\x42\x6F\x6F\x6C\x65\x61\x6E\x20\x6F\x6E\x6C\x79\x20\x75\x73\x65\x64\x20\x66\x6F\x72\x20\x63\x6F\x6E\x76\x65\x72\x74\x69\x6F\x6E\x2C\x20\x66\x6F\x72\x20\x65\x78\x61\x6D\x70\x6C\x65\x0A\x54\x6F\x4A\x73\x6F\x6E\x4F\x62\x6A\x65\x63\x74\x2E\x0A\x49\x6E\x20\x74\x68\x65\x20\x57\x55\x49\x2C\x20\x69\x74\x20\x73\x74\x69\x6C\x6C\x20\x72\x65\x6E\x64\x65\x72\x65\x64\x20\x61\x73\x20\x73\x74\x72\x69\x6E\x67\x2C\x20\x6E\x6F\x74\x20\x61\x73\x20\x63\x68\x65\x63\x6B\x62\x6F\x78\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x46\x6F\x72\x6D\x49\x6E\x70\x75\x74\x20\x77\x69\x74\x68\x20\x74\x68\x69\x73\x20\x4B\x69\x6E\x64\x20\x77\x69\x6C\x6C\x20\x62\x65\x20\x63\x6F\x6E\x76\x65\x72\x74\x65\x64\x20\x74\x6F\x20\x74\x72\x75\x65\x20\x69\x6E\x20\x54\x6F\x4A\x73\x6F\x6E\x4F\x62\x6A\x65\x63\x74\x20\x69\x66\x0A\x74\x68\x65\x20\x56\x61\x6C\x75\x65\x20\x69\x73\x20\x65\x69\x74\x68\x65\x72\x20\x22\x74\x72\x75\x65\x22\x2C\x20\x22\x79\x65\x73\x22\x2C\x20\x6F\x72\x20\x22\x31\x22\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x63\x68\x65\x63\x6B\x20\x61\x6E\x64\x20\x63\x61\x6C\x6C\x20\x43\x6F\x6E\x76\x65\x72\x74\x50\x61\x72\x61\x6D\x73\x20\x77\x68\x65\x6E\x20\x72\x75\x6E\x6E\x69\x6E\x67\x20\x48\x74\x74\x70\x54\x61\x72\x67\x65\x74\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x49\x66\x20\x74\x68\x65\x20\x43\x6F\x6E\x76\x65\x72\x74\x50\x61\x72\x61\x6D\x73\x20\x66\x69\x65\x6C\x64\x20\x69\x73\x20\x73\x65\x74\x2C\x20\x75\x73\x65\x20\x69\x74\x20\x74\x6F\x20\x63\x6F\x6E\x76\x65\x72\x74\x20\x74\x68\x65\x20\x70\x61\x72\x61\x6D\x65\x74\x65\x72\x73\x20\x69\x6E\x74\x6F\x0A\x64\x65\x73\x69\x72\x65\x64\x20\x74\x79\x70\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x2F\x64\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x32\x22\x3E\x0A\x3C\x68\x33\x20\x69\x64\x3D\x22\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x34\x5F\x30\x5F\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x43\x68\x6F\x72\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x64\x6C\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x6D\x6F\x76\x65\x20\x74\x68\x65\x20\x5F\x64\x6F\x63\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79\x20\x75\x6E\x64\x65\x72\x20\x5F\x77\x77\x77\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x63\x6F\x6E\x76\x65\x72\x74\x20\x74\x68\x65\x20\x52\x45\x41\x44\x4D\x45\x20\x66\x72\x6F\x6D\x20\x61\x73\x63\x69\x69\x64\x6F\x63\x20\x74\x6F\x20\x6D\x61\x72\x6B\x64\x6F\x77\x6E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x72\x65\x6D\x6F\x76\x65\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x73\x65\x72\x76\x65\x72\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x55\x73\x69\x6E\x67\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x66\x6F\x72\x20\x63\x6F\x6D\x6D\x75\x6E\x69\x63\x61\x74\x69\x6F\x6E\x20\x69\x6E\x20\x63\x6C\x69\x65\x6E\x74\x20\x72\x65\x71\x75\x69\x72\x65\x20\x61\x64\x64\x69\x74\x69\x6F\x6E\x61\x6C\x0A\x73\x65\x74\x75\x70\x2C\x20\x65\x73\x70\x65\x63\x69\x61\x6C\x6C\x79\x20\x69\x66\x20\x69\x74\x73\x20\x62\x65\x68\x69\x6E\x64\x20\x70\x72\x6F\x78\x79\x2E\x0A\x46\x6F\x72\x20\x65\x78\x61\x6D\x70\x6C\x65\x2C\x20\x69\x66\x20\x77\x65\x20\x73\x65\x72\x76\x65\x20\x74\x68\x65\x20\x74\x72\x75\x6E\x6B\x73\x20\x73\x65\x72\x76\x65\x72\x20\x75\x6E\x64\x65\x72\x20\x64\x6F\x6D\x61\x69\x6E\x20\x74\x65\x73\x74\x69\x6E\x67\x2E\x6C\x6F\x63\x61\x6C\x0A\x62\x65\x68\x69\x6E\x64\x20\x70\x72\x6F\x78\x79\x2C\x20\x77\x65\x20\x6E\x65\x65\x64\x20\x74\x6F\x20\x73\x65\x74\x75\x70\x20\x72\x6F\x75\x74\x65\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x74\x6F\x6F\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x67\x6F\x2E\x6D\x6F\x64\x3A\x20\x73\x65\x74\x20\x47\x6F\x20\x76\x65\x72\x73\x69\x6F\x6E\x20\x74\x6F\x20\x31\x2E\x31\x39\x20\x61\x6E\x64\x20\x75\x70\x64\x61\x74\x65\x20\x61\x6C\x6C\x20\x64\x65\x70\x65\x6E\x64\x65\x6E\x63\x69\x65\x73\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x2F\x64\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x76\x30\x5F\x33\x5F\x30\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x33\x5F\x30\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x33\x5F\x30\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x33\x2E\x30\x20\x28\x32\x30\x32\x32\x2D\x30\x38\x2D\x32\x35\x29\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x54\x68\x69\x73\x20\x72\x65\x6C\x65\x61\x73\x65\x20\x73\x65\x74\x20\x74\x68\x65\x20\x6D\x69\x6E\x69\x6D\x75\x6D\x20\x47\x6F\x20\x76\x65\x72\x73\x69\x6F\x6E\x20\x74\x6F\x20\x31\x2E\x31\x38\x20\x61\x6E\x64\x20\x75\x70\x64\x61\x74\x65\x20\x61\x6C\x6C\x20\x6D\x6F\x64\x75\x6C\x65\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x32\x22\x3E\x0A\x3C\x68\x33\x20\x69\x64\x3D\x22\x76\x30\x5F\x33\x5F\x30\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x33\x5F\x30\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x33\x5F\x30\x5F\x63\x68\x6F\x72\x65\x73\x22\x3E\x43\x68\x6F\x72\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x64\x6C\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x67\x72\x6F\x75\x70\x20\x61\x6C\x6C\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x73\x20\x75\x6E\x64\x65\x72\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79\x20\x5F\x64\x6F\x63\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x5F\x64\x6F\x63\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79\x20\x70\x72\x6F\x76\x69\x64\x65\x73\x20\x61\x6E\x20\x65\x6E\x74\x72\x79\x20\x70\x6F\x69\x6E\x74\x20\x66\x6F\x72\x20\x61\x6C\x6C\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x2E\x0A\x57\x68\x69\x6C\x65\x20\x61\x74\x20\x69\x74\x20\x77\x65\x20\x72\x65\x66\x6F\x72\x6D\x61\x74\x20\x74\x68\x65\x20\x52\x45\x41\x44\x4D\x45\x20\x74\x6F\x20\x75\x73\x65\x20\x41\x73\x63\x69\x69\x44\x6F\x63\x20\x6D\x61\x72\x6B\x75\x70\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x65\x78\x61\x6D\x70\x6C\x65\x3A\x20\x66\x69\x78\x20\x74\x68\x65\x20\x48\x54\x54\x50\x20\x50\x4F\x53\x54\x20\x68\x61\x6E\x64\x6C\x65\x72\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x52\x65\x6D\x6F\x76\x65\x20\x63\x61\x6C\x6C\x20\x74\x6F\x20\x50\x61\x72\x73\x65\x4D\x75\x6C\x74\x69\x70\x61\x72\x74\x66\x6F\x72\x6D\x20\x73\x69\x6E\x63\x65\x20\x74\x68\x65\x20\x72\x65\x71\x75\x65\x73\x74\x20\x74\x79\x70\x65\x20\x69\x73\x0A\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64\x20\x6E\x6F\x74\x20\x6D\x75\x6C\x74\x69\x70\x61\x72\x74\x2F\x66\x6F\x72\x6D\x2D\x64\x61\x74\x61\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x72\x65\x6D\x6F\x76\x65\x20\x75\x6E\x75\x73\x65\x64\x20\x66\x69\x65\x6C\x64\x20\x4C\x6F\x63\x6B\x65\x72\x20\x69\x6E\x20\x52\x75\x6E\x52\x65\x71\x75\x65\x73\x74\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x61\x6C\x6C\x3A\x20\x66\x69\x78\x20\x61\x6C\x6C\x20\x6C\x69\x6E\x74\x65\x72\x20\x77\x61\x72\x6E\x69\x6E\x67\x73\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x53\x6F\x6D\x65\x20\x6C\x69\x6E\x74\x65\x72\x2C\x20\x67\x6F\x76\x65\x74\x2C\x20\x77\x61\x72\x6E\x73\x20\x61\x62\x6F\x75\x74\x20\x70\x6F\x73\x73\x69\x62\x6C\x65\x20\x63\x6F\x70\x69\x65\x64\x20\x4D\x75\x74\x65\x78\x20\x6F\x6E\x20\x48\x74\x74\x70\x52\x65\x71\x75\x65\x73\x74\x2E\x0A\x54\x6F\x20\x66\x69\x78\x20\x74\x68\x69\x73\x20\x77\x65\x20\x69\x6D\x70\x6C\x65\x6D\x65\x6E\x74\x20\x6D\x65\x74\x68\x6F\x64\x20\x63\x6C\x6F\x6E\x65\x20\x61\x6E\x64\x20\x53\x74\x72\x69\x6E\x67\x65\x72\x20\x6F\x6E\x20\x48\x74\x74\x70\x52\x65\x71\x75\x65\x73\x74\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x2F\x64\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x76\x30\x5F\x32\x5F\x30\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x32\x5F\x30\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x32\x5F\x30\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x32\x2E\x30\x20\x28\x32\x30\x32\x32\x2D\x30\x33\x2D\x31\x33\x29\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x52\x65\x6C\x65\x61\x73\x65\x20\x74\x72\x75\x6E\x6B\x73\x20\x75\x6E\x64\x65\x72\x20\x47\x50\x4C\x20\x33\x2E\x30\x20\x6F\x72\x20\x6C\x61\x74\x65\x72\x20\x6C\x69\x63\x65\x6E\x73\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x53\x65\x65\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x2F\x6A\x6F\x75\x72\x6E\x61\x6C\x2F\x32\x30\x32\x32\x2F\x67\x70\x6C\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x62\x61\x72\x65\x22\x3E\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x2F\x6A\x6F\x75\x72\x6E\x61\x6C\x2F\x32\x30\x32\x32\x2F\x67\x70\x6C\x3C\x2F\x61\x3E\x20\x66\x6F\x72\x20\x6D\x6F\x72\x65\x20\x69\x6E\x66\x6F\x72\x6D\x61\x74\x69\x6F\x6E\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x76\x30\x5F\x31\x5F\x30\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x31\x5F\x30\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x76\x30\x5F\x31\x5F\x30\x22\x3E\x74\x72\x75\x6E\x6B\x73\x20\x76\x30\x2E\x31\x2E\x30\x20\x28\x32\x30\x32\x32\x2D\x30\x32\x2D\x30\x35\x29\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x4D\x6F\x64\x75\x6C\x65\x20\x74\x72\x75\x6E\x6B\x73\x20\x69\x73\x20\x61\x20\x6C\x69\x62\x72\x61\x72\x79\x20\x61\x6E\x64\x20\x48\x54\x54\x50\x20\x73\x65\x72\x76\x69\x63\x65\x20\x74\x68\x61\x74\x20\x70\x72\x6F\x76\x69\x64\x65\x20\x77\x65\x62\x20\x75\x73\x65\x72\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x0A\x74\x6F\x20\x74\x65\x73\x74\x20\x48\x54\x54\x50\x20\x73\x65\x72\x76\x69\x63\x65\x2C\x20\x73\x69\x6D\x69\x6C\x61\x72\x20\x74\x6F\x20\x50\x6F\x73\x74\x6D\x61\x6E\x2C\x20\x61\x6E\x64\x20\x66\x6F\x72\x20\x6C\x6F\x61\x64\x20\x74\x65\x73\x74\x69\x6E\x67\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x46\x6F\x72\x20\x74\x68\x65\x20\x6C\x6F\x61\x64\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x77\x65\x20\x75\x73\x65\x20\x76\x65\x67\x65\x74\x61\x20\x5B\x31\x5D\x20\x61\x73\x20\x74\x68\x65\x20\x62\x61\x63\x6B\x65\x6E\x64\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x5B\x31\x5D\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x74\x73\x65\x6E\x61\x72\x74\x2F\x76\x65\x67\x65\x74\x61\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x62\x61\x72\x65\x22\x3E\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x74\x73\x65\x6E\x61\x72\x74\x2F\x76\x65\x67\x65\x74\x61\x3C\x2F\x61\x3E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x74\x65\x72\x2D\x74\x65\x78\x74\x22\x3E\x0A\x4C\x61\x73\x74\x20\x75\x70\x64\x61\x74\x65\x64\x20\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x20\x31\x34\x3A\x34\x30\x3A\x30\x37\x20\x2B\x30\x37\x30\x30\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x0A\x0A\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x20\x32\x30\x30\x37\x2D\x32\x30\x32\x33\x2C\x20\x53\x68\x75\x6C\x68\x61\x6E\x20\x26\x6C\x74\x3B\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x26\x67\x74\x3B\x2E\x20\x41\x6C\x6C\x20\x72\x69\x67\x68\x74\x73\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x73\x65\x72\x76\x65\x64\x2E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x50\x6F\x77\x65\x72\x65\x64\x20\x62\x79\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x63\x69\x69\x67\x6F\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x63\x69\x69\x67\x6F\x3C\x2F\x61\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x3C\x2F\x62\x6F\x64\x79\x3E\x0A\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"), } node.SetMode(420) - node.SetModTimeUnix(1684222807, 409090976) + node.SetModTimeUnix(1697705988, 283151457) node.SetName("CHANGELOG.html") - node.SetSize(10248) + node.SetSize(7346) return node } @@ -76,12 +76,12 @@ func generate__www_doc_README_html() *memfs.Node { Path: "/doc/README.html", ContentType: "text/html; charset=utf-8", GenFuncName: "generate__www_doc_README_html", - Content: []byte("\x3C\x21\x44\x4F\x43\x54\x59\x50\x45\x20\x68\x74\x6D\x6C\x3E\x0A\x3C\x68\x74\x6D\x6C\x3E\x0A\x09\x3C\x68\x65\x61\x64\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x68\x74\x74\x70\x2D\x65\x71\x75\x69\x76\x3D\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x3B\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x75\x74\x66\x2D\x38\x22\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x76\x69\x65\x77\x70\x6F\x72\x74\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x77\x69\x64\x74\x68\x3D\x64\x65\x76\x69\x63\x65\x2D\x77\x69\x64\x74\x68\x2C\x20\x69\x6E\x69\x74\x69\x61\x6C\x2D\x73\x63\x61\x6C\x65\x3D\x31\x22\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x74\x68\x65\x6D\x65\x2D\x63\x6F\x6C\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x23\x33\x37\x35\x45\x41\x42\x22\x3E\x0A\x09\x09\x3C\x74\x69\x74\x6C\x65\x3E\x3C\x2F\x74\x69\x74\x6C\x65\x3E\x0A\x09\x09\x3C\x73\x74\x79\x6C\x65\x3E\x0A\x09\x09\x0A\x62\x6F\x64\x79\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x41\x72\x69\x61\x6C\x2C\x20\x73\x61\x6E\x73\x2D\x73\x65\x72\x69\x66\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x66\x66\x66\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x33\x3B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x63\x65\x6E\x74\x65\x72\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x32\x32\x32\x3B\x0A\x7D\x0A\x70\x72\x65\x2C\x0A\x63\x6F\x64\x65\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x4D\x65\x6E\x6C\x6F\x2C\x20\x6D\x6F\x6E\x6F\x73\x70\x61\x63\x65\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x30\x2E\x38\x37\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x70\x72\x65\x20\x7B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x34\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x2D\x78\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x65\x66\x65\x66\x65\x66\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x2E\x36\x32\x35\x72\x65\x6D\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x72\x61\x64\x69\x75\x73\x3A\x20\x30\x2E\x33\x31\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x61\x20\x7B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x61\x3A\x68\x6F\x76\x65\x72\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x20\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65\x3B\x0A\x7D\x0A\x0A\x70\x2C\x0A\x6C\x69\x20\x7B\x0A\x09\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x35\x30\x72\x65\x6D\x3B\x0A\x09\x77\x6F\x72\x64\x2D\x77\x72\x61\x70\x3A\x20\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64\x3B\x0A\x7D\x0A\x6C\x69\x20\x70\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x32\x70\x78\x3B\x0A\x7D\x0A\x70\x2C\x0A\x70\x72\x65\x2C\x0A\x75\x6C\x2C\x0A\x6F\x6C\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x68\x31\x2C\x0A\x68\x32\x2C\x0A\x68\x33\x2C\x0A\x68\x34\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x20\x30\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x7D\x0A\x68\x31\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x37\x35\x72\x65\x6D\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x3B\x0A\x7D\x0A\x68\x31\x20\x2E\x74\x65\x78\x74\x2D\x6D\x75\x74\x65\x64\x20\x7B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x37\x37\x37\x3B\x0A\x7D\x0A\x68\x32\x20\x7B\x0A\x09\x63\x6C\x65\x61\x72\x3A\x20\x72\x69\x67\x68\x74\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x65\x30\x65\x62\x66\x35\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x2E\x35\x72\x65\x6D\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x32\x35\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x6E\x6F\x72\x6D\x61\x6C\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x2D\x77\x72\x61\x70\x3A\x20\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64\x3B\x0A\x7D\x0A\x68\x32\x20\x61\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x7D\x0A\x68\x33\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x32\x35\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x2D\x77\x72\x61\x70\x3A\x20\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64\x3B\x0A\x7D\x0A\x68\x33\x2C\x0A\x68\x34\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x20\x30\x2E\x33\x31\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x68\x34\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x68\x32\x20\x3E\x20\x73\x70\x61\x6E\x2C\x0A\x68\x33\x20\x3E\x20\x73\x70\x61\x6E\x20\x7B\x0A\x09\x66\x6C\x6F\x61\x74\x3A\x20\x72\x69\x67\x68\x74\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x20\x32\x35\x70\x78\x20\x30\x20\x30\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x6E\x6F\x72\x6D\x61\x6C\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x35\x32\x37\x39\x63\x37\x3B\x0A\x7D\x0A\x0A\x64\x6C\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x64\x74\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x0A\x7D\x0A\x64\x64\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x20\x30\x20\x30\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2F\x2A\x2A\x0A\x20\x2A\x20\x43\x75\x73\x74\x6F\x6D\x20\x63\x6C\x61\x73\x73\x65\x73\x20\x66\x6F\x72\x20\x70\x61\x67\x65\x73\x0A\x20\x2A\x2F\x0A\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x7B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x63\x6F\x6C\x6C\x61\x70\x73\x65\x3A\x20\x73\x65\x70\x61\x72\x61\x74\x65\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x3A\x20\x30\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x30\x30\x25\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x63\x65\x6E\x74\x65\x72\x3B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x32\x30\x70\x78\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x69\x6D\x67\x20\x7B\x0A\x09\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x2E\x74\x69\x74\x6C\x65\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x22\x4F\x70\x65\x6E\x20\x53\x61\x6E\x73\x22\x2C\x22\x44\x65\x6A\x61\x56\x75\x20\x53\x61\x6E\x73\x22\x2C\x73\x61\x6E\x73\x2D\x73\x65\x72\x69\x66\x3B\x0A\x09\x74\x65\x78\x74\x2D\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D\x3A\x20\x75\x70\x70\x65\x72\x63\x61\x73\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x63\x6F\x6E\x74\x65\x6E\x74\x20\x7B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x2D\x6C\x65\x66\x74\x3A\x20\x31\x2E\x31\x32\x35\x65\x6D\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x2D\x72\x69\x67\x68\x74\x3A\x20\x31\x2E\x32\x35\x65\x6D\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x6C\x65\x66\x74\x3A\x20\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x23\x64\x64\x64\x64\x64\x66\x3B\x0A\x09\x77\x6F\x72\x64\x2D\x77\x72\x61\x70\x3A\x20\x61\x6E\x79\x77\x68\x65\x72\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x63\x6F\x6E\x74\x65\x6E\x74\x3E\x3A\x6C\x61\x73\x74\x2D\x63\x68\x69\x6C\x64\x3E\x3A\x6C\x61\x73\x74\x2D\x63\x68\x69\x6C\x64\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x30\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x6E\x6F\x74\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x77\x68\x69\x74\x65\x73\x6D\x6F\x6B\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x74\x69\x70\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x61\x7A\x75\x72\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x69\x6D\x70\x6F\x72\x74\x61\x6E\x74\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x68\x6F\x6E\x65\x79\x64\x65\x77\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x63\x61\x75\x74\x69\x6F\x6E\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x6C\x61\x76\x65\x6E\x64\x65\x72\x62\x75\x73\x68\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x77\x61\x72\x6E\x69\x6E\x67\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x6D\x69\x73\x74\x79\x72\x6F\x73\x65\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x65\x30\x65\x62\x66\x35\x3B\x0A\x09\x68\x65\x69\x67\x68\x74\x3A\x20\x34\x72\x65\x6D\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x68\x69\x64\x64\x65\x6E\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x2C\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x7B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x31\x2E\x33\x31\x33\x72\x65\x6D\x20\x30\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x6E\x6F\x72\x6D\x61\x6C\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x20\x7B\x0A\x09\x66\x6C\x6F\x61\x74\x3A\x20\x6C\x65\x66\x74\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x20\x61\x20\x7B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x32\x32\x32\x3B\x0A\x09\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x20\x2E\x68\x65\x61\x64\x65\x72\x2D\x6C\x6F\x67\x6F\x20\x7B\x0A\x09\x68\x65\x69\x67\x68\x74\x3A\x20\x32\x72\x65\x6D\x3B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x35\x2E\x31\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x7B\x0A\x09\x66\x6C\x6F\x61\x74\x3A\x20\x72\x69\x67\x68\x74\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x61\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x2E\x36\x32\x35\x72\x65\x6D\x20\x30\x2E\x31\x32\x35\x72\x65\x6D\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x2E\x36\x32\x35\x72\x65\x6D\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x77\x68\x69\x74\x65\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x3A\x20\x30\x2E\x30\x36\x32\x35\x72\x65\x6D\x20\x73\x6F\x6C\x69\x64\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x72\x61\x64\x69\x75\x73\x3A\x20\x35\x70\x78\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x66\x6F\x72\x6D\x20\x7B\x0A\x09\x64\x69\x73\x70\x6C\x61\x79\x3A\x20\x69\x6E\x6C\x69\x6E\x65\x2D\x62\x6C\x6F\x63\x6B\x3B\x0A\x7D\x0A\x0A\x2E\x70\x61\x67\x65\x20\x7B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x30\x30\x25\x3B\x0A\x7D\x0A\x0A\x2E\x70\x61\x67\x65\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x2C\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x2C\x0A\x2E\x66\x6F\x6F\x74\x65\x72\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x6C\x65\x66\x74\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x72\x69\x67\x68\x74\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x35\x39\x2E\x33\x38\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x70\x61\x67\x65\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x6C\x65\x66\x74\x3B\x0A\x7D\x0A\x0A\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x2E\x6D\x65\x74\x61\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x74\x79\x6C\x65\x3A\x20\x69\x74\x61\x6C\x69\x63\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x66\x6F\x6F\x74\x65\x72\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x63\x65\x6E\x74\x65\x72\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x36\x36\x36\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x30\x2E\x38\x37\x35\x72\x65\x6D\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x32\x2E\x35\x72\x65\x6D\x20\x30\x3B\x0A\x7D\x0A\x0A\x2E\x75\x6C\x69\x73\x74\x20\x6C\x69\x20\x2E\x70\x61\x72\x61\x67\x72\x61\x70\x68\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x31\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x75\x6C\x69\x73\x74\x20\x6C\x69\x20\x2E\x70\x61\x72\x61\x67\x72\x61\x70\x68\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x31\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2F\x2A\x2A\x20\x43\x75\x73\x74\x6F\x6D\x20\x63\x6C\x61\x73\x73\x65\x73\x20\x2A\x2F\x0A\x23\x74\x6F\x63\x74\x69\x74\x6C\x65\x20\x7B\x0A\x09\x64\x69\x73\x70\x6C\x61\x79\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x23\x74\x6F\x63\x20\x6C\x69\x20\x7B\x0A\x09\x6C\x69\x73\x74\x2D\x73\x74\x79\x6C\x65\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x23\x74\x6F\x63\x20\x75\x6C\x20\x2E\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x31\x20\x7B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x70\x78\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x34\x70\x78\x3B\x0A\x7D\x0A\x23\x74\x6F\x63\x20\x75\x6C\x20\x2E\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x32\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x34\x70\x78\x3B\x0A\x7D\x0A\x0A\x40\x6D\x65\x64\x69\x61\x20\x73\x63\x72\x65\x65\x6E\x20\x61\x6E\x64\x20\x28\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x39\x39\x32\x70\x78\x29\x20\x7B\x0A\x09\x23\x74\x6F\x63\x20\x7B\x0A\x09\x09\x61\x6C\x6C\x3A\x20\x75\x6E\x73\x65\x74\x3B\x0A\x09\x7D\x0A\x7D\x0A\x0A\x09\x09\x3C\x2F\x73\x74\x79\x6C\x65\x3E\x0A\x09\x3C\x2F\x68\x65\x61\x64\x3E\x0A\x09\x3C\x62\x6F\x64\x79\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x22\x3E\x0A\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x22\x3E\x0A\x09\x09\x09\x09\x09\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x22\x3E\x3C\x2F\x61\x3E\x0A\x09\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6D\x65\x6E\x75\x22\x3E\x0A\x09\x09\x09\x09\x09\x3C\x66\x6F\x72\x6D\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x74\x65\x6D\x22\x20\x61\x63\x74\x69\x6F\x6E\x3D\x22\x2F\x5F\x69\x6E\x74\x65\x72\x6E\x61\x6C\x2F\x73\x65\x61\x72\x63\x68\x22\x3E\x0A\x09\x09\x09\x09\x09\x09\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x20\x6E\x61\x6D\x65\x3D\x22\x71\x22\x20\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72\x3D\x22\x53\x65\x61\x72\x63\x68\x22\x20\x2F\x3E\x0A\x09\x09\x09\x09\x09\x3C\x2F\x66\x6F\x72\x6D\x3E\x0A\x09\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x67\x65\x22\x3E\x0A\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x0A\x3C\x68\x31\x3E\x54\x72\x75\x6E\x6B\x73\x3C\x2F\x68\x31\x3E\x0A\x3C\x70\x3E\x54\x72\x75\x6E\x6B\x73\x20\x69\x73\x20\x61\x20\x47\x6F\x20\x6C\x69\x62\x72\x61\x72\x79\x20\x74\x68\x61\x74\x20\x70\x72\x6F\x76\x69\x64\x65\x20\x48\x54\x54\x50\x20\x73\x65\x72\x76\x69\x63\x65\x20\x77\x69\x74\x68\x20\x77\x65\x62\x20\x75\x73\x65\x72\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x0A\x74\x6F\x20\x74\x65\x73\x74\x20\x48\x54\x54\x50\x20\x61\x6E\x64\x2F\x6F\x72\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x20\x61\x6E\x64\x20\x66\x6F\x72\x20\x6C\x6F\x61\x64\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x48\x54\x54\x50\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x46\x6F\x72\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x48\x54\x54\x50\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x20\x69\x74\x20\x75\x73\x65\x20\x74\x68\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x70\x6B\x67\x2E\x67\x6F\x2E\x64\x65\x76\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x73\x68\x75\x4C\x68\x61\x6E\x2F\x73\x68\x61\x72\x65\x2F\x6C\x69\x62\x2F\x68\x74\x74\x70\x22\x3E\x6C\x69\x62\x2F\x68\x74\x74\x70\x3C\x2F\x61\x3E\x0A\x70\x61\x63\x6B\x61\x67\x65\x20\x61\x73\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E\x74\x2C\x20\x61\x20\x77\x72\x61\x70\x70\x65\x72\x20\x66\x6F\x72\x20\x73\x74\x61\x6E\x64\x61\x72\x64\x20\x47\x6F\x20\x48\x54\x54\x50\x20\x70\x61\x63\x6B\x61\x67\x65\x2E\x0A\x46\x6F\x72\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x20\x69\x74\x20\x75\x73\x65\x20\x74\x68\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x70\x6B\x67\x2E\x67\x6F\x2E\x64\x65\x76\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x73\x68\x75\x4C\x68\x61\x6E\x2F\x73\x68\x61\x72\x65\x2F\x6C\x69\x62\x2F\x77\x65\x62\x73\x6F\x63\x6B\x65\x74\x22\x3E\x6C\x69\x62\x2F\x77\x65\x62\x73\x6F\x63\x6B\x65\x74\x3C\x2F\x61\x3E\x0A\x70\x61\x63\x6B\x61\x67\x65\x20\x61\x73\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E\x74\x2E\x0A\x46\x6F\x72\x20\x74\x68\x65\x20\x6C\x6F\x61\x64\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x77\x65\x20\x75\x73\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x74\x73\x65\x6E\x61\x72\x74\x2F\x76\x65\x67\x65\x74\x61\x22\x3E\x76\x65\x67\x65\x74\x61\x3C\x2F\x61\x3E\x0A\x61\x73\x20\x74\x68\x65\x20\x62\x61\x63\x6B\x65\x6E\x64\x2E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x70\x6B\x67\x2E\x67\x6F\x2E\x64\x65\x76\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x3E\x47\x6F\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x3C\x2F\x61\x3E\x3C\x2F\x70\x3E\x0A\x3C\x68\x32\x3E\x55\x73\x61\x67\x65\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x53\x65\x65\x20\x74\x68\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x2F\x74\x72\x65\x65\x2F\x6D\x61\x69\x6E\x2F\x69\x74\x65\x6D\x2F\x65\x78\x61\x6D\x70\x6C\x65\x2F\x22\x3E\x65\x78\x61\x6D\x70\x6C\x65\x3C\x2F\x61\x3E\x0A\x70\x61\x63\x6B\x61\x67\x65\x20\x6F\x6E\x20\x68\x6F\x77\x20\x74\x6F\x20\x70\x72\x6F\x67\x72\x61\x6D\x6D\x61\x74\x69\x63\x61\x6C\x6C\x79\x20\x75\x73\x65\x20\x61\x6E\x64\x20\x63\x72\x65\x61\x74\x65\x20\x73\x65\x72\x76\x69\x63\x65\x20\x75\x73\x69\x6E\x67\x20\x74\x68\x69\x73\x20\x6D\x6F\x64\x75\x6C\x65\x2C\x0A\x6F\x72\x2C\x3C\x2F\x70\x3E\x0A\x3C\x75\x6C\x3E\x0A\x3C\x6C\x69\x3E\x63\x6C\x6F\x6E\x65\x20\x74\x68\x69\x73\x20\x72\x65\x70\x6F\x73\x69\x74\x6F\x72\x79\x2C\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x65\x78\x65\x63\x75\x74\x65\x20\x3C\x63\x6F\x64\x65\x3E\x6D\x61\x6B\x65\x20\x64\x65\x76\x3C\x2F\x63\x6F\x64\x65\x3E\x2C\x20\x61\x6E\x64\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x6F\x70\x65\x6E\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x3A\x38\x32\x31\x37\x22\x3E\x68\x74\x74\x70\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x3A\x38\x32\x31\x37\x3C\x2F\x61\x3E\x2E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x3C\x68\x32\x3E\x53\x63\x72\x65\x65\x6E\x73\x68\x6F\x74\x73\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x20\x73\x63\x72\x65\x65\x6E\x73\x68\x6F\x74\x20\x64\x69\x73\x70\x6C\x61\x79\x20\x74\x68\x65\x20\x6D\x61\x69\x6E\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x20\x74\x6F\x20\x52\x75\x6E\x20\x6F\x72\x20\x41\x74\x74\x61\x63\x6B\x20\x74\x68\x65\x0A\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x20\x48\x54\x54\x50\x20\x73\x65\x72\x76\x69\x63\x65\x2C\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x3C\x69\x6D\x67\x20\x73\x72\x63\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x2F\x62\x6C\x6F\x62\x2F\x6D\x61\x69\x6E\x2F\x5F\x73\x63\x72\x65\x65\x6E\x73\x68\x6F\x74\x73\x2F\x74\x72\x75\x6E\x6B\x73\x5F\x65\x78\x61\x6D\x70\x6C\x65\x2E\x70\x6E\x67\x22\x20\x61\x6C\x74\x3D\x22\x4D\x61\x69\x6E\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x22\x20\x74\x69\x74\x6C\x65\x3D\x22\x4D\x61\x69\x6E\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x22\x3E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x20\x73\x63\x72\x65\x65\x6E\x73\x68\x6F\x74\x20\x64\x69\x73\x70\x6C\x61\x79\x20\x74\x68\x65\x20\x72\x65\x73\x75\x6C\x74\x20\x6F\x66\x20\x61\x74\x74\x61\x63\x6B\x20\x69\x6E\x20\x74\x77\x6F\x20\x66\x6F\x72\x6D\x73\x2C\x20\x76\x65\x67\x65\x74\x61\x0A\x6D\x65\x74\x72\x69\x63\x73\x20\x61\x6E\x64\x20\x76\x65\x67\x65\x74\x61\x20\x68\x69\x73\x74\x6F\x67\x72\x61\x6D\x2C\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x3C\x69\x6D\x67\x20\x73\x72\x63\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x2F\x62\x6C\x6F\x62\x2F\x6D\x61\x69\x6E\x2F\x5F\x73\x63\x72\x65\x65\x6E\x73\x68\x6F\x74\x73\x2F\x74\x72\x75\x6E\x6B\x73\x5F\x61\x74\x74\x61\x63\x6B\x5F\x72\x65\x73\x75\x6C\x74\x2E\x70\x6E\x67\x22\x20\x61\x6C\x74\x3D\x22\x41\x74\x74\x61\x63\x6B\x20\x72\x65\x73\x75\x6C\x74\x22\x20\x74\x69\x74\x6C\x65\x3D\x22\x41\x74\x74\x61\x63\x6B\x20\x72\x65\x73\x75\x6C\x74\x22\x3E\x3C\x2F\x70\x3E\x0A\x3C\x68\x32\x3E\x57\x65\x62\x20\x75\x73\x65\x72\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x20\x28\x57\x55\x49\x29\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x42\x79\x20\x64\x65\x66\x61\x75\x6C\x74\x2C\x20\x74\x68\x65\x20\x54\x72\x75\x6E\x6B\x73\x20\x75\x73\x65\x72\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x20\x63\x61\x6E\x20\x62\x65\x20\x76\x69\x65\x77\x65\x64\x20\x62\x79\x20\x6F\x70\x65\x6E\x69\x6E\x67\x20\x69\x6E\x20\x62\x72\x6F\x77\x73\x65\x72\x20\x61\x74\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x3A\x38\x32\x31\x37\x22\x3E\x68\x74\x74\x70\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x3A\x38\x32\x31\x37\x3C\x2F\x61\x3E\x2E\x0A\x4F\x6E\x65\x20\x63\x61\x6E\x20\x63\x68\x61\x6E\x67\x65\x20\x61\x64\x64\x72\x65\x73\x73\x20\x74\x68\x72\x6F\x75\x67\x68\x20\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x27\x73\x20\x4C\x69\x73\x74\x65\x6E\x41\x64\x64\x72\x65\x73\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x68\x32\x3E\x46\x69\x6C\x65\x20\x6E\x61\x6D\x65\x20\x66\x6F\x72\x6D\x61\x74\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x45\x61\x63\x68\x20\x61\x74\x74\x61\x63\x6B\x20\x72\x65\x73\x75\x6C\x74\x20\x69\x73\x20\x73\x61\x76\x65\x64\x20\x69\x6E\x20\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x27\x73\x20\x52\x65\x73\x75\x6C\x74\x73\x44\x69\x72\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x0A\x66\x69\x6C\x65\x20\x6E\x61\x6D\x65\x20\x66\x6F\x72\x6D\x61\x74\x2C\x3C\x2F\x70\x3E\x0A\x3C\x70\x72\x65\x3E\x3C\x63\x6F\x64\x65\x3E\x26\x6C\x74\x3B\x54\x61\x72\x67\x65\x74\x2E\x49\x44\x26\x67\x74\x3B\x20\x26\x71\x75\x6F\x74\x3B\x2E\x26\x71\x75\x6F\x74\x3B\x20\x26\x6C\x74\x3B\x48\x74\x74\x70\x54\x61\x72\x67\x65\x74\x2E\x49\x44\x26\x67\x74\x3B\x20\x26\x71\x75\x6F\x74\x3B\x2E\x26\x71\x75\x6F\x74\x3B\x20\x26\x6C\x74\x3B\x44\x61\x74\x65\x54\x69\x6D\x65\x26\x67\x74\x3B\x20\x26\x71\x75\x6F\x74\x3B\x2E\x26\x71\x75\x6F\x74\x3B\x20\x26\x6C\x74\x3B\x52\x61\x74\x65\x26\x67\x74\x3B\x20\x26\x71\x75\x6F\x74\x3B\x78\x26\x71\x75\x6F\x74\x3B\x20\x26\x6C\x74\x3B\x44\x75\x72\x61\x74\x69\x6F\x6E\x26\x67\x74\x3B\x20\x26\x71\x75\x6F\x74\x3B\x2E\x26\x71\x75\x6F\x74\x3B\x20\x26\x6C\x74\x3B\x52\x65\x73\x75\x6C\x74\x73\x53\x75\x66\x66\x69\x78\x26\x67\x74\x3B\x0A\x3C\x2F\x63\x6F\x64\x65\x3E\x3C\x2F\x70\x72\x65\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x26\x71\x75\x6F\x74\x3B\x44\x61\x74\x65\x54\x69\x6D\x65\x26\x71\x75\x6F\x74\x3B\x20\x69\x73\x20\x69\x6E\x20\x74\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x20\x6C\x61\x79\x6F\x75\x74\x2C\x3C\x2F\x70\x3E\x0A\x3C\x70\x72\x65\x3E\x3C\x63\x6F\x64\x65\x3E\x59\x65\x61\x72\x4D\x6F\x6E\x74\x68\x44\x61\x74\x65\x20\x26\x71\x75\x6F\x74\x3B\x5F\x26\x71\x75\x6F\x74\x3B\x20\x48\x6F\x75\x72\x4D\x69\x6E\x75\x74\x65\x53\x65\x63\x6F\x6E\x64\x73\x0A\x3C\x2F\x63\x6F\x64\x65\x3E\x3C\x2F\x70\x72\x65\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x26\x71\x75\x6F\x74\x3B\x52\x65\x73\x75\x6C\x74\x73\x53\x75\x66\x66\x69\x78\x26\x71\x75\x6F\x74\x3B\x20\x69\x73\x20\x74\x68\x65\x20\x6F\x6E\x65\x20\x74\x68\x61\x74\x20\x64\x65\x66\x69\x6E\x65\x64\x20\x69\x6E\x20\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x2E\x3C\x2F\x70\x3E\x0A\x3C\x68\x32\x3E\x44\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x3E\x52\x65\x70\x6F\x73\x69\x74\x6F\x72\x79\x3C\x2F\x61\x3E\x3A\x3A\x20\x4C\x69\x6E\x6B\x20\x74\x6F\x20\x74\x68\x65\x20\x73\x6F\x75\x72\x63\x65\x20\x63\x6F\x64\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6C\x69\x73\x74\x73\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x3E\x4D\x61\x69\x6C\x69\x6E\x67\x20\x6C\x69\x73\x74\x3C\x2F\x61\x3E\x3A\x3A\x20\x4C\x69\x6E\x6B\x20\x74\x6F\x20\x64\x69\x73\x63\x75\x73\x73\x69\x6F\x6E\x20\x61\x6E\x64\x0A\x77\x68\x65\x72\x65\x20\x74\x6F\x20\x73\x65\x6E\x64\x20\x70\x61\x74\x63\x68\x65\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x74\x6F\x64\x6F\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x3E\x49\x73\x73\x75\x65\x73\x3C\x2F\x61\x3E\x3A\x3A\x20\x4C\x69\x6E\x6B\x20\x74\x6F\x20\x72\x65\x70\x6F\x72\x74\x20\x66\x6F\x72\x20\x62\x75\x67\x20\x6F\x72\x0A\x66\x65\x61\x74\x75\x72\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x68\x32\x3E\x43\x72\x65\x64\x69\x74\x73\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x54\x72\x75\x6E\x6B\x73\x20\x69\x63\x6F\x6E\x20\x61\x6E\x64\x20\x69\x6D\x61\x67\x65\x20\x69\x73\x20\x70\x72\x6F\x76\x69\x64\x65\x64\x20\x62\x79\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x73\x70\x72\x69\x74\x65\x72\x73\x2D\x72\x65\x73\x6F\x75\x72\x63\x65\x2E\x63\x6F\x6D\x2F\x22\x3E\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x73\x70\x72\x69\x74\x65\x72\x73\x2D\x72\x65\x73\x6F\x75\x72\x63\x65\x2E\x63\x6F\x6D\x2F\x3C\x2F\x61\x3E\x2E\x3C\x2F\x70\x3E\x0A\x3C\x68\x32\x3E\x4C\x69\x63\x65\x6E\x73\x65\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x32\x30\x32\x31\x20\x4D\x2E\x20\x53\x68\x75\x6C\x68\x61\x6E\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x6D\x61\x69\x6C\x74\x6F\x3A\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x22\x3E\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x3C\x2F\x61\x3E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x54\x68\x69\x73\x20\x70\x72\x6F\x67\x72\x61\x6D\x20\x69\x73\x20\x66\x72\x65\x65\x20\x73\x6F\x66\x74\x77\x61\x72\x65\x3A\x20\x79\x6F\x75\x20\x63\x61\x6E\x20\x72\x65\x64\x69\x73\x74\x72\x69\x62\x75\x74\x65\x20\x69\x74\x20\x61\x6E\x64\x2F\x6F\x72\x20\x6D\x6F\x64\x69\x66\x79\x20\x69\x74\x20\x75\x6E\x64\x65\x72\x0A\x74\x68\x65\x20\x74\x65\x72\x6D\x73\x20\x6F\x66\x20\x74\x68\x65\x20\x47\x4E\x55\x20\x47\x65\x6E\x65\x72\x61\x6C\x20\x50\x75\x62\x6C\x69\x63\x20\x4C\x69\x63\x65\x6E\x73\x65\x20\x61\x73\x20\x70\x75\x62\x6C\x69\x73\x68\x65\x64\x20\x62\x79\x20\x74\x68\x65\x20\x46\x72\x65\x65\x20\x53\x6F\x66\x74\x77\x61\x72\x65\x0A\x46\x6F\x75\x6E\x64\x61\x74\x69\x6F\x6E\x2C\x20\x65\x69\x74\x68\x65\x72\x20\x76\x65\x72\x73\x69\x6F\x6E\x20\x33\x20\x6F\x66\x20\x74\x68\x65\x20\x4C\x69\x63\x65\x6E\x73\x65\x2C\x20\x6F\x72\x20\x28\x61\x74\x20\x79\x6F\x75\x72\x20\x6F\x70\x74\x69\x6F\x6E\x29\x20\x61\x6E\x79\x20\x6C\x61\x74\x65\x72\x0A\x76\x65\x72\x73\x69\x6F\x6E\x2E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x54\x68\x69\x73\x20\x70\x72\x6F\x67\x72\x61\x6D\x20\x69\x73\x20\x64\x69\x73\x74\x72\x69\x62\x75\x74\x65\x64\x20\x69\x6E\x20\x74\x68\x65\x20\x68\x6F\x70\x65\x20\x74\x68\x61\x74\x20\x69\x74\x20\x77\x69\x6C\x6C\x20\x62\x65\x20\x75\x73\x65\x66\x75\x6C\x2C\x20\x62\x75\x74\x20\x57\x49\x54\x48\x4F\x55\x54\x0A\x41\x4E\x59\x20\x57\x41\x52\x52\x41\x4E\x54\x59\x3B\x20\x77\x69\x74\x68\x6F\x75\x74\x20\x65\x76\x65\x6E\x20\x74\x68\x65\x20\x69\x6D\x70\x6C\x69\x65\x64\x20\x77\x61\x72\x72\x61\x6E\x74\x79\x20\x6F\x66\x20\x4D\x45\x52\x43\x48\x41\x4E\x54\x41\x42\x49\x4C\x49\x54\x59\x20\x6F\x72\x20\x46\x49\x54\x4E\x45\x53\x53\x0A\x46\x4F\x52\x20\x41\x20\x50\x41\x52\x54\x49\x43\x55\x4C\x41\x52\x20\x50\x55\x52\x50\x4F\x53\x45\x2E\x20\x20\x53\x65\x65\x20\x74\x68\x65\x20\x47\x4E\x55\x20\x47\x65\x6E\x65\x72\x61\x6C\x20\x50\x75\x62\x6C\x69\x63\x20\x4C\x69\x63\x65\x6E\x73\x65\x20\x66\x6F\x72\x20\x6D\x6F\x72\x65\x0A\x64\x65\x74\x61\x69\x6C\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x59\x6F\x75\x20\x73\x68\x6F\x75\x6C\x64\x20\x68\x61\x76\x65\x20\x72\x65\x63\x65\x69\x76\x65\x64\x20\x61\x20\x63\x6F\x70\x79\x20\x6F\x66\x20\x74\x68\x65\x20\x47\x4E\x55\x20\x47\x65\x6E\x65\x72\x61\x6C\x20\x50\x75\x62\x6C\x69\x63\x20\x4C\x69\x63\x65\x6E\x73\x65\x20\x61\x6C\x6F\x6E\x67\x20\x77\x69\x74\x68\x0A\x74\x68\x69\x73\x20\x70\x72\x6F\x67\x72\x61\x6D\x2E\x20\x20\x49\x66\x20\x6E\x6F\x74\x2C\x20\x73\x65\x65\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x67\x6E\x75\x2E\x6F\x72\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x73\x2F\x22\x3E\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x67\x6E\x75\x2E\x6F\x72\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x73\x2F\x3C\x2F\x61\x3E\x2E\x3C\x2F\x70\x3E\x0A\x0A\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x09\x09\x09\x50\x6F\x77\x65\x72\x65\x64\x20\x62\x79\x20\x3C\x61\x0A\x09\x09\x09\x09\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x63\x69\x69\x67\x6F\x22\x0A\x09\x09\x09\x3E\x0A\x09\x09\x09\x09\x63\x69\x69\x67\x6F\x0A\x09\x09\x09\x3C\x2F\x61\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x3C\x2F\x62\x6F\x64\x79\x3E\x0A\x3C\x2F\x68\x74\x6D\x6C\x3E"), + Content: []byte("\x3C\x21\x44\x4F\x43\x54\x59\x50\x45\x20\x68\x74\x6D\x6C\x3E\x0A\x3C\x68\x74\x6D\x6C\x20\x6C\x61\x6E\x67\x3D\x22\x65\x6E\x22\x3E\x0A\x20\x20\x3C\x68\x65\x61\x64\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x74\x61\x20\x68\x74\x74\x70\x2D\x65\x71\x75\x69\x76\x3D\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x3B\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x75\x74\x66\x2D\x38\x22\x20\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x76\x69\x65\x77\x70\x6F\x72\x74\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x77\x69\x64\x74\x68\x3D\x64\x65\x76\x69\x63\x65\x2D\x77\x69\x64\x74\x68\x2C\x20\x69\x6E\x69\x74\x69\x61\x6C\x2D\x73\x63\x61\x6C\x65\x3D\x31\x22\x20\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x74\x68\x65\x6D\x65\x2D\x63\x6F\x6C\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x23\x33\x37\x35\x45\x41\x42\x22\x20\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x74\x69\x74\x6C\x65\x3E\x3C\x2F\x74\x69\x74\x6C\x65\x3E\x0A\x20\x20\x20\x20\x3C\x6C\x69\x6E\x6B\x20\x68\x72\x65\x66\x3D\x22\x2F\x69\x6E\x64\x65\x78\x2E\x63\x73\x73\x22\x20\x72\x65\x6C\x3D\x22\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x2F\x63\x73\x73\x22\x20\x6D\x65\x64\x69\x61\x3D\x22\x70\x72\x69\x6E\x74\x22\x20\x6F\x6E\x6C\x6F\x61\x64\x3D\x22\x74\x68\x69\x73\x2E\x6D\x65\x64\x69\x61\x3D\x27\x61\x6C\x6C\x27\x22\x20\x2F\x3E\x0A\x20\x20\x3C\x2F\x68\x65\x61\x64\x3E\x0A\x0A\x20\x20\x3C\x62\x6F\x64\x79\x3E\x0A\x20\x20\x20\x20\x3C\x69\x6D\x67\x0A\x20\x20\x20\x20\x20\x20\x61\x6C\x74\x3D\x22\x22\x0A\x20\x20\x20\x20\x20\x20\x63\x6C\x61\x73\x73\x3D\x22\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x22\x0A\x20\x20\x20\x20\x20\x20\x73\x72\x63\x3D\x22\x2F\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x61\x70\x6C\x65\x2D\x6C\x65\x61\x66\x2D\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x2D\x35\x34\x30\x2E\x6A\x70\x67\x22\x0A\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3D\x22\x39\x32\x30\x22\x0A\x20\x20\x20\x20\x2F\x3E\x0A\x0A\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x2D\x6C\x65\x66\x74\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x22\x3E\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x3C\x2F\x61\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x2D\x72\x69\x67\x68\x74\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x62\x75\x69\x6C\x64\x2E\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x42\x75\x69\x6C\x64\x20\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x73\x68\x75\x4C\x68\x61\x6E\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x47\x69\x74\x48\x75\x62\x20\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x72\x65\x6C\x3D\x22\x6D\x65\x22\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x66\x6F\x73\x73\x74\x6F\x64\x6F\x6E\x2E\x6F\x72\x67\x2F\x40\x73\x68\x75\x4C\x68\x61\x6E\x22\x3E\x4D\x61\x73\x74\x6F\x64\x6F\x6E\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x73\x72\x2E\x68\x74\x20\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x74\x77\x69\x74\x74\x65\x72\x2E\x63\x6F\x6D\x2F\x5F\x73\x68\x75\x4C\x68\x61\x6E\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x54\x77\x69\x74\x74\x65\x72\x20\x3C\x2F\x61\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x0A\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x67\x65\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x3C\x68\x31\x3E\x54\x72\x75\x6E\x6B\x73\x3C\x2F\x68\x31\x3E\x0A\x3C\x70\x3E\x54\x72\x75\x6E\x6B\x73\x20\x69\x73\x20\x61\x20\x47\x6F\x20\x6C\x69\x62\x72\x61\x72\x79\x20\x74\x68\x61\x74\x20\x70\x72\x6F\x76\x69\x64\x65\x20\x48\x54\x54\x50\x20\x73\x65\x72\x76\x69\x63\x65\x20\x77\x69\x74\x68\x20\x77\x65\x62\x20\x75\x73\x65\x72\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x0A\x74\x6F\x20\x74\x65\x73\x74\x20\x48\x54\x54\x50\x20\x61\x6E\x64\x2F\x6F\x72\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x20\x61\x6E\x64\x20\x66\x6F\x72\x20\x6C\x6F\x61\x64\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x48\x54\x54\x50\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x46\x6F\x72\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x48\x54\x54\x50\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x20\x69\x74\x20\x75\x73\x65\x20\x74\x68\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x70\x6B\x67\x2E\x67\x6F\x2E\x64\x65\x76\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x73\x68\x75\x4C\x68\x61\x6E\x2F\x73\x68\x61\x72\x65\x2F\x6C\x69\x62\x2F\x68\x74\x74\x70\x22\x3E\x6C\x69\x62\x2F\x68\x74\x74\x70\x3C\x2F\x61\x3E\x0A\x70\x61\x63\x6B\x61\x67\x65\x20\x61\x73\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E\x74\x2C\x20\x61\x20\x77\x72\x61\x70\x70\x65\x72\x20\x66\x6F\x72\x20\x73\x74\x61\x6E\x64\x61\x72\x64\x20\x47\x6F\x20\x48\x54\x54\x50\x20\x70\x61\x63\x6B\x61\x67\x65\x2E\x0A\x46\x6F\x72\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x20\x69\x74\x20\x75\x73\x65\x20\x74\x68\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x70\x6B\x67\x2E\x67\x6F\x2E\x64\x65\x76\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x73\x68\x75\x4C\x68\x61\x6E\x2F\x73\x68\x61\x72\x65\x2F\x6C\x69\x62\x2F\x77\x65\x62\x73\x6F\x63\x6B\x65\x74\x22\x3E\x6C\x69\x62\x2F\x77\x65\x62\x73\x6F\x63\x6B\x65\x74\x3C\x2F\x61\x3E\x0A\x70\x61\x63\x6B\x61\x67\x65\x20\x61\x73\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E\x74\x2E\x0A\x46\x6F\x72\x20\x74\x68\x65\x20\x6C\x6F\x61\x64\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x77\x65\x20\x75\x73\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x74\x73\x65\x6E\x61\x72\x74\x2F\x76\x65\x67\x65\x74\x61\x22\x3E\x76\x65\x67\x65\x74\x61\x3C\x2F\x61\x3E\x0A\x61\x73\x20\x74\x68\x65\x20\x62\x61\x63\x6B\x65\x6E\x64\x2E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x70\x6B\x67\x2E\x67\x6F\x2E\x64\x65\x76\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x3E\x47\x6F\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x3C\x2F\x61\x3E\x3C\x2F\x70\x3E\x0A\x3C\x68\x32\x3E\x55\x73\x61\x67\x65\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x53\x65\x65\x20\x74\x68\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x2F\x74\x72\x65\x65\x2F\x6D\x61\x69\x6E\x2F\x69\x74\x65\x6D\x2F\x65\x78\x61\x6D\x70\x6C\x65\x2F\x22\x3E\x65\x78\x61\x6D\x70\x6C\x65\x3C\x2F\x61\x3E\x0A\x70\x61\x63\x6B\x61\x67\x65\x20\x6F\x6E\x20\x68\x6F\x77\x20\x74\x6F\x20\x70\x72\x6F\x67\x72\x61\x6D\x6D\x61\x74\x69\x63\x61\x6C\x6C\x79\x20\x75\x73\x65\x20\x61\x6E\x64\x20\x63\x72\x65\x61\x74\x65\x20\x73\x65\x72\x76\x69\x63\x65\x20\x75\x73\x69\x6E\x67\x20\x74\x68\x69\x73\x20\x6D\x6F\x64\x75\x6C\x65\x2C\x0A\x6F\x72\x2C\x3C\x2F\x70\x3E\x0A\x3C\x75\x6C\x3E\x0A\x3C\x6C\x69\x3E\x63\x6C\x6F\x6E\x65\x20\x74\x68\x69\x73\x20\x72\x65\x70\x6F\x73\x69\x74\x6F\x72\x79\x2C\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x65\x78\x65\x63\x75\x74\x65\x20\x3C\x63\x6F\x64\x65\x3E\x6D\x61\x6B\x65\x20\x64\x65\x76\x3C\x2F\x63\x6F\x64\x65\x3E\x2C\x20\x61\x6E\x64\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x6F\x70\x65\x6E\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x3A\x38\x32\x31\x37\x22\x3E\x68\x74\x74\x70\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x3A\x38\x32\x31\x37\x3C\x2F\x61\x3E\x2E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x3C\x68\x32\x3E\x53\x63\x72\x65\x65\x6E\x73\x68\x6F\x74\x73\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x20\x73\x63\x72\x65\x65\x6E\x73\x68\x6F\x74\x20\x64\x69\x73\x70\x6C\x61\x79\x20\x74\x68\x65\x20\x6D\x61\x69\x6E\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x20\x74\x6F\x20\x52\x75\x6E\x20\x6F\x72\x20\x41\x74\x74\x61\x63\x6B\x20\x74\x68\x65\x0A\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x20\x48\x54\x54\x50\x20\x73\x65\x72\x76\x69\x63\x65\x2C\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x3C\x69\x6D\x67\x20\x73\x72\x63\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x2F\x62\x6C\x6F\x62\x2F\x6D\x61\x69\x6E\x2F\x5F\x73\x63\x72\x65\x65\x6E\x73\x68\x6F\x74\x73\x2F\x74\x72\x75\x6E\x6B\x73\x5F\x65\x78\x61\x6D\x70\x6C\x65\x2E\x70\x6E\x67\x22\x20\x61\x6C\x74\x3D\x22\x4D\x61\x69\x6E\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x22\x20\x74\x69\x74\x6C\x65\x3D\x22\x4D\x61\x69\x6E\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x22\x3E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x20\x73\x63\x72\x65\x65\x6E\x73\x68\x6F\x74\x20\x64\x69\x73\x70\x6C\x61\x79\x20\x74\x68\x65\x20\x72\x65\x73\x75\x6C\x74\x20\x6F\x66\x20\x61\x74\x74\x61\x63\x6B\x20\x69\x6E\x20\x74\x77\x6F\x20\x66\x6F\x72\x6D\x73\x2C\x20\x76\x65\x67\x65\x74\x61\x0A\x6D\x65\x74\x72\x69\x63\x73\x20\x61\x6E\x64\x20\x76\x65\x67\x65\x74\x61\x20\x68\x69\x73\x74\x6F\x67\x72\x61\x6D\x2C\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x3C\x69\x6D\x67\x20\x73\x72\x63\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x2F\x62\x6C\x6F\x62\x2F\x6D\x61\x69\x6E\x2F\x5F\x73\x63\x72\x65\x65\x6E\x73\x68\x6F\x74\x73\x2F\x74\x72\x75\x6E\x6B\x73\x5F\x61\x74\x74\x61\x63\x6B\x5F\x72\x65\x73\x75\x6C\x74\x2E\x70\x6E\x67\x22\x20\x61\x6C\x74\x3D\x22\x41\x74\x74\x61\x63\x6B\x20\x72\x65\x73\x75\x6C\x74\x22\x20\x74\x69\x74\x6C\x65\x3D\x22\x41\x74\x74\x61\x63\x6B\x20\x72\x65\x73\x75\x6C\x74\x22\x3E\x3C\x2F\x70\x3E\x0A\x3C\x68\x32\x3E\x57\x65\x62\x20\x75\x73\x65\x72\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x20\x28\x57\x55\x49\x29\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x42\x79\x20\x64\x65\x66\x61\x75\x6C\x74\x2C\x20\x74\x68\x65\x20\x54\x72\x75\x6E\x6B\x73\x20\x75\x73\x65\x72\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x20\x63\x61\x6E\x20\x62\x65\x20\x76\x69\x65\x77\x65\x64\x20\x62\x79\x20\x6F\x70\x65\x6E\x69\x6E\x67\x20\x69\x6E\x20\x62\x72\x6F\x77\x73\x65\x72\x20\x61\x74\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x3A\x38\x32\x31\x37\x22\x3E\x68\x74\x74\x70\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x3A\x38\x32\x31\x37\x3C\x2F\x61\x3E\x2E\x0A\x4F\x6E\x65\x20\x63\x61\x6E\x20\x63\x68\x61\x6E\x67\x65\x20\x61\x64\x64\x72\x65\x73\x73\x20\x74\x68\x72\x6F\x75\x67\x68\x20\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x27\x73\x20\x4C\x69\x73\x74\x65\x6E\x41\x64\x64\x72\x65\x73\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x68\x32\x3E\x46\x69\x6C\x65\x20\x6E\x61\x6D\x65\x20\x66\x6F\x72\x6D\x61\x74\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x45\x61\x63\x68\x20\x61\x74\x74\x61\x63\x6B\x20\x72\x65\x73\x75\x6C\x74\x20\x69\x73\x20\x73\x61\x76\x65\x64\x20\x69\x6E\x20\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x27\x73\x20\x52\x65\x73\x75\x6C\x74\x73\x44\x69\x72\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x0A\x66\x69\x6C\x65\x20\x6E\x61\x6D\x65\x20\x66\x6F\x72\x6D\x61\x74\x2C\x3C\x2F\x70\x3E\x0A\x3C\x70\x72\x65\x3E\x3C\x63\x6F\x64\x65\x3E\x26\x6C\x74\x3B\x54\x61\x72\x67\x65\x74\x2E\x49\x44\x26\x67\x74\x3B\x20\x26\x71\x75\x6F\x74\x3B\x2E\x26\x71\x75\x6F\x74\x3B\x20\x26\x6C\x74\x3B\x48\x74\x74\x70\x54\x61\x72\x67\x65\x74\x2E\x49\x44\x26\x67\x74\x3B\x20\x26\x71\x75\x6F\x74\x3B\x2E\x26\x71\x75\x6F\x74\x3B\x20\x26\x6C\x74\x3B\x44\x61\x74\x65\x54\x69\x6D\x65\x26\x67\x74\x3B\x20\x26\x71\x75\x6F\x74\x3B\x2E\x26\x71\x75\x6F\x74\x3B\x20\x26\x6C\x74\x3B\x52\x61\x74\x65\x26\x67\x74\x3B\x20\x26\x71\x75\x6F\x74\x3B\x78\x26\x71\x75\x6F\x74\x3B\x20\x26\x6C\x74\x3B\x44\x75\x72\x61\x74\x69\x6F\x6E\x26\x67\x74\x3B\x20\x26\x71\x75\x6F\x74\x3B\x2E\x26\x71\x75\x6F\x74\x3B\x20\x26\x6C\x74\x3B\x52\x65\x73\x75\x6C\x74\x73\x53\x75\x66\x66\x69\x78\x26\x67\x74\x3B\x0A\x3C\x2F\x63\x6F\x64\x65\x3E\x3C\x2F\x70\x72\x65\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x26\x71\x75\x6F\x74\x3B\x44\x61\x74\x65\x54\x69\x6D\x65\x26\x71\x75\x6F\x74\x3B\x20\x69\x73\x20\x69\x6E\x20\x74\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x20\x6C\x61\x79\x6F\x75\x74\x2C\x3C\x2F\x70\x3E\x0A\x3C\x70\x72\x65\x3E\x3C\x63\x6F\x64\x65\x3E\x59\x65\x61\x72\x4D\x6F\x6E\x74\x68\x44\x61\x74\x65\x20\x26\x71\x75\x6F\x74\x3B\x5F\x26\x71\x75\x6F\x74\x3B\x20\x48\x6F\x75\x72\x4D\x69\x6E\x75\x74\x65\x53\x65\x63\x6F\x6E\x64\x73\x0A\x3C\x2F\x63\x6F\x64\x65\x3E\x3C\x2F\x70\x72\x65\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x26\x71\x75\x6F\x74\x3B\x52\x65\x73\x75\x6C\x74\x73\x53\x75\x66\x66\x69\x78\x26\x71\x75\x6F\x74\x3B\x20\x69\x73\x20\x74\x68\x65\x20\x6F\x6E\x65\x20\x74\x68\x61\x74\x20\x64\x65\x66\x69\x6E\x65\x64\x20\x69\x6E\x20\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x2E\x3C\x2F\x70\x3E\x0A\x3C\x68\x32\x3E\x44\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x3E\x52\x65\x70\x6F\x73\x69\x74\x6F\x72\x79\x3C\x2F\x61\x3E\x3A\x3A\x20\x4C\x69\x6E\x6B\x20\x74\x6F\x20\x74\x68\x65\x20\x73\x6F\x75\x72\x63\x65\x20\x63\x6F\x64\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6C\x69\x73\x74\x73\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x3E\x4D\x61\x69\x6C\x69\x6E\x67\x20\x6C\x69\x73\x74\x3C\x2F\x61\x3E\x3A\x3A\x20\x4C\x69\x6E\x6B\x20\x74\x6F\x20\x64\x69\x73\x63\x75\x73\x73\x69\x6F\x6E\x20\x61\x6E\x64\x0A\x77\x68\x65\x72\x65\x20\x74\x6F\x20\x73\x65\x6E\x64\x20\x70\x61\x74\x63\x68\x65\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x74\x6F\x64\x6F\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x3E\x49\x73\x73\x75\x65\x73\x3C\x2F\x61\x3E\x3A\x3A\x20\x4C\x69\x6E\x6B\x20\x74\x6F\x20\x72\x65\x70\x6F\x72\x74\x20\x66\x6F\x72\x20\x62\x75\x67\x20\x6F\x72\x0A\x66\x65\x61\x74\x75\x72\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x68\x32\x3E\x43\x72\x65\x64\x69\x74\x73\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x54\x68\x65\x20\x54\x72\x75\x6E\x6B\x73\x20\x69\x63\x6F\x6E\x20\x61\x6E\x64\x20\x69\x6D\x61\x67\x65\x20\x69\x73\x20\x70\x72\x6F\x76\x69\x64\x65\x64\x20\x62\x79\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x73\x70\x72\x69\x74\x65\x72\x73\x2D\x72\x65\x73\x6F\x75\x72\x63\x65\x2E\x63\x6F\x6D\x2F\x22\x3E\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x73\x70\x72\x69\x74\x65\x72\x73\x2D\x72\x65\x73\x6F\x75\x72\x63\x65\x2E\x63\x6F\x6D\x2F\x3C\x2F\x61\x3E\x2E\x3C\x2F\x70\x3E\x0A\x3C\x68\x32\x3E\x4C\x69\x63\x65\x6E\x73\x65\x3C\x2F\x68\x32\x3E\x0A\x3C\x70\x3E\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x32\x30\x32\x31\x20\x4D\x2E\x20\x53\x68\x75\x6C\x68\x61\x6E\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x6D\x61\x69\x6C\x74\x6F\x3A\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x22\x3E\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x3C\x2F\x61\x3E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x54\x68\x69\x73\x20\x70\x72\x6F\x67\x72\x61\x6D\x20\x69\x73\x20\x66\x72\x65\x65\x20\x73\x6F\x66\x74\x77\x61\x72\x65\x3A\x20\x79\x6F\x75\x20\x63\x61\x6E\x20\x72\x65\x64\x69\x73\x74\x72\x69\x62\x75\x74\x65\x20\x69\x74\x20\x61\x6E\x64\x2F\x6F\x72\x20\x6D\x6F\x64\x69\x66\x79\x20\x69\x74\x20\x75\x6E\x64\x65\x72\x0A\x74\x68\x65\x20\x74\x65\x72\x6D\x73\x20\x6F\x66\x20\x74\x68\x65\x20\x47\x4E\x55\x20\x47\x65\x6E\x65\x72\x61\x6C\x20\x50\x75\x62\x6C\x69\x63\x20\x4C\x69\x63\x65\x6E\x73\x65\x20\x61\x73\x20\x70\x75\x62\x6C\x69\x73\x68\x65\x64\x20\x62\x79\x20\x74\x68\x65\x20\x46\x72\x65\x65\x20\x53\x6F\x66\x74\x77\x61\x72\x65\x0A\x46\x6F\x75\x6E\x64\x61\x74\x69\x6F\x6E\x2C\x20\x65\x69\x74\x68\x65\x72\x20\x76\x65\x72\x73\x69\x6F\x6E\x20\x33\x20\x6F\x66\x20\x74\x68\x65\x20\x4C\x69\x63\x65\x6E\x73\x65\x2C\x20\x6F\x72\x20\x28\x61\x74\x20\x79\x6F\x75\x72\x20\x6F\x70\x74\x69\x6F\x6E\x29\x20\x61\x6E\x79\x20\x6C\x61\x74\x65\x72\x0A\x76\x65\x72\x73\x69\x6F\x6E\x2E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x54\x68\x69\x73\x20\x70\x72\x6F\x67\x72\x61\x6D\x20\x69\x73\x20\x64\x69\x73\x74\x72\x69\x62\x75\x74\x65\x64\x20\x69\x6E\x20\x74\x68\x65\x20\x68\x6F\x70\x65\x20\x74\x68\x61\x74\x20\x69\x74\x20\x77\x69\x6C\x6C\x20\x62\x65\x20\x75\x73\x65\x66\x75\x6C\x2C\x20\x62\x75\x74\x20\x57\x49\x54\x48\x4F\x55\x54\x0A\x41\x4E\x59\x20\x57\x41\x52\x52\x41\x4E\x54\x59\x3B\x20\x77\x69\x74\x68\x6F\x75\x74\x20\x65\x76\x65\x6E\x20\x74\x68\x65\x20\x69\x6D\x70\x6C\x69\x65\x64\x20\x77\x61\x72\x72\x61\x6E\x74\x79\x20\x6F\x66\x20\x4D\x45\x52\x43\x48\x41\x4E\x54\x41\x42\x49\x4C\x49\x54\x59\x20\x6F\x72\x20\x46\x49\x54\x4E\x45\x53\x53\x0A\x46\x4F\x52\x20\x41\x20\x50\x41\x52\x54\x49\x43\x55\x4C\x41\x52\x20\x50\x55\x52\x50\x4F\x53\x45\x2E\x20\x20\x53\x65\x65\x20\x74\x68\x65\x20\x47\x4E\x55\x20\x47\x65\x6E\x65\x72\x61\x6C\x20\x50\x75\x62\x6C\x69\x63\x20\x4C\x69\x63\x65\x6E\x73\x65\x20\x66\x6F\x72\x20\x6D\x6F\x72\x65\x0A\x64\x65\x74\x61\x69\x6C\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x70\x3E\x59\x6F\x75\x20\x73\x68\x6F\x75\x6C\x64\x20\x68\x61\x76\x65\x20\x72\x65\x63\x65\x69\x76\x65\x64\x20\x61\x20\x63\x6F\x70\x79\x20\x6F\x66\x20\x74\x68\x65\x20\x47\x4E\x55\x20\x47\x65\x6E\x65\x72\x61\x6C\x20\x50\x75\x62\x6C\x69\x63\x20\x4C\x69\x63\x65\x6E\x73\x65\x20\x61\x6C\x6F\x6E\x67\x20\x77\x69\x74\x68\x0A\x74\x68\x69\x73\x20\x70\x72\x6F\x67\x72\x61\x6D\x2E\x20\x20\x49\x66\x20\x6E\x6F\x74\x2C\x20\x73\x65\x65\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x67\x6E\x75\x2E\x6F\x72\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x73\x2F\x22\x3E\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x67\x6E\x75\x2E\x6F\x72\x67\x2F\x6C\x69\x63\x65\x6E\x73\x65\x73\x2F\x3C\x2F\x61\x3E\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x0A\x0A\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x20\x32\x30\x30\x37\x2D\x32\x30\x32\x33\x2C\x20\x53\x68\x75\x6C\x68\x61\x6E\x20\x26\x6C\x74\x3B\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x26\x67\x74\x3B\x2E\x20\x41\x6C\x6C\x20\x72\x69\x67\x68\x74\x73\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x73\x65\x72\x76\x65\x64\x2E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x50\x6F\x77\x65\x72\x65\x64\x20\x62\x79\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x63\x69\x69\x67\x6F\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x63\x69\x69\x67\x6F\x3C\x2F\x61\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x3C\x2F\x62\x6F\x64\x79\x3E\x0A\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"), } node.SetMode(420) - node.SetModTimeUnix(1684221767, 53609486) + node.SetModTimeUnix(1697705988, 243151169) node.SetName("README.html") - node.SetSize(7863) + node.SetSize(5075) return node } @@ -91,12 +91,12 @@ func generate__www_doc_SPECS_html() *memfs.Node { Path: "/doc/SPECS.html", ContentType: "text/html; charset=utf-8", GenFuncName: "generate__www_doc_SPECS_html", - Content: []byte("\x3C\x21\x44\x4F\x43\x54\x59\x50\x45\x20\x68\x74\x6D\x6C\x3E\x0A\x3C\x68\x74\x6D\x6C\x3E\x0A\x09\x3C\x68\x65\x61\x64\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x68\x74\x74\x70\x2D\x65\x71\x75\x69\x76\x3D\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x3B\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x75\x74\x66\x2D\x38\x22\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x76\x69\x65\x77\x70\x6F\x72\x74\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x77\x69\x64\x74\x68\x3D\x64\x65\x76\x69\x63\x65\x2D\x77\x69\x64\x74\x68\x2C\x20\x69\x6E\x69\x74\x69\x61\x6C\x2D\x73\x63\x61\x6C\x65\x3D\x31\x22\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x74\x68\x65\x6D\x65\x2D\x63\x6F\x6C\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x23\x33\x37\x35\x45\x41\x42\x22\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x67\x65\x6E\x65\x72\x61\x74\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x61\x73\x63\x69\x69\x64\x6F\x63\x74\x6F\x72\x2D\x67\x6F\x20\x30\x2E\x34\x2E\x31\x22\x3E\x0A\x09\x09\x3C\x74\x69\x74\x6C\x65\x3E\x54\x72\x75\x6E\x6B\x73\x3C\x2F\x74\x69\x74\x6C\x65\x3E\x0A\x09\x09\x3C\x73\x74\x79\x6C\x65\x3E\x0A\x09\x09\x0A\x62\x6F\x64\x79\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x41\x72\x69\x61\x6C\x2C\x20\x73\x61\x6E\x73\x2D\x73\x65\x72\x69\x66\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x66\x66\x66\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x33\x3B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x63\x65\x6E\x74\x65\x72\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x32\x32\x32\x3B\x0A\x7D\x0A\x70\x72\x65\x2C\x0A\x63\x6F\x64\x65\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x4D\x65\x6E\x6C\x6F\x2C\x20\x6D\x6F\x6E\x6F\x73\x70\x61\x63\x65\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x30\x2E\x38\x37\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x70\x72\x65\x20\x7B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x34\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x2D\x78\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x65\x66\x65\x66\x65\x66\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x2E\x36\x32\x35\x72\x65\x6D\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x72\x61\x64\x69\x75\x73\x3A\x20\x30\x2E\x33\x31\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x61\x20\x7B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x61\x3A\x68\x6F\x76\x65\x72\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x20\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65\x3B\x0A\x7D\x0A\x0A\x70\x2C\x0A\x6C\x69\x20\x7B\x0A\x09\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x35\x30\x72\x65\x6D\x3B\x0A\x09\x77\x6F\x72\x64\x2D\x77\x72\x61\x70\x3A\x20\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64\x3B\x0A\x7D\x0A\x6C\x69\x20\x70\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x32\x70\x78\x3B\x0A\x7D\x0A\x70\x2C\x0A\x70\x72\x65\x2C\x0A\x75\x6C\x2C\x0A\x6F\x6C\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x68\x31\x2C\x0A\x68\x32\x2C\x0A\x68\x33\x2C\x0A\x68\x34\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x20\x30\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x7D\x0A\x68\x31\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x37\x35\x72\x65\x6D\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x3B\x0A\x7D\x0A\x68\x31\x20\x2E\x74\x65\x78\x74\x2D\x6D\x75\x74\x65\x64\x20\x7B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x37\x37\x37\x3B\x0A\x7D\x0A\x68\x32\x20\x7B\x0A\x09\x63\x6C\x65\x61\x72\x3A\x20\x72\x69\x67\x68\x74\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x65\x30\x65\x62\x66\x35\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x2E\x35\x72\x65\x6D\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x32\x35\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x6E\x6F\x72\x6D\x61\x6C\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x2D\x77\x72\x61\x70\x3A\x20\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64\x3B\x0A\x7D\x0A\x68\x32\x20\x61\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x7D\x0A\x68\x33\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x32\x35\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x2D\x77\x72\x61\x70\x3A\x20\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64\x3B\x0A\x7D\x0A\x68\x33\x2C\x0A\x68\x34\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x20\x30\x2E\x33\x31\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x68\x34\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x68\x32\x20\x3E\x20\x73\x70\x61\x6E\x2C\x0A\x68\x33\x20\x3E\x20\x73\x70\x61\x6E\x20\x7B\x0A\x09\x66\x6C\x6F\x61\x74\x3A\x20\x72\x69\x67\x68\x74\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x20\x32\x35\x70\x78\x20\x30\x20\x30\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x6E\x6F\x72\x6D\x61\x6C\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x35\x32\x37\x39\x63\x37\x3B\x0A\x7D\x0A\x0A\x64\x6C\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x64\x74\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x0A\x7D\x0A\x64\x64\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x20\x30\x20\x30\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2F\x2A\x2A\x0A\x20\x2A\x20\x43\x75\x73\x74\x6F\x6D\x20\x63\x6C\x61\x73\x73\x65\x73\x20\x66\x6F\x72\x20\x70\x61\x67\x65\x73\x0A\x20\x2A\x2F\x0A\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x7B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x63\x6F\x6C\x6C\x61\x70\x73\x65\x3A\x20\x73\x65\x70\x61\x72\x61\x74\x65\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x3A\x20\x30\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x30\x30\x25\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x63\x65\x6E\x74\x65\x72\x3B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x32\x30\x70\x78\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x69\x6D\x67\x20\x7B\x0A\x09\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x2E\x74\x69\x74\x6C\x65\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x22\x4F\x70\x65\x6E\x20\x53\x61\x6E\x73\x22\x2C\x22\x44\x65\x6A\x61\x56\x75\x20\x53\x61\x6E\x73\x22\x2C\x73\x61\x6E\x73\x2D\x73\x65\x72\x69\x66\x3B\x0A\x09\x74\x65\x78\x74\x2D\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D\x3A\x20\x75\x70\x70\x65\x72\x63\x61\x73\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x63\x6F\x6E\x74\x65\x6E\x74\x20\x7B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x2D\x6C\x65\x66\x74\x3A\x20\x31\x2E\x31\x32\x35\x65\x6D\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x2D\x72\x69\x67\x68\x74\x3A\x20\x31\x2E\x32\x35\x65\x6D\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x6C\x65\x66\x74\x3A\x20\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x23\x64\x64\x64\x64\x64\x66\x3B\x0A\x09\x77\x6F\x72\x64\x2D\x77\x72\x61\x70\x3A\x20\x61\x6E\x79\x77\x68\x65\x72\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x63\x6F\x6E\x74\x65\x6E\x74\x3E\x3A\x6C\x61\x73\x74\x2D\x63\x68\x69\x6C\x64\x3E\x3A\x6C\x61\x73\x74\x2D\x63\x68\x69\x6C\x64\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x30\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x6E\x6F\x74\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x77\x68\x69\x74\x65\x73\x6D\x6F\x6B\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x74\x69\x70\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x61\x7A\x75\x72\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x69\x6D\x70\x6F\x72\x74\x61\x6E\x74\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x68\x6F\x6E\x65\x79\x64\x65\x77\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x63\x61\x75\x74\x69\x6F\x6E\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x6C\x61\x76\x65\x6E\x64\x65\x72\x62\x75\x73\x68\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x77\x61\x72\x6E\x69\x6E\x67\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x6D\x69\x73\x74\x79\x72\x6F\x73\x65\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x65\x30\x65\x62\x66\x35\x3B\x0A\x09\x68\x65\x69\x67\x68\x74\x3A\x20\x34\x72\x65\x6D\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x68\x69\x64\x64\x65\x6E\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x2C\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x7B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x31\x2E\x33\x31\x33\x72\x65\x6D\x20\x30\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x6E\x6F\x72\x6D\x61\x6C\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x20\x7B\x0A\x09\x66\x6C\x6F\x61\x74\x3A\x20\x6C\x65\x66\x74\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x20\x61\x20\x7B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x32\x32\x32\x3B\x0A\x09\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x20\x2E\x68\x65\x61\x64\x65\x72\x2D\x6C\x6F\x67\x6F\x20\x7B\x0A\x09\x68\x65\x69\x67\x68\x74\x3A\x20\x32\x72\x65\x6D\x3B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x35\x2E\x31\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x7B\x0A\x09\x66\x6C\x6F\x61\x74\x3A\x20\x72\x69\x67\x68\x74\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x61\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x2E\x36\x32\x35\x72\x65\x6D\x20\x30\x2E\x31\x32\x35\x72\x65\x6D\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x2E\x36\x32\x35\x72\x65\x6D\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x77\x68\x69\x74\x65\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x3A\x20\x30\x2E\x30\x36\x32\x35\x72\x65\x6D\x20\x73\x6F\x6C\x69\x64\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x72\x61\x64\x69\x75\x73\x3A\x20\x35\x70\x78\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x66\x6F\x72\x6D\x20\x7B\x0A\x09\x64\x69\x73\x70\x6C\x61\x79\x3A\x20\x69\x6E\x6C\x69\x6E\x65\x2D\x62\x6C\x6F\x63\x6B\x3B\x0A\x7D\x0A\x0A\x2E\x70\x61\x67\x65\x20\x7B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x30\x30\x25\x3B\x0A\x7D\x0A\x0A\x2E\x70\x61\x67\x65\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x2C\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x2C\x0A\x2E\x66\x6F\x6F\x74\x65\x72\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x6C\x65\x66\x74\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x72\x69\x67\x68\x74\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x35\x39\x2E\x33\x38\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x70\x61\x67\x65\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x6C\x65\x66\x74\x3B\x0A\x7D\x0A\x0A\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x2E\x6D\x65\x74\x61\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x74\x79\x6C\x65\x3A\x20\x69\x74\x61\x6C\x69\x63\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x66\x6F\x6F\x74\x65\x72\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x63\x65\x6E\x74\x65\x72\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x36\x36\x36\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x30\x2E\x38\x37\x35\x72\x65\x6D\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x32\x2E\x35\x72\x65\x6D\x20\x30\x3B\x0A\x7D\x0A\x0A\x2E\x75\x6C\x69\x73\x74\x20\x6C\x69\x20\x2E\x70\x61\x72\x61\x67\x72\x61\x70\x68\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x31\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x75\x6C\x69\x73\x74\x20\x6C\x69\x20\x2E\x70\x61\x72\x61\x67\x72\x61\x70\x68\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x31\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2F\x2A\x2A\x20\x43\x75\x73\x74\x6F\x6D\x20\x63\x6C\x61\x73\x73\x65\x73\x20\x2A\x2F\x0A\x23\x74\x6F\x63\x74\x69\x74\x6C\x65\x20\x7B\x0A\x09\x64\x69\x73\x70\x6C\x61\x79\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x23\x74\x6F\x63\x20\x6C\x69\x20\x7B\x0A\x09\x6C\x69\x73\x74\x2D\x73\x74\x79\x6C\x65\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x23\x74\x6F\x63\x20\x75\x6C\x20\x2E\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x31\x20\x7B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x70\x78\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x34\x70\x78\x3B\x0A\x7D\x0A\x23\x74\x6F\x63\x20\x75\x6C\x20\x2E\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x32\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x34\x70\x78\x3B\x0A\x7D\x0A\x0A\x40\x6D\x65\x64\x69\x61\x20\x73\x63\x72\x65\x65\x6E\x20\x61\x6E\x64\x20\x28\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x39\x39\x32\x70\x78\x29\x20\x7B\x0A\x09\x23\x74\x6F\x63\x20\x7B\x0A\x09\x09\x61\x6C\x6C\x3A\x20\x75\x6E\x73\x65\x74\x3B\x0A\x09\x7D\x0A\x7D\x0A\x0A\x09\x09\x3C\x2F\x73\x74\x79\x6C\x65\x3E\x0A\x09\x3C\x2F\x68\x65\x61\x64\x3E\x0A\x09\x3C\x62\x6F\x64\x79\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x22\x3E\x0A\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x22\x3E\x0A\x09\x09\x09\x09\x09\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x22\x3E\x54\x72\x75\x6E\x6B\x73\x3C\x2F\x61\x3E\x0A\x09\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6D\x65\x6E\x75\x22\x3E\x0A\x09\x09\x09\x09\x09\x3C\x66\x6F\x72\x6D\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x74\x65\x6D\x22\x20\x61\x63\x74\x69\x6F\x6E\x3D\x22\x2F\x5F\x69\x6E\x74\x65\x72\x6E\x61\x6C\x2F\x73\x65\x61\x72\x63\x68\x22\x3E\x0A\x09\x09\x09\x09\x09\x09\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x20\x6E\x61\x6D\x65\x3D\x22\x71\x22\x20\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72\x3D\x22\x53\x65\x61\x72\x63\x68\x22\x20\x2F\x3E\x0A\x09\x09\x09\x09\x09\x3C\x2F\x66\x6F\x72\x6D\x3E\x0A\x09\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x67\x65\x22\x3E\x0A\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x68\x65\x61\x64\x65\x72\x22\x3E\x0A\x3C\x68\x31\x3E\x54\x72\x75\x6E\x6B\x73\x3C\x2F\x68\x31\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x74\x6F\x63\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x63\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x74\x6F\x63\x74\x69\x74\x6C\x65\x22\x3E\x54\x61\x62\x6C\x65\x20\x6F\x66\x20\x43\x6F\x6E\x74\x65\x6E\x74\x73\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x75\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x31\x22\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x73\x5F\x31\x22\x3E\x53\x63\x68\x65\x6D\x61\x73\x3C\x2F\x61\x3E\x0A\x3C\x75\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x32\x22\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x68\x74\x74\x70\x5F\x61\x70\x69\x22\x3E\x48\x54\x54\x50\x20\x41\x50\x49\x73\x3C\x2F\x61\x3E\x0A\x3C\x75\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x32\x22\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x67\x65\x74\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x47\x65\x74\x20\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x70\x72\x65\x61\x6D\x62\x6C\x65\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x54\x72\x75\x6E\x6B\x73\x20\x69\x73\x20\x61\x20\x47\x6F\x20\x6C\x69\x62\x72\x61\x72\x79\x20\x74\x68\x61\x74\x20\x70\x72\x6F\x76\x69\x64\x65\x20\x48\x54\x54\x50\x20\x73\x65\x72\x76\x69\x63\x65\x20\x77\x69\x74\x68\x20\x77\x65\x62\x20\x75\x73\x65\x72\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x0A\x74\x6F\x20\x74\x65\x73\x74\x20\x48\x54\x54\x50\x20\x61\x6E\x64\x2F\x6F\x72\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x20\x61\x6E\x64\x20\x66\x6F\x72\x20\x6C\x6F\x61\x64\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x48\x54\x54\x50\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x46\x6F\x72\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x48\x54\x54\x50\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x20\x69\x74\x20\x75\x73\x65\x20\x74\x68\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x70\x6B\x67\x2E\x67\x6F\x2E\x64\x65\x76\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x73\x68\x75\x4C\x68\x61\x6E\x2F\x73\x68\x61\x72\x65\x2F\x6C\x69\x62\x2F\x68\x74\x74\x70\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x6C\x69\x62\x2F\x68\x74\x74\x70\x3C\x2F\x61\x3E\x0A\x70\x61\x63\x6B\x61\x67\x65\x20\x61\x73\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E\x74\x2C\x20\x61\x20\x77\x72\x61\x70\x70\x65\x72\x20\x66\x6F\x72\x20\x73\x74\x61\x6E\x64\x61\x72\x64\x20\x47\x6F\x20\x48\x54\x54\x50\x20\x70\x61\x63\x6B\x61\x67\x65\x2E\x0A\x46\x6F\x72\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x20\x69\x74\x20\x75\x73\x65\x20\x74\x68\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x70\x6B\x67\x2E\x67\x6F\x2E\x64\x65\x76\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x73\x68\x75\x4C\x68\x61\x6E\x2F\x73\x68\x61\x72\x65\x2F\x6C\x69\x62\x2F\x77\x65\x62\x73\x6F\x63\x6B\x65\x74\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x6C\x69\x62\x2F\x77\x65\x62\x73\x6F\x63\x6B\x65\x74\x3C\x2F\x61\x3E\x0A\x70\x61\x63\x6B\x61\x67\x65\x20\x61\x73\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E\x74\x2E\x0A\x46\x6F\x72\x20\x74\x68\x65\x20\x6C\x6F\x61\x64\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x77\x65\x20\x75\x73\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x74\x73\x65\x6E\x61\x72\x74\x2F\x76\x65\x67\x65\x74\x61\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x76\x65\x67\x65\x74\x61\x3C\x2F\x61\x3E\x0A\x61\x73\x20\x74\x68\x65\x20\x62\x61\x63\x6B\x65\x6E\x64\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x54\x68\x69\x73\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x20\x70\x72\x6F\x76\x69\x64\x65\x20\x74\x68\x65\x20\x64\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x20\x6F\x66\x20\x54\x72\x75\x6E\x6B\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x73\x63\x68\x65\x6D\x61\x73\x5F\x31\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x73\x5F\x31\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x73\x5F\x31\x22\x3E\x53\x63\x68\x65\x6D\x61\x73\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x32\x22\x3E\x0A\x3C\x68\x33\x20\x69\x64\x3D\x22\x73\x63\x68\x65\x6D\x61\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x73\x74\x69\x6E\x67\x62\x6C\x6F\x63\x6B\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x70\x72\x65\x3E\x7B\x0A\x09\x22\x4C\x69\x73\x74\x65\x6E\x41\x64\x64\x72\x65\x73\x73\x22\x3A\x20\x73\x74\x72\x69\x6E\x67\x2C\x0A\x09\x22\x4D\x61\x78\x41\x74\x74\x61\x63\x6B\x44\x75\x72\x61\x74\x69\x6F\x6E\x22\x3A\x20\x6E\x75\x6D\x62\x65\x72\x2C\x0A\x09\x22\x4D\x61\x78\x41\x74\x74\x61\x63\x6B\x52\x61\x74\x65\x22\x3A\x20\x6E\x75\x6D\x62\x65\x72\x2C\x0A\x09\x22\x52\x65\x73\x75\x6C\x74\x73\x44\x69\x72\x22\x3A\x20\x73\x74\x72\x69\x6E\x67\x2C\x0A\x09\x22\x52\x65\x73\x75\x6C\x74\x73\x53\x75\x66\x66\x69\x78\x22\x3A\x20\x73\x74\x72\x69\x6E\x67\x2C\x0A\x09\x22\x41\x74\x74\x61\x63\x6B\x52\x75\x6E\x6E\x69\x6E\x67\x22\x3A\x20\x26\x6C\x74\x3B\x41\x74\x74\x61\x63\x6B\x52\x75\x6E\x6E\x69\x6E\x67\x26\x67\x74\x3B\x0A\x7D\x3C\x2F\x70\x72\x65\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x68\x74\x74\x70\x5F\x61\x70\x69\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x68\x74\x74\x70\x5F\x61\x70\x69\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x68\x74\x74\x70\x5F\x61\x70\x69\x22\x3E\x48\x54\x54\x50\x20\x41\x50\x49\x73\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x41\x6C\x6C\x20\x6F\x66\x20\x48\x54\x54\x50\x20\x41\x50\x49\x73\x20\x72\x65\x74\x75\x72\x6E\x20\x61\x20\x4A\x53\x4F\x4E\x20\x6F\x62\x6A\x65\x63\x74\x20\x75\x73\x69\x6E\x67\x20\x74\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x20\x73\x63\x68\x65\x6D\x61\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x73\x74\x69\x6E\x67\x62\x6C\x6F\x63\x6B\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x70\x72\x65\x3E\x7B\x0A\x09\x22\x63\x6F\x64\x65\x22\x3A\x20\x6E\x75\x6D\x62\x65\x72\x2C\x0A\x09\x22\x6D\x65\x73\x73\x61\x67\x65\x22\x3A\x20\x73\x74\x72\x69\x6E\x67\x2C\x0A\x09\x22\x64\x61\x74\x61\x22\x3A\x20\x61\x6E\x79\x0A\x7D\x3C\x2F\x70\x72\x65\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x75\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x75\x6C\x3E\x0A\x3C\x6C\x69\x3E\x0A\x3C\x70\x3E\x3C\x63\x6F\x64\x65\x3E\x63\x6F\x64\x65\x3C\x2F\x63\x6F\x64\x65\x3E\x20\x66\x69\x65\x6C\x64\x20\x63\x6F\x6E\x74\x61\x69\x6E\x73\x20\x74\x68\x65\x20\x48\x54\x54\x50\x20\x73\x74\x61\x74\x75\x73\x20\x63\x6F\x64\x65\x3C\x2F\x70\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x0A\x3C\x70\x3E\x3C\x63\x6F\x64\x65\x3E\x6D\x65\x73\x73\x61\x67\x65\x3C\x2F\x63\x6F\x64\x65\x3E\x20\x66\x69\x65\x6C\x64\x20\x63\x6F\x6E\x74\x61\x69\x6E\x73\x20\x74\x68\x65\x20\x65\x72\x72\x6F\x72\x20\x6D\x65\x73\x73\x61\x67\x65\x20\x66\x6F\x72\x20\x48\x54\x54\x50\x20\x73\x74\x61\x74\x75\x73\x20\x34\x78\x78\x20\x6F\x72\x20\x35\x78\x78\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x0A\x3C\x70\x3E\x3C\x63\x6F\x64\x65\x3E\x64\x61\x74\x61\x3C\x2F\x63\x6F\x64\x65\x3E\x20\x66\x69\x65\x6C\x64\x20\x63\x6F\x6E\x74\x61\x69\x6E\x73\x20\x74\x68\x65\x20\x61\x63\x74\x75\x61\x6C\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x20\x64\x61\x74\x61\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x32\x22\x3E\x0A\x3C\x68\x33\x20\x69\x64\x3D\x22\x67\x65\x74\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x67\x65\x74\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x67\x65\x74\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x47\x65\x74\x20\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x48\x54\x54\x50\x20\x41\x50\x49\x20\x74\x6F\x20\x67\x65\x74\x20\x74\x68\x65\x20\x63\x75\x72\x72\x65\x6E\x74\x20\x54\x72\x75\x6E\x6B\x73\x20\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x3C\x73\x74\x72\x6F\x6E\x67\x3E\x52\x65\x71\x75\x65\x73\x74\x3C\x2F\x73\x74\x72\x6F\x6E\x67\x3E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x73\x74\x69\x6E\x67\x62\x6C\x6F\x63\x6B\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x70\x72\x65\x3E\x47\x45\x54\x20\x2F\x5F\x74\x72\x75\x6E\x6B\x73\x2F\x61\x70\x69\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x3C\x2F\x70\x72\x65\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x3C\x73\x74\x72\x6F\x6E\x67\x3E\x52\x65\x73\x70\x6F\x6E\x73\x65\x3C\x2F\x73\x74\x72\x6F\x6E\x67\x3E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x4F\x6E\x20\x73\x75\x63\x63\x65\x73\x73\x2C\x20\x69\x74\x20\x77\x69\x6C\x6C\x20\x72\x65\x74\x75\x72\x6E\x20\x74\x68\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x20\x73\x63\x68\x65\x6D\x61\x3C\x2F\x61\x3E\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x74\x65\x72\x2D\x74\x65\x78\x74\x22\x3E\x0A\x4C\x61\x73\x74\x20\x75\x70\x64\x61\x74\x65\x64\x20\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x20\x31\x33\x3A\x34\x38\x3A\x30\x37\x20\x2B\x30\x37\x30\x30\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x09\x09\x09\x50\x6F\x77\x65\x72\x65\x64\x20\x62\x79\x20\x3C\x61\x0A\x09\x09\x09\x09\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x63\x69\x69\x67\x6F\x22\x0A\x09\x09\x09\x3E\x0A\x09\x09\x09\x09\x63\x69\x69\x67\x6F\x0A\x09\x09\x09\x3C\x2F\x61\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x3C\x2F\x62\x6F\x64\x79\x3E\x0A\x3C\x2F\x68\x74\x6D\x6C\x3E"), + Content: []byte("\x3C\x21\x44\x4F\x43\x54\x59\x50\x45\x20\x68\x74\x6D\x6C\x3E\x0A\x3C\x68\x74\x6D\x6C\x20\x6C\x61\x6E\x67\x3D\x22\x65\x6E\x22\x3E\x0A\x20\x20\x3C\x68\x65\x61\x64\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x74\x61\x20\x68\x74\x74\x70\x2D\x65\x71\x75\x69\x76\x3D\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x3B\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x75\x74\x66\x2D\x38\x22\x20\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x76\x69\x65\x77\x70\x6F\x72\x74\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x77\x69\x64\x74\x68\x3D\x64\x65\x76\x69\x63\x65\x2D\x77\x69\x64\x74\x68\x2C\x20\x69\x6E\x69\x74\x69\x61\x6C\x2D\x73\x63\x61\x6C\x65\x3D\x31\x22\x20\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x74\x68\x65\x6D\x65\x2D\x63\x6F\x6C\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x23\x33\x37\x35\x45\x41\x42\x22\x20\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x74\x69\x74\x6C\x65\x3E\x54\x72\x75\x6E\x6B\x73\x3C\x2F\x74\x69\x74\x6C\x65\x3E\x0A\x20\x20\x20\x20\x3C\x6C\x69\x6E\x6B\x20\x68\x72\x65\x66\x3D\x22\x2F\x69\x6E\x64\x65\x78\x2E\x63\x73\x73\x22\x20\x72\x65\x6C\x3D\x22\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x2F\x63\x73\x73\x22\x20\x6D\x65\x64\x69\x61\x3D\x22\x70\x72\x69\x6E\x74\x22\x20\x6F\x6E\x6C\x6F\x61\x64\x3D\x22\x74\x68\x69\x73\x2E\x6D\x65\x64\x69\x61\x3D\x27\x61\x6C\x6C\x27\x22\x20\x2F\x3E\x0A\x20\x20\x3C\x2F\x68\x65\x61\x64\x3E\x0A\x0A\x20\x20\x3C\x62\x6F\x64\x79\x3E\x0A\x20\x20\x20\x20\x3C\x69\x6D\x67\x0A\x20\x20\x20\x20\x20\x20\x61\x6C\x74\x3D\x22\x22\x0A\x20\x20\x20\x20\x20\x20\x63\x6C\x61\x73\x73\x3D\x22\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x22\x0A\x20\x20\x20\x20\x20\x20\x73\x72\x63\x3D\x22\x2F\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x61\x70\x6C\x65\x2D\x6C\x65\x61\x66\x2D\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x2D\x35\x34\x30\x2E\x6A\x70\x67\x22\x0A\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3D\x22\x39\x32\x30\x22\x0A\x20\x20\x20\x20\x2F\x3E\x0A\x0A\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x2D\x6C\x65\x66\x74\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x22\x3E\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x3C\x2F\x61\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x2D\x72\x69\x67\x68\x74\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x62\x75\x69\x6C\x64\x2E\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x42\x75\x69\x6C\x64\x20\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x73\x68\x75\x4C\x68\x61\x6E\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x47\x69\x74\x48\x75\x62\x20\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x72\x65\x6C\x3D\x22\x6D\x65\x22\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x66\x6F\x73\x73\x74\x6F\x64\x6F\x6E\x2E\x6F\x72\x67\x2F\x40\x73\x68\x75\x4C\x68\x61\x6E\x22\x3E\x4D\x61\x73\x74\x6F\x64\x6F\x6E\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x73\x72\x2E\x68\x74\x20\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x74\x77\x69\x74\x74\x65\x72\x2E\x63\x6F\x6D\x2F\x5F\x73\x68\x75\x4C\x68\x61\x6E\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x54\x77\x69\x74\x74\x65\x72\x20\x3C\x2F\x61\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x0A\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x67\x65\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x68\x65\x61\x64\x65\x72\x22\x3E\x0A\x3C\x68\x31\x3E\x54\x72\x75\x6E\x6B\x73\x3C\x2F\x68\x31\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x74\x6F\x63\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x63\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x74\x6F\x63\x74\x69\x74\x6C\x65\x22\x3E\x54\x61\x62\x6C\x65\x20\x6F\x66\x20\x43\x6F\x6E\x74\x65\x6E\x74\x73\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x75\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x31\x22\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x73\x5F\x31\x22\x3E\x53\x63\x68\x65\x6D\x61\x73\x3C\x2F\x61\x3E\x0A\x3C\x75\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x32\x22\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x68\x74\x74\x70\x5F\x61\x70\x69\x22\x3E\x48\x54\x54\x50\x20\x41\x50\x49\x73\x3C\x2F\x61\x3E\x0A\x3C\x75\x6C\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x32\x22\x3E\x0A\x3C\x6C\x69\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x67\x65\x74\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x47\x65\x74\x20\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x3C\x2F\x61\x3E\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x70\x72\x65\x61\x6D\x62\x6C\x65\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x54\x72\x75\x6E\x6B\x73\x20\x69\x73\x20\x61\x20\x47\x6F\x20\x6C\x69\x62\x72\x61\x72\x79\x20\x74\x68\x61\x74\x20\x70\x72\x6F\x76\x69\x64\x65\x20\x48\x54\x54\x50\x20\x73\x65\x72\x76\x69\x63\x65\x20\x77\x69\x74\x68\x20\x77\x65\x62\x20\x75\x73\x65\x72\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x0A\x74\x6F\x20\x74\x65\x73\x74\x20\x48\x54\x54\x50\x20\x61\x6E\x64\x2F\x6F\x72\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x20\x61\x6E\x64\x20\x66\x6F\x72\x20\x6C\x6F\x61\x64\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x48\x54\x54\x50\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x46\x6F\x72\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x48\x54\x54\x50\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x20\x69\x74\x20\x75\x73\x65\x20\x74\x68\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x70\x6B\x67\x2E\x67\x6F\x2E\x64\x65\x76\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x73\x68\x75\x4C\x68\x61\x6E\x2F\x73\x68\x61\x72\x65\x2F\x6C\x69\x62\x2F\x68\x74\x74\x70\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x6C\x69\x62\x2F\x68\x74\x74\x70\x3C\x2F\x61\x3E\x0A\x70\x61\x63\x6B\x61\x67\x65\x20\x61\x73\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E\x74\x2C\x20\x61\x20\x77\x72\x61\x70\x70\x65\x72\x20\x66\x6F\x72\x20\x73\x74\x61\x6E\x64\x61\x72\x64\x20\x47\x6F\x20\x48\x54\x54\x50\x20\x70\x61\x63\x6B\x61\x67\x65\x2E\x0A\x46\x6F\x72\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x57\x65\x62\x53\x6F\x63\x6B\x65\x74\x20\x65\x6E\x64\x70\x6F\x69\x6E\x74\x73\x20\x69\x74\x20\x75\x73\x65\x20\x74\x68\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x70\x6B\x67\x2E\x67\x6F\x2E\x64\x65\x76\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x73\x68\x75\x4C\x68\x61\x6E\x2F\x73\x68\x61\x72\x65\x2F\x6C\x69\x62\x2F\x77\x65\x62\x73\x6F\x63\x6B\x65\x74\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x6C\x69\x62\x2F\x77\x65\x62\x73\x6F\x63\x6B\x65\x74\x3C\x2F\x61\x3E\x0A\x70\x61\x63\x6B\x61\x67\x65\x20\x61\x73\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E\x74\x2E\x0A\x46\x6F\x72\x20\x74\x68\x65\x20\x6C\x6F\x61\x64\x20\x74\x65\x73\x74\x69\x6E\x67\x20\x77\x65\x20\x75\x73\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x74\x73\x65\x6E\x61\x72\x74\x2F\x76\x65\x67\x65\x74\x61\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x76\x65\x67\x65\x74\x61\x3C\x2F\x61\x3E\x0A\x61\x73\x20\x74\x68\x65\x20\x62\x61\x63\x6B\x65\x6E\x64\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x54\x68\x69\x73\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x20\x70\x72\x6F\x76\x69\x64\x65\x20\x74\x68\x65\x20\x64\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x20\x6F\x66\x20\x54\x72\x75\x6E\x6B\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x73\x63\x68\x65\x6D\x61\x73\x5F\x31\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x73\x5F\x31\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x73\x5F\x31\x22\x3E\x53\x63\x68\x65\x6D\x61\x73\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x32\x22\x3E\x0A\x3C\x68\x33\x20\x69\x64\x3D\x22\x73\x63\x68\x65\x6D\x61\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x73\x74\x69\x6E\x67\x62\x6C\x6F\x63\x6B\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x70\x72\x65\x3E\x7B\x0A\x09\x22\x4C\x69\x73\x74\x65\x6E\x41\x64\x64\x72\x65\x73\x73\x22\x3A\x20\x73\x74\x72\x69\x6E\x67\x2C\x0A\x09\x22\x4D\x61\x78\x41\x74\x74\x61\x63\x6B\x44\x75\x72\x61\x74\x69\x6F\x6E\x22\x3A\x20\x6E\x75\x6D\x62\x65\x72\x2C\x0A\x09\x22\x4D\x61\x78\x41\x74\x74\x61\x63\x6B\x52\x61\x74\x65\x22\x3A\x20\x6E\x75\x6D\x62\x65\x72\x2C\x0A\x09\x22\x52\x65\x73\x75\x6C\x74\x73\x44\x69\x72\x22\x3A\x20\x73\x74\x72\x69\x6E\x67\x2C\x0A\x09\x22\x52\x65\x73\x75\x6C\x74\x73\x53\x75\x66\x66\x69\x78\x22\x3A\x20\x73\x74\x72\x69\x6E\x67\x2C\x0A\x09\x22\x41\x74\x74\x61\x63\x6B\x52\x75\x6E\x6E\x69\x6E\x67\x22\x3A\x20\x26\x6C\x74\x3B\x41\x74\x74\x61\x63\x6B\x52\x75\x6E\x6E\x69\x6E\x67\x26\x67\x74\x3B\x0A\x7D\x3C\x2F\x70\x72\x65\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x68\x74\x74\x70\x5F\x61\x70\x69\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x68\x74\x74\x70\x5F\x61\x70\x69\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x68\x74\x74\x70\x5F\x61\x70\x69\x22\x3E\x48\x54\x54\x50\x20\x41\x50\x49\x73\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x41\x6C\x6C\x20\x6F\x66\x20\x48\x54\x54\x50\x20\x41\x50\x49\x73\x20\x72\x65\x74\x75\x72\x6E\x20\x61\x20\x4A\x53\x4F\x4E\x20\x6F\x62\x6A\x65\x63\x74\x20\x75\x73\x69\x6E\x67\x20\x74\x68\x65\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x20\x73\x63\x68\x65\x6D\x61\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x73\x74\x69\x6E\x67\x62\x6C\x6F\x63\x6B\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x70\x72\x65\x3E\x7B\x0A\x09\x22\x63\x6F\x64\x65\x22\x3A\x20\x6E\x75\x6D\x62\x65\x72\x2C\x0A\x09\x22\x6D\x65\x73\x73\x61\x67\x65\x22\x3A\x20\x73\x74\x72\x69\x6E\x67\x2C\x0A\x09\x22\x64\x61\x74\x61\x22\x3A\x20\x61\x6E\x79\x0A\x7D\x3C\x2F\x70\x72\x65\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x75\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x75\x6C\x3E\x0A\x3C\x6C\x69\x3E\x0A\x3C\x70\x3E\x3C\x63\x6F\x64\x65\x3E\x63\x6F\x64\x65\x3C\x2F\x63\x6F\x64\x65\x3E\x20\x66\x69\x65\x6C\x64\x20\x63\x6F\x6E\x74\x61\x69\x6E\x73\x20\x74\x68\x65\x20\x48\x54\x54\x50\x20\x73\x74\x61\x74\x75\x73\x20\x63\x6F\x64\x65\x3C\x2F\x70\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x0A\x3C\x70\x3E\x3C\x63\x6F\x64\x65\x3E\x6D\x65\x73\x73\x61\x67\x65\x3C\x2F\x63\x6F\x64\x65\x3E\x20\x66\x69\x65\x6C\x64\x20\x63\x6F\x6E\x74\x61\x69\x6E\x73\x20\x74\x68\x65\x20\x65\x72\x72\x6F\x72\x20\x6D\x65\x73\x73\x61\x67\x65\x20\x66\x6F\x72\x20\x48\x54\x54\x50\x20\x73\x74\x61\x74\x75\x73\x20\x34\x78\x78\x20\x6F\x72\x20\x35\x78\x78\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x6C\x69\x3E\x0A\x3C\x70\x3E\x3C\x63\x6F\x64\x65\x3E\x64\x61\x74\x61\x3C\x2F\x63\x6F\x64\x65\x3E\x20\x66\x69\x65\x6C\x64\x20\x63\x6F\x6E\x74\x61\x69\x6E\x73\x20\x74\x68\x65\x20\x61\x63\x74\x75\x61\x6C\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x20\x64\x61\x74\x61\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x6C\x69\x3E\x0A\x3C\x2F\x75\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x32\x22\x3E\x0A\x3C\x68\x33\x20\x69\x64\x3D\x22\x67\x65\x74\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x67\x65\x74\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x67\x65\x74\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x47\x65\x74\x20\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x48\x54\x54\x50\x20\x41\x50\x49\x20\x74\x6F\x20\x67\x65\x74\x20\x74\x68\x65\x20\x63\x75\x72\x72\x65\x6E\x74\x20\x54\x72\x75\x6E\x6B\x73\x20\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x3C\x73\x74\x72\x6F\x6E\x67\x3E\x52\x65\x71\x75\x65\x73\x74\x3C\x2F\x73\x74\x72\x6F\x6E\x67\x3E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x73\x74\x69\x6E\x67\x62\x6C\x6F\x63\x6B\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x70\x72\x65\x3E\x47\x45\x54\x20\x2F\x5F\x74\x72\x75\x6E\x6B\x73\x2F\x61\x70\x69\x2F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x3C\x2F\x70\x72\x65\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x3C\x73\x74\x72\x6F\x6E\x67\x3E\x52\x65\x73\x70\x6F\x6E\x73\x65\x3C\x2F\x73\x74\x72\x6F\x6E\x67\x3E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x72\x61\x67\x72\x61\x70\x68\x22\x3E\x0A\x3C\x70\x3E\x4F\x6E\x20\x73\x75\x63\x63\x65\x73\x73\x2C\x20\x69\x74\x20\x77\x69\x6C\x6C\x20\x72\x65\x74\x75\x72\x6E\x20\x74\x68\x65\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x23\x73\x63\x68\x65\x6D\x61\x5F\x65\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x22\x3E\x45\x6E\x76\x69\x72\x6F\x6E\x6D\x65\x6E\x74\x20\x73\x63\x68\x65\x6D\x61\x3C\x2F\x61\x3E\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x74\x65\x72\x2D\x74\x65\x78\x74\x22\x3E\x0A\x4C\x61\x73\x74\x20\x75\x70\x64\x61\x74\x65\x64\x20\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x20\x31\x33\x3A\x34\x38\x3A\x30\x37\x20\x2B\x30\x37\x30\x30\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x0A\x0A\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x20\x32\x30\x30\x37\x2D\x32\x30\x32\x33\x2C\x20\x53\x68\x75\x6C\x68\x61\x6E\x20\x26\x6C\x74\x3B\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x26\x67\x74\x3B\x2E\x20\x41\x6C\x6C\x20\x72\x69\x67\x68\x74\x73\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x73\x65\x72\x76\x65\x64\x2E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x50\x6F\x77\x65\x72\x65\x64\x20\x62\x79\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x63\x69\x69\x67\x6F\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x63\x69\x69\x67\x6F\x3C\x2F\x61\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x3C\x2F\x62\x6F\x64\x79\x3E\x0A\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"), } node.SetMode(420) - node.SetModTimeUnix(1684219687, 54817016) + node.SetModTimeUnix(1697705988, 303151600) node.SetName("SPECS.html") - node.SetSize(7641) + node.SetSize(4790) return node } @@ -106,12 +106,12 @@ func generate__www_doc_index_html() *memfs.Node { Path: "/doc/index.html", ContentType: "text/html; charset=utf-8", GenFuncName: "generate__www_doc_index_html", - Content: []byte("\x3C\x21\x44\x4F\x43\x54\x59\x50\x45\x20\x68\x74\x6D\x6C\x3E\x0A\x3C\x68\x74\x6D\x6C\x3E\x0A\x09\x3C\x68\x65\x61\x64\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x68\x74\x74\x70\x2D\x65\x71\x75\x69\x76\x3D\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x3B\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x75\x74\x66\x2D\x38\x22\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x76\x69\x65\x77\x70\x6F\x72\x74\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x77\x69\x64\x74\x68\x3D\x64\x65\x76\x69\x63\x65\x2D\x77\x69\x64\x74\x68\x2C\x20\x69\x6E\x69\x74\x69\x61\x6C\x2D\x73\x63\x61\x6C\x65\x3D\x31\x22\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x74\x68\x65\x6D\x65\x2D\x63\x6F\x6C\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x23\x33\x37\x35\x45\x41\x42\x22\x3E\x0A\x09\x09\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x67\x65\x6E\x65\x72\x61\x74\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x61\x73\x63\x69\x69\x64\x6F\x63\x74\x6F\x72\x2D\x67\x6F\x20\x30\x2E\x34\x2E\x31\x22\x3E\x0A\x09\x09\x3C\x74\x69\x74\x6C\x65\x3E\x74\x72\x75\x6E\x6B\x73\x3C\x2F\x74\x69\x74\x6C\x65\x3E\x0A\x09\x09\x3C\x73\x74\x79\x6C\x65\x3E\x0A\x09\x09\x0A\x62\x6F\x64\x79\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x41\x72\x69\x61\x6C\x2C\x20\x73\x61\x6E\x73\x2D\x73\x65\x72\x69\x66\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x66\x66\x66\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x33\x3B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x63\x65\x6E\x74\x65\x72\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x32\x32\x32\x3B\x0A\x7D\x0A\x70\x72\x65\x2C\x0A\x63\x6F\x64\x65\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x4D\x65\x6E\x6C\x6F\x2C\x20\x6D\x6F\x6E\x6F\x73\x70\x61\x63\x65\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x30\x2E\x38\x37\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x70\x72\x65\x20\x7B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x34\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x2D\x78\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x65\x66\x65\x66\x65\x66\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x2E\x36\x32\x35\x72\x65\x6D\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x72\x61\x64\x69\x75\x73\x3A\x20\x30\x2E\x33\x31\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x61\x20\x7B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x61\x3A\x68\x6F\x76\x65\x72\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x20\x75\x6E\x64\x65\x72\x6C\x69\x6E\x65\x3B\x0A\x7D\x0A\x0A\x70\x2C\x0A\x6C\x69\x20\x7B\x0A\x09\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x35\x30\x72\x65\x6D\x3B\x0A\x09\x77\x6F\x72\x64\x2D\x77\x72\x61\x70\x3A\x20\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64\x3B\x0A\x7D\x0A\x6C\x69\x20\x70\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x32\x70\x78\x3B\x0A\x7D\x0A\x70\x2C\x0A\x70\x72\x65\x2C\x0A\x75\x6C\x2C\x0A\x6F\x6C\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x68\x31\x2C\x0A\x68\x32\x2C\x0A\x68\x33\x2C\x0A\x68\x34\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x20\x30\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x7D\x0A\x68\x31\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x37\x35\x72\x65\x6D\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x3B\x0A\x7D\x0A\x68\x31\x20\x2E\x74\x65\x78\x74\x2D\x6D\x75\x74\x65\x64\x20\x7B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x37\x37\x37\x3B\x0A\x7D\x0A\x68\x32\x20\x7B\x0A\x09\x63\x6C\x65\x61\x72\x3A\x20\x72\x69\x67\x68\x74\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x65\x30\x65\x62\x66\x35\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x2E\x35\x72\x65\x6D\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x32\x35\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x6E\x6F\x72\x6D\x61\x6C\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x2D\x77\x72\x61\x70\x3A\x20\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64\x3B\x0A\x7D\x0A\x68\x32\x20\x61\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x7D\x0A\x68\x33\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x6C\x69\x6E\x65\x2D\x68\x65\x69\x67\x68\x74\x3A\x20\x31\x2E\x32\x35\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x2D\x77\x72\x61\x70\x3A\x20\x62\x72\x65\x61\x6B\x2D\x77\x6F\x72\x64\x3B\x0A\x7D\x0A\x68\x33\x2C\x0A\x68\x34\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x20\x30\x2E\x33\x31\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x68\x34\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x68\x32\x20\x3E\x20\x73\x70\x61\x6E\x2C\x0A\x68\x33\x20\x3E\x20\x73\x70\x61\x6E\x20\x7B\x0A\x09\x66\x6C\x6F\x61\x74\x3A\x20\x72\x69\x67\x68\x74\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x20\x32\x35\x70\x78\x20\x30\x20\x30\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x6E\x6F\x72\x6D\x61\x6C\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x35\x32\x37\x39\x63\x37\x3B\x0A\x7D\x0A\x0A\x64\x6C\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x64\x74\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x0A\x7D\x0A\x64\x64\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x20\x30\x20\x30\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2F\x2A\x2A\x0A\x20\x2A\x20\x43\x75\x73\x74\x6F\x6D\x20\x63\x6C\x61\x73\x73\x65\x73\x20\x66\x6F\x72\x20\x70\x61\x67\x65\x73\x0A\x20\x2A\x2F\x0A\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x7B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x63\x6F\x6C\x6C\x61\x70\x73\x65\x3A\x20\x73\x65\x70\x61\x72\x61\x74\x65\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x3A\x20\x30\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x30\x30\x25\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x63\x65\x6E\x74\x65\x72\x3B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x32\x30\x70\x78\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x69\x6D\x67\x20\x7B\x0A\x09\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x2E\x74\x69\x74\x6C\x65\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x62\x6F\x6C\x64\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x66\x61\x6D\x69\x6C\x79\x3A\x20\x22\x4F\x70\x65\x6E\x20\x53\x61\x6E\x73\x22\x2C\x22\x44\x65\x6A\x61\x56\x75\x20\x53\x61\x6E\x73\x22\x2C\x73\x61\x6E\x73\x2D\x73\x65\x72\x69\x66\x3B\x0A\x09\x74\x65\x78\x74\x2D\x74\x72\x61\x6E\x73\x66\x6F\x72\x6D\x3A\x20\x75\x70\x70\x65\x72\x63\x61\x73\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x63\x6F\x6E\x74\x65\x6E\x74\x20\x7B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x2D\x6C\x65\x66\x74\x3A\x20\x31\x2E\x31\x32\x35\x65\x6D\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x2D\x72\x69\x67\x68\x74\x3A\x20\x31\x2E\x32\x35\x65\x6D\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x6C\x65\x66\x74\x3A\x20\x31\x70\x78\x20\x73\x6F\x6C\x69\x64\x20\x23\x64\x64\x64\x64\x64\x66\x3B\x0A\x09\x77\x6F\x72\x64\x2D\x77\x72\x61\x70\x3A\x20\x61\x6E\x79\x77\x68\x65\x72\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x20\x3E\x20\x74\x61\x62\x6C\x65\x20\x74\x64\x2E\x63\x6F\x6E\x74\x65\x6E\x74\x3E\x3A\x6C\x61\x73\x74\x2D\x63\x68\x69\x6C\x64\x3E\x3A\x6C\x61\x73\x74\x2D\x63\x68\x69\x6C\x64\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x30\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x6E\x6F\x74\x65\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x77\x68\x69\x74\x65\x73\x6D\x6F\x6B\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x74\x69\x70\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x61\x7A\x75\x72\x65\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x69\x6D\x70\x6F\x72\x74\x61\x6E\x74\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x68\x6F\x6E\x65\x79\x64\x65\x77\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x63\x61\x75\x74\x69\x6F\x6E\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x6C\x61\x76\x65\x6E\x64\x65\x72\x62\x75\x73\x68\x3B\x0A\x7D\x0A\x2E\x61\x64\x6D\x6F\x6E\x69\x74\x69\x6F\x6E\x62\x6C\x6F\x63\x6B\x2E\x77\x61\x72\x6E\x69\x6E\x67\x20\x74\x64\x2E\x69\x63\x6F\x6E\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x20\x6D\x69\x73\x74\x79\x72\x6F\x73\x65\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x7B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x65\x30\x65\x62\x66\x35\x3B\x0A\x09\x68\x65\x69\x67\x68\x74\x3A\x20\x34\x72\x65\x6D\x3B\x0A\x09\x6F\x76\x65\x72\x66\x6C\x6F\x77\x3A\x20\x68\x69\x64\x64\x65\x6E\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x2C\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x7B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x31\x2E\x33\x31\x33\x72\x65\x6D\x20\x30\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x20\x6E\x6F\x72\x6D\x61\x6C\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x20\x7B\x0A\x09\x66\x6C\x6F\x61\x74\x3A\x20\x6C\x65\x66\x74\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x20\x61\x20\x7B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x32\x32\x32\x3B\x0A\x09\x74\x65\x78\x74\x2D\x64\x65\x63\x6F\x72\x61\x74\x69\x6F\x6E\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x20\x2E\x68\x65\x61\x64\x65\x72\x2D\x6C\x6F\x67\x6F\x20\x7B\x0A\x09\x68\x65\x69\x67\x68\x74\x3A\x20\x32\x72\x65\x6D\x3B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x35\x2E\x31\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x7B\x0A\x09\x66\x6C\x6F\x61\x74\x3A\x20\x72\x69\x67\x68\x74\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x61\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x30\x2E\x36\x32\x35\x72\x65\x6D\x20\x30\x2E\x31\x32\x35\x72\x65\x6D\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x2E\x36\x32\x35\x72\x65\x6D\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x77\x68\x69\x74\x65\x3B\x0A\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x3A\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x3A\x20\x30\x2E\x30\x36\x32\x35\x72\x65\x6D\x20\x73\x6F\x6C\x69\x64\x20\x23\x30\x30\x37\x64\x39\x63\x3B\x0A\x09\x62\x6F\x72\x64\x65\x72\x2D\x72\x61\x64\x69\x75\x73\x3A\x20\x35\x70\x78\x3B\x0A\x7D\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x2E\x6D\x65\x6E\x75\x20\x66\x6F\x72\x6D\x20\x7B\x0A\x09\x64\x69\x73\x70\x6C\x61\x79\x3A\x20\x69\x6E\x6C\x69\x6E\x65\x2D\x62\x6C\x6F\x63\x6B\x3B\x0A\x7D\x0A\x0A\x2E\x70\x61\x67\x65\x20\x7B\x0A\x09\x77\x69\x64\x74\x68\x3A\x20\x31\x30\x30\x25\x3B\x0A\x7D\x0A\x0A\x2E\x70\x61\x67\x65\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x2C\x0A\x2E\x74\x6F\x70\x62\x61\x72\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x2C\x0A\x2E\x66\x6F\x6F\x74\x65\x72\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x6C\x65\x66\x74\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x72\x69\x67\x68\x74\x3A\x20\x61\x75\x74\x6F\x3B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x09\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x35\x39\x2E\x33\x38\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x70\x61\x67\x65\x20\x3E\x20\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x6C\x65\x66\x74\x3B\x0A\x7D\x0A\x0A\x2E\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x20\x2E\x6D\x65\x74\x61\x20\x7B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x74\x79\x6C\x65\x3A\x20\x69\x74\x61\x6C\x69\x63\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x31\x2E\x32\x35\x72\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x66\x6F\x6F\x74\x65\x72\x20\x7B\x0A\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x20\x63\x65\x6E\x74\x65\x72\x3B\x0A\x09\x63\x6F\x6C\x6F\x72\x3A\x20\x23\x36\x36\x36\x3B\x0A\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x20\x30\x2E\x38\x37\x35\x72\x65\x6D\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x32\x2E\x35\x72\x65\x6D\x20\x30\x3B\x0A\x7D\x0A\x0A\x2E\x75\x6C\x69\x73\x74\x20\x6C\x69\x20\x2E\x70\x61\x72\x61\x67\x72\x61\x70\x68\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x31\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2E\x75\x6C\x69\x73\x74\x20\x6C\x69\x20\x2E\x70\x61\x72\x61\x67\x72\x61\x70\x68\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x2D\x62\x6F\x74\x74\x6F\x6D\x3A\x20\x31\x65\x6D\x3B\x0A\x7D\x0A\x0A\x2F\x2A\x2A\x20\x43\x75\x73\x74\x6F\x6D\x20\x63\x6C\x61\x73\x73\x65\x73\x20\x2A\x2F\x0A\x23\x74\x6F\x63\x74\x69\x74\x6C\x65\x20\x7B\x0A\x09\x64\x69\x73\x70\x6C\x61\x79\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x23\x74\x6F\x63\x20\x6C\x69\x20\x7B\x0A\x09\x6C\x69\x73\x74\x2D\x73\x74\x79\x6C\x65\x3A\x20\x6E\x6F\x6E\x65\x3B\x0A\x7D\x0A\x23\x74\x6F\x63\x20\x75\x6C\x20\x2E\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x31\x20\x7B\x0A\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x20\x30\x70\x78\x3B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x34\x70\x78\x3B\x0A\x7D\x0A\x23\x74\x6F\x63\x20\x75\x6C\x20\x2E\x73\x65\x63\x74\x6C\x65\x76\x65\x6C\x32\x20\x7B\x0A\x09\x6D\x61\x72\x67\x69\x6E\x3A\x20\x34\x70\x78\x3B\x0A\x7D\x0A\x0A\x40\x6D\x65\x64\x69\x61\x20\x73\x63\x72\x65\x65\x6E\x20\x61\x6E\x64\x20\x28\x6D\x61\x78\x2D\x77\x69\x64\x74\x68\x3A\x20\x39\x39\x32\x70\x78\x29\x20\x7B\x0A\x09\x23\x74\x6F\x63\x20\x7B\x0A\x09\x09\x61\x6C\x6C\x3A\x20\x75\x6E\x73\x65\x74\x3B\x0A\x09\x7D\x0A\x7D\x0A\x0A\x09\x09\x3C\x2F\x73\x74\x79\x6C\x65\x3E\x0A\x09\x3C\x2F\x68\x65\x61\x64\x3E\x0A\x09\x3C\x62\x6F\x64\x79\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x22\x3E\x0A\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x2D\x68\x65\x61\x64\x69\x6E\x67\x22\x3E\x0A\x09\x09\x09\x09\x09\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x22\x3E\x74\x72\x75\x6E\x6B\x73\x3C\x2F\x61\x3E\x0A\x09\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x6D\x65\x6E\x75\x22\x3E\x0A\x09\x09\x09\x09\x09\x3C\x66\x6F\x72\x6D\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x74\x65\x6D\x22\x20\x61\x63\x74\x69\x6F\x6E\x3D\x22\x2F\x5F\x69\x6E\x74\x65\x72\x6E\x61\x6C\x2F\x73\x65\x61\x72\x63\x68\x22\x3E\x0A\x09\x09\x09\x09\x09\x09\x3C\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x20\x6E\x61\x6D\x65\x3D\x22\x71\x22\x20\x70\x6C\x61\x63\x65\x68\x6F\x6C\x64\x65\x72\x3D\x22\x53\x65\x61\x72\x63\x68\x22\x20\x2F\x3E\x0A\x09\x09\x09\x09\x09\x3C\x2F\x66\x6F\x72\x6D\x3E\x0A\x09\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x67\x65\x22\x3E\x0A\x09\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x68\x65\x61\x64\x65\x72\x22\x3E\x0A\x3C\x68\x31\x3E\x74\x72\x75\x6E\x6B\x73\x3C\x2F\x68\x31\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x22\x3E\x44\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x64\x6C\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x43\x48\x41\x4E\x47\x45\x4C\x4F\x47\x2E\x68\x74\x6D\x6C\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x43\x48\x41\x4E\x47\x45\x4C\x4F\x47\x3C\x2F\x61\x3E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x70\x3E\x48\x69\x73\x74\x6F\x72\x79\x20\x6F\x66\x20\x65\x61\x63\x68\x20\x72\x65\x6C\x65\x61\x73\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x52\x45\x41\x44\x4D\x45\x2E\x68\x74\x6D\x6C\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x52\x45\x41\x44\x4D\x45\x3C\x2F\x61\x3E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x70\x3E\x4D\x61\x6E\x75\x61\x6C\x20\x70\x61\x67\x65\x20\x66\x6F\x72\x20\x74\x72\x75\x6E\x6B\x73\x26\x23\x38\x32\x31\x37\x3B\x20\x75\x73\x65\x72\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x53\x50\x45\x43\x53\x2E\x68\x74\x6D\x6C\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x53\x70\x65\x63\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x3C\x2F\x61\x3E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x70\x3E\x4D\x61\x6E\x75\x61\x6C\x20\x70\x61\x67\x65\x20\x66\x6F\x72\x20\x74\x72\x75\x6E\x6B\x73\x26\x23\x38\x32\x31\x37\x3B\x20\x64\x65\x76\x65\x6C\x6F\x70\x65\x72\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x2F\x64\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x64\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x64\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x64\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x22\x3E\x44\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x64\x6C\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x52\x65\x70\x6F\x73\x69\x74\x6F\x72\x79\x3C\x2F\x61\x3E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x70\x3E\x4C\x69\x6E\x6B\x20\x74\x6F\x20\x74\x68\x65\x20\x73\x6F\x75\x72\x63\x65\x20\x63\x6F\x64\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6C\x69\x73\x74\x73\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x4D\x61\x69\x6C\x69\x6E\x67\x20\x6C\x69\x73\x74\x3C\x2F\x61\x3E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x70\x3E\x4C\x69\x6E\x6B\x20\x74\x6F\x20\x64\x69\x73\x63\x75\x73\x73\x69\x6F\x6E\x20\x61\x6E\x64\x0A\x77\x68\x65\x72\x65\x20\x74\x6F\x20\x73\x65\x6E\x64\x20\x70\x61\x74\x63\x68\x65\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x74\x6F\x64\x6F\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x49\x73\x73\x75\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x70\x3E\x4C\x69\x6E\x6B\x20\x74\x6F\x20\x72\x65\x70\x6F\x72\x74\x20\x66\x6F\x72\x20\x62\x75\x67\x20\x6F\x72\x0A\x66\x65\x61\x74\x75\x72\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x2F\x64\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x74\x65\x72\x2D\x74\x65\x78\x74\x22\x3E\x0A\x4C\x61\x73\x74\x20\x75\x70\x64\x61\x74\x65\x64\x20\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x20\x31\x34\x3A\x34\x35\x3A\x34\x39\x20\x2B\x30\x37\x30\x30\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x09\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x09\x09\x09\x50\x6F\x77\x65\x72\x65\x64\x20\x62\x79\x20\x3C\x61\x0A\x09\x09\x09\x09\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x63\x69\x69\x67\x6F\x22\x0A\x09\x09\x09\x3E\x0A\x09\x09\x09\x09\x63\x69\x69\x67\x6F\x0A\x09\x09\x09\x3C\x2F\x61\x3E\x0A\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0A\x09\x3C\x2F\x62\x6F\x64\x79\x3E\x0A\x3C\x2F\x68\x74\x6D\x6C\x3E"), + Content: []byte("\x3C\x21\x44\x4F\x43\x54\x59\x50\x45\x20\x68\x74\x6D\x6C\x3E\x0A\x3C\x68\x74\x6D\x6C\x20\x6C\x61\x6E\x67\x3D\x22\x65\x6E\x22\x3E\x0A\x20\x20\x3C\x68\x65\x61\x64\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x74\x61\x20\x68\x74\x74\x70\x2D\x65\x71\x75\x69\x76\x3D\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x3B\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x75\x74\x66\x2D\x38\x22\x20\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x76\x69\x65\x77\x70\x6F\x72\x74\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x77\x69\x64\x74\x68\x3D\x64\x65\x76\x69\x63\x65\x2D\x77\x69\x64\x74\x68\x2C\x20\x69\x6E\x69\x74\x69\x61\x6C\x2D\x73\x63\x61\x6C\x65\x3D\x31\x22\x20\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x6D\x65\x74\x61\x20\x6E\x61\x6D\x65\x3D\x22\x74\x68\x65\x6D\x65\x2D\x63\x6F\x6C\x6F\x72\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x23\x33\x37\x35\x45\x41\x42\x22\x20\x2F\x3E\x0A\x20\x20\x20\x20\x3C\x74\x69\x74\x6C\x65\x3E\x74\x72\x75\x6E\x6B\x73\x3C\x2F\x74\x69\x74\x6C\x65\x3E\x0A\x20\x20\x20\x20\x3C\x6C\x69\x6E\x6B\x20\x68\x72\x65\x66\x3D\x22\x2F\x69\x6E\x64\x65\x78\x2E\x63\x73\x73\x22\x20\x72\x65\x6C\x3D\x22\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x2F\x63\x73\x73\x22\x20\x6D\x65\x64\x69\x61\x3D\x22\x70\x72\x69\x6E\x74\x22\x20\x6F\x6E\x6C\x6F\x61\x64\x3D\x22\x74\x68\x69\x73\x2E\x6D\x65\x64\x69\x61\x3D\x27\x61\x6C\x6C\x27\x22\x20\x2F\x3E\x0A\x20\x20\x3C\x2F\x68\x65\x61\x64\x3E\x0A\x0A\x20\x20\x3C\x62\x6F\x64\x79\x3E\x0A\x20\x20\x20\x20\x3C\x69\x6D\x67\x0A\x20\x20\x20\x20\x20\x20\x61\x6C\x74\x3D\x22\x22\x0A\x20\x20\x20\x20\x20\x20\x63\x6C\x61\x73\x73\x3D\x22\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x22\x0A\x20\x20\x20\x20\x20\x20\x73\x72\x63\x3D\x22\x2F\x61\x73\x73\x65\x74\x73\x2F\x69\x6D\x61\x67\x65\x73\x2F\x6D\x61\x70\x6C\x65\x2D\x6C\x65\x61\x66\x2D\x74\x72\x61\x6E\x73\x70\x61\x72\x65\x6E\x74\x2D\x35\x34\x30\x2E\x6A\x70\x67\x22\x0A\x20\x20\x20\x20\x20\x20\x77\x69\x64\x74\x68\x3D\x22\x39\x32\x30\x22\x0A\x20\x20\x20\x20\x2F\x3E\x0A\x0A\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x2D\x6C\x65\x66\x74\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x22\x3E\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x3C\x2F\x61\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x6F\x70\x62\x61\x72\x2D\x72\x69\x67\x68\x74\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x62\x75\x69\x6C\x64\x2E\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x42\x75\x69\x6C\x64\x20\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x68\x75\x62\x2E\x63\x6F\x6D\x2F\x73\x68\x75\x4C\x68\x61\x6E\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x47\x69\x74\x48\x75\x62\x20\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x72\x65\x6C\x3D\x22\x6D\x65\x22\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x66\x6F\x73\x73\x74\x6F\x64\x6F\x6E\x2E\x6F\x72\x67\x2F\x40\x73\x68\x75\x4C\x68\x61\x6E\x22\x3E\x4D\x61\x73\x74\x6F\x64\x6F\x6E\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x73\x72\x2E\x68\x74\x20\x3C\x2F\x61\x3E\x20\x7C\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x74\x77\x69\x74\x74\x65\x72\x2E\x63\x6F\x6D\x2F\x5F\x73\x68\x75\x4C\x68\x61\x6E\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x20\x54\x77\x69\x74\x74\x65\x72\x20\x3C\x2F\x61\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x0A\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x70\x61\x67\x65\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6E\x74\x61\x69\x6E\x65\x72\x22\x3E\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x68\x65\x61\x64\x65\x72\x22\x3E\x0A\x3C\x68\x31\x3E\x74\x72\x75\x6E\x6B\x73\x3C\x2F\x68\x31\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x63\x6F\x6E\x74\x65\x6E\x74\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x64\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x22\x3E\x44\x6F\x63\x75\x6D\x65\x6E\x74\x61\x74\x69\x6F\x6E\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x64\x6C\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x43\x48\x41\x4E\x47\x45\x4C\x4F\x47\x2E\x68\x74\x6D\x6C\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x43\x48\x41\x4E\x47\x45\x4C\x4F\x47\x3C\x2F\x61\x3E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x70\x3E\x48\x69\x73\x74\x6F\x72\x79\x20\x6F\x66\x20\x65\x61\x63\x68\x20\x72\x65\x6C\x65\x61\x73\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x52\x45\x41\x44\x4D\x45\x2E\x68\x74\x6D\x6C\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x52\x45\x41\x44\x4D\x45\x3C\x2F\x61\x3E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x70\x3E\x4D\x61\x6E\x75\x61\x6C\x20\x70\x61\x67\x65\x20\x66\x6F\x72\x20\x74\x72\x75\x6E\x6B\x73\x26\x23\x38\x32\x31\x37\x3B\x20\x75\x73\x65\x72\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x53\x50\x45\x43\x53\x2E\x68\x74\x6D\x6C\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x53\x70\x65\x63\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x3C\x2F\x61\x3E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x70\x3E\x4D\x61\x6E\x75\x61\x6C\x20\x70\x61\x67\x65\x20\x66\x6F\x72\x20\x74\x72\x75\x6E\x6B\x73\x26\x23\x38\x32\x31\x37\x3B\x20\x64\x65\x76\x65\x6C\x6F\x70\x65\x72\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x2F\x64\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x31\x22\x3E\x0A\x3C\x68\x32\x20\x69\x64\x3D\x22\x64\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x22\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x61\x6E\x63\x68\x6F\x72\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x64\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x22\x3E\x3C\x2F\x61\x3E\x3C\x61\x20\x63\x6C\x61\x73\x73\x3D\x22\x6C\x69\x6E\x6B\x22\x20\x68\x72\x65\x66\x3D\x22\x23\x64\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x22\x3E\x44\x65\x76\x65\x6C\x6F\x70\x6D\x65\x6E\x74\x3C\x2F\x61\x3E\x3C\x2F\x68\x32\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x73\x65\x63\x74\x69\x6F\x6E\x62\x6F\x64\x79\x22\x3E\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x64\x6C\x69\x73\x74\x22\x3E\x0A\x3C\x64\x6C\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x67\x69\x74\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x52\x65\x70\x6F\x73\x69\x74\x6F\x72\x79\x3C\x2F\x61\x3E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x70\x3E\x4C\x69\x6E\x6B\x20\x74\x6F\x20\x74\x68\x65\x20\x73\x6F\x75\x72\x63\x65\x20\x63\x6F\x64\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x6C\x69\x73\x74\x73\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x4D\x61\x69\x6C\x69\x6E\x67\x20\x6C\x69\x73\x74\x3C\x2F\x61\x3E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x70\x3E\x4C\x69\x6E\x6B\x20\x74\x6F\x20\x64\x69\x73\x63\x75\x73\x73\x69\x6F\x6E\x20\x61\x6E\x64\x0A\x77\x68\x65\x72\x65\x20\x74\x6F\x20\x73\x65\x6E\x64\x20\x70\x61\x74\x63\x68\x65\x73\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x64\x74\x20\x63\x6C\x61\x73\x73\x3D\x22\x68\x64\x6C\x69\x73\x74\x31\x22\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x74\x6F\x64\x6F\x2E\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x74\x72\x75\x6E\x6B\x73\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x20\x72\x65\x6C\x3D\x22\x6E\x6F\x6F\x70\x65\x6E\x65\x72\x22\x3E\x49\x73\x73\x75\x65\x73\x3C\x2F\x61\x3E\x3C\x2F\x64\x74\x3E\x0A\x3C\x64\x64\x3E\x0A\x3C\x70\x3E\x4C\x69\x6E\x6B\x20\x74\x6F\x20\x72\x65\x70\x6F\x72\x74\x20\x66\x6F\x72\x20\x62\x75\x67\x20\x6F\x72\x0A\x66\x65\x61\x74\x75\x72\x65\x2E\x3C\x2F\x70\x3E\x0A\x3C\x2F\x64\x64\x3E\x0A\x3C\x2F\x64\x6C\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x66\x6F\x6F\x74\x65\x72\x2D\x74\x65\x78\x74\x22\x3E\x0A\x4C\x61\x73\x74\x20\x75\x70\x64\x61\x74\x65\x64\x20\x32\x30\x32\x33\x2D\x30\x35\x2D\x31\x36\x20\x31\x34\x3A\x34\x35\x3A\x34\x39\x20\x2B\x30\x37\x30\x30\x0A\x3C\x2F\x64\x69\x76\x3E\x0A\x3C\x2F\x64\x69\x76\x3E\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x0A\x0A\x20\x20\x20\x20\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x20\x32\x30\x30\x37\x2D\x32\x30\x32\x33\x2C\x20\x53\x68\x75\x6C\x68\x61\x6E\x20\x26\x6C\x74\x3B\x6D\x73\x40\x6B\x69\x6C\x61\x62\x69\x74\x2E\x69\x6E\x66\x6F\x26\x67\x74\x3B\x2E\x20\x41\x6C\x6C\x20\x72\x69\x67\x68\x74\x73\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x73\x65\x72\x76\x65\x64\x2E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x50\x6F\x77\x65\x72\x65\x64\x20\x62\x79\x0A\x20\x20\x20\x20\x20\x20\x20\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x73\x72\x2E\x68\x74\x2F\x7E\x73\x68\x75\x6C\x68\x61\x6E\x2F\x63\x69\x69\x67\x6F\x22\x20\x74\x61\x72\x67\x65\x74\x3D\x22\x5F\x62\x6C\x61\x6E\x6B\x22\x3E\x63\x69\x69\x67\x6F\x3C\x2F\x61\x3E\x0A\x20\x20\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x20\x20\x3C\x2F\x64\x69\x76\x3E\x0A\x20\x20\x3C\x2F\x62\x6F\x64\x79\x3E\x0A\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"), } node.SetMode(420) - node.SetModTimeUnix(1684223149, 404446121) + node.SetModTimeUnix(1697705988, 306484958) node.SetName("index.html") - node.SetSize(5878) + node.SetSize(3027) return node } @@ -318,9 +318,11 @@ func generate__www_wui() *memfs.Node { GenFuncName: "generate__www_wui", } node.SetMode(2147484141) - node.SetModTimeUnix(1661399331, 247974438) + node.SetModTimeUnix(1699636953, 902822696) node.SetName("wui") node.SetSize(0) + node.AddChild(_memfsWWW_getNode(memfsWWW, "/wui/.reuse", generate__www_wui__reuse)) + node.AddChild(_memfsWWW_getNode(memfsWWW, "/wui/LICENSES", generate__www_wui_LICENSES)) node.AddChild(_memfsWWW_getNode(memfsWWW, "/wui/README.html", generate__www_wui_README_html)) node.AddChild(_memfsWWW_getNode(memfsWWW, "/wui/editor", generate__www_wui_editor)) node.AddChild(_memfsWWW_getNode(memfsWWW, "/wui/input", generate__www_wui_input)) @@ -331,6 +333,34 @@ func generate__www_wui() *memfs.Node { return node } +func generate__www_wui__reuse() *memfs.Node { + var node = &memfs.Node{ + SysPath: "_www/wui/.reuse", + Path: "/wui/.reuse", + ContentType: "", + GenFuncName: "generate__www_wui__reuse", + } + node.SetMode(2147484141) + node.SetModTimeUnix(1650448813, 728338315) + node.SetName(".reuse") + node.SetSize(0) + return node +} + +func generate__www_wui_LICENSES() *memfs.Node { + var node = &memfs.Node{ + SysPath: "_www/wui/LICENSES", + Path: "/wui/LICENSES", + ContentType: "", + GenFuncName: "generate__www_wui_LICENSES", + } + node.SetMode(2147484141) + node.SetModTimeUnix(1650448813, 731671662) + node.SetName("LICENSES") + node.SetSize(0) + return node +} + func generate__www_wui_README_html() *memfs.Node { var node = &memfs.Node{ SysPath: "_www/wui/README.html", @@ -354,7 +384,7 @@ func generate__www_wui_editor() *memfs.Node { GenFuncName: "generate__www_wui_editor", } node.SetMode(2147484141) - node.SetModTimeUnix(1650448813, 731671662) + node.SetModTimeUnix(1699636953, 896155982) node.SetName("editor") node.SetSize(0) node.AddChild(_memfsWWW_getNode(memfsWWW, "/wui/editor/editor.js", generate__www_wui_editor_editor_js)) @@ -384,7 +414,7 @@ func generate__www_wui_input() *memfs.Node { GenFuncName: "generate__www_wui_input", } node.SetMode(2147484141) - node.SetModTimeUnix(1650448813, 731671662) + node.SetModTimeUnix(1699636953, 899489339) node.SetName("input") node.SetSize(0) node.AddChild(_memfsWWW_getNode(memfsWWW, "/wui/input/checkboxes.js", generate__www_wui_input_checkboxes_js)) @@ -478,7 +508,7 @@ func generate__www_wui_notif() *memfs.Node { GenFuncName: "generate__www_wui_notif", } node.SetMode(2147484141) - node.SetModTimeUnix(1650448813, 731671662) + node.SetModTimeUnix(1699636953, 899489339) node.SetName("notif") node.SetSize(0) node.AddChild(_memfsWWW_getNode(memfsWWW, "/wui/notif/notif.js", generate__www_wui_notif_notif_js)) @@ -523,7 +553,7 @@ func generate__www_wui_vfs() *memfs.Node { GenFuncName: "generate__www_wui_vfs", } node.SetMode(2147484141) - node.SetModTimeUnix(1650448813, 735005010) + node.SetModTimeUnix(1699636953, 899489339) node.SetName("vfs") node.SetSize(0) node.AddChild(_memfsWWW_getNode(memfsWWW, "/wui/vfs/vfs.js", generate__www_wui_vfs_vfs_js)) @@ -574,7 +604,7 @@ func init() { memfsWWW = &memfs.MemFS{ PathNodes: memfs.NewPathNode(), Opts: &memfs.Options{ - Root: "_www", + Root: "_www", MaxFileSize: 5242880, Includes: []string{ `.*\.(js|ico|png|html)$`, @@ -590,7 +620,7 @@ func init() { `/wui\.local`, }, Embed: memfs.EmbedOptions{ - CommentHeader: `// SPDX-FileCopyrightText: 2021 M. Shulhan + CommentHeader: `// SPDX-FileCopyrightText: 2021 M. Shulhan // SPDX-License-Identifier: GPL-3.0-or-later `, PackageName: "trunks", @@ -640,6 +670,10 @@ func init() { _memfsWWW_getNode(memfsWWW, "/ws_target.js", generate__www_ws_target_js)) memfsWWW.PathNodes.Set("/wui", _memfsWWW_getNode(memfsWWW, "/wui", generate__www_wui)) + memfsWWW.PathNodes.Set("/wui/.reuse", + _memfsWWW_getNode(memfsWWW, "/wui/.reuse", generate__www_wui__reuse)) + memfsWWW.PathNodes.Set("/wui/LICENSES", + _memfsWWW_getNode(memfsWWW, "/wui/LICENSES", generate__www_wui_LICENSES)) memfsWWW.PathNodes.Set("/wui/README.html", _memfsWWW_getNode(memfsWWW, "/wui/README.html", generate__www_wui_README_html)) memfsWWW.PathNodes.Set("/wui/editor", @@ -672,4 +706,9 @@ func init() { _memfsWWW_getNode(memfsWWW, "/wui/websocket_client.js", generate__www_wui_websocket_client_js)) memfsWWW.Root = memfsWWW.PathNodes.Get("/") + + var err = memfsWWW.Init() + if err != nil { + panic("memfsWWW: " + err.Error()) + } } -- cgit v1.3