From 09a667a6cd1c18fc5af11836a651d262c261e2b8 Mon Sep 17 00:00:00 2001 From: nekobit Date: Thu, 21 Jul 2022 23:32:08 +0000 Subject: [PATCH 001/143] Create new branch named "perlify" FossilOrigin-Name: c62e59c0dc3bb1b12fbaa520f3d923833beb0737e449f0012673b725560562d8 From 10875ff940e70881065c921e24408caded04974c Mon Sep 17 00:00:00 2001 From: nekobit Date: Fri, 22 Jul 2022 03:56:41 +0000 Subject: [PATCH 002/143] Load perl FossilOrigin-Name: 0107dd3706329714f684f913c2ae67d072851eca96b981c11f5315e1ef780c22 --- .fossil-settings/ignore-glob | 3 ++- Makefile | 14 +++++++++++--- config.def.h | 2 ++ perl/main.pl | 9 +++++++++ src/global_perl.h | 26 ++++++++++++++++++++++++++ src/main.c | 22 +++++++++++++++++++++- 6 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 perl/main.pl create mode 100644 src/global_perl.h diff --git a/.fossil-settings/ignore-glob b/.fossil-settings/ignore-glob index cab4136..0cf097b 100644 --- a/.fossil-settings/ignore-glob +++ b/.fossil-settings/ignore-glob @@ -9,4 +9,5 @@ mastodont-c config.h treebird test/tests -scripts/*.o \ No newline at end of file +scripts/*.o +perl/*.cpl \ No newline at end of file diff --git a/Makefile b/Makefile index 9a32a50..b7e958f 100644 --- a/Makefile +++ b/Makefile @@ -2,26 +2,31 @@ CC ?= cc GIT ?= git MASTODONT_DIR = mastodont-c/ MASTODONT = $(MASTODONT_DIR)libmastodont.a -CFLAGS += -Wall -I $(MASTODONT_DIR)include/ -Wno-unused-variable -Wno-ignored-qualifiers -I/usr/include/ -I $(MASTODONT_DIR)/libs $(shell pkg-config --cflags libcurl libpcre2-8) -LDFLAGS = -L$(MASTODONT_DIR) -lmastodont $(shell pkg-config --libs libcurl libpcre2-8) -lfcgi -lpthread +CFLAGS += -Wall -I $(MASTODONT_DIR)include/ -Wno-unused-variable -Wno-ignored-qualifiers -I/usr/include/ -I $(MASTODONT_DIR)/libs $(shell pkg-config --cflags libcurl libpcre2-8) `perl -MExtUtils::Embed -e ccopts` +LDFLAGS = -L$(MASTODONT_DIR) -lmastodont $(shell pkg-config --libs libcurl libpcre2-8) -lfcgi -lpthread `perl -MExtUtils::Embed -e ldopts` SRC = $(wildcard src/*.c) OBJ = $(patsubst %.c,%.o,$(SRC)) HEADERS = $(wildcard src/*.h) config.h PAGES_DIR = static +PERL_DIR = perl PAGES = $(wildcard $(PAGES_DIR)/*.tmpl) +PERLS = $(wildcard $(PERL_DIR)/*.pl) PAGES_CMP = $(patsubst %.tmpl,%.ctmpl,$(PAGES)) PAGES_C = $(patsubst %.tmpl, %.c,$(PAGES)) PAGES_C_OBJ = $(patsubst %.c,%.o,$(PAGES_C)) +PERLS_C = $(patsubst %.pl,%.cpl,$(PERLS)) DIST = dist/ PREFIX ?= /usr/local TARGET = treebird +$(info $(PERLS) and $(PERLS_C)) + MASTODONT_URL = https://fossil.nekobit.net/mastodont-c all: $(MASTODONT_DIR) dep_build $(TARGET) apache: all apache_start -$(TARGET): filec template $(PAGES_CMP) $(PAGES_C) $(PAGES_C_OBJ) $(OBJ) $(HEADERS) +$(TARGET): filec template $(PERLS_C) $(PAGES_CMP) $(PAGES_C) $(PAGES_C_OBJ) $(OBJ) $(HEADERS) $(CC) -o $(TARGET) $(OBJ) $(PAGES_C_OBJ) $(LDFLAGS) template: src/template/main.o @@ -39,6 +44,9 @@ emojitoc: scripts/emoji-to.o $(PAGES_DIR)/%.ctmpl: $(PAGES_DIR)/%.tmpl ./template $< $(notdir $*) 2> $(PAGES_DIR)/$(notdir $*).c 1> $@ +$(PERL_DIR)/%.cpl: $(PERL_DIR)/%.pl + ./filec $< data_$(notdir $*)_pl > $@ + $(MASTODONT_DIR): cd ..; fossil clone $(MASTODONT_URL) || true cd treebird; ln -s ../mastodont-c . diff --git a/config.def.h b/config.def.h index a5eed39..34e65c0 100644 --- a/config.def.h +++ b/config.def.h @@ -9,8 +9,10 @@ #ifndef CONFIG_H #define CONFIG_H #include +#if !(defined(FALSE) && defined(TRUE)) #define FALSE 0 #define TRUE 1 +#endif #define UNSET NULL /* diff --git a/perl/main.pl b/perl/main.pl new file mode 100644 index 0000000..8c02b21 --- /dev/null +++ b/perl/main.pl @@ -0,0 +1,9 @@ +use strict; +use warnings; + +sub square +{ + 2 * 2; +} + +print "Hello treebird" . square; diff --git a/src/global_perl.h b/src/global_perl.h new file mode 100644 index 0000000..cf43d4d --- /dev/null +++ b/src/global_perl.h @@ -0,0 +1,26 @@ +/* + * Treebird - Lightweight frontend for Pleroma + * Copyright (C) 2022 Nekobit + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef GLOBAL_PERL_H +#define GLOBAL_PERL_H +#include +#include + +static PerlInterpreter* perl; + +#endif /* GLOBAL_PERL_H */ diff --git a/src/main.c b/src/main.c index d936a60..7fbc59a 100644 --- a/src/main.c +++ b/src/main.c @@ -16,8 +16,11 @@ * along with this program. If not, see . */ +#include +#include #include #include +#include "global_perl.h" #include #include #include @@ -44,6 +47,7 @@ #include "local_config_set.h" #include "global_cache.h" #include "conversations.h" +#include "../perl/main.cpl" #define THREAD_COUNT 20 @@ -190,12 +194,23 @@ static void* cgi_start(void* arg) return NULL; } -int main(void) +int main(int argc, char **argv, char **env) { // Global init mastodont_global_curl_init(); FCGX_Init(); + // Initialize Perl + PERL_SYS_INIT3(&argc, &argv, &env); + perl = perl_alloc(); + perl_construct(perl); + //char* perl_argv[] = { "", "-e", data_main_pl, NULL }; + char* perl_argv[] = { "", "perl/main.pl", NULL }; + + perl_parse(perl, NULL, (sizeof(perl_argv) / sizeof(perl_argv[0])) - 1, perl_argv, (char**)NULL); + PL_exit_flags |= PERL_EXIT_DESTRUCT_END; + perl_run(perl); + // Initiate mastodont library mastodont_t api; mastodont_init(&api); @@ -215,4 +230,9 @@ int main(void) free_instance_info_cache(); mastodont_cleanup(&api); mastodont_global_curl_cleanup(); + + perl_destruct(perl); + perl_free(perl); + PERL_SYS_TERM(); + return EXIT_SUCCESS; } From 004b47ad073ddbf3610839f214cbb45180bfd1e2 Mon Sep 17 00:00:00 2001 From: nekobit Date: Fri, 22 Jul 2022 05:02:59 +0000 Subject: [PATCH 003/143] Perlify config FossilOrigin-Name: e39a49305b7b3a890a937a41550e7d927764bf768e2a8d1b916df553f23c31cf --- perl/main.pl | 5 +++-- src/main.c | 1 - src/session.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/session.h | 2 ++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/perl/main.pl b/perl/main.pl index 8c02b21..a9072b3 100644 --- a/perl/main.pl +++ b/perl/main.pl @@ -1,9 +1,10 @@ use strict; use warnings; -sub square +sub base_page { + 2 * 2; } -print "Hello treebird" . square; +print "Hello from Perl\n"; diff --git a/src/main.c b/src/main.c index 7fbc59a..9939e37 100644 --- a/src/main.c +++ b/src/main.c @@ -225,7 +225,6 @@ int main(int argc, char **argv, char **env) // Hell, let's not sit around here either cgi_start(&api); - free_instance_info_cache(); mastodont_cleanup(&api); diff --git a/src/session.c b/src/session.c index ac4e546..44f1f3d 100644 --- a/src/session.c +++ b/src/session.c @@ -29,3 +29,54 @@ const char* const get_token(struct session* ssn) { return keystr(ssn->cookies.access_token); } + +static HV* perlify_post_values(struct post_values* post) +{ +} + +static HV* perlify_get_values(struct get_values* get) +{ +} + +static HV* perlify_config(struct local_config* config) +{ + HV* ssn_config_hv = newHV(); + + hv_stores(ssn_config_hv, "logged_in", newSVpv(config->logged_in, 0)); + hv_stores(ssn_config_hv, "theme", newSVpv(config->theme, 0)); + hv_stores(ssn_config_hv, "background_url", newSVpv(config->background_url, 0)); + hv_stores(ssn_config_hv, "lang", newSViv(config->lang)); + hv_stores(ssn_config_hv, "themeclr", newSViv(config->themeclr)); + hv_stores(ssn_config_hv, "jsactions", newSViv(config->jsactions)); + hv_stores(ssn_config_hv, "jslive", newSViv(config->jslive)); + hv_stores(ssn_config_hv, "js", newSViv(config->js)); + hv_stores(ssn_config_hv, "interact_img", newSViv(config->interact_img)); + hv_stores(ssn_config_hv, "stat_attachments", newSViv(config->stat_attachments)); + hv_stores(ssn_config_hv, "stat_greentexts", newSViv(config->stat_greentexts)); + hv_stores(ssn_config_hv, "stat_dope", newSViv(config->stat_dope)); + hv_stores(ssn_config_hv, "stat_oneclicksoftware", newSViv(config->stat_oneclicksoftware)); + hv_stores(ssn_config_hv, "stat_emojo_likes", newSViv(config->stat_emojo_likes)); + hv_stores(ssn_config_hv, "stat_hide_muted", newSViv(config->stat_hide_muted)); + hv_stores(ssn_config_hv, "instance_show_shoutbox", newSViv(config->instance_show_shoutbox)); + hv_stores(ssn_config_hv, "instance_panel", newSViv(config->instance_panel)); + hv_stores(ssn_config_hv, "notif_embed", newSViv(config->notif_embed)); + hv_stores(ssn_config_hv, "sidebar_opacity", newSViv(config->sidebar_opacity)); + + return ssn_config_hv; +} + +HV* perlify_session(struct session* ssn) +{ + HV* ssn_hv = newHV(); + hv_stores(ssn_hv, "logged_in", newSVuv(ssn->logged_in)); +// HV* ssn_post_values = perlify_post_values(&(ssn->post)); +// HV* ssn_get_values = perlify_get_values(&(ssn->query)); +// HV* ssn_get_values = perlify_cookie_values(&(ssn->query)) + // Config + HV* ssn_config = perlify_config(&(ssn->config)); + hv_stores(ssn_hv, "config", newRV_inc((SV*)ssn_config)); + + + return ssn_hv; +} + diff --git a/src/session.h b/src/session.h index 6d9a23a..5c4f968 100644 --- a/src/session.h +++ b/src/session.h @@ -19,6 +19,7 @@ #ifndef SESSION_H #define SESSION_H #include +#include "global_perl.h" #include "query.h" #include "local_config.h" #include "cookie.h" @@ -36,5 +37,6 @@ struct session const char* const get_instance(struct session* ssn); const char* const get_token(struct session* ssn); +HV* perlify_session(struct session* ssn); #endif // SESSION_H From 772db3ce2899e3c9d13b3fc0205992e9080927b4 Mon Sep 17 00:00:00 2001 From: nekobit Date: Fri, 22 Jul 2022 22:41:07 +0000 Subject: [PATCH 004/143] perl L10N and Perl Templates FossilOrigin-Name: 06ed73d30ae11c7651dcb87e4b78f9ef7b297b386f8ff0bbd087e22628bc9a68 --- Makefile | 17 +++-- perl/l10n.pm | 89 ++++++++++++++++++++++++++ perl/main.pl | 25 +++++++- src/base_page.c | 155 +++++++++++++++++++++++++-------------------- src/base_page.h | 2 +- src/main.c | 16 ++++- templates/main.ctt | 5 ++ templates/main.tt | 87 +++++++++++++++++++++++++ 8 files changed, 313 insertions(+), 83 deletions(-) create mode 100644 perl/l10n.pm create mode 100644 templates/main.ctt create mode 100644 templates/main.tt diff --git a/Makefile b/Makefile index b7e958f..3c42bb7 100644 --- a/Makefile +++ b/Makefile @@ -8,25 +8,23 @@ SRC = $(wildcard src/*.c) OBJ = $(patsubst %.c,%.o,$(SRC)) HEADERS = $(wildcard src/*.h) config.h PAGES_DIR = static -PERL_DIR = perl +TMPL_DIR = templates PAGES = $(wildcard $(PAGES_DIR)/*.tmpl) -PERLS = $(wildcard $(PERL_DIR)/*.pl) +TMPLS = $(wildcard $(TMPL_DIR)/*.tt) PAGES_CMP = $(patsubst %.tmpl,%.ctmpl,$(PAGES)) PAGES_C = $(patsubst %.tmpl, %.c,$(PAGES)) PAGES_C_OBJ = $(patsubst %.c,%.o,$(PAGES_C)) -PERLS_C = $(patsubst %.pl,%.cpl,$(PERLS)) +TMPLS_C = $(patsubst %.tt,%.ctt,$(TMPLS)) DIST = dist/ PREFIX ?= /usr/local TARGET = treebird -$(info $(PERLS) and $(PERLS_C)) - MASTODONT_URL = https://fossil.nekobit.net/mastodont-c all: $(MASTODONT_DIR) dep_build $(TARGET) apache: all apache_start -$(TARGET): filec template $(PERLS_C) $(PAGES_CMP) $(PAGES_C) $(PAGES_C_OBJ) $(OBJ) $(HEADERS) +$(TARGET): filec template $(TMPLS_C) $(TMPLS) $(PAGES_CMP) $(PAGES_C) $(PAGES_C_OBJ) $(OBJ) $(HEADERS) $(CC) -o $(TARGET) $(OBJ) $(PAGES_C_OBJ) $(LDFLAGS) template: src/template/main.o @@ -41,11 +39,11 @@ emojitoc: scripts/emoji-to.o # Redirect stdout and stderr into separate contents as a hack # Let bash do the work :) -$(PAGES_DIR)/%.ctmpl: $(PAGES_DIR)/%.tmpl +$(PAGES_DIR)/%.ctmpl: $(PAGES_DIR)/%.tmpl $(TMPLS) ./template $< $(notdir $*) 2> $(PAGES_DIR)/$(notdir $*).c 1> $@ -$(PERL_DIR)/%.cpl: $(PERL_DIR)/%.pl - ./filec $< data_$(notdir $*)_pl > $@ +$(TMPL_DIR)/%.ctt: $(TMPL_DIR)/%.tt + ./filec $< data_$(notdir $*)_tt > $@ $(MASTODONT_DIR): cd ..; fossil clone $(MASTODONT_URL) || true @@ -71,6 +69,7 @@ dep_build: clean: rm -f $(OBJ) src/file-to-c/main.o rm -f $(PAGES_CMP) + rm -f $(TMPLS_C) rm -f filec make -C $(MASTODONT_DIR) clean diff --git a/perl/l10n.pm b/perl/l10n.pm new file mode 100644 index 0000000..67c50fc --- /dev/null +++ b/perl/l10n.pm @@ -0,0 +1,89 @@ +package l10n; + +our @EXPORT = qw( %L10N ); + +our %L10N = ( + EN_US => { + APP_NAME => 'Treebird', + HOME => 'Home', + LOCAL => 'Local', + FEDERATED => 'Federated', + NOTIFICATIONS => 'Notifications', + LISTS => 'Lists', + FAVOURITES => 'Favorites', + BOOKMARKS => 'Bookmarks', + DIRECT => 'Direct', + CONFIG => 'Config', + SEARCH_PLACEHOLDER => 'Search', + SEARCH_BUTTON => 'Search', + GENERAL => 'General', + ACCOUNT => 'Account', + JAVASCRIPT => 'JavaScript', + CFG_QUICK_ACTIONS => 'Quick actions - Likes, Boosts, etc done in the background', + CFG_QUICK_REPLY => 'Quick reply - Replies don\'t require redirects', + LIVE_STATUSES => 'Live statuses - Statuses fetch on the fly', + APPEARANCE => 'Appearance', + VARIANT => 'Variant', + THEME_TREEBIRD20 => 'Treebird - Default, simple theme', + THEME_TREEBIRD30 => 'Treebird 3.0 - Flat, modern theme', + COLOR_SCHEME => 'Color Scheme', + LIGHT => 'Light', + DARK => 'Dark', + SAVE => 'Save', + ACCT_MENU => 'Menu', + SUBSCRIBE => 'Subscribe', + UNSUBSCRIBE => 'Unsubscribe', + BLOCK => 'Block', + UNBLOCK => 'Unblock', + MUTE => 'Mute', + UNMUTE => 'Unmute', + TAB_STATUSES => 'Statuses', + TAB_FOLLOWING => 'Following', + TAB_FOLLOWERS => 'Followers', + TAB_SCROBBLES => 'Scrobbles', + TAB_MEDIA => 'Media', + TAB_PINNED => 'Pinned', + FOLLOWS_YOU => 'Follows you!', + FOLLOW => 'Follow', + FOLLOW_PENDING => 'Follow pending', + FOLLOWING => 'Following!', + BLOCKED => 'You are blocked by this user.', + REPLY => 'Reply', + REPEAT => 'Repeat', + LIKE => 'Like', + QUICK => 'Quick', + VIEW => 'View', + IN_REPLY_TO => 'In reply to', + PAGE_NOT_FOUND => 'Content not found', + STATUS_NOT_FOUND => 'Status not found', + ACCOUNT_NOT_FOUND => 'Account not found', + VIS_PUBLIC => 'Public', + VIS_UNLISTED => 'Unlisted', + VIS_PRIVATE => 'Private', + VIS_DIRECT => 'Direct', + VIS_LOCAL => 'Local', + VIS_LIST => 'List', + LOGIN => 'Login', + REGISTER => 'Register', + USERNAME => 'Username', + PASSWORD => 'Password', + LOGIN_BTN => 'Login', + LOGIN_HEADER => 'Login / Register', + LOGIN_FAIL => 'Couldn\'t login', + NOTIF_LIKED => 'liked your status', + NOTIF_REACTED_WITH => 'reacted with %s', + NOTIF_REPEATED => 'repeated your status', + NOTIF_FOLLOW => 'followed you', + NOTIF_FOLLOW_REQUEST => 'wants to follow you', + NOTIF_POLL => 'poll results', + NOTIF_COMPACT_LIKED => 'liked', + NOTIF_COMPACT_REACTED_WITH => 'reacted', + NOTIF_COMPACT_REPEATED => 'repeated', + NOTIF_COMPACT_FOLLOW => 'followed', + COMPACT_FOLLOW_REQUEST => 'wants to follow', + NOTIF_COMPACT_POLL => 'poll', + }, + # TODO bring over Spanish and Chinese +); + +return 1; diff --git a/perl/main.pl b/perl/main.pl index a9072b3..77cac12 100644 --- a/perl/main.pl +++ b/perl/main.pl @@ -1,10 +1,31 @@ use strict; use warnings; +# Modules +use Template; +use l10n; + +my $template = Template->new( + { + INTERPOLATE => 1, + POST_CHOMP => 1, + EVAL_PERL => 1, + TRIM => 1 + }); sub base_page { + my ($ssn, $data) = @_; + my $result; + + my $vars = { + # L10N => L10N, + prefix => '', + lang => sub { $l10n::L10N{'EN_US'}{shift(@_)} }, + }; + + $template->process(\$data, $vars, \$result) || + return $template->error(); - 2 * 2; + $result; } -print "Hello from Perl\n"; diff --git a/src/base_page.c b/src/base_page.c index a47f2b8..cfc8518 100644 --- a/src/base_page.c +++ b/src/base_page.c @@ -33,14 +33,23 @@ // Files #include "../static/index.ctmpl" #include "../static/quick_login.ctmpl" +#include "../templates/main.ctt" #define BODY_STYLE "style=\"background:url('%s');\"" void render_base_page(struct base_page* page, FCGX_Request* req, struct session* ssn, mastodont_t* api) { + dSP; + ENTER; + SAVETMPS; + PUSHMARK(SP); + + HV* session_hv = perlify_session(ssn); + XPUSHs(sv_2mortal(newRV_inc((SV*)session_hv))); + XPUSHs(sv_2mortal(newSVpv(data_main_tt, 0))); + struct mstdnt_args m_args; set_mstdnt_args(&m_args, ssn); - char* cookie = GET_ENV("HTTP_COOKIE", req); enum l10n_locale locale = l10n_normalize(ssn->config.lang); char* theme_str = NULL; const char* login_string = "Login / Register"; @@ -58,62 +67,62 @@ void render_base_page(struct base_page* page, FCGX_Request* req, struct session* #define SIDEBAR_CSS_LEN 128 char sidebar_css[SIDEBAR_CSS_LEN]; - if (keyint(ssn->cookies.logged_in)) - login_string = ""; + /* if (keyint(ssn->cookies.logged_in)) */ + /* login_string = ""; */ - if (ssn->config.background_url) - { - easprintf(&background_url_css, BODY_STYLE, ssn->config.background_url); - } + /* if (ssn->config.background_url) */ + /* { */ + /* easprintf(&background_url_css, BODY_STYLE, ssn->config.background_url); */ + /* } */ - // If user is logged in - if (keystr(ssn->cookies.logged_in) && keystr(ssn->cookies.access_token)) - { - account_sidebar_str = construct_account_sidebar(&(ssn->acct), NULL); + /* // If user is logged in */ + /* if (keystr(ssn->cookies.logged_in) && keystr(ssn->cookies.access_token)) */ + /* { */ + /* account_sidebar_str = construct_account_sidebar(&(ssn->acct), NULL); */ - // Get / Show notifications on sidebar - if (ssn->config.notif_embed) - { - main_sidebar_str = (char*)sidebar_embed; - } - else { - struct mstdnt_get_notifications_args args = { - .exclude_types = 0, - .account_id = NULL, - .exclude_visibilities = 0, - .include_types = 0, - .with_muted = 1, - .max_id = NULL, - .min_id = NULL, - .since_id = NULL, - .offset = 0, - .limit = 8, - }; + /* // Get / Show notifications on sidebar */ + /* if (ssn->config.notif_embed) */ + /* { */ + /* main_sidebar_str = (char*)sidebar_embed; */ + /* } */ + /* else { */ + /* struct mstdnt_get_notifications_args args = { */ + /* .exclude_types = 0, */ + /* .account_id = NULL, */ + /* .exclude_visibilities = 0, */ + /* .include_types = 0, */ + /* .with_muted = 1, */ + /* .max_id = NULL, */ + /* .min_id = NULL, */ + /* .since_id = NULL, */ + /* .offset = 0, */ + /* .limit = 8, */ + /* }; */ - if (mastodont_get_notifications(api, - &m_args, - &args, - &storage, - ¬ifs, - ¬ifs_len) == 0) - { - main_sidebar_str = construct_notifications_compact(ssn, api, notifs, notifs_len, NULL); - } + /* if (mastodont_get_notifications(api, */ + /* &m_args, */ + /* &args, */ + /* &storage, */ + /* ¬ifs, */ + /* ¬ifs_len) == 0) */ + /* { */ + /* main_sidebar_str = construct_notifications_compact(ssn, api, notifs, notifs_len, NULL); */ + /* } */ - mstdnt_cleanup_notifications(notifs, notifs_len); - mastodont_storage_cleanup(&storage); - } - } - else { - // Construct small login page - struct quick_login_template tdata = { - .prefix = config_url_prefix, - .username = L10N[locale][L10N_USERNAME], - .password = L10N[locale][L10N_PASSWORD], - .login = L10N[locale][L10N_LOGIN_BTN], - }; - main_sidebar_str = tmpl_gen_quick_login(&tdata, NULL); - } + /* mstdnt_cleanup_notifications(notifs, notifs_len); */ + /* mastodont_storage_cleanup(&storage); */ + /* } */ + /* } */ + /* else { */ + /* // Construct small login page */ + /* struct quick_login_template tdata = { */ + /* .prefix = config_url_prefix, */ + /* .username = L10N[locale][L10N_USERNAME], */ + /* .password = L10N[locale][L10N_PASSWORD], */ + /* .login = L10N[locale][L10N_LOGIN_BTN], */ + /* }; */ + /* main_sidebar_str = tmpl_gen_quick_login(&tdata, NULL); */ + /* } */ // Combine into sidebar easprintf(&sidebar_str, "%s%s", @@ -180,27 +189,37 @@ void render_base_page(struct base_page* page, FCGX_Request* req, struct session* .source_link_str = "Source code", }; - size_t len; - char* data = tmpl_gen_index(&index_tmpl, &len); +// char* data = tmpl_gen_index(&index_tmpl, &len); - if (!data) - { - perror("malloc"); - goto cleanup; - } + /* if (!data) */ + /* { */ + /* perror("malloc"); */ + /* goto cleanup; */ + /* } */ + + // Run function + PUTBACK; + call_pv("base_page", G_SCALAR); + SPAGAIN; + + char* data = POPp; - send_result(req, NULL, "text/html", data, len); + send_result(req, NULL, "text/html", data, 0); // Cleanup /* cleanup_all: */ - free(data); +// free(data); cleanup: - free(sidebar_str); - if (main_sidebar_str != sidebar_embed) free(main_sidebar_str); - free(account_sidebar_str); - free(background_url_css); - free(instance_str); - free(theme_str); + /* free(sidebar_str); */ + /* if (main_sidebar_str != sidebar_embed) free(main_sidebar_str); */ + /* free(account_sidebar_str); */ + /* free(background_url_css); */ + /* free(instance_str); */ + /* free(theme_str); */ + + PUTBACK; + FREETMPS; + LEAVE; } void send_result(FCGX_Request* req, char* status, char* content_type, char* data, size_t data_len) @@ -216,7 +235,7 @@ void send_result(FCGX_Request* req, char* status, char* content_type, char* data "Content-Length: %d\r\n\r\n", status ? status : "200 OK", content_type ? content_type : "text/html", - data_len + 1); + data_len); #ifdef SINGLE_THREADED puts(data); #else diff --git a/src/base_page.h b/src/base_page.h index 010e08b..48ca5f4 100644 --- a/src/base_page.h +++ b/src/base_page.h @@ -18,13 +18,13 @@ #ifndef BASE_PAGE_H #define BASE_PAGE_H +#include "session.h" #include #include #include #include "l10n.h" #include "local_config.h" #include "path.h" -#include "session.h" enum base_category { diff --git a/src/main.c b/src/main.c index 9939e37..c9c1ebb 100644 --- a/src/main.c +++ b/src/main.c @@ -47,10 +47,14 @@ #include "local_config_set.h" #include "global_cache.h" #include "conversations.h" -#include "../perl/main.cpl" #define THREAD_COUNT 20 +// Allow dynamic loading for Perl +static void xs_init (pTHX); + +EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); + /******************* * Path handling * ******************/ @@ -194,6 +198,12 @@ static void* cgi_start(void* arg) return NULL; } +EXTERN_C void xs_init(pTHX) +{ + char *file = __FILE__; + newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); +} + int main(int argc, char **argv, char **env) { // Global init @@ -205,9 +215,9 @@ int main(int argc, char **argv, char **env) perl = perl_alloc(); perl_construct(perl); //char* perl_argv[] = { "", "-e", data_main_pl, NULL }; - char* perl_argv[] = { "", "perl/main.pl", NULL }; + char* perl_argv[] = { "", "-I", "perl/", "perl/main.pl", NULL }; - perl_parse(perl, NULL, (sizeof(perl_argv) / sizeof(perl_argv[0])) - 1, perl_argv, (char**)NULL); + perl_parse(perl, xs_init, (sizeof(perl_argv) / sizeof(perl_argv[0])) - 1, perl_argv, (char**)NULL); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; perl_run(perl); diff --git a/templates/main.ctt b/templates/main.ctt new file mode 100644 index 0000000..b60dd43 --- /dev/null +++ b/templates/main.ctt @@ -0,0 +1,5 @@ +#ifndef __data_main_tt +#define __data_main_tt +static size_t data_main_tt_size = 5000; +static const char data_main_tt[] = {0X3C,0X21,0X44,0X4F,0X43,0X54,0X59,0X50,0X45,0X20,0X68,0X74,0X6D,0X6C,0X3E,0XA,0X3C,0X68,0X74,0X6D,0X6C,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X62,0X61,0X63,0X6B,0X67,0X72,0X6F,0X75,0X6E,0X64,0X5F,0X75,0X72,0X6C,0X20,0X7D,0X7D,0X3E,0XA,0X20,0X20,0X3C,0X68,0X65,0X61,0X64,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X6D,0X65,0X74,0X61,0X20,0X63,0X68,0X61,0X72,0X73,0X65,0X74,0X3D,0X22,0X75,0X74,0X66,0X2D,0X38,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X74,0X69,0X74,0X6C,0X65,0X3E,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X74,0X69,0X74,0X6C,0X65,0X20,0X7D,0X7D,0X3C,0X2F,0X74,0X69,0X74,0X6C,0X65,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X6E,0X6B,0X20,0X72,0X65,0X6C,0X3D,0X22,0X69,0X63,0X6F,0X6E,0X22,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X69,0X6D,0X61,0X67,0X65,0X2F,0X70,0X6E,0X67,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X2F,0X66,0X61,0X76,0X69,0X63,0X6F,0X6E,0X2E,0X70,0X6E,0X67,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X6E,0X6B,0X20,0X72,0X65,0X6C,0X3D,0X22,0X73,0X74,0X79,0X6C,0X65,0X73,0X68,0X65,0X65,0X74,0X22,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X74,0X65,0X78,0X74,0X2F,0X63,0X73,0X73,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X2F,0X74,0X72,0X65,0X65,0X62,0X69,0X72,0X64,0X2E,0X63,0X73,0X73,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X74,0X68,0X65,0X6D,0X65,0X5F,0X73,0X74,0X72,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X3C,0X6D,0X65,0X74,0X61,0X20,0X6E,0X61,0X6D,0X65,0X3D,0X22,0X76,0X69,0X65,0X77,0X70,0X6F,0X72,0X74,0X22,0X20,0X63,0X6F,0X6E,0X74,0X65,0X6E,0X74,0X3D,0X22,0X77,0X69,0X64,0X74,0X68,0X3D,0X64,0X65,0X76,0X69,0X63,0X65,0X2D,0X77,0X69,0X64,0X74,0X68,0X2C,0X20,0X69,0X6E,0X69,0X74,0X69,0X61,0X6C,0X2D,0X73,0X63,0X61,0X6C,0X65,0X3D,0X31,0X2E,0X30,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X6D,0X65,0X74,0X61,0X20,0X6E,0X61,0X6D,0X65,0X3D,0X22,0X64,0X65,0X73,0X63,0X72,0X69,0X70,0X74,0X69,0X6F,0X6E,0X22,0X20,0X63,0X6F,0X6E,0X74,0X65,0X6E,0X74,0X3D,0X22,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X74,0X69,0X74,0X6C,0X65,0X20,0X7D,0X7D,0X20,0X69,0X73,0X20,0X61,0X20,0X64,0X65,0X63,0X65,0X6E,0X74,0X72,0X61,0X6C,0X69,0X7A,0X65,0X64,0X20,0X73,0X6F,0X63,0X69,0X61,0X6C,0X20,0X6D,0X65,0X64,0X69,0X61,0X20,0X70,0X6C,0X61,0X74,0X66,0X6F,0X72,0X6D,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X73,0X74,0X79,0X6C,0X65,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X5F,0X63,0X73,0X73,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X3C,0X2F,0X73,0X74,0X79,0X6C,0X65,0X3E,0XA,0X20,0X20,0X3C,0X2F,0X68,0X65,0X61,0X64,0X3E,0XA,0X20,0X20,0X3C,0X62,0X6F,0X64,0X79,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X64,0X69,0X76,0X20,0X69,0X64,0X3D,0X22,0X6D,0X61,0X69,0X6E,0X2D,0X70,0X61,0X67,0X65,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X68,0X65,0X61,0X64,0X65,0X72,0X20,0X69,0X64,0X3D,0X22,0X6E,0X61,0X76,0X62,0X61,0X72,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X61,0X62,0X65,0X6C,0X20,0X66,0X6F,0X72,0X3D,0X22,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X76,0X67,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X2D,0X62,0X74,0X6E,0X20,0X6E,0X61,0X76,0X62,0X61,0X72,0X2D,0X62,0X74,0X6E,0X22,0X20,0X78,0X6D,0X6C,0X6E,0X73,0X3D,0X22,0X68,0X74,0X74,0X70,0X3A,0X2F,0X2F,0X77,0X77,0X77,0X2E,0X77,0X33,0X2E,0X6F,0X72,0X67,0X2F,0X32,0X30,0X30,0X30,0X2F,0X73,0X76,0X67,0X22,0X20,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X30,0X22,0X20,0X68,0X65,0X69,0X67,0X68,0X74,0X3D,0X22,0X32,0X30,0X22,0X20,0X76,0X69,0X65,0X77,0X42,0X6F,0X78,0X3D,0X22,0X30,0X20,0X30,0X20,0X32,0X34,0X20,0X32,0X34,0X22,0X20,0X66,0X69,0X6C,0X6C,0X3D,0X22,0X6E,0X6F,0X6E,0X65,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X3D,0X22,0X23,0X30,0X30,0X30,0X30,0X30,0X30,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X63,0X61,0X70,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X6A,0X6F,0X69,0X6E,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X3E,0X3C,0X6C,0X69,0X6E,0X65,0X20,0X78,0X31,0X3D,0X22,0X33,0X22,0X20,0X79,0X31,0X3D,0X22,0X31,0X32,0X22,0X20,0X78,0X32,0X3D,0X22,0X32,0X31,0X22,0X20,0X79,0X32,0X3D,0X22,0X31,0X32,0X22,0X3E,0X3C,0X2F,0X6C,0X69,0X6E,0X65,0X3E,0X3C,0X6C,0X69,0X6E,0X65,0X20,0X78,0X31,0X3D,0X22,0X33,0X22,0X20,0X79,0X31,0X3D,0X22,0X36,0X22,0X20,0X78,0X32,0X3D,0X22,0X32,0X31,0X22,0X20,0X79,0X32,0X3D,0X22,0X36,0X22,0X3E,0X3C,0X2F,0X6C,0X69,0X6E,0X65,0X3E,0X3C,0X6C,0X69,0X6E,0X65,0X20,0X78,0X31,0X3D,0X22,0X33,0X22,0X20,0X79,0X31,0X3D,0X22,0X31,0X38,0X22,0X20,0X78,0X32,0X3D,0X22,0X32,0X31,0X22,0X20,0X79,0X32,0X3D,0X22,0X31,0X38,0X22,0X3E,0X3C,0X2F,0X6C,0X69,0X6E,0X65,0X3E,0X3C,0X2F,0X73,0X76,0X67,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X6C,0X61,0X62,0X65,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X70,0X72,0X65,0X66,0X69,0X78,0X20,0X7D,0X7D,0X2F,0X22,0X3E,0X3C,0X69,0X6D,0X67,0X20,0X73,0X72,0X63,0X3D,0X22,0X2F,0X74,0X72,0X65,0X65,0X62,0X69,0X72,0X64,0X5F,0X6C,0X6F,0X67,0X6F,0X2E,0X70,0X6E,0X67,0X22,0X20,0X68,0X65,0X69,0X67,0X68,0X74,0X3D,0X22,0X34,0X32,0X22,0X3E,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X70,0X61,0X6E,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X69,0X6E,0X66,0X6F,0X22,0X3E,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X6E,0X61,0X6D,0X65,0X20,0X7D,0X7D,0X3C,0X2F,0X73,0X70,0X61,0X6E,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X61,0X62,0X65,0X6C,0X20,0X66,0X6F,0X72,0X3D,0X22,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X76,0X67,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X2D,0X62,0X74,0X6E,0X20,0X6E,0X61,0X76,0X62,0X61,0X72,0X2D,0X62,0X74,0X6E,0X22,0X20,0X78,0X6D,0X6C,0X6E,0X73,0X3D,0X22,0X68,0X74,0X74,0X70,0X3A,0X2F,0X2F,0X77,0X77,0X77,0X2E,0X77,0X33,0X2E,0X6F,0X72,0X67,0X2F,0X32,0X30,0X30,0X30,0X2F,0X73,0X76,0X67,0X22,0X20,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X30,0X22,0X20,0X68,0X65,0X69,0X67,0X68,0X74,0X3D,0X22,0X32,0X30,0X22,0X20,0X76,0X69,0X65,0X77,0X42,0X6F,0X78,0X3D,0X22,0X30,0X20,0X30,0X20,0X32,0X34,0X20,0X32,0X34,0X22,0X20,0X66,0X69,0X6C,0X6C,0X3D,0X22,0X6E,0X6F,0X6E,0X65,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X3D,0X22,0X23,0X30,0X30,0X30,0X30,0X30,0X30,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X63,0X61,0X70,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X6A,0X6F,0X69,0X6E,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X3E,0X3C,0X70,0X61,0X74,0X68,0X20,0X64,0X3D,0X22,0X4D,0X32,0X32,0X20,0X31,0X37,0X48,0X32,0X61,0X33,0X20,0X33,0X20,0X30,0X20,0X30,0X20,0X30,0X20,0X33,0X2D,0X33,0X56,0X39,0X61,0X37,0X20,0X37,0X20,0X30,0X20,0X30,0X20,0X31,0X20,0X31,0X34,0X20,0X30,0X76,0X35,0X61,0X33,0X20,0X33,0X20,0X30,0X20,0X30,0X20,0X30,0X20,0X33,0X20,0X33,0X7A,0X6D,0X2D,0X38,0X2E,0X32,0X37,0X20,0X34,0X61,0X32,0X20,0X32,0X20,0X30,0X20,0X30,0X20,0X31,0X2D,0X33,0X2E,0X34,0X36,0X20,0X30,0X22,0X3E,0X3C,0X2F,0X70,0X61,0X74,0X68,0X3E,0X3C,0X2F,0X73,0X76,0X67,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X6C,0X61,0X62,0X65,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X61,0X62,0X65,0X6C,0X20,0X66,0X6F,0X72,0X3D,0X22,0X73,0X65,0X61,0X72,0X63,0X68,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X76,0X67,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X65,0X61,0X72,0X63,0X68,0X2D,0X62,0X74,0X6E,0X2D,0X73,0X68,0X6F,0X77,0X22,0X20,0X78,0X6D,0X6C,0X6E,0X73,0X3D,0X22,0X68,0X74,0X74,0X70,0X3A,0X2F,0X2F,0X77,0X77,0X77,0X2E,0X77,0X33,0X2E,0X6F,0X72,0X67,0X2F,0X32,0X30,0X30,0X30,0X2F,0X73,0X76,0X67,0X22,0X20,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X30,0X22,0X20,0X68,0X65,0X69,0X67,0X68,0X74,0X3D,0X22,0X32,0X30,0X22,0X20,0X76,0X69,0X65,0X77,0X42,0X6F,0X78,0X3D,0X22,0X30,0X20,0X30,0X20,0X32,0X34,0X20,0X32,0X34,0X22,0X20,0X66,0X69,0X6C,0X6C,0X3D,0X22,0X6E,0X6F,0X6E,0X65,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X3D,0X22,0X23,0X30,0X30,0X30,0X30,0X30,0X30,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X63,0X61,0X70,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X6A,0X6F,0X69,0X6E,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X3E,0X3C,0X63,0X69,0X72,0X63,0X6C,0X65,0X20,0X63,0X78,0X3D,0X22,0X31,0X31,0X22,0X20,0X63,0X79,0X3D,0X22,0X31,0X31,0X22,0X20,0X72,0X3D,0X22,0X38,0X22,0X3E,0X3C,0X2F,0X63,0X69,0X72,0X63,0X6C,0X65,0X3E,0X3C,0X6C,0X69,0X6E,0X65,0X20,0X78,0X31,0X3D,0X22,0X32,0X31,0X22,0X20,0X79,0X31,0X3D,0X22,0X32,0X31,0X22,0X20,0X78,0X32,0X3D,0X22,0X31,0X36,0X2E,0X36,0X35,0X22,0X20,0X79,0X32,0X3D,0X22,0X31,0X36,0X2E,0X36,0X35,0X22,0X3E,0X3C,0X2F,0X6C,0X69,0X6E,0X65,0X3E,0X3C,0X2F,0X73,0X76,0X67,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X6C,0X61,0X62,0X65,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X63,0X68,0X65,0X63,0X6B,0X62,0X6F,0X78,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X68,0X69,0X64,0X64,0X65,0X6E,0X22,0X20,0X69,0X64,0X3D,0X22,0X73,0X65,0X61,0X72,0X63,0X68,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X64,0X69,0X76,0X20,0X69,0X64,0X3D,0X22,0X6E,0X61,0X76,0X62,0X61,0X72,0X2D,0X72,0X69,0X67,0X68,0X74,0X2D,0X63,0X6F,0X6E,0X74,0X61,0X69,0X6E,0X65,0X72,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X64,0X69,0X76,0X20,0X69,0X64,0X3D,0X22,0X6E,0X61,0X76,0X62,0X61,0X72,0X2D,0X72,0X69,0X67,0X68,0X74,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X5F,0X63,0X6E,0X74,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X53,0X65,0X61,0X72,0X63,0X68,0X62,0X6F,0X78,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X66,0X6F,0X72,0X6D,0X20,0X61,0X63,0X74,0X69,0X6F,0X6E,0X3D,0X22,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X70,0X72,0X65,0X66,0X69,0X78,0X20,0X7D,0X7D,0X2F,0X73,0X65,0X61,0X72,0X63,0X68,0X22,0X20,0X6D,0X65,0X74,0X68,0X6F,0X64,0X3D,0X22,0X67,0X65,0X74,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X74,0X65,0X78,0X74,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X67,0X72,0X6F,0X75,0X70,0X20,0X67,0X72,0X6F,0X75,0X70,0X2D,0X6C,0X65,0X66,0X74,0X20,0X67,0X72,0X6F,0X75,0X70,0X2D,0X69,0X6E,0X70,0X75,0X74,0X62,0X6F,0X78,0X22,0X20,0X70,0X6C,0X61,0X63,0X65,0X68,0X6F,0X6C,0X64,0X65,0X72,0X3D,0X22,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X53,0X45,0X41,0X52,0X43,0X48,0X5F,0X50,0X4C,0X41,0X43,0X45,0X48,0X4F,0X4C,0X44,0X45,0X52,0X27,0X29,0X20,0X25,0X5D,0X22,0X20,0X69,0X64,0X3D,0X22,0X73,0X65,0X61,0X72,0X63,0X68,0X62,0X6F,0X78,0X22,0X20,0X6E,0X61,0X6D,0X65,0X3D,0X22,0X71,0X22,0X3E,0X3C,0X21,0X2D,0X2D,0X20,0X69,0X20,0X68,0X61,0X74,0X65,0X20,0X48,0X54,0X4D,0X4C,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X2D,0X2D,0X3E,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X73,0X75,0X62,0X6D,0X69,0X74,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X62,0X74,0X6E,0X20,0X67,0X72,0X6F,0X75,0X70,0X20,0X67,0X72,0X6F,0X75,0X70,0X2D,0X72,0X69,0X67,0X68,0X74,0X22,0X20,0X76,0X61,0X6C,0X75,0X65,0X3D,0X22,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X53,0X45,0X41,0X52,0X43,0X48,0X5F,0X42,0X55,0X54,0X54,0X4F,0X4E,0X27,0X29,0X20,0X25,0X5D,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X66,0X6F,0X72,0X6D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X64,0X69,0X76,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X64,0X69,0X76,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X68,0X65,0X61,0X64,0X65,0X72,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X63,0X68,0X65,0X63,0X6B,0X62,0X6F,0X78,0X22,0X20,0X69,0X64,0X3D,0X22,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X68,0X69,0X64,0X64,0X65,0X6E,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X63,0X68,0X65,0X63,0X6B,0X62,0X6F,0X78,0X22,0X20,0X69,0X64,0X3D,0X22,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X68,0X69,0X64,0X64,0X65,0X6E,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X61,0X62,0X6C,0X65,0X20,0X69,0X64,0X3D,0X22,0X63,0X6F,0X6E,0X74,0X65,0X6E,0X74,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X75,0X69,0X2D,0X74,0X61,0X62,0X6C,0X65,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X4E,0X61,0X76,0X69,0X67,0X61,0X74,0X69,0X6F,0X6E,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X72,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X64,0X20,0X69,0X64,0X3D,0X22,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X75,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X68,0X6F,0X6D,0X65,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X48,0X4F,0X4D,0X45,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X6C,0X6F,0X63,0X61,0X6C,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X6C,0X6F,0X63,0X61,0X6C,0X2F,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X4C,0X4F,0X43,0X41,0X4C,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X66,0X65,0X64,0X65,0X72,0X61,0X74,0X65,0X64,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X66,0X65,0X64,0X65,0X72,0X61,0X74,0X65,0X64,0X2F,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X46,0X45,0X44,0X45,0X52,0X41,0X54,0X45,0X44,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X6E,0X6F,0X74,0X69,0X66,0X69,0X63,0X61,0X74,0X69,0X6F,0X6E,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X6E,0X6F,0X74,0X69,0X66,0X69,0X63,0X61,0X74,0X69,0X6F,0X6E,0X73,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X4E,0X4F,0X54,0X49,0X46,0X49,0X43,0X41,0X54,0X49,0X4F,0X4E,0X53,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X6C,0X69,0X73,0X74,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X6C,0X69,0X73,0X74,0X73,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X4C,0X49,0X53,0X54,0X53,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X66,0X61,0X76,0X6F,0X75,0X72,0X69,0X74,0X65,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X66,0X61,0X76,0X6F,0X75,0X72,0X69,0X74,0X65,0X73,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X46,0X41,0X56,0X4F,0X55,0X52,0X49,0X54,0X45,0X53,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X62,0X6F,0X6F,0X6B,0X6D,0X61,0X72,0X6B,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X62,0X6F,0X6F,0X6B,0X6D,0X61,0X72,0X6B,0X73,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X42,0X4F,0X4F,0X4B,0X4D,0X41,0X52,0X4B,0X53,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X64,0X69,0X72,0X65,0X63,0X74,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X64,0X69,0X72,0X65,0X63,0X74,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X44,0X49,0X52,0X45,0X43,0X54,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X63,0X68,0X61,0X74,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X63,0X68,0X61,0X74,0X73,0X22,0X3E,0X43,0X68,0X61,0X74,0X73,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X63,0X6F,0X6E,0X66,0X69,0X67,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X63,0X6F,0X6E,0X66,0X69,0X67,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X43,0X4F,0X4E,0X46,0X49,0X47,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X75,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X5F,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X69,0X6E,0X73,0X74,0X61,0X6E,0X63,0X65,0X5F,0X70,0X61,0X6E,0X65,0X6C,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X64,0X69,0X76,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X6D,0X69,0X6E,0X69,0X2D,0X6C,0X69,0X6E,0X6B,0X73,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X7B,0X7B,0X25,0X73,0X3A,0X70,0X72,0X65,0X66,0X69,0X78,0X7D,0X7D,0X2F,0X61,0X62,0X6F,0X75,0X74,0X22,0X3E,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X62,0X6F,0X75,0X74,0X5F,0X6C,0X69,0X6E,0X6B,0X5F,0X73,0X74,0X72,0X20,0X7D,0X7D,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X70,0X61,0X6E,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X62,0X75,0X6C,0X6C,0X65,0X74,0X2D,0X73,0X65,0X70,0X61,0X72,0X61,0X74,0X65,0X22,0X3E,0X26,0X62,0X75,0X6C,0X6C,0X3B,0X3C,0X2F,0X73,0X70,0X61,0X6E,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X7B,0X7B,0X25,0X73,0X3A,0X70,0X72,0X65,0X66,0X69,0X78,0X7D,0X7D,0X2F,0X61,0X62,0X6F,0X75,0X74,0X2F,0X6C,0X69,0X63,0X65,0X6E,0X73,0X65,0X22,0X3E,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X6C,0X69,0X63,0X65,0X6E,0X73,0X65,0X5F,0X6C,0X69,0X6E,0X6B,0X5F,0X73,0X74,0X72,0X20,0X7D,0X7D,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X70,0X61,0X6E,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X62,0X75,0X6C,0X6C,0X65,0X74,0X2D,0X73,0X65,0X70,0X61,0X72,0X61,0X74,0X65,0X22,0X3E,0X26,0X62,0X75,0X6C,0X6C,0X3B,0X3C,0X2F,0X73,0X70,0X61,0X6E,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X68,0X74,0X74,0X70,0X73,0X3A,0X2F,0X2F,0X66,0X6F,0X73,0X73,0X69,0X6C,0X2E,0X6E,0X65,0X6B,0X6F,0X62,0X69,0X74,0X2E,0X6E,0X65,0X74,0X2F,0X74,0X72,0X65,0X65,0X62,0X69,0X72,0X64,0X22,0X3E,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X73,0X6F,0X75,0X72,0X63,0X65,0X5F,0X6C,0X69,0X6E,0X6B,0X5F,0X73,0X74,0X72,0X20,0X7D,0X7D,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X64,0X69,0X76,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X64,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X44,0X69,0X73,0X70,0X6C,0X61,0X79,0X20,0X66,0X6F,0X72,0X20,0X70,0X6F,0X73,0X74,0X73,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X64,0X20,0X69,0X64,0X3D,0X22,0X6D,0X61,0X69,0X6E,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X6D,0X61,0X69,0X6E,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X64,0X3E,0XA,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X4E,0X6F,0X74,0X69,0X66,0X69,0X63,0X61,0X74,0X69,0X6F,0X6E,0X73,0X20,0X61,0X6E,0X64,0X20,0X73,0X75,0X63,0X68,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X64,0X20,0X69,0X64,0X3D,0X22,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X5F,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X64,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X72,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X61,0X62,0X6C,0X65,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X2F,0X64,0X69,0X76,0X3E,0XA,0X20,0X20,0X20,0X20,0XA,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X53,0X6F,0X75,0X72,0X63,0X65,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X73,0X63,0X72,0X69,0X70,0X74,0X20,0X73,0X72,0X63,0X3D,0X22,0X2F,0X6A,0X73,0X2F,0X6D,0X61,0X69,0X6E,0X2E,0X6A,0X73,0X22,0X3E,0X3C,0X2F,0X73,0X63,0X72,0X69,0X70,0X74,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X73,0X63,0X72,0X69,0X70,0X74,0X20,0X73,0X72,0X63,0X3D,0X22,0X2F,0X6A,0X73,0X2F,0X65,0X6D,0X6F,0X6A,0X69,0X2E,0X6A,0X73,0X22,0X3E,0X3C,0X2F,0X73,0X63,0X72,0X69,0X70,0X74,0X3E,0XA,0X20,0X20,0X3C,0X2F,0X62,0X6F,0X64,0X79,0X3E,0XA,0X3C,0X2F,0X68,0X74,0X6D,0X6C,0X3E,0XA,0}; +#endif diff --git a/templates/main.tt b/templates/main.tt new file mode 100644 index 0000000..2e26ff7 --- /dev/null +++ b/templates/main.tt @@ -0,0 +1,87 @@ + + + + + {{ %s : title }} + + + {{ %s : theme_str }} + + + + + +
+ + + + + + + + + + + + + + +
+ {{ %s : main }} +
+
+ + + + + + From bba2ad9cdad7c7c6a82bd4c020d5e7645e4995d5 Mon Sep 17 00:00:00 2001 From: nekobit Date: Sat, 23 Jul 2022 05:32:17 +0000 Subject: [PATCH 005/143] More perl shit FossilOrigin-Name: 3e3d09e82d3730e070a60b59be3c4ad69c1f3c965c3bf027673e9a3811825eb6 --- perl/l10n.pm | 2 ++ perl/main.pl | 11 +++++---- src/cookie.c | 32 ++++++++++++++++++++++++++ src/cookie.h | 3 +++ src/local_config.c | 48 +++++++++++++++++++++++++++++++++++++++ src/local_config.h | 3 +++ src/query.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++ src/query.h | 5 +++++ src/session.c | 45 +++++-------------------------------- 9 files changed, 160 insertions(+), 45 deletions(-) create mode 100644 src/local_config.c diff --git a/perl/l10n.pm b/perl/l10n.pm index 67c50fc..e69fee3 100644 --- a/perl/l10n.pm +++ b/perl/l10n.pm @@ -1,5 +1,7 @@ package l10n; +use Exporter 'import'; + our @EXPORT = qw( %L10N ); our %L10N = ( diff --git a/perl/main.pl b/perl/main.pl index 77cac12..548227c 100644 --- a/perl/main.pl +++ b/perl/main.pl @@ -2,7 +2,7 @@ use strict; use warnings; # Modules use Template; -use l10n; +use l10n qw( %L10N ); my $template = Template->new( { @@ -17,13 +17,12 @@ sub base_page my ($ssn, $data) = @_; my $result; - my $vars = { - # L10N => L10N, + my %vars = ( prefix => '', - lang => sub { $l10n::L10N{'EN_US'}{shift(@_)} }, - }; + lang => sub { $L10N{'EN_US'}->{shift(@_)} }, + ); - $template->process(\$data, $vars, \$result) || + $template->process(\$data, \%vars, \$result) || return $template->error(); $result; diff --git a/src/cookie.c b/src/cookie.c index 6be7e9a..dec504e 100644 --- a/src/cookie.c +++ b/src/cookie.c @@ -164,3 +164,35 @@ int cookie_get_val(char* src, char* key, struct http_cookie_info* info) return 1; } + +HV* perlify_cookies(struct cookie_values* cookies) +{ + HV* ssn_cookies_hv = newHV(); + + hv_stores(ssn_cookies_hv, "lang", newSViv(keyint(cookies->lang))); + hv_stores(ssn_cookies_hv, "interact_img", newSViv(keyint(cookies->interact_img))); + hv_stores(ssn_cookies_hv, "themeclr", newSViv(keyint(cookies->themeclr))); + hv_stores(ssn_cookies_hv, "jsactions", newSViv(keyint(cookies->jsactions))); + hv_stores(ssn_cookies_hv, "jsreply", newSViv(keyint(cookies->jsreply))); + hv_stores(ssn_cookies_hv, "jslive", newSViv(keyint(cookies->jslive))); + hv_stores(ssn_cookies_hv, "js", newSViv(keyint(cookies->js))); + hv_stores(ssn_cookies_hv, "interact_img", newSViv(keyint(cookies->interact_img))); + hv_stores(ssn_cookies_hv, "statattachments", newSViv(keyint(cookies->stat_attachments))); + hv_stores(ssn_cookies_hv, "statgreentexts", newSViv(keyint(cookies->stat_greentexts))); + hv_stores(ssn_cookies_hv, "statdope", newSViv(keyint(cookies->stat_dope))); + hv_stores(ssn_cookies_hv, "statoneclicksoftware", newSViv(keyint(cookies->stat_oneclicksoftware))); + hv_stores(ssn_cookies_hv, "statemojolikes", newSViv(keyint(cookies->stat_emojo_likes))); + hv_stores(ssn_cookies_hv, "stathidemuted", newSViv(keyint(cookies->stat_hide_muted))); + hv_stores(ssn_cookies_hv, "instanceshowshoutbox", newSViv(keyint(cookies->instance_show_shoutbox))); + hv_stores(ssn_cookies_hv, "instancepanel", newSViv(keyint(cookies->instance_panel))); + hv_stores(ssn_cookies_hv, "notifembed", newSViv(keyint(cookies->notif_embed))); + hv_stores(ssn_cookies_hv, "access_token", newSVpv(keystr(cookies->access_token), 0)); + hv_stores(ssn_cookies_hv, "logged_in", newSVpv(keystr(cookies->logged_in), 0)); + hv_stores(ssn_cookies_hv, "theme", newSVpv(keystr(cookies->theme), 0)); + hv_stores(ssn_cookies_hv, "instance_url", newSVpv(keystr(cookies->instance_url), 0)); + hv_stores(ssn_cookies_hv, "background_url", newSVpv(keystr(cookies->background_url), 0)); + hv_stores(ssn_cookies_hv, "client_id", newSVpv(keystr(cookies->client_id), 0)); + hv_stores(ssn_cookies_hv, "client_secret", newSVpv(keystr(cookies->client_secret), 0)); + + return ssn_cookies_hv; +} diff --git a/src/cookie.h b/src/cookie.h index a9b4e39..77ace71 100644 --- a/src/cookie.h +++ b/src/cookie.h @@ -19,6 +19,7 @@ #ifndef COOKIE_H #define COOKIE_H #include +#include "global_perl.h" #include "key.h" struct cookie_values @@ -61,4 +62,6 @@ char* parse_cookies(char* begin, struct http_cookie_info* info); char* read_cookies_env(FCGX_Request* req, struct cookie_values* cookies); int cookie_get_val(char* src, char* key, struct http_cookie_info* info); +HV* perlify_cookies(struct cookie_values* cookies); + #endif // COOKIE_H diff --git a/src/local_config.c b/src/local_config.c new file mode 100644 index 0000000..2bfc3a5 --- /dev/null +++ b/src/local_config.c @@ -0,0 +1,48 @@ +/* + * Treebird - Lightweight frontend for Pleroma + * Copyright (C) 2022 Nekobit + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include "global_perl.h" +#include "local_config.h" + +HV* perlify_config(struct local_config* config) +{ + HV* ssn_config_hv = newHV(); + + hv_stores(ssn_config_hv, "logged_in", newSVpv(config->logged_in, 0)); + hv_stores(ssn_config_hv, "theme", newSVpv(config->theme, 0)); + hv_stores(ssn_config_hv, "background_url", newSVpv(config->background_url, 0)); + hv_stores(ssn_config_hv, "lang", newSViv(config->lang)); + hv_stores(ssn_config_hv, "themeclr", newSViv(config->themeclr)); + hv_stores(ssn_config_hv, "jsactions", newSViv(config->jsactions)); + hv_stores(ssn_config_hv, "jslive", newSViv(config->jslive)); + hv_stores(ssn_config_hv, "js", newSViv(config->js)); + hv_stores(ssn_config_hv, "interact_img", newSViv(config->interact_img)); + hv_stores(ssn_config_hv, "stat_attachments", newSViv(config->stat_attachments)); + hv_stores(ssn_config_hv, "stat_greentexts", newSViv(config->stat_greentexts)); + hv_stores(ssn_config_hv, "stat_dope", newSViv(config->stat_dope)); + hv_stores(ssn_config_hv, "stat_oneclicksoftware", newSViv(config->stat_oneclicksoftware)); + hv_stores(ssn_config_hv, "stat_emojo_likes", newSViv(config->stat_emojo_likes)); + hv_stores(ssn_config_hv, "stat_hide_muted", newSViv(config->stat_hide_muted)); + hv_stores(ssn_config_hv, "instance_show_shoutbox", newSViv(config->instance_show_shoutbox)); + hv_stores(ssn_config_hv, "instance_panel", newSViv(config->instance_panel)); + hv_stores(ssn_config_hv, "notif_embed", newSViv(config->notif_embed)); + hv_stores(ssn_config_hv, "sidebar_opacity", newSViv(config->sidebar_opacity)); + + return ssn_config_hv; +} + diff --git a/src/local_config.h b/src/local_config.h index 3eb092f..e1b0578 100644 --- a/src/local_config.h +++ b/src/local_config.h @@ -18,6 +18,7 @@ #ifndef LOCAL_CONFIG_H #define LOCAL_CONFIG_H +#include "global_perl.h" #include "query.h" struct local_config @@ -44,4 +45,6 @@ struct local_config int sidebar_opacity; }; +HV* perlify_config(struct local_config* config); + #endif // LOCAL_CONFIG_H diff --git a/src/query.c b/src/query.c index cc62c1f..7968cce 100644 --- a/src/query.c +++ b/src/query.c @@ -262,3 +262,59 @@ void free_files(struct file_array* files) } free(content); } + +HV* perlify_post_values(struct post_values* post) +{ + HV* ssn_post_hv = newHV(); + + // This ugly... + hv_stores(ssn_post_hv, "theme", newSVpv(keystr(post->theme), 0)); + hv_stores(ssn_post_hv, "themeclr", newSViv(keyint(post->themeclr))); + hv_stores(ssn_post_hv, "lang", newSViv(keyint(post->lang))); + hv_stores(ssn_post_hv, "title", newSViv(keyint(post->title))); + hv_stores(ssn_post_hv, "jsactions", newSViv(keyint(post->jsactions))); + hv_stores(ssn_post_hv, "jsreply", newSViv(keyint(post->jsreply))); + hv_stores(ssn_post_hv, "jslive", newSViv(keyint(post->jslive))); + hv_stores(ssn_post_hv, "js", newSViv(keyint(post->js))); + hv_stores(ssn_post_hv, "interact_img", newSViv(keyint(post->interact_img))); + hv_stores(ssn_post_hv, "stat_attachments", newSViv(keyint(post->stat_attachments))); + hv_stores(ssn_post_hv, "stat_greentexts", newSViv(keyint(post->stat_greentexts))); + hv_stores(ssn_post_hv, "stat_dope", newSViv(keyint(post->stat_dope))); + hv_stores(ssn_post_hv, "stat_oneclicksoftware", newSViv(keyint(post->stat_oneclicksoftware))); + hv_stores(ssn_post_hv, "stat_emojo_likes", newSViv(keyint(post->stat_emojo_likes))); + hv_stores(ssn_post_hv, "stat_hide_muted", newSViv(keyint(post->stat_hide_muted))); + hv_stores(ssn_post_hv, "instance_show_shoutbox", newSViv(keyint(post->instance_show_shoutbox))); + hv_stores(ssn_post_hv, "instance_panel", newSViv(keyint(post->instance_panel))); + hv_stores(ssn_post_hv, "notif_embed", newSViv(keyint(post->notif_embed))); + hv_stores(ssn_post_hv, "set", newSViv(keyint(post->set))); + hv_stores(ssn_post_hv, "only_media", newSViv(keyint(post->only_media))); + hv_stores(ssn_post_hv, "replies_only", newSViv(keyint(post->replies_only))); + hv_stores(ssn_post_hv, "replies_policy", newSViv(keyint(post->replies_policy))); + hv_stores(ssn_post_hv, "emojoindex", newSViv(keyint(post->emojoindex))); + hv_stores(ssn_post_hv, "sidebar_opacity", newSViv(keyint(post->sidebar_opacity))); + hv_stores(ssn_post_hv, "file_ids", newSVpv(keystr(post->file_ids), 0)); + hv_stores(ssn_post_hv, "content", newSVpv(keystr(post->content), 0)); + hv_stores(ssn_post_hv, "itype", newSVpv(keystr(post->itype), 0)); + hv_stores(ssn_post_hv, "id", newSVpv(keystr(post->id), 0)); + hv_stores(ssn_post_hv, "username", newSVpv(keystr(post->username), 0)); + hv_stores(ssn_post_hv, "password", newSVpv(keystr(post->password), 0)); + hv_stores(ssn_post_hv, "replyid", newSVpv(keystr(post->replyid), 0)); + hv_stores(ssn_post_hv, "visibility", newSVpv(keystr(post->visibility), 0)); + hv_stores(ssn_post_hv, "instance", newSVpv(keystr(post->instance), 0)); + hv_stores(ssn_post_hv, "min_id", newSVpv(keystr(post->min_id), 0)); + hv_stores(ssn_post_hv, "max_id", newSVpv(keystr(post->max_id), 0)); + hv_stores(ssn_post_hv, "start_id", newSVpv(keystr(post->start_id), 0)); + + return ssn_post_hv; +} + +HV* perlify_get_values(struct get_values* get) +{ + HV* ssn_query_hv = newHV(); + + hv_stores(ssn_query_hv, "offset", newSVpv(keystr(get->offset), 0)); + hv_stores(ssn_query_hv, "query", newSVpv(keystr(get->query), 0)); + hv_stores(ssn_query_hv, "code", newSVpv(keystr(get->code), 0)); + + return ssn_query_hv; +} diff --git a/src/query.h b/src/query.h index 8354ccb..b78dfde 100644 --- a/src/query.h +++ b/src/query.h @@ -18,6 +18,7 @@ #ifndef QUERY_H #define QUERY_H +#include "global_perl.h" #include #include #include "key.h" @@ -89,4 +90,8 @@ char* try_handle_post(FCGX_Request* req, void (*call)(struct http_query_info*, v void free_files(struct file_array* files); +// Perl stuff +HV* perlify_post_values(struct post_values* post); +HV* perlify_get_values(struct get_values* get); + #endif // QUERY_H diff --git a/src/session.c b/src/session.c index 44f1f3d..ef7557b 100644 --- a/src/session.c +++ b/src/session.c @@ -30,52 +30,19 @@ const char* const get_token(struct session* ssn) return keystr(ssn->cookies.access_token); } -static HV* perlify_post_values(struct post_values* post) -{ -} - -static HV* perlify_get_values(struct get_values* get) -{ -} - -static HV* perlify_config(struct local_config* config) -{ - HV* ssn_config_hv = newHV(); - - hv_stores(ssn_config_hv, "logged_in", newSVpv(config->logged_in, 0)); - hv_stores(ssn_config_hv, "theme", newSVpv(config->theme, 0)); - hv_stores(ssn_config_hv, "background_url", newSVpv(config->background_url, 0)); - hv_stores(ssn_config_hv, "lang", newSViv(config->lang)); - hv_stores(ssn_config_hv, "themeclr", newSViv(config->themeclr)); - hv_stores(ssn_config_hv, "jsactions", newSViv(config->jsactions)); - hv_stores(ssn_config_hv, "jslive", newSViv(config->jslive)); - hv_stores(ssn_config_hv, "js", newSViv(config->js)); - hv_stores(ssn_config_hv, "interact_img", newSViv(config->interact_img)); - hv_stores(ssn_config_hv, "stat_attachments", newSViv(config->stat_attachments)); - hv_stores(ssn_config_hv, "stat_greentexts", newSViv(config->stat_greentexts)); - hv_stores(ssn_config_hv, "stat_dope", newSViv(config->stat_dope)); - hv_stores(ssn_config_hv, "stat_oneclicksoftware", newSViv(config->stat_oneclicksoftware)); - hv_stores(ssn_config_hv, "stat_emojo_likes", newSViv(config->stat_emojo_likes)); - hv_stores(ssn_config_hv, "stat_hide_muted", newSViv(config->stat_hide_muted)); - hv_stores(ssn_config_hv, "instance_show_shoutbox", newSViv(config->instance_show_shoutbox)); - hv_stores(ssn_config_hv, "instance_panel", newSViv(config->instance_panel)); - hv_stores(ssn_config_hv, "notif_embed", newSViv(config->notif_embed)); - hv_stores(ssn_config_hv, "sidebar_opacity", newSViv(config->sidebar_opacity)); - - return ssn_config_hv; -} - HV* perlify_session(struct session* ssn) { HV* ssn_hv = newHV(); hv_stores(ssn_hv, "logged_in", newSVuv(ssn->logged_in)); -// HV* ssn_post_values = perlify_post_values(&(ssn->post)); -// HV* ssn_get_values = perlify_get_values(&(ssn->query)); -// HV* ssn_get_values = perlify_cookie_values(&(ssn->query)) + HV* ssn_post_values = perlify_post_values(&(ssn->post)); + HV* ssn_get_values = perlify_get_values(&(ssn->query)); + HV* ssn_cookie_values = perlify_cookies(&(ssn->cookies)); // Config HV* ssn_config = perlify_config(&(ssn->config)); hv_stores(ssn_hv, "config", newRV_inc((SV*)ssn_config)); - + hv_stores(ssn_hv, "cookies", newRV_inc((SV*)ssn_cookie_values)); + hv_stores(ssn_hv, "query", newRV_inc((SV*)ssn_get_values)); + hv_stores(ssn_hv, "post", newRV_inc((SV*)ssn_post_values)); return ssn_hv; } From 5f6c7b9108d2d2ed28db0b10c1be5b795f88724e Mon Sep 17 00:00:00 2001 From: nekobit Date: Sun, 24 Jul 2022 01:03:57 +0000 Subject: [PATCH 006/143] Progress FossilOrigin-Name: 52629add8a196eb6dcf025cee092cfa0a3104a54ef4e9782ddc212310cca8078 --- .fossil-settings/ignore-glob | 1 + Makefile | 10 +-- ctemplate | Bin 0 -> 16664 bytes perl/main.pl | 6 +- src/base_page.c | 120 +---------------------------------- templates/main.ctt | 4 +- templates/main.tt | 31 +++++---- 7 files changed, 35 insertions(+), 137 deletions(-) create mode 100755 ctemplate diff --git a/.fossil-settings/ignore-glob b/.fossil-settings/ignore-glob index 0cf097b..3ed6ae9 100644 --- a/.fossil-settings/ignore-glob +++ b/.fossil-settings/ignore-glob @@ -1,4 +1,5 @@ template +ctemplate filec emojitoc **/*.cgi diff --git a/Makefile b/Makefile index 3c42bb7..bde286c 100644 --- a/Makefile +++ b/Makefile @@ -24,12 +24,9 @@ MASTODONT_URL = https://fossil.nekobit.net/mastodont-c all: $(MASTODONT_DIR) dep_build $(TARGET) apache: all apache_start -$(TARGET): filec template $(TMPLS_C) $(TMPLS) $(PAGES_CMP) $(PAGES_C) $(PAGES_C_OBJ) $(OBJ) $(HEADERS) +$(TARGET): filec ctemplate $(TMPLS_C) $(TMPLS) $(PAGES_CMP) $(PAGES_C) $(PAGES_C_OBJ) $(OBJ) $(HEADERS) $(CC) -o $(TARGET) $(OBJ) $(PAGES_C_OBJ) $(LDFLAGS) -template: src/template/main.o - $(CC) $(LDFLAGS) -o template $< - filec: src/file-to-c/main.o $(CC) -o filec $< @@ -40,11 +37,14 @@ emojitoc: scripts/emoji-to.o # Redirect stdout and stderr into separate contents as a hack # Let bash do the work :) $(PAGES_DIR)/%.ctmpl: $(PAGES_DIR)/%.tmpl $(TMPLS) - ./template $< $(notdir $*) 2> $(PAGES_DIR)/$(notdir $*).c 1> $@ + ./ctemplate $< $(notdir $*) 2> $(PAGES_DIR)/$(notdir $*).c 1> $@ $(TMPL_DIR)/%.ctt: $(TMPL_DIR)/%.tt ./filec $< data_$(notdir $*)_tt > $@ +ctemplate: src/template/main.o + $(CC) $(LDFLAGS) -o ctemplate $< + $(MASTODONT_DIR): cd ..; fossil clone $(MASTODONT_URL) || true cd treebird; ln -s ../mastodont-c . diff --git a/ctemplate b/ctemplate new file mode 100755 index 0000000000000000000000000000000000000000..e09e9f1eb84880f9be797c688a0c649e3a3795fa GIT binary patch literal 16664 zcmeHOe{@q-p1)~})FMeioGDl&LaRk-Xr-_PM3T}UFHS&25EL<%G$9$%v?ebC0$Qiw z5@WPFuIq7}J?@O_s5>*_tcSz0idB9(yX%2j#|52HM$moP@}vHMMMbio?|t{CFOO!< zp4qeW$DUqz?|Z+W`~80Jz2E!e-S_hC{Y{?c0*i&oRLE{%#MO+}5vM44YNp75I9WX# ziTf37Ji7>d5y$j$r%q6+r$Ys~v{>MUprltunL%i|4l_w*3yG3mzSJ{PFOig$>OAQU zqpaY~bo?c{oTRcmTc2GoXC~UnjWQ;wQICA{Lba~q_-4To0FsGAyYs}6@E@wL@!>t|HYsB^?R9M|!3 zYL^`s4S&mmC0H|-Uc#h)fr+OwY7>={JSB3us2(c`YeDeCK_46afTi@s^4pd2VV2?| zrxOq_9}7AT*X6iK=L%frG(iA%L9Y~)Ts}$UD+DD{iR&uCUoB`A=<55Q-Y{+D2PgJf zHox`r?;Y(ueD|{Qk+c4K#4nx;*3JApS-$$>dG8(cztcX=`||5k_a|Tbr=yQ=nAh~% z{!AYHukzr(%7fDg3|8;o=fO|s z!MpO{?RoGcdGLSBga2b5T+4$$k_SJP2Y)vY{?k18o;*0sZ96V=qWNw&gW#v+!4Cr; zY+P1y+{!vfA%oP*?~MHoDj3bI+2<9_aY`SLBG}rJ9c45JZ9K^0$=zY-M}R9lx7LMU-(n* zACF3TfjhZ0ZeH)I_Kt`*rnW{^ua|kJNumAm;b4Mrmg>6j1|SUyvA|x~|jjUFi*X z_*hJh`r11=2}X(FKa2WX!&KPmk48H<8ur6t)bED`ni_?XfWc&-Gp@#1U`;fn`dOf( z(;t~p$J%up&}waC0bjTy=4aH%cr;88i#lRDeNq2))%C>J5FhZZ3T2sg%FW<9dJavC ztcfvS(7zTHGOxd_Rc(cjZbHA?LJ@B~=5J%_>WG*6$9Vg^s=vK6+=^yFc})ymYK_MH zUKOBM?O08{3WfbK-GyXMcOh&?+R(|Bv6uj)S+#>4)Z%eB%=2F7m^P5B%Vw{0OwZ=0 zp`S=ParEPOjRBW?BNfyeaH?A-r&G^Sy>!W>IQ1N1(szU`bkbdy#lU3KGN+y;`I0Qk z*j)yEgaHp4aB+0!rJV*G6D6D08gOeCWvt79+YI;?11{$t755l$@hBpgJ!Qa0b40&A zYrw@+;{`7maPbJy6^8CZ9{4kQK9a{kxE(-xE7%K5j5r>!OZEa!I+Pg_d5 zhx5N8p0>_(7w2Chp0J30Rl@w9cMYdHS{ z;%UoB+c|$P@w8Q>OF17Up0tcz-rq@n=0$t7MN~9%SKQ%A{D-y&Rk@QJOO?dQy^Z5DOnVLN; z!gYsh#V#c|az9$MgB~inxzwCrpu1WFZ@?+-*U+FAu)epI)SM(0EzLsPYEQTm2k%r8 zA1mF*`WG&4s_m^Mu}UasE_<|^u`dG-+k{QLuQXp!b{ncwQo|MznR!+nkLebHAa!e0 z=13q{ewT@d{#dR*eKe8D=aodi^5)68%A02k70X`b;CZzi2CId^Qj%|4uILp5Y&P%|x`RJ*ppf4--4x>*77PG#YPcMh?Ko@#wd|~oi?dZ8o zW(O^U+A|mjcVds``j$rcl=e1CJc*OY*8YZudou79p2QJ-cs8F=7wMDaoR}n=GwO6D zak};cPpbN6Ok9J90zEF<&N1b%_6Cg@20F7#yAAf0nZI9i%rNS^Iv9F$Oknwx}nm zR@hnYx&xK6?o81dpOU()4Gm9Z6kpK}#c}|HB-?|Du^Edq+dlBGnE1O*{Bje2JMqxl zNz}C%3u*y!OI)v!_is@W-)P@OyD{6=qi7b2l*C6`kq!lI+pg{Ywo(nEXp&y!dW|+K z?dUgLrv(LLgw6pSssmIkpx1TiN`>g%wcf(wRm&R_N3Z~Q zfs4f-?^<8L;txyAFrYnXOuPg_ZMIF1p&76n)$O`oqY>6Ty6LSb*rFF`Gj-_4q*@Bq zI2kBl>cjf_n?6e#piNgB!KH1RR%70FpQwzFv~62$={^yN7a>!C)^9%HvOTfe_2#jH zbPLVxfw3lg5Fq2WP1m9P3x6YnaiMHZ~=Gevh>;>SISqkUs+6S~k`D!)`o9H6Nczto-h5EK0RS@EPcLaPuTG+CyJqD@^RguDG|5X~(g++^PF4i6(}5zQE#6E@7C^ zN@D++q8lyhXn>vy3udrD;wP#0aRc+yw)1-yR4R*Y*KdsXDXDn{edBohyT00}_G2&@ zocq#>(6zk%exD$PX}@xhV=`7DT%M#iL>M}CGmA_FP1&lTWb2< zFbVI~H`Qj8RP|Ck@|47e3Oirvno3peYpmdBYszpB2YR5lo=bkD-3<}=8T+hl(>hEZ zB?)nONXbCjlj^&l{ApPq6ZYqe)Il3 zU|RcI*xi9m9^I7HX(_^Dx!5|YKcQ9>r)|030MvOMB5QJh#r^5TljD0CoioAibw*-=f@;swkv~-xbteKD}jk zY4`pSNx-|G!oq8$axYov-hcs)PXu;~umHz)*JCvG$2v{0bSa_9#T9l;g3S;UV^;ft z)=Wk*TBYt(3r1{1MU|3htSH0&>`8_z%9?7=yiU7|ClRhF?z0)X+e0g9<`?QXck=#X zcQVeje}<{ez441($@#^b-?lYr?o_kI-My#GJ#%;b;N}zY(O4Y-_LY&|RhSEXKXP@? zEpjJsDz^P4eFk$ShvR{;9u35t_yK<$pkD`ZVDTi;GEb`VJmpi>FN0|7QJ<2$gLmrX zflk4p@1R&o9LBLo3!EmQIj1Ut(1A8_7*DOk?gVD>Wjmn64>~xie4u$?ZrSbRf>Nrj zxUbI8TlhmsPJa;J~>Qa}rpdF$D?F0l} z$(FO-T0!?&%bHho!KD!NBtDix`ytf#Bo1P8f%C;74`RPWTd7&4+N+RBkHm_iXD2pp zJla#!_aLJ$|M-`**5($fwXS_Fr8IWw&AM<5GJOZ3HH$L)W#$cJCK9sEom@(X&IhEe z+FtEySnJyciS;D$1a~2x;sb91us@WBJTT;e|92j+;M-`;vdUm^*%apMh{RO8FW4Hr zhQ%YX(5eW&GzY>Rttx$24ne^_q>dNht19 z?Uk|YM{4_eRv7~@yM)mvX)iB?A@KBVy84F77@I3|vnEbtC6n--Iuu~hmGX0YW2h~1 zwQ8r2?si{CH0t-M;dNKi;Pifx$sEA771t45{kS|h2$kd7is$1qxQ^p`4@c3DaJ`7@ zGh7-j(w`IxMB4lTyVqM8E185`DB>4PDB=sp+x+(H@f{uoj^GU?_;o`K`OpOEI6MEk zUKv}y!afK6WcZ8^Z`%2n_*MQ0j87@@zeq*=XyNFrVmRc^q zWO#9pWq2v!6jM@K@i;t+~%y1znf547Q-@+O_vz{i(JW;r_`RUL#N>JE(z>o)qJTT;eArB0BV8{diHy)62 zDl#qwMe#(Yc%_{vDYizFSXY=W&vcN;7W#1o3E#|kS|$wO!xvBdmto}an*~pwiT25p7M*h`8DnLL z7iJlA5;qW6yI<(b^F95LOi9LE>=%Y5-Y+Va{W_$J)8~DjWc~ORh4%*_7sban&Oa;k z@d=poqI!noGv{v<<@oH*`E0v|{XaL6apmTEXNY;A|8m3Ft%45-dXJzF3i_m=&kMRu z(7l4bC+Mewo)PpS5k&JHL9Y^YhM>)Y-YTeU=XR%_YneB1mc6RQA5l9x?6tLyX^t9u zXWe9xmC_ed8kZvW8Gq+Dmkx&O^I;T|@#<2C)`11_p|U*^uR;btlQFq|Bu>9?6fjIW z(SM28A!EU;Hjf9ruaW&;ryjKktKl=}mA1n^{tvvPq7WhP5=F|^hu>KZefGIxL94}1ow}Z)73VCz9 ztwZ4EINv#W>`;6$)oYHcT`F*MT^JUF`3IR6v1Rp;gC&v1Zf+>yK`(o8lQx7 zARh32K?rzOWLjO`sAxUHJ1Z%AF?gUf58=)cHN;LEV#>23)AaE3EKk-&ba*aC;p4do zLd|mkJ(xTP(j(DxAdI&ugqvL3-kBrB1JZL4W1P1LeK(aGg59$v6x#hqWA_IM^B**n zUyqy5+9faLMw>H7Y+bwBx)M~4>NF^G_;tY_?PQKfhw68%io_kAQN-Uz)pY`LHMpzQ z)>Vv`1zTf5=4e|Nfjyn#R|{Tpk3SjU=DxK8;G{H`@O+77?GT=>TQiiThTnyka^V5+8*+u`VN&WqjB60;_sQm z*U{dNQ;ghC{}X%aX(6JtB#Dc|1{isI}!U-C1MG3w|0 zyFw{nBr}3Gg5sz84q3l^Z;u%l8yX<$DQ4cryF%PN4J-Aob6Pw!G@{YQY2hI9tsVCjGm_`-7yiy?X5f?U(qEP5Sa2Dd}_KJx=P&`X&EUlfHZp zkW{`;N_lhtUljUs{Fq%x3L3~3=(udRkYcYOLoSkH^1VgUuoM*3T>l#;{X-LVK}o~X zu+TTx|2A+dF0stA-wov7;hN`ao_bT~! z)ppT-IX|VI9LJ}iOa7Dk^6z~PO$CTlrIYMk>Pz~cC^70Yrx2~t=~lr?BK0Kw0tH5W zd0yTs^kqBE`jY<&8L}nY-|N&%dh_Vp_2TUPJaSaO5YOULe?k_~GbBsNNKI3Ommd)Z x_lpTf&mme$vfpz5rS&1(&K1S&h3R_cW0P@Nuau?bKA8SP^}57xlY)t5{|$PHoZA2Z literal 0 HcmV?d00001 diff --git a/perl/main.pl b/perl/main.pl index 548227c..606a402 100644 --- a/perl/main.pl +++ b/perl/main.pl @@ -14,12 +14,16 @@ my $template = Template->new( sub base_page { - my ($ssn, $data) = @_; + my ($ssn, $data, $main) = @_; my $result; my %vars = ( prefix => '', + ssn => $ssn, + title => $L10N{'EN_US'}->{'APP_NAME'}, lang => sub { $L10N{'EN_US'}->{shift(@_)} }, + main => $main, + sidebar_opacity => $ssn->{config}->{sidebar_opacity} / 255, ); $template->process(\$data, \%vars, \$result) || diff --git a/src/base_page.c b/src/base_page.c index cfc8518..b77f200 100644 --- a/src/base_page.c +++ b/src/base_page.c @@ -47,34 +47,10 @@ void render_base_page(struct base_page* page, FCGX_Request* req, struct session* HV* session_hv = perlify_session(ssn); XPUSHs(sv_2mortal(newRV_inc((SV*)session_hv))); XPUSHs(sv_2mortal(newSVpv(data_main_tt, 0))); + XPUSHs(sv_2mortal(newSVpv(page->content, 0))); struct mstdnt_args m_args; set_mstdnt_args(&m_args, ssn); - enum l10n_locale locale = l10n_normalize(ssn->config.lang); - char* theme_str = NULL; - const char* login_string = "Login / Register"; - const char* sidebar_embed = ""; - char* background_url_css = NULL; - // Sidebar - char* sidebar_str, - * main_sidebar_str = NULL, - * account_sidebar_str = NULL, - * instance_str = NULL; - // Mastodont, used for notifications sidebar - struct mstdnt_storage storage = { 0 }; - struct mstdnt_notification* notifs = NULL; - size_t notifs_len = 0; -#define SIDEBAR_CSS_LEN 128 - char sidebar_css[SIDEBAR_CSS_LEN]; - - /* if (keyint(ssn->cookies.logged_in)) */ - /* login_string = ""; */ - - /* if (ssn->config.background_url) */ - /* { */ - /* easprintf(&background_url_css, BODY_STYLE, ssn->config.background_url); */ - /* } */ - /* // If user is logged in */ /* if (keystr(ssn->cookies.logged_in) && keystr(ssn->cookies.access_token)) */ /* { */ @@ -113,89 +89,6 @@ void render_base_page(struct base_page* page, FCGX_Request* req, struct session* /* mastodont_storage_cleanup(&storage); */ /* } */ /* } */ - /* else { */ - /* // Construct small login page */ - /* struct quick_login_template tdata = { */ - /* .prefix = config_url_prefix, */ - /* .username = L10N[locale][L10N_USERNAME], */ - /* .password = L10N[locale][L10N_PASSWORD], */ - /* .login = L10N[locale][L10N_LOGIN_BTN], */ - /* }; */ - /* main_sidebar_str = tmpl_gen_quick_login(&tdata, NULL); */ - /* } */ - - // Combine into sidebar - easprintf(&sidebar_str, "%s%s", - account_sidebar_str ? account_sidebar_str : "", - main_sidebar_str ? main_sidebar_str : ""); - - // Create instance panel - if (g_cache.panel_html.response) - easprintf(&instance_str, "
%s
", - (g_cache.panel_html.response ? - g_cache.panel_html.response : "")); - - if (ssn->config.theme && !(strcmp(ssn->config.theme, "treebird") == 0 && - ssn->config.themeclr == 0)) - { - easprintf(&theme_str, "", - ssn->config.theme, - ssn->config.themeclr ? "-dark" : ""); - } - - if (ssn->config.sidebar_opacity) - { - float sidebar_opacity = (float)ssn->config.sidebar_opacity / 255.0f; - snprintf(sidebar_css, SIDEBAR_CSS_LEN, ":root { --sidebar-opacity: %.2f; }", - sidebar_opacity); - } - - struct index_template index_tmpl = { - .title = L10N[locale][L10N_APP_NAME], - .sidebar_css = sidebar_css, - .theme_str = theme_str, - .prefix = config_url_prefix, - .background_url = background_url_css, - .name = L10N[locale][L10N_APP_NAME], - .sidebar_cnt = login_string, - .placeholder = L10N[locale][L10N_SEARCH_PLACEHOLDER], - .search_btn = L10N[locale][L10N_SEARCH_BUTTON], - .active_home = CAT_TEXT(page->category, BASE_CAT_HOME), - .home = L10N[locale][L10N_HOME], - .active_local = CAT_TEXT(page->category, BASE_CAT_LOCAL), - .local = L10N[locale][L10N_LOCAL], - .active_federated = CAT_TEXT(page->category, BASE_CAT_FEDERATED), - .federated = L10N[locale][L10N_FEDERATED], - .active_notifications = CAT_TEXT(page->category, BASE_CAT_NOTIFICATIONS), - .notifications = L10N[locale][L10N_NOTIFICATIONS], - .active_lists = CAT_TEXT(page->category, BASE_CAT_LISTS), - .lists = L10N[locale][L10N_LISTS], - .active_favourites = CAT_TEXT(page->category, BASE_CAT_FAVOURITES), - .favourites = L10N[locale][L10N_FAVOURITES], - .active_bookmarks = CAT_TEXT(page->category, BASE_CAT_BOOKMARKS), - .bookmarks = L10N[locale][L10N_BOOKMARKS], - .active_direct = CAT_TEXT(page->category, BASE_CAT_DIRECT), - .direct = L10N[locale][L10N_DIRECT], - .active_chats = CAT_TEXT(page->category, BASE_CAT_CHATS), - .chats = "Chats", - .active_config = CAT_TEXT(page->category, BASE_CAT_CONFIG), - .config = L10N[locale][L10N_CONFIG], - .sidebar_leftbar = page->sidebar_left, - .instance_panel = ssn->config.instance_panel ? instance_str : "", - .main = page->content, - .sidebar_rightbar = sidebar_str, - .about_link_str = "About", - .license_link_str = "License", - .source_link_str = "Source code", - }; - -// char* data = tmpl_gen_index(&index_tmpl, &len); - - /* if (!data) */ - /* { */ - /* perror("malloc"); */ - /* goto cleanup; */ - /* } */ // Run function PUTBACK; @@ -205,17 +98,8 @@ void render_base_page(struct base_page* page, FCGX_Request* req, struct session* char* data = POPp; send_result(req, NULL, "text/html", data, 0); - - // Cleanup -/* cleanup_all: */ -// free(data); cleanup: - /* free(sidebar_str); */ - /* if (main_sidebar_str != sidebar_embed) free(main_sidebar_str); */ - /* free(account_sidebar_str); */ - /* free(background_url_css); */ - /* free(instance_str); */ - /* free(theme_str); */ + PUTBACK; FREETMPS; diff --git a/templates/main.ctt b/templates/main.ctt index b60dd43..bfa7429 100644 --- a/templates/main.ctt +++ b/templates/main.ctt @@ -1,5 +1,5 @@ #ifndef __data_main_tt #define __data_main_tt -static size_t data_main_tt_size = 5000; -static const char data_main_tt[] = {0X3C,0X21,0X44,0X4F,0X43,0X54,0X59,0X50,0X45,0X20,0X68,0X74,0X6D,0X6C,0X3E,0XA,0X3C,0X68,0X74,0X6D,0X6C,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X62,0X61,0X63,0X6B,0X67,0X72,0X6F,0X75,0X6E,0X64,0X5F,0X75,0X72,0X6C,0X20,0X7D,0X7D,0X3E,0XA,0X20,0X20,0X3C,0X68,0X65,0X61,0X64,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X6D,0X65,0X74,0X61,0X20,0X63,0X68,0X61,0X72,0X73,0X65,0X74,0X3D,0X22,0X75,0X74,0X66,0X2D,0X38,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X74,0X69,0X74,0X6C,0X65,0X3E,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X74,0X69,0X74,0X6C,0X65,0X20,0X7D,0X7D,0X3C,0X2F,0X74,0X69,0X74,0X6C,0X65,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X6E,0X6B,0X20,0X72,0X65,0X6C,0X3D,0X22,0X69,0X63,0X6F,0X6E,0X22,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X69,0X6D,0X61,0X67,0X65,0X2F,0X70,0X6E,0X67,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X2F,0X66,0X61,0X76,0X69,0X63,0X6F,0X6E,0X2E,0X70,0X6E,0X67,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X6E,0X6B,0X20,0X72,0X65,0X6C,0X3D,0X22,0X73,0X74,0X79,0X6C,0X65,0X73,0X68,0X65,0X65,0X74,0X22,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X74,0X65,0X78,0X74,0X2F,0X63,0X73,0X73,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X2F,0X74,0X72,0X65,0X65,0X62,0X69,0X72,0X64,0X2E,0X63,0X73,0X73,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X74,0X68,0X65,0X6D,0X65,0X5F,0X73,0X74,0X72,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X3C,0X6D,0X65,0X74,0X61,0X20,0X6E,0X61,0X6D,0X65,0X3D,0X22,0X76,0X69,0X65,0X77,0X70,0X6F,0X72,0X74,0X22,0X20,0X63,0X6F,0X6E,0X74,0X65,0X6E,0X74,0X3D,0X22,0X77,0X69,0X64,0X74,0X68,0X3D,0X64,0X65,0X76,0X69,0X63,0X65,0X2D,0X77,0X69,0X64,0X74,0X68,0X2C,0X20,0X69,0X6E,0X69,0X74,0X69,0X61,0X6C,0X2D,0X73,0X63,0X61,0X6C,0X65,0X3D,0X31,0X2E,0X30,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X6D,0X65,0X74,0X61,0X20,0X6E,0X61,0X6D,0X65,0X3D,0X22,0X64,0X65,0X73,0X63,0X72,0X69,0X70,0X74,0X69,0X6F,0X6E,0X22,0X20,0X63,0X6F,0X6E,0X74,0X65,0X6E,0X74,0X3D,0X22,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X74,0X69,0X74,0X6C,0X65,0X20,0X7D,0X7D,0X20,0X69,0X73,0X20,0X61,0X20,0X64,0X65,0X63,0X65,0X6E,0X74,0X72,0X61,0X6C,0X69,0X7A,0X65,0X64,0X20,0X73,0X6F,0X63,0X69,0X61,0X6C,0X20,0X6D,0X65,0X64,0X69,0X61,0X20,0X70,0X6C,0X61,0X74,0X66,0X6F,0X72,0X6D,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X73,0X74,0X79,0X6C,0X65,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X5F,0X63,0X73,0X73,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X3C,0X2F,0X73,0X74,0X79,0X6C,0X65,0X3E,0XA,0X20,0X20,0X3C,0X2F,0X68,0X65,0X61,0X64,0X3E,0XA,0X20,0X20,0X3C,0X62,0X6F,0X64,0X79,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X64,0X69,0X76,0X20,0X69,0X64,0X3D,0X22,0X6D,0X61,0X69,0X6E,0X2D,0X70,0X61,0X67,0X65,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X68,0X65,0X61,0X64,0X65,0X72,0X20,0X69,0X64,0X3D,0X22,0X6E,0X61,0X76,0X62,0X61,0X72,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X61,0X62,0X65,0X6C,0X20,0X66,0X6F,0X72,0X3D,0X22,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X76,0X67,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X2D,0X62,0X74,0X6E,0X20,0X6E,0X61,0X76,0X62,0X61,0X72,0X2D,0X62,0X74,0X6E,0X22,0X20,0X78,0X6D,0X6C,0X6E,0X73,0X3D,0X22,0X68,0X74,0X74,0X70,0X3A,0X2F,0X2F,0X77,0X77,0X77,0X2E,0X77,0X33,0X2E,0X6F,0X72,0X67,0X2F,0X32,0X30,0X30,0X30,0X2F,0X73,0X76,0X67,0X22,0X20,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X30,0X22,0X20,0X68,0X65,0X69,0X67,0X68,0X74,0X3D,0X22,0X32,0X30,0X22,0X20,0X76,0X69,0X65,0X77,0X42,0X6F,0X78,0X3D,0X22,0X30,0X20,0X30,0X20,0X32,0X34,0X20,0X32,0X34,0X22,0X20,0X66,0X69,0X6C,0X6C,0X3D,0X22,0X6E,0X6F,0X6E,0X65,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X3D,0X22,0X23,0X30,0X30,0X30,0X30,0X30,0X30,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X63,0X61,0X70,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X6A,0X6F,0X69,0X6E,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X3E,0X3C,0X6C,0X69,0X6E,0X65,0X20,0X78,0X31,0X3D,0X22,0X33,0X22,0X20,0X79,0X31,0X3D,0X22,0X31,0X32,0X22,0X20,0X78,0X32,0X3D,0X22,0X32,0X31,0X22,0X20,0X79,0X32,0X3D,0X22,0X31,0X32,0X22,0X3E,0X3C,0X2F,0X6C,0X69,0X6E,0X65,0X3E,0X3C,0X6C,0X69,0X6E,0X65,0X20,0X78,0X31,0X3D,0X22,0X33,0X22,0X20,0X79,0X31,0X3D,0X22,0X36,0X22,0X20,0X78,0X32,0X3D,0X22,0X32,0X31,0X22,0X20,0X79,0X32,0X3D,0X22,0X36,0X22,0X3E,0X3C,0X2F,0X6C,0X69,0X6E,0X65,0X3E,0X3C,0X6C,0X69,0X6E,0X65,0X20,0X78,0X31,0X3D,0X22,0X33,0X22,0X20,0X79,0X31,0X3D,0X22,0X31,0X38,0X22,0X20,0X78,0X32,0X3D,0X22,0X32,0X31,0X22,0X20,0X79,0X32,0X3D,0X22,0X31,0X38,0X22,0X3E,0X3C,0X2F,0X6C,0X69,0X6E,0X65,0X3E,0X3C,0X2F,0X73,0X76,0X67,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X6C,0X61,0X62,0X65,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X70,0X72,0X65,0X66,0X69,0X78,0X20,0X7D,0X7D,0X2F,0X22,0X3E,0X3C,0X69,0X6D,0X67,0X20,0X73,0X72,0X63,0X3D,0X22,0X2F,0X74,0X72,0X65,0X65,0X62,0X69,0X72,0X64,0X5F,0X6C,0X6F,0X67,0X6F,0X2E,0X70,0X6E,0X67,0X22,0X20,0X68,0X65,0X69,0X67,0X68,0X74,0X3D,0X22,0X34,0X32,0X22,0X3E,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X70,0X61,0X6E,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X69,0X6E,0X66,0X6F,0X22,0X3E,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X6E,0X61,0X6D,0X65,0X20,0X7D,0X7D,0X3C,0X2F,0X73,0X70,0X61,0X6E,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X61,0X62,0X65,0X6C,0X20,0X66,0X6F,0X72,0X3D,0X22,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X76,0X67,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X2D,0X62,0X74,0X6E,0X20,0X6E,0X61,0X76,0X62,0X61,0X72,0X2D,0X62,0X74,0X6E,0X22,0X20,0X78,0X6D,0X6C,0X6E,0X73,0X3D,0X22,0X68,0X74,0X74,0X70,0X3A,0X2F,0X2F,0X77,0X77,0X77,0X2E,0X77,0X33,0X2E,0X6F,0X72,0X67,0X2F,0X32,0X30,0X30,0X30,0X2F,0X73,0X76,0X67,0X22,0X20,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X30,0X22,0X20,0X68,0X65,0X69,0X67,0X68,0X74,0X3D,0X22,0X32,0X30,0X22,0X20,0X76,0X69,0X65,0X77,0X42,0X6F,0X78,0X3D,0X22,0X30,0X20,0X30,0X20,0X32,0X34,0X20,0X32,0X34,0X22,0X20,0X66,0X69,0X6C,0X6C,0X3D,0X22,0X6E,0X6F,0X6E,0X65,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X3D,0X22,0X23,0X30,0X30,0X30,0X30,0X30,0X30,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X63,0X61,0X70,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X6A,0X6F,0X69,0X6E,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X3E,0X3C,0X70,0X61,0X74,0X68,0X20,0X64,0X3D,0X22,0X4D,0X32,0X32,0X20,0X31,0X37,0X48,0X32,0X61,0X33,0X20,0X33,0X20,0X30,0X20,0X30,0X20,0X30,0X20,0X33,0X2D,0X33,0X56,0X39,0X61,0X37,0X20,0X37,0X20,0X30,0X20,0X30,0X20,0X31,0X20,0X31,0X34,0X20,0X30,0X76,0X35,0X61,0X33,0X20,0X33,0X20,0X30,0X20,0X30,0X20,0X30,0X20,0X33,0X20,0X33,0X7A,0X6D,0X2D,0X38,0X2E,0X32,0X37,0X20,0X34,0X61,0X32,0X20,0X32,0X20,0X30,0X20,0X30,0X20,0X31,0X2D,0X33,0X2E,0X34,0X36,0X20,0X30,0X22,0X3E,0X3C,0X2F,0X70,0X61,0X74,0X68,0X3E,0X3C,0X2F,0X73,0X76,0X67,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X6C,0X61,0X62,0X65,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X61,0X62,0X65,0X6C,0X20,0X66,0X6F,0X72,0X3D,0X22,0X73,0X65,0X61,0X72,0X63,0X68,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X76,0X67,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X65,0X61,0X72,0X63,0X68,0X2D,0X62,0X74,0X6E,0X2D,0X73,0X68,0X6F,0X77,0X22,0X20,0X78,0X6D,0X6C,0X6E,0X73,0X3D,0X22,0X68,0X74,0X74,0X70,0X3A,0X2F,0X2F,0X77,0X77,0X77,0X2E,0X77,0X33,0X2E,0X6F,0X72,0X67,0X2F,0X32,0X30,0X30,0X30,0X2F,0X73,0X76,0X67,0X22,0X20,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X30,0X22,0X20,0X68,0X65,0X69,0X67,0X68,0X74,0X3D,0X22,0X32,0X30,0X22,0X20,0X76,0X69,0X65,0X77,0X42,0X6F,0X78,0X3D,0X22,0X30,0X20,0X30,0X20,0X32,0X34,0X20,0X32,0X34,0X22,0X20,0X66,0X69,0X6C,0X6C,0X3D,0X22,0X6E,0X6F,0X6E,0X65,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X3D,0X22,0X23,0X30,0X30,0X30,0X30,0X30,0X30,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X63,0X61,0X70,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X6A,0X6F,0X69,0X6E,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X3E,0X3C,0X63,0X69,0X72,0X63,0X6C,0X65,0X20,0X63,0X78,0X3D,0X22,0X31,0X31,0X22,0X20,0X63,0X79,0X3D,0X22,0X31,0X31,0X22,0X20,0X72,0X3D,0X22,0X38,0X22,0X3E,0X3C,0X2F,0X63,0X69,0X72,0X63,0X6C,0X65,0X3E,0X3C,0X6C,0X69,0X6E,0X65,0X20,0X78,0X31,0X3D,0X22,0X32,0X31,0X22,0X20,0X79,0X31,0X3D,0X22,0X32,0X31,0X22,0X20,0X78,0X32,0X3D,0X22,0X31,0X36,0X2E,0X36,0X35,0X22,0X20,0X79,0X32,0X3D,0X22,0X31,0X36,0X2E,0X36,0X35,0X22,0X3E,0X3C,0X2F,0X6C,0X69,0X6E,0X65,0X3E,0X3C,0X2F,0X73,0X76,0X67,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X6C,0X61,0X62,0X65,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X63,0X68,0X65,0X63,0X6B,0X62,0X6F,0X78,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X68,0X69,0X64,0X64,0X65,0X6E,0X22,0X20,0X69,0X64,0X3D,0X22,0X73,0X65,0X61,0X72,0X63,0X68,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X64,0X69,0X76,0X20,0X69,0X64,0X3D,0X22,0X6E,0X61,0X76,0X62,0X61,0X72,0X2D,0X72,0X69,0X67,0X68,0X74,0X2D,0X63,0X6F,0X6E,0X74,0X61,0X69,0X6E,0X65,0X72,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X64,0X69,0X76,0X20,0X69,0X64,0X3D,0X22,0X6E,0X61,0X76,0X62,0X61,0X72,0X2D,0X72,0X69,0X67,0X68,0X74,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X5F,0X63,0X6E,0X74,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X53,0X65,0X61,0X72,0X63,0X68,0X62,0X6F,0X78,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X66,0X6F,0X72,0X6D,0X20,0X61,0X63,0X74,0X69,0X6F,0X6E,0X3D,0X22,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X70,0X72,0X65,0X66,0X69,0X78,0X20,0X7D,0X7D,0X2F,0X73,0X65,0X61,0X72,0X63,0X68,0X22,0X20,0X6D,0X65,0X74,0X68,0X6F,0X64,0X3D,0X22,0X67,0X65,0X74,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X74,0X65,0X78,0X74,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X67,0X72,0X6F,0X75,0X70,0X20,0X67,0X72,0X6F,0X75,0X70,0X2D,0X6C,0X65,0X66,0X74,0X20,0X67,0X72,0X6F,0X75,0X70,0X2D,0X69,0X6E,0X70,0X75,0X74,0X62,0X6F,0X78,0X22,0X20,0X70,0X6C,0X61,0X63,0X65,0X68,0X6F,0X6C,0X64,0X65,0X72,0X3D,0X22,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X53,0X45,0X41,0X52,0X43,0X48,0X5F,0X50,0X4C,0X41,0X43,0X45,0X48,0X4F,0X4C,0X44,0X45,0X52,0X27,0X29,0X20,0X25,0X5D,0X22,0X20,0X69,0X64,0X3D,0X22,0X73,0X65,0X61,0X72,0X63,0X68,0X62,0X6F,0X78,0X22,0X20,0X6E,0X61,0X6D,0X65,0X3D,0X22,0X71,0X22,0X3E,0X3C,0X21,0X2D,0X2D,0X20,0X69,0X20,0X68,0X61,0X74,0X65,0X20,0X48,0X54,0X4D,0X4C,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X2D,0X2D,0X3E,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X73,0X75,0X62,0X6D,0X69,0X74,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X62,0X74,0X6E,0X20,0X67,0X72,0X6F,0X75,0X70,0X20,0X67,0X72,0X6F,0X75,0X70,0X2D,0X72,0X69,0X67,0X68,0X74,0X22,0X20,0X76,0X61,0X6C,0X75,0X65,0X3D,0X22,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X53,0X45,0X41,0X52,0X43,0X48,0X5F,0X42,0X55,0X54,0X54,0X4F,0X4E,0X27,0X29,0X20,0X25,0X5D,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X66,0X6F,0X72,0X6D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X64,0X69,0X76,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X64,0X69,0X76,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X68,0X65,0X61,0X64,0X65,0X72,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X63,0X68,0X65,0X63,0X6B,0X62,0X6F,0X78,0X22,0X20,0X69,0X64,0X3D,0X22,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X68,0X69,0X64,0X64,0X65,0X6E,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X63,0X68,0X65,0X63,0X6B,0X62,0X6F,0X78,0X22,0X20,0X69,0X64,0X3D,0X22,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X68,0X69,0X64,0X64,0X65,0X6E,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X61,0X62,0X6C,0X65,0X20,0X69,0X64,0X3D,0X22,0X63,0X6F,0X6E,0X74,0X65,0X6E,0X74,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X75,0X69,0X2D,0X74,0X61,0X62,0X6C,0X65,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X4E,0X61,0X76,0X69,0X67,0X61,0X74,0X69,0X6F,0X6E,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X72,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X64,0X20,0X69,0X64,0X3D,0X22,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X75,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X68,0X6F,0X6D,0X65,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X48,0X4F,0X4D,0X45,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X6C,0X6F,0X63,0X61,0X6C,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X6C,0X6F,0X63,0X61,0X6C,0X2F,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X4C,0X4F,0X43,0X41,0X4C,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X66,0X65,0X64,0X65,0X72,0X61,0X74,0X65,0X64,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X66,0X65,0X64,0X65,0X72,0X61,0X74,0X65,0X64,0X2F,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X46,0X45,0X44,0X45,0X52,0X41,0X54,0X45,0X44,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X6E,0X6F,0X74,0X69,0X66,0X69,0X63,0X61,0X74,0X69,0X6F,0X6E,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X6E,0X6F,0X74,0X69,0X66,0X69,0X63,0X61,0X74,0X69,0X6F,0X6E,0X73,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X4E,0X4F,0X54,0X49,0X46,0X49,0X43,0X41,0X54,0X49,0X4F,0X4E,0X53,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X6C,0X69,0X73,0X74,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X6C,0X69,0X73,0X74,0X73,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X4C,0X49,0X53,0X54,0X53,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X66,0X61,0X76,0X6F,0X75,0X72,0X69,0X74,0X65,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X66,0X61,0X76,0X6F,0X75,0X72,0X69,0X74,0X65,0X73,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X46,0X41,0X56,0X4F,0X55,0X52,0X49,0X54,0X45,0X53,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X62,0X6F,0X6F,0X6B,0X6D,0X61,0X72,0X6B,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X62,0X6F,0X6F,0X6B,0X6D,0X61,0X72,0X6B,0X73,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X42,0X4F,0X4F,0X4B,0X4D,0X41,0X52,0X4B,0X53,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X64,0X69,0X72,0X65,0X63,0X74,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X64,0X69,0X72,0X65,0X63,0X74,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X44,0X49,0X52,0X45,0X43,0X54,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X63,0X68,0X61,0X74,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X63,0X68,0X61,0X74,0X73,0X22,0X3E,0X43,0X68,0X61,0X74,0X73,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X63,0X6F,0X6E,0X66,0X69,0X67,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X63,0X6F,0X6E,0X66,0X69,0X67,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X43,0X4F,0X4E,0X46,0X49,0X47,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X75,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X5F,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X69,0X6E,0X73,0X74,0X61,0X6E,0X63,0X65,0X5F,0X70,0X61,0X6E,0X65,0X6C,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X64,0X69,0X76,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X6D,0X69,0X6E,0X69,0X2D,0X6C,0X69,0X6E,0X6B,0X73,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X7B,0X7B,0X25,0X73,0X3A,0X70,0X72,0X65,0X66,0X69,0X78,0X7D,0X7D,0X2F,0X61,0X62,0X6F,0X75,0X74,0X22,0X3E,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X62,0X6F,0X75,0X74,0X5F,0X6C,0X69,0X6E,0X6B,0X5F,0X73,0X74,0X72,0X20,0X7D,0X7D,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X70,0X61,0X6E,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X62,0X75,0X6C,0X6C,0X65,0X74,0X2D,0X73,0X65,0X70,0X61,0X72,0X61,0X74,0X65,0X22,0X3E,0X26,0X62,0X75,0X6C,0X6C,0X3B,0X3C,0X2F,0X73,0X70,0X61,0X6E,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X7B,0X7B,0X25,0X73,0X3A,0X70,0X72,0X65,0X66,0X69,0X78,0X7D,0X7D,0X2F,0X61,0X62,0X6F,0X75,0X74,0X2F,0X6C,0X69,0X63,0X65,0X6E,0X73,0X65,0X22,0X3E,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X6C,0X69,0X63,0X65,0X6E,0X73,0X65,0X5F,0X6C,0X69,0X6E,0X6B,0X5F,0X73,0X74,0X72,0X20,0X7D,0X7D,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X70,0X61,0X6E,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X62,0X75,0X6C,0X6C,0X65,0X74,0X2D,0X73,0X65,0X70,0X61,0X72,0X61,0X74,0X65,0X22,0X3E,0X26,0X62,0X75,0X6C,0X6C,0X3B,0X3C,0X2F,0X73,0X70,0X61,0X6E,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X68,0X74,0X74,0X70,0X73,0X3A,0X2F,0X2F,0X66,0X6F,0X73,0X73,0X69,0X6C,0X2E,0X6E,0X65,0X6B,0X6F,0X62,0X69,0X74,0X2E,0X6E,0X65,0X74,0X2F,0X74,0X72,0X65,0X65,0X62,0X69,0X72,0X64,0X22,0X3E,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X73,0X6F,0X75,0X72,0X63,0X65,0X5F,0X6C,0X69,0X6E,0X6B,0X5F,0X73,0X74,0X72,0X20,0X7D,0X7D,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X64,0X69,0X76,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X64,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X44,0X69,0X73,0X70,0X6C,0X61,0X79,0X20,0X66,0X6F,0X72,0X20,0X70,0X6F,0X73,0X74,0X73,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X64,0X20,0X69,0X64,0X3D,0X22,0X6D,0X61,0X69,0X6E,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X6D,0X61,0X69,0X6E,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X64,0X3E,0XA,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X4E,0X6F,0X74,0X69,0X66,0X69,0X63,0X61,0X74,0X69,0X6F,0X6E,0X73,0X20,0X61,0X6E,0X64,0X20,0X73,0X75,0X63,0X68,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X64,0X20,0X69,0X64,0X3D,0X22,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X5F,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X64,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X72,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X61,0X62,0X6C,0X65,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X2F,0X64,0X69,0X76,0X3E,0XA,0X20,0X20,0X20,0X20,0XA,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X53,0X6F,0X75,0X72,0X63,0X65,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X73,0X63,0X72,0X69,0X70,0X74,0X20,0X73,0X72,0X63,0X3D,0X22,0X2F,0X6A,0X73,0X2F,0X6D,0X61,0X69,0X6E,0X2E,0X6A,0X73,0X22,0X3E,0X3C,0X2F,0X73,0X63,0X72,0X69,0X70,0X74,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X73,0X63,0X72,0X69,0X70,0X74,0X20,0X73,0X72,0X63,0X3D,0X22,0X2F,0X6A,0X73,0X2F,0X65,0X6D,0X6F,0X6A,0X69,0X2E,0X6A,0X73,0X22,0X3E,0X3C,0X2F,0X73,0X63,0X72,0X69,0X70,0X74,0X3E,0XA,0X20,0X20,0X3C,0X2F,0X62,0X6F,0X64,0X79,0X3E,0XA,0X3C,0X2F,0X68,0X74,0X6D,0X6C,0X3E,0XA,0}; +static size_t data_main_tt_size = 5406; +static const char data_main_tt[] = {0X3C,0X21,0X44,0X4F,0X43,0X54,0X59,0X50,0X45,0X20,0X68,0X74,0X6D,0X6C,0X3E,0XA,0X3C,0X68,0X74,0X6D,0X6C,0X20,0X5B,0X25,0X20,0X49,0X46,0X20,0X73,0X73,0X6E,0X2E,0X63,0X6F,0X6E,0X66,0X69,0X67,0X2E,0X62,0X61,0X63,0X6B,0X67,0X72,0X6F,0X75,0X6E,0X64,0X5F,0X75,0X72,0X6C,0X20,0X25,0X5D,0X73,0X74,0X79,0X6C,0X65,0X3D,0X22,0X62,0X61,0X63,0X6B,0X67,0X72,0X6F,0X75,0X6E,0X64,0X3A,0X75,0X72,0X6C,0X28,0X27,0X5B,0X25,0X20,0X73,0X73,0X6E,0X2E,0X63,0X6F,0X6E,0X66,0X69,0X67,0X2E,0X62,0X61,0X63,0X6B,0X67,0X72,0X6F,0X75,0X6E,0X64,0X5F,0X75,0X72,0X6C,0X20,0X25,0X5D,0X27,0X29,0X22,0X5B,0X25,0X20,0X45,0X4E,0X44,0X20,0X25,0X5D,0X3E,0XA,0X20,0X20,0X3C,0X68,0X65,0X61,0X64,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X6D,0X65,0X74,0X61,0X20,0X63,0X68,0X61,0X72,0X73,0X65,0X74,0X3D,0X22,0X75,0X74,0X66,0X2D,0X38,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X74,0X69,0X74,0X6C,0X65,0X3E,0X24,0X74,0X69,0X74,0X6C,0X65,0X3C,0X2F,0X74,0X69,0X74,0X6C,0X65,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X6E,0X6B,0X20,0X72,0X65,0X6C,0X3D,0X22,0X69,0X63,0X6F,0X6E,0X22,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X69,0X6D,0X61,0X67,0X65,0X2F,0X70,0X6E,0X67,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X2F,0X66,0X61,0X76,0X69,0X63,0X6F,0X6E,0X2E,0X70,0X6E,0X67,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X6E,0X6B,0X20,0X72,0X65,0X6C,0X3D,0X22,0X73,0X74,0X79,0X6C,0X65,0X73,0X68,0X65,0X65,0X74,0X22,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X74,0X65,0X78,0X74,0X2F,0X63,0X73,0X73,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X2F,0X74,0X72,0X65,0X65,0X62,0X69,0X72,0X64,0X2E,0X63,0X73,0X73,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X5B,0X25,0X20,0X49,0X46,0X20,0X21,0X28,0X73,0X73,0X6E,0X2E,0X63,0X6F,0X6E,0X66,0X69,0X67,0X2E,0X74,0X68,0X65,0X6D,0X65,0X20,0X3D,0X3D,0X20,0X22,0X74,0X72,0X65,0X65,0X62,0X69,0X72,0X64,0X22,0X20,0X26,0X26,0X20,0X73,0X73,0X6E,0X2E,0X63,0X6F,0X6E,0X66,0X69,0X67,0X2E,0X74,0X68,0X65,0X6D,0X65,0X63,0X6C,0X72,0X20,0X3D,0X3D,0X20,0X30,0X29,0X20,0X25,0X5D,0XA,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X6E,0X6B,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X72,0X65,0X6C,0X3D,0X22,0X73,0X74,0X79,0X6C,0X65,0X73,0X68,0X65,0X65,0X74,0X22,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X74,0X65,0X78,0X74,0X2F,0X63,0X73,0X73,0X22,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X2F,0X5B,0X25,0X20,0X73,0X73,0X6E,0X2E,0X63,0X6F,0X6E,0X66,0X69,0X67,0X2E,0X74,0X68,0X65,0X6D,0X65,0X20,0X25,0X5D,0X5B,0X25,0X20,0X49,0X46,0X20,0X73,0X73,0X6E,0X2E,0X63,0X6F,0X6E,0X66,0X69,0X67,0X2E,0X74,0X68,0X65,0X6D,0X65,0X63,0X6C,0X72,0X20,0X25,0X5D,0X2D,0X64,0X61,0X72,0X6B,0X5B,0X25,0X20,0X45,0X4E,0X44,0X20,0X25,0X5D,0X2E,0X63,0X73,0X73,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X5B,0X25,0X20,0X45,0X4E,0X44,0X20,0X25,0X5D,0XA,0X20,0X20,0X20,0X20,0X3C,0X6D,0X65,0X74,0X61,0X20,0X6E,0X61,0X6D,0X65,0X3D,0X22,0X76,0X69,0X65,0X77,0X70,0X6F,0X72,0X74,0X22,0X20,0X63,0X6F,0X6E,0X74,0X65,0X6E,0X74,0X3D,0X22,0X77,0X69,0X64,0X74,0X68,0X3D,0X64,0X65,0X76,0X69,0X63,0X65,0X2D,0X77,0X69,0X64,0X74,0X68,0X2C,0X20,0X69,0X6E,0X69,0X74,0X69,0X61,0X6C,0X2D,0X73,0X63,0X61,0X6C,0X65,0X3D,0X31,0X2E,0X30,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X6D,0X65,0X74,0X61,0X20,0X6E,0X61,0X6D,0X65,0X3D,0X22,0X64,0X65,0X73,0X63,0X72,0X69,0X70,0X74,0X69,0X6F,0X6E,0X22,0X20,0X63,0X6F,0X6E,0X74,0X65,0X6E,0X74,0X3D,0X22,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X74,0X69,0X74,0X6C,0X65,0X20,0X7D,0X7D,0X20,0X69,0X73,0X20,0X61,0X20,0X64,0X65,0X63,0X65,0X6E,0X74,0X72,0X61,0X6C,0X69,0X7A,0X65,0X64,0X20,0X73,0X6F,0X63,0X69,0X61,0X6C,0X20,0X6D,0X65,0X64,0X69,0X61,0X20,0X70,0X6C,0X61,0X74,0X66,0X6F,0X72,0X6D,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X5B,0X25,0X20,0X49,0X46,0X20,0X73,0X73,0X6E,0X2E,0X63,0X6F,0X6E,0X66,0X69,0X67,0X2E,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X5F,0X6F,0X70,0X61,0X63,0X69,0X74,0X79,0X20,0X25,0X5D,0XA,0X20,0X20,0X20,0X20,0X3C,0X73,0X74,0X79,0X6C,0X65,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3A,0X72,0X6F,0X6F,0X74,0X20,0X7B,0X20,0X2D,0X2D,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X2D,0X6F,0X70,0X61,0X63,0X69,0X74,0X79,0X3A,0X20,0X5B,0X25,0X20,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X5F,0X6F,0X70,0X61,0X63,0X69,0X74,0X79,0X20,0X25,0X5D,0X3B,0X20,0X7D,0XA,0X20,0X20,0X20,0X20,0X3C,0X2F,0X73,0X74,0X79,0X6C,0X65,0X3E,0XA,0X20,0X20,0X20,0X20,0X5B,0X25,0X20,0X45,0X4E,0X44,0X20,0X25,0X5D,0XA,0X20,0X20,0X3C,0X2F,0X68,0X65,0X61,0X64,0X3E,0XA,0X20,0X20,0X3C,0X62,0X6F,0X64,0X79,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X64,0X69,0X76,0X20,0X69,0X64,0X3D,0X22,0X6D,0X61,0X69,0X6E,0X2D,0X70,0X61,0X67,0X65,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X68,0X65,0X61,0X64,0X65,0X72,0X20,0X69,0X64,0X3D,0X22,0X6E,0X61,0X76,0X62,0X61,0X72,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X61,0X62,0X65,0X6C,0X20,0X66,0X6F,0X72,0X3D,0X22,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X76,0X67,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X2D,0X62,0X74,0X6E,0X20,0X6E,0X61,0X76,0X62,0X61,0X72,0X2D,0X62,0X74,0X6E,0X22,0X20,0X78,0X6D,0X6C,0X6E,0X73,0X3D,0X22,0X68,0X74,0X74,0X70,0X3A,0X2F,0X2F,0X77,0X77,0X77,0X2E,0X77,0X33,0X2E,0X6F,0X72,0X67,0X2F,0X32,0X30,0X30,0X30,0X2F,0X73,0X76,0X67,0X22,0X20,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X30,0X22,0X20,0X68,0X65,0X69,0X67,0X68,0X74,0X3D,0X22,0X32,0X30,0X22,0X20,0X76,0X69,0X65,0X77,0X42,0X6F,0X78,0X3D,0X22,0X30,0X20,0X30,0X20,0X32,0X34,0X20,0X32,0X34,0X22,0X20,0X66,0X69,0X6C,0X6C,0X3D,0X22,0X6E,0X6F,0X6E,0X65,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X3D,0X22,0X23,0X30,0X30,0X30,0X30,0X30,0X30,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X63,0X61,0X70,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X6A,0X6F,0X69,0X6E,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X3E,0X3C,0X6C,0X69,0X6E,0X65,0X20,0X78,0X31,0X3D,0X22,0X33,0X22,0X20,0X79,0X31,0X3D,0X22,0X31,0X32,0X22,0X20,0X78,0X32,0X3D,0X22,0X32,0X31,0X22,0X20,0X79,0X32,0X3D,0X22,0X31,0X32,0X22,0X3E,0X3C,0X2F,0X6C,0X69,0X6E,0X65,0X3E,0X3C,0X6C,0X69,0X6E,0X65,0X20,0X78,0X31,0X3D,0X22,0X33,0X22,0X20,0X79,0X31,0X3D,0X22,0X36,0X22,0X20,0X78,0X32,0X3D,0X22,0X32,0X31,0X22,0X20,0X79,0X32,0X3D,0X22,0X36,0X22,0X3E,0X3C,0X2F,0X6C,0X69,0X6E,0X65,0X3E,0X3C,0X6C,0X69,0X6E,0X65,0X20,0X78,0X31,0X3D,0X22,0X33,0X22,0X20,0X79,0X31,0X3D,0X22,0X31,0X38,0X22,0X20,0X78,0X32,0X3D,0X22,0X32,0X31,0X22,0X20,0X79,0X32,0X3D,0X22,0X31,0X38,0X22,0X3E,0X3C,0X2F,0X6C,0X69,0X6E,0X65,0X3E,0X3C,0X2F,0X73,0X76,0X67,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X6C,0X61,0X62,0X65,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X70,0X72,0X65,0X66,0X69,0X78,0X20,0X7D,0X7D,0X2F,0X22,0X3E,0X3C,0X69,0X6D,0X67,0X20,0X73,0X72,0X63,0X3D,0X22,0X2F,0X74,0X72,0X65,0X65,0X62,0X69,0X72,0X64,0X5F,0X6C,0X6F,0X67,0X6F,0X2E,0X70,0X6E,0X67,0X22,0X20,0X68,0X65,0X69,0X67,0X68,0X74,0X3D,0X22,0X34,0X32,0X22,0X3E,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X70,0X61,0X6E,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X69,0X6E,0X66,0X6F,0X22,0X3E,0X24,0X74,0X69,0X74,0X6C,0X65,0X3C,0X2F,0X73,0X70,0X61,0X6E,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X61,0X62,0X65,0X6C,0X20,0X66,0X6F,0X72,0X3D,0X22,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X76,0X67,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X2D,0X62,0X74,0X6E,0X20,0X6E,0X61,0X76,0X62,0X61,0X72,0X2D,0X62,0X74,0X6E,0X22,0X20,0X78,0X6D,0X6C,0X6E,0X73,0X3D,0X22,0X68,0X74,0X74,0X70,0X3A,0X2F,0X2F,0X77,0X77,0X77,0X2E,0X77,0X33,0X2E,0X6F,0X72,0X67,0X2F,0X32,0X30,0X30,0X30,0X2F,0X73,0X76,0X67,0X22,0X20,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X30,0X22,0X20,0X68,0X65,0X69,0X67,0X68,0X74,0X3D,0X22,0X32,0X30,0X22,0X20,0X76,0X69,0X65,0X77,0X42,0X6F,0X78,0X3D,0X22,0X30,0X20,0X30,0X20,0X32,0X34,0X20,0X32,0X34,0X22,0X20,0X66,0X69,0X6C,0X6C,0X3D,0X22,0X6E,0X6F,0X6E,0X65,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X3D,0X22,0X23,0X30,0X30,0X30,0X30,0X30,0X30,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X63,0X61,0X70,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X6A,0X6F,0X69,0X6E,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X3E,0X3C,0X70,0X61,0X74,0X68,0X20,0X64,0X3D,0X22,0X4D,0X32,0X32,0X20,0X31,0X37,0X48,0X32,0X61,0X33,0X20,0X33,0X20,0X30,0X20,0X30,0X20,0X30,0X20,0X33,0X2D,0X33,0X56,0X39,0X61,0X37,0X20,0X37,0X20,0X30,0X20,0X30,0X20,0X31,0X20,0X31,0X34,0X20,0X30,0X76,0X35,0X61,0X33,0X20,0X33,0X20,0X30,0X20,0X30,0X20,0X30,0X20,0X33,0X20,0X33,0X7A,0X6D,0X2D,0X38,0X2E,0X32,0X37,0X20,0X34,0X61,0X32,0X20,0X32,0X20,0X30,0X20,0X30,0X20,0X31,0X2D,0X33,0X2E,0X34,0X36,0X20,0X30,0X22,0X3E,0X3C,0X2F,0X70,0X61,0X74,0X68,0X3E,0X3C,0X2F,0X73,0X76,0X67,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X6C,0X61,0X62,0X65,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X61,0X62,0X65,0X6C,0X20,0X66,0X6F,0X72,0X3D,0X22,0X73,0X65,0X61,0X72,0X63,0X68,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X76,0X67,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X65,0X61,0X72,0X63,0X68,0X2D,0X62,0X74,0X6E,0X2D,0X73,0X68,0X6F,0X77,0X22,0X20,0X78,0X6D,0X6C,0X6E,0X73,0X3D,0X22,0X68,0X74,0X74,0X70,0X3A,0X2F,0X2F,0X77,0X77,0X77,0X2E,0X77,0X33,0X2E,0X6F,0X72,0X67,0X2F,0X32,0X30,0X30,0X30,0X2F,0X73,0X76,0X67,0X22,0X20,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X30,0X22,0X20,0X68,0X65,0X69,0X67,0X68,0X74,0X3D,0X22,0X32,0X30,0X22,0X20,0X76,0X69,0X65,0X77,0X42,0X6F,0X78,0X3D,0X22,0X30,0X20,0X30,0X20,0X32,0X34,0X20,0X32,0X34,0X22,0X20,0X66,0X69,0X6C,0X6C,0X3D,0X22,0X6E,0X6F,0X6E,0X65,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X3D,0X22,0X23,0X30,0X30,0X30,0X30,0X30,0X30,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X77,0X69,0X64,0X74,0X68,0X3D,0X22,0X32,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X63,0X61,0X70,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X20,0X73,0X74,0X72,0X6F,0X6B,0X65,0X2D,0X6C,0X69,0X6E,0X65,0X6A,0X6F,0X69,0X6E,0X3D,0X22,0X72,0X6F,0X75,0X6E,0X64,0X22,0X3E,0X3C,0X63,0X69,0X72,0X63,0X6C,0X65,0X20,0X63,0X78,0X3D,0X22,0X31,0X31,0X22,0X20,0X63,0X79,0X3D,0X22,0X31,0X31,0X22,0X20,0X72,0X3D,0X22,0X38,0X22,0X3E,0X3C,0X2F,0X63,0X69,0X72,0X63,0X6C,0X65,0X3E,0X3C,0X6C,0X69,0X6E,0X65,0X20,0X78,0X31,0X3D,0X22,0X32,0X31,0X22,0X20,0X79,0X31,0X3D,0X22,0X32,0X31,0X22,0X20,0X78,0X32,0X3D,0X22,0X31,0X36,0X2E,0X36,0X35,0X22,0X20,0X79,0X32,0X3D,0X22,0X31,0X36,0X2E,0X36,0X35,0X22,0X3E,0X3C,0X2F,0X6C,0X69,0X6E,0X65,0X3E,0X3C,0X2F,0X73,0X76,0X67,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X6C,0X61,0X62,0X65,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X63,0X68,0X65,0X63,0X6B,0X62,0X6F,0X78,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X68,0X69,0X64,0X64,0X65,0X6E,0X22,0X20,0X69,0X64,0X3D,0X22,0X73,0X65,0X61,0X72,0X63,0X68,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X64,0X69,0X76,0X20,0X69,0X64,0X3D,0X22,0X6E,0X61,0X76,0X62,0X61,0X72,0X2D,0X72,0X69,0X67,0X68,0X74,0X2D,0X63,0X6F,0X6E,0X74,0X61,0X69,0X6E,0X65,0X72,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X64,0X69,0X76,0X20,0X69,0X64,0X3D,0X22,0X6E,0X61,0X76,0X62,0X61,0X72,0X2D,0X72,0X69,0X67,0X68,0X74,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X5B,0X25,0X20,0X49,0X46,0X20,0X21,0X73,0X73,0X6E,0X2E,0X6C,0X6F,0X67,0X67,0X65,0X64,0X5F,0X69,0X6E,0X20,0X2D,0X25,0X5D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X6C,0X6F,0X67,0X69,0X6E,0X22,0X20,0X69,0X64,0X3D,0X22,0X6C,0X6F,0X67,0X69,0X6E,0X2D,0X68,0X65,0X61,0X64,0X65,0X72,0X22,0X3E,0X4C,0X6F,0X67,0X69,0X6E,0X20,0X2F,0X20,0X52,0X65,0X67,0X69,0X73,0X74,0X65,0X72,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X5B,0X25,0X2D,0X20,0X45,0X4E,0X44,0X20,0X25,0X5D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X53,0X65,0X61,0X72,0X63,0X68,0X62,0X6F,0X78,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X66,0X6F,0X72,0X6D,0X20,0X61,0X63,0X74,0X69,0X6F,0X6E,0X3D,0X22,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X70,0X72,0X65,0X66,0X69,0X78,0X20,0X7D,0X7D,0X2F,0X73,0X65,0X61,0X72,0X63,0X68,0X22,0X20,0X6D,0X65,0X74,0X68,0X6F,0X64,0X3D,0X22,0X67,0X65,0X74,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X74,0X65,0X78,0X74,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X67,0X72,0X6F,0X75,0X70,0X20,0X67,0X72,0X6F,0X75,0X70,0X2D,0X6C,0X65,0X66,0X74,0X20,0X67,0X72,0X6F,0X75,0X70,0X2D,0X69,0X6E,0X70,0X75,0X74,0X62,0X6F,0X78,0X22,0X20,0X70,0X6C,0X61,0X63,0X65,0X68,0X6F,0X6C,0X64,0X65,0X72,0X3D,0X22,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X53,0X45,0X41,0X52,0X43,0X48,0X5F,0X50,0X4C,0X41,0X43,0X45,0X48,0X4F,0X4C,0X44,0X45,0X52,0X27,0X29,0X20,0X25,0X5D,0X22,0X20,0X69,0X64,0X3D,0X22,0X73,0X65,0X61,0X72,0X63,0X68,0X62,0X6F,0X78,0X22,0X20,0X6E,0X61,0X6D,0X65,0X3D,0X22,0X71,0X22,0X3E,0X3C,0X21,0X2D,0X2D,0X20,0X69,0X20,0X68,0X61,0X74,0X65,0X20,0X48,0X54,0X4D,0X4C,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X2D,0X2D,0X3E,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X73,0X75,0X62,0X6D,0X69,0X74,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X62,0X74,0X6E,0X20,0X67,0X72,0X6F,0X75,0X70,0X20,0X67,0X72,0X6F,0X75,0X70,0X2D,0X72,0X69,0X67,0X68,0X74,0X22,0X20,0X76,0X61,0X6C,0X75,0X65,0X3D,0X22,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X53,0X45,0X41,0X52,0X43,0X48,0X5F,0X42,0X55,0X54,0X54,0X4F,0X4E,0X27,0X29,0X20,0X25,0X5D,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X66,0X6F,0X72,0X6D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X64,0X69,0X76,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X64,0X69,0X76,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X68,0X65,0X61,0X64,0X65,0X72,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X63,0X68,0X65,0X63,0X6B,0X62,0X6F,0X78,0X22,0X20,0X69,0X64,0X3D,0X22,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X68,0X69,0X64,0X64,0X65,0X6E,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X69,0X6E,0X70,0X75,0X74,0X20,0X74,0X79,0X70,0X65,0X3D,0X22,0X63,0X68,0X65,0X63,0X6B,0X62,0X6F,0X78,0X22,0X20,0X69,0X64,0X3D,0X22,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X2D,0X73,0X68,0X6F,0X77,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X68,0X69,0X64,0X64,0X65,0X6E,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X61,0X62,0X6C,0X65,0X20,0X69,0X64,0X3D,0X22,0X63,0X6F,0X6E,0X74,0X65,0X6E,0X74,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X75,0X69,0X2D,0X74,0X61,0X62,0X6C,0X65,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X4E,0X61,0X76,0X69,0X67,0X61,0X74,0X69,0X6F,0X6E,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X72,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X64,0X20,0X69,0X64,0X3D,0X22,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X75,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X68,0X6F,0X6D,0X65,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X48,0X4F,0X4D,0X45,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X6C,0X6F,0X63,0X61,0X6C,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X6C,0X6F,0X63,0X61,0X6C,0X2F,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X4C,0X4F,0X43,0X41,0X4C,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X66,0X65,0X64,0X65,0X72,0X61,0X74,0X65,0X64,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X66,0X65,0X64,0X65,0X72,0X61,0X74,0X65,0X64,0X2F,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X46,0X45,0X44,0X45,0X52,0X41,0X54,0X45,0X44,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X6E,0X6F,0X74,0X69,0X66,0X69,0X63,0X61,0X74,0X69,0X6F,0X6E,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X6E,0X6F,0X74,0X69,0X66,0X69,0X63,0X61,0X74,0X69,0X6F,0X6E,0X73,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X4E,0X4F,0X54,0X49,0X46,0X49,0X43,0X41,0X54,0X49,0X4F,0X4E,0X53,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X6C,0X69,0X73,0X74,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X6C,0X69,0X73,0X74,0X73,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X4C,0X49,0X53,0X54,0X53,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X66,0X61,0X76,0X6F,0X75,0X72,0X69,0X74,0X65,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X66,0X61,0X76,0X6F,0X75,0X72,0X69,0X74,0X65,0X73,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X46,0X41,0X56,0X4F,0X55,0X52,0X49,0X54,0X45,0X53,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X62,0X6F,0X6F,0X6B,0X6D,0X61,0X72,0X6B,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X62,0X6F,0X6F,0X6B,0X6D,0X61,0X72,0X6B,0X73,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X42,0X4F,0X4F,0X4B,0X4D,0X41,0X52,0X4B,0X53,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X64,0X69,0X72,0X65,0X63,0X74,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X64,0X69,0X72,0X65,0X63,0X74,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X44,0X49,0X52,0X45,0X43,0X54,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X63,0X68,0X61,0X74,0X73,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X63,0X68,0X61,0X74,0X73,0X22,0X3E,0X43,0X68,0X61,0X74,0X73,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X6C,0X69,0X3E,0X3C,0X61,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X62,0X74,0X6E,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X61,0X63,0X74,0X69,0X76,0X65,0X5F,0X63,0X6F,0X6E,0X66,0X69,0X67,0X20,0X7D,0X7D,0X22,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X24,0X70,0X72,0X65,0X66,0X69,0X78,0X2F,0X63,0X6F,0X6E,0X66,0X69,0X67,0X22,0X3E,0X5B,0X25,0X20,0X6C,0X61,0X6E,0X67,0X28,0X27,0X43,0X4F,0X4E,0X46,0X49,0X47,0X27,0X29,0X20,0X25,0X5D,0X3C,0X2F,0X61,0X3E,0X3C,0X2F,0X6C,0X69,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X75,0X6C,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X5F,0X6C,0X65,0X66,0X74,0X62,0X61,0X72,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X3C,0X64,0X69,0X76,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X74,0X61,0X74,0X69,0X63,0X2D,0X68,0X74,0X6D,0X6C,0X22,0X20,0X69,0X64,0X3D,0X22,0X69,0X6E,0X73,0X74,0X61,0X6E,0X63,0X65,0X2D,0X70,0X61,0X6E,0X65,0X6C,0X22,0X3E,0X3C,0X2F,0X64,0X69,0X76,0X3E,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X64,0X69,0X76,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X6D,0X69,0X6E,0X69,0X2D,0X6C,0X69,0X6E,0X6B,0X73,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X7B,0X7B,0X25,0X73,0X3A,0X70,0X72,0X65,0X66,0X69,0X78,0X7D,0X7D,0X2F,0X61,0X62,0X6F,0X75,0X74,0X22,0X3E,0X41,0X62,0X6F,0X75,0X74,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X70,0X61,0X6E,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X62,0X75,0X6C,0X6C,0X65,0X74,0X2D,0X73,0X65,0X70,0X61,0X72,0X61,0X74,0X65,0X22,0X3E,0X26,0X62,0X75,0X6C,0X6C,0X3B,0X3C,0X2F,0X73,0X70,0X61,0X6E,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X7B,0X7B,0X25,0X73,0X3A,0X70,0X72,0X65,0X66,0X69,0X78,0X7D,0X7D,0X2F,0X61,0X62,0X6F,0X75,0X74,0X2F,0X6C,0X69,0X63,0X65,0X6E,0X73,0X65,0X22,0X3E,0X4C,0X69,0X63,0X65,0X6E,0X73,0X65,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X73,0X70,0X61,0X6E,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X62,0X75,0X6C,0X6C,0X65,0X74,0X2D,0X73,0X65,0X70,0X61,0X72,0X61,0X74,0X65,0X22,0X3E,0X26,0X62,0X75,0X6C,0X6C,0X3B,0X3C,0X2F,0X73,0X70,0X61,0X6E,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X61,0X20,0X68,0X72,0X65,0X66,0X3D,0X22,0X68,0X74,0X74,0X70,0X73,0X3A,0X2F,0X2F,0X66,0X6F,0X73,0X73,0X69,0X6C,0X2E,0X6E,0X65,0X6B,0X6F,0X62,0X69,0X74,0X2E,0X6E,0X65,0X74,0X2F,0X74,0X72,0X65,0X65,0X62,0X69,0X72,0X64,0X22,0X3E,0X53,0X6F,0X75,0X72,0X63,0X65,0X20,0X63,0X6F,0X64,0X65,0X3C,0X2F,0X61,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X64,0X69,0X76,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X64,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X44,0X69,0X73,0X70,0X6C,0X61,0X79,0X20,0X66,0X6F,0X72,0X20,0X70,0X6F,0X73,0X74,0X73,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X64,0X20,0X69,0X64,0X3D,0X22,0X6D,0X61,0X69,0X6E,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X24,0X6D,0X61,0X69,0X6E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X64,0X3E,0XA,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X4E,0X6F,0X74,0X69,0X66,0X69,0X63,0X61,0X74,0X69,0X6F,0X6E,0X73,0X20,0X61,0X6E,0X64,0X20,0X73,0X75,0X63,0X68,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X74,0X64,0X20,0X69,0X64,0X3D,0X22,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X22,0X20,0X63,0X6C,0X61,0X73,0X73,0X3D,0X22,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X22,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X7B,0X7B,0X20,0X25,0X73,0X20,0X3A,0X20,0X73,0X69,0X64,0X65,0X62,0X61,0X72,0X5F,0X72,0X69,0X67,0X68,0X74,0X62,0X61,0X72,0X20,0X7D,0X7D,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X64,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X72,0X3E,0XA,0X20,0X20,0X20,0X20,0X20,0X20,0X3C,0X2F,0X74,0X61,0X62,0X6C,0X65,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X2F,0X64,0X69,0X76,0X3E,0XA,0X20,0X20,0X20,0X20,0XA,0X20,0X20,0X20,0X20,0X3C,0X21,0X2D,0X2D,0X20,0X53,0X6F,0X75,0X72,0X63,0X65,0X20,0X2D,0X2D,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X73,0X63,0X72,0X69,0X70,0X74,0X20,0X73,0X72,0X63,0X3D,0X22,0X2F,0X6A,0X73,0X2F,0X6D,0X61,0X69,0X6E,0X2E,0X6A,0X73,0X22,0X3E,0X3C,0X2F,0X73,0X63,0X72,0X69,0X70,0X74,0X3E,0XA,0X20,0X20,0X20,0X20,0X3C,0X73,0X63,0X72,0X69,0X70,0X74,0X20,0X73,0X72,0X63,0X3D,0X22,0X2F,0X6A,0X73,0X2F,0X65,0X6D,0X6F,0X6A,0X69,0X2E,0X6A,0X73,0X22,0X3E,0X3C,0X2F,0X73,0X63,0X72,0X69,0X70,0X74,0X3E,0XA,0X20,0X20,0X3C,0X2F,0X62,0X6F,0X64,0X79,0X3E,0XA,0X3C,0X2F,0X68,0X74,0X6D,0X6C,0X3E,0XA,0}; #endif diff --git a/templates/main.tt b/templates/main.tt index 2e26ff7..3971aaa 100644 --- a/templates/main.tt +++ b/templates/main.tt @@ -1,16 +1,23 @@ - + - {{ %s : title }} + $title - {{ %s : theme_str }} + [% IF !(ssn.config.theme == "treebird" && ssn.config.themeclr == 0) %] + + [% END %] + [% IF ssn.config.sidebar_opacity %] + [% END %]
@@ -19,7 +26,7 @@ - {{ %s : name }} + $title @@ -29,7 +36,9 @@ + + + [% FOREACH notif IN notifs %] + [% notification_compact(ssn, data, notif) %] + [% END %] + [% ELSE %]