From 772db3ce2899e3c9d13b3fc0205992e9080927b4 Mon Sep 17 00:00:00 2001 From: nekobit Date: Fri, 22 Jul 2022 22:41:07 +0000 Subject: [PATCH] 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 }} +
+
+ + + + + +