commit 75f854f0b1f7aaea04903837df802d28b1075869 Author: uosfz Date: Fri Nov 14 22:16:10 2025 +0100 poster for TechHSG 20251113 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f9a69c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/config.mk +/*.pdf diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ea91c94 --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +include config.mk + +.PHONY: all +all: poster.pdf + +%.pdf: %.typ + $(TYPST) compile --font-path fonts $< + +.PHONY: clean +clean: + rm -f poster.pdf diff --git a/README.md b/README.md new file mode 100644 index 0000000..d411e1a --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# Promotional and other materials for KarlOS + +## Building +- copy `config.default.mk` to `config.mk` and customize. diff --git a/c-logo.svg b/c-logo.svg new file mode 100644 index 0000000..2e0f43d --- /dev/null +++ b/c-logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/config.default.mk b/config.default.mk new file mode 100644 index 0000000..4fb59e5 --- /dev/null +++ b/config.default.mk @@ -0,0 +1 @@ +TYPST = typst diff --git a/fonts/Fira_Mono/FiraMono-Bold.ttf b/fonts/Fira_Mono/FiraMono-Bold.ttf new file mode 100644 index 0000000..23bc30f Binary files /dev/null and b/fonts/Fira_Mono/FiraMono-Bold.ttf differ diff --git a/fonts/Fira_Mono/FiraMono-Medium.ttf b/fonts/Fira_Mono/FiraMono-Medium.ttf new file mode 100644 index 0000000..793c60d Binary files /dev/null and b/fonts/Fira_Mono/FiraMono-Medium.ttf differ diff --git a/fonts/Fira_Mono/FiraMono-Regular.ttf b/fonts/Fira_Mono/FiraMono-Regular.ttf new file mode 100644 index 0000000..67bbd42 Binary files /dev/null and b/fonts/Fira_Mono/FiraMono-Regular.ttf differ diff --git a/fonts/Fira_Mono/OFL.txt b/fonts/Fira_Mono/OFL.txt new file mode 100644 index 0000000..029b036 --- /dev/null +++ b/fonts/Fira_Mono/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2012-2013, The Mozilla Corporation and Telefonica S.A. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/fonts/Fira_Sans/FiraSans-Black.ttf b/fonts/Fira_Sans/FiraSans-Black.ttf new file mode 100644 index 0000000..113cd3b Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-Black.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-BlackItalic.ttf b/fonts/Fira_Sans/FiraSans-BlackItalic.ttf new file mode 100644 index 0000000..1c49fb2 Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-BlackItalic.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-Bold.ttf b/fonts/Fira_Sans/FiraSans-Bold.ttf new file mode 100644 index 0000000..e3593fb Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-Bold.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-BoldItalic.ttf b/fonts/Fira_Sans/FiraSans-BoldItalic.ttf new file mode 100644 index 0000000..305b0b8 Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-BoldItalic.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-ExtraBold.ttf b/fonts/Fira_Sans/FiraSans-ExtraBold.ttf new file mode 100644 index 0000000..83744c1 Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-ExtraBold.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-ExtraBoldItalic.ttf b/fonts/Fira_Sans/FiraSans-ExtraBoldItalic.ttf new file mode 100644 index 0000000..54bcaca Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-ExtraBoldItalic.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-ExtraLight.ttf b/fonts/Fira_Sans/FiraSans-ExtraLight.ttf new file mode 100644 index 0000000..2d4e331 Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-ExtraLight.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-ExtraLightItalic.ttf b/fonts/Fira_Sans/FiraSans-ExtraLightItalic.ttf new file mode 100644 index 0000000..ef666ad Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-ExtraLightItalic.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-Italic.ttf b/fonts/Fira_Sans/FiraSans-Italic.ttf new file mode 100644 index 0000000..27d32ed Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-Italic.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-Light.ttf b/fonts/Fira_Sans/FiraSans-Light.ttf new file mode 100644 index 0000000..663d1de Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-Light.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-LightItalic.ttf b/fonts/Fira_Sans/FiraSans-LightItalic.ttf new file mode 100644 index 0000000..d1b1fc5 Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-LightItalic.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-Medium.ttf b/fonts/Fira_Sans/FiraSans-Medium.ttf new file mode 100644 index 0000000..001ebe7 Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-Medium.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-MediumItalic.ttf b/fonts/Fira_Sans/FiraSans-MediumItalic.ttf new file mode 100644 index 0000000..b7640be Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-MediumItalic.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-Regular.ttf b/fonts/Fira_Sans/FiraSans-Regular.ttf new file mode 100644 index 0000000..6f80647 Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-Regular.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-SemiBold.ttf b/fonts/Fira_Sans/FiraSans-SemiBold.ttf new file mode 100644 index 0000000..0c93b7e Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-SemiBold.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-SemiBoldItalic.ttf b/fonts/Fira_Sans/FiraSans-SemiBoldItalic.ttf new file mode 100644 index 0000000..e1a2989 Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-SemiBoldItalic.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-Thin.ttf b/fonts/Fira_Sans/FiraSans-Thin.ttf new file mode 100644 index 0000000..c925f94 Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-Thin.ttf differ diff --git a/fonts/Fira_Sans/FiraSans-ThinItalic.ttf b/fonts/Fira_Sans/FiraSans-ThinItalic.ttf new file mode 100644 index 0000000..dd39092 Binary files /dev/null and b/fonts/Fira_Sans/FiraSans-ThinItalic.ttf differ diff --git a/fonts/Fira_Sans/OFL.txt b/fonts/Fira_Sans/OFL.txt new file mode 100644 index 0000000..0d0213a --- /dev/null +++ b/fonts/Fira_Sans/OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/karlos-logo.svg b/karlos-logo.svg new file mode 100644 index 0000000..e180695 --- /dev/null +++ b/karlos-logo.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + diff --git a/kernel-diagram.svg b/kernel-diagram.svg new file mode 100644 index 0000000..efb2782 --- /dev/null +++ b/kernel-diagram.svg @@ -0,0 +1,2 @@ +eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1dV3dcIt2xffev0Jr7+tE+OfhNOUeUr+/SQoBcdTAwMDCJIFx1MDAxMZS8/N9vVWtGdDjdNKKReuaTbI9nXHUwMDEwNFx1MDAxZE7V3lWnatd//rGw8GP4cl//8a+FXHUwMDFm9edqpd2q9StPP/7C11x1MDAxZuv9QavXhV8x/9+D3qhf9d/ZXHUwMDFjXHUwMDBl71x1MDAwN//65z9rvWqnN1x1MDAxOHp3lX570Fx1MDAxZjXrpd7Aq9XfPl5v1zv17nBcdTAwMDBcdTAwMWb4X/j3wsJ//D/hN61cdTAwMWFcdTAwMWVkefHx7Kp3f1S9XFwmJyfHV4/Pl1x1MDAxYjv+R/03/Tqrfr06rHRcdTAwMWLt+vhXz/C6UtRjklqqOaWSXG71/ttcdTAwMTf4bYlZ41x0RoUwXFzCb7VcdTAwMWT//qlVXHUwMDFiNvGiKPWEJIJZqTk3ivH3tzTrrUZzXGLvoVx1MDAxY7+FXHUwMDE4oog0yjBh39/zdk7/WiDvr1xmhv3eXX251+718cT/h1pNq2x82teV6l2j31x1MDAxYnVr7+9cdTAwMTn2K93BfaVcdTAwMGb3afy+m1a7XVx1MDAxZb74R4ebXHUwMDBlj+RH5DvOfl6CiLye9Cn40kazW1x1MDAxZlxmQufbu69UW0O8XZSMX8UzvN+s+Y/t/8bn1K906pv43Lqjdvv95Va3Vsen8aNCQt/Wrf38tl/PfPxA+c9X/js+93pcdTAwMWRcdTAwMGZs4DlaeCDm/Vx1MDAxN+NcdTAwMDVINY2+utfr+ovRXHUwMDEyXHUwMDAxT8dQNj6pwVxurL2hf9CbSntQXHUwMDFmP1x1MDAwMTyz1ei6XGauzdDSXHUwMDFi1p/HjyWwclx1MDAxYreys7u+d9hcdTAwMWa+XFytna9cdTAwMWUtba69sFx1MDAxZu/v++9f7sO+fdicXFzddVx1MDAwNs9Pd3WyVrk92W9t3O9uhr/l1/dX+v3eU9bjLo0692fSXHUwMDBlK3fV48VGab3Tuu0v5nDcy3V7e9N5eVjceClcdTAwMWQ/jJb3R4qd53Dc3edKe7F9eH62/3xy0G/0u3pnrZzDcc9vtm4vjo5cdTAwMGWrj627zcOt56Pl49VGXHUwMDFl5/u0d1JZt5t8e3S5vKZcdTAwMDavK63zTlx1MDAwZce9alZOrzdP+Wi9unx4fLx+V1x1MDAxZnGbx3rYZlx1MDAxN2zl6vSgcX9VXeYni6enw+Nsx/35t7H1j+5rlTd7olpRXG6ukkltx4babnXvoq6h3avejU3wXHUwMDFmgVx1MDAxM47ggNuaYjhcdTAwMTAyRlx1MDAxZlx1MDAwMjSVXHUwMDFl01x1MDAxYXw055KBd45AgIRfW0WEhLNcdTAwMDVcdTAwMGaux7//XHUwMDA1XHUwMDAxlHBPXHUwMDEw+KFcdTAwMTLeos3Yu78jgJCF8vgs8vpcdTAwMTd6fOr2+KF3/3TtXG5cdTAwMTaLJNyMvzPg2kns1V+uXHUwMDFksN0oQlx1MDAwM4gwhWtPX70m8K2TV+94MeJcIoSL31x1MDAwNsLTXHUwMDFiXHUwMDA0XHUwMDFlYK87LLdefXxToVfXKp1WXHUwMDFi77hcblx1MDAxZGSx3Wrg1f+owvnW+z+Ct2DYqqJr/PmGTqtWXHUwMDBikp8qXHUwMDFjtNLq1vubWVhUr99qtLqV9nHCiVdGw95RffB26sP+qFx1MDAxZbwr9Y13XHUwMDFlXHUwMDA0LCjFhF/t1Ynp9k/PbGlNtFY629vtrevMVFx1MDAwZXCfeVZcdTAwMTPgcoDlXHUwMDEyLDZkyEIxXHUwMDBmTNRcdTAwMTBriFx1MDAxNFaKOJWjgnvwW+BnjElcdTAwMDbHXHUwMDE4r5h3Q1x1MDAwNr6oNSwmMFErXHUwMDE4V2O2N9mub4ipXHUwMDEy8jdhcmxmJkcp8HFKNVx1MDAxM8Fl/dPeVfzVd3tnRHPg4oF3zJ3LXHUwMDExff3c79ny0d5e52B3p3zTvuttfDU3WtT7K/TqtFM6Obs/Oa4v8Xr3Nlx1MDAwZk5Qu2t0j5vWqKPaLrurrTavdV/ncNyHjr476akytXd07fxm7dE2Xpo5XHUwMDFj96S2dHNh7H335MiuNVx1MDAxZoYnXHUwMDFil89HReQw7lWUgcNQoFxmXHUwMDFlXHUwMDE4XHUwMDBiZ5ZKTlxy0WHfZ4jHXHKEnkIpidZcdTAwMTFzfXLMT95dXHUwMDFkm4azzN+3XHUwMDE1iLPw7JyFa6KkXHUwMDAw/uHwYdLI6KvvPkxSyoxU4kM+bK6kZaXfelxmUo1cdTAwMDBpYST06rxJy1x1MDAwNL5cdTAwMTAlLdFcdTAwMTPPh7RcXNdcdTAwMTZ3W+y0Uj7T1Y3+5kDddY872UmLMJ4ynGLcwFx1MDAwMevCnEWCVTNBXHUwMDE1RiZWXHUwMDBiOrbqd8pirScsXHUwMDEwXHUwMDE3w1x1MDAxOLJcdTAwMTI1PsC7XHUwMDFkm2LZcYE4ipiZo8BDMZq4zVtLXHUwMDFkffWXeXMhXGJTQDI/j6HcXdiTcmV96XZLKfV42Ti/4u3HT8hcdTAwMDKkXHUwMDFl93Cttd/tvz5cdTAwMWOePVxm2XK7tn+/vJdHXHUwMDE2a01cdTAwMWWro/LZoXm9vK7VyqX1zYOdjFxm5XNcdTAwMTHf/VSyIL6xXHUwMDFlmD3lVIPn0PDXkOdQhE3yXHUwMDFj1HhcdTAwMTI+x1x1MDAxNLdcdTAwMTTCYzl20u+eQ1x1MDAxN8tzXHUwMDE0iFx1MDAwMcjsXGaAanhcZlxubrTTR6SkLSyXQFx1MDAwM1x1MDAxNJtL3oJOsX5jXHUwMDE0YLfe6fVf/t3drXQrXHL/O//dLVx1MDAwMiGYgMVRQvB2XHUwMDE5XHUwMDBi7qvIh1x1MDAxZFB21HwunW3dbV49ndOTrnpuvUyR0lDKeopcdTAwMDB150JcdFwiZWR7ijL4tdZCK2mlMlx1MDAwMcL+buWSeFx1MDAxYVg/XHUwMDAziqEwwzm2oTE/XHUwMDEwXHUwMDFlZkxcZsRcdTAwMGXghKRcdTAwMWX7ilwiXHUwMDE4fYHogpo9paFcdTAwMTngvuXOlFx1MDAwNufJvlx1MDAwMHdcdTAwMTfhKX9mSuOptPzU2FhRZ1x1MDAwZluNXHUwMDBiUdna0ne9s6/elqnX641KTZrOxmX3gVx1MDAxZa6+tsXdQ1x1MDAxMYHdffeyXHUwMDAwu6baXHUwMDAzgzVcdTAwMWFw21x1MDAxOFx1MDAxYtmOgIhcdTAwMDBOU1x1MDAwMDRwzYVVNGbyUnjwaanRXYDTUMxcdTAwMTXak0LZeIGAXWdcdTAwMDd2XGK4XHUwMDE4sSzolVx1MDAwM8acnJ80XHUwMDEwr1FcdTAwMDWsYFx1MDAxZbjOpli+MVxcX2lccu7blVx1MDAxNyeU08/dkJhcdTAwMDCcsdg+eub5wHd3W681n7eu71dONobyeWu93Vt9nVwiuCfEQ1xc1sZQq1x1MDAxOVx1MDAwZkf3XHUwMDAw38qz1khcXENcdTAwMTLCQTbeOFx1MDAxY1eXaKD5klx1MDAxM2aItNzwsb2PWTrgt1x1MDAxNVxmXHUwMDE4grLCcDP2YEWw7Vx1MDAwMuG3mVx1MDAxZL+t4URx4+Ty3MZqTsbpPClcYkRp/Fx1MDAxM1x1MDAwM/7O5Uq73Fx1MDAxZnTvNjZcdTAwMGX1NdPVi8GR+eryklx1MDAxOfA79bj9jc3yId24f1qv3tLVS31eX1rOY6tj9Wq7bG+6ZpvR6sVcdTAwMGWvrb+qhipcIt9wP+0sfENw7qH/odxqYFx1MDAxNVFcdTAwMWZFmEdcdFx1MDAxNUhaiWSEu2JcZupRzEAwYSXu1zn4xndcIiHBJ9nsfMNcdTAwMTJmXHJ8pTN2MIm5RmCLUlBcdTAwMTmomihcbt0oXHUwMDAzaNYq/drCTuu6X+m7eccnp1x1MDAxMCYgfpR3JF9CPlx1MDAwNIRcdTAwMWaUOysrz7rdOaJrh8dcdTAwMDel887KSWZcdTAwMDJcdTAwMDKWXHKRXHUwMDAwXHUwMDA0/YQoXHUwMDE1XFxcIr5pXHUwMDFi+G4waOBcdTAwMWSSSkKla3eBe1hcdTAwMWJrgaKAYWtHPVx1MDAwNJBcdTAwMGamiFbcKqtcdFXjx1JcdTAwMDRDL1x1MDAxMPlYnJ18XHUwMDE4XG5GR1kgJFxmOFx1MDAwMFx1MDAxMYtCfjlcdTAwMDAltCAmyFnmzj2a3fXXK772UN9obO9396rnu43y81eXMtL6xSpcdTAwMTXDilGbN/WN7vFFa1Pf5lFm8WJ36vulXHUwMDAx1euN1yvS2KSPS+3cOIIwRufEXHUwMDEx3E8lXHUwMDAzR5BcdTAwMTJcIlxmiSlcdTAwMDdqlVx1MDAxYUcpvlx1MDAxYpHCI1x1MDAwNsJcdTAwMTjCMHtIXHUwMDAyW5jjuiozkSB8JyRcdTAwMTL8xtJcdTAwMTS1XHUwMDA2hlHwwsJcdTAwMTWcMMujr/7yXHUwMDBmXHUwMDEyXCJcdTAwMTPN9Mdyi3ku3ThBqFx1MDAwZkf3/1xcPjhZ2ERUXHUwMDA33HVcdTAwMTdLfnJuYlx1MDAwMijHOELaVeREXHUwMDEzrm6Hj4uKX9+sXFyX1LD8VO40XHUwMDFjhUNJNEEzT3JKJHBcdTAwMDVGXGbX4W1cdTAwMDZupFx1MDAwN1x1MDAxMKJcdTAwMTix3ECAoFx1MDAxZJWTlvpOXHUwMDAwTFx1MDAxY3yE5MKRc1x1MDAwNKaA+1x1MDAxMFx1MDAwMF9SWFxiJb63XHUwMDE5XHUwMDEyLH55dqagsCRcdTAwMDRusTMzyWP8YZyZhFx1MDAxMIOazyxLkK1juXTRrV7Zx5FqrTWXXkeLV1/dTLHR6ax32Ea7vjTs9Wus8rLTXHUwMDFjXGZzQ/RcdTAwMWOjfvfdy4DoQoBNc041l7hMXHUwMDAy28F+vSAlXHUwMDFlJ1JcdTAwMWIplcTKpHhoXHUwMDAwn8dNXHUwMDA2yqnFgjJXaPBcdTAwMWT0J1n4SnZMXHUwMDE3Vlx1MDAxOSHgfy5LJomWzITE8oFcdTAwMDLuMVx1MDAxY7c6dSeIf3KgP1x1MDAwMTKjIFx1MDAxZT7tfFC7dGhrZyNd3urXd+g91y/XL48kM2prLOChmNjRzFxuXGJcdTAwMGVDJqyIJyCsV5ZDcFx1MDAwZVZuXHUwMDFktFxcXHTPUGklXHUwMDAz9k6Zi5ZcdTAwMDNmw1GYXHUwMDAy9k7Ba/HvrYVcdTAwMDSLXp1cdTAwMWSzpVZ+34nD0Fx1MDAwNUmuJDRcZp7uXHUwMDA3i4Q+XHUwMDA22XVFN1x1MDAxYcds93Hx6fjg+ax8/nJzsPvVfZW1J3Lc3FtvP6tcdTAwMTUrXHUwMDFir/tPZ6evyzlcdTAwMWO3Ur5/3VRcdTAwMWKNh9ZcdTAwMWVrSHm0tNk52ihcIlx1MDAxNXA/lVxmVEBLYP9cdTAwMWHCemtcdTAwMTQsQVx1MDAxYVx1MDAwZe+B+1OIXHUwMDBlXHShilx1MDAwYsVcdTAwMDPr7JdcdTAwMWKxylPIXHUwMDA0hIboU1vl6H78Zlx1MDAwMkl+Y22KOkKBKVx1MDAxOFx1MDAwM1G1i1xu2MRyXHUwMDAzJuHxXGKl5lJGOFx1MDAxM1x1MDAxNVhrteuDl8Gw3ilcdTAwMDIhmIDGUULgOvl8aEFlUN7ZXzuqnV5tVJfJ+lbzdvfMZqZcdTAwMDUlzq1HlVx1MDAxMlZzJTVnamx8bzt6KEZBleGcXHUwMDE4XCJcXO3MmO4z8IRcdTAwMTUnXHUwMDEwXHUwMDE5XGJcdTAwMTcxUMZcdTAwMDNaobAgQcBcdTAwMWaBpulcIlx1MDAxOHiBiMH6zMSAXHRcdTAwMDGPQFx1MDAxYZfZK5lcXHLgx/8q6C7mzlxmXHUwMDA2us1cdTAwMDbHl6RO7s6XVzldo5XH6lcrTzxcdTAwMWM/br3uvZaGW9Wbelf0N5pPyy9FRHD33cuA4CWOXHUwMDFhNMZaTVx1MDAwMaYtXHUwMDEzUYsn1uNg7pRbOGGI1uMgXHUwMDBlK91cdTAwMTNcdTAwMTjQc0VcZrdGOPqIvlE8ycg3pkBxhe3niiaYc1wiimvDKOWEXHUwMDE3L6Bf6vWG7V6lVoyewFx04Fx1MDAxOUVx18nng+LpXHUwMDE1VFx1MDAxMZdcdTAwMTMyZ6O1p1x0XHUwMDAzum2MsIRErFx1MDAxOVx1MDAxZZlngoIk8eScXHUwMDAyiOfY8Fx1MDAwYlavtWWOokE0eGO1XHUwMDAwkNCwIIWYJrQvpiTV+CpzNe7N7MZtLMWEipOhXHUwMDFimag9RZnk4Hzn0Oo7XHUwMDFkNr2/fN9rRXnA+G9cdTAwMGLjheH/4/3v//eX892Ji3H2T8dcdTAwMTfx+HAx7G5XXHUwMDA2w+Vep9NcdTAwMWHCXTrAK4w9xWGlP1xcgiff6jbCXHUwMDFj7adcYl1cdTAwMTatXHUwMDE0389VRz7aeIRivZZcdTAwMTGESm5cdTAwMTWE0CzwtkblXHUwMDFlV7onXHUwMDE1mFx1MDAxM1x1MDAwM9SFZUDGfXy+vTyPTzV4V6hcdTAwMDf+QeGWnCBcYlxu4/yQf1M9YVx1MDAwMelccrHWUs2AXHUwMDA2xm7LmGXWu7XJl5xeXHUwMDE1XHUwMDE1umSgXHUwMDE5XHUwMDAyglTLLbZcdTAwMWVcdTAwMDRP7OdcdTAwMDVLT1GOwVx1MDAwM9PwVFx1MDAwM0XPaVx1MDAxN+xfXHUwMDEy3EOhjVx1MDAwMZbDXHUwMDA048ErLsGthlxiV1x1MDAxMlx1MDAwMshKXHUwMDE1LlxikXLN/oNeRM/brFdiplx1MDAwZnck+Luoi663r3tPvtGEsME/9XK98csy4ytrc1C+r1dblbbjXHUwMDBio79LXHUwMDAxXHUwMDE2fVraWe2ePFx1MDAxOP46ZMeNm4v6wYPMXHUwMDFjXHUwMDFlUliMXHUwMDFlKlx1MDAxYUqrcLc2hC2Ke1x1MDAxMDhqiDZcYpZcZnJcdTAwMTMv9mTCekygtVx1MDAxOVx1MDAwNW/R1Fx1MDAxMVx1MDAxY8LRPaGpkoRcdTAwMTFmOS1W1phGXv9C3rg1e9ZYg/2jrblqPoRO1JdcdTAwMDBvo3HXbpysmzk4nG+B983t7Wjtaqd0vr46WFt8bm7Tm+Z2XHUwMDFlUVx1MDAxY/hR/IPz8a2YKYpb6z926uUj0zdH60QuPz2rlTWHXHUwMDFlqaujWzKI4ohcdTAwMDRHR6WiOsz7KGVAOJXmgOlcdTAwMDKs2MQ3dMCXelx1MDAwMjCfwNIkVitXS7dcIlx1MDAxZXZcdTAwMTVz4pdrWj6NXHUwMDEy6Vx1MDAxN8Z0tcqgWf9cXOPcnlwiqGNYYGncOVx1MDAxYZlshfBcdTAwMTiB08hcdTAwMGZcdTAwMTZcXMyF+v2K6kpcdTAwMGL7o+H9aLiwUYE7XHUwMDAyXHUwMDA3aPy7W1o4qHRb1bu3f6zhXHJcXFhcdTAwMWHd3NT7XHUwMDBipYU1iMPGb04o0/Kwa1FcdTAwMTlY6oDiZkqNu3b9ZphcdTAwMTJcdTAwMThcdTAwMGV790lRYejCoyFgbleaT9yY7kDT4kaqXHUwMDAxdyF49IFXM8pcIq2j3HpWg59cdTAwMDOHXHUwMDA3Llx1MDAwMv5woDu1nlx1MDAwMVx1MDAwN6SwtdRyYVx1MDAxY+hujac4kCxgWlx1MDAwMlx1MDAxOETB0L1AWaGd7Fx1MDAwZYSBTYA7draFXHUwMDFimtxcdTAwMTZcdTAwMGWPUnNcdTAwMTmUn/lq/5Fr6Fx1MDAxOHo3XHUwMDEwT04tMcB3XHUwMDE4o4r+tKKUjyev5nlcdTAwMWMvZlx1MDAxN7FcdTAwMDBkXHUwMDBlsWh6m2w4XHUwMDE2JZQzpZmVXHUwMDEyi75cdTAwMDLeN1x1MDAxMIva4E+2WNRcdTAwMGbNOFeKS1x1MDAwNlx1MDAwYoexUCxcbpGqxKpCwoHQ+H4/dlumjEXT45/AJWNQ6Fx1MDAwYn5yVF3H4lWIlmnsomXmi5RcdTAwMTCBQuij4P+IVcGrxK+CRUFcdTAwMTRcdTAwMTIvwYjiNOUyf+vwM32bJlxyn4CPhrT2I52GTFx1MDAxYVx1MDAwZoxRolx1MDAxNFx0SmrF+a1FZVx1MDAwNL9aUWJcdTAwMDLAjlx1MDAxM5/j0JMxTC8oTbHlXHS+Y5qNyWKmNeeETrvZ0Vx0/Fx1MDAxZFx1MDAwNkhOnVx1MDAwM1x1MDAxNlx1MDAxN9pcdTAwMWazW1x1MDAwM0RDSzuHPYtcIqBTKXE95vDx+EL+XGY4mVwitcmtwupfeFx1MDAxNIRcdTAwMTk5NuaxX0Xv+/5cdTAwMTOChWQ/i440lNnkNORo/fyiXHUwMDEyXFyg5Fx1MDAxOVZcdTAwMWTJmXOb6TtGQTyhKMUgqGZcdTAwMWNcdTAwMWVcdTAwMWFRgbLoXHUwMDBmgFx0x8JNXHT0XHKuMpbL1FxmPSBcdTAwMThcdTAwMTCBX2qWdo2/NZi0yWL16sQ+bu2rW929rrdsa+RQyUksdVHAuSRl1lx1MDAwMMFgMlLpolx1MDAxNKxAuMXCUMyDXHUwMDFi1+xcdTAwMTbpYVwilKDYt1x1MDAwNKfiKoElnpaYT4f/XHUwMDAyOLFiXHR+XHUwMDE3KJm5N3MyXHUwMDEzrIGAQTizKJQllsAqXHUwMDAzzoWzQJolp1xc5lxmlSN/uY87qYCmtsrOt59cdTAwMWFcdTAwMTfl2u3SaXf74GGtp86nSmVaysBnTIGNKdbpPpuYdTpcblKYXHUwMDE1nmFUWOMrUKow1bNcdTAwMTTVqFx0wodcdTAwMDS2bOPlKEp7XHUwMDA2UVx1MDAwM+gghFxy2jg2sFx1MDAwYtYxWiBmt5+d2WnFXHUwMDE5IIyzYzTYPFx1MDAxMlfYN1ZcdTAwMTj1sZbyuVejXFzD/1x1MDAxMlx1MDAxMpChV+ddizJcdTAwMDHdXFy1KOFTzyejmO7G0lwitlx1MDAxMlNgqloqI1x1MDAxODaISFx1MDAxZd4vLEntXHRhqVx1MDAxNVopYoxDZlx1MDAxNlxim0SNZIpcdTAwMTM1NMRcdTAwMDOOwjKUolx1MDAxNVJpXGKsXHJcdTAwMTIr+l1olmDaXHUwMDA3U+xJXHUwMDAwPYVcdTAwMWIu41aMXHUwMDEwbFx1MDAxMrvBgVEjzzHzqFx1MDAxNy9C1Ja8IPEnvlx1MDAxNGPUe1x1MDAwZWFX5lx1MDAxMMTP4jHDcftcdTAwMGaM0Vd9m0dcZkJjIUjsNkxcdTAwMTllpfvChWjWzjLDhGFSQlx1MDAxY1xi9CGetVx1MDAwYqcqjVGZL1rCVWv4L0bcKlx1MDAxNHP7kVx1MDAxN0TbqIjtk1x1MDAwZlhcIinX/VtHXukzZ9LLXHUwMDEzmVx1MDAwN96BWi2J5TG9MCxeXHUwMDE0qHQncX5cdTAwMGYh8f5cdTAwMDIurVx1MDAwN1x1MDAwYlgyPyNcZlx1MDAwNDGOXGKKXHUwMDBiPFxuTliimFieJuj6W2XxXHUwMDBlp1x1MDAwMFx1MDAwNLBia4XUrlx1MDAwZUNcdTAwMWFXXHUwMDE1e1x1MDAwN1x1MDAwNIiQiVx1MDAxMZz8oZtMictx9k/HlvFngMlcdTAwMTQ5PFx1MDAxNFx1MDAwYlx1MDAwNTRcdTAwMDRcdTAwMTBcdTAwMDF3J1xcpXp+6lx1MDAwZXBcdTAwMDK8olAsa21cIlZcdTAwMTZcdC60XHUwMDE08JfxXHUwMDA2sX9DPaSL4CUo43hsPvN+UPpcdTAwMTSY0PVSojUzOLtccnVIjOZcdFf861x1MDAwN1x1MDAxY1g2WJGSXHUwMDFiJVxirFx1MDAwM0VcdTAwMTVcdTAwMTDiKKrAd1xuXHTfaC1cdTAwMDAqo/ZPRZWH58XTvZ2H0ehuv3xZb6nzlSVWyZzPs5Z52uCqscA5bDSdp6lnXHUwMDE5VVJcdTAwMTFUrSPxdJ7hXHUwMDFlLC3grsyXM+IuYGFcdTAwMWVcdTAwMTVcdTAwMTZWXHUwMDFlPFx1MDAwNfCEOtA2WehQ41x1MDAwYuqfjtzQMkU+XHUwMDBmWFx1MDAxNDxNt1xuXHJLblhcdTAwMTVcXFx1MDAxM6xwy1Hr/qdQ28fn4cXc9VxcO8HSTzS1XHUwMDA2iDHhmfEguLAohGRcdTAwMDanV4JcdTAwMDeG2Fx1MDAwN/509H5agmNlwLywxlx1MDAwMbyZQ9eFcuOBlWmucIymoFx1MDAwNVOFKFC4Xs7OzphigLCEOZu7aaLOXHUwMDBiyupZrcU8MnHaTlNcdTAwMTI7p2g9RKcsxGeSK4OBOyPKTvp0KXk5z+N4ccP4XGa+N1x1MDAwNf8hVlx1MDAxOSBcItxcdTAwMTCfg5lJm7aZ+Vx1MDAwZuZcdTAwMTKwrZFcdTAwMTOF02iYXGbdlij/mXnLNp1mhClcdTAwMWZcdTAwMDWjXHUwMDAywme0XHUwMDEwqLNv4pec+Vx1MDAxMiX4TVx1MDAwYtRRXHUwMDAxV7bBK0SKh8SDUFx1MDAwM1x1MDAwYlx1MDAwM2IpoJh/KsWr7o7KXX2+t303en3pNlaeNujDflx1MDAxY5tcdTAwMWP17YRYjzF/tLKBoCMyn1lZ60k/Qlx1MDAwNXdnXHUwMDFkimNMYlJcbpifhnf4g03i0CSKtSlUICg6nlwiUYB76WCtXHSJgsR6XHUwMDFmzjR4XHUwMDE3Mp/E8Yeg6Nem0MHyZsKAsil3hOZUglx1MDAxZTm/fLZ90kcwpWf4XHUwMDE0lkX4XHUwMDE1rkpHtFx1MDAwMUvwlD2usftYYc8lj5NIo4znl8lAoEZkXHUwMDAwRIItYtzDXHUwMDBlXHUwMDE0XGLmsFOF/P7dx3Oy25Mp7Fx1MDAxNjDOXHUwMDAyXHUwMDE1dFx1MDAwZSehOrGK3MBTwrR3cew2V1xumbhcdTAwMWFn/3RsXHUwMDE1f1x1MDAwNt/LnN9cdTAwMDNWopB2SVx1MDAwMpFcdTAwMDVQXHUwMDE3rlx1MDAxY8XPPt+DxWGltLB+ZCY2XHUwMDA0jI5qbLnGscMqsotcdTAwMDKcXHUwMDBiYn7wXHUwMDEwuItGXHUwMDE4XHUwMDE2X8/K9zJXuWOJXHUwMDFlcDCUReAoa1x1MDAxZFx1MDAxOKi8kGuRO1x1MDAwZq1cdTAwMDPkf5Eqd/PH1uyRXHUwMDE3VrlpLte65Uuua2tcdTAwMWKHXHUwMDFilDuELZL6jyFK8CR2KcFqg8dcdTAwMTRRtzDGwyk0XHUwMDE2Xoe7XHUwMDE5XHUwMDE0nFx1MDAxY6tTMVx1MDAwZkWkNVx1MDAxN37imjqaXHUwMDFjXHLxrIFHpcEog001ReCEXHUwMDA1qtg7nb39XHUwMDE45aKFjXNCdC08eUtJYquEXHUwMDEw+ZfszdAm/FfacWeYL1x1MDAxNUOCePsxNcFe3ZlSh+k3II31Ib55lFurJPhsaWxYXHUwMDA1nlFcdTAwMGW/RYlSTVxmXHUwMDE3Lk1oabnHXHUwMDE1N1x1MDAwMIlGKcZcXNW0XHUwMDE0h1NaOLomnMPS+bZNt22eTcH7qML5vfEkIYKdSS7i44JJgzM9cuR9b930xuhcdTAwMGZcdTAwMTXxzS91yCP1XCJ80qdLiYt5XHUwMDBlhytxXHUwMDE1Mlx1MDAwYlx1MDAxNSdcdTAwMGZzIJLTNNJxXHUwMDA2p2Vcclx1MDAxMVZcdOB7jizax1x1MDAxModKUeCoQJ0g1OQmVoTEXHUwMDA1llx1MDAxNcKbqMXMwqw8slwi75t3V6vLbOnOXrVcdTAwMDe39cety5vEOisqXGK3QDJwclxy11x1MDAwZSaZPXOIRc5cdTAwMDRcdTAwMDJncJ/KRq5RwcGlxDtcdTAwMGJ0Jl4h8Iewxr3r9c37s5Xt66XG3qIuXHUwMDBmqnKTOFRrXHUwMDFjaUOAXCLPMj9cdTAwMWSBujU6rE9MqfaAkvt6aEZSXHUwMDFkn4dcZs/Rk/BcdTAwMTiV1EJDoOtcdTAwMWGh+rvkXHK/YFx1MDAxYvh8XG4gslx1MDAxOGeShFx1MDAwNIRK2cRiXHUwMDA2M1x1MDAxN/NpY58pc1hcdTAwMWX2waUs3Iy61SGc8aDQacS0k80np5hOg1M3piWxXHUwMDFlboxwWFx1MDAxZuBcdTAwMDRZmF2WhPZcdTAwMThcdTAwMTG+v5daXHUwMDFi4Vx1MDAxOEZIUZ2KXHUwMDBiXGKvOVx1MDAxMYZKl/JcdTAwMTTHUaRWgqdcdTAwMDBcdTAwMTSFKPy7kjzBrC+mMWtDUHbNKWtcdTAwMTjc/Y+aNVZZSzuPXHUwMDE5JEXIK4a3pqWH5E1TgsJcdTAwMTDcTtSSSF7NczhcXNwsPoNfTiFcdTAwMWHoV3xTgvMv4DRcdNCkSVx1MDAxNd/T5O2SdVx1MDAwM2lUNnBWhpmeXHUwMDFjXHUwMDBic2q4aMVcdCfUUio5VuvM0k+ssCfAXHUwMDEyga36sap2XHUwMDBlXHUwMDBlXHUwMDE3a/w1N0Ay/1xclpk+XSR1z8tcdTAwMTfAZlJcdLAhomREO4li4aDGhVx0VFMo6cAnvyXeWmZgXHUwMDFkUyCb2rHtxfyWf8awKkFQbsk0Q/D+Vvtel1PgXHUwMDEzYVJQloRPyepJXHUwMDE4c+G4w7mor1x1MDAxNVx1MDAwMKBcdTAwMTJcdTAwMTck/sSX4mdgwjSbV1x1MDAxY0fOcJS/IFohN/yod1TSQGAoXHS2OZnAXHUwMDA0e/zBJIMhgDl4XHUwMDEzUNxpZlxiSJ8jXHUwMDEyhVx1MDAwMMpwoqbfP0m5K6+SXHUwMDE5XHUwMDAwuOVYREj9R1x1MDAxZVx1MDAwNVx1MDAwMKVxUFx1MDAxOG6poLariuP/XHUwMDFmXHUwMDAyXHUwMDAw6WOgJlx1MDAwMYChVkrNIFx1MDAxYTU0XHUwMDFjn1BcdTAwMTTPI8xwXG5wzSRzikmgoFx1MDAxONxlSnDZUpf6JqPKM/5MXHUwMDE2K1x1MDAxNXqeYo1LL1B8UpnC/2u0XHUwMDFlJZx15jQ+OXE8XHUwMDE3nVAtPzZcdTAwMWblN/D+IS9HjCdw95pZjeqxk0tdk1fzPI5cdTAwMTe3i89cdTAwMDCjzJ466qhcdTAwMDFQgqrls3akXHUwMDA2PHekviTiuFx1MDAxZFwiUFOCU/WkdTjUcmBXXHUwMDE1XHUwMDFmXTX7XHUwMDA3zc7qWnJ8oiVDuVb4bqzJVJOKKaa5aDBcdTAwMTSclUC4XHUwMDE2geFl+ONcdTAwMDcsOElcdTAwMDG8rdSAzJh8/1NcdTAwMDEr/YFM7Jji0jNcdTAwMDa1XFyBwXBJwyW1XFxRXHUwMDBmfCNcdTAwMDFcdTAwMTaIf1x1MDAxMkduXHUwMDFjXHUwMDA1lLjfnvg2KtSRU8NiXG7JNLWwXHUwMDFjXHUwMDE49p1cdTAwMTdcbrJcbrRle+2GrGnKKbCVQ1x1MDAwMIi4dGBcdTAwMTlLXHUwMDFlIEKwhlx1MDAwZvxD7vVcdTAwMTQzjNWM+e34RjGcdmDnZaa6h5NN/braYHeLXHJZej25bpmBrS1l2V+y2FZcYo5cYm48kSGxQt+EtPU0KqVLieWuQVx1MDAxNarx6CxccoFcdTAwMTbqnuI+hnTyvu/9pUSrqWYnekJqXHUwMDBlT8C4tpeCOtQxXHUwMDFkSumrXc+ngX2m7aXjSn9cdTAwMDFcdTAwMWVbfVx1MDAwMZ7lwFx1MDAxN1x1MDAxYi/w9lLayeazvaSvT3a3j1f0w+LeXHUwMDE2P7rvnG9ccl+zXHUwMDBmxMZJlTjQXHUwMDFhyFx1MDAwM2Z1ZNiSlVKeRFx1MDAwNqopI1igXHUwMDFhM2RlPSWEwuZcdTAwMTNriLP1UWKDXHUwMDE3YzhcdTAwMTZcdTAwMTO1y76hMMGoa7NDIebqpaJOaTJcdTAwMTaXXGJcdTAwMWOrVfitwyQgXHUwMDE5klx1MDAxM1x1MDAxNJ7Ulm4ujL3vnlx1MDAxY9m15sPwZOPy+SgvKJRInnOCwtXrh9tlpaqlrc6gvLgpXHUwMDBlL8Rutlx1MDAwZS1hhUdQM8pcdTAwMDdDXHUwMDE5qc1VRnlcdTAwMTbCXHUwMDE0gENcdTAwMDFk0cTpJFx1MDAxN57AqIFcdTAwMDBZXHUwMDE0zDlcbvp3QcLPt5l6diCkXHUwMDFjiLjmXCKe2/CfYmLJXHUwMDFmQzFh3Fx1MDAwZitOxvu9Rav8T1Zo9IueYD6IZ/duXHUwMDFhrZvr244oXHUwMDFk8serg1x1MDAxNapXXHUwMDFkaupJiMdcdTAwMTnzNKrPXHUwMDE4Tnhg0/Qn4nFcdTAwMGasXHUwMDE4kFAzzoM6S2PqyjxpIDJEbVuhaEBxY1xcsSswXHUwMDExT1x1MDAwNNHwoCVcdTAwMTff+rdcdPZ7k1x1MDAwM+bBnVx1MDAwNobiNGueTHDhXHUwMDExU6mJzL2Ql3BtcpK0eH5cdTAwMWVcdTAwMWNcdTAwMWXsXG7eW7PrLysnLzdbvHmUXHSUOIdcdTAwMDBN4ExcciFcdTAwMTk3XCKqXG7DPZyoi5u2SptAz8F7N1wi9YBcdTAwMTFQnDWIXHLcrvI/9VxySlx0i7oxXHUwMDA1KFx1MDAwMWeguF3nZGwkZfopTr4x+kNlQmmE7aGj7056qkztXHUwMDFkXTu/WXu0jZdmXHUwMDBlvSBcdTAwMWKdznqHbbTrS8Nev8YqLzvNwTBcdTAwMGZcIphcdTAwMGaS/rt7dLy8sLy7Xy40nrpPM1x1MDAxZlS9e9TbOydm+FI94o3LZVVcdTAwMWJet1x1MDAxY2UgXHSoaqz1hFHGMohcdTAwMDNcclxylHq8OVx1MDAxY+lcdTAwMTmBgvLUXHUwMDFhqVV8I1x1MDAxMFx1MDAwMk1BrMJB7Epb5cqpKumhSlx1MDAwNnxcdMHmzN/D+3xBcqg5M6biODSI553zMVx1MDAxZMpUY6bMXGKG+SR3XHUwMDExqub93vNK5eRSXHUwMDFl3VxuqUX9sXVxvP9l3iPFiEZcdTAwMGaV3cO1i9FcdTAwMTZcdTAwMWI8VEf25vCpt1vKlFHFgnuIXHUwMDEzjaRcdTAwMWPnmEfyMLifQIxizPp7ajHzXHUwMDExwtNcdTAwMDBcdTAwMTfEXHUwMDEwXHUwMDFjJuVcdTAwMWNi+Vx1MDAxZEQmXHUwMDE5TCs7XqOiN09UXHUwMDBiSC7WN9xvr/7YvnmaZdTuXHUwMDFh3eOmNeqotsvuaqvNa93XRcLV8uLx4kKhITVyhvmgafpzSS36R70shTLKXHUwMDFhVT9cdTAwMDOxRDY1OpSfXHUwMDE3XGaRXHUwMDEysVQxp3i80DhVXHUwMDE0++a0n7v9TdD0833D7TRcdCaFz8RyZ08pTVx1MDAxY8XCrFx1MDAxNNjG+HeoqeHYsWJcdTAwMDXqvVx1MDAxMVxi3MXEXHUwMDFh/VLycp7H8eKGMT5gzF9+hVx1MDAxYVx1MDAxZIruKVx1MDAwYqFcdTAwMWb8RypcdTAwMTGcqDhbUynDwWlSXHUwMDAwTuFuj6XRkv+c1ejSiVLgkkvoaONcdTAwMTeZ7aJwwJFcdTAwMTKCc2k5UCtcdTAwMTGdXHUwMDE5XHUwMDE2ml9cdTAwMWFnw59QI5NcdTAwMDTuP1x1MDAxZFCoI+XthFwiXHUwMDE3XHUwMDE5MbA0k1xiXHUwMDE5xdtcdTAwMTXEXHUwMDBlNsE+Jlx1MDAxYz6FXFzE6n/CLidSXHUwMDAwNIlnp6cp0sVeUUtFcsVcdCbs5LTwXG5LxjNcdTAwMTjo4uh5xYSLalPhjzZcdTAwMTVcdTAwMTDrYp3fVPM0/1boejdcdTAwMDW6XHUwMDAySCpOpbPMh8fLXHUwMDFixkEpNziFNvCOP1x1MDAxN16t8GDBXHUwMDE5a1x1MDAxOIRcdTAwMWGwiie3wCWu5jlcdTAwMWMuZlx1MDAxNoXCVoBcdTAwMDNmUa+K+LUv3Jgk5a/pXHUwMDA1XHUwMDFisHRTSSxHNTQ8XHUwMDA0OX9kTd80XGJfMCEonyD9p8uZXHUwMDEwgn5cdTAwMThq4alqZdAqcOAzUbHqVMPDP39cdTAwMWPwJltLXHUwMDE24E03nVx0R/803E2v50jHXc08nGxcZpegreHTiqzDZXvAyDVcdTAwMTim5cB+pWuQNWeeVrinhSXxYFjfXCLrXHTA255cdTAwMDJ44XlhTlE5VdZ1YlgrXHUwMDAwJaXQ4u+Au0p52CRcdTAwMDdBo9WGXGJcIiZ9Onk1z+FwcbMoXHUwMDFh8CqlXGLB3n2CgkYkaajO1MBcdTAwMGKYQ4hcdTAwMTBcdTAwMDZcdTAwMDCdWjpn4E0vxIxcdTAwMDGvwdJnqi1XXHUwMDE0fbpjrE5m4MVhbzh+XHJiXFxD48BcdTAwMGLklzJcdTAwMDVcdTAwMTdcdTAwMGJrQ/M/VmPzoHSzfnK6efBCXHUwMDFii6OLllx1MDAxY900XHUwMDBlL+PYlLCBqVxiwFx1MDAxM3gsVCtVsCCiJe1YXGIrXHUwMDA1zi9nRFx1MDAwNSRS3vGJoJ691Fx1MDAxNEgkblx1MDAxMXBHJayynlBGUVwicTiU/F3iwi/Yw+zMvIdplaTSKutKxlKbXFxYoZFcdTAwMDejcPFHYCuBU75ZS/n+dVNtNFx1MDAxZVp7rCHl0dJm52gjh8qK32ZvdKdWOi01167u9rpcdTAwMTdnpytHXHUwMDE1vVEzWfZGIez3XHUwMDE02lx1MDAxZHhJ+P9wLVx1MDAxM7faQ1x1MDAwN6fByeOUK1x1MDAxYrNMyjHsZFxmXHUwMDBi+oBhu0pcdTAwMGJcbjZcdTAwMTe7SJbYzc5cdTAwMTRcdTAwMTnBXHUwMDE0Mk+YRVx1MDAxZi9xXG4o2ypmaFA/5Kup4rjXpNFAebClyqBeW1xijlx1MDAwMijcRmbyqeazo5nuv9JCP1xyuFx1MDAwN0xcdTAwMGJtXHUwMDE0laxVeFx1MDAxZXZcdTAwMDaVXHUwMDAwpT1K4X1cdTAwMDLzeFq5NGJ8XHUwMDE3wVx1MDAxNEetcfhcdTAwMTY1jUbM3yry62W3Z4W0lGtnN1x0T5yFzSQxXHUwMDAyVU9cdTAwMGJjzHOUXGKg0lx1MDAwM8eFM+NgWVx1MDAxMm0mT8NKWstzOFxc3Chi1P9rXHUwMDA1XHUwMDAy/IolTlBcdTAwMTlAXHUwMDAxhPP4ZuZcdTAwMDdb5TllRFx1MDAxM2zIgWNLXHUwMDE2XHL8ctZcdTAwMDdIXHUwMDBmPMKBXHUwMDFmcH9hIDzQXHUwMDFhz8G4pollXHL7sDlcdTAwMTNcImEmgVx1MDAxM0HsXHUwMDFjXHL7NLVcdTAwMWFWXHUwMDA151x1MDAxMP5DXHUwMDFjnDZP4rdcdTAwMGX70vlvKi5ByGdwXCJcdTAwMDJcdTAwMDPqXGJrMCySKyRcdTAwMGXlXHUwMDA1K9RcdTAwMTbuJefW0VxuYsHAJFx1MDAxM1xulfVcdTAwMThcdTAwMTOOkI9p6uHEXHUwMDA2hXtcdTAwMGJwSFksYCpQK8h9dmCihFGI76xzL1AlXCJcdTAwMTOlRGhcdTAwMTSNzrvnXHUwMDAz9VmnmkXwXHTQXHUwMDE0X3iTPp64midcdTAwMWRufliS2bO+qWFaVP9cdTAwMTRGM4G963PxrDTqWGdGj/S6+yB6UFx1MDAxY5RcdMAlXGbFaczaVfyT5Vx1MDAxMn10wFExXGZL7sEgKFx0z2/34C5cdTAwMTKD8bI1XGbVbP5U7EjXts/QSSg81OvlSqFIPVx0619a5inKcLCDsLhYXHUwMDFjKlx1MDAxOFp6XHUwMDFj8IXi1peAletcdTAwMWH+YTxjkTJcdTAwMTjMXWhWrC2tXHUwMDAy4cfD7G1cdTAwMGbcXGJKtTN9IWly+lx1MDAwMixFXHUwMDFiZnnu3fPzXHUwMDFhzLN6tV22N12zzWj1YofX1l9VQ+WRMnxcdTAwMWLMI4XIqVx1MDAwMbLP9ttcdTAwMDf7vVx1MDAxYrM5XCKLK/Xb51x1MDAwMW+dx+3T1Vx1MDAwMCmJXHUwMDA31F/6Y+uFicxjpGC4wFx1MDAwNcB7U24g2nKUeVHjXHQwavuzelA7uny/s4aJxtjPTuYsN1x1MDAxY+tcdN1CtMlpXHUwMDA2bVGhhlx1MDAxNSfN8CtnuD9cdTAwMWHej4bvXHUwMDEzXHUwMDA1itz8kHyq+eRcZtNcdTAwMWRNarlcYtgsXHUwMDA0Z6hrzrRcdTAwMTKRfqhcZpNcdTAwMGZwTjlqu1x1MDAwM9PRQlx1MDAxOemwX8pcdTAwMDWmW5DNcfDvNtBCXmh7/nxsXHUwMDFkTFx1MDAxMZtphqzZbc/Jc1x1MDAwZlx1MDAxOJHwrPFJXHUwMDE1xp7nWC6iPYGohOM+pVx1MDAxNJMnXHUwMDE1lFx1MDAxMlfzXHUwMDFjXHUwMDBlXHUwMDE3N4tcdTAwMTj9/9rBXHUwMDA3XGZrWVxmLFx1MDAxNio0JXSiwmbmsVx1MDAwN1xcYZmmhVx1MDAxOJcpXHUwMDEx6Lzy70reU1x1MDAwZjLP1Sp92mAtX/Q6OFmL0T829Nt92juprNtNvj26XFxeU4PXldZ5J1x1MDAxMzSBxVx1MDAwMHnkmMBVOIEjvJ2VZepcdTAwMDFOXHUwMDAzJ1x1MDAxMMzBXHUwMDAyplx1MDAwNFaza+qBXHUwMDE0XHUwMDEwPsIyU5whzJFpakX+VkNcdTAwMGaG02BcdTAwMTOqKKMyvotrqlx1MDAxNKlQJlx1MDAwNIToqjhkc457WlxceeD2hd9hXHUwMDA2p2knz2lMXs9zOWDMND5cdTAwMDOfMlx1MDAwZmEgXHUwMDFlmJ/Fwk1UxeeM2EAt+ZS+moB9XHUwMDAwXHUwMDAya4hSgVx1MDAwYkfgKOdcdTAwMTFcZvzqdvi4qPj1zcp1SVxyy0/lTmMjXHUwMDE5j1xiNoch3VBEcsFcdTAwMWN49LGSTcQnXHJIq/yJZzreR6BcdTAwMDCkXHLVXHUwMDEyxa5xuPhcdTAwMTdcdTAwMDNU/n1cdTAwMDQp9pKtgy/VeCZcdTAwMWT//e/zbiVIV1x1MDAwNEpcdTAwMDNgSXx1Knj8hEtwoWFcdTAwMDFvgFxcnLlcZqaBWXLhXHUwMDEw8DZcdTAwMWHDVlx0XHUwMDBlXHUwMDFkvK9yNVx1MDAxMnBiPFiDwKeNRq11/lx1MDAxZFx1MDAxOSag72ia8jBcZjaopC70NYl9XHUwMDA0VlCsbOZ5b9pcdTAwMTnJdeD6XHUwMDBigb3xdTfp40lrOf+jMc1cdTAwMTOPNj/YnVx1MDAwNpWAXGZIf1x1MDAxOFx1MDAxOVx1MDAwNHFg91x1MDAxZm5lUzhUXHUwMDAznCPjXHUwMDFjZdaio49CXHUwMDAwxGzsLsytX1x1MDAwZryeXG79zDD6LqVZj8Z69b5cdTAwMThi51x1MDAxNlx1MDAwM141K6fXm6d8tF5dPjw+Xr+rj3i2yaxKKlx1MDAwZpVcdTAwMTGp5lx1MDAxNDyaXGJDUFx0uFx1MDAwYqxGicNcdTAwMTOV0eD34jEg0FdcdTAwMGZiXG6FkrSCXHUwMDE55ahcdTAwMWRBoKbM786kmpFAc+Z3XGa4XHUwMDEwQqHHKWJAXHUwMDAxrFJcdTAwMTJ3O5tDOftdL9TiMEybv0qLgONOs102XHUwMDFmXHUwMDE4KiWux1x1MDAxYz5cdTAwMWVfyJ9cdTAwMDFcdTAwMWTTjM2jqHZcdTAwMDFWyyxcdTAwMDYrzDVTLlx1MDAxNM4wXHUwMDE29L2plVx1MDAxNsA1XHUwMDA0ymhcdTAwMTBgq4qHm9CIhzjLKPxcYklcXJHstEHcQbmzsvKs250junZ4fFA676ycJIFcdOClXCJcblg0OClGXHUwMDFkXHJooUsmMtMlv0VwgC2o4ohcdTAwMDPoY4WJXHUwMDAwrzjBVUmKXHUwMDE5aPXHXHUwMDE2Ji5ts1x1MDAwYrZydXrQuL+qLvOTxdPT4XFGdNFYV1wiLVx1MDAwNGdAxnhYo6REXHLyOlxyliZcckTeJKBh8q5cdTAwMDdcYtRcdTAwMGaFfCRlaHjUIVKifU1By4W2XHUwMDAy63ym0aj+W4HLU3ZwXHUwMDAxI1x1MDAwNzpAnPKAXCJRXHUwMDFkXHUwMDEwzMFcYk7/1KF6pcTFmMPHY6u4aMiCJVxuTMN/IILVgibpdSmKLbxcdTAwMWGcZlB1JFx1MDAxNVioxUG0XHUwMDEyYlx1MDAxNWDzgpEwYnuGXHUwMDAzsFx1MDAwMOIorIHXNG1cdTAwMThcXCZoua4t7rbYaaV8pqtcdTAwMWL9zYG661x1MDAxZXdS8oM4YNgyi53HWs/Q3WwxWGHYfMtVvMpdXHUwMDExXHS+XGKhU1IsWPxTwWSr9LJUOZLbcn+xQc7sjZWV8804mCRUKpZcZofYXHUwMDExglWFPVhcIpjz8nsoXHUwMDA18DPUXHUwMDFkkVx1MDAxMlx1MDAwYqu1o71cdTAwMTk+51x1MDAwMW2GwFx1MDAxMIJcdTAwMTlYx45ohVFcdTAwMGbLXHUwMDE4jVx1MDAwMr5jaaCmtFx1MDAxMDmzXHUwMDAyVSo+z1xcqShcdNZcdTAwMWVL5qp/Zzz2amCUXHQ8W1x1MDAwMaziI0jzfnqOikJav1ilYlgxavOmvtE9vmht6ttcdTAwMWZBY51lzlx1MDAwZsXBUVPgWIpcdTAwMWRV1c3dXbO7fEFXXHUwMDBmLujFebfee3HossYrXG5LXHUwMDAySFx1MDAxNyGo7ym1QodcdTAwMTQ2ISs8hqJ4Rlx1MDAwM7Fl0tGGTLWHXHUwMDAxpLZv07aUq1x1MDAwZrlYw7GKVFH4Mk2iXHUwMDE5Vrkm2j1cdTAwMTEyXHUwMDFl+Fx1MDAwN/TLJbXcXHUwMDE0qFx1MDAwNulXTeHm0cJGXHUwMDA17kVcdTAwMWIxenzTxvWEXHUwMDAxyvmF9YTu08ynlvB56YzdrW11qy+k2jWj9eZq87idXHUwMDFkXHUwMDAxwTY98HzCXHUwMDAwS7Q4viecslx1MDAwM1x1MDAxZuNZLJ5cdTAwMTJGQ+BcdTAwMTWUdVx1MDAxY88ql1x1MDAxZTOGXHUwMDEwXHUwMDBl7ldwt1x1MDAwMlx1MDAxNXyLsThcdTAwMTlW4FdcYlIsYeVcdTAwMDKB4OvMIEilsr5cdTAwMWW+y8xtbJNpPOxOXHUwMDFinEqqcyzXd8JGYO2W7MvAnLw2Vk+laPXXry+vXHUwMDE3n+pZq/VcdTAwMTdf7E59vzSger3xekVcdTAwMWGb9HGpnVx1MDAxZrZqonLCVvdVZsJWjfsqhFx1MDAwYlxuLthcdTAwMTBcdTAwMTOW+JCSe1x1MDAwMoJqMExcdTAwMDNcdTAwMTGPY3pcYlx1MDAxNcxcdTAwMTNgkFRjVsRdrF8saC1OfuM6eKFcdTAwMTOz50ZBXHUwMDEwYYxw2pxNsjnLNTVMz2OEnlx0VMZ9XHUwMDAwWHdHbYC+Xr++UK5cdTAwMGZH93lga1x1MDAxNU683k9B106rVlx1MDAwYuJTXHUwMDE4YCdcdTAwMDFdXHUwMDE0c1x1MDAxM68gXHUwMDFm2E1n9umKj9aDaJMxi/N8mJbh9rhcdTAwMTJcdTAwMDIuqlx1MDAxNjBDgVx1MDAxZFnXqD3GPcU5Rq6MwzvH71x1MDAxOFdqXGLuXHUwMDEx/Fx1MDAxNlx1MDAxNMxcdTAwMDNerovVX12cSo1rQqcwc6pcdTAwMDTx9bNcdTAwMWNmzkligIlGjvlqlXuxhsD5KVx1MDAxZjH0OVx1MDAxNkpcdTAwMDJoSVxm5CiQXHUwMDEwY7gxkz5eSlxc0PM4Xtw0xseLXHUwMDExg/xcbjay7kC9ZVx0uWRYf2BwrFx1MDAxMXPsulx1MDAwNT/4sS0nXHUwMDFh3nFcInbmio30XFzcQiRcdTAwMTNKNDBcdTAwMTbDmWFKXHUwMDBiXHUwMDEzroOctVJSXHSINHC2kFIsVijJXHUwMDE0XHUwMDA3Xlx1MDAwNIYjlYFToCmX/VunRtP5cVx1MDAxYUJcdTAwMTnjXHUwMDE5XHUwMDAxXHUwMDBlhlxuXHUwMDAxoVx1MDAwNI00iWZcdTAwMDAoYM+eVXB/LXbTUO7gnZJcdTAwMThcdTAwMGYzPlx1MDAxNmefY6PjNz4l4Fx1MDAxM5tcdTAwMDaftGVcZqdccjrwiaW0alx1MDAwYstcZsRcdTAwMTEkf3xiKlx1MDAwMIuFwCcmhSeklpjut8pqNrH8r5S4nudxvJhlXHUwMDE0XGaewHdiXHUwMDExpFx1MDAxNVx1MDAxYbHlw3JcIjillUCUzXB2ZSBawZ/8sSk9eFxiY1x1MDAxM25KWoN1nihpoj9cXC/JXHUwMDE1sFx1MDAxNsyoYJNcdTAwMWGNXHUwMDBiXHUwMDEwXHUwMDBihWO2ueFKaG3NV1fsz1xyiC5vN/Za5ePh9dXBw4VdatzTw6fl7Fx1MDAxOUpKiWdwXHUwMDAyJJhcdTAwMTj86EjPs5ba05pbi2JVQjlcdTAwMTTypfEw2oJPUimVM1x1MDAwYlx1MDAwMnRcdTAwMDF4XHUwMDAz1n4qeOaSyO/C9iQ44jMnKFFxXHUwMDE2nod0XHUwMDA1UTIxV4I8XHUwMDA0mJtcdTAwMWXvdc8/P3nXOVx1MDAxYzZHbVM5oPbosrR6UVx1MDAxN4OXrPnJw7XWfrf/+nB49jBky+3a/v3y3mb4Wz6kUtJ76tHTh8H66vGoOpBcdTAwMTdcdTAwMGalzXqT5nBcXC1WXHUwMDA2XHUwMDFiu1faNFrrj50tu1O5bJBsx43hUjyfqo3ROeVT3U8l5k9cdTAwMWP5VFxiXHUwMDBicTpcdTAwMTfGkFxui+EjaubAaCE8YP5WXGJcdTAwMTVcXMd9iSvV8rtkUGs9JFx0n+ssxFx1MDAxNNxcdTAwMTWFyeG+J4yJTKSuXHUwMDE0K/1Ck+JzzKHyKVbseFx1MDAwMf7MQC624VxylWEvkPP8uuzpXHUwMDA0XHUwMDEwjmZPXHUwMDFk555P3rR6ebJRvSWLr2b7+fm5cbFVv2Ov2clcdTAwMDCD2JSjXHUwMDE2n1x1MDAwNuooqFx1MDAwZVx1MDAxN+xQYpRcdTAwMDesklx1MDAwMmNcdTAwMDRWZUW8XHUwMDAyXHUwMDE0eIQngXZcdTAwMTGuXHIgXG5xyZ5b46G4JbhcdTAwMDFhJJY/XHUwMDE3ysCLs1l5TeTMZMAw1NSjTqOX0Vx1MDAxN8dcXFx1MDAwMPerXHUwMDAzjnfuTGB7narl3Z1R/Whv/3prdPqyv6TUJyB2XHUwMDA2ZFXC6GlSwCnG6b7KTMiKumCGMaqwiFx1MDAwMFx1MDAwNTLCholcdTAwMTlZYSHQgTiHaMdWpZBcdTAwMWVuVFxujjuaNlDu+VxytFlcZlFlXHUwMDA3WnB7XHUwMDEwvVx1MDAxM+PaquTJ05gxXHUwMDBlhygsXHUwMDEwfVx1MDAxNVx1MDAwNWfL7cq1W03skzF2XHUwMDAytkUxNnLe+eDrXHUwMDFhb2y+3DVuas27k96Q35+ut65cdTAwMWT7kolcdTAwMDWxnsGRZlx1MDAwNjVcdTAwMDAlsZFcdTAwMDY+wFWcxsf9gVx1MDAwNVpZh/YzJ9zTnPj1yVx1MDAxYYVcdTAwMDad8Go1gXjdWMuElN9cdTAwMDWxSVatZ4ZXiml6hSkmh7XLRIClXHUwMDEyPqiAQ31cIsTSXHUwMDA33mxWOnLltVFuqddVsTSwpCDBK7Esp2k/7qvMXHUwMDAwsZSCYSlNObXIXTWPmCZOs4NHxrRcdTAwMDDD4yxcdTAwMWW7SoPEXHUwMDE3rFx1MDAwZbBYa/tcdTAwMWTJTmWKJjvAKmxcdTAwMTNcdTAwMTfUmd9K5rRcdTAwMTaFjC2Zx3yQXHUwMDE58XVpVKu9XHUwMDE0XHUwMDAxXydgW1x1MDAxNF8j551cdTAwMGa+pmf10nZVmcDQXHUwMDE1a8RwzKuOUmRltIdcdTAwMDLtXHUwMDE0dXU1hLYxXHUwMDAzZpx4jFnGcKFcdTAwMDBcYkvXKD2IbjnjRmKHJCNcdTAwMDWTxS5SXHUwMDFl22Y3aIhe0K2K+KgutOhEysyFRil0/SFcZk3dVLVcdTAwMTBufcSi56jQgqNUXHUwMDE1XHUwMDBlqrJYRkwn74Emr+Z5XHUwMDFjL2ZcdTAwMTfj48XwP7dN1cytgdHOQFxu/5hBxCS5NZB6RFx1MDAxYcO4ZChcdTAwMWakIVx1MDAxZY/dhyk3VtPzioFrLPmlzDhcdTAwMDBcdTAwMTRFuFxm5eaDY1x1MDAxYd4qfLAgWmP1LNUytrPKXHSjSJO4sUSTtFx1MDAxNs/femM1Pa+UhkUlLj2BM+dwXGJcdTAwMTaFXHUwMDAwQYfZpGXGY5oq43s+ylx1MDAxY42PXG5cdTAwMDX9XGZYp0W5caeOtORcdTAwMDB4XHUwMDE2OCfwZ4KyOoVcdTAwMDKjXCJcdTAwMDV6i1OAXHUwMDExl1x1MDAwNCw7qNFcdTAwMTVcdTAwMTBqiTd9jGt8UFx1MDAxYkFyk/uUXHUwMDFmlGT4XHUwMDEwwZxcdTAwMWZcdTAwMWNp5SlwblTAnZLg6dSkT5dcdTAwMTLX81x1MDAxY1x1MDAwZVx1MDAxNzeMz0CjzJ5cdTAwMWFcdTAwMWMsXHUwMDA1kFRSXHUwMDExXHUwMDAyhDVQwDWto2YoXHUwMDAzjFx1MDAxNVx1MDAxNVx1MDAwMMhSXHUwMDA1skn+XZjGT2fCovT8W1x1MDAxOIsoXHUwMDAx1yaIwoFOQs6ERUJRwlx1MDAwMYxcdTAwMDBxVaiMXHShSFx1MDAxMoAqlL9AXHUwMDFkXHUwMDFk1Lz6U8EoPVx1MDAwM5OqW0k97HHC7l9Gfa32KbHIUlx1MDAwZoImIE1Sc1x0a8ohXHUwMDFijerT8CAormhcdTAwMTKSXHUwMDE1+4aiMFx1MDAxNC1NXHUwMDAxRVx1MDAwMlx1MDAxZYdK2LKnJLnV0DIsLia5R0ZcdTAwMTb3n8bxWCGgyMDiRDlcdTAwMGVcdTAwMTTYxu2tSVx1MDAxZk5cXMy5XHUwMDFmLGZcdTAwMTOFQiEsxMRYXHUwMDA1x7hSJSyg6Ud9tMJoh0ippGGoyzxfXHUwMDE0Ss9Sha9cdTAwMTBcdTAwMTVupFx1MDAxMVx1MDAxYadUaM1cdTAwMDFqZ1xuirC5XHUwMDFmrFxu4kfOQz0vb0iESX1fXHUwMDA3VGIh5J9cbkRyp3u5Odyn13L58HH0NGhcdTAwMTixXCLiQJSwXHUwMDAzxlx1MDAxOYOnYrB9XHUwMDA0fFx1MDAxYtDscIVcdNA5lFx1MDAxZme4noDGKUeBicJcIjJC3+qZXGJ3dMNb5jGDXHUwMDAzIy0sNytIsXrzilx1MDAwNEbLbjCaYlx1MDAwM1xm2Jmvdu3siEhsiMCeXFwgreRcdTAwMTN74V/Kj4+7pDXit0/P+3rlTG5cXFx1MDAwZdaybn+tyWN1VD47NK+X17VaubS+ebCjw98yy/aXojqn7S/3VcaMM779xbXwcIZcdTAwMWXgXHUwMDE4eDpcdTAwMWHVqbBMekQgPySYIeVxu1x1MDAwNLCTVPjhXGbq0Fx1MDAwNGtQirpcdTAwMDFWIJ2Za7IyxVx1MDAwNlx1MDAxOPhFaogzXVx1MDAxZTfEd1aowW2iJFxc8SpMXHUwMDBlKo2cXHUwMDA0ZmbdXHUwMDAym1x1MDAwMG7RLbDoiedUY5LqbdJCPaBaQEg5bm9cdTAwMDFVl5HyzclbYGDdXHUwMDFl8CX4JTAmwGLikoe2XHUwMDE2dWtxPp6lOFxy8few6S9A19XsJlxyUVx1MDAwMo6iY85cdTAwMTFBKUlHi+EhxPRcdTAwMWZq2kidUkC5nKaf4Fx1MDAxM1wiPVh3Ulvc2Vx1MDAxMNJYLSfOm0tezXM4XFzMLGL8/yt3wCBAkVx1MDAwMneHILBlgFx1MDAxY1Z+uO1Oa4znwOXD/SCB2dH+Tch9/yvdIUejvbc4k0N0IXF0UUjUdOq0I1xcXHUwMDFj54CampPYuDopqKF+kkBw5lx1MDAxMlx1MDAxNv/9gr1//FxcoT8q9/flIbiD96dcdTAwMDJcdTAwMGWwVYvg8dtrw3rgnvov7fZq9dVu5bpcdTAwMWR1XHI/XHUwMDFlW/Wnpbi//59cdTAwMWL/5+cl//QqvrhMXHUwMDE5XHUwMDE2gj9cdTAwMWbWXHUwMDBmSfD8/JuKYFD/+dJ//1x1MDAxZq2rPGoifQ==KarlosDriverMemoryManagementDisplayStandard LibrarySetup/CPU InternalsTimeFilesystemBootloader- Output Handeling- Panicking-Frame Buffer - Font HandelingBootbootPCIString functionsTar file parsingPS/2RTC CMOSSATA Tagging Based FSOutput function IR HandelingMulticore SetupAllocatorSlab BuddyPaging \ No newline at end of file diff --git a/poster.typ b/poster.typ new file mode 100644 index 0000000..ac45547 --- /dev/null +++ b/poster.typ @@ -0,0 +1,183 @@ +#set page(paper: "a3", margin: 2cm) + +#let karlos-color = rgb("#009c72") +#show: it => block( + width: 100%, + height: 100%, + stroke: black, + radius: ( + top-left: 64pt, + bottom-right: 64pt, + ), + inset: 32pt, + it +) + +#let logo-image = image(width: 64pt, "karlos-logo.svg") +#let logo = stack( + dir: ltr, + logo-image, + h(10pt), + [ + #text(font: "fira sans", size: 64pt, weight: "black")[KarlOS] \ + #text(font: "fira sans", size: 16pt, weight: "bold")[Karlsruhe Operating System] + ] +) + +#set text(font: "fira sans", size: 16pt) +#set list(marker: [•]) + +#let text-block(it) = block( + fill: rgb("#009c72").transparentize(70%), + radius: ( + top-left: 8pt, + bottom-right: 8pt, + ), + inset: 8pt, + it +) + +#let text-block2(head, it) = stack( + dir: ttb, + block( + width: 100%, + fill: karlos-color.transparentize(50%), + radius: ( + top-left: 8pt, + ), + inset: 8pt, + heading(level: 2, head) + ), + block( + width: 100%, + fill: karlos-color.transparentize(70%), + radius: ( + bottom-right: 8pt, + ), + inset: 8pt, + it + ) +) + +#grid(columns: (1fr, 1fr), gutter: 16pt, +[ +#logo + +#text-block2("Who are we?", [ +Hobbyist OS-enthusiast students at KIT +]) + +#text-block2("Our OS", [ +- Architecture: x86 +- Language: modern C +- Organization + - Monolithic kernel + - Multicore + - Non-POSIX, not Unix-like +#place(horizon + right, block(inset: 16pt, image("c-logo.svg", width: 20%))) +]) + +#text-block2("Goals", [ +- Platform for experimentation +- Non-standard task/process model +- Tagged file system +]) +], [ +#show raw: set text(font: "fira mono", weight: "bold", size: 4.6pt) + ```c +void +ram_init(void) +{ + ASSERT(!ram_initialized); + + // collect memory regions and remove initrd range, as well as page frame 0 + populate_ranges(&bootboot_free_cover); + // TODO removing this is not really necessary anymore, at least in my qemu case. + // We still keep it in because in the worst case it does nothing. + cover_remove(&bootboot_free_cover, (struct mem_range) { + .start = pa_from_value(bootboot.initrd_ptr), + .size = bootboot.initrd_size + }); + cover_remove(&bootboot_free_cover, (struct mem_range) { + .start = pa_from_value(0), + .size = PG_SIZE + }); + + // Calculate how many levels we need + uint64_t addrLimit = pa_to_value(cover_end(&bootboot_free_cover)); + addrLimit = next_pow2(addrLimit); + if (addrLimit == 0) { + PANIC("Zero physical frames available."); + } + ram_num_levels = __builtin_ffsl(addrLimit); // log2(addrLimit) + 1 + ram_num_levels -= PG_SHIFT; + DEBUG_PRINTF("addrLimit = %lu\n", addrLimit); + DEBUG_PRINTF("ram_num_levels = %u\n", ram_num_levels); + + // Allocate bitmaps for all levels; Initialize all memory as allocated + for (unsigned level = 0; level < ram_num_levels; level++) { + ram_layers[level].first_free = pa_from_value(INVALID_FRAME_ADDR); + + size_t bitmapSize = BITMAP_SIZE(1ul << (ram_num_levels - level - 1)); + + ASSERT(cover_steal(&bootboot_free_cover, bitmapSize, &ram_layers[level].avail_bitmap)); + memset(pa_to_pointer(ram_layers[level].avail_bitmap), 0x00, bitmapSize); + + ASSERT(cover_steal(&bootboot_free_cover, bitmapSize, &ram_layers[level].coherent_bitmap)); + memset(pa_to_pointer(ram_layers[level].coherent_bitmap), 0x00, bitmapSize); + } + + // align all segments to page size + cover_align(&bootboot_free_cover, PG_SHIFT); + + // Mark free frames as available + for (unsigned int i = 0; i < bootboot_free_cover.num_ranges; i++) { + uint64_t start = pa_to_value(bootboot_free_cover.ranges[i].start); + uint64_t length = bootboot_free_cover.ranges[i].size; + + uint64_t addr = start; + while (length >= PG_SIZE) { + unsigned level = 0; + for (;;) { + unsigned next_level_bytes = NUM_BYTES_COVERED_IN_LEVEL(level + 1); + // size and alignment need to fit + if (length < next_level_bytes || (addr & (next_level_bytes - 1)) != 0) { + break; + } + level++; + } + + DEBUG_PRINTF("freeing %lx at level %u\n", addr, level); + free_block(pa_from_value(addr), level); + + addr += NUM_BYTES_COVERED_IN_LEVEL(level); + length -= NUM_BYTES_COVERED_IN_LEVEL(level); + } + } + + ram_initialized = true; +} + ``` +] +) + +#image(width: 100%, "kernel-diagram.svg") + +#let qr = block( + stroke: 3pt + black, + inset: 8pt, + radius: 16pt, + image("qr-karlsruhe-os-de.svg") +) +#place(bottom, grid( + columns: (2fr, 1fr), + gutter: 16pt, + align(bottom, text-block2("Join us if you...", [ + - are interested in systems programming + - want to see what goes into developing an OS + - have (or want to gain) experience in C programming + ])), + qr, + [], + align(center, text(weight: "bold")[karlsruhe-os.de]) +)) diff --git a/qr-karlsruhe-os-de.svg b/qr-karlsruhe-os-de.svg new file mode 100644 index 0000000..ed8ca8e --- /dev/null +++ b/qr-karlsruhe-os-de.svg @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file