From 269960ad8a3f967224c7c83b10af71e4e8b3d77e Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 10 Sep 2022 16:45:13 +0100 Subject: [PATCH] fix styles examples, box model docs --- docs/examples/guide/dom1.py | 2 ++ docs/examples/guide/dom2.py | 2 ++ docs/examples/guide/dom3.py | 2 ++ docs/examples/guide/dom4.css | 6 +++--- docs/examples/guide/styles/screen.py | 12 ++++++++++++ docs/guide/CSS.md | 6 +++--- docs/guide/styles.md | 11 +++++++++++ docs/images/styles/box.excalidraw.svg | 4 ++-- 8 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 docs/examples/guide/styles/screen.py diff --git a/docs/examples/guide/dom1.py b/docs/examples/guide/dom1.py index 10b05c591..e1f9fa14e 100644 --- a/docs/examples/guide/dom1.py +++ b/docs/examples/guide/dom1.py @@ -6,3 +6,5 @@ class ExampleApp(App): app = ExampleApp() +if __name__ == "__main__": + app.run() diff --git a/docs/examples/guide/dom2.py b/docs/examples/guide/dom2.py index 8d5f900c0..b8b2913bf 100644 --- a/docs/examples/guide/dom2.py +++ b/docs/examples/guide/dom2.py @@ -9,3 +9,5 @@ class ExampleApp(App): app = ExampleApp() +if __name__ == "__main__": + app.run() diff --git a/docs/examples/guide/dom3.py b/docs/examples/guide/dom3.py index fe474ef22..b90231fe3 100644 --- a/docs/examples/guide/dom3.py +++ b/docs/examples/guide/dom3.py @@ -21,3 +21,5 @@ class ExampleApp(App): app = ExampleApp() +if __name__ == "__main__": + app.run() diff --git a/docs/examples/guide/dom4.css b/docs/examples/guide/dom4.css index 014142f7b..1225e32aa 100644 --- a/docs/examples/guide/dom4.css +++ b/docs/examples/guide/dom4.css @@ -2,9 +2,9 @@ /* The top level dialog (a Container) */ #dialog { margin: 4 8; - background: darkblue 20%; - color: darkblue; - border: tall darkblue; + background: $primary; + color: $text-primary; + border: tall $text-primary; padding: 1 2; } diff --git a/docs/examples/guide/styles/screen.py b/docs/examples/guide/styles/screen.py new file mode 100644 index 000000000..77caa300d --- /dev/null +++ b/docs/examples/guide/styles/screen.py @@ -0,0 +1,12 @@ +from textual.app import App + + +class ScreenApp(App): + def on_mount(self) -> None: + self.screen.styles.background = "darkblue" + self.screen.styles.border = ("heavy", "white") + + +app = ScreenApp() +if __name__ == "__main__": + app.run() diff --git a/docs/guide/CSS.md b/docs/guide/CSS.md index f656f0121..5f755a643 100644 --- a/docs/guide/CSS.md +++ b/docs/guide/CSS.md @@ -75,7 +75,7 @@ Let's look at a trivial Textual app. ```{.textual path="docs/examples/guide/dom1.py"} ``` -When you run this code you will have an instance of an `ExampleApp` in memory. This app class will also create a `Screen` object. In DOM terms, the `Screen` is a _child_ of `ExampleApp`. +This example creates an instance of `ExampleApp`, which will implicitly create a `Screen` object. In DOM terms, the `Screen` is a _child_ of `ExampleApp`. With the above example, the DOM will look like the following: @@ -139,7 +139,7 @@ You may recognize some of the elements in the above screenshot, but it doesn't q ## CSS files -To add a stylesheet we need to pass the path to a CSS file via the app classes' `css_path` argument: +To add a stylesheet we pass the path to the app with the `css_path` parameter: ```python hl_lines="23" --8<-- "docs/examples/guide/dom4.py" @@ -163,7 +163,7 @@ With the CSS in place, the output looks very different: ### Why CSS? -It is reasonable to ask why use CSS at all? Python is a powerful and expressive language. Wouldn't it be easier to do everything in your `.py` files? +It is reasonable to ask why use CSS at all? Python is a powerful and expressive language. Wouldn't it be easier to set styles in your `.py` files? A major advantage of CSS is that it separates how your app _looks_ from how it _works_. Setting styles in Python can generate a lot of spaghetti code which can make it hard to see the important logic in your application. diff --git a/docs/guide/styles.md b/docs/guide/styles.md index 4b5ad968a..7346ced7f 100644 --- a/docs/guide/styles.md +++ b/docs/guide/styles.md @@ -7,7 +7,18 @@ Textual provides a large number of *styles* you can use to customize how your ap Every widget class in Textual provides a `styles` object which contains a number of writable attributes. Styles define the position and size of a widget, in addition to color, text style, borders, alignment and much more. +Let's look at a simple example which sets the styles on the `screen` (a special widget that represents the screen). +```python title="screen.py" hl_lines="6-7" +--8<-- "docs/examples/guide/styles/screen.py" +``` + +The first line sets `screen.styles.background` to `"darkblue"` which will change the background color to dark blue. There are a few other ways of setting color which we will explore later. + +The second line sets `screen.styles.border` to a tuple of `("heavy", "white")` which tells Textual to draw a white border with a style of `"heavy"`. Running this code will show the following: + +```{.textual path="docs/examples/guide/styles/screen.py"} +``` ## Box Model diff --git a/docs/images/styles/box.excalidraw.svg b/docs/images/styles/box.excalidraw.svg index 470c9204b..67a960567 100644 --- a/docs/images/styles/box.excalidraw.svg +++ b/docs/images/styles/box.excalidraw.svg @@ -1,6 +1,6 @@ - eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1cXGtTXHUwMDFhy1x1MDAxNv2eX2F5voY+/X6k6tatSDTGV1R8JN66ZY0wyCgwZFx1MDAxOFQ8lf9+d4Nh3iOgXCLmpqtOjkxcdTAwMGZMT++99l6rX/+8W1lZXHKHPXf1w8qqe1d32l4jcG5X39vrN27Q9/wuVNHR574/XGLqoztbYdjrf/j7745cdTAwMTNcXLthr+3UXXTj9Vx1MDAwN067XHUwMDFmXHUwMDBlXHUwMDFhno/qfudvL3Q7/X/bf/ecjvuvnt9phFx1MDAwMYpcdTAwMWVScVx1MDAxYl7oXHUwMDA342e5bbfjdsM+/Pp/4PPKyj+jf2OtXHUwMDBi3HrodC/b7uhcdTAwMGKjqqiBhPL01T2/O2qsMVDJNIlu8Pqf4HGh24DaJjTZjWrspdXhyZ2j1/c+7nS++sFJv9b1m/VG9NSm127XwmF73Fx1MDAxM069NVxiYm3qh4F/7Z56jbBl25W6Pvlew1x1MDAwZm1cdTAwMDMm1YE/uGx13X4/8SW/59S9cGivYTy5Ou6FXHUwMDBmK9GVO/jEXHRBhFx1MDAxMiE5o0Ryadik2v5cdTAwMDDFXHUwMDFhaalcZmZMYCOJ1KmmVf02XHUwMDE4XHUwMDAzmvZcdTAwMTdcdTAwMWWVqG1cdTAwMTdO/fpcdTAwMTJcdTAwMWHYbUzuXHRcdTAwMDOn2+85XHUwMDAxmCy67/bhpblhiFx1MDAxYolcclNiUtlyvctWXGK1TDAkoSFSx2r77shcdTAwMWFcdTAwMDRcdTAwMTNGmNLRm9nn9r40Rn7x33Rntpyg99Bnq337IdZm29z1mFNFX1x1MDAxZfRcdTAwMWHO2PhESqopJUpcdTAwMGJcdTAwMWE9su11r6GyO2i3o2t+/Tryl9HVn+/n8FMhVZGfUjCZ5lx1MDAwMsup/XRn80u76e/VN5ud4eGld7NzQDf6XHUwMDA1ftr3XHUwMDAxdDN7aepbjzkpe9RHlUTCaMqo4FhcdMFk0keVQlhwJjSn3FBd7KKiyVx1MDAxYXVe6qJ/8bp0m1wi655MKKSF4Fx0XHUwMDA3nLgnJVx1MDAxOClpXHUwMDA0IzTjnlx1MDAxNLAjieD6+d3zoVwi8qeYnetfd763vm1cdTAwMWU3hsZ0XHUwMDA3e6SnWlxyb/JbXHTnc4LAv12d1Px8+Gs5nJ/FfDvl/ERgxYTBSk/t/dc7V1edfvDjNHDvXHUwMDAys/5t/WzAPy19lFx1MDAxNlRZ9zKMc4ktXGZcdTAwMTJcdTAwMDBglINrQlx1MDAwNFRQZ4wpXHUwMDA2gCvhnifEaCpcdTAwMDSimmFBJGRcZq5lXHUwMDE2XHRcdTAwMDRTXHUwMDA0NVx1MDAwMlx1MDAwMCtcZuE6XHUwMDA21l94wNJIXHUwMDAwhJCLXHUwMDAyxC8/XHUwMDBi3bswiYCxU2yffdw9+bG5eba2eVx1MDAxNpzfaubdrTkxPLzP/9nxl++HeuPzXHUwMDExZzvbd62q77X26+vXn5dcdTAwMTNnifePXHUwMDEzNVJcYjGpXHI2VGI6NcJuPMz4htlTg4NP9etcdTAwMGJzsHUsvz4zwmbMMI9cdTAwMDNcZjxcdTAwMTJxJbS2+NKAolx1MDAwNMBcdTAwMDThkGEogVrDoTN4IcCeSoIkzVwiKptRXGJcdTAwMTaSKkbpXHUwMDBipJTndMbI6H43rHn3I8KCXHUwMDEzVzecjtdcdTAwMWUm7DbyUmjprlx1MDAxM1xcet14X/ZdeOYo8OvE3Vx1MDAxZtvepfXj1bbbTDp46IFumFSHfuzN6/B0XHUwMDA3fi740ki/hVx1MDAxZnjwZKd9lGzJXFzYYjHzpbClQWFwTKeH1rDf3a5cdTAwMWQ0rtad1pfNnWvZPbjpt1x1MDAxNpi88JzYokhRzFx1MDAxOcgpXHUwMDA24Fx1MDAxMVx0bHHOXHUwMDExl5A1LHuyyFMvXHUwMDA2LsWnXHUwMDA0l1x1MDAwMlxyYvCC+ZqnWls39a3ql/Uu++j2vrdDcX70annkadDdd1x1MDAxYVxyr3u5XGbY/dWUucArdPriRHdZqlx1MDAwNVx1MDAxY0dOL7zyWcayo1cwWkY9JUdCXHRgg0ZSoYpcdTAwMTPjk5knz1Nd0WDFXHUwMDAzeCHWMIa1/I1cdTAwMTIjy6CrXG7V0KpcdTAwMTXoKidcdTAwMWZiJlx1MDAxZmJ1+JZcdTAwMWKUgKzjNVx1MDAxYXFcdTAwMTWWxNlj4ilccr1EO0vxVy5cdTAwMDBZYVx1MDAwNiXCUEOonEFcdTAwMDBuXHUwMDFmXrY2Lzb2zLB1dXK5d1x1MDAxNIhvd7dcdTAwMDUorFx1MDAwN36/X2k5Yb1VhMS0x79cdTAwMWNFXHUwMDFkjYJoI1xiwUZcdTAwMWFCWFx1MDAxMolUcaRcdTAwMTSkT4ypXHUwMDAxYmGKsTjFMEgpXHUwMDE251x1MDAxZlxu0Vx1MDAxY+RcdTAwMDSI9oUpv7HNzz6dO2v3XHUwMDFm6+3j2udhZ/fq4+HBXHUwMDE1ny61lkq/3a27deM3tzZEcFT5fte+93bV9XJKv/Hz87RcdTAwMWYjhUlOM6Elw2Z6dJX39Mzoolx1MDAwYkNcdTAwMTdwU2Q41pA+iFFcIlx1MDAxNlBGJFx1MDAxNWo5iC5cZjnQ6mFWiK2nclRDkKZGY05cdTAwMThTnOTgS0pcdTAwMDRcdTAwMTGPXHUwMDFisFx1MDAwYtxcYjowS2AlkVTKmJacXHUwMDFhZaOWLjpcdPZDJ1xi17zuiKd9iFx1MDAwMe3X/M44+1xmxPBkIKr42sO1047sXFzdqFx1MDAxMz+GNkib9cGI6EB00piAVFeCY2lcdTAwMTSL3XTp9EZ9XHUwMDA01mbQR8RcYq64ZPzhjlx04FfdbuPxNpVnk0SbwLk0ZtAsgJQx0cTSpE1cdTAwMTRporVcdTAwMDZKxTghwLhEpk1tp1x1MDAxZlb9TsezLG/f97phuotHffnRgr3lOlx1MDAxOXJcZu9cdTAwMTSvS0eFnv3FZDSN/lqJXHUwMDEwM/ow+fu/73PvLvJkWypcdTAwMTknjn7tXfz/s1x1MDAxMnapi7lcdTAwMDKmXHUwMDFjXHUwMDE0t2HTT+mVe9xCotl8pJ0qjYxRRChCOdWMpDS3xEgwpTjmXHUwMDEwrLSJiZjn5lxuJmdAKzskrLlcdTAwMDBcdTAwMWEnZGSaZedcdTAwMDUvkL9zRYFOXFwtkdxrftCIc/uYXHUwMDFjiPGwRSjuh5bMid8yxVxypFPxXHUwMDE58Lt93qzUN4921nu1neGF8HpcdTAwMTdcdTAwMDdcdTAwMTfn8+P32VS3fFx1MDAxNL+UIMVcZiVaXHUwMDAyiCFzREl+zPUxXCJYYyAqWmJcdTAwMWNDd1x1MDAxYb7p2cziXHUwMDE5T8ay4CVcImfELItewoFcdTAwMWZBRls0rb84JKe7nXt/eNLF1f3a8UZtb2fwVuE7McxSQDhqzXyqglx1MDAxMEHSlyeJXHUwMDE4XHUwMDE0XCJRyojpZUW5pZdaVlx1MDAwMNFcdTAwMDHZYIBcdTAwMDRRJkVq5Vx1MDAwMtRcdTAwMWFQXHUwMDEzoOepXHUwMDFkPXvS4poyXHUwMDFjM4GMUopIXGIojDCcIytcYkVcdTAwMDRkO+BcdTAwMThisJEk1kdcdTAwMGYo12A4I4X+zWRFeZKIUfhcbkZMXHUwMDE4XG6dpLhdjmKEit010Vx1MDAxNZxcdTAwMTKqQH6Bllx1MDAwNGVRLiuSr/GGyH2xR41q0770TOxexJZcbqXnqVx1MDAwNbZBZYbJtPNb3K+eXHUwMDFl7lx1MDAwZXZbXHUwMDFk05V7W7S3Lt5cdTAwMDS5N1x1MDAxMDUokHdccvFcdTAwMDRcXJGlh+RcdTAwMDVcdTAwMDJmYIzmklx1MDAxM51u10xD8iUxRUZjzKXEnlx1MDAwMVaUXvBcXNrpXHUwMDA1d/e/nO4515ub1ZNjLbZqV/tvlFx1MDAxOYyNsVx1MDAwNKRg3JD5+IAuRi5kXHUwMDE1XHKRZFx1MDAwNlpfbt1lZlx1MDAwM0ohwINU0k4xM2OStJ5phkCqXHUwMDEzzIEqKMr4k6bCS7BLMUFcdTAwMWNCuFx1MDAwMuUvgburvFUnyI6MUWJHx1x1MDAwNNUmPp/wQFxiJFx1MDAwNj1mXHUwMDA0mUO1LzMhKE9cZivxMT1cZp3HXGJcdTAwMDRkSIBcdTAwMTDqhInd9UBcYmxPayqVZXiGS8p+U0ZQ7FO2VLLuNCMnKJZcdTAwMWGseMyAUEyBglx1MDAwM6CmXHUwMDBlLuVzOjPN0i+OXHUwMDEyKE2QJVpcdTAwMTJcXExRnmJcdTAwMDSCglxi4YqBKDNcdTAwMDRcZvNyy9cwomBZTYRcdTAwMDJcdTAwMTaiITbQvFx1MDAwMVx1MDAwNGYhwe06XHUwMDFiIJCKZ1fgXGKmQC5h/kZcdTAwMDNLXHUwMDFhg884jVx1MDAwMFx1MDAxYURhXHUwMDAz+VJyyex6RVx1MDAxMSPeXHUwMDBmIUchMppigJRK7VxcscxEnLdcdTAwMTRXSlxcypZKxpueLa5cdTAwMTBROJfAmMRAavX0i3/2m/puT++1L6rh1dHR92911W9uv4WwYlx1MDAxNVx1MDAxY1acQEznSbpcdTAwMDJqXGZxLFx1MDAxOTdcdTAwMDRDh/BipfH0sFx1MDAwMmJcdTAwMTKCuOaGge/z2HaYKKpcdTAwMTCkNCRcdTAwMTZcZpbhknCZ5StcdTAwMDJcdTAwMWFcdTAwMGLpYJ5Vs8tcdTAwMWRW3ixpKDasLVmTzojtkU7KgTYtXHUwMDE5nGTwXHUwMDFjKeKLXCJcdTAwMWWD9trG+sktdoW621x1MDAxNFx1MDAxYltXzve6L4evu+D90Vx0XHUwMDA2QzVcdTAwMDKhXHUwMDAxOoNAguAyud59tJZIY805kHuIuqR4fvCp0Fx1MDAxNlx1MDAxOJH0tr5oTFx1MDAxMqVXXHUwMDE5RWORXG5jzsxcdTAwMWNb/v5/oZyoe1ZcdTAwMWPnWNGWif2eXHUwMDBit8akr0azg1x1MDAxMkhcdTAwMTH8Nz1u2daP21rdYDw4vTlpNVx1MDAxNDlY+8peXHUwMDE3t2JcdTAwMWHcasNAd8pcdTAwMWPccm1cdTAwMTBgglx1MDAxMvPiuOXabjlcdTAwMTOS5sBcdTAwMTYjZuct83DLXHUwMDAxt0LG12v+we0r4jZrRVsqkVx1MDAwMZ+LTDNcXKjRXHUwMDE1Z1x1MDAxNHx5hkWGn+6a0j37Uam2vPXj886nT8dcdTAwMTeH669cdTAwMGLcx7m04Vx1MDAwNlx1MDAxOUZcdJRcdTAwMWPkMrBcdTAwMDRcdTAwMDdgUGGV3YtcIlx1MDAxN6PCTfaSIWpHYllcdTAwMTa5XHUwMDE0WqVcYlx1MDAxNX+AuzzcOWVHWyoxXHUwMDEzPlx1MDAxYnZjk2pptlxmVFliOstcdTAwMWU20tgnt1x1MDAxN1x1MDAwN/WNz7WLy2r19nsgjneXXHUwMDFmvFx1MDAxYWFM7bh8XtolxIZRXCJcdTAwMTR+6bRL7UlcdTAwMDf5ZFlyXHUwMDA0MYbmpV077qqFVH/Y8rKAN2NHW2JcdTAwMTacXHUwMDExu4WbT3HhXHUwMDEwllx1MDAxZLfBksdcdTAwMTTUY8j1v1x1MDAxZO+cuMFV7+Twbrh+v7271urLpUcu5YgpJojiPCftSrWotCty5suzXHUwMDFiZIymwMe0+Y32r2VntDfH71x1MDAxZuvK19pcdTAwMWP60JJSbFx1MDAxNYpRWbyxm9nFqvG1XHUwMDE3j2Hr++nl8XV9d8eV92GvRszdZfhlc8m1KFdcdTAwMWF0gojGkJJHR1x1MDAxMcORtlKPLiArXHUwMDE2XHUwMDFmXHUwMDFjxVx1MDAwNVx1MDAwMkWcy2mJXHUwMDEwWmBN3+pGmd9NjWbNaEslZsFcdTAwMTnTYiF0WeG5b1x1MDAwNCtcdTAwMWJ+OZ1+amfQ6t5cdTAwMTLPIT82TslcdTAwMGXfMmdHXb9oR+myYFczjoTda5SrRokhkFx1MDAxNqlawDhcdTAwMTJF0Nn5wCVcYutU5WTlXHRcdTAwMTBaTrX67SaI3ypwk3aypVx1MDAxMrPfjLAtVqKi+Fx1MDAxYzxshLaLUafPua2t64uDXqVy2r/frFUrbKj2KkV7VZeGz8IrXCJdyGeJkohcdTAwMTlOXHUwMDE2wGdcdFV29jdv/Fx1MDAxN9SwJUA5+79cdTAwMTnnXFxrQv8k3GVcdTAwMTGilYxcdTAwMWTHVycmfDbs6uKcy1xmo5qxXHUwMDE5RpGkS25PXHUwMDBm1k6rg1x1MDAxZsfNflCrXHUwMDFlY5cuO3ZcdTAwMTUlyK7sNLmTN4BoqFUg/l9cdTAwMWW7mKE0J47N3pAkrn8lXUJcdTAwMDRcdTAwMTY4vpbuXHUwMDBmeF95XHUwMDE3RtaOo+89WHBG6Fx1MDAxNp5cdTAwMGVIi7Oulszu/Zt+7uZIN7fvz7YuXHUwMDBm3W/ra9uBc3peuynakrk0wJWcXCKLV8FNXtJcdTAwMWTtpl7MaolIYpedYKYx1kCF5tmp9XZGkcZuXHUwMDEw68rXXHUwMDFhRFx1MDAxYTdkvqxIVPHhtlx1MDAwNFx1MDAxYlCjhE0/Qlt+XHUwMDE06dIuMoQgXHUwMDA2OZFRwzSQ1+TaZS5cdTAwMTRcIsZQOdpcdTAwMGUtRPHJK1x1MDAxMFx1MDAwNlx1MDAxZP6keVGiqIJiiIFMrXHe2mUqQNRgRY09XHUwMDBiVEF7MqtcZo00XGbbQ4lcdTAwMTefJck82Hvy2uXyQ8FWYmuXQVx1MDAxMGJcdTAwMDKByVx1MDAxZVxuQlxylpHvr/xau8ztXHUwMDE5KNKe5y7sqdlCvO0zUEp8ypZK1p2ei25cdTAwMTNeODptoPOpXHUwMDEyM8z8lFx1MDAxZk25tHGFgrAx2M58XHUwMDFhISNwjE9AIYhozTFRWOr4XHUwMDAx4s9cdTAwMWZW7MYgSYElaCxEfFNDJJg1klx1MDAxNIO0Z3ZfsWYkc66hbSZwXGZF5zhiYVx1MDAxOcJKUfAoP9E2XHUwMDE5PDhcdTAwMDZhZM9cbtKQNVx1MDAxM/uLfu21XHUwMDEydrW6JFxcXHRh7JmUv+vu60qxU9mSdaeiqPLu4Vx1MDAxMatOr1dcdTAwMGLB9lx1MDAxM1OBe3mNXHUwMDA3Tlx1MDAxNr3n6o3n3q7l7DVsjoolQaO+tiHBtW/7z893P/9cdTAwMDc6dFx1MDAxMKIifQ== + eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1cXGtTXHUwMDFhy1x1MDAxNv2eX2F5voY+/X6k6tYtJVx1MDAxYeMrKj5cdTAwMTJv3bJGXHUwMDE4ZFx1MDAxNFx1MDAxODJcZiqeyn+/u0GZN1x1MDAwMlwiYm6m6uTINDCb3nvtvVa//vmwsrJcdTAwMWH2O+7qp5VV977qNL1a4NytfrT3b92g6/ltaKKD112/XHUwMDE3VFx1MDAwN+9shGGn++nvv1tOcOOGnaZTddGt1+05zW7Yq3k+qvqtv73QbXX/bf/dd1ruvzp+q1x1MDAxNlx1MDAwNih6SMmteaFcdTAwMWZcZp/lNt2W21x1MDAwZbvw7f+B1ysr/1xm/o1ZXHUwMDE3uNXQaV813cFcdTAwMDdcdTAwMDZNkYGE8vTdfb89MNZcdTAwMThoZJpEb/C6n+FxoVuD1jqY7EYt9tZq//Te0Vx1MDAxYvtru61vfnDarbT9erVcdTAwMTY9te41m5Ww31x1MDAxY/aEU230gphN3TDwb9wzr1x1MDAxNjasXan7o8/V/NBcdTAwMWEwalx1MDAwZfzeVaPtdruJXHUwMDBm+Vx1MDAxZKfqhX17XHUwMDBm49HdYS98Wonu3MMrTlxiXCKUXGLJXHUwMDE5JZJLw0bN9lx1MDAwYijWSEtlMGNcdTAwMDJcdTAwMWJJpE6ZVvab4FxmMO0vPLhcItsunerNXHUwMDE1XHUwMDE42K6N3lx1MDAxM1x1MDAwNk6723FcdTAwMDJwWfS+u8dcdTAwMWbNXHJD3EhsmFx1MDAxMqPGhutdNUJoZYIhXHSGSFx1MDAxZGvtulx1MDAwM29cdTAwMTBMXHUwMDE4YUpHv8w+t/O1NoiL/6Y7s+FcdTAwMDSdxz5b7dpcdTAwMTcxm625XHUwMDFisaCKPtzr1Jyh84mUVFNKlFx1MDAxNjR6ZNNr30Bju9dsRvf86k1cdTAwMTQvg7u/Ps5cdTAwMTCnQqqiOKXgMs1cdTAwMDWWXHUwMDEzx+nu1tdm3d+vbtVb/aMr73b3kG52XHUwMDBi4rTrXHUwMDAz6KaO0tSnnlx1MDAwYlL2bIwqiYTRlFHBsVx1MDAxMoLJZIwqhbDgTGhOuaG6OERFndWqfGyI/sWr0q2LbHgyoZBcdTAwMTaCJ1x1MDAwMnBcdTAwMTSelGCkpFx1MDAxMYzQTHhSwI4kguv5h+djQ1x1MDAxNE8xP1e/7f5ofN86qfWNaff2SUc1at7ou1x1MDAxMsHnXHUwMDA0gX+3Omr59fjXclx1MDAwND+LxXYq+InAilx0g5WeOPpvdq+vW93g51ng3lx1MDAwN2bj+8Z5j39e+iwtqLLhZVx1MDAxOOdcdTAwMTJbXHUwMDE4JFx1MDAwMMAoh9CEXGaooM1cdTAwMThTXGZcdTAwMDBXwntekKOpXHUwMDEwiGqGXHUwMDA1kVAxuJZZJFx1MDAxMExcdTAwMTG0XGJcdTAwMDCsMITrXHUwMDE4WJ/wgKWRXHUwMDAwXGIhXHUwMDE3XHUwMDA1iKc4XHUwMDBi3fswiYBhUOycr+2d/tzaOl/fOlx1MDAwZi7uNPPu151cdTAwMThcdTAwMWU+5n/t8MNcdTAwMGZ9vfnlmLPdnftG2fdcdTAwMWFcdTAwMDfVjZsvy4mzxO+PXHUwMDEzNVJcYjGpXHI2VGI6McJuPcz4ptlXvcPP1ZtLc7h9XCK/zVx1MDAxOWFTVpjnXHUwMDAxXHUwMDA2XHUwMDExibhcdTAwMTJaW3xpQFFcdTAwMDJggnCoMJRAq+HQXHUwMDE5vFx1MDAxMGAvJUGSZlx1MDAxMZWtKFx1MDAwNFx1MDAwYklcdTAwMTWj9Fx1MDAxNUrKPIMxcrrfXHUwMDBlK97DgLDgxN1Np+U1+1x0v1xyolx1MDAxNCzdc4Irr1x1MDAxZO/Lrlx1MDAwYs9cdTAwMWMkfp1491rTu7JxvNp068lcdTAwMDBcdTAwMGY90Fxyo+bQj/3yKjzdga9cdTAwMGK+1tK/wlx1MDAwZjx4stM8TloyXHUwMDEztljMfSlsaVBcdTAwMThcdTAwMWPTyaHV77Z3Koe161xyp/F1a/dGtlx1MDAwZm+7jVx1MDAwNVx1MDAxNi88I7YoUlx1MDAxNHNcdTAwMDZyilx1MDAwMXhEXHUwMDAyW5xzxCVUXHLLnizy1KuBS/FcdMGlQINcdTAwMTi8YL7mqcb2bXW7/HWjzdbczo9mKC6O36yOvFxmulx1MDAwN06t5rWvllx1MDAwMbtPpsxcdTAwMDReodM3R7rLUi3gOHJy4ZXPMpZcdTAwMWS9gtFx1FNyJJRcdTAwMDA2aCRcdTAwMTWquDC+mHnyPNVcdTAwMTVcclY8glx1MDAxN3JccmNYy9+oMLJcZrrK0FxmVq1AVzn5XHUwMDEwM/lcdTAwMTCrwqfcYFxmyFperVx1MDAxNldhSZw9J57S0EvYOVx1MDAxNn/jXHUwMDA1ICusoERcdTAwMThqXGKVU1xiwJ2jq8bW5ea+6TeuT6/2j1x1MDAwM/H9/q5cdTAwMDCF1cDvdktcciesNoqQmI7416Oog1FcdTAwMTBtXHUwMDA0IdhIQ1xiS1wikSqOlILyiTE1QCxMMVx1MDAxNidcdTAwMThcdTAwMDZcdTAwMTmLxdmHQjRcdTAwMDc5XHUwMDAxon1hym/o8/PPXHUwMDE3zvrDWrV5UvnSb+1dr1x1MDAxZFx1MDAxZF7zyUrrWOm3t32/Yfz69qZcYo5LP+6bXHUwMDBm3p66WU7pN3x+nvZjsSHfdJFcdTAwMDNogZhjfHKKOr6rp4ZcdTAwMTddXHUwMDE4vICcXCLDsYb6QYxcdTAwMTKxjDJgqdAqgFx1MDAxNEpuhO1cdTAwMTXJXG7R9VKWXG5sWUpccjWMYWmRrLNcdTAwMTDjXHUwMDE0XHQwQVhcdTAwMTKiXHUwMDE1ZpkySLAkXHUwMDEyrIzJyYmBNjB1tjpcYqSZxoyZolx1MDAwZXZDJ1xi1732gKp9imHtaYpnWIB6on/aXHUwMDEzZXzj4cpZS7aub9WpXHUwMDFmXHUwMDAzXHUwMDFjVM5qb8B1kOKCMFxuXHRRYMiWMvaeK6cz6FwicDeDLlwiRnDFJeOP71x1MDAxOEF+1W3XnjdpfD1JmESogZxpraFcdTAwMThcdTAwMTOjedYoZDSWmHBcdTAwMDX+J1x1MDAxOMzKXHUwMDE41XS6YdlvtTxL9Fx1MDAwZXyvXHUwMDFkprt40JdrXHUwMDE271xy18nwY/hR8bZ0YujYb0wm1OivlVxiM4NcdTAwMTejv//7MffdhaFsr1ImiqOv+1x1MDAxMP//tKRd6mK+gMFcYspccpt8Wm98yC0koc1G3KnSyFx1MDAxOEWEXCKUU81ISndLbDOa4phDutImJmTmzVx1MDAxN0zOoFZ2WFhzXHUwMDAxVE7IyDXLzlxyXqGG51xuXHUwMDAznbg7Rnav+0Etzu9jkiDGxVx1MDAxNqG6XHUwMDFmLZlcdTAwMTG/41Q3XHUwMDEwT8WnwO/ORb1U3Tre3ehUdvuXwutcXFx1MDAxZV5ezI7fuSlv+Sx+KUGKXHUwMDE5SrRcdTAwMDRcdTAwMTBcdTAwMDMziVx1MDAwNsaGfFx1MDAxZlxuXG7WXHUwMDE4uIqWUE5EyrDiXHUwMDE5zeJZT8ay4CVcImfULItewoFcIlx1MDAxOShcXFx1MDAwYqb2l0fkbK/14PdP27h8UDnZrOzv9t4rfEeOWVxuXGJH1symLFxiXHUwMDExJH17VIhBJVx1MDAxMqWMmFxcuI/39FIrXHUwMDBiiYjE3Fx1MDAxMMYok1witXpcdTAwMDFajVx1MDAwMVx1MDAxNSZccrUjaC9aYDNcdTAwMGXHTCCjlFwiXHUwMDEyXHUwMDEyXG4jXGbnSHdCXHUwMDExXHUwMDAx6Vx1MDAwZTiGXHUwMDFjbCSJ9dEjyjU4zkihXHUwMDE3qytmx+GEumJ8kYiR+Fx1MDAxMkZMXHUwMDE4XG6dXHUwMDA0+sJoUFx1MDAxNyr2rpGy4KBcdTAwMTFcdTAwMTXoL5CToC3GXHUwMDBii+TPeEfsvjiiXHUwMDA2relYmlx1MDAxM7tcdTAwMTex5ULpuWqBbVKZYkLt4lx1MDAwZXfLZ0d7vb1Gy7Tl/jbtbIh3Qe5ccmRcclxu5F1DPoFQZOlheYGAXHUwMDE5XHUwMDE40JiSXHUwMDEznbZrqmH5MTlFRuPMY4k9XHUwMDAzrCi94Pm0s0vuXHUwMDFlfD3bd262tsqnJ1psV65cdTAwMGbeKTNcdTAwMTg6Y1x0SMHQkNn4gC5GLlRcdTAwMTVccplkXG5aP967y8xcdTAwMDaUQoBcdTAwMDeppJ1mZsYkaT3TXGaBVCeYXHUwMDAzVVCU8Vx1MDAxN02Hj8EuxVx1MDAwNHFI4VxulL9cdTAwMDTurvJWniA7NkaJXHUwMDFkXHUwMDFmXHUwMDEzVJv4nMIjIZBcdTAwMTj0mFx1MDAxMWRcdTAwMDbVvsyEYHxhWImP6mHoPEYgIUNcdTAwMDGEVCdM7F2PhMD2tKZSWYZnuKRPI12/XHUwMDFiIyiOKXuVsuE0JScollx1MDAxYax4zIBQTIGC4ykmMcbP60w1U784SqA0QZZoSVxiMUV5ilx1MDAxMVxiXG5cIoQrXHUwMDA2osxcdTAwMTBwzOstYcOIgmc1XHUwMDExXG5YiIbcQPNcdTAwMDZcdTAwMTCYhVx1MDAwNLdrbYBAKp5dhSOYXHUwMDAyuYT5O00saVxmznFcIlx1MDAwMTSIwlx1MDAwNuql5JLZNYtcIka8XHUwMDFmU45ClpNDcWEgRTDAMZNx3lNeXHUwMDE5XHUwMDEzUvYqZaJpbnmFiMK5XHUwMDA0xiRcdTAwMDZSqydfXHUwMDAwdFDX9/t6v3lZXHUwMDBlr4+Pf3yvqm595z2kXHUwMDE1q+Cw4lx1MDAwNHI6T9JcdTAwMTVQY4hjybghXHUwMDE4OoRcdTAwMTcrjZenXHUwMDE1XHUwMDEwk5DENTdcZmKfx7bERFmFIKWhsGBpp85cYpdZvlwiwFgoXHUwMDA3s6ycXe608m5JQ7Fj7ZV16ZTYXHUwMDFl6KRcdTAwMWNo0zGDk1xmniNcdTAwMDUjk1x1MDAwZk6ub26c3mFXqPstsbl97fyo+rL/toven51gMFQjXHUwMDEwXHUwMDFhoDNcYlx1MDAxNFxiLpNr3lx1MDAwN+uJNNacXHUwMDAzuYesS4rnXHUwMDA3X1xubYFcdTAwMTFJb+2LxiRReqVRNFx1MDAxNqkw5szMsO3v/1x1MDAxN8qJtrniOMeL9lx1MDAxYflvXrg1Jn03mlx1MDAxZJRAiuC/yXHLtn/eVapcdTAwMDbj3tntaaOmyOH6N/a2uFx1MDAxNZPgVlx1MDAxYlx1MDAwNrpT5uCWa4NcdTAwMDBcdTAwMTOUmFfHLdd225mQNFx1MDAwN7ZcdTAwMTgxO2+Zh1tcdTAwMGW4XHUwMDE1Mr5m81x1MDAwZm7fXHUwMDEwt1kv2qtcdTAwMTQ5cF5kmuFCja44o1x1MDAxMMtmcuB+vq9L9/xnqdzwNk4uWp8/n1xcXHUwMDFlbbwtcJ/n0oZcdTAwMWJkXHUwMDE4JXDlIJeBJzhcdTAwMDCDXG6r7F5cdTAwMTW5XHUwMDE4XHUwMDE1brSXXGZRO1x1MDAxMsuyyKVglVwiVPxcdTAwMDHu8nDnlFx1MDAxZu1VirlwbtiNTaql2TJQZYnpNPvYSO2A3F1cdTAwMWVWN79ULq/K5btcdTAwMWaBONlbfvBqhDG14/J5ZZdcdTAwMTCbRolQ+LXLLrWnXHUwMDFk5JNlyVx1MDAxMeRcdTAwMTiaV3btuKtcdTAwMTZS/WHLy1x1MDAwMt6MXHUwMDFm7Vx1MDAxNfPglNgt3ICKXHUwMDBih7DsuFxyljymoJ5Drv/9ZPfUXHKuO6dH9/2Nh5299UZXLj1yKUdMMUFcdTAwMTTnOWVXqkWVXZEzX57dJGM0XHUwMDA1PqbNb7SHLTujvTX8/bGufKtccqKPlozFVqFcdTAwMTiVxZu7mV2sXHUwMDFhX3vxXHUwMDFjtn6cXZ3cVPd2XflcdTAwMTB2KsTcX4Vft5ZcXItypUEniGhcZil5fFx1MDAxNDFcdTAwMWNpK/XoXHUwMDAyqmLx4VFcXCC7MyWP01x1MDAxMiG0wJoueKfMO6+Lr6dGs260VynmwSnLYiF0WeHZb1x1MDAwNCubfjmdfGqn12jfXHUwMDExzyE/N8/ILt8258dtv2hX6bJgVzOOhNZcdTAwMDDdPDVKXGaBskjVXHUwMDAyxpEogs7OXHUwMDA3LkFYp1x1MDAxYUcrT4DQcqrVbzdB/F6Bm/STvUox/01cdNtiJSqKz8LDRmi7XHUwMDE4dfKa29i+uTzslEpn3YetSrnE+mq/VLRddWn4LPxEpFx1MDAwYvksUVx1MDAxMjHDyVx1MDAwMvgsocrO/uaN/4JcdTAwMWG2XHUwMDA0KGdcdTAwMGY445xrTeifgrssQrSU8ePw7siFc8OuLq65zDCqXHUwMDE5m2JcdTAwMTRJuuTu7HD9rNz7eVLvXHUwMDA2lfJcdHbpsmNXUYLsyk6TO3lcdTAwMDOIhlZcdTAwMDXi//Wxi1x1MDAxOUpz4tjsXHJJ4vqp6Fx1MDAxMlwisMDxtXR/wPvGuzCyflx1MDAxY3zu0YNTQrfwhEBaXFx1tWR279/kczfHur7zcL59deR+31jfXHScs4vKbdGWzKVcdTAwMDGu5Fx1MDAxNFm8XG5u8oruYDf1YlZLRFx1MDAxMnvcKWZcdTAwMWFjXHJUaJadWu9nXHUwMDE0aVx1MDAxOFx1MDAwNrGufKtBpKEhs1VFoopcdTAwMGa4JdiAXHUwMDFhJWzyXHUwMDEx2vHHkS7tXCJDSGJQXHUwMDEzXHUwMDE5NUxcdTAwMDN5Ta5d5kIhYlxmlYPt0EJcdTAwMTSfvVx1MDAwMmnQ4S+aXHUwMDE3JYoquFxmMVCpNc5bu0xcdTAwMDWIXHUwMDFhrKix54EqsCezytBIw7A9mHjxVZLMgr1cdTAwMTevXVx1MDAxZX8w2Eps7TJcYkJMIDFcdTAwMTlcciTCYKmyJ7NwZFx1MDAxM5c9013Yk7OFeCpi73XxcmFM2auUXHKnedFtwlx1MDAwYkenXHJ0PlViipmf8cdTLm1eoSBsXGa2M59GyFxiXHUwMDFjw1x1MDAxM1BcYlwiWnNMXHUwMDE0ljp+iPj804rdXHUwMDE4JCmwXHUwMDA0jYWIb2qIXHUwMDA0s0aSYpD2zO4r1oxkXHUwMDBmdVx1MDAwMjOBYyg6w1x1MDAxMVx1MDAwYsuQVoqSx/hTbZPJg2NcdTAwMTBGWlKloWom9lx1MDAxNz3ttVx1MDAxMna1uiRcXFx0Yey5lL/r7utScVDZK1x1MDAxYk5FWeXD4yNWnU6nXHUwMDEygu9HroLw8mqPnCz6nau3nnu3nrPXsD64LFx0XHUwMDFh9LVNXHSu/bX//Prw63+/jFx1MDAxMT4ifQ== - MarginPaddingContent areaBorderBackgroundColorHeightWidth \ No newline at end of file + MarginPaddingContent areaBorderBackgroundColorHeightWidth \ No newline at end of file