From 801bb10d241a5fd353c80de94f0aa869e05cc5d5 Mon Sep 17 00:00:00 2001 From: Kevin Kandlbinder Date: Mon, 10 Oct 2022 14:48:20 +0200 Subject: [PATCH] Initial commit --- .gitignore | 2 + .idea/.gitignore | 8 + .idea/GoHangar.iml | 9 + .idea/inspectionProfiles/Project_Default.xml | 15 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + LICENSE | 674 ++++++++++++++++++ README.md | 30 + go.mod | 13 + go.sum | 17 + hangar/server.go | 246 +++++++ hangar/static/BANNER-CREDITS.md | 3 + hangar/static/banner.jpg | Bin 0 -> 37076 bytes hangar/static/black.css | 110 +++ hangar/static/directory.html.tmpl | 41 ++ hangar/static/images/CREDITS.md | 3 + hangar/static/images/action_back.gif | Bin 0 -> 266 bytes hangar/static/images/action_forward.gif | Bin 0 -> 265 bytes hangar/static/images/action_go.gif | Bin 0 -> 268 bytes hangar/static/images/action_paste.gif | Bin 0 -> 274 bytes hangar/static/images/action_print.gif | Bin 0 -> 280 bytes hangar/static/images/action_refresh.gif | Bin 0 -> 248 bytes hangar/static/images/action_refresh_blue.gif | Bin 0 -> 256 bytes hangar/static/images/action_save.gif | Bin 0 -> 279 bytes hangar/static/images/action_stop.gif | Bin 0 -> 258 bytes .../static/images/application_dreamweaver.gif | Bin 0 -> 197 bytes hangar/static/images/application_firefox.gif | Bin 0 -> 262 bytes hangar/static/images/application_flash.gif | Bin 0 -> 198 bytes hangar/static/images/arrow_down.gif | Bin 0 -> 131 bytes hangar/static/images/arrow_left.gif | Bin 0 -> 131 bytes hangar/static/images/arrow_right.gif | Bin 0 -> 130 bytes hangar/static/images/arrow_up.gif | Bin 0 -> 130 bytes hangar/static/images/box.gif | Bin 0 -> 274 bytes hangar/static/images/calendar.gif | Bin 0 -> 268 bytes hangar/static/images/comment.gif | Bin 0 -> 257 bytes hangar/static/images/comment_blue.gif | Bin 0 -> 257 bytes hangar/static/images/comment_delete.gif | Bin 0 -> 267 bytes hangar/static/images/comment_new.gif | Bin 0 -> 367 bytes hangar/static/images/comment_yellow.gif | Bin 0 -> 257 bytes hangar/static/images/copy.gif | Bin 0 -> 278 bytes hangar/static/images/cut.gif | Bin 0 -> 271 bytes hangar/static/images/date.gif | Bin 0 -> 280 bytes hangar/static/images/date_delete.gif | Bin 0 -> 283 bytes hangar/static/images/date_new.gif | Bin 0 -> 384 bytes hangar/static/images/file_acrobat.gif | Bin 0 -> 291 bytes hangar/static/images/file_font.gif | Bin 0 -> 653 bytes hangar/static/images/file_font_truetype.gif | Bin 0 -> 648 bytes hangar/static/images/flag_blue.gif | Bin 0 -> 248 bytes hangar/static/images/flag_green.gif | Bin 0 -> 245 bytes hangar/static/images/flag_orange.gif | Bin 0 -> 244 bytes hangar/static/images/flag_red.gif | Bin 0 -> 244 bytes hangar/static/images/flag_white.gif | Bin 0 -> 245 bytes hangar/static/images/folder.gif | Bin 0 -> 249 bytes hangar/static/images/folder_delete.gif | Bin 0 -> 261 bytes hangar/static/images/folder_images.gif | Bin 0 -> 366 bytes hangar/static/images/folder_lock.gif | Bin 0 -> 271 bytes hangar/static/images/folder_new.gif | Bin 0 -> 360 bytes hangar/static/images/folder_page.gif | Bin 0 -> 260 bytes hangar/static/images/icon_accept.gif | Bin 0 -> 263 bytes hangar/static/images/icon_airmail.gif | Bin 0 -> 256 bytes hangar/static/images/icon_alert.gif | Bin 0 -> 246 bytes hangar/static/images/icon_attachment.gif | Bin 0 -> 235 bytes hangar/static/images/icon_clock.gif | Bin 0 -> 207 bytes hangar/static/images/icon_component.gif | Bin 0 -> 597 bytes hangar/static/images/icon_download.gif | Bin 0 -> 290 bytes hangar/static/images/icon_email.gif | Bin 0 -> 260 bytes hangar/static/images/icon_extension.gif | Bin 0 -> 267 bytes hangar/static/images/icon_favourites.gif | Bin 0 -> 243 bytes hangar/static/images/icon_get_world.gif | Bin 0 -> 189 bytes hangar/static/images/icon_history.gif | Bin 0 -> 205 bytes hangar/static/images/icon_home.gif | Bin 0 -> 179 bytes hangar/static/images/icon_info.gif | Bin 0 -> 266 bytes hangar/static/images/icon_key.gif | Bin 0 -> 230 bytes hangar/static/images/icon_link.gif | Bin 0 -> 329 bytes hangar/static/images/icon_mail.gif | Bin 0 -> 257 bytes hangar/static/images/icon_monitor_mac.gif | Bin 0 -> 274 bytes hangar/static/images/icon_monitor_pc.gif | Bin 0 -> 274 bytes hangar/static/images/icon_network.gif | Bin 0 -> 265 bytes hangar/static/images/icon_package.gif | Bin 0 -> 624 bytes hangar/static/images/icon_package_get.gif | Bin 0 -> 616 bytes hangar/static/images/icon_package_open.gif | Bin 0 -> 613 bytes hangar/static/images/icon_padlock.gif | Bin 0 -> 249 bytes hangar/static/images/icon_security.gif | Bin 0 -> 266 bytes hangar/static/images/icon_settings.gif | Bin 0 -> 251 bytes hangar/static/images/icon_user.gif | Bin 0 -> 246 bytes hangar/static/images/icon_wand.gif | Bin 0 -> 205 bytes hangar/static/images/icon_world.gif | Bin 0 -> 184 bytes hangar/static/images/icon_world_dynamic.gif | Bin 0 -> 367 bytes hangar/static/images/image.gif | Bin 0 -> 621 bytes hangar/static/images/image_new.gif | Bin 0 -> 609 bytes hangar/static/images/interface_browser.gif | Bin 0 -> 240 bytes hangar/static/images/interface_dialog.gif | Bin 0 -> 238 bytes hangar/static/images/interface_installer.gif | Bin 0 -> 242 bytes hangar/static/images/list_comments.gif | Bin 0 -> 364 bytes hangar/static/images/list_components.gif | Bin 0 -> 242 bytes hangar/static/images/list_errors.gif | Bin 0 -> 242 bytes hangar/static/images/list_extensions.gif | Bin 0 -> 251 bytes hangar/static/images/list_images.gif | Bin 0 -> 565 bytes hangar/static/images/list_keys.gif | Bin 0 -> 239 bytes hangar/static/images/list_links.gif | Bin 0 -> 355 bytes hangar/static/images/list_packages.gif | Bin 0 -> 365 bytes hangar/static/images/list_security.gif | Bin 0 -> 246 bytes hangar/static/images/list_settings.gif | Bin 0 -> 366 bytes hangar/static/images/list_users.gif | Bin 0 -> 246 bytes hangar/static/images/list_world.gif | Bin 0 -> 369 bytes hangar/static/images/note.gif | Bin 0 -> 270 bytes hangar/static/images/note_delete.gif | Bin 0 -> 271 bytes hangar/static/images/note_new.gif | Bin 0 -> 379 bytes hangar/static/images/page.gif | Bin 0 -> 274 bytes hangar/static/images/page_alert.gif | Bin 0 -> 285 bytes hangar/static/images/page_attachment.gif | Bin 0 -> 289 bytes hangar/static/images/page_bookmark.gif | Bin 0 -> 291 bytes hangar/static/images/page_boy.gif | Bin 0 -> 290 bytes hangar/static/images/page_code.gif | Bin 0 -> 278 bytes hangar/static/images/page_colors.gif | Bin 0 -> 271 bytes hangar/static/images/page_component.gif | Bin 0 -> 646 bytes hangar/static/images/page_cross.gif | Bin 0 -> 385 bytes hangar/static/images/page_delete.gif | Bin 0 -> 277 bytes hangar/static/images/page_deny.gif | Bin 0 -> 298 bytes hangar/static/images/page_down.gif | Bin 0 -> 281 bytes hangar/static/images/page_dynamic.gif | Bin 0 -> 271 bytes hangar/static/images/page_edit.gif | Bin 0 -> 280 bytes hangar/static/images/page_extension.gif | Bin 0 -> 279 bytes hangar/static/images/page_favourites.gif | Bin 0 -> 290 bytes hangar/static/images/page_find.gif | Bin 0 -> 273 bytes hangar/static/images/page_flash.gif | Bin 0 -> 279 bytes hangar/static/images/page_girl.gif | Bin 0 -> 291 bytes hangar/static/images/page_html.gif | Bin 0 -> 285 bytes hangar/static/images/page_java.gif | Bin 0 -> 650 bytes hangar/static/images/page_key.gif | Bin 0 -> 281 bytes hangar/static/images/page_left.gif | Bin 0 -> 285 bytes hangar/static/images/page_link.gif | Bin 0 -> 644 bytes hangar/static/images/page_lock.gif | Bin 0 -> 283 bytes hangar/static/images/page_new.gif | Bin 0 -> 378 bytes hangar/static/images/page_next.gif | Bin 0 -> 283 bytes hangar/static/images/page_package.gif | Bin 0 -> 640 bytes hangar/static/images/page_php.gif | Bin 0 -> 296 bytes hangar/static/images/page_prev.gif | Bin 0 -> 279 bytes hangar/static/images/page_refresh.gif | Bin 0 -> 286 bytes hangar/static/images/page_right.gif | Bin 0 -> 283 bytes hangar/static/images/page_script.gif | Bin 0 -> 277 bytes hangar/static/images/page_security.gif | Bin 0 -> 280 bytes hangar/static/images/page_settings.gif | Bin 0 -> 298 bytes hangar/static/images/page_sound.gif | Bin 0 -> 407 bytes hangar/static/images/page_tag_blue.gif | Bin 0 -> 288 bytes hangar/static/images/page_tag_red.gif | Bin 0 -> 289 bytes hangar/static/images/page_text.gif | Bin 0 -> 276 bytes hangar/static/images/page_text_delete.gif | Bin 0 -> 277 bytes hangar/static/images/page_tick.gif | Bin 0 -> 385 bytes hangar/static/images/page_tree.gif | Bin 0 -> 287 bytes hangar/static/images/page_up.gif | Bin 0 -> 283 bytes hangar/static/images/page_url.gif | Bin 0 -> 298 bytes hangar/static/images/page_user.gif | Bin 0 -> 290 bytes hangar/static/images/page_user_dark.gif | Bin 0 -> 283 bytes hangar/static/images/page_user_light.gif | Bin 0 -> 287 bytes hangar/static/images/page_video.gif | Bin 0 -> 384 bytes hangar/static/images/page_wizard.gif | Bin 0 -> 286 bytes hangar/static/images/table.gif | Bin 0 -> 270 bytes hangar/static/images/table_delete.gif | Bin 0 -> 274 bytes hangar/static/images/tables.gif | Bin 0 -> 276 bytes main.go | 86 +++ 161 files changed, 1271 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/GoHangar.iml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 go.mod create mode 100644 go.sum create mode 100644 hangar/server.go create mode 100644 hangar/static/BANNER-CREDITS.md create mode 100644 hangar/static/banner.jpg create mode 100644 hangar/static/black.css create mode 100644 hangar/static/directory.html.tmpl create mode 100644 hangar/static/images/CREDITS.md create mode 100644 hangar/static/images/action_back.gif create mode 100644 hangar/static/images/action_forward.gif create mode 100644 hangar/static/images/action_go.gif create mode 100644 hangar/static/images/action_paste.gif create mode 100644 hangar/static/images/action_print.gif create mode 100644 hangar/static/images/action_refresh.gif create mode 100644 hangar/static/images/action_refresh_blue.gif create mode 100644 hangar/static/images/action_save.gif create mode 100644 hangar/static/images/action_stop.gif create mode 100644 hangar/static/images/application_dreamweaver.gif create mode 100644 hangar/static/images/application_firefox.gif create mode 100644 hangar/static/images/application_flash.gif create mode 100644 hangar/static/images/arrow_down.gif create mode 100644 hangar/static/images/arrow_left.gif create mode 100644 hangar/static/images/arrow_right.gif create mode 100644 hangar/static/images/arrow_up.gif create mode 100644 hangar/static/images/box.gif create mode 100644 hangar/static/images/calendar.gif create mode 100644 hangar/static/images/comment.gif create mode 100644 hangar/static/images/comment_blue.gif create mode 100644 hangar/static/images/comment_delete.gif create mode 100644 hangar/static/images/comment_new.gif create mode 100644 hangar/static/images/comment_yellow.gif create mode 100644 hangar/static/images/copy.gif create mode 100644 hangar/static/images/cut.gif create mode 100644 hangar/static/images/date.gif create mode 100644 hangar/static/images/date_delete.gif create mode 100644 hangar/static/images/date_new.gif create mode 100644 hangar/static/images/file_acrobat.gif create mode 100644 hangar/static/images/file_font.gif create mode 100644 hangar/static/images/file_font_truetype.gif create mode 100644 hangar/static/images/flag_blue.gif create mode 100644 hangar/static/images/flag_green.gif create mode 100644 hangar/static/images/flag_orange.gif create mode 100644 hangar/static/images/flag_red.gif create mode 100644 hangar/static/images/flag_white.gif create mode 100644 hangar/static/images/folder.gif create mode 100644 hangar/static/images/folder_delete.gif create mode 100644 hangar/static/images/folder_images.gif create mode 100644 hangar/static/images/folder_lock.gif create mode 100644 hangar/static/images/folder_new.gif create mode 100644 hangar/static/images/folder_page.gif create mode 100644 hangar/static/images/icon_accept.gif create mode 100644 hangar/static/images/icon_airmail.gif create mode 100644 hangar/static/images/icon_alert.gif create mode 100644 hangar/static/images/icon_attachment.gif create mode 100644 hangar/static/images/icon_clock.gif create mode 100644 hangar/static/images/icon_component.gif create mode 100644 hangar/static/images/icon_download.gif create mode 100644 hangar/static/images/icon_email.gif create mode 100644 hangar/static/images/icon_extension.gif create mode 100644 hangar/static/images/icon_favourites.gif create mode 100644 hangar/static/images/icon_get_world.gif create mode 100644 hangar/static/images/icon_history.gif create mode 100644 hangar/static/images/icon_home.gif create mode 100644 hangar/static/images/icon_info.gif create mode 100644 hangar/static/images/icon_key.gif create mode 100644 hangar/static/images/icon_link.gif create mode 100644 hangar/static/images/icon_mail.gif create mode 100644 hangar/static/images/icon_monitor_mac.gif create mode 100644 hangar/static/images/icon_monitor_pc.gif create mode 100644 hangar/static/images/icon_network.gif create mode 100644 hangar/static/images/icon_package.gif create mode 100644 hangar/static/images/icon_package_get.gif create mode 100644 hangar/static/images/icon_package_open.gif create mode 100644 hangar/static/images/icon_padlock.gif create mode 100644 hangar/static/images/icon_security.gif create mode 100644 hangar/static/images/icon_settings.gif create mode 100644 hangar/static/images/icon_user.gif create mode 100644 hangar/static/images/icon_wand.gif create mode 100644 hangar/static/images/icon_world.gif create mode 100644 hangar/static/images/icon_world_dynamic.gif create mode 100644 hangar/static/images/image.gif create mode 100644 hangar/static/images/image_new.gif create mode 100644 hangar/static/images/interface_browser.gif create mode 100644 hangar/static/images/interface_dialog.gif create mode 100644 hangar/static/images/interface_installer.gif create mode 100644 hangar/static/images/list_comments.gif create mode 100644 hangar/static/images/list_components.gif create mode 100644 hangar/static/images/list_errors.gif create mode 100644 hangar/static/images/list_extensions.gif create mode 100644 hangar/static/images/list_images.gif create mode 100644 hangar/static/images/list_keys.gif create mode 100644 hangar/static/images/list_links.gif create mode 100644 hangar/static/images/list_packages.gif create mode 100644 hangar/static/images/list_security.gif create mode 100644 hangar/static/images/list_settings.gif create mode 100644 hangar/static/images/list_users.gif create mode 100644 hangar/static/images/list_world.gif create mode 100644 hangar/static/images/note.gif create mode 100644 hangar/static/images/note_delete.gif create mode 100644 hangar/static/images/note_new.gif create mode 100644 hangar/static/images/page.gif create mode 100644 hangar/static/images/page_alert.gif create mode 100644 hangar/static/images/page_attachment.gif create mode 100644 hangar/static/images/page_bookmark.gif create mode 100644 hangar/static/images/page_boy.gif create mode 100644 hangar/static/images/page_code.gif create mode 100644 hangar/static/images/page_colors.gif create mode 100644 hangar/static/images/page_component.gif create mode 100644 hangar/static/images/page_cross.gif create mode 100644 hangar/static/images/page_delete.gif create mode 100644 hangar/static/images/page_deny.gif create mode 100644 hangar/static/images/page_down.gif create mode 100644 hangar/static/images/page_dynamic.gif create mode 100644 hangar/static/images/page_edit.gif create mode 100644 hangar/static/images/page_extension.gif create mode 100644 hangar/static/images/page_favourites.gif create mode 100644 hangar/static/images/page_find.gif create mode 100644 hangar/static/images/page_flash.gif create mode 100644 hangar/static/images/page_girl.gif create mode 100644 hangar/static/images/page_html.gif create mode 100644 hangar/static/images/page_java.gif create mode 100644 hangar/static/images/page_key.gif create mode 100644 hangar/static/images/page_left.gif create mode 100644 hangar/static/images/page_link.gif create mode 100644 hangar/static/images/page_lock.gif create mode 100644 hangar/static/images/page_new.gif create mode 100644 hangar/static/images/page_next.gif create mode 100644 hangar/static/images/page_package.gif create mode 100644 hangar/static/images/page_php.gif create mode 100644 hangar/static/images/page_prev.gif create mode 100644 hangar/static/images/page_refresh.gif create mode 100644 hangar/static/images/page_right.gif create mode 100644 hangar/static/images/page_script.gif create mode 100644 hangar/static/images/page_security.gif create mode 100644 hangar/static/images/page_settings.gif create mode 100644 hangar/static/images/page_sound.gif create mode 100644 hangar/static/images/page_tag_blue.gif create mode 100644 hangar/static/images/page_tag_red.gif create mode 100644 hangar/static/images/page_text.gif create mode 100644 hangar/static/images/page_text_delete.gif create mode 100644 hangar/static/images/page_tick.gif create mode 100644 hangar/static/images/page_tree.gif create mode 100644 hangar/static/images/page_up.gif create mode 100644 hangar/static/images/page_url.gif create mode 100644 hangar/static/images/page_user.gif create mode 100644 hangar/static/images/page_user_dark.gif create mode 100644 hangar/static/images/page_user_light.gif create mode 100644 hangar/static/images/page_video.gif create mode 100644 hangar/static/images/page_wizard.gif create mode 100644 hangar/static/images/table.gif create mode 100644 hangar/static/images/table_delete.gif create mode 100644 hangar/static/images/tables.gif create mode 100644 main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5572127 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/gohangar +/data diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/GoHangar.iml b/.idea/GoHangar.iml new file mode 100644 index 0000000..5e764c4 --- /dev/null +++ b/.idea/GoHangar.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..ada03d1 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..519481d --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..28196e9 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..fcb841c --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +# GoHangar +>A Golang remake of [PHPHangar](https://github.com/Unkn0wnCat/PHPHangar), which is a PHP remake of +> [Datenhangar](https://sourceforge.net/p/datenhangar/wiki/Home/) + +## About + +GoHangar is a simple remake of the [PHPHangar](https://github.com/Unkn0wnCat/PHPHangar) Directory-Listing-Script. The +program provides a simple directory list for setting up a simple downloadbase. + +## Features + +* Easy to use +* Quick to setup +* Lightweight +* Easy to customize + +## Installation + +Either download a binary from the releases page, or if you have Golang installed type +`go install github.com/Unkn0wnCat/gohangar` into your terminal. + +## Special Thanks + +Special thanks to FAMFAMFAM.com for the [FAMFAMFAM Mini Icons](http://www.famfamfam.com/lab/icons/mini/), to +[photo by Florian Olivo on Unsplash](https://unsplash.com/photos/0juN5ROSxzc?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) +for the default banner image and to [perforin](https://sourceforge.net/u/perforin/), the original creator of +[Datenhangar](https://sourceforge.net/p/datenhangar/wiki/Home/). + +--- +Made with <3 in Germany \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e2924e9 --- /dev/null +++ b/go.mod @@ -0,0 +1,13 @@ +module github.com/Unkn0wnCat/gohangar + +go 1.19 + +require github.com/urfave/cli/v2 v2.19.2 + +require ( + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/gabriel-vasile/mimetype v1.4.1 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect + golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..2d7c267 --- /dev/null +++ b/go.sum @@ -0,0 +1,17 @@ +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/gabriel-vasile/mimetype v1.4.1 h1:TRWk7se+TOjCYgRth7+1/OYLNiRNIotknkFtf/dnN7Q= +github.com/gabriel-vasile/mimetype v1.4.1/go.mod h1:05Vi0w3Y9c/lNvJOdmIwvrrAhX3rYhfQQCaf9VJcv7M= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/urfave/cli/v2 v2.19.2 h1:eXu5089gqqiDQKSnFW+H/FhjrxRGztwSxlTsVK7IuqQ= +github.com/urfave/cli/v2 v2.19.2/go.mod h1:1CNUng3PtjQMtRzJO4FMXBQvkGtuYRxxiR9xMa7jMwI= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/hangar/server.go b/hangar/server.go new file mode 100644 index 0000000..9a2a234 --- /dev/null +++ b/hangar/server.go @@ -0,0 +1,246 @@ +package hangar + +import ( + "embed" + "errors" + "github.com/gabriel-vasile/mimetype" + "html/template" + "io" + "io/fs" + "log" + "net/http" + "net/url" + "path" + "strings" +) + +//go:embed static +var UnderlayFS embed.FS + +type Hangar struct { + BaseFS fs.FS + Template *template.Template + SiteName string + NoHeader bool + Banner string + AppName string + Attribution template.HTML +} + +func New(base fs.FS) (*Hangar, error) { + t, err := template.New("directory").ParseFS(UnderlayFS, "static/directory.html.tmpl") + if err != nil { + return nil, err + } + + return &Hangar{ + BaseFS: base, + Template: t, + SiteName: "DLBase", + NoHeader: false, + Banner: "/static/banner.jpg", + AppName: "GoHangar", + Attribution: "GoHangar", + }, nil +} + +func (hangar *Hangar) ServeHTTP(res http.ResponseWriter, req *http.Request) { + requestUri, err := url.Parse(req.RequestURI) + if err != nil { + res.WriteHeader(400) + res.Write([]byte("400 - Invalid Request")) + return + } + + currentPath := strings.Trim(requestUri.Path, "/") + if currentPath == "" { + currentPath = "." + } + + stat, err := fs.Stat(hangar.BaseFS, currentPath) + if err != nil { + if errors.Is(err, fs.ErrNotExist) { + if stat, err := fs.Stat(UnderlayFS, currentPath); err == nil && !strings.HasSuffix(currentPath, ".tmpl") && !stat.IsDir() { + writeFile(UnderlayFS, currentPath, res) + return + } + + res.WriteHeader(404) + res.Write([]byte("404 - Not Found")) + return + } + + log.Println(err) + res.WriteHeader(500) + res.Write([]byte("500 - Internal Server Error")) + return + } + + if !stat.IsDir() { + writeFile(hangar.BaseFS, currentPath, res) + return + } + + hangar.listDir(hangar.BaseFS, currentPath, res) + return +} + +type DirectoryListingData struct { + SiteName string + AppName string + Attribution template.HTML + NoHeader bool + Banner string + Path []string + Entries []DirectoryListingEntry + Readme string +} + +type DirectoryListingEntry struct { + AbsolutePath string + Name string + Icon string +} + +func getIcon(fsys fs.FS, filePath string) (string, error) { + file, err := fsys.Open(filePath) + if err != nil { + return "", err + } + + mime, err := mimetype.DetectReader(file) + if err != nil { + return "", err + } + + mimeType := mime.String() + + switch mimeType { + case "text/html": + return "page_html.gif", nil + case "application/x-shockwave-flash": + return "application_flash.gif", nil + case "application/pdf": + return "file_acrobat.gif", nil + } + + switch strings.Split(mimeType, "/")[0] { + case "image": + return "image.gif", nil + case "audio": + return "page_sound.gif", nil + case "video": + return "page_video.gif", nil + case "text": + return "page_text.gif", nil + default: + return "page.gif", nil + } +} + +func (hangar *Hangar) listDir(fsys fs.FS, currentPath string, res http.ResponseWriter) { + dir, err := fs.ReadDir(fsys, currentPath) + if err != nil { + log.Println(err) + res.WriteHeader(500) + res.Write([]byte("500 - Internal Server Error")) + return + } + + var entries []DirectoryListingEntry + var dirs []DirectoryListingEntry + + readme := "" + + for _, entry := range dir { + if entry.Name() == ".readme.html" { + readme = path.Join(currentPath, entry.Name()) + } + + if strings.HasPrefix(entry.Name(), ".") { + continue + } + + if entry.IsDir() { + dirs = append(dirs, DirectoryListingEntry{ + AbsolutePath: path.Join(currentPath, entry.Name()), + Name: entry.Name(), + Icon: "/static/images/folder.gif", + }) + continue + } + + icon, err := getIcon(fsys, path.Join(currentPath, entry.Name())) + if err != nil { + log.Println(err) + continue + } + + entries = append(entries, DirectoryListingEntry{ + AbsolutePath: path.Join(currentPath, entry.Name()), + Name: entry.Name(), + Icon: "/static/images/" + icon, + }) + } + + res.Header().Set("Content-Type", "text/html") + res.WriteHeader(200) + err = hangar.Template.ExecuteTemplate(res, "directory.html.tmpl", DirectoryListingData{ + SiteName: hangar.SiteName, + AppName: hangar.AppName, + Attribution: hangar.Attribution, + NoHeader: hangar.NoHeader, + Banner: hangar.Banner, + Path: strings.Split(currentPath, "/"), + Entries: append(dirs, entries...), + Readme: readme, + }) + if err != nil { + log.Println(err) + res.WriteHeader(500) + res.Write([]byte("500 - Internal Server Error")) + return + } + + return +} + +func writeFile(fsys fs.FS, currentPath string, res http.ResponseWriter) { + file, err := fsys.Open(currentPath) + if err != nil { + log.Println(err) + res.WriteHeader(500) + res.Write([]byte("500 - Internal Server Error")) + return + } + + mime, err := mimetype.DetectReader(file) + if err != nil { + _ = file.Close() + log.Println(err) + res.WriteHeader(500) + res.Write([]byte("500 - Internal Server Error")) + return + } + + mimeType := mime.String() + + if strings.HasSuffix(currentPath, ".css") { + mimeType = "text/css" + } + + _ = file.Close() + file, err = fsys.Open(currentPath) + defer file.Close() + if err != nil { + log.Println(err) + res.WriteHeader(500) + res.Write([]byte("500 - Internal Server Error")) + return + } + + res.Header().Set("Content-Type", mimeType) + res.WriteHeader(200) + io.Copy(res, file) + return +} diff --git a/hangar/static/BANNER-CREDITS.md b/hangar/static/BANNER-CREDITS.md new file mode 100644 index 0000000..72a6fbe --- /dev/null +++ b/hangar/static/BANNER-CREDITS.md @@ -0,0 +1,3 @@ +# Original photo by Florian Olivo on Unsplash + +The image is a cropped version of a [photo by Florian Olivo on Unsplash](https://unsplash.com/photos/0juN5ROSxzc?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText). \ No newline at end of file diff --git a/hangar/static/banner.jpg b/hangar/static/banner.jpg new file mode 100644 index 0000000000000000000000000000000000000000..55de8dc4ffd4036c7c33c0eeaea3d0262578c637 GIT binary patch literal 37076 zcmbTccT^K!6fPPB2~9c((jgj(B2^P0RO!+?B3-H=y@M1%jUjXd3_+xX-m7#ep@Z}$ zEkNkKgLwJfch`Muy}#bQd(N3PYv#?XGLIQ5U9U1~c8iIcv z0FGNocW?3j2l;;)!JXSa5(7y{$;fXTR8s@)5D*gHAtL;**SD>MZ?6N0XztQ-3Cj`F z=~w}|-RVWb;xb8i^TG~q3}XcNm)fz zO;6vz(8$=t)W-IWoxOvjlc$%rkFTG9K*Wd0sE?mM!{ZYYlajxtq^AAI%FfBf{3c@ri7h=m_z&9uME3s=Sor@Hvi}Y2|HU-}pdci;{dj~l02#pbK}}L5Z8KKJSyR@UPp+`ZQO(pDIC9Tu5#AXe5Y?F&}5(~I?0}) zrb;X1``rwefXs+AM6PqBKvwKA0bW{l!a=p~ay(74*2j(2dT7;jU$kjcN_sKq&wwmZ ztHw6qG!xWLH?BtOrD0@ogn2;$LdIOeWLjk6OXc0>*=MGTz}B-;!Ub@7xG zp1<>43jWrdF)%+){+R8q_YB8J)1Kd2;5slyy1MgIheCYMW`OZyHZ@V#cbbuL4yXIP zhaD;O#>Ulsm6n*dMh5p{`AwpBr#iW(UsSpZL~M*SQoXC+MV)44YtYN-$J!E6sg3WC zG#VC?e$Gi0zFTQpK1*7j)DQOqSHIhkP|NFnoqm2&#BX%=wqr(Z_0^MmqqMG^_Pa;{ z&B1~1_v$^ULfWgHe>^71tdM1Ms(d-UD7cX0zw7!c#j_p|_uNg=J>vkQ`Z)oLr7x53 zteCpyAFk#2gKM()d^Q4o;_)ZJt9bA?G9ZM(LOEJ6rDv7ljjP(R_^|V{X4}W2he%Cl zftNAemU1kzShaQCGs;iB2hUxW^rG-=kR79B*03WFiM9Mru9@soj*((em@%%t#K%(& zcZm|ZBzv>-BSl5l2d#?Xq>!5-m2N87Qurxc=dO0jeQF=;ob32MUzHxt#p{7#&FE@u z>AX~DlViNoW}?F5zH&5qT%H)1Nx7_757P%4dR*a*&!li$ z@Pj6$rP5MNO8o3pQuj{Uo5uN*ZZE@H>m;knlyz@t+37}KWTIpi*G^7->Z9#j{dfkWE| z`EAQCV4YD{&}R_sMKKd=nbj<;f(mbz(kt>y*E>1yOr(S>E6oVWsI!`s;VkI`Q}{K~ zBOT$~JZ|X_r_Y~0O$gt793<|1FQSK*pP9g=eR9jp2Q4V3*jQd=0poW0oGhu&9???j zv={U|0IT)NIg#CIpAZ!nD{%mdzdpAwa;P-h@;N9kGvZ36G$Hnb9^;SK>Ryv~r8Oty&CC_AAUQ4DY(e=az=;;w zYn`R_+)=w4hZn)#&p6fAA&a;A;3P0+BFAbB2Q1N0T8!$Ea_@5bJtU^o%k<0-vVp8> z#W0`XPx5Qx(2$e7S3Kyy&_X3zStF$TNJ=~Bilxt;?4S>L!UYDFr@gOg-b>iMb$s0p zy*wECVHNHk-z36s#2R2flEoR+o_SKBB*N0Rhjje*>8<4u{4 z12!tTx-*OiJ%UC>g-vDX`-XZ0z;mVyMi3AYF1w}s!oO9@CP$X(s4I}tNhQKQ6tWWH zmFgal<}QK)v=hQx2t{H8kd4PhDXRj=3+W`x+r{s1?U5$~;x;qwn%l##GHK@icCQuJ zWc?H=#In~D&X<{6p}bES9yYEUrMH6t6O?HI=uRoGB|l7NORgpnqNtVfI~qSyEj`P6 z??D|QPrT@W$IZL1Ol1CS1v1sDe3GiCY~{vkF{1UmR!9C;mOqlFXZ>S)iG5a%^~Q|U zm)t6FjualmfmBXMvw@%A9M)Qq@_@xh&I7KtMc76durg0!l9S)e6IL8K0+a2e=YMz@ z9>MGeJFQ;`M8uME`V_wkRG^QrALvpQA6UQPQmDCr@7ZZ}n_wUpUvfLKG%P#dS)|q2v*J z$g1<*5u501Z}Dfg9+j%}bV&eoDg$U_(aH_dsq9!)qQ4sO*NMFT!#h;ip00gE`P~I! zZ(MWW1pRio#)C%zs2H_%P>t#`)n))?5^&1Ku7}4DhgmgM%zj4-Qf8qo>;ZV^KM9L} zONU}7a7_}=MW0K4+fs3w=}?1sgkdh}6SHHLe4L9mm+DGJufAlcUa0e$ z%;$NY2Y>pC9uM5t-Dg1+!WT7@X&O>r=`N6R;CO-K$E8n` z+4#myGtv&8(`XkfF1mTFY5CL~zmSK051KxeveYf|f6L(-9xmhug>IaW)k)!U-G>4$ z)iaWK=iZb}dom9lczAYNj6d}LX$+5~4*kf{8543*;C{UF4{)-%#Z+n_)xO$aSnI!P zMwxmH!STQfp{}X3>gT$->E9gx0b051R6^R`%G0N($xp8vt&+!di2M8l5Lerco(xr( z2n07T)qGZ=D1czKjym0PpDN7(35gplBAfZO$QE9P3`Rdj6o3=sR`WMi*$QKr??0Bh z_1L`?afZhuNvf)HE{<8 z(0E~k_T@#N0n~>eoEcV?vFJi!{%Cx)RXFT zgz#q~Cso3Hv2#PaPmQuk_{<`XyRSDTx?VkSU(xSj7+F;!!V}6i3UHD)BE%-zRj0~Rbt3=MASq;_8 zD`rd!iRSnwEwW!yxOC6MMZk>eZw^3z@bCKX9RjjiGk|c6C8YC>DnPpc$i|eAfR1WD zIj_AEb8Ml0n_FLP<5+rOMT_@zacLq%E;qkF0B?W6x!l)G_KQRpty6@W_8YV@-7xB) zjuwi8=UK#a49RDtO}uyh0VsmR%_@^UPNk0ne2+ukr!FGC8PyNT`{ljxe~rz+!$+Kz z4EpvvXyv4kD)@sP?N6=HO(plR`KC^uj&xu!T!TZ35Z#rcM|3E9Qn$*9 zC_LfSJZSv~yh($akYnk@)^EPHcEu8WW;kHIIPD5!_s~QMo+mQZU@`&epVtjtRUNW1 zWOF0P%huLZW^W$8MFC2xM~rI-S6}g!ScEsQou$OclCd0msXUhbpXbsu@~2B6n@#rl{l{Q6fiSaGyoL z^#ch=CiCT9KuYtvSOhRzxHrQi{rS$Lk+}x-)>r z_pa*)`(l4q-=V7fUlC*YmWh%nCn_TNub0pKc;b~W7*-8`T`Bt3pLvNgspjQm9iyMr8gZh#NA*D;$A~$waG#&*IDo02SlCe#}KG{qW=^olpQ>N9!sjZ-cI?kHptL0bNPkg z6g36%6>5^g?a+0ARN+-+_4DrqbzC;q%HXttma*g!eSSH+y^P^WFnbwAfk^9J*k!P@ zs;TNUpk2@tIbK@65|G9_wN;hw*A4#`j`D%6H#fg|V`r^GgqyE#;59ZAY)gn$8PatA zjviD`B6{ABVIe7c$kg=$lD+G&k=CeJnw)A46__&|xgCui2x>CSVFKyHkJ%@6*u8?D zb2m7^!;r-OCH~VeO109Yt889)T)|>Fn^W;lTzc55%EpH2@46!)>6CnS&eo)j$+Ujl zDXM5~m+SrG=#I?e9dnk03Wrjcm0Gu$2cA9aTK@nA&7WHI^@Haq?3x45Pkv|>Y)lNB z%=$+^{-&OZ!vq=SCs&`OEXZ%EHi~N+A4$R_FE|AI@APqV&8JF@X{uM+#Jn^pR#vMY z5nQXO{~T|OWI@i?7i{82d0>}Dn?1P+rWpe#T)Y~;eylp~Oj+~UL}QQ|>XlZvybBeknf-rQ_OzkK#0Lr@NM#`#`C(S-3yuTLKIdPBe9$93x4zsnv1 z&#u_q;aBodgNO9ga&6Mp_UbB~JxKot5Y;wsmP%v<+fjEx4rx&N-Izxu8$N5xJJi(1 z8DGJGXYQygdvQ@m#dIdW`UyCE(xY;=iQ$fS;a9nYw2n7R45&ioLpz_Q~`syMyg@%AqR8v?k zpA%BrbL}dMmf`u1Z{~OQ*HMeS_>6;(L~;Hh-ZS%J$hPYD^FHv%JrN;B_qPKABWBY7 ze!e=64Xvrv6Y*;TXS8fbW7Iqx>AHW{$`}L^?e#uUq zF8yBr&Fv*ccy{cH4G$rN5J7hFQDc8~x7MGbI5O+coLWBv&lMIx7dJ&PsKs{$ z)HWf|HQ0q!Tg23R-OGJPdLxFvQE~5ZV z8}p{SP8nqDIDgKim6hxR;*fH5UBGro+MS1Uhvy)d8ql_dMpyH=2?0U+8nFQ()eft% z^L2v(XFEDH3;U3K&}xMT6$GE7h<2Ynx@Axg0$4+dCC1*JX=%HoPV=dNoR<0;b1U#{ zD{h(6^HCOLM5&s;Wbj39*_?=SwN3<+O3$X}Ozcsbp&4PuL~O>}Sm8ZGyRJ~T;45}M zD!nf0D#~C{xTXXio%%hBhr^O8FDtXl{ajm#%8gfw0}IdQ($e%iz5|yF7akqfk$n&W zKtxoX4u~)Cur=lN%)m6nVm%X(&V<8nt%!suRN1@Gse^OJ%ssiu%v*6|X?kcO#|j#! zKc9NT5C@&Gu|oSy1_~P>W?&P7skA)=vbviz4dykGChoE*hg3Te9e!H5jL_ewzQ$n0 zr8Fj=44HoB$^BL-{`;H>3U1~<<}ARk^(^A@ig;JsBciM}wq7xQwOdwHB9PmeuLrYm zD1Ru*d3e7?!H4LA^s$?CRE}}t-63YFqxsC*XaW|0OMfgT$LVIz#uu2!rp!9|4Qv;Z z5cvZ`e#%dR2!1Y1f1XI`W&`Uv%LCOm;=4dAG}Mv)&D**BXRM#^UXGFtFqzBnl?Al z5R>QU+v(o?^)YR%xeysXS8~E}{87`GoiXVqmQ3WXJEL!xKoYO4)!1p5z&rIZL9wgO zyMx9nNpJB}ldNS0l)5o`Q@_@9O6fEDw~I|3@U$Z33TH>=aoO>|xx-5vb~Bug2=ZWC z{@L`OzulF)YAPHKf|M&f8x>Y2qXNdL?H{-Y)!H|v|1N%q(RdeP%+<#(JUUbJcqxsg zI^I&B9UtrTihAB{UO~`JNHlG{uIBzeHzIFW+3DcTvoqnuOHui|hBK|#coc!rwv|Y; zpAGV3wN<;r=`cyxntPX$bI!2WC?)8tZ;FzV7E_6j|4DWhWUpvg=+ocyR%55`-=AfzR-vjY0jUzYIdk-Q_!$`*r*`BR8vsG<-}gRe?qAD_1km9&t2`WjH0iU71UT760tx-%FJJScD)YJY*jq zcDV1hPTRD3VN@wk@`Ydi*aMQrmIw z{=#M!hXANRE-3>H84`Jbj8(9rdczI_Jw)}-hW8Vg`4-ZrjYb8JrpMp zy$6D2oyhq04=`h))iS=T_bQDI`Y46Or$NkS)%<)T-s3$T{G7wa$f&RUG^PKpiJC54 zy*BlDHu#Yb3+MCGY0;O5aOQ=WBFT-!qx*w^aUPwMIItAnEmsg$(W zoVL#!UpvJmB~(B-;Qs*kT%>vY6m&+}Ea8X7Y)^Lak*_nsz;HQ%cw!ZNi_^LD@>$ew zBYB|bca5A!--u{Gz~8hbUxXa^zhM%TwrXt!mhmuL$}UROxJg$ZV6f!m(MHQvz7i2R zbBvsIjz8{E#3>CfG7yf^9HHU{Md8c+d_dN^(1ICPmjF6{iYq`UjPUx_V?57&bYI?|RnT7dCimuGwf zW^5U}(S=}{Hk~s?+w#d7x);L+UdVxSg*Obcq^auI4E2Cs?N1XHxgeqHi zerg+JQ1vV?W(!{B(L=LXwn!G;yn)52C7~!h2bAWheeGw8nN(?>nR$q=Yw+ArqSBkw zYugl^Eq?AQlUX2aYZVY7$A%BOuNltp&x+XDPQ;|z$zXow-?WOrQni3^40o17SQ`&KUPK-zlcVtbv!fj$ z50~F^(Tv$+iXtqLSJ9tYq;QN{S%J?Ew0qB_E~_HR1nfP${-a40+`D3Vd{SHowwLW~ z(lT4CXK`$-xO1;>ZuuvRKiFujhAIL-Bd+h=J5;fC2DXOG|YaG4J#$^Zkr@F5Qd8%IKya@b69`D?;Zy!zk5kyKB zGtcKy@yvhd;(DvCWAzZ>S_@P2gBxdGuw#BtAU=Ec1%2t}#EFm0s+2SV$oI?xbIxrqGY!V}FrD(c>`IF0wl*+pET6=L&spZ17^+T(VK{Mz@(&P5UT#7z=td$FTN>-yO{bFM zBP11O5ghk=Y36G%RqXP4FDkG4$=lJL6Lb7MkDqY0Nn34284kxlQxE~M8?Q*LJ05G(VSaFwqJ;lt#131YM zuF`$;Njg*0@d0Qed)*K8Y(C)fxKLin%c1A#16E{UKn&i%RB=9=AUbO=05=o&kd&*} z6+qK{G9>=ZNYYAL*?HZfns?xVRG5(uX;;AIVxW=S{ZF}p@171ksrP{x8yJ_!&6s&8 z6Bc{8=Oe=9R&3c(UPDc&hFI+xdK8v} zO z4I7>TQh}P{4gBF%OvAOnvid#u@#0dOoBrAtQBYmW+0^oCHe&bg+vzRF>5T2Uer+w| zGxu&Ll@>lbW+|V`$u+x(VvF-YwWynszl(i6WQr_8f1*FGv5~?mN9`*nGtbGFCFP3O zE1e%i<*!clou=46f0OAi-21adR*Bj(l+tr-aVnzDORC{`72f|x4JrMXS1dM zFQJQ~MSmo@fPm1PGT`(dKzck2v(V}NlRhC38`>FQ*ZB2U3%yvh-Hj#am8=a?fjRZ{ zk0IvXc(R0AV4bD&nApcK7e;3#S_STlu*vl48}E%bb!q6CfsM)0%gqpt^fwv$7)LqG z=wwMt&h>yb?5C$W*Fi+9uFBa=q8cM#l0vyziF(wEdy9)0WTUbhl6mk{>oG0VBo!tUe+Z9+XHJ#c2I%6zyPK1_$@m zz2`qSduVrTf1<$;uNLPSc*jLD7ZKG1-Psy=GsnHu5H3l!Ud=#zpFCD>YwLW1q08rb zih>G!aVtnj`h5hAe6pbM$SR%~aLQqddBjw4wqjT1Dod2n^bfFEAVQHZ<+)Jo+nJGW zomD7`Y2ySu_u(8j2{`nFxf`wBQhkGmOlJF@^FMzKeJ!Q^Qg4f80>h)fAp-3m<;J;T z%h}HJ%z~PPkr7+3Ne=KH#BV8qn$W!0NFeiB{^y5v-PrsM?Ruz`Z?R6N$g_)&W&wKY zY;|4IiMu!9->MLoXACNBac5^h)a9u05&BPn7e+?Y&3{WH){785RUl%0zgxy)BF%WI ztT6(igVkt1%6|9#?3N#P3~ISneFWD?CuS4R2@jbk{;KcUK%&Q}JM6j$uoDs6?xQ(^ z+xV8uT(sZ1=X@H-;ccnB`wZM2LUb^cL*FB~@+<&xsSRM-hUG8a(t+de=zoCT3Q5H& z$s;tsK4695Oj(>{Wzh!dWD8~Pl1Ax^8fVgTy!3(O>m{{y@0{z}xOa)d$ztXH3ad<0 z5!rJ@YDI5NGM(iS-fOi?*yh)shQ7tIu8fHqBYB>n>=`Vz>Pcqf3~tWk5SRMDd6fu( zr6DJj*q1C?@(x+O>}m-^rW<1UQYoaCz)HgxawM#lr+e^vfQ`!|Ati~+$tPO=#+NUf zuEbU3n0e3_<5I#O}%qhR4T>3`BEH; z8WpeF5>m(=!wL}8Nt|V^C*lD_-JA&-YN^H>?Vis|)}r(6bXg?7g#w-8Nl6>6Kq;+c z#4>|U-|cE&=CiaUaXoGDsHpllTJ0$wn4wHI2bXZFee^Q{MEo$NoYU)cL%V6ATO?aX zUR0$}pxz@OUej+t)@5FGgsV@~g~PNe8T-(*8Z;L_x9%l*j^b9OQ`<`fP(+xgE?E#d z-8^imcvBTWGOf27@6gRWB>i{GXz5+p_sS@~(qe0$rMMV~jM~|N$dmo=@)!r)rBN5| zh=I9o#6sp!#<J6e#|lS{+s)1X3eF7z-iK0Eg4=9O5@Z2_As;8=WNo(ndN84yq6;;Fle3iv-I{YHWGpQ#>U%yui zU7-a4C}Ep{_B1jn#!-eiwoQw;q6Z#ouSg|AcWK&x&=Pt*7Hz{iSySG2a*Nb-KM|5z(q1I7hBoPJR8NxCE zp1pJ{`D+E#%4L|QaS{`B!-5^v^?oEHJI|+cu%HAZF6$yD8=jW;Irc9)Xju?{11Bo( zN4^H>J2FQA4F`cdgg{pOR_n$>vi->7s?V2$KV{k(yox=#z(2sUzwb?(th1@9UH^po z5yj-Zk%!Ac2LlijIbV_qAG)LX$h$dKCMhP;ID*5H^DEam!Yycvf>?@QTt+waSz0<< zJ=!_s|43QC7?dtcSYKKqc&+#@zs<&KX*SQ*-piy{SxAt3orHM<{i8)%tgziR9I`^z zhBOtfO6c-GJ}uQgf45v1L$T@eGdiNm=(pRmP@ORxS91%V;i&qFM#J{m-r-ZR9p5 z(7Y-Oi~%+UcTq7b+^3pr`pGe9l56m#w;<0NXLnhwC+%}yit+b7+x`$8@9&Vs%GU$V z*x1^$5I?UG`XRejb^K?(x%B+EQ<;;l+kKCVh&gm_v(xKwWVh!LiTc|MbUp*)U(_sxkmWiaH1uioF7Q3=)?v z&S1`Ijfs?v3F{uf>R^rgUSF`;%e%IHG)tu*B#BlFfVCsjXJ^ zxAGlx1d9x`ONp=PiBF&e+7X8P~lBQgg_^ISks)x-%lWrjn{GYhkl>Bt`f7O z69lkhW0ct|HgTP=>_N1e!c+R(auHbQN%8p51E+^j9taM3o@YV=yc|zuQ>WXT$@B#v zNjsg8q}j6CivY>vJU9x42#hmi-oIae-1)+c9e~HERe4l>nt22!S_~NRw?}_C##(7o zq3BeG+8{lb2FxZjDRpzkggY91n{L0d!6+Mqo@gDuw2tA0B*hHSO-s#nAe~r~Z)F$K zrDg8;AsG;d)yfflZbgFoP9LVa{+@koSrv*6uv6*As@bj!QU)BtgcX6`p*%1LOuoeZ zSi06NwcpoSqxE9PJ)6Q2D!9-& zu0fN;z98tqAwQgDORb#lX@cEOvSAP@8+hW|?I^-XA(F<5Sfo(nWZnLoV13gv>$iQ;fq*E}O7;xOC5p%4u zG4N<84r2Mb`J_LTI^wsjSc{%J+QTMlA+(K=RxvI1_OhR9k4dQ5=KBaP91Jq2S zFVc^v(#vpiR=E|QcH{44%_7iRFn-3$3+y8rek(_TWpy(vPlE1Dd?j{q||f z1Y|1}e*r}fS@uAOhaaIg)q57C&Ft-%DhX84o1a~7TI3m8K@W}&>ONWJKYwz`p&W1J z&Qv6y4&z~YHsA8pqIE}(IQS!PdpXRRvFn)$4+&-s zCOkXQ#G)L{K+vTrIk|S?BoQy8+GXg5j8rKW^=P)C{qB8|zxIaT=EaaGYAZ;WYi^)g2z`_?bg++Y?=VG#OpJ^@o2= zlH^hRv^tQMkH3S}9@C;@p&X<)^6sY3v0z#m|2G{zr!dt2!9(_>l(ca_(e%S-&(lvg zgJ#`=U=TfL=o zuN=?dZP^OlujeBvuqc6$ok4t>E^y?V!SmONZx8iuBI&CFIlpQCE-S0LQ zPde5wmzsH=DPAVFjVCF22g}G`yQQpZj-j(NbAsPTXb+h^nJjWeGxm$bW$9@twbXV_ z2JWZ_Kd~o~P1wiHJy;>~!!fmPp_7iq9_6qxUl4nSqd903ecV7wMJ zS$@4OdbmhoXM+)(Lyu zVT)Si8`{E-rghfF(!UJCz&wPFEbFX$6>Ql22K@(x=j-rvJNw3wnPVG9gOLZV-gtf% zLMa^Vp09*b?(aT|xW$UFZUEuQj=8;+8;@?=C{Jh#6uN~J-g`}%UJ&X-xWLSSTjo9T zlAee(5DOgoSiM|H9$HBI4^Rl@v|rtdF+VxciVAvXi>4lREqU~mFXBmULZ}-4xHNP- z=ta3mhUgsYNol}2M^Og#x#ugB?4!FyS=P0(%&JV+ax&@uVg*KhtNe*S3pvC)Oq4i8 zvw*K08aA4L8qb|q9#}3E{)%m9eaGHK+kwy|Z8PNIDGuscj-kG&kl6zac*!t}zu*1` zpp~NOC)C41OUv)b^ghF&VPbRpJqt{9qONKbU77u0`TC2{M9ZJY#G~TVI%-$GgGVl(V)i2 z*U+4xH7|7(MWNrI#Kh4zk`=_*y0sZ-xPF*BO-M7!3`DV46CoIWas*T?dd5QX(g_5R zsl_xspl+s*tRdbsmQbv@qE=W!E8+YPs|Im<(HG{H8!@AB`Rl{RvARDfn}2{(jTxT= zWVMn8&F%~pb8fO!=_pDclP{CG_0lF8Uz)d;dXI(zfe(j>Eu^?lJxHBB8d}vst>6(S z;wl4~NEIo%A-nJ8OoJq1%TTQApNrhudwUb9j4V;0G8t{?kFQMNnAYPTU*a7BZvKBA zRiGyzd-_hIolEZ>E#@|6D0WSN?zbt@oB)KBQTrO-qN8EJc7U$iQBfiVd2RD+7=Fk~ z7z^>wWt?$?WXr2;VXGf4)!{hQ6wN$BhlV-K^f#a71Mpiq$~}wdYVLcty7Ku1vCksW zQ!MU!oln2U{goW!1xUrhM0NA#ul!gI-|j?Cd3f@{BSnml>v8O%K6y1!t}7vl!#O4GS>!FFNZCT2 z0vs@JPn&z^_64k5j&*yq$E3szW~PfJeWaeFX_eBiIe@i)FgHHkQ3d%k-Ecd<`{fR* z?5z+|ViJhEm=MhXnZ?)>MqW-lqJLFkpL6}}+}5dApmiO&8yr_>NKIsE?p^zy7NSX-t0#svsQHcd zvfO%uJN-XD8+z8HD505C^Q7~;s`vtm4Mh{j;(4jB;}~DuM^E(FU((wAo-ZR>o>g!} znfWxIyB5j2;xNny2G9Q-C%Vj#J~%ScU~-c^dlt>mVQkL?Wn~w@?|li-Xi6?+&mem8 zXlf<)gISgv}xSHl{OlkuKKM+Yjg2t$NvFtbebn-r*5t? zJmjzN8QqrxDo*4kxo(&6IDcZR$(&KrI}db!EnE9Vt^Du<)oLGt5%B%`y~Htjp#ZtR zb($Y7VBjk*T)Ei6*w1z1@|VzgGO5L?k(o;gJSDH^k5cz#q>jAw!IHG-NIYJ>4i0^R zREyL>QT+oL_^0oEG!=-hm9&=hAi>MvEMAd>9pDYRCwk+bX2~^ThF8DtU8{YV31vi6};`R=df7tO`QOW0^r%br4UgC5JhK? z9kqv{&{QLZ&*jE0uZ-kmx0bGCyX(K7Sr(o=c~DsG@2Et1s)Jf1bm3r1}GQ6-Lofa9Y*Fi!rJceCWM5 z?fi$ToF_zHC!Jbr0q&y!_wz}~&wEw}QZ>HMdA@baUJxbxLS`*o+$8x({+dhf0fR0l zDDJcP6NR?}7iNmc5!4G&q?^uZ`n$n)ETXHg(rKL@%91I04yTJ_nTL7sA;RD^apkFUbcL9|;TEK-f+K$&m6X;wdCGWSfgqHJ}2TU(D$ z^WZ0V1`sMY5T7HzEw|#nWy%vT@215D3*Kl@Z38#UkeM5^TBkvPtSep&b`&T_$&Q6JE~&Okv1X{bZ??xu9BJ4w-Bk71yegSHn2b<-$^+zFgOfZhwHnr& zMA>o_E0a9-146oqvts zfPTRoK2B%Rn^1b;Z-7U+vLY4c6{IITk%IL$MC6C~e?Zrr?CF9j2yk~Q z?Sl+IeY0B+TME7l9~-2RoqBtk+V>!sg{ljO56>WhLev5ys{P1+WY zq$?(+h1chKM(1aGS4SL^^i!o@N3@uB)*Re?UDA-BIDKL*0v32zZ+mZ&5EMWuaGTOu zo+UwS-{!XDRt`pCP8mt7)GAyFOu(5RP(>O1!{u?_E6B)b@z8G>GQTJ`c@DAH0zW9- z{H6Z^)Q(?28r?ZnvswMN#-VopYN@vClh_}w?UP!&pG4e)DRX^)M~4q027=%3zh72L zUCzV7CsrxS6X;%;(UKusqWy*22O}-)bsU3-G6u^=knF}N>6*#Wv0cvn{vlrfFlt12 zqo+#H{qLr;-Twg7$xg)TqAwZ`P-uY?LgAwxtC@lYhy6{)kypK{aJeY*F6D{l8WRbG zjBnx5Zisy4%xKzaf_u!_yV}j5jD!2X%AMvP*S{8oQlia-ri9?a-R#rFa`Z!K(*gmZ_YISi?OqU|MXv?cU z;F*3Mg;TxHaS83{N?1)j@mebwU1^E|KHF+C^{_VVBNiA7yUm;zZH(K27CG4}QIqeN zGw!8JFY(B$v)-l(J%?8Ay5INNp^KI69t5xzZaIt@+!v90?8A}daV+A>rmw^(-g?#c zmGj7CROyH8)U|-pPC(2GKcWsm`HFebD2MQ<-@ZveQ46Co^MoG653135kD zxbcXj4PSPW=Pt=*JZvIW^M*4Ym@6akb#MmQ53JkKf00TUt2(Fz<*+!K4-=$R#TDBv z`zq6p438i!2?&PFoqvZATYQpo77GkdEy~eJ_&cZa{)PCewM~@|`&xs{huWwGtf5Q8 z*Qhn&m_6~v(2#5+cK)y8%%zV4nJC_riMG6&%Wtbi%fAa-QIv>2! zPCmdnlD^T4WS=ua@AdA=Bq0v>#hQoR9ts%T&#y2jIU#b zNdq&g?dmi@qbsH)e=vw|<%k!!=9eE&PgE}gy+`vSsgPp_ZyI(yOkN0@Ov z(*=^s6lH6}VOsQI#S%A>OLb_84yjI%{Gk#+mob=F2E}0lEM4Y2PcQ;jTHulIBnf^MNG%A+_ z_?|L=?9nMQNy7e8l=#K%Q+s#DxW*&d%T zXVUzn2zF9AWTJ34t_e8acr(>YSZ;iqJFl6(1=o; zSyU#jVXNuaohLtJ{#;=X3ZvL_UMGLBu54s9y|CL8>^oVHQAs--)iRr#1HD$FV#B;U7pCPF9$+E{>pU3v0%Al4n^au3i+Z?kfpk(5q0OkrNe&FO+j!P@g-yJqX zm;3{SEQB3P%&zK3&V655JX!ue_C%`nPHAsesXVN(zft&r{U1Ovj@CnPk<}%{O&YSJhD8@X}OtP_NHzYj~pF(lSnwatUvUBfnSG%%2%|z#=)r`C> z2#@lXxLPpZSF&>GM8LC11l@l zNP`yP5K%3ictE2{mVV}=K>1qSSe{bOHU?=WshW55LyOhGd>%pSGgYavEyZq|h+y!>t z6UZ5E^rrmr`$d299#7(nWW^r9;>sO24+*2+3ePev&J41$)ceoL8f8)}Cnxwe>`oUn z|GaeZU2=dEp3;u|dgUG&bDJn!X@0Ul_glp}j;Y`})CNo_Wi&Ez`KRdUTX5$iy>KK6 ze(J2?5+7Am-EI6b48-$UKd60c%Zv$?hU6A3Ayyy7TvMeUGutyPmoYFr?tM~nIypHs z9s+Ka7TX_+^BGj`ZjRtm^ap-&IqjcqGs0dB;VsO9eD+QKJnW)vRU-tqF*+GKTQ}l| zzMm3V;+a(~HRZtKouP?i>CoLO`|bJv0qH;%zuJ~J2^>W?bk)(wTqfTAx{q4PoO0ZO z_*TW($<9gRx2;X0_(J~x#QuNSRyTM8?pAH5o`ibW(<#Og=9{uVImO|ph^y@A#_Z)~ zC4tB!_Ne!Qjhp~L3`KRfUkyA*Y;bIHKiOb$SlW+<^(`VXCDoLOr}&DT4&6m>3e=~h zWS`9W`uT1$igKw+NiMc#8z?TsWq{+J;+-0891rlP;f8U^IOFS018D<+?Oi8_YcPHR z!8<_apb9h7KDg$rKLGY4)YW_iImyp%I@KdNkBc`4>93>-vYLJVWa^5hPh>Jp>R9nC%sQ;a@Myn&NyhKR|h!32Q?FiG+H*LUBYpf zW_JEQhJPuU<9&k|W>NvJ6=d!PaxukvuD9^6{{U3fji#S>4fNL&vc(J_ovV^^%y0$( z$@IamFxT{vq3W|)t=+xnl1yf6SvN++b=rH6dg8&Y$E`589eEy<=`c?Ohzb28bT@ak9J$N+kfx=yi z#jwW*80=|Ac*k#AP2EmE3Pc(CMt2_KsKje>Fa~+W6=^h^_c&Wg&f$@W+o$D4Pds~@ zEIntcgZr4}ImyO8l^{3+IXU#|Dj3cWJwU0H;XyolRI^C3K){}qy@275p{A%~)4eK@ zv~?s@nxX2s1mhU*QUEdh#V|O}rfKNdIL3btl`Pc~0vDWf@7kUuEIo5k1}<_x9x6Zz zo;Y7xmTwkJne+s76)LeU$Q>#*UCod=2faN|9!7Inv#u8=M#(ri!O7ySL`yFxpG@Ma zCP870^{Y^@IO~jan#rDpC#h;N%8+^tbIn?cUIAPVI#nSi;xUYl=By{U#&eAGSVN^;JB z0b60{bG~V8aOT;+)hT-#FW-NH{{S(U7ZP1Ll1DN-cRgvC$$t)56Z&NJG+CmV4PX5fNiO^>P$o$S(0Y+wo~`1ivC-B| zIz|#*$-ZgS<@T;VQr@}#RpvTP=(f0sw9>}XFfQo1InQB{+upkU8s=R$QPZPXVOX~< z#Ai`&-AG1qTaFO(#eDTzOPODx^wZk!TON_&tNZEvINI&ha}72HHteSd%T_&3LCZ3L z7XTa+>}owf#deeGEVl4oqpG6Bu!SV48_6zs&H?8Gwrk2fSL1u{5bF1L3PqH6Z|6yA zYD&Vbl0XZd+~SQR##*+4cQwwRDHBg<@XAVqxfw9rA7hG_giPV~GjWufT+d~<$-R8_ zvGjTP!}dKmLhLRBP8>DVfu?bs4W&RJa1Ks7n(Q_I0F4m%Hu`%RC;risEJ$Sw_I&-- z4bJ{Bb6*Y!4Nh7z90&I_!#`QQoh-{CjtecM$UHOcKgN`$klU+1pUY*@J zS@-h(yPh?ChcCpqx{*#gw!61$JM{T)>7nahJotkbh_2^riJ60+pPreo4Dn8ZytU1Y zo_tx!MLdC;t*h!%-LYWBFf)*O&-u+|TlkLRz%){P>7Fs^U6^bv==;!mo`q~i5|kDm zdPmEl&fheU$alxIspU^<={^-|ZDrzcsQY}_*$5}E85Lr9?EFOo6NHzhRFA^2wCfv> z4tR#b=#0d(E=leQ=Dl|))}<rL-#yhX6D^8}P0_Qur}{04CPvIfi;VkZaN|NrLf$WCPHH&*f4sr*R(wLcnzl zG6i>2#bPO>qbsj7!^LEoel59Fq^|m{KO@0!{12_^%tP49*#0Q_8LobNY2lY_u*nm8 zFvm6Y>g$K*XSR*TGxD4qRcn)@YH|Mnq}r$lgSj_;znywC^GUCcA93=So(rKT^m-^}(-u)V>>db5j|GV~O9Pjf#=@8s;@0f@qtX&i5G^+aS*!x>unL z%7nfvuT$mm93Poc)|V{Tle7G7`JPt19=XjunBW1_*H3@&-&oUkI8>T2dZEDrxru{B zs9#>{I*UXsG>BIESSD?v z;}Rl>fyYz0pMALZ9EpA~IQmz2pjaF42S;HPYHn{YO~iqSR%oMLsf_k4^6)>qlh9UJ zhszD^f9d`Pxn((4#Kl59&1-I+SNYiO^{sjz6#PD#T{l#NPSlt;_Kf$_80DEbA}ACL zV4hEN$7=9R+b1J9iER;v+U37 z_=R<>bZ+j?(R4+YECY1>X{C;G2jkk1woh)9h4zf+@UH70HrQloOjCJ*Uuv%z!6TFJ)A6br z=ZkE#5G^z-C?J!g&*g$w(0Ym#-g6bOQzuUDD5mpc);pu zrAmx&am76F$0MIwc;}1`IviD8X)T7iFN23ftp>-WA+I#`g-j!RzZo zS7{>ERYopy*(;tq;+yup)Z_|t97LjzrDSk;$iV$+9ggzEHMk0jAuM_%}1TbAoEUE2e*9j zK}3POgPi-*k$(UWJXCojrYYg_GsovpT4nt@0u=+DvM9?Eq^PWWtHkI%$E)2kl*W65=R)o=DV*5Xd17J zt~|XyB$TX?!tW!6R4#Um=ltkzb4iQ@+2%NYVgoQ!=t`+hacX*%up zpA_kBbu0-m0%eKHtAU(k4!u8G`N*hZANY<8jdb;VCR~JhYTuYM_Y3h0pUgNbx#+Qp0(>iBz#6Ttm=@(G}iKl zibAKa718*6R@1dl5LnvkvWRryC^9kQBj4+cS1~y#+~eqKs{qA`869v&YgtlN7P@(! zRSd@wftM{ec;8g^XVquIcDEWyxzU^zT(;97G3_7S$4^hfxSQ9W%UH7W5=fgnFx|)a zX1T8m_}#oO;CQco*szG?@}3DBiGXb24!sX*i^l%|7)OkBw6e3d`vSi*$oMRKg;ECt zKj*D{%`7G%RB^X7Zq?7y=bd3G(Tt@f%_ylT_19!|m)fKk7Y;4%VwPyW`o|z*KA?Nj z8Sw~oRl)hOn(|EvW$@sAP8pWw=<-yj{{OF3o`%K|kwqTz1+?=Z{LE5a)I} zSFwCpyztJw;v1Rf(&f;viegyQNs{>=Ia3}p*MLV)TJsw#9XjUWZC3SzvxSY?A^{}y z;Gb&i!`Jqdl$>0DuOrROGU>w>>Bgd+-j3-%MxCt8^1;pre!x(8Ipdy{)a#xGn@=p( zyXHj$8D74p>0Gpm$i+$(AaV~C(N3gltHqpH>;@+;sqFDE<$s6Cfpf<|ah_?c{{S{J z265Jd%K{E*_Li-AI>w{|bIGlC)t+VB(GfRXlk}jUn;>=Oq?+BMW&~tLcC!whYh%K? z2A{3!$!(}=OQ&11l4awA$8vG+Ny$ZXF{InFFp0?E@;Ml$fTssEmk&nWhVGOwX0fK)s`Bqq(e$puRID0bw&cseh zYSq6JL&n;(-PkfC{F%q$>Hd8y&(b!MRYe=5EEQEpB>GnVuQSPL+mEI(TRsTVVAJem z)^6}7UM*3^bJs2X2hjUfLQ4%xV=PQ6=lPZ8D=S`2?HH}!`7W-*Y%E8CE#|${RyMwt zFp%5hB@X2zliQ4nD;veS{Cd5>*%tuin12!f0P9gs7^YHPH#L7M~2HMYEj#( zecQiZO%Go98~aZ9yWpj@&9;|tFEqJw#=_?&HFNxH=zg7R&AdzED~}WFce$c^gh&xb_{2Z)#{%VKWBdxd^7RouZ8Yf$5hmAZC36#u#~iW z2t7*xMmCQ&OVtBaGl@2BKxzk&sS0)XOH( z&m7ZbN6dN>H)EjbnvqG)RevgoNxYx09Mp=$bB@&v>5Df!HFpiXvNX~d*Blzs)^4D` zSQ5~gSaHD4Ptv&=1@9wyVEg6iVM_pBExN-@DxoM3~3a7Q5E z_O5Buw7HK)mLdB;XJedrWR6TaFk!|IQBvxSFfFC{GzP;s1XKD`eGo+gG?jfM)GV-(PE2c~NNz5v!Ph~xK%ADw4`!8y(krF)Tg zNuL8!Jd<(k#a_L0lTOY~I{FH3PvMTDfO-+fHAD`{7+wha(&XTJ8bWX}p42HPC4oMa z4G!)zj8m1i_2=tNDxmSx`O&-O9Vs%ACgHdb)Yqu|5sKzLO8V|JmEnRs$kDD!4n|L~ z&o$+_#yKDg_1}a3A%6{7%+{?Lo^Vz~kaY*&wRxF^{;eeycF(uq_{HZmWjR?!@9=g< z)1DKK)5X3Xyt0*qiE|hu1CT)AkH?DftGgLIJ*`|>+%6g>Dnajq#djKSiI-2*Y;I8! zH!rei;W!6_gO1-`lzdXsqP^Gj?M6u=w70)gxq|V$C?_QM=N#AP_-5$VaF@d`%^%X3 z*xDY`vB>F>+GsCS{{S}b zD_&HY&ndc)eToY!EQIH42K3D~cl*t|abwhdYRt|7Kl zkb`@DPeJ*AI_swwH_Cj*HoP$O~kYt}e}lLSKgPM|Lz!rMbTf%kn!e9F#cDkONw-(Kqr1cz+Vk&Jb_Hv(8g{GGA zB4-=3j`e!m;hXqU6KJtqv4CEY)bgu8>o}czTRy995tRN{qL zvT}t^GoP(@cDj@|z9iEjw${d(EuFM5EycFw0hTeimkY)lBX>LsF)6jC)@LqG)N3p6 z%^PgB*Skyn_Ud{!j4k{Zt&=bOPA~Tl`1rWIw~%hb9u+z3kJh|k-N6o_1j`M&#bqL} z^4Da92ID>0^X_ZC@i)aiT1g>~T)DIHWtF$d9Fg3qNbRS*;;^ zd)9S0Q~SIgpe{HS=iq5nryg0SXXkbLKfwB&?-fR^s#Ba*NNVn_C)I1JdaX5mv^`?O z#9DRLq!PWdK{5BFe zc{wM0o)&w=RdcEo=~Skp%I|dd)9@I)u03ccZ%zm}9MOdXul1&b&rJO*(MQCVA(BFd zJ-|kKf+>p|w3|?HPBJMX%9SNfK9$h;HpBZ%Uxqz|qJHp<^#Zb~B~C6+q3GbS&lz5x z9y`gU_njnu60p*=s8aS8xSD0%BO_p`JqA4nYme2uI&C+}18#&I;PnE%FI<9K$>A&e zm=$v)cF&-$ds2=g8{lpLV?C?L!`Gee-R^#`o#c2`MboEEML}6RS-m^;`Sm>ExI0@Q z^~bF+Ww3izjr<_VjAK0s;B_@c01r%8d+_7n=Bx1r7Q7CY z8cIKw*K&-OZs8ZX{6MY^RJ$sGShpN^HTR!_JTV4=;SCzgXhgHNP3lJl$OVb~Nv{t$ z$IAmsKF{Kj_Pi&N(ate5mL~3;61rMly_NfD_B^{v{g=EuV4LsmZ*>+i7XUbk3CJ7) z&wpB{sC)+Sv{T0b)9zwtByUTGZM=FK_iM&jOi7+X;PcqlRm4do%Oh|`So2>Hvpig- z%_@)YKX0XwWi;c;u+X=hQ-6EAK3wtd!%Hs%*~fFIT}yLqJibh+E;mHmNgtjY@~<>$ zHv&N?KDG5v#tTbWyd~l}=T#wNLkVT%O4!HpAFX_?6k<3P$;obu>0fb`VkL>8%{O+R z{1fr6FUzRq*x17ilwl~|%ci#ccOaaGJRDQ>`?j>W1hMj)<&X|?DULWf>+4XwYyrq1 zdiqzpYpXN!-e(E(M{|Eq(*^b7MLU52%#ul-3aIV%GKJ1g%e3R7d?IMnQpbNBMVD3@Yti`M9c1v|(4EGPG zIWBGYksCK=+tWVytSBySw-B<0`ighkZyrL1VhH1&wZ!7?da7y0$4B8a;tfksQE7QR zcW9d3$!+i%`g+H>t>}#&MSYI~n%}bgjk+CkGV0K@QDd3WG#wsZW&CK5@12v0#th|h4gq2?AoMPp$s#c8^?;BI!!E8y9fIr!f%8YuRbg}hY_jEVq@rBfxD}WDdW~z@7UWWew zSV!T~vO<76=h~E#SA)qFYMd8Co#LxY?J`@7hr6AnbMraLJt>(0V1a}AQ&%7p$)yA7 z&wN&gJ8iqM$_VL<`qFM3V3KJ!XFUE?py#g!fE+(FNsdPu813GWXD1jV=}N1Ej(w;B zz~hd_fJr^L?rAc1;~)KcdLl?LTMg6`K}%8509YL39dlh5g>?smP-7XwkSEhKG zF7;oAamjc0?QX`xc*r3C0H4CV&RtW(b6Hy3#cB3^O4Zek!39i;Pkws+c){ZsuWr-f zx7U6T-^u5*Y-N$r5R=D6KhC}f8u=$qrz>9fU+by;Nte}@BMUk;Dn@N-bpHT9JDw*5 zQrtKwfalkb$ke9Rbyfo`2*Jm-Xsl^6d1~7euLFQ;)GhXLwOAAjf~U{@W;#%XW0684tr7?PP^^Z8bd^2akBszwPTfI+OQ`xKF1%K&~n8ta3M zt#iS}(Zo=U{hY3>X1u}IxjnLK7jc{pGw+(5MY|c}x7MSX262<B95Y8C|WSw`ZYPc+*PoNK9L#(vQ67p*=cPjbrwZY2iTxO9=~rBON}K z;B(!{aQT)($F)H0Na{%(@mPOk;pZ-Ts_gEo$9alg&kCamEtQk8>^9%D9=98vw=yDw z(>+C3zxd&QeJS&0X54w^yqG>Zeq_=Pap~MwLd$Te-9a8#`r(~g-rfEOx?1bnUyLkO zZXHF?zz)ZpRu-Y**0aTlibeO41Y!*K#sF|bjrwwB!9PtEr-E=9qap^-BrZMQx6_NeZ4Ssze{ z+S%Lr5eVb*-XKJ!Km@l;8`n$E7@s`5N>r;>I-%A|kH`&Skw4sdp7*KqzO7<^qRN}6pn@2-olTWRQe z2Bj%6?d})X8TZ9=cd@B}p2PL6y$soSn^b#KadjFZZ`o^Y=1BbV0OK5b*H?S+{?q#+ z^_t&M(`O5tXzpf+J78q91B`tIcs|+~c_`0De#?r3&0#6fYD-&dqyD_?cpdS@!xrP% z_N=yHl5zm)TRO&@HH?z0ksut5AJ(zH@CQ6s)YECk=>BxY!f>kLHD+%7KhtB?ymO*j zO2H$R?mfpD7~Bng&0~0)g{sFB?(+!aI5^Kg%DxQn_N4k2yJ4tCH?_3sF5c$^99P#C znvS2U+G+adhNhNCn26-JM=Vu{$qc;nUmwI2r8(1=OFv8h0Kq?C@cN}MVP1{>{$&1E z{T=@Eq@P(`LjM3#*nf8nqA-4)YL(ui7U>`d=O7GMFuLuBhqT>#N$$jJ42)%5<-;BT z1Kihuc%$MLui_VY+TutpakY^S3y=1Xf2U7s@^G1K@iKh6MRoZfb)09|OqL7Ud((SG ze!Z9VW6^##d_vN%5^W;dbie)hdAx&_`BQ3*-3}P%jP$PvmBRtY$OZzQ!_u7YtM$)A zP`rR}dY-lScuXWPl+`$De?Dh9#cbaY>()thNpxPlf6Pf3HVHoT#=yW|(~1j%bDrJm z_LZPs>kbTPV~f1c_i^p(_*ZLc3i4-#MvYud)jBb9ljw-v^5X8o8zy37fH#&8@TohS z^%<;JP|R_hbrtG*c9(0QTQ`(E$=K~_Uy?_BdJk{sUVpD?zhJ$Pr~0O1Mn8o5R#Ym+ za&d~XJxtpxt%RjcrD^j^X1C=_NUQbJ?$X9$gMt^W6m8^Wf<5T2)8&mlvTw?tm)Fvo zySMU5C$FtGDZJ1yNPWFKA8MAxm(AS$GlS1c$78Iwa}xcLN=cE7vS*>J;es*1KDB>P zSlbN%0ddX`TA-1fXQG->*l%-Q${SfUyN%4k=s4Mf#yjS!5#?tsk!- zy(u>d6D-{KrEN_cRuedUDB`Wy$(^d)56ZLmeCIsYrkxPE8(alJ{8;E}XQDbV>B?y% z7hTmn`5GA6wkHL%*0K0y_NgxvM|C3SKQS4o!NKE?$E|h6D61pGtx{DgIY>J6=8j3n zJkitv+dVr`kVy6P?^IwSu>SxGd1335NI#3Pk{O93 zwHP_a8T6n9CnVr??kPasfdu*P`j zxXnnC7~3O}=xH=-8FxKr!dh*J*YRh?o5s=fy&42~ zzq85RwpI~H2{{cPO~8}$1D;P>^Zf@?^6Y%rSni1Y$)1CQ)9|WJ{%nlw#hH$BeSPc0 zcv#M_HBD04c0Wx1+nyf*3Rquuq_vc~yKS$n*QSTAczeWFy5*;v2gxx109y|kPw^i0 zcJ|;(`#J%^Ip^zMJ)~-K=-2CYZ_6p=Pe)$rYt*c7qt&fN+)eUH$mb+`AI7}=MjP16 znQVTIkZ0f8v>h7SRgV5^zxn?F!6a;v{pABAJX8{SY_E(q0s4I^cLXL61apu-N~<9Q zaNUE9=e=PQ=qogqrd9MS3h!3hxgf53R%=Lb4?rtk?TbR{8-fo(?O6Br(^*I%opv!r zlY{&uWPXHKp-){I`Oaq_XE!Qp(fvwVi?7(O19AJZe;jnKMS6lVdE&b1ppN1eiGjfw zBpe^}(z!zmB&7%hf>e=Sl^Z0{`SxU_a-9d?1c2iux8jXvW*yKHH&VL4ZoOYR5M6SR+fR|{)&*3*VVf;)=! zG}JCNUkZ{yxq>hbK*>+=AEkLUq3mX*9iHdk<+z2JVI_yE-?XNijIDQW&iy?49B{w4 zXdMbXN%xioJJUU}la>19)oWm_biP`gbAIWN7Cj@$Qt=)S}`!Q>X@JDb42>dGq zO=^Y{)32vmmfkZXmguX;G{uX|ZaQ@}v!dBWCZ}x^kKLCA zfjx&b=Pp#)o*IO!)r~dPrT3fO5b$bhTBVd4jB{MQ!TBuhj@bz8S+I7G!=-zm_-Uou z>61kkkTm&r;whoj8c&~cPp>K-Tf z!{N(YNoTjbS&ER#n-~$Egz;Y=kCrZ_XvUg$^1Z*y?>~0PDP>qJJE_eS_0_e_Wp%51 z>ucFrc^O_4()>Z;KQ`jSR)#A;OU!~Gci>~I4wb|B+v1(aiFG@;qOe>0L^v#);j><8}QR&{ed%qT5-P(vE31@HKCZhm+&UVxsw>+XQ$GjyStw9Q#8{wvK}`v&3o~uIJ;?M^4i#} zEm-r~PH)jKJ(0a_Xl(v@(UJP7VT^ute@F2~q2c@VyVGwavYlHYqGCFF`qwA@rE;Ta zxSMJ1<{VUz-m>IM3z6JXl^%4|^(LMi+@Cn(e`*)@TuG=3mc3g?sSQDIzvm~3DTpzwNaqIqh zu9xBW!;MGA^W0ArtgolpubFW1kC=hURnL3_^c63SG^USL)MdD~7B>*Nh})pRh%d?) z9CQE*;&_T~ud+{7zmfDSEyS!E#!XrhdU@M-^4rf|$0@jz#(tFbX22V|`qVMD7y@`b z4r)+1>yg&CXPXi1&G$(p^r2gkgMv66sjS014ti2@ah^HkW12;iTOpbDsL43MtC!b} zq(ZTbZpR>w{pu?#p=&poNE=RmVUbwc&Y;?*^UTZ$&lngVl}d}0wb1NAhWJ8%bMKnt{FW3R8RE_eik_);mr$4qq;r?2UX06HF=e>w*zzt)c2 z=bm~}4qG7P&{7;nOrG@Y9P`H%gQq;>)`dAFj+mfe80|f?N~2)o7^d<^Jc?BWW1c!@ zfE*4GZC4DAmaU zzXmn2q3ds?O4j!Z9@b7B7-UyHRPA`~dbl~qnL?|yUtZ7riHRKkb=CYozHRqbtjB4? zr#u6kAL;p38N4=^pi8Grt{4^(xyDDa{)V;mZ7KA75X1v;PUgq2r{F8iuTm4HRT8-mF6mKZhnzG#uZ(mck*Vxhi9{k#5#PJ@g>ENp1yQ)50s%JIsEID)e(QRZniKe zBxMBmP;e^k!{HdVasL3+|}w#RQMEdpD{KYxRU0o&ytk@{B9k1U-2Rz7Dj ztg1y)c1b(k>Eu!k1Q7Yx59M2cao6V{XJVXnKc;ePoU?#k-YO!E#kgG6txH|G)M02P zymMrXOcsNMUq-;=IPcWf=YhN^_m@%5#{iu3(;QcOm$0ViGvujJmTQcshQq7I`|SMs zy*nPa@W;Vc66wEcxe8SWP&$8&WPDQb6_vCST3VIzV;DH&Ca(C4U%1e8p=$`(fiaLs z{Bd3h;?EFIs9Z>|AtNUvHQ?Z|wJ}xQdA&Lxsc|N6Lm|L@N`m*Av59|hZtfmV22U8O zndo!S3{sZt1vQ9XgE{o{ueD0b$MbBYWBcA;M??5MRantpt9I@%sfyFx<GiG83CKpR8f2=m=N^@XWSkl4WwjkVR4naxZ8Y4o zb7OONs5D6q=}9>XFaYj-tD*1?iubzz0NGYnhJP){ApZaojDcMyqaCyYI4vUBWE-9H zlE>DubZOs6@nxjTkaz7rLI~!(saBO*Qc+gZL-Z)+6!P4C7gk)}`sVDe*In+ft1~q% za_-~Jx4l)7m5T1h2q5&VWf=tUYoqb?l3VN2Papb=$kOROw+xZ^9E#?M$;jaK=DMiz zxG6H1ZeW-!UTa7XD-#HV0AbJz-g1G29fZaJ!Y zm_qSMqTQ{;v)w*GkZvqN_U5^*QuFG#LNXIvs@}nNd)}l~zXzZhjR3Rk#n%aiH_B_WI z%-*2%u6pA3TgELTmOh#3Q4_nCInO<5jq>#Qv-(!BrlGOJUlmfj_nw`D7(Dl;p2TOa zDnfY~Kb0r*J?le|M;nR#Fes&9NFDR(%@hIe9su~`Vern;lTL>% zHP85u#n&GZbzALoQMZB#ZphypD}~`e&(!0S+~&O2C+4YV#d>P?)cG0m^EVxZBLg_c*QGpssgOGQjMEh52q*OBo=NiX4(xW$Xap+$ z_BDQc6 zXBZg%l(^%b2fZB^rbpJcJn;rMVx7)gq3z8fKbxjgQaWd^TvA|U_RR+aBd@gq zfgpe}KnC8Q;Yvn06k~(yk6HoaJ%>~s9J@L%}y7Qj& zFQ-5$7=U^ndzt`I@{{Y+)~v@cas;O%^QzrFJ-DSg&OaJfxYKCq{5`F%l`Nd#lQ4{F)aJVh>rBch_ba~0goGE@VTx6?J};xOLR z-j3(nWSRTG{^F{}SL|?j~ckWNUQr2%C!%VrI9G6jmanO0bOO!VOB=_dgQFW)-n6 zQN5zx-8_U-gOk@iI@hUqBJr;xNFrk#%Du&K+7;cEw5qLT_Ssu1OE6UfrvnGqsjpYl zJTA9QYk8&H-B`$1Y|Ar;Lym=81N9Z>)YYhTLd z503R4xS?@!Ng!h+*Na@rWu2IkNj#eMUy7H%W=4UZbDxy+>0VCc9PwS5bZtdDA3Mg? z-AvL{`LD_~NC5HlrtZS?`O|?5$G_q!Hj++z*Q$PeE^*p`z-NL!l!W1MNTl2|*C2aP z0>M3^fkw|#w1W*IBoOA?Yw0u6s zJyId>jw?BRNgs%cam39v61i9))$N2&agiUN8d#Rkfkz z-$N*DWtG7nQAW0rNidcZm61aO(x~2CtoCq><>UEtp4H<*J2ZZsjl{dvqfy??H2pu# z8lE$Oj*D)`ahFcIlF^TUExvgF0Gn4FgQgknua5tU|(YV(}rR?as}^C4H+)QqirHTj=H>K+!GUifu?rd!OuVabh~ zfN(LBQHaC6(eCIb#Rpa8(B+BL{QNRX_86cX1K%`c0s-mkKsY%A{3ro>W1JqNG~5pP$)Mr5$P}R9=kmn>Cw@5{ zIPX?afT+CmKb~r@Q-j{GZNiKkanh4Cf+4(Ms-ui|{{RZ5_jBLa)yZLIjn2?Q9!_!p z0PCuFJBTM9fYnE1Dwn<3F5j*?QufKD7&-2HQJnGVRAvAGIiro-9DgcIV4qA<EHrA=m7v9cnSf)Ab0nq8OZ1BPA!v-r>y`fBp*}TigbHRF8q`SkUHX{$UP5AdY_yU zGCTXwH0;k@@O`9rx?oKr8Ls@b^Cbw3%$}s01ySAM!Oi!5HP^>AlC1}KaAF2 z479l+x6y^jy8i%=nf&6fpW(pif$7KB(>m(mbx*X+%)4&)vD!HKvz%ATw^d>#%^O8M z9rr(V!PTRQ%VS0pPEIW}m6E!$-|_Q2v>rL*+K`;7806EXMuJz3j$KIy9-^9wxN<~eULj{^Z>7#zE@QpA z#!x~|)Z>$r+*N5cyW3gWJkzv_^09bm<7~SheUWDJ;nhEB?{oA`X>UIMUwL20nv>t_ z4$?Vdr?KL>b|jp1&#h_d5zTcmlNn>ys{a6I+yr7`ZMpQ~y^2Xf3Mc27>Xk8Anw8~u z%-bt&7zA^J--;U{a6l%LXD1`23{Kv>_N|XJ8;`C!ia@(D=x8Gu9P>-nhB+Ov-hd2} zGmPi3rnWm^(w?OEG>i(2cKT2N7rz7XqjAR_GeHM#2+8S@Mo)2*Kn}>{`kJ+-zT1S) zui;ey$vuvG`c;cZK6*F4DLspWw39s!R#|lGW?qQ9Soh6jy8_&F9+ZiD8HJ(cSb*P+ zLXE-6uQD;^KF<+|Re4(MzYPrw3&W;rb~oxb`7#1jcO3})t1|r*OFKc4XeA{BbpW0- zQf~oqpO&oI!wlBfrbD@eVOB6kNhhfKRcRN@W$#yqu}@83&f5Lsj~!jy9U!J*fd85D3S$1%awD6b{@T`J*FY=buVw z&V7D{oTP3))_}MY0Oun;c+My*w44A>y&RA@qz#<+IikY20z-_PM?N)50^3Fl`=ey)rs%yC?qydIHU|)>JKz-89&N^9gJt(B_r77zaO2w1;Wux2-PR0oZml0J-Uf z&(p0pj^MHPp@GOf59>>n4V(R1F??XxCW30 zZb>=z6cP@7I(=v$f-p1m=|M@0f=>sULNU;1icoRD7(Ub{aqUMyaz7t> zGuQgi0V03^c_kZZpM*Nu0 z;C+w(0A9T22^tm*y}fI(@Wh{LxRrNfbVuo&*A5~Jm9y$Hd{pCFFi%~Kdx^Z;i5%nS zV&9plPC@6N^Tj(Ivz!7crGl}+$y@?#r5NzE#NiN8y~*H&O#N|nE_^oAv}mJmCp>?iwdB4XzlOoQ z$xkcO-nDhFi}#b-3p;hhYx!f^yqr}U^{ORHOCO_f{%4hCm^zZjYbj`zuKxhw94@M^Be2{T3U#8@}8iQkdq)5D0a0Po$Qp@O~lH};El@i zLBLBlC8WHd)5Yv)Wo2rmXeJO?R+>^cAyJYFX=rx#^ZR%I_3pjiXYKWV-|zaYdar*y zNh-~3*i+#lv`>iFC7b_Tck|7m9+$};^R@HqO8ad3HF0B)pIsl(1;tTMrUcyXdA-rq z8}7M10eSX^fWV8s?H}x&%{TXL`>VoZwD0RR=YB@o?Wm#tA^JIa^sY=BWu?0@R{hB4 zKgRv2?ofV9E^lsgZ;Xjb5YUJJO8Th{RtfYy6Y>zIkt9wxbB9c4-0^^-MVM|@ zK3(uF+;#fxAYHZm#plD9M{s+OA79y2`uu6x3|aka|D`u)hQpWcVz5~cUkbvP)kjMI zZ9naK{{EW>2M^YKc{|R#2~D>W7C7P+DVeFmkm5G>W}LRY<%l5Y%supIvDa=NB!@{s ztba!sC$QgM?)tNO{hOI;UP%`YV9D7^m2a;sZsX&}=S#Mk>vwNGe7fG(ar`j(>HkE0=^nm2m{lkwP@0O4gb36 zk(4ldg_fGdVG<1rLe>i)}A*w z=+~=x%WTtdl6>B|uF&Q8-D>>`G5mnnN&xJ`zgRn5v+sv?M3|Zd5W29gFwzm zjsHUf$>dmaT_(CMIn2thY@mYZs)&76cKp3SN6kox&{J?p+);EhFfj`q;SOk~n3Qf9 z0Ske)e#~1E3=4D&;L83SDZrZ*gybj3kep=T6HA%R;C{jx#N|hHsD8{ggDTJF$x^{h zc;MguX}R&li+b5qt;XC1cv$)IZII$i;CzAiz3U&d6g1wJt>Tj>kt+}00OcRw1+HYe^H{wQ<`Rr-+;+Ew?fZ2O$-=heKm z8q#=3#XkcDxUS^n|9(HQ=Ek{gjPQt^TLpp3LQ}VLiZh-!dD!mn=)icqy_gE(ZvBWb zTo|7p>+;~*O(o>@CXGGvfNNdj z?!}W`xK`xee2D}7pSL_slE)~&8FY4SN_21&B_0sJt4Ey{+LJ7a?!rPgLb~Sv0-AEbQy;`Q^@&NBu>9H;EdOeCOHXfS4 zdcEht1(YoJ#tNQyy^Ln!vv`iH7l})^{eD02(YCA3%YQH0m~t@wX0y(vKYu~4mp6sug{J(489-KP8-pQwJ;$W~N^M>QI9Ty@N1-S+qYac!fxKHnY z+PLOWNOP&y+WP!nwttxufNdDpmLI*k-dgVWb`v8;(j&E@2y@sxBUAq%~{h zkgi}cQDd%)a9MmTOs6Vq_1u5K(+oI%D5=CW^jkp(_#^G7eBu=GOa#>9E;Y8t$YT*5 z?A_B*3YR#l4xA_D1pq?7&V}^rj$l>pS6~N|TAjAOg{ewOTosu!0jo<6UzbYxR)cwU z%Hs~H4sf)0lb7GIm#yIC(c^|HB7~vhfjpL+^9#T(4bX4K*>E@^jFQ2I4|&eg-5<_X zT955pW~U8*Rq&>p9#33u7<6gvP9>tctPgvHm5_AEeW0=nFi6&{k|;i2p(>x|zcxm3 z#Tll40IOm3pc)?J?@ja1X843vJ*$$F!Q;eQB2rsL-Ee|E%Zg-+%XxOloUjxKLxN1(lLW+ z@q)I_V;>%$pDx-Tan{|*5imv%XR}3VOgO>58jr!tvy}|D2Wuk1Lu=2+3P!?eyvzC*Q{!4R_1VyJ07JW9Ngy-*t9>UdE4Eb?%w46*R^_ZYCp#N}NjVVU1Zt z8s4ZXdjz9~EMZUJZ!EU?oO2|E!}Nt6tqr0%vdq#XsHkk5d4?986PTDd<8o3nHcbj` z?LmSfem_t`@pJu+?QDKXY;!sa z-WIrokWmNej>P>0maWswF*tA(GYY)EutT!?eO+|8&rB)iF1q<|e>;r%3JK9U?ga@j z^0U?afK!%_1-=}(irevRrUvxtS7mL=BWJ~AiS}1^?hr@qtU zXuEBmv&bCyAwWQdqV7Qj@yVbCVoV7w*KzY_rzu;Gpt_(X;&Ax1sTS9ZX`GfoZe@l` z>a-cP@;E?iAfh<zBkXzlpW1Y0b+YiAT()}ktAS`2zBW4Y9+f1 zSl$cr&nMuxPI*QRAWAISBTen?rpFQikFp*DlQN_Ku1bXPuNKfWSxLNnB4CnZ*+N^p z{@@92FWw|sjN~~0!RZS0LsfkbLO;kQ?S;8oS8U?tTO5F`-JxSII*~fGDQ}+{-BGdo zh&!~+{nYL-?&blf6**kY|gAL*zTbI4hM9Zbvu zBi-9$u&CDB;m5=S?dc|Y2#dI=G|K(OJ>K+ph9g^U1Lt3cQ(-LjfMy9j1(7(04h8!l zIcKF#J0=HFUW?8kO5w3oUDyG0&AX}Tsc9lYP77aVy&QG_c)!;dIRp&E7}}J?r_%-? zIZr=d_&A<xze`4O9|LYHhxvpmkq=4!eo_LP>SZvdk&*J(zH+ zEyN&-fs_^ay{ZIZ+JjPRrp9SlH&Q{zBR=N)5-eJ!nhb_uIZGspdAQcT$K+xMSf(j& zG&zZklDiFKb4qfYFcfV9)B~F7&2O5aUq-|<+$Tbcf3Wl0f*n$k4xx`yqkLzgPKmYaUNXrLNs%?`X;5+GXA1+#9vZFyAOyeG zwqIO|x#9rsMgW)Qo9n&77uSO>$HbWfOF07|1Ge0fr+SwWPTid^CVi9U_63-06U^LC z%)E}d`;Mk#8u3F8Huuz{<|i*7H3Qn$N&0A`tj%j2>})I!f0dICOtl_KcIVG$#qFEx zo85BuMXsWj^2@?_JVGQAbC{3XW21+EBty2NrUlfvPD^@S)O-ScoJoJ@7C~H;M>bIH z4gt*DoR=2$;E!ZW3@AAYy2}uFqk$g&WL8C1{vewqwpu7oPOyR8>j7fcPcOK%RsI+? z5Fv9TZT0f3nDz_~Hfg+_4nD!5TF2Owd%(Vhq@v#%egXtN+4A36rIqccC;#P^!UAT*)%5PRo$2B4UV>-4|IF{X-3{8JI`1I`#cti7=#K1J=zL zwDbp9`|i+y#R^l=C!;mD$yD40&5yVoy1i#pLAgM!#pD{$HWmyrJD}DkyR|e%wagrfV7gxm)n85cubaP?* zdun@^Is93{?}jp7QXP|BCN8{#ZQ}d{o>&-s6Hu)OX%uuowx`CNAia`YxDwoG pzunam7ky&OHi5rWzCVZg|DjUX%&EX-{U%O@z2CTKqzL%==6?kie`){# literal 0 HcmV?d00001 diff --git a/hangar/static/black.css b/hangar/static/black.css new file mode 100644 index 0000000..595deb5 --- /dev/null +++ b/hangar/static/black.css @@ -0,0 +1,110 @@ +body { + background: black; + color: green; +} + +img { + border: none; + + margin: 0; + padding: 0; +} + +.banner { + /*opacity: 0.05;*/ +} + +a { + text-decoration: none; +} + +.headertext { + background-color: #AAAAAA; + color: #404040; + width: 550px; +} + +.dirup { + background-color: #DEDEDE; + width: 550px; + text-align: left; +} + +.dirup a { + text-decoration: none; + color: #104E8B; +} + +.content { + background-color: #E8E8E8; + width: 550px; + text-align: left; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.content a { + text-decoration: none; + color: #404040; +} + +.content:nth-child(2n) { + background-color: #DEDEDE; +} + +.content:nth-child(2n) a { + text-decoration: none; + color: #404040; +} + +ul.breadcrumb { + list-style: none; + background-color: #AAAAAA; + color: #404040; + width: 550px; + margin: 0; + padding: 0; +} + +ul.breadcrumb li { + display: inline; +} + +ul.breadcrumb li+li:before { + padding: 8px; + color: black; + content: "/\00a0"; +} + +ul.breadcrumb li a { + color: green; +} + +b { + color: #F0F0F0; +} + +p { + font-size: small; + text-align: center; + color: #E8E8E8; +} + +h1.error { + background-color: #DEDEDE; + margin: 0; + display: inline-block; + width: 550px; + padding: 50px 0; + overflow: auto; +} + +.readme { + background-color: #AAAAAA; + color: #404040; + width: 550px; + margin: 0; + border: none; + border-bottom: 1px solid black; +} \ No newline at end of file diff --git a/hangar/static/directory.html.tmpl b/hangar/static/directory.html.tmpl new file mode 100644 index 0000000..adcfffa --- /dev/null +++ b/hangar/static/directory.html.tmpl @@ -0,0 +1,41 @@ + + + + + {{.SiteName}} + + + + + + +
+ {{if not .NoHeader}} + + {{end}} +
+ {{if .Readme}} +
~ README ~
+ {{end}} +
~ {{.SiteName}} ~
+ {{if and (gt (len .Path) 0) (not (eq (index .Path 0) "."))}} + + {{end}} + {{range .Entries}} + + {{end}} +
+ +
+

{{.SiteName}} {{.Attribution}}

+ + \ No newline at end of file diff --git a/hangar/static/images/CREDITS.md b/hangar/static/images/CREDITS.md new file mode 100644 index 0000000..c0b4267 --- /dev/null +++ b/hangar/static/images/CREDITS.md @@ -0,0 +1,3 @@ +# Icons provided by FAMFAMFAM.com + +[FAMFAMFAM Mini Icons](http://www.famfamfam.com/lab/icons/mini/) diff --git a/hangar/static/images/action_back.gif b/hangar/static/images/action_back.gif new file mode 100644 index 0000000000000000000000000000000000000000..46a8ffb19be7805f7e8530d3387a83cbd5b94b6e GIT binary patch literal 266 zcmV+l0rmbzNk%w1VGsZi0K^{vBu*9F^3zPHEwJI8M3pF4zBygOJjLm_v*MyFUmA+t zT6fV+bjw`4=Ba(uQH0u7JcA@;#6hFojE~@5aLY-~?89oxMcDAq)9%Spx-~R&AB@y< z-}Bgg&Sn4q|NsC0A^8LW0018VEC2ui01yBW000Gt;3tk=>5VAq2`o{j;wo@la1n00 z(#@m{mXfBC(b%Z3PSn09gb_E$51BE0S4GkR`84LrNL?j6b2neG9 QnlL4-tS>MsvM3<{JG1F*U;qFB literal 0 HcmV?d00001 diff --git a/hangar/static/images/action_forward.gif b/hangar/static/images/action_forward.gif new file mode 100644 index 0000000000000000000000000000000000000000..21da43758b585cf2bd006ffb4c2bc45dfbaa484b GIT binary patch literal 265 zcmV+k0rvh!Nk%w1VGsZi0K^{vBu*9H^VdwMEwJI8M3pFX%Up`xSy#R}#p$@S;-X!` zJS$%syymHd*;Z@GMtIRqJcA^o-HeamUC!*oW5hsm&r8|x(9`b8e%4Y^x-~R&AB@y< zZOcb}&Sn4q|NsC0A^8LW0018VEC2ui01yBW000Gs;3tk=>5VAq2`o{j;wl8RMY!oo zGm`2N@d!gd`da3>_I61p}BvBnt}(38Da* PFeR(2FEA>xC?NnlcTQ^v literal 0 HcmV?d00001 diff --git a/hangar/static/images/action_go.gif b/hangar/static/images/action_go.gif new file mode 100644 index 0000000000000000000000000000000000000000..82ae7ed821f7524c0356e40f79a0379fc634d535 GIT binary patch literal 268 zcmV+n0rUPxNk%w1VGsZi0K^{vM3g9B!ajxBR(;h{C|4L|#z9W1FZTQNam`88@5?V| z96pC8chOCN)>Mw(T#DRUiQ8Fv(@#mEENRI^ZOca`PZo5~OEz>Nz2>iuw1BeWp~dOA zBTNzi%BC{z2#%%nWDQ(& zkP#APQYdIRbsbb52orn(e?S)hq@3`_GZWxsgc6wuY_I|DqoH8bn30I(0O$fBih|XHm}oQ>h<5;KkIUzbx;v;t z-eyB#UUxVk0wQGwdTM=s4S{3}6%_kW_&~h=D$zc)p1Uitoe7-o4 z0*j7*!0$5#b{+s71PB6$hyn?KB!dKx36Tj1lnfe;gpdgy90(N%mW>OK1d^179hV*j e1QQ*70}Qeq2^ozAxDpZvyc)h4Z6?CQApkoP;(?_A literal 0 HcmV?d00001 diff --git a/hangar/static/images/action_refresh.gif b/hangar/static/images/action_refresh.gif new file mode 100644 index 0000000000000000000000000000000000000000..8268958a19e016741fffb8309b1174e548f5ce19 GIT binary patch literal 248 zcmV51h?dP)!|<#Vc>gJ1)O z9Y&Xm98YHe08|*^ABWwB!5P-ss)n>i+)! zK(N^>Xovs*|NsC0A^8LW0018VEC2ui01yBW000Gj;3tk=>51j2dR0+SrF5!arXUM~ zK$bC+orOTaAzUzr-^bI5bUK3v!O=)4nF^C3&}cBOg_CDsI3yU8pJ~ljPZ)`VVIU5# z7??o7S5kDY2>}iS4+8^De=7$87X%zb0EsIG77z~)000Ua8#Ep=9uzJWN+dIDG^wgI GApko)Zf!&W literal 0 HcmV?d00001 diff --git a/hangar/static/images/action_save.gif b/hangar/static/images/action_save.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e6f7deccdf9874a143474823c636e00d4c9c175 GIT binary patch literal 279 zcmV+y0qFimNk%w1VGsZi0K@wAcS)na15;&QW1|>h%9aO<&*c|I+9C#o+(>{Qrly=qWKnKSowWg1o59-=EF= zm%Y@k)8(+z=X^4LX1&kj83}_9KiUk=MA_5zAYkvuppCSZt dW($d)85tL$1ho$j1_luk7#J5}Ccz>h06Up5bO`_e literal 0 HcmV?d00001 diff --git a/hangar/static/images/action_stop.gif b/hangar/static/images/action_stop.gif new file mode 100644 index 0000000000000000000000000000000000000000..c941c19028c479d4a27a7ee04d6e0e66b6bce599 GIT binary patch literal 258 zcmZ?wbhEHb6krfwI3myRx}@ZPMa9G9sPtC-3SYNk)IzaCG{5wQd4hOTmQRpBi`QrZFzZjOw5(w z;B+Ua|6ri_lZBCiL7qW}0SG{LGO*S^P_K*2tV;HB^Xpa+Tva9QCeXgnd6P%76fc9p zOamsHcy;@YDln|Vuw<0nl$s8=rCxw48uw_56lMa6}$ zEFa1XibC1A+uFH>WUA~WrMhG$PUPgWRp}FBoy96PRn(YYfNQZp@O&*5b=4JX)+#bs F0{{l~XioqD literal 0 HcmV?d00001 diff --git a/hangar/static/images/application_dreamweaver.gif b/hangar/static/images/application_dreamweaver.gif new file mode 100644 index 0000000000000000000000000000000000000000..15fe1071ee8442a5de1a0213b312e9536af8b5f4 GIT binary patch literal 197 zcmZ?wbhEHb6krfw*v!w+f6MQ~j~7cHTbzEeHe-UdYr1;HY5g^ioNs+NzVvqf)@RAd zTV&TivoUs){SO9;KUo+V82A}<7=Qp|1_Mjchm$W?&7NU($n)$aHwI3I0`YAVxejZj zPPB`@wCl_Rg$5ZR&N<$K4k|UPrJWTlL|7Z#QcDtK1UeX%5+c4VV_;5@*5DV5Te&zv wszAJRdxTf=ZsCu`R$KF?3uY7>*CsZqm1yzis0DUNit!xYEWTPN{QUgwia6YNFZ-K6 z`uh62RU`lZ|NsC0A^8LW0018VEC2ui01yBW000Gp;3tk`IbxXTt)BT|UFXG%AgtWk z88Por48fw4dvyi|Lm|ds93ZhA46!K`CY^(%p@Kq3=yWuY+{E4L4j6t z*qb+CABkAnYaMNQVgNQ585%?%34(+%9RVA5B8`KDd5Mdaf|nVZMI#(B8l{SxB^;xW MsxG3cp(7yxJI{4<3jhEB literal 0 HcmV?d00001 diff --git a/hangar/static/images/application_flash.gif b/hangar/static/images/application_flash.gif new file mode 100644 index 0000000000000000000000000000000000000000..92abbcbe2822c3bd1a5ff512e8af925accbb23de GIT binary patch literal 198 zcmZ?wbhEHb6krfw*v!vxQdKoxMdeOZ)SqwPp62Jj-LmDDi_0b{sRmQa*Or#kY@N2t z$b4{dag$Z}4+e@qSr{1@_!)EVjSNR)cBCW&19!S=)!rzv?q)G9gBVV}0*Qo- wm=g)d8EOP}r!zJ$3|b+7qr8HRwYI*hQG~IwDz`&Ily_pDk%F<9f*^x60HS3}P5=M^ literal 0 HcmV?d00001 diff --git a/hangar/static/images/arrow_down.gif b/hangar/static/images/arrow_down.gif new file mode 100644 index 0000000000000000000000000000000000000000..f0bb6a4ea640d9b2beda344c7485d260f5761779 GIT binary patch literal 131 zcmZ?wbhEHb6krfw*v!o^>1^DDBbk%W#`m8Mo^~Z-=JluvXG6M=M%Jv0O73_44+acK zK=CIFBLf3BgAPaxWCjC^LBUDS)q5?HkM0ihoS_kK#PIl-D%-2j1P>Oa%ti-AnU~WT VI^xvQF6&qvTT*m#iwgsTH2{W9F7W^W literal 0 HcmV?d00001 diff --git a/hangar/static/images/arrow_left.gif b/hangar/static/images/arrow_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..932ade1601685c41edc2dd9bda214ef64a6c1283 GIT binary patch literal 131 zcmZ?wbhEHb6krfw*v!o^>1^DDBbk%W#`m8Mo^~Z-=JluvXG6M=M%Jv0O73_44+acK zK=CIFBLf3BgAPaxWCjC^LBUDS)q5>oFTFC&>rw8)8@*v1Dr+iMvL^E6%~Eh;Sd$?t WxAs8qPPGtZ@;%yDC2um%9*_%b^H literal 0 HcmV?d00001 diff --git a/hangar/static/images/arrow_right.gif b/hangar/static/images/arrow_right.gif new file mode 100644 index 0000000000000000000000000000000000000000..780431c2bb9277f136b819bc3f184cc5ac0916f4 GIT binary patch literal 130 zcmZ?wbhEHb6krfw*v!o^>1^DDBbk%W#`m8Mo^~Z-=JluvXG6M=M%Jv0O73_44+acK zK=CIFBLf3BgAPaxWCjC^e!)r4)q5?{mzsonZZAyOp_;)oL)=2bWn-5p2Sa1ShSFIw Ud!#sBtwr7EEh)h($ literal 0 HcmV?d00001 diff --git a/hangar/static/images/arrow_up.gif b/hangar/static/images/arrow_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8234178efaea626368f6bb5fffaa716e862b596 GIT binary patch literal 130 zcmZ?wbhEHb6krfw*v!o^>1^DDBbk%W#`m8Mo^~Z-=JluvXG6M=M%Jv0O73_44+acK zK=CIFBLf3BgAPaxWCjC^e!)r4)q5>o$4-6JJxOK08WYFNxvd2&rdbFb+@G{kG9(XN2vcvRcnXD z|LgMis?`2Gn*V3U|D@6XQDJ+s*#585nb^7Z)Y@A~KN^_sxesLS5b*4-&FLq0`S z;OOt3&;PI2|NsC0A^8LV00000EC2ui01yBW000G#;3tk`DH4)|U60}2Wpg&&7dih_=h8-^58ftLyknI8rj6c!c*s2r*b Y85)KLun-Ul2@?|=8yZz6ydoh0J4J7I4FCWD literal 0 HcmV?d00001 diff --git a/hangar/static/images/calendar.gif b/hangar/static/images/calendar.gif new file mode 100644 index 0000000000000000000000000000000000000000..f78788cbeaabbe793b93fc64b96733b3d4d4b737 GIT binary patch literal 268 zcmV+n0rUPxNk%w1VGsZi0K@p~o|e4RpTyXx%ibw5Lq0`SLDUcD@ArG5z3SYJ zh1zNA^#8ci?EnA&A^8LV00000EC2ui01yBW000Gv;3tk`DFR7SQBwqIhVe*^m;f1| z?|SwTwoYMqC>jqxQDxxiG@s5+@ACn&v01N`33ZV)B10NP54FswP S2mt{L3l|p_UM999ApkqC%W>-f literal 0 HcmV?d00001 diff --git a/hangar/static/images/comment.gif b/hangar/static/images/comment.gif new file mode 100644 index 0000000000000000000000000000000000000000..897cf2e3e4a796b2aec61150bbe562681032ec94 GIT binary patch literal 257 zcmV+c0sj6+Nk%w1VGsZi0K@i;{JA-wq19XtJM3X(fhR7{QUj?zTW*>aEVA- zaq{)~$mIU9*Zg68n}Mgoy4?N1-~E=n)1SoHx7z&T>h!PB;^y!7sLS1qvdgg2<7bDb zQ)PSX@%R7#|NsC0A^8LW0018VEC2ui01yBW000Gk;3tk`NqT6imY#)8QuaK8uz6#v zddG5Al>yG9@i2~oKqP`dR2B}@#K=f8ArwSoA@oQNNhJbnXb`xl$6|?~lnI1Fp^`ue zI%A4CUH||p9CjUKW^#Uifgc`s9gU3u1&xU!9u5uz2?-pM3OFY_o0BFd9HOH+rl*vi HA0Yrc_GEn{ literal 0 HcmV?d00001 diff --git a/hangar/static/images/comment_blue.gif b/hangar/static/images/comment_blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..897cf2e3e4a796b2aec61150bbe562681032ec94 GIT binary patch literal 257 zcmV+c0sj6+Nk%w1VGsZi0K@i;{JA-wq19XtJM3X(fhR7{QUj?zTW*>aEVA- zaq{)~$mIU9*Zg68n}Mgoy4?N1-~E=n)1SoHx7z&T>h!PB;^y!7sLS1qvdgg2<7bDb zQ)PSX@%R7#|NsC0A^8LW0018VEC2ui01yBW000Gk;3tk`NqT6imY#)8QuaK8uz6#v zddG5Al>yG9@i2~oKqP`dR2B}@#K=f8ArwSoA@oQNNhJbnXb`xl$6|?~lnI1Fp^`ue zI%A4CUH||p9CjUKW^#Uifgc`s9gU3u1&xU!9u5uz2?-pM3OFY_o0BFd9HOH+rl*vi HA0Yrc_GEn{ literal 0 HcmV?d00001 diff --git a/hangar/static/images/comment_delete.gif b/hangar/static/images/comment_delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..691b546b373f53eb25f43bfe9aabcb6b68db6382 GIT binary patch literal 267 zcmV+m0rdVyNk%w1VGsZi0K^{v`~3al>hzn<{B@YMU3Zn|6BDb{`=rtP|A>gR+5D`@ z+r{GkzTW*>aEbU@T1Z-Phpor*_4)qy_p#UfV}G8y-2K4c{kPiu^D;7fpu7Ia$n!}_ zQ)PSX@%R7#|NsC0A^8LW0018VEC2ui01yBW000Gu;3r9+Se~f36`tluUM!z{miRP9Q)CN-!)3!n3eg7>qy!C@D;3*UE)4i8N)4boi2(7|bz9#L8g1 z4TnRZ5zBNKVt0800s$N`107;*cn5@qhaVn^9hH>=2bGZ}9uyP=4GkQc4?#3CF{7I) RDIOfFtTeE(LZ%-f06WWFehdHr literal 0 HcmV?d00001 diff --git a/hangar/static/images/comment_new.gif b/hangar/static/images/comment_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..aa7e9d3ff9c1f7d9f25441d695583b094331c51f GIT binary patch literal 367 zcmZ?wbhEHb6krfwxT?jl@%o>#ncKGC`m^iK-%nqE#+FY#aQ|;qLFbFl|F+!x^X}XK z#^r|+Yi8GNGjG{r-G9X8)tCQ&{{EY`=knB(9v)GJla9Nmw=aMG`CsP&`w2%~r=9Y8 z_Wt|NUw;~QSact7sM>5i{j~SKdw*x2{qyM6m(^E(FS+=;XpL@gYW16s-~WRF17$$* zCkrD3gBF7h$QY2H7}$CorfRwRaQ2@_K9!K3AiwXXesnE1c(PY~HM-x_Lt&4-YFlyZR2105AUoJ3T!$)sLU>ICc2! JxxS*iEN$I#V?9xjA@}>Xoga7rz|MtxP@t*(f zd;jyT|Ma^5_}BT?cIUw`|L>9O(^dcLa{u(R|L~Uo`Rwb_Gym_4@6JNjmm=$!66@0} z+@UAy$58+O|NsC0A^8LW0018VEC2ui01yBW000Gk;3tk`NqT6imL3tk1c6!B=8c}C zdO&j^2-_#;K`hXMqF!%&D4OvVzcB@nzGuz*1wA`p)UAtKrY z5DfMEaX1hfA^>*~dVB{R1Ara?1PBmzdxwaM69ohYf^dfm3ltWC3JMX7njM@07bGH; c1UVEG0R|OGH2|Rz4Gk6-6?7=7z#bt0JG+y59smFU literal 0 HcmV?d00001 diff --git a/hangar/static/images/cut.gif b/hangar/static/images/cut.gif new file mode 100644 index 0000000000000000000000000000000000000000..ffd7f4f7d549c5b7fc110d5d23c4d0f6d7fcf11e GIT binary patch literal 271 zcmV+q0r37uNk%w1VGsZi0K^{vxx35x`TKT|t(3_68zWBd^!cXJ`%6`FS!#;q?Df&p z+h}^5yWIVVw%@ba{8V9ii&(9s;<)Hnx3@5;QgMVx2UVWSYCtQ=jWG6T{EV&;c06UMBb3gz9 literal 0 HcmV?d00001 diff --git a/hangar/static/images/date.gif b/hangar/static/images/date.gif new file mode 100644 index 0000000000000000000000000000000000000000..0cbdf001c1016495d4e04b318b640c27e3e7a3f8 GIT binary patch literal 280 zcmV+z0q6clNk%w1VGsZi0K@IL?DUMY%yq2S^!fi*ZH-A) zYwY#^?eX^H@&Bf_%E{pPQDJ*SOI(1){qXqzDKSGnMOFX!*82Saq{!UM%+Ybi{`SW} z`TYO({QrZ?{r~^}A^8LV00000EC2ui01yBW000G*;3ry}Xny1g1jHs7upqRFAO=n= z06dVpklW&L@JNnFq9Y-~Fg(y`R8wGnFa?g5)9E0-lS1%gU|hIe@FYAgpC8_be6c7f zM24&!@tDvD4R#_21zit(bPa$75h4PGd=n1~4T=Daj*xu|1D!n;juT#flnp%$pdSej e3DHaGVC|NsC0A^8LV00000EC2ui01yBW000G;;73tfMtvw+rc^h46K4d=QXH95 zq{Hxh1cG6PD=1QrK?mh%I%-C6yoXrhEI=??6E$5 z=Hkyk{~LB#6dwCmx6ORQQP--?##2vvOh4`2f5c_dargf}u5}-9n0Csm^ML)q+rN4? zp9xH?e)92uSZ;5{lnq5|bie)i|KZ2~H(&q1{rK(Xs~=x}{(t)B%gF~n{{R2aKrvAK z$pSV*2SkGW#K1Q9z?1?HpGdAFL0l|ex%1}xFM9A(Kz&l;%9a^*7ES`ooKBi>W;8QC zf}gjqVx5{&SCf;pOP$65YuX$H&zwCvk6Y*l1>{sj0WOx8A9!`S|#UhlkqQ z+N4rY<>lquMMK!Ow(9EY;NalY)6?$m?(EFV@YmOqlat@X!{2^=uRT29n3wVC>Ehzz z^Yioj`}_a@|NsC0A^8LW0018VEC2ui01yBW000G`peK&x_?;dTtwCVCMeLyw(%m>7 zRI?X#90X@b?6i13Ady44P;d!Rpd+bP0hi3T) z{fx8B?e_lc@%P5#{+7JczTW+x#MtZd`KZg@@$~uX@%QEJ_T}vJ$>jdX*&VSas~yg^7;;py<>?DypB^`Of0yusZ?Phqst@wnRk%(lwB+4#PXqs(h| z#n$nBqrjKF=TK>ku+rn?>iDqN{M=n&%gyA9z3)|Mh1J{Sve^9Y@bay~A%8#F-(EF0e`W7goT5Dh<<$}a}yB{3kO081a5wbBy>0xYZ46>phY|zmwr?}88H|& zG#VNZ3|V0zgA*RA8CXmjBMJ-*A6kPE1{e+wI|WS&O9EUVL4yw-H8oHvE?)uyRskR? zg9~FcGHhub2mn?vEg&X?2NW_Ia%yBKUM+SrMkj+&4K&nAaistXCpyY-sFGw*f(9cB zAjyLVL5Cw8?hs)yh(LoJF7^a~0msD?G-pKU8T7`00wrL2w3zWj3J^1KRt(y(oVX3~3$oA`k#OTBT)_ literal 0 HcmV?d00001 diff --git a/hangar/static/images/file_font_truetype.gif b/hangar/static/images/file_font_truetype.gif new file mode 100644 index 0000000000000000000000000000000000000000..0569425f16c26b77196b63912475492931ded6f5 GIT binary patch literal 648 zcmV;30(bpKNk%w1VGsZi0Oo%HM_h&L^7)phxTwqC@$~tasJQC!_vP*O=I!&6rMJi9 z{=nb;TY8?J&ig@RsPy;y^Y;1j_4rwCjFhIg-skVV-Tk%M{6Ax;uG8f`VW%lELrht5 zNmOZ0UU@x4RYFT${{H@{)BD2U{j%8ny4?J&)%&;F{FI}yqR{)s;{BV=`=rtP?e_k^ z-~E=#`^4e>xZ3@&(&KuMt59i-gj-2CkI{*R!sK}c78qrl?n@UqwY$>aUL-u-ly zv4g3@xZ3=dywjh=*pQ*I)!XEksJP?o_wMlWZ;r2*%>U@`^;Kzx=kNEg*ZhjT?~cLo zgR|qN(fjrI`SJAohZeV{p9QNyWRbLp}eiu`>)pfRcC~Bm$ml! z`-7{-d7ipbV}QBa{mA70jIzs&w9V}C_sh)D?eX_KVW7-v@oOaTT5phiy&mwquyJYaVz zFAFU_EKX1og98r*xB?Rs6>Kav5O9M+a$yQZ0t+WG2@^Zq z^y!15feJJq2F1}+1Bit;6DKBdL4nL5BvKxZC=p_X6%{V3Z1FIN0TBoW5Fl8SMh6!P iNA_qKBx8nzC3QM%;85lR4i6f#_z`5N>L3t-002AhWM#Gh literal 0 HcmV?d00001 diff --git a/hangar/static/images/flag_blue.gif b/hangar/static/images/flag_blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..a0924052ff2e5b6aae0246083bde1965362f9091 GIT binary patch literal 248 zcmV=H`lr$QM5FaMWtB#x^Lg(6TX*4^HD zTnM5l218=P>Eu2h24Vt%EHKbP@#vu_AdRfUfr(5{7DKi`emK0w( literal 0 HcmV?d00001 diff --git a/hangar/static/images/flag_orange.gif b/hangar/static/images/flag_orange.gif new file mode 100644 index 0000000000000000000000000000000000000000..0596070f24b9748044263c2fd09bdb55486f5925 GIT binary patch literal 244 zcmVE5s3uC>Eu410)cjD7#s^?;OI#p4$aDQLE%hKm`!%e^-=|qhL+qlo(>EHc~PEF uD}{^2^5{PT9CjxV5Cet-0Er!eR4Xcrf+i#$kVldyi*A>gIGZOdApkqXNp21R literal 0 HcmV?d00001 diff --git a/hangar/static/images/flag_red.gif b/hangar/static/images/flag_red.gif new file mode 100644 index 0000000000000000000000000000000000000000..16698e32ea43db2c9bdd46ba32b3aff2d4de5077 GIT binary patch literal 244 zcmViT~sp|^p}_Qva*{+G+;X%$qo+v>gxO8;NK%7`OeOZFCFPMHP{;) zv35mSHW~l_|NsC0A^8LW0018VEC2ui01yBW000GX;3tk`DSBwCs^&l@Ak0KEu2hP3FNAI0Z!GNwRnX01!y@=!sMX*KA^Yx*V{H1OmYzBM0a7n$hMM vxCF=IK%s0V6CHM30|kZ!0f_;EcPA?&8+3^S0~HG5`DX_vDxJ+k@-8M)>Nr>$W}p^Tho3 z==}80>(iM0?yURn!};l<_T#GS&3W#j2G&T01Gjrr=m|M$-S_r>eai|f&h z|Mt`N=CJ?&|NsC0A^8LW0018VEC2ui01yBW000Gc;3tk`X`ZI1s;KBOj21;}?R~F@ z?O6o?f}r4*+hH=uOdyaM;x+>wz(7SHCKTdttLQo$heQ?!7?>4}#)CkxIL00TXPI7G z3WWn4ut=-h1rib+a0Ur=fD#oI5QPZ~3kePv2OSU)7ll@v6P=!LHlZsmC?NnlqS<{& literal 0 HcmV?d00001 diff --git a/hangar/static/images/folder_delete.gif b/hangar/static/images/folder_delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..ce9f4483582f467986929f8e9f7692ae510b1953 GIT binary patch literal 261 zcmV+g0s8(&Nk%w1VGsZi0K^{v>&8+3^R)i>_Uq3v_vDxByhixywe#D9>$W}o^2Pl3 z==}80=MxkB?yUcai2Lrt`RSqd#{fNt}^Y;Y4+fa`Rcv!IXVCL(EiBC z|M$W6=CJ?&|NsC0A^8LW0018VEC2ui01yBW000Go;3o*5Se~euG2S+jDe5uIP52@e2kYT12sHuEG LtU@}kA0YrcmP3GR literal 0 HcmV?d00001 diff --git a/hangar/static/images/folder_images.gif b/hangar/static/images/folder_images.gif new file mode 100644 index 0000000000000000000000000000000000000000..81a7c3b41e732aa95a3f60b7d7f2ed079ab7c72c GIT binary patch literal 366 zcmZ?wbhEHb6krfwxT?bN?aAt@35(ueF8p+>_3!7SFFtetkIQ^=8XQZ@=`d-2Hl&%j+Y-uh$#>2LlFb1I3>#j0_Aa3_2i#L4IOj>vp)5 z;h{6B@5IIQojfci$|;{7uN32wdl9hei;KY&&u^Y0c6P1aN0~G&HZ685`NAP$^n>T| zTE!EsLX12Wii!&Dva(9Wt-Y?!EZt6uuF~wBGBdd+DJybtaY;{`!OYAyXWqi;GE145 s80ILjELzRHZv93U4h|M>Ha3QX%ZuAPI*%)zEbc#(8g%}GiX($H05G47SO5S3 literal 0 HcmV?d00001 diff --git a/hangar/static/images/folder_lock.gif b/hangar/static/images/folder_lock.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1bfa02055740da54e765f7fd83891c120f39766 GIT binary patch literal 271 zcmV+q0r37uNk%w1VGsZi0K^{v>(Z3##Z>7nb*dHnU!`|rluvmE)_cKPI#$;rymofZH0&j0tv;_2`I`NQkVVD;dP z!+#B!n3(_n|NsC0A^8LW0018VEC2ui01yBW000Gy;3tk`IeI8+k{;kXPAYp}>sk1v zDazmvG#k!xxiA<4K?Ya@5O54dVQQ!vf`M#6f#^ay;A<^FC?gh&M#n>;tjCWeTI~UM z+^9g}a7a%&7#$IJYaRs*a}yg89uJNa6)1-Z2@ntm5f2j@1rr>S1y)s=n*|b|Gbs@h V60N5+CLR?P9JRHuC8;SP06YDWe)|9b literal 0 HcmV?d00001 diff --git a/hangar/static/images/folder_new.gif b/hangar/static/images/folder_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..5f30cfa2ea68ba6483fdccd5a76c31cca74ec4bb GIT binary patch literal 360 zcmZ?wbhEHb6krfwxT?Pe5P&BoJCdA01Z zo^;&3Zku_-4vPs#U0?5Ud%ex}^(OPz#{!Gi=)PWO^yl50|6ssCC7}3|g^__lok0g= z9>`A&Y^?__pL8+d>_4$M)5J(^qU))pKScD5XLl}*d?Vy8*V%SCq{F3Y%YxenMHoLg zF>a94o6T@Bou8@I!!1sUy@ivLkEOv`iMy9wRh5mAk(skgO-Zz9!X#!64!-G1{1YZl u;o#vBm@dyUXE_fS7w;Mtets5CK|TRqUcoiBhZK(-ogQ~0B=oc+gEasNMuxZm literal 0 HcmV?d00001 diff --git a/hangar/static/images/folder_page.gif b/hangar/static/images/folder_page.gif new file mode 100644 index 0000000000000000000000000000000000000000..a8c53e2f7bb62d0e7a693fc9bed282952b75f39b GIT binary patch literal 260 zcmV+f0sH<(Nk%w1VGsZi0K^{v{Q30n){X11HOS=t_UE^Wv()wCll$|>bCj{~)O72_ zQ|r1!w%Yys_vrZT#J<_+T62`|_51qnujB3Y^5Lqj(c}L1((B4N`01qg=ANI#*udZY zQ)GdRzwrP6|NsC0A^8LW0018VEC2ui01yBW000Gn;P-iCS&FFWJyoR@NbIF*HQmwO zK{M(Fw!vVtiF69Q+0Rpn2#Jv>=b{XFG=L{#8<|!;g~&mnSeO?Afs)K_xE&6OLp@Re z?hT0qlQ9_PYZiKX7=8f(1auw>f`o<%2^5M82ZVhAkdc!IoNxpL6rqVqXJ~1sr%EQP Kt2C~zApkpAqlPU2 literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_accept.gif b/hangar/static/images/icon_accept.gif new file mode 100644 index 0000000000000000000000000000000000000000..35e949963e4b7a5f04fd1c8932a980901e3d4385 GIT binary patch literal 263 zcmV+i0r>t$Nk%w1VGsZi0K^{vcEd+Ya4xgmmXXkDk(iA6{P)e~xr@?RgUwTMzeLpS z#Wqhu{H$s5p4O4v<)^3=A2^0_EulhRp%QGjIf`R%Ru$RUj;1k~O1%3=|$g0$`b{ z1p`T8E1%cF0ssJ7eF+Hu(2Z{06R}5X@39! literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_airmail.gif b/hangar/static/images/icon_airmail.gif new file mode 100644 index 0000000000000000000000000000000000000000..2be845745a4de54475d1af9ce5be7616092288a4 GIT binary patch literal 256 zcmV+b0ssC-Nk%w1VGsZi0K^{vRcrC_^7;As$AR^{rvsz!Nr-t)+sSVK1Eg3Qd~2S|Lykv>b=2yqrms~_X**85#A z2yc%7@JQ#x3wIPM9ei|PfC~VF9s>vf00feg1ONyVgaeuk3dh4Pm>zWkn%ZmEi zLhH$e{NZEksW%eaO-&*_LR{r$P>%M90w^_V=66>%>{qLdv@v{BynEvv= z{NiT+_T&Hm|NsC0A^8LW0018VEC2ui01yBV000GZ;3tls=aDGsCCQnpN!Kmz>n$C} zbw-VPhTM+g8v%tJMxatG4RQqwV{$2ap1LR@vT67{kQ^f#kz@|FtC+EsJOmiD2;5ud_VyK6B8R585kM>kbET+6&DQ$4hWi?X(pbZCL$pKJ9H9v;Q#;t literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_attachment.gif b/hangar/static/images/icon_attachment.gif new file mode 100644 index 0000000000000000000000000000000000000000..4400e61e9812a3b2a070c89fc6fce7489c104e17 GIT binary patch literal 235 zcmV2pDT3T9FRaKv#pOKM~ii(Pbg@u8E zfup0NYHDg_Wo1xMP_whMjg5_AVPSrLes_0wb#--^n3$THnwFN9czAfWwzj3ErNqR< zy1Kf*zrX+g|NsC0A^8LW0018VEC2ui01yBW000GO;3tlvXOigXZG+*Zq}N*6@xoqb znI4ebG0x!uFliLP(gOidEF>NSGzO3?CY}mKoAfLwmw*StfQVBbM8hMADAwpi#4{n( llO+YgBPjIoB^U)J0SOP8;_ zxOKRqzV+X~fB(Ti@h1x-0|P&U4g(N?%wS-t`Ec^(s@XGk9riyPbXfPvA=8;VIGn9H z4mEn+wzBX@-C|k0L9Bhz#?Llc=G{#K3St~n4=de_FcM-oyt!$Hl2k7Pqr)|)LT=|~ zo&*J<&O_fi1SD>BW+z-&EY8MQP{7ED)n+W*$x>9r5wGCR$1*#8hLpUd HAcHjk1Ta;C literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_component.gif b/hangar/static/images/icon_component.gif new file mode 100644 index 0000000000000000000000000000000000000000..bde079f97b063a118f62161c1ac4d47e3b9a670f GIT binary patch literal 597 zcmZ?wbhEHb6krfwc;?UW=g*(lxs}DIo}Q0P_`hj;|J|PjYmEPOPI{G7Qgrmm^WRq% z-~00a|Nk##b#rfjsyYAe#*dw|PUPOt%>V!H-9<-l&sFF0ci;MP<=W31x4!;+f9w7C z$hBv#I{BQnbFVo1_}$O{ANnRg|8>=_fBo^de?M>E{r1P7|3^>!ynOY>yYE-uegFIB zUEJzpry~+C1;;%3efibzn{zJ|EWTXoy7<`odzD3p?$0|_wCH@vRtvkUZ@)h+D9hP> z{paTKVDsbuC*CglzjgEEOKC|*JOzDu=Gn~S7hTxuDd6NQC9f>a#KdpQ(B;V^;H%-H zYQ@RPYP5TuzND|6qox=uE2lRzLz}0bnS-{y#ddFR78dgxrUqPw4XlQD=y1K)|!}Ig=+S=OWFw?9lg(d_%T=|twUfwenb%tT`})Q}`%7>nSUo*-;MAsXb{ zc;a;dB3r^kq)dn&&P5UYBq|;V1rlLYI3MOm@L*!!u}{Exfi`uzRc?Dfmj z+J&jaZ=1rS(EFav`|I`oQeb(e%IulJ=0i(dk+jd5z}Aeg(J3)QK1Ef&-uLpu7M7|NsC0A^8LW0018VEC2ui01yBW000Gn;3tk`X`ZB~u57DrRYfgy2i$-G zsTJY>K!RfDp%5qWjk2BUuJa@k_ABIXRn0%Dk#R_+ z@}h3mIfegVp!k!8k%2*;L5BedKz1^)c05q;inE-z!hDU~EI!5np0(b54FM5fBmW6H zJh}dRMcBj$wd4ws(8i3$zy=46{kOReB?xdZwJtBrTAuOty6OoWu1^Ve}=N05C0^& P4&jw5E@>|6iVW5OAG%)& literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_favourites.gif b/hangar/static/images/icon_favourites.gif new file mode 100644 index 0000000000000000000000000000000000000000..785b938755932ab8a3757a3b56d4d5ab304f7903 GIT binary patch literal 243 zcmV}Nk%w1VGsZi0K^{v|L&Oo-Z%f`SO4pX>$6JhqbKXEI_tMq>&k)u^tu1? ztLvN>|Jx=1>3r+Xi0{sP|M}bh*%<%S0RQ1>|K@A|;Ya`HaqGiz>%3t7{ru~$K>zEf z|LJu9=Vkx@|NsC0A^8LW0018VEC2ui01yBW000GW;3tlmmyKxpd5)*5tcSR-7z5Bn zqh2q2IGxYtcsOQ&K|_H#5D2bVFKOur5($NY_ETB}l>o!C<>@HkK!j3Gc`zPvMAGKL t#TJQVQrOuJN^BE@eLM#q92#2%1rr+!J04FOJu4myn2|#~n>95d06RqQdEEd2 literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_get_world.gif b/hangar/static/images/icon_get_world.gif new file mode 100644 index 0000000000000000000000000000000000000000..f99a5383b23fc4270a45048cea54b7d84e4c632b GIT binary patch literal 189 zcmZ?wbhEHb6krfw*v!umwaLqI!OQM5F>k&+Z^fq|bvhXDvcW-zd1eeis_YHo#<8bh&USm7b|HfiTo^1C<- zB2&*9?YY;WqkfgAr7?@)##fnMrp5vd5e9?B>jf-W))_Q3ne(cwV{E9XUS-Jmz%6-U ohKzU%--1K~l{<@Algzi@uNL9X;o>Z>(Bsa^YtS>66lAal0Is`BfB*mh literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_history.gif b/hangar/static/images/icon_history.gif new file mode 100644 index 0000000000000000000000000000000000000000..4473b1bc7365fba5b224c255b50478f943801255 GIT binary patch literal 205 zcmV;;05bnaNk%w1VGsZi0J9GOSxhQn;wrVEWa8Dk>-PW9>i@mCqKb4rs-lGc{{F!9 zRyLIwX}B){00960|NsC0A^8LW000jFEC2ui01yBW000Df@X68GnHYiUaQoR$PDlq~Uh%i^ut5jZI=gf(+IG%L`D_ literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_info.gif b/hangar/static/images/icon_info.gif new file mode 100644 index 0000000000000000000000000000000000000000..9dfa0e196aba9bf0dd70074ccdb980d07de9e903 GIT binary patch literal 266 zcmV+l0rmbzNk%w1VGsZi0K^{vX}bO=Q+JG$m|w5)cDL-S*7{tb+@Z?p4qk8 z_sQn}X|3gLf|Hfa{4HFBMq+vzJXv+X|6!-#{r&xKvgu!?-l)&;*zNvYc8feuU~I4F zQ<~I5R%ieJ|NsC0A^8LW0018VEC2ui01yBW000Gt;3s}wX?kNyLPFa#5UP3^wk(CC zKe9+;gdm|(VMuts4zO}DT@VOK1m)={2pi9Zf$&VC9jdjm*+RV&K$v9RFu0|I!2+1F z6;Q;%BcIpB1z!^u289U*e{2p3gL?-F2^@(e8U&FXn3w5$p!k!8k%2*+K?fuc zvXg-|`GIQRqSUCAs4#&;3tm~By~MCQ%rwwORo7gy-yy?BWny%m`4$Z=kEQF}JtY=+ zUfLA?(#?Ar^XBeQKBmcC4v)^p`DK_cQ206RTqffIk;3UrB1Hyj7R*hC%3_Rs)g7Jc Jeaeaq)&Qp@T0Z~) literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_link.gif b/hangar/static/images/icon_link.gif new file mode 100644 index 0000000000000000000000000000000000000000..c64c23c1fdfcd46458a89a9453bc3495605de132 GIT binary patch literal 329 zcmZ?wbhEHb6krfwxT?ZXP*8C6=+PA`R?M0;>*B?W#l^)-mMob*efok03$9+hI%CF+ z^78WI$B!>sw5YeYclPYr3l}b|udnaw>Y6fT%JSvQCrp?ydGh4Nix*c{S1(<Yl_?B?24?&NmXm(?DWgi+PmESqtN`S)cor7 z{&|?PoXz~U+5A#qd3cbkLrYwBkF1%%*1+HVDKSITQd~YoRj=3leV@70=kR=^z{BAE zWq+J+j<5g!|NsC0A^8LW0018VEC2ui01yBW000Gk;3tk`X`ZB~u57Djk~GW%wk!|F zIjRKwz#zcD^9%r+$>GpwToMU{fS@`~l+6pEQb8!F9t~jfctmCig~AI_VF1f46oFs} z+MY$>U_KA%40aYO9R*oWfPn>r9vlV*1p<Nq& literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_monitor_mac.gif b/hangar/static/images/icon_monitor_mac.gif new file mode 100644 index 0000000000000000000000000000000000000000..b70028777e38c06283f3156e62cabcceeef1ff93 GIT binary patch literal 274 zcmV+t0qy=rNk%w1VGsZi0K^{vOj>hNX^J+H|LyJVcbT^8>grjg{;$&HM4A5e_4Pze zUre3;lDN>H#Mr3I-anTA;7>nxjHlD*@PDMhki}Z+(TqPvR&S24C@@0W+S+BS{paWB z@bK_6kN^Mw|NsC0A^8LW0018VEC2ui01yBW000G#peK%GDN4uTGz>FM1aSqCcqAM* z>_g#ig@BFIDRwjl!vgULiX23Nz-WAIgq{XR@OV&*R)C1Xc`Uyj#769ya1aP|dZQ2# zi1H%cPV_)L6dn~G7abcGA{Rs&jE#(jh=dt9Jst%cm>d}xi5V9I0RW;33LF=kof%jp Y7#XM@0kIw*w6z`>xFxl_A0#0FI|aCRJ^%m! literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_monitor_pc.gif b/hangar/static/images/icon_monitor_pc.gif new file mode 100644 index 0000000000000000000000000000000000000000..d9a9472684dce1fb192ec1d2d85dd58a534ec044 GIT binary patch literal 274 zcmV+t0qy=rNk%w1VGsZi0K^{vh_1&RB4HMoVn`i>h10AVyga9V0lED z{;$&HO`iUEj;Zza^+8BiZ;h>5d7hfU)~L(gDKSGmL{+t>c0ZQ?|MI0mOI+~q@aN~} zGmrnx&CUP+|NsC0A^8LW0018VEC2ui01yBW000G#peK%GDQ?R$NfH1QMFT~RxHy`2 z?1$lR27*n)DRK}9219WPiYCOtfRm|KFB_ppq8VH+oX$o-#wJAE%Q7tJxD}hTr=U?N zitao-BcdCPN=qAjb3}iK8xJB78hITU7LFSgA`t>OJw65-8;ukq4FsYI2>}6B4;2)0 YB#|3#79}6E9*&M4v$-E8B)K5~JKj-qBme*a literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_network.gif b/hangar/static/images/icon_network.gif new file mode 100644 index 0000000000000000000000000000000000000000..c607888a083c2700d731436950072dc4c2564e54 GIT binary patch literal 265 zcmV+k0rvh!Nk%w1VGsZi0K^{v@bK{P&|kW`x}~b1d3$`bv$N&p<<-^I&CSh~m6dI5 zZNb68?d|Q_+S=;s>SSbN($dn0keXOoUG>>$^Y-^(USMZybfBQ1gNTi=y1w&QSI*AP z>&8~-=;;6d|NsC0A^8LW0018VEC2ui01yBW000Gs;OC8GS$-n4EJ9HX@DODl>MdQa z=M;t2B0^aHpM-dZ literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_package.gif b/hangar/static/images/icon_package.gif new file mode 100644 index 0000000000000000000000000000000000000000..e01b1ffbd62bc64995909e46c0342d8efeacaf42 GIT binary patch literal 624 zcmV-$0+0PiNk%w1VGsZi0Oo%H`sBL9qGJ2sskoO}rFI+W#)aCoZ^58p{qNQK@ZR*) zmc^uG*RXBGqhs*Uk*9bazMWqE?$Q14)aJy2^V5~;$%y^%*8ctZ?#__<->v!MxYMm< z`svBmv1{+xuKV4j{`>WuZxs9Iz@mXcp>h}f`t;4Ob*hI%{Q2|o&4>Hw!so?>`sl>% z&XD@$y8iq2(zJV`a~S&Q!usgL*|>P=$cgjQlGSct%NfD`tz=iQ2Xe?t9&B+;H&f7uKeJu^WeJr z;I5-|8P>LX_t=}?yLbBO!`ixg^3sy;(Ud5`*!28~%_0Wp&(2(!Xkf?ntw3Ai-`}F_+|NsC0A^8LW004ggEC2ui z01yBW000NgfPaF6euaL6h=hI#2M}O|iGPI&4FO#URX#?Ll8XxqP-!a?cOP0uZiaIU zb|OR?H4-{>5fLLWg$*bcNpBViIU5Fg4nuo|0T(|d0$&IQWlv0aWL$*@7fnGwSqKwW zDGCZv4}}mo9Cb1PS6&znXf_H2g#$=tKrT}(P8CHrYbcN?#OH+zHd4aOI8&fPi#!xU z6fzN@4~Pr`RM42vP>q}phCB=yphU|pR9MjTFv3h@|2fC|n? Koqh@m1OPkoG-<^E literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_package_get.gif b/hangar/static/images/icon_package_get.gif new file mode 100644 index 0000000000000000000000000000000000000000..19712a9c24bd7d12aafdea3bd2fc8801bc7feaa1 GIT binary patch literal 616 zcmV-u0+;rMzh>*l-_0^a9>BIc-+?Li&{p-oou4coc zW7Dl={{8yy)uf(p75nJI;KYvX)v5N)eg6FTqH`Gf=)~E$c&L3V;Kh&DwtBdiSo-6# z_1mbcd?Mz=fueyy^V_bE%~SmO^ZfDI{`>Us(2${W7qpXA{`>X*`}WqcYwy^u`roa^ zq-6g5_xj_szLZ7#-l_K8tBb{1oNpAvqGHUYTJ6q|rFI+JyMK47R{s3@_0fy^Z%4YJcXbE|CsC1f1y?#i0FeM98fIz-kq{no z8%!twR4F}B6b>JePGUJkL1Rg61~ETm30jd`T^(^x04&JJFkwxW1ZW~f@PUO3m@-3@ zNMT?AhY&BQz7QZ_f=7q}BO0`LVWbnDNJUDJfHB|zk_RReMS|0W4ThMCJfX@N2mm|w COG)ei literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_package_open.gif b/hangar/static/images/icon_package_open.gif new file mode 100644 index 0000000000000000000000000000000000000000..e630faf917896a31a0fa6311d11e6decc32c615f GIT binary patch literal 613 zcmZ?wbhEHb6krfwcvix2YghH>+w1R%u39bJ;LV|wJPlO5ML!jZ?69S^ytXqEY%hvwbhGP5t-#%deM*f4w+-ZDaPoA8&uZICOS> z>7SpUcTA7?b${)zr#t`s{<^L&;P;Dz-_AGP-d+FfNaK}Vo%^P^UfWi6X>-Mcy_Fws zZTNbz`|Ir$mp2vP+)?r7>dK{M(*OSa{QdUgv%`(w&eeZ@uxnwF_@yn?yJkkeIM(vw zSnJ_M$y+9eJ~-OHbxPRZ_gDY@{WZTp^xvN!@2;(SaHQ|YlRdxht^D}%#^MsmMa2?- z-(CFmWc#+-s^ zZ)a=&{rUdtMEmL*rB&@ND{8fWJ>K%~_qTcZqVKLQIlC<8{f%`87bO1q@!{*$>Azka zS=8uwW@*&ha}!o{c>no$^T?clg9{QqoS$%iclm!XU?2n(f3h$#FqAOpfE0q_gn|7~ zLrGI}acgmNM@unF0jFteXGtpyA2*Y|g`L)fN!_fhOpFZ7j7$o-&TXm-7z+y*uVeJe zGH>ORE-G5Lp>Stdd@Hv=gwxK&J9&6gVq4P$@`4= v8nN*tR0uISPUi4v%6J&^qE%cgNI=8GsabfDleXUhfrmyx%V#wK-DeE|1Yty; literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_padlock.gif b/hangar/static/images/icon_padlock.gif new file mode 100644 index 0000000000000000000000000000000000000000..f70cc953a51da12b8c8757fbef6df64b6ea97e9a GIT binary patch literal 249 zcmV+9>uj1kAj$NKQO%#srO^T*ZI)!3~X`Ru6Nwj9HM4fp4g z`Pz1^t*!t6|NsC0A^8LW0018VEC2ui01yBW000Gc;3tY+X^tq_t*n=-o+V2~=c1ks zu&ZR_ot-IHyQzexPI2VPbReBZCeu)MF1Mz~p;#mml?etB$YvCn&4w^A2o8vd8Lei! z;SBR4y>7ob8fFQ6c7K5+8H06x2Y^`@2pp1=lZPK34*?Vr3>u!FmP4YVA0Yrc%MX1I literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_security.gif b/hangar/static/images/icon_security.gif new file mode 100644 index 0000000000000000000000000000000000000000..929284daa0af8e188b2ecf9b96707ea6f6f4e30b GIT binary patch literal 266 zcmV+l0rmbzNk%w1VGsZi0K^{v_vDiJ+j#x<+S#ue{QUXjv^d$TOaA%i->x>wj2G?C zX6wUB@zZAJx=G{2A^PsN?#osB-iPz!yXee|@6KHL@X6-IZ_Seu!+#C!$WYRo9pAkl z#e)vqwjBTe|NsC0A^8LW0018VEC2ui01yBW000Gt;P-i==#eElcIUY{tv8S!+uhsg zINhwBtk^*i16+U}z@s9NSO5VAC6YiY1r6cr=4c>`0C?oU9t`9}X7NSU z4iW)8k$^PRb{lvC777#y83h3tDg+J$698QZY6K;02NqFil#G`v4;Barf1aN!0}*Pb Qry~RxU@EO9vLzt^JB2HF1^@s6 literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_settings.gif b/hangar/static/images/icon_settings.gif new file mode 100644 index 0000000000000000000000000000000000000000..14339f700daeb6bfa8024b9d27adac41fdd261db GIT binary patch literal 251 zcmVNk%w1VGsZi0K^{voU_X3^8TT<%EH?6ti|40a*EjN{*$c5%jEr}ywkkZ z?Mh;Lwa({^rM;Z6#P<3Az0&Bu*YJIouDa6ckf^}={QsxG*=d5Cn6b*d)a%FK_{-q+ z@%R3~*zf=U|NsC0A^8LW0018VEC2ui01yBW000Ge;3tk`X?|YnouubDn6RFy^E^Rd zrKKk%8;)Y&VGwpB-wiT}co3c(W#)P?70;)_Aeo^Afs98Y2}HPF6d>TybSn%*H@Wr@ z0~G>>GAK|JIZqK5dmR}IULFYv1O^rW6b%K4Jst-J2pR*3X)PB8pq(ZvqAV;S06V_+ BcoqNv literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_user.gif b/hangar/static/images/icon_user.gif new file mode 100644 index 0000000000000000000000000000000000000000..dcb5c2a899c84ee0be36e6b92222cdde6fbb8ad3 GIT binary patch literal 246 zcmV5VArX{>gpqy}ZQ3xBIb z?{>Ooo8TtXQxO=NV3P1sT@;64^wK0*F2cJVcp9?3i-u?goe+C8y2nl2m2^4>_FfstG(gCRl*~!4_rJ&N6qG_a(Fv*A8@Sv3u zi=hPTl2gr(EZS$RF%|eDX5_G7f&+(Kf1A&e9EZgxCyHv#?b;Th&vNJMq@$0IueZsS QkjJR*`K7mqPrmsz zefKkgoJ$Hb1^$D9;!hSv1_pix9R?r(nZdx4`r)MK>RP?s*2UR8lVi`7D|8$(kq%Wl zZpd)JXoFrePcwr+TQv9K02MZtSqu^f1VtMd-lhwfME5;P;u5G>KPiaGg4dL3kzewg jR1vQ3Emjwp4?aHpL0ur?$Wu`{MWsqHsaBazK?Z98nF~uF literal 0 HcmV?d00001 diff --git a/hangar/static/images/icon_world_dynamic.gif b/hangar/static/images/icon_world_dynamic.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5ed08ce64adc93238008dd4c5e4fa47530392d7 GIT binary patch literal 367 zcmZ?wbhEHb6krfwxT?u8efP6V?>7GbSo&%qGUCQ~qTfFFa_@%dpx#Es~ z{Q3OdW={FCi=WqWt~&qz|LwKSo{`2<NYb zUv>7rrlE7qrhvvBp+{c)UwG^PzNi0}-}zs&Ik0krU;WnL?T`LVzxIFq{r?Tyf-Bbh zHtq~Pedglod;d2)_`mZp(4wHTuYpzsS8w#&bnQ^(dcR$df!v^`onbSt|6g$P|CWdU zm)!n8|K|Uy4ZfA@eK$V%-?%-bdV~M=NB>W~`oI6_{}p%suetaC{}YC)4SrP{{hN1% z&%N>g$n*b8Z~t#ybKKE0(kC*%Z0e@a?CyInK0SN$<^TWx3)w2#=%N)wYWTM35t|6wz7aG{KM?ip$%|T4uj8*hRlYgkNu(-26AFGhB)U~i1 ztgMQzLZb3gE{0ETu(O+bO3HHcnhS;oGzEq7{Slay*x19t6=bvE(RnThQI#n@839g? z0{j*d|Ck>nA7hf>l3Nqu)X3D(7Hq(<;?Sh0Y79CSe`Y%sdrg@gP~`M*!kG!@9UB=K FtO3mL_vrut literal 0 HcmV?d00001 diff --git a/hangar/static/images/image_new.gif b/hangar/static/images/image_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f4d12e5d480b7319b8230b54c8472c44174d537 GIT binary patch literal 609 zcmZ?wbhEHb6krfwc*el+;q%wMPyf$4aIJn@aOFDR+RcGiZ$CNk?7ya=^Sb;08@7kk zZ3(R15_tUO|3lCJ?|$-s^TYowdm^eg`qyjN?yk)cy*J5 zTC=5_fEjFVOfXBOwI;2maj`zOnI~-s0Iz zc&5$t_4w%N?EnA&A^8LV00000EC2ui01yBW000GTp!1DnS&9u2AzYzA0T5@}NT>+* zLKe^;0$XQDEDjAek8;UWB0rI))bos(uAj;XK`I9UWlkx* qKZVj{KPe?f16U@1AAy1-ga%Vh4}b=b6%`T-3kjAFjUtC9Apko+wrGz4 literal 0 HcmV?d00001 diff --git a/hangar/static/images/interface_dialog.gif b/hangar/static/images/interface_dialog.gif new file mode 100644 index 0000000000000000000000000000000000000000..31e1b071d9db2bc6dba9de82867cd91085e65692 GIT binary patch literal 238 zcmZ?wbhEHb6krfwIKseCv+Ar@c2CCS?N(9MjqA^cR?bVCej=t}N$#9eom(%pZMx`_ zKgq9XT1d^}n2ARMI}VmFJ=?qXa?$*QuqNy}#m3-~U(YP9w4M4y$j_0^Sy kCOoaK&GxI24Ny~IuI1%rW#!>!WR#r3+|@BdR*}IP05UgXXaE2J literal 0 HcmV?d00001 diff --git a/hangar/static/images/interface_installer.gif b/hangar/static/images/interface_installer.gif new file mode 100644 index 0000000000000000000000000000000000000000..4b11af38eb92c4f817de748fde4ad9faac14392a GIT binary patch literal 242 zcmV%1UdDRe7FAL z(q@;)fv?Y8k;F`Ik_xs0jjhvBh`~;Bmf=D|ccjHtgT2Mt>35~ga-YGdz}}HyfxN%O z^!4~)-!tj!@c;k+A^8LV00000EC2ui01yBW000GV;3tk`DOyT_T!OGb4HRjam@=!o zc#RiL6&q(rEDjB#f@jHWE|DLGXG5)Sngo&5$(4u@o=-1s*cn`qrF%JTc2^_L}5w(}2kJ*BwMG zBP#dDA1c!dRNQdW(3>eQduhn#t-%^Iq!wS8_KQ`NMV^UCg;PCHhoz`qL|9mmk559t zi6x$wNl;aii;J6+-HDlnkx^7bPHHY28z+OSlaj_J4KcQLK|6E=*x4C0xW$uq1Uoax R@Ekf^z;NQ!IX6cJYXD-;=`8~M}KN2uM>Q(Tv~ z%RYj+X~sVN?C$FL{?PTh#PX;&lN3~uxvuejneAO@z(Pu?8;I8bJ$JdgBrg_=$?Ej~ zzS{Nw|NsC0{{R30A^8LW0015UEC2ui01yBW000GVU?+~`=$)OkELiKd-RX6}X5V)Z zqX6gszrk*%*bs2JVMhT3YBb8)5vRFapu8qWQ$QfDvChDFi)b7LD^?6NKp0#wZxE;( sDv!xikO`MM1{4_w2?=~dGBXw#4F>{;iHRbEkdcuc8GV+UA~GQWJ4b|XjQ{`u literal 0 HcmV?d00001 diff --git a/hangar/static/images/list_errors.gif b/hangar/static/images/list_errors.gif new file mode 100644 index 0000000000000000000000000000000000000000..2e68d107cb6c5cf4e5de8866d207fd674f709bee GIT binary patch literal 242 zcmZ?wbhEHb6krfwI3mGtuTTB|>#47Hr_SDUy=U{y|L<3&Ex7sNY|sCH-~Ru8F@5{# zjn&G(Z+Y1@?F^Z?^Ij_7{~y<$tnvMIUcYheP22LFufF`>ckAnaFkrw26o0ZXGB8Lm z=zt_ab~3Q$KTz#^(lK}XWs{KC+pc%UI;Y3{n}dCOKv6zqKH%9!&i#YB0N zQpKlP`O#%Wpr literal 0 HcmV?d00001 diff --git a/hangar/static/images/list_extensions.gif b/hangar/static/images/list_extensions.gif new file mode 100644 index 0000000000000000000000000000000000000000..a5e542a0c22a5701e9fd148df4a8d0238782a74b GIT binary patch literal 251 zcmZ?wbhEHb6krfwI3mU{d(ZVHkGy*}-+c7#5z##V^%2@ zp3;b1so1#orfvC7v#G+}*Q`?4sh023+IQ>gt1tf{fB`p9{K>+|z#zt;15yIAlYzA& zLACEm#@x^%8Nb)tu4aZZq~0$VUVPxmfBS=ZZ3{#Sb|$hiesP^=C3&`^TR>@->|6Dh zUL2E_hdE5;ImgK1;wV(G`xWaE2XRK0-kN5?corspRnb@;76EQ<{w`{QX3tSIRufZXum%7+VOoL! literal 0 HcmV?d00001 diff --git a/hangar/static/images/list_images.gif b/hangar/static/images/list_images.gif new file mode 100644 index 0000000000000000000000000000000000000000..f744f19a3cd072deaa523e4133ec8b851420df92 GIT binary patch literal 565 zcmZ?wbhEHb6krfwc;?A4d(ZWr%{S8)+zgG*wQJg$lG8eU`{|I0J1hE^t-A9mE~RSv z${k$`H&;(umR8zdHDOimYU7OM`sKZg(@VNn-2Sxf!QbA?{|~Mx z@w0HPb#h_*-sk^!Klzi8R@*(^Tavh~sb#b+B+N_&^z{U4uM zGwTuLjc2|2Z}#g7#SEm z8FWA{1;q&i`=kbsrskGr&vp-X78cjuzFv=ZPY(w7Y15~>OzdEAn>T+xIm!t)F)+H^ za?v%_G1HO~H)w6-*#z+epk#Qw)a literal 0 HcmV?d00001 diff --git a/hangar/static/images/list_keys.gif b/hangar/static/images/list_keys.gif new file mode 100644 index 0000000000000000000000000000000000000000..6d3990a019141894db74d91520828ff705dbb9c5 GIT binary patch literal 239 zcmZ?wbhEHb6krfwI3mh0d(ZV->n(dW-@LIUwhp{zzYUYxez=CNbPR;^lf?b@}rwzm5E`eneQ)rO*^M=KfQA0$`dC}Oqw*QqM~BftXYc|Eox|Jm^*iFNlD4fnKSF^>iYZpYiepj zChjaQE^cjYEiW&>eEIUyrAtqqJlWmdJ%9fEOP4Oqm@#Aa?AeWLZ`zjcynXxjt1tie z-TL|;3>e4)ia%Kx85ndKbU?a6eqvy2aF|x$A+xP-4R3Q}meuSv$=$30k?XGqi*QC% z?!SMa>{bBphMR_~8S}E2h8W-a^=#Y0ubB>cr4~X8Ov2GRj0vndnr!llETVxSjOwf% zoLpRL;zBIkuA1{T*_}idWHBvQ6;P7pkm8Wba#HSOQ{iWkNe&9;mSmR@6x+2s*fq$J G!5RQ^ONI6T literal 0 HcmV?d00001 diff --git a/hangar/static/images/list_packages.gif b/hangar/static/images/list_packages.gif new file mode 100644 index 0000000000000000000000000000000000000000..c6cadf3bb4444130c5adb11ca45b69a09fa67007 GIT binary patch literal 365 zcmZ?wbhEHb6krfwxT?c2d(ZW+mnS!_z4_+CtXIbxdp6%pTX1vw_S1GvJOBUxu)5Rv z?b(SxKR^8c|Lf(A1+Yie->-yB-1+;#@=up0{&>3c+P30{yDDtUcdl4kP8%lvM@3*=l~%Qfc(V3)^%WNfrredzSaCpfmv3wS1V_;21Kq8cNF3DsN8@5 zP+3)gPq0Z&RT2fe9UdbZSUZ*WBQmLZC zBI?Az%EY9>sU#^gU6E1DRa=8sRzaMPg_}_*IaotjTS`Egkx@l$OR$<6kKD9F2RyV7 O9X}Bi>=xw6U=0A7Cz#{_ literal 0 HcmV?d00001 diff --git a/hangar/static/images/list_security.gif b/hangar/static/images/list_security.gif new file mode 100644 index 0000000000000000000000000000000000000000..3e32002f1484c1965d6fed3c54c0dd42baf540a1 GIT binary patch literal 246 zcmZ?wbhEHb6krfwI3mR`d(ZX1zg|At?$@*V=9MMlx0e_^-DGohw&t(*htd|@{PuX^ z*V`?2O*^M=KYjLKbI8PCMAjO~q5(e4Hz*?N3*7sz^+?$6DLSJvYxia-Y>iz8^iy5B%-+wUg+76Y1or%jB zb6$CDeVpo4AiyEE+V#qBU!yJ`1%ZV*#>|V~b}tCvVm(;N@JCCG>9FHDS&x6hj2zqo lRcWfqBF*_VMtzcvB5l!q{bGzCwyIDgyOHy^+EE!)3x?}ar-ZiZyEP2YH;bmIE$ryqn&+}XSK zSl{YnNp-Vr%XfbM{`=AUKd-+0-*@Zle=uO60Z{zO!pOj&%%B4@8{{Vjwr+=s1s*be zeT#e+U(B?cz38!r2t(xh>nOlWBx zryPfzdzrU~>nPg!E+B!ajK>X*O=r nDy1+HSJtf?iDg|=le(3&Mj>| zIlHuO&DD)%uD0bnUtT}9>cXeaM5EA#Wv{;c-*@Zle=uOc4HSQ}FfuTRG3bDlfb3*o zElyDFdy+9%G)cnm^|q^-p$Aj$Zx>k1`1Jq&gLz>y1PUg16h&w<)J}9=EO_%`&-RWa ztF`B<4tP9vtgFywUh{TB#|-&)iC>(;eHcSM2K2o2GI5#oKMyUMJ7GHT%@B)=ke( z-2WIdac96XpL37CgiO5s;O(crk(2Y*nF`xN;^pc&RT$ZM)dRJd%BA=?nFZLmRaClq;)VEx zc^Id#GS6UOVqsAhn>U|TeUYn{BC`s+0HYcQdsmQ$Iw!ZNnwq3q@@_5lX*}{rcAq_d N@XXnBZb6O=)&S&zh%NvC literal 0 HcmV?d00001 diff --git a/hangar/static/images/note.gif b/hangar/static/images/note.gif new file mode 100644 index 0000000000000000000000000000000000000000..17b9f418541130eb083e78e219e538d0c6df4034 GIT binary patch literal 270 zcmV+p0rCDvNk%w1VGsZi0K@gFJ|M8pu_PYQ2 z-0Q|g|MRi_*k}Lt!vFWk>&RCBiDu8)T!!DT3@0j##mD11ekK-RHklnV&OLIhEd z-EhRlGN1?833z%>34I?6e_e1JPZS7-h;56F5daq=0s)G81QZdKmmdNa0ScxS4-AY? U6Lc;wFarY@7ZbK7xFjI}J9TA&ssI20 literal 0 HcmV?d00001 diff --git a/hangar/static/images/note_delete.gif b/hangar/static/images/note_delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..13402a5823027e5765a122d7c8930684c521fb46 GIT binary patch literal 271 zcmV+q0r37uNk%w1VGsZi0K@&8w0^RoZ@+3U$${#I7¤wO#g_8>(eajniK!%W$UFK|ISPN@9*TPVC&98 z|IktY_P77=k^leyA^8LV00000EC2ui01yBW000Gy;CE!7Se~c|041P353_AleXh{g z6ojG#K*|ZSDshe+3`QZ$6d{ujVM;Y@KF;WAkmzBgIun__R7Z(+`DY>~J06V)QfxiF% literal 0 HcmV?d00001 diff --git a/hangar/static/images/note_new.gif b/hangar/static/images/note_new.gif new file mode 100644 index 0000000000000000000000000000000000000000..431ff64d1f07ea8368ff38ac49941794a3fdd849 GIT binary patch literal 379 zcmZ?wbhEHb6krfwxXQrr|GeMpEk^&ppZIqp{q-#2*GpypKk@m0DeV7?)PKK@zCNA$ z`dro2lOEGfdA01Zo^;&3Zkzdpqptt|eeXPA|NqbH{v$3`n~kTR_U=C5@c+lT*LU_b z?6CO%>(2l8{r~^I{r|G{^@*_mA7}snwCwdU*P=DL|Gypj|E%Km1>^spH~#;&>;M1% z43q)IpDbVlbU-A?PYi4`9Htg{=x~{833+Y}XmD73G1F_0L0j|T!~?dRp1tm=n^ZC5We%>aw-FvmvIpt(dOEPIJ XU%@iXKOm5ik(HI@w%c77M+R#EbrzH@ literal 0 HcmV?d00001 diff --git a/hangar/static/images/page.gif b/hangar/static/images/page.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5743c0663c6038b0a3e23af4d1d016d4d79614a GIT binary patch literal 274 zcmV+t0qy=rNk%w1VGsZi0K^{v$K(F&@%Fpi{pIcTh_A?Ym$X-Kk(J8)tJM2RRcrG0 z`nKBqq|y6{yX;b7d#=;vLrYxM=kUPa{jt~ln!whm%iiAS?F}`8qFldHIHThC>AA1MdK%`D2xE4K%l5PM3m=Ix>!sUS5I~;5p*XAu!!)KnkVRVVy)nM z5eNojF!vM!Tyc6F0}vvAQ+Ig`92^;jegS58g9ir|7>5dPc#IsD0ht~K9SS@ds2LUk Y8yANLunrCh2@nt%7#CqByd)t2JMy4=BLDyZ literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_alert.gif b/hangar/static/images/page_alert.gif new file mode 100644 index 0000000000000000000000000000000000000000..4719a1f9209e139250f1ad1bb4207fed936100bd GIT binary patch literal 285 zcmV+&0pk8gNk%w1VGsZi0K^{v*W&Bmjwiz4{rlQVw%Yvv_|}lM&)#JYyTQf!&oBS$ zmE^2VJVR9Q&5Vetx&QB~>bqsSwX6U8=&^ev|Ni#j>F}P;`%+Qy8XFrNWeXAm2?2lw2Zk0L3?hmTml*;^0tNZQo^^UO1Nmg#l%+kHx z{fEQ)*W2Rc>-4F)%(mM6iJ!Ic_WCL^MTocMQ(}5IK~q9ZU9ZyQu-E*k%irGU@So57 zo50s%f1&^X|NsC0A^8LW0018VEC2ui01yBW000G^peK5aGbE$meeBm@$di$hlEm4C?b=IK$P(SDoO#t8R=3)9BZW`fovZSOyuj~L;x1@WP!%0 z*@yQbzF61;0TBoyc}@g03=swmxD6V+20y9-z!Ve+2o}Z_ODW3BA|U`f{!D@8 literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_bookmark.gif b/hangar/static/images/page_bookmark.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b2a923a5ae58535adacd1fd5cf3012689d47ce9 GIT binary patch literal 291 zcmV+;0o?vaNk%w1VGsZi0K^{v^7i^Riqn*|(Ui&hB5tsaz3NwRk*U-Bbd<5|@%C(_ z)a2{**68-L*!sxb@ocvCNmXl4meV_y=EKO)Qek_|$wnh9QU)Bxzhz$f7iv*4t8j>EA1eb211p@;b9g_eA pVtIYl{E>|NsC0A^8LW0018VEC2ui01yBW000G_;N^{DW|H2gdeP&W*_0`YlYZV4 z4Z+6!o5286NaX^Dq;KQVBo>R#=pjjJP|k!z>OoYmlo4kG03;eC?*S|(6VB3`hVS7=eQX0s{~u3ISz|n2?c^9+j6E3>~5Z7y}j~4iaUH oqof!Cryd0q2?0X4LIDpIsG=PW4F(1f5Ed2{Xd)=fC>J3BJ4LjC(EtDd literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_code.gif b/hangar/static/images/page_code.gif new file mode 100644 index 0000000000000000000000000000000000000000..912517b83325930f4eb70d47130c3950a4f6f159 GIT binary patch literal 278 zcmV+x0qOonNk%w1VGsZi0K^{vh_A?~()-oh{4NSuG8g1OI+3G@S4EZuGagg%iiAS?F}`8<9naH z%goVdp5p)i|NsC0A^8LW0018VEC2ui01yBW000G(peK&x_??~vY1K3Vz_ty8heA@Z z>`UPnj)TpkSs0E-f|B6~iYf}ELAhio9->JUNo{zq*=?tz98)M@4-j|dhRA_EEpmI0Xv3!EMY0t!7o c8Lbuz92cDjv=0vn2@w$(7#CP2z$GC7J5=R-ZU6uP literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_colors.gif b/hangar/static/images/page_colors.gif new file mode 100644 index 0000000000000000000000000000000000000000..0141d38427eb770f550fe8914ef817f3a0f19b04 GIT binary patch literal 271 zcmV+q0r37uNk%w1VGsZi0K^{vmB{v{cvH&d{-e)nw1!}Aq|v3)`<-q_UTlQo>hjXf z%ScpdsJF=T_xe;}dGGP_DKSGqNLM{XRoqHD_v*j0w77(kqP&r8!QYL~z_abwo9JUt z(W;8Fct`*L|NsC0A^8LW0018VEC2ui01yBW000Gy;3tk=X^!Yu5=7v3UaDRMXWuaD zU3S+2g$^et+Ho)gUm-X|#8kDx;1am_h8Cx%<_k0g0h~e`plCW?!C}~8G#sV!nR8gT z8HUCp&K3^w1_lXx9%~yDS8aiUgliLsLW%$Y2@x?Kel`acfs+psPla^{840Ed4+;=Z VDjrz~4hstr5)g1YCb_vG06UIQbLRj6 literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_component.gif b/hangar/static/images/page_component.gif new file mode 100644 index 0000000000000000000000000000000000000000..f9aee3f3ce4d81b91b408b0da587cac8de70b56a GIT binary patch literal 646 zcmV;10(t#MNk%w1VGsZi0Oo%HuG8fyF+)sQaY-@Uh{kGcu&n@%B<vve*1jX^f!Pc)#?RsLS1- z!`E40Zk4;zh|*KK-2AZ8<9VLC{p{}J?DxCf{dAYL#^U|3*Zk}8`04TYX6%>U%?^?Hx1=kNDXVSZhk%Y&-20|NsC0A^8LW004ggEC2ui z01yBW000N$fD3+ugoT5Dh<;-LTP!UvBp_jJY*v1W047p9RCGEJ5O_6rJ(qqmS!sQJ zIBppy9v4bZKZABneS3R-Tp46G7b8AJgK~Wh8XCJE4sZ_=SXF}`eRB=EeGU&mIT2U{ zeheKj$Gdt!5=le|T>{}M9V@E`d?*nJ92IK=gA6Nt2`pHkhk$~DI!xXSn(=`TjRXhi z8N{%mjDbNnzNi66kAngXQ6`iCGw4c?7;*UUK~Q1Hh6zuM6d0ssiH{I@ctAm8#!Cqy gM*<9*lHvyv5d;Jb5M$s>fdDT22r@)<(1Jh!JBfvHG5`Po literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_cross.gif b/hangar/static/images/page_cross.gif new file mode 100644 index 0000000000000000000000000000000000000000..bf43a0a0bc63494a69a63fe5d0fef5b683be221d GIT binary patch literal 385 zcmZ?wbhEHb6krfwxT?gk?be@1FF$yOW;=VwbgVxy_0*pO_y5|thVH)ew{!QK(`PQu zI&kgY^Y@yD&g(8ez54vahKr9^oW6JU_LF(%eg`F1hZjuTc>T}nE5Daq{Qc(Rx3cM5 zjz9kQ*3j_j+pnL#{d)WH+j&{p|6ssC8=&};g^__li9rWsJjhQBZ1WCGDDaT!>RZ^( zEEK83!O|Nd>|`Z3*C*`uOEs;l0!ub)PUp?=f27@0VfU<`vGKzV%|l1oS?<>Z^@_<= zC~_&t)O6G|iMKeh$aQzhi;0Q%F-^$to;pK9LUxv-l;q?Z@dd)N%uel7=1K?)Gp=1y z$56M4m6eCxNh-frev|MX$^D9=LUJ*T=NWkt4cpeM}YHSG&hzAuV0tR7*hz$W9iyn=0ev*?Jj1gjehykJooE``h5e7jW btQ`g#7>o$B6ch>y6%`p77-uNIz##xTkTriQ literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_deny.gif b/hangar/static/images/page_deny.gif new file mode 100644 index 0000000000000000000000000000000000000000..2bf5013abfda71b4d48445d02b54ea9a37956c2b GIT binary patch literal 298 zcmV+_0oDFTNk%w1VGsZi0K^{vhp)~|S#Q|u{&ttN;wUKO?DSS_jK|~sxZC{v=H~B? zj`g><`P9_a+vM!^{*=e}^!WYj@%Hld`Qh;X`}+LteSPU%T>bCww9(+2z}BeC-rVT$ zDKSGqNm>8@|NsC0A^8LW0018VEC2ui01yBW000H2peK&x_?_N{VOo{}z#tDEifu)t zM@3&ehMETxIT()!gyR7SdNdH@1ai4R1P+J9nTbvqgfM|2Ku7|j?jb=~K-h$Y8SMc` zCKZK%(pFRiXCihE77G&=e+w291#|-u6Mhwo0(l1o9U_kh7hzTk1Q!n*nI4Y_0tpsj w78eJjr2`O22NM)m2oDbtr3MWWJU#^*8xa^Bng+@S0nHuH9UOEe)FdGQJ0pdDl>h($ literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_down.gif b/hangar/static/images/page_down.gif new file mode 100644 index 0000000000000000000000000000000000000000..390ba6974ea0fb587d242a0baf2c8efe3ab57056 GIT binary patch literal 281 zcmV+!0p|WkNk%w1VGsZi0K^{vlFeIom$aJ9`|I)dqHMBHP3`_C>9k+2IMEoSd5)$N5QB{M3`r>1Bi4UV8+#xg?7K;ae;A=0svA2BOzKV zF5EYuaWN3+9svVM9T5=?4hDV{B7#T{4h@I~0siItWdjTQ=!^z{LD7(^ZCQr z=1Em+R&9;d;qGK8c$~^k$3`u1kC4A2rmZ25t&F3m`{UogbWZKqmIEq;cy&Nz*jVkL=X~ATD>Sa z;zxiUaHuyucX9!H00RdTA~<-1djkU-h$3crjgA`@BZ7>2jspppBLoRMI~%467!@J~ V46P3j3kwqy78Vs?Ik_Vt06VG>ugJjP{dk$Tr~sLS5q=$-yaxZ#SE11S zRIB!<(fT-LmH+?$A^8LV00000EC2ui01yBW000G*;3tk`DMpS%Nm39Du;)pl6A@EB z5xm!Np4!AfBnlcnph84J6a~km2eJG}oCYZJ=Ydc~*KCvvDSSTxgcd_Cm=B`#5u?d; z3!M!C{uwM9bQu_Bd3p~bei3zpcpDoG6^DHb2?~}900Ru06&HvI2?=-w0|2G~3!WbU e5ePdx1QoIi4i<=*mj?$A4;L2}RVKnBApko)oOWvf literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_extension.gif b/hangar/static/images/page_extension.gif new file mode 100644 index 0000000000000000000000000000000000000000..7bbe56a7bfd1db25d3ed7b4d325b7906fde1d963 GIT binary patch literal 279 zcmV+y0qFimNk%w1VGsZi0K^{vce*Ob3f(^Ng;>>+$w=m9dM~ zI&sPdLq0`S zS*amqt|kBf|NsC0A^8LW0018VEC2ui01yBW000G)peK&x_?_ORsz;l=iHBZ>f!s)4 zOOEUvh(Ko;2oMMp2~RYb2p^r|aYF5R09e2SFg#8xA^>JAP$)89#sqxDnimR+oS|+o zC!F^}Ac)Wnc5NIF3JVJnh<_Gg7y=v|hJFkM1qO>(WgG-~ew39PB10XTh@F%OpdJuS dIXXHB5E>#04z(2(4Gk6+8ygyICBY;i06T{eaPj~E literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_favourites.gif b/hangar/static/images/page_favourites.gif new file mode 100644 index 0000000000000000000000000000000000000000..eab0d9d1aa10f6e99659f8db5754e2a92a680771 GIT binary patch literal 290 zcmV+-0p0#bNk%w1VGsZi0K^{v(&X{~bFyu%K3Mfw7J{;snh%Z?Xu(R z^Xu{U!{Gf^Y>fZa2LIkP|Ll;^%(myLI`Q`VuG8h5!PcnD-YGFdK}lKV#fRwCvar$P z%goX1oEQK9|NsC0A^8LW0018VEC2ui01yBW000G_peK&x_?;d=ZB|tcgCQFpN&(8E zEsNqSg+|S@Sui4!2xG~Z6b3?%Wx^nM2+PA^!i`oY5vwG_&}t_FPlCYqKoXL81c5+{ ztdKz9@d$M2b!i?0cmWO&e}D>t1`=uy4he|}1qv7v1|7#D&i%p@TIJBz}B!Tr4L_o{y)q5EzYtB;xTCWf;e!643y9FwiJ6z-cH%*eE2C&?LHF520~{Ks*+N*(+Kf z6ATMOGH`g(00>C|cno`e9u*=05rZ2M2z-c&9*lzt8600y!OvQ8*k5NdeICi7tRgXG(qG01%OZLG4sLl#UWB0#v9Du%)9|Wnb)#L2_{r&a$`lZR-;OOruF+)B@Rh4olrlzKhTM5rsQvcw> zurVv&xs?C^|NsC0A^8LW0018VEC2ui01yBW000G`VC0QsW|H2gdXVExX0|CroqnDJ z8G^aZ21=li$_Ww)-$j98002bKM1sU*Mwcdo5uGM5o9klH84MVW5rEp+j6It20j*{v z+8R!NaF`?NcN=+$o5w%4uJ`HISSC2_`9t5rNhRNLt7qu7d@%KFIP z@j9C7Zm`VI>AX~t+b)(UsLt9%pgKN`ipS5`OQ+6w$xdgrjeVcEN~pKz_{dUWdslFg z^7i`W?e+iv|NsC0A^8LW0018VEC2ui01yBW000G=peK&x_?;dUtk=c1mxl&N2iQm5 zb-^ZkiVma@Avhok1!v{+90r93Fd(rAI9QDcAn{}d3riy+D08$PhaiK%P$~nc8BGub z7>joS@tBJU2Y7izd}SSIdjl323j|ea2^|Jo5g8Q^1Oy412?+<2P6H8f3=T$}o}d#P jLzxb!odBR4N;e%jxBwHN7aP7Bz#0a_!)PVPBq0DhWzlum literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_java.gif b/hangar/static/images/page_java.gif new file mode 100644 index 0000000000000000000000000000000000000000..6592a87a014abf6178ae2bd407da7110c2cc7ed8 GIT binary patch literal 650 zcmV;50(JdINk%w1VGsZi0Oo%Ho1?1Z>hZqb{o>^1Qe%L0mb2{b@Amomqq@;NDHQGY z{!>m#>+<=QrnR2V`|9!cm8iPq?e^yF^ILkJzrMWl_WAPl`B`p^-skVG)8%wcEh#ZW zOj&VBRB29Lc|Al`LQ7rp^Yy~V%+l7``}_N*()*Um`|a-V^Y!-T>Fk@$`^U@C*XQul z=kP^OVV}d-YM{QOX9jF-&+j=}Nz`}^?m^ODH>ps>H9vcu}@?onZWQ$Q-x*4wYp z;y_1N#LCd1&-F|M2E=5pd(8ai& zrmo}c_pjFcf$o4BR8%jEC%o20B+U~XrJr*)65=kNE-yr^DGI?&YE-QVAcmZFcG zr<9_w)!XFp_4tFctItD09W&&3V3Kda)00uo2Pi651{DZ%;=}+aBKq`kFvA3fAA{B$nA4yE1PCR9s4#Iu%ZEV|=u~(hK>~~b kUAkb%a%V$I85g1u@W7$N7Z7+$w=m9bZFkx5l+)!XE~-u>9L zRI1eb@%H+n(EEwI?6ukaQek_v(cnQzS=Hz8%H;lSD z?aN{I;*0d|q*m^48s#3w(JQiiqKvS)1 z*qa6XAotceZF&s?d>#sE8-RHYi~s05E5 f1_%s1J{PhC5f~x`2DuOr2fY%%7-l8IBq0DhF35ke literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_left.gif b/hangar/static/images/page_left.gif new file mode 100644 index 0000000000000000000000000000000000000000..f222b46931c1d70712206b8d84926fb11a536555 GIT binary patch literal 285 zcmV+&0pk8gNk%w1VGsZi0K^{vc9*o0&0Ckt{N(KQh_A@UV{1qyqvJVHU?iCy8)478B70YV1rAkuX-v?F77DMq=zCKp&ET{7hLZ zL~aCJE|GNV19u((4M`6H4`>t|0~R8LNfC(@6a^d{8IFU6VF?|U90CFv8;=WM5ecf7 jq79`U2L=l~J{h(R6&jBRyb}`&3Kqf}8d)XBB_RMiG01n~ literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_link.gif b/hangar/static/images/page_link.gif new file mode 100644 index 0000000000000000000000000000000000000000..ff0b39d0fd96bf36b67234cae6a6ad2bd3f88952 GIT binary patch literal 644 zcmV-~0(<>ONk%w1VGsZi0Oo%HTY8?OqoZ?kbMyB3^7Z*yZj9dN?|*-PxZ3@$)8#2K zLrht5NmOZ0UU@x4RYFT$aBy(N#l@(osG6FZcXxNy)z!zx$NT&HmzS5((b1mH`=Fqp zz1{tm%KMm@nCDlarI;>F~kd{iUU)%goV5 zPhslu_M4lV$mIUy>-DhG%y&-;3htKsPI$>aTvjg3`jgrA?E#Nqwx@%X6A z-RAA{wc7kuX@*c~jIYq*u-E+V@bd5R^oqUj_4xUOgoLEg`;y4}=VTF`qSs| z;py+>@AXAcW9;?*{{H@1U~W-ierJcLW`vdf>t*W>K>r>Cc~*!+8Yd-3)7eWARR zl$1b6S3yWu=kNEa)BCN}``732gR|q~>hX|}kcx_mj=}L#V}Np!u$`TqbeFZt<^IOv z{l4D)d7HSO#M$cd`Jd1Gp`oFu%irno_l1Rpo}QlC+S>pB|NsC0A^8LW004ggEC2ui z01yBW000N!fK+~igoT5Dh<;BALq1w1Su|jDa94hb31?AyWOh9wpj&JJmwqx#IB_s? zJSre_A4g~fgLzI8Tq`4Z8yqAbQv*7KbrODk6&V&0F9;`H1XhE_BO5yt9v%^4L}mmH zethD50U#V0<9uab3&(x$dmIP{@9#=641Rn2dlMu;0w4&4aA!t~K>_?=P_rh<0WT3K zXb5rR!5}zqjwM?rKtq!b2E+_WE2OU z7kseL9!a4?>?Dqf$?NB-bUcKp@i?hQM9*S}&=GhAldGo#=`a}Eu6Ga?F+7gARNr-FN=3zVdt9tv~<4fPor7@h1x-1A_*G z4#+T&pBUJtADCR=A+xAY{q)Mqma1&c{a=cmxa4~mroT4KS#`QgUof=)~+&T;I{j*sYXaTd%6BpddF%U0!DD^qC5h za!gM1`zFkilw?>wPi9)j8Wt9I))h*%tJiLm*{Loqq9hZ|aDstdhKpl`^aUv?Mn)zk OR#uKC*E=qb4Aua>fQ#$^ literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_next.gif b/hangar/static/images/page_next.gif new file mode 100644 index 0000000000000000000000000000000000000000..60769b66d27aa46bc04658797263227537bf70da GIT binary patch literal 283 zcmV+$0p$KiNk%w1VGsZi0K^{vm&^QekgmYr{p|7f@`-!{kQek_v(coU0;6qDX)Zyx}*Zi8m)~L(gXrJQS=kF;oLq0`S z;_2{wp}qhA|NsC0A^8LW0018VEC2ui01yBW000G;peK&x_?=!BMVDn6M%M*_hejDO z=sV#*2b(8CC>V``q~ZY-T@=Sc5`j=yAtDPDDZn5YjEVy5(Q*-(Mc6SG8K9W>VlHv8 z6K+K}y^#1D4Fq@|9RpKge}DuNB860I5`YZ=9E=_T17B;B000>qA^{3t6?TA~00W>N h2NViD9I+f30}&db2e}Xs2?-Mu8ygyACB-Bm06V+Tcya&$ literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_package.gif b/hangar/static/images/page_package.gif new file mode 100644 index 0000000000000000000000000000000000000000..d94a07586d1a4a4f8fac1eb8e83e1eb73066a905 GIT binary patch literal 640 zcmV-`0)PESNk%w1VGsZi0Oo%HDKSG#S#e2JX--~wJw#PPOI_^Hn)TC@>c)Yo)BB>( z`}_O*o6Y;>?e><+`=rtPp3eL2_Wr@&{qptsuG8iJ_tdD%-Q?@?j=}Nm&5?SKtLE+V zMNeVA-u+s6o!#f}t<&ZC?$_h&_psOeTY8`U`|-e+M!Vhp)sh;py+mpH8^i{lww@ z?(p*O@$`zl@A}=M|Nrp+|Mil{`~U2-`{%%`i9_e__y7CuQDJ^>j<5LTxu3(=`{%!V zp1QBl;^gb~@%8xAv2fGp@UYV3rqTPL&-+10SBS31*XQuXoK4~A@Z;+7Qe%KsXN0ub z{dASF>hk%Y&-?!S^5pOJ zxG6Ab&z>U{z*&SS!@&nNgSrH;&#C>Arw0fPbbPzJ^YGE*2>n}L8P(di}#f`-!{kQek_q(&TBN;zLVZ)#vbFn&Fzj)~L(g-skTrF+)B@RpROJ ze4)L|%+de<|NsC0A^8LW0018VEC2ui01yBW000G)peK&x_?;dVMVDm}1jhw|hep&O z==8z~GHrORSgnM6@HQ4;4*@!6xGR+fIw4vg zByI*g?ikQL90EyhXA2I80}~>FNeyv^hX5Oj9sz=0a*zN37#bo03T1_nn*yF52n7l~ d8?74{0v#Ej2(=Ip2?-Mu8X6f_CBY>j06X7qcdP&a literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_refresh.gif b/hangar/static/images/page_refresh.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc238461e70d12e4668c5f1b4bb3bb3dbe3936f1 GIT binary patch literal 286 zcmV+(0pb2fNk%w1VGsZi0K^{vm&^R*?DTb&v2L1Dsnh$W=Vn)Mk%+FxwAuXa^Z7|t zYxDN`m(yE*uvn1GSBbmp+2`-Z;{K@1-k{IpeK&x_?;ePSyGlAhad|cYC*xE z4?!M0hMLEcD;OENPT~O+NjgvrhEZWC6AOwc(}_f&j&KKo$Zi+jFT+t86U@-K97=dA zJRM_UOh(iR69IR51sG6d9d#3d7kGtJ4sn1J00E614Gn8y1Csy%5E~u?9t%62i=O}q kq8c^ugJ^H(N}PhzTW*xS8en5 z`K;9Y)#&u=@%HWZ{$Y(oiM#CM@&2{h{C=@pQek_q(&R)0^Wd0C!G+n zlaI;dJ$VQSbshl?No8ga5gY^-B7;c`5fL4T90QAugkK8_9f<=285@lX2$~BVm7fiw h9tRl;JU%@c4F(#G2e}j!2?-V!8ygx}CB-En06S*Zc{%_9 literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_script.gif b/hangar/static/images/page_script.gif new file mode 100644 index 0000000000000000000000000000000000000000..44717b30690299c0cd7fbc862c5cdde2cce8f0d4 GIT binary patch literal 277 zcmV+w0qXuoNk%w1VGsZi0K^{vbd<8!acxamZv6fKfUwP0ZH?sY^w{e6>hboD!SUY9 z&A8LBgtCQ5f=2fF{I1gE)!pBs(EGI6{PXtu!{Pm?%ibw5LqA7X;py<2ztzm-x0A+r zICCn`S5p7~|NsC0A^8LW0018VEC2ui01yBW000G&peK&x_?_PIJXMwv1Rw(*`Wy!0 zh=Vs7i9*fu(DeeHK)^FV5QLt}pyNSyuGG!|inxlF9`6+*x(*uTGIg5OQW}h~cM)Nm z-vqg5(TF(2S`8Z-A`cu5Y$6zD4RQ($Y-s>f0}^_59S#>F01g9{2OlVvWhva(BkE?Jk7y_{rc&ezt!Z$BH-xo z%goW-wjBTe|NsC0A^8LW0018VEC2ui01yBW000G*peK&x_?;e9tyxA8LM(V_1t|%h zE4;zbo=)S^C=Q4N#OoLIEIgP3MgvG95X_FJ000~uj>8}l!HTqng+u}XkIPx74ikb81{;n72?H1l2aE=pn+OpDr~`SU e1__P~5C}U88?_q=9GeWgyaB$yOeMl3ApkqX9(&>d literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_settings.gif b/hangar/static/images/page_settings.gif new file mode 100644 index 0000000000000000000000000000000000000000..af4099724f0e474e4bd3c28a41892e72dcc8f057 GIT binary patch literal 298 zcmV+_0oDFTNk%w1VGsZi0K^{vOj&P^tH!Lv+4J}Nn#}vB();D@_15O}RA`2@+5Li^ zxv0F*b&;>__5H%$`t0%d#nt7`G1#m|NsC0A^8LW0018VEC2ui01yBW000H2peK&x_?_NiZ34#yfub;#hgyg6 z=)2)hwU1{*Sr`S5q@yvJAVkK2^uR$b8-wR!fR%U;kVRsg^$0uzNkbhuD8_{Wz=OFA z9*Tt|5`f3&0uN~m9uOBX1&IcL9%~X10SgWYi3A239v2r72Ldn(6$}Lg1RacD8X0pX)FmMRJE^0D6#xJL literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_sound.gif b/hangar/static/images/page_sound.gif new file mode 100644 index 0000000000000000000000000000000000000000..1526ad11ca47ac3c7bc8a6dfff3293c767409795 GIT binary patch literal 407 zcmV;I0cie5Nk%w1VGsZi0M$MK;_2|mhzbdRA0#3y1~`U2JS~cg z2r(5ZFF2A1lp_SAJPj!oAtg06JD`X>5d@_eCNL{CGCKo8H!iR|kvJVEGBN@!@0s<2SygCRPJf67F0yfk=G#ffx0ObG^HXIbZH0?7p2L}TK1qBp&MfpWR06Uae B!1MqB literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_tag_blue.gif b/hangar/static/images/page_tag_blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ceb96ced609960bec191a8bb96bd7824ac2b476 GIT binary patch literal 288 zcmV+*0pI>dNk%w1VGsZi0K^{vC}X&dvBOcONHvIIr_=Vr-~3Nqc8$OA)#mo$>F}t@ z!6lI7Ku1?6lDm(^(^ZkoG=w+D_aj1-O>gijRUbT$M51ORY2IR=sQ2~k`e4@jcZ;dr*2hgZ^&Oa=(@mJ79tu>8x8}H4+n7^44xPp m2n4RLNU0tj6&N@h3Awo(78#yo9R|V%48;r?StZIPApkp|4|%8n literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_tag_red.gif b/hangar/static/images/page_tag_red.gif new file mode 100644 index 0000000000000000000000000000000000000000..4aa2416b6a7364209194883ad2c7bdbe9ba85cff GIT binary patch literal 289 zcmV++0p9*cNk%w1VGsZi0K^{vC}X&dvBOcONHvIIr_=Vr-~3Nqc8$OA)#mo$>F}t@ z!6lI7Izmz>lDm(^(^ZkoG=w+D_aj1-O?gijRcXf^}^1ORY!I30t?$=N^@7smsV&|p2>%>yiHNG1aW2W##` z00hdyErAfOb65oc3JrS@Qh#-G8v+w>R09AAbsiaW2@n$kRFh^FA{kd34g-=82XY+@ np*RQxu(3$29vBrJI2#GOyB!v^85qI_#0Ct<$66)JB_RMiBn5e( literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_text.gif b/hangar/static/images/page_text.gif new file mode 100644 index 0000000000000000000000000000000000000000..c1132e472e3ace1a1afa804797a962c9cb26dc5f GIT binary patch literal 276 zcmV+v0qg!pNk%w1VGsZi0K^{vn#}uilCY=J`|R=dz@R2&2z3Q5F} z>qOreH4lW4C>9+^M&l>CFcO`pw8N-AM3yJgq3CuujH~DHoJxhgmVG_m>3!&0SsJ)n3w~b9tH~xJRGVV a7y}R)oCdNF4+sbm5gHm9VkN#LApkpIqkK{T literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_text_delete.gif b/hangar/static/images/page_text_delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..f3178ab40a4af1d9d2ff0dca5db4193aaba14763 GIT binary patch literal 277 zcmV+w0qXuoNk%w1VGsZi0K^{v#o_%-S#Oof{Bx49s?+=C6BGVcR_yThh^*A&>he}> zjJDeR)!XEayXn5({r>p)@b&uth=~67_KdU4qQmEYq`;1^)G0ATK}lJ#*ZiQ*`~Jwt z<2pRc%+de<|NsC0A^8LW0018VEC2ui01yBW000G&p!Z0gSf1slK3w5#TrySkFnDTN z6ov;uhlH@9z?BRIP6^;>LK;L-%VUUmELh7AQj`>|r-eAP$Up)p041A65YD9u1Rx$~ zGK4qUQ<<-^2!Rb6340X>4t9BYgcv1<4r_svg9(lv1BiEv8X5uumL&raV~m}j2bT&A bKtirU2OSrp3bhIWxEQ(^7kenbz##xTpKyN? literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_tick.gif b/hangar/static/images/page_tick.gif new file mode 100644 index 0000000000000000000000000000000000000000..d7edd0c0dda178bed8626ac89cb09366617d4401 GIT binary patch literal 385 zcmZ?wbhEHb6krfwxT?bN=;eov*Z+L{`oq~f#xpc~>Zw1o4qUTy4ei|hX7`=H>n=at zcI(fEi;u59|8Vd5`;PS|R-C@4Y3Tg&{g*_1Nk3arbyFchZ7%)&9DE?$&WMEKX&;c0?@)HBwyaN*p zJY**IEpBUKG?b9z@0()mq$M@qC+zo2CB3VHkA=0S8)oo7(r&3Zqu8S`@xu*Wr^CN> z1U$vK8RaUJ*_3OPq?Du?6`Gxul#4pMd;3_Nrqp&xD=5gy%FmeDHD}%eQF&&kkSTNL z%ZiFJtX7thl%Bdll$Di_eT^Jv&+<)sB@ZZz3(LhYoM+&Z6cJn_eqBtAg@u`!on5fS K^|6a1gEas?Jc^V6 literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_tree.gif b/hangar/static/images/page_tree.gif new file mode 100644 index 0000000000000000000000000000000000000000..847274e6deb460b26fbf7694a2af62eed630769f GIT binary patch literal 287 zcmV+)0pR{eNk%w1VGsZi0K^{viLcF0TyuJyy0+T+@?)NPT&~mQU4=u{I#ouI z>xPjfjGBjIco>g^fg=G3dN7V71p=WA3J!7Z(|59s&hP0}TWO0EHI@8zPE~00;yPk{OkWi;WVR1OgWco+1qn l17&5Brv;x36%IT;8My@=8mbJx0l@(q#2XrjCCMZq06Sn3cRv6C literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_up.gif b/hangar/static/images/page_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..08ef934c720dd9d83fae91aa0d6dee9988f0a586 GIT binary patch literal 283 zcmV+$0p$KiNk%w1VGsZi0K^{vlFeIom$aG8{N(KQh_A@U_5SPe_F;`giM#Bz+5CR7TT)?ruhQg1O<$V8)~L(g;_&|7=V{1WCH>eT^7f}oo!BE(C zI|xD|aX1*{b!uJ+7Y=;~1qE~*Y8x5_0|syh3kv`U90DSa1O)*S1(g;E44Io61ORdX w4h{$u3=o+$xO%lvhfvA5g(-(Z;21fJ!QjF8i4+e`VngL9A6TGAA*Fh)*T|Ez>6kkkaN!~LEH({}S-u$* z)&|i6(@2>870~J9r{|_y7O^ literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_user_dark.gif b/hangar/static/images/page_user_dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..6ee2c1c81eff878190524a83a92432b69a7b7f93 GIT binary patch literal 283 zcmV+$0p$KiNk%w1VGsZi0K^{vxZC`5kgoIg`dn>>#p3q7(BgcbzS!sRjI+#^ywjh=*tWjN zDKSGrOI`o}|NsC0A^8LW0018VEC2ui01yBW000G;peK&x_?_NWty+dTmK6jZT3w2f z>q;LbHBUuBC>jX>LnJZ~RRl)LU_eP41Wk_yS{!sb1AtiY5M{UoFBrgJkVP1@l-hP5 zL=LW)U2iDv9u@{j6bT0h2^I~09U_7N0bi0G0Sy<89svdvlam$~6Cwcu7E=!ohldFU h2qFm*5(}~m1sk>y3ml?T1E+^y69^n-CB-En06PY7aTNdn literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_user_light.gif b/hangar/static/images/page_user_light.gif new file mode 100644 index 0000000000000000000000000000000000000000..2b7a924b79d3e946d246bc34a3a9bb58859cceae GIT binary patch literal 287 zcmV+)0pR{eNk%w1VGsZi0K^{vm&*Efm$dBh_T}yMh_A@UqDO)HP2*FC>9yWM&c*JG>nnO!oX-)B_hkSD3wOO4Xj6N>~12LOISpBA`Od;A#G?V z*bOA(i#GTNcOC%(ZwVO?3jlu=?5f&vB`8xRna4h{(#9gPi;k)IEt l4g#ef2nP*30~)p(0uvmK2)z;#3JMey9UUBECCMZq06Ui+der~` literal 0 HcmV?d00001 diff --git a/hangar/static/images/page_video.gif b/hangar/static/images/page_video.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1c50325d4e7c8bc68aee940cb1e31a967a04cbf GIT binary patch literal 384 zcmZ?wbhEHb6krfwxT?%>;Qrr7FF)+Q^LN{=KM4i(8?XPda}9O&j!7x1_YBSM-2G<7 z>3dh7f7o#Gv8JK(z31;|9k{mc^3#s>C!%xfuHJrf`pm_k#Om;ZiBnJgS$*aAl8e9R zo%>xjeaoAV-#&f&_4Mu6fQfzDQV3lmHNLB3XlkDcKkXBHXm_AccN=kl8YsVrfX?gaFs+yX54ryt|(c9su)BEc2_m!ruR&9+;T5_U| zW%Bm=yxsku&-=#W{nO^x^s`L1+WfE5peK&x_?;dlN!WD_Lm&qpDp7)= z8$vH=h?+-Ya2Sn@SXRxS% zA)5`mP%w+=Y#bXR8yS28asdVv5E&U89UTe{4FVG)ib-&gl9iVpnPV1w3Xua8p8*RD kaC{919UdB=2m}i}K0OB_8kh*b2noUy#7w;<$R!~FJ8t!Sd;kCd literal 0 HcmV?d00001 diff --git a/hangar/static/images/table.gif b/hangar/static/images/table.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5daec441e2b1e16812e7ae0a2bdc7bb4716b402 GIT binary patch literal 270 zcmV+p0rCDvNk%w1VGsZi0K@>(BfBbkK5_=bdav(>+?xfYwPj$o4nUlk-2!E zx;=NfjI-HMVS9nC*+WZQ^7Z)Y@A~KN^@FO#jI+$q*4-&FLq0`SW}w+Vg1MKs%aOFV z;OOt_^#8uv_5c6>A^8LV00000EC2ui01yBW000Gx;3tk`DGou3Ak?HN1R)S&Fi1nL z=Tgj?BLG6I(bUaRI$07NB5E6uE%iS^xRzyS-ElJ UtPKqY1`iJx7Zz3~xFR6{JAYbm8~^|S literal 0 HcmV?d00001 diff --git a/hangar/static/images/table_delete.gif b/hangar/static/images/table_delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..99190cd537e1527167d75a2538892f5b8eb35673 GIT binary patch literal 274 zcmV+t0qy=rNk%w1VGsZi0K@Il(6O#6aM%2{#I63Z;#~b^WNw2NmXl?xY_@R zh&^|?@ACGFve{8#dx5RlLrYwYv&?>^z}4I2=kE3?F+)B@Rc4^s<2pQ%w734q$d|Xv z%goX0^#8uv_5c6>A^8LV00000EC2ui01yBW000G#;5Q7PSe~ee37>`?kt79l5uAcR zd=z#32g<~8A_y?0g>uO#s8|HWr_=FJ9~9z1AU%1$--dyB+EA_4>$nu5WWaFG!+@Zx4G)?C02dbk43r-Q6AV2Ds0Kd_ Y92J!XunrCg2oMk!78PVEyeJ_6J1VtyLI3~& literal 0 HcmV?d00001 diff --git a/hangar/static/images/tables.gif b/hangar/static/images/tables.gif new file mode 100644 index 0000000000000000000000000000000000000000..87246be87fa2d14ad215816bcbc9f201cd44e905 GIT binary patch literal 276 zcmV+v0qg!pNk%w1VGsZi0K@q`-``%vyP#mb}xS#Mr3I-qF_GDKSGnMOD1n|3rVz z;OOti;Qx4{&j0`aA^8LV00000EC2ui01yBW000G%;3tk`DFRJnRg@IHf-nhU11vzU z=g?);2?AnxC~g7)#qVQLcs?Cb)Psa9D-cg-%k?A@1BQt5ct)Wg&tef4Ny;4|(KslG zB3aK.\n", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "dir", + Aliases: []string{"d"}, + Value: "./data", + Usage: "Directory to serve", + }, + &cli.StringFlag{ + Name: "name", + Aliases: []string{"n"}, + Value: "DLBase", + Usage: "Name displayed on the site", + }, + &cli.StringFlag{ + Name: "attribution", + Aliases: []string{"a"}, + Usage: "Overrides the attribution in the footer (HTML allowed)", + }, + &cli.BoolFlag{ + Name: "no-header", + Value: false, + Usage: "Disables the header", + }, + &cli.StringFlag{ + Name: "header", + Aliases: []string{"i"}, + Value: "/static/banner.jpg", + Usage: "Sets the path to the header image from webroot", + }, + &cli.StringFlag{ + Name: "app", + Value: "GoHangar", + Usage: "App name displayed in the footer", + }, + }, + Action: func(cCtx *cli.Context) error { + base := os.DirFS(cCtx.String("dir")) + + myHangar, err := hangar.New(base) + if err != nil { + return err + } + + myHangar.AppName = cCtx.String("app") + myHangar.Attribution = template.HTML(cCtx.String("attribution")) + myHangar.NoHeader = cCtx.Bool("no-header") + myHangar.Banner = cCtx.String("header") + myHangar.SiteName = cCtx.String("name") + + err = http.ListenAndServe("localhost:8123", myHangar) + if err != nil { + return err + } + return nil + }, + } + + if err := app.Run(os.Args); err != nil { + log.Fatal(err) + } +}