From 577c8a184b94adc357675c40016b718b0f6720c2 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Wed, 20 Jun 2007 16:57:42 +0200 Subject: [PATCH 0001/1741] initial commit --- .gitignore | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..e69de29bb2 From 01a8554b46a99f227b158dc31da322ff41915a48 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Thu, 28 Aug 2008 06:38:48 +0200 Subject: [PATCH 0002/1741] en/coding-standard: created --- en/coding-standard.texy | 328 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 en/coding-standard.texy diff --git a/en/coding-standard.texy b/en/coding-standard.texy new file mode 100644 index 0000000000..2f9ea6f6e1 --- /dev/null +++ b/en/coding-standard.texy @@ -0,0 +1,328 @@ +Coding standard +*************** + +This document describes rules and recommendations for developing applications and class libraries using the PHP language. + + +Common Naming Conventions +---------------- + +- Always choose meaningful and specific names. +- Avoid using abbreviations unless the full name is excessive. +- Use uppercase for two-letter abbreviations, and Pascal Case for longer abbreviations. +- When using camelCase or PascalCase, underscores are permitted. + + + +PHP Files +--------- + +- For files that contain only PHP code, the closing tag (`?>`) is never permitted. Not including it prevents trailing whitespace from being accidentally injected into the output. + +- Use an indent of 4 spaces, with no tabs. + +- The recommended line length is 80 characters, i.e. developers should aim keep code as close to the 80-column boundary as is practical. + +- PHP code must always be delimited by the full-form PHP tags: `` + +- Always match class name and file name. + +For all other files, only alphanumeric characters, underscores, and the dash character (`-`) are permitted. Spaces and are prohibited. Any file that contains any PHP code must end with the extension `.php`, or `.phtml` in case of templates. + + +Strings +------- + +When a string is literal (contains no variable substitutions), the single quote must always used to demarcate the string. Exception: when a literal string itself contains apostrophes, it is permitted to demarcate the string with double quotes. + +Strings may be concatenated using the `.` operator. A space must always be added before and after the `.` operator to improve readability. It is permitted to break the statement into multiple lines - each successive line should be padded with whitespace such that the `.` operator is aligned under the `=` operator: + +/--php +$sql = "SELECT `id`, `name` FROM `people` " + . "WHERE `name` = 'Susan' " + . "ORDER BY `name` ASC "; +\-- + + +Arrays +------ + +When declaring indexed arrays, a trailing space must be added after each comma delimiter to improve readability: + +/--php +$sampleArray = array(1, 2, 3, 'test'); +\-- + +When declaring associative arrays, it is encouraged put each key and value pair on separated line, padded with 4 spaces. After last pair must be added comma. + +/--php +$sampleArray = array( + 'firstKey' => 'firstValue', + 'secondKey' => 'secondValue', +); +\-- + + + +Classes +------- + +Naming conventions: +- PascalCase +- Use a noun or noun phrase for class name. +- Add an appropriate class-suffix when sub-classing another type when possible. +- Prefix class names with namespace. +- Examples: TexyParser, NHttpRequest + +Coding Style: +- The brace is always written on the line underneath the class name. +- Every class must have a documentation block that conforms to the PHPDocumentor standard. +- Any code within a class must be indented four spaces. + +Placing additional code in a class file is permitted but discouraged (static constructor calling is allowed). In these files, two blank lines must separate the class from any additional PHP code in the file. + +Class members implementation must follow this order: +1) Member Variables + a) public + b) protected + c) private +2) Constructor, Destructor +3) Properties +4) Methods + a) public + b) protected + c) private + + +The ultimate ancestor of all instantiable classes should be NObject. The ultimate ancestor of all uninstantiable classes should be NClass. + + + +Interfaces +---------- + +Interface classes must follow the same conventions as other classes, however must end with the word `Interface`. Example: DibiDriverInterface + + + +Variables +--------- + +Naming conventions: +- camelCase +- Variables and properties should describe an entity not the type or size. +- Do not include the parent class name within a property name. + +For class member variables that are declared as `private`, the first character of the variable name may be a single underscore to improve readability. This is the only acceptable usage of an underscore in a variable name. Member variables declared `public` or `protected` may never start with an underscore. The `var` construct is not permitted. + +Variables should always be as verbose as practical. Terse variable names such as `$i` and `$n` are discouraged for anything other than the smallest loop contexts. + +Variables must have documentation block with @var directive and specified type. + + + + +Properties +---------- + +Properties are OOP enhancement provided by NObject. They must follow the same conventions as other variables. Accessors must be prefixed with either `get` or `set` (followed by upper case letter) and declared as `public`. Getter is required, setter is optional. + +Example: + +/--php +public function getName() + +public function setName() + +$obj->name +\-- + + +Constants +--------- + +They must always have all letters capitalized, separated by underscore characters. + +Example: CONTENT_TEXTUAL, FIELD_NUMERIC + +Constants must be defined as class members by using the `const` construct. Defining constants in the global scope with `define` is permitted but discouraged. + + + + +Functions and Methods +--------------------- + +Naming conventions: +- camelCase +- Try to use a verb or verb-object pair. +- If method returns boolean, try to prefix name with "is", "can", "has". +- Names should be as verbose as is practical to enhance the understandability of code. +- Examples: fetchPairs(), getElementById(), isSubmitted() + +Functions in the global scope are permitted but strongly discouraged (except extension methods). It is recommended that these functions should be wrapped in a static class. + +Methods must always declare their visibility by using one of the private, protected, or public constructs. + +Like classes, the brace is always written on the line underneath the function name. There is no space between the function name and the opening parenthesis for the arguments. + + +This is an example of an acceptable function declaration in a class: + +/--php +/** + * Documentation Block Here + */ +class Foo +{ + /** + * Documentation Block Here + */ + public function verb() + { + // entire content of function + // must be indented four spaces + } +} +\-- + +The return value must not be enclosed in parentheses. This can hinder readability and can also break code if a method is later changed to return by reference. + + +Function and Method Usage +------------------------- + +Function arguments are separated by a single trailing space after the comma delimiter. This is an example of an acceptable function call for a function that takes three arguments: + +/--php +fooBar(1, 2, 3); +\-- + +Call-time pass by-reference is prohibited. + +For functions whose arguments permitted arrays, the function call may include the "array" construct and can be split into multiple lines to improve readability. In these cases, the standards for writing arrays still apply: + +/--php +fooBar(array(1, 2, 3), 2, 3); + +fooBar(1, 2, array( + 'firstKey' => 'firstValue', + 'secondKey' => 'secondValue', +), 3, 4); +\-- + + +Extension Methods +----------------- + +Extension methods are OOP enhancement provided by NObject. They must follow the same conventions as other methods, but they are declared in the global scope and prefixed with `{Class name}_prototype_`. First parameter must have object type hint. + +Example: + +/--php +function MyClass_prototype_newMethod(MyClass $obj) +\-- + + +Control Statements +------------------ + +Control statements based on the if and elseif constructs must have a single space before the opening parenthesis of the conditional, and a single space after the closing parenthesis. + +The opening brace is written on the same line as the conditional statement. The closing brace is always written on its own line. Any content within the braces must be indented four spaces. + +/--php +if ($a != 2) { + $a = 2; +} +\-- + +For "if" statements that include "elseif" or "else", the formatting must be as in these examples: + +/--php +if ($a != 2) { + $a = 2; +} elseif ($a == 3) { + $a = 4; +} else { + $a = 7; +} +\-- + + +Control statements written with the "switch" construct must have a single space before the opening parenthesis of the conditional statement, and also a single space after the closing parenthesis. + +All content under each "case" (or default) statement must be indented four spaces. + +/--php +switch ($numPeople) { +case 1: + break; + +case 2: + break; + +default: + break; +} +\-- + +It is sometimes useful to write a case statement which falls through to the next case by not including a break or return in that case. To distinguish these cases from bugs, any case statement where break or return are omitted must contain the comment "// break intentionally omitted". + + +Databases +--------- + +- Use alphanumeric characters. +- Choose one way for all identifiers: + a) use lowercase words and underscore `_` to separate words + b) or use camelCaps +- Choose short, unambiguous names, using no more than one or two words. +- Avoid abbreviated, concatenated, or acronymic names. + +Tables: +- Use plural table names. +- Prefix lookup tables with the name of the table they relate to (e.g. `order_status` or `orderStatus`, `order_type`, etc.) +- For junction table (which handle many to many relationships), concatenate the names of the two tables: `{linking-table}_2_{related-table}` + +Columns: +- Use singular column names. +- Don't prefix columns names with table name. +- The primary keys must have name `id`. + - If more than one field makes up the key, suffix all of them with `id` *(or `pk`?)* +- Foreign key names should be the referenced table name in singular suffixed with `id`. + - Makes the table to which they refer completely obvious. + - If there are multiple foreign keys referencing same table, prefix the foreign key name with an appropriately descriptive adjective (e.g. `lead_person_id` / `leadPersonId`, `technical_person_id` / `technicalPersonId`, etc. which transparently reference `id` in the `persons` table). +- List the primary key first in a table, followed by foreign keys. +- Boolean fields should be given names like `is_deleted` (or `isDeleted`), `has_permission` (or `hasPermission`). If the field holds date and/or time information, the word `date` or `time` should appear somewhere in the field name. + +Views: +- Follow the same rules that apply to naming tables with some exceptions: +- A view can be a combination of more tables based on a join condition, thus, effectively representing two entities. In this case, consider combining the names the base tables. + +/--comment +Indexes: +- follow this naming structure: `{tableName}_{columnsindexed}{U/N}` + - where "U/N" is for unique or non-unique. +\-- + +SQL coding style: +- Don't use the proprietary version and destroy portability (`INSERT INTO ... VALUES` vs. `INSERT ... SET`) +- Format SQL to multiple lines: + +/--code sql +SELECT * +FROM [customers] +WHERE [name] LIKE 'Peter%' +ORDER BY [name] +\-- + +Myths of prefixing columns names with table name +- prevents field names clashing with reservered words -> refering by tablename.fieldname prevents much better +- creates near unique field names, often simplifying query design and SQL coding -> refering by tablename.fieldname does the same job +- maintains semantic transparency of field names when using table aliases (e.g. SELECT a.activity_name FROM activity a) -> Definitely not. What about two same tables in join? Refering by alias.fieldname is right way. + +Datatypes is MySQL: +- [VARBINARY & BINARY | http://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html] implementation is stable since MySQL 5.0.19 +- substitute boolean with "tinyint(1) NOT NULL DEFAULT '0'" (ENUM is not recommended) +- in [non-strict mode | http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html] ENUM [can contain | http://dev.mysql.com/doc/refman/5.0/en/enum.html] empty string From 278c23191c518e39c2cd9afe218734f65df0af42 Mon Sep 17 00:00:00 2001 From: vrana Date: Sat, 18 Oct 2008 22:31:54 +0200 Subject: [PATCH 0003/1741] en/coding-standard: Typos --- en/coding-standard.texy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/en/coding-standard.texy b/en/coding-standard.texy index 2f9ea6f6e1..7b37fed2fb 100644 --- a/en/coding-standard.texy +++ b/en/coding-standard.texy @@ -27,7 +27,7 @@ PHP Files - Always match class name and file name. -For all other files, only alphanumeric characters, underscores, and the dash character (`-`) are permitted. Spaces and are prohibited. Any file that contains any PHP code must end with the extension `.php`, or `.phtml` in case of templates. +For all other files, only alphanumeric characters, underscores, and the dash character (`-`) are permitted. Spaces are prohibited. Any file that contains any PHP code must end with the extension `.php`, or `.phtml` in case of templates. Strings @@ -307,7 +307,7 @@ Indexes: \-- SQL coding style: -- Don't use the proprietary version and destroy portability (`INSERT INTO ... VALUES` vs. `INSERT ... SET`) +- Don't use the proprietary version destroying portability (`INSERT INTO ... VALUES` vs. `INSERT ... SET`) - Format SQL to multiple lines: /--code sql From 8e55c132da21fbe89b910ff65dcb5b5e72f33ad4 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Thu, 26 Mar 2009 21:29:48 +0100 Subject: [PATCH 0004/1741] en/coding-standard: --- en/coding-standard.texy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/en/coding-standard.texy b/en/coding-standard.texy index 7b37fed2fb..c67adc17ee 100644 --- a/en/coding-standard.texy +++ b/en/coding-standard.texy @@ -1,6 +1,8 @@ Coding standard *************** +*Stránka není aktualizovaná* + This document describes rules and recommendations for developing applications and class libraries using the PHP language. @@ -19,7 +21,7 @@ PHP Files - For files that contain only PHP code, the closing tag (`?>`) is never permitted. Not including it prevents trailing whitespace from being accidentally injected into the output. -- Use an indent of 4 spaces, with no tabs. +- Use an indent of 1 tab. - The recommended line length is 80 characters, i.e. developers should aim keep code as close to the 80-column boundary as is practical. From b4745dc23ca6a0ac02e8c07cb45fc4722a52610c Mon Sep 17 00:00:00 2001 From: _Martin_ Date: Sun, 17 May 2009 15:23:27 +0200 Subject: [PATCH 0005/1741] cs/requirements: --- cs/requirements.texy | 23 +++++++++++++++++++++++ files/requirementschecker.png | Bin 0 -> 67860 bytes 2 files changed, 23 insertions(+) create mode 100644 cs/requirements.texy create mode 100644 files/requirementschecker.png diff --git a/cs/requirements.texy b/cs/requirements.texy new file mode 100644 index 0000000000..07227332dc --- /dev/null +++ b/cs/requirements.texy @@ -0,0 +1,23 @@ +Požadavky Nette frameworku +************************** + +Pro správný běh klade Nette Framework jisté požadavky na prostředí webového serveru. Nette rozlišuje mezi tzv. "minimální" a "doporučenou" konfigurací. V minimální konfiguraci budete schopni používat Nette, ale připravíte se o některé výhody a vlastnosti, které jsou dostupné pouze v konfiguraci doporučené. + +Podívejme se, jak zjistit, zda webový server splňuje požadavky Nette frameworku: + +Requirements Checker +==================== + +Součástí distribučního balíčku Nette je nástroj nazývaný **Requirements Checker**. Jde o jednoduchý skript, který otestuje běhové prostředí serveru a následně nás informuje, zda (a do jaké míry) je možné framework používat. + +Jak na to? +---------- + +Nejprve si [stáhněme | download] libovolnou distribuci. Přesuňme se do adresáře `/tools/Requirements-Checker` a zkopírujme soubor `checker.php` a složku `assets` kamkoliv do `document_rootu` webového serveru - třeba do složky `checker`. Nyní už jen zbývá zadat do prohlížeče adresu skriptu (např. www.example.com/checker/checker.php) a v přehledném výpisu snadno zjistíme, jak si náš server bude s Nette rozumnět. + +[* requirementschecker.png >] *** *Konečný verdikt Requirements Checkeru* .<> + +Závěrem jedno upozornění +------------------------ + +Protože Requirements Checker vypisuje některé informace o konfiguraci, nezapomeňte jej po ověření (a případném vyladění) serveru odstranit. .[caution] diff --git a/files/requirementschecker.png b/files/requirementschecker.png new file mode 100644 index 0000000000000000000000000000000000000000..75dd917d2567825dba5490a3fa2555ed9a859c83 GIT binary patch literal 67860 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 literal 0 HcmV?d00001 From 6b4e60822f41c244142ac09ab001a4e5a3d224e8 Mon Sep 17 00:00:00 2001 From: Honza Marek Date: Sun, 17 May 2009 21:23:09 +0200 Subject: [PATCH 0006/1741] cs/requirements: typo --- cs/requirements.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/requirements.texy b/cs/requirements.texy index 07227332dc..c05ed96d90 100644 --- a/cs/requirements.texy +++ b/cs/requirements.texy @@ -15,7 +15,7 @@ Jak na to? Nejprve si [stáhněme | download] libovolnou distribuci. Přesuňme se do adresáře `/tools/Requirements-Checker` a zkopírujme soubor `checker.php` a složku `assets` kamkoliv do `document_rootu` webového serveru - třeba do složky `checker`. Nyní už jen zbývá zadat do prohlížeče adresu skriptu (např. www.example.com/checker/checker.php) a v přehledném výpisu snadno zjistíme, jak si náš server bude s Nette rozumnět. -[* requirementschecker.png >] *** *Konečný verdikt Requirements Checkeru* .<> +[* requirementschecker.png *] *** *Konečný verdikt Requirements Checkeru* .<> Závěrem jedno upozornění ------------------------ From c86d32efc934152ed28f4238658eca32cdc8016b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrik=20Voto=C4=8Dek?= Date: Sun, 17 May 2009 21:36:13 +0200 Subject: [PATCH 0007/1741] cs/requirements: --- cs/requirements.texy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cs/requirements.texy b/cs/requirements.texy index c05ed96d90..d1629c8c30 100644 --- a/cs/requirements.texy +++ b/cs/requirements.texy @@ -15,6 +15,8 @@ Jak na to? Nejprve si [stáhněme | download] libovolnou distribuci. Přesuňme se do adresáře `/tools/Requirements-Checker` a zkopírujme soubor `checker.php` a složku `assets` kamkoliv do `document_rootu` webového serveru - třeba do složky `checker`. Nyní už jen zbývá zadat do prohlížeče adresu skriptu (např. www.example.com/checker/checker.php) a v přehledném výpisu snadno zjistíme, jak si náš server bude s Nette rozumnět. +Ve starších revizích > 307 (tj. i stable verze 0.8) je cesta `/examples/Requirements-Checker` .[caution] + [* requirementschecker.png *] *** *Konečný verdikt Requirements Checkeru* .<> Závěrem jedno upozornění From 8190d5b92adffc49215c9be36e2d149b2e1c4770 Mon Sep 17 00:00:00 2001 From: _Martin_ Date: Mon, 18 May 2009 08:06:58 +0200 Subject: [PATCH 0008/1741] cs/requirements: --- cs/requirements.texy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cs/requirements.texy b/cs/requirements.texy index d1629c8c30..82e452034d 100644 --- a/cs/requirements.texy +++ b/cs/requirements.texy @@ -13,9 +13,9 @@ Součástí distribučního balíčku Nette je nástroj nazývaný **Requirement Jak na to? ---------- -Nejprve si [stáhněme | download] libovolnou distribuci. Přesuňme se do adresáře `/tools/Requirements-Checker` a zkopírujme soubor `checker.php` a složku `assets` kamkoliv do `document_rootu` webového serveru - třeba do složky `checker`. Nyní už jen zbývá zadat do prohlížeče adresu skriptu (např. www.example.com/checker/checker.php) a v přehledném výpisu snadno zjistíme, jak si náš server bude s Nette rozumnět. +Nejprve si [stáhněme | download] "libovolnou"((Requirements Checker najdeme v obou verzích; ve vývojové verzi je průběžně aktualizován)) distribuci. Přesuňme se do adresáře `/examples/Requirements-Checker` (*u vývojové verze 0.9 do adresáře `/tools/Requirements-Checker`*) a zkopírujme soubor `checker.php` a složku `assets` kamkoliv do `document_rootu` webového serveru - třeba do složky `checker`. Nyní už jen zbývá zadat do prohlížeče adresu skriptu (např. www.example.com/checker/checker.php) a v přehledném výpisu snadno zjistíme, jak si náš server bude s Nette rozumnět. -Ve starších revizích > 307 (tj. i stable verze 0.8) je cesta `/examples/Requirements-Checker` .[caution] +Návod vychází ze dvou "základních verzí"((stabilní a vývojové)) dostupných na stránce [download], máte-li stažené starší revize frameworku (< 307), postup bude stejný jako u stávající stabilní verze 0.8. .[note] [* requirementschecker.png *] *** *Konečný verdikt Requirements Checkeru* .<> From 428a0939a3d01990b4570e02c369016d7d873a3b Mon Sep 17 00:00:00 2001 From: David Grudl Date: Mon, 18 May 2009 16:51:15 +0200 Subject: [PATCH 0009/1741] cs/requirements: --- cs/requirements.texy | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/cs/requirements.texy b/cs/requirements.texy index 82e452034d..62190b27f7 100644 --- a/cs/requirements.texy +++ b/cs/requirements.texy @@ -1,21 +1,19 @@ -Požadavky Nette frameworku +Požadavky Nette Framework ************************** -Pro správný běh klade Nette Framework jisté požadavky na prostředí webového serveru. Nette rozlišuje mezi tzv. "minimální" a "doporučenou" konfigurací. V minimální konfiguraci budete schopni používat Nette, ale připravíte se o některé výhody a vlastnosti, které jsou dostupné pouze v konfiguraci doporučené. +Pro správný běh klade Nette Framework jisté požadavky na prostředí webového serveru. Nette rozlišuje mezi tzv. *minimální* a *doporučenou* konfigurací. V minimální konfiguraci budete schopni používat Nette, ale připravíte se o některé výhody a vlastnosti, které jsou dostupné pouze v konfiguraci doporučené. -Podívejme se, jak zjistit, zda webový server splňuje požadavky Nette frameworku: +Podívejme se, jak zjistit, zda webový server splňuje požadavky Nette frameworku. Requirements Checker ==================== -Součástí distribučního balíčku Nette je nástroj nazývaný **Requirements Checker**. Jde o jednoduchý skript, který otestuje běhové prostředí serveru a následně nás informuje, zda (a do jaké míry) je možné framework používat. +Součástí distribučního balíčku Nette je nástroj nazývaný **Requirements Checker**. Jde o jednoduchý skript, který otestuje běhové prostředí serveru a následně informuje, zda (a do jaké míry) je možné framework používat. Jak na to? ---------- -Nejprve si [stáhněme | download] "libovolnou"((Requirements Checker najdeme v obou verzích; ve vývojové verzi je průběžně aktualizován)) distribuci. Přesuňme se do adresáře `/examples/Requirements-Checker` (*u vývojové verze 0.9 do adresáře `/tools/Requirements-Checker`*) a zkopírujme soubor `checker.php` a složku `assets` kamkoliv do `document_rootu` webového serveru - třeba do složky `checker`. Nyní už jen zbývá zadat do prohlížeče adresu skriptu (např. www.example.com/checker/checker.php) a v přehledném výpisu snadno zjistíme, jak si náš server bude s Nette rozumnět. - -Návod vychází ze dvou "základních verzí"((stabilní a vývojové)) dostupných na stránce [download], máte-li stažené starší revize frameworku (< 307), postup bude stejný jako u stávající stabilní verze 0.8. .[note] +Nejprve si [stáhněte | download] a rozbalte distribuci Nette Framework. Přesuňte se do adresáře `/examples/Requirements-Checker` (*u verze 0.9 do adresáře `/tools/Requirements-Checker`*) a zkopírujte jeho obsah (tj. soubor `checker.php` a složku `assets`) do vašeho webového serveru - třeba do složky `checker`. Nyní už jen zbývá zadat do prohlížeče adresu skriptu (např. `www.example.com/checker/checker.php`) a v přehledném výpisu snadno zjistíte, jak si server bude s Nette rozumět. [* requirementschecker.png *] *** *Konečný verdikt Requirements Checkeru* .<> From 09fe9c2b2d175dca50e90fce8da14aec3199a56a Mon Sep 17 00:00:00 2001 From: David Grudl Date: Thu, 15 Jul 2010 10:57:57 +0200 Subject: [PATCH 0010/1741] cs/forms/validation: created --- cs/forms/validation.texy | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 cs/forms/validation.texy diff --git a/cs/forms/validation.texy b/cs/forms/validation.texy new file mode 100644 index 0000000000..1e14e90da7 --- /dev/null +++ b/cs/forms/validation.texy @@ -0,0 +1,7 @@ +Formulářová validace +******************** + +1) Validace na straně serveru +2) Validace na straně klienta +3) placeholdery %label, %name a %value ve výchozích chybových zprávách +4) odkázat na lokalizaci chybových hlášek [Forms/Localization] From 310efafda30d56b6e576b4e54cbb92ab4e75e245 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Mon, 15 Nov 2010 19:59:41 +0100 Subject: [PATCH 0011/1741] cs/quickstart/lets-start: created --- cs/quickstart/lets-start.texy | 190 ++++++++++++++++++++++++++++++++++ files/sandbox.png | Bin 0 -> 85789 bytes 2 files changed, 190 insertions(+) create mode 100644 cs/quickstart/lets-start.texy create mode 100644 files/sandbox.png diff --git a/cs/quickstart/lets-start.texy b/cs/quickstart/lets-start.texy new file mode 100644 index 0000000000..f4579f60a3 --- /dev/null +++ b/cs/quickstart/lets-start.texy @@ -0,0 +1,190 @@ +Začínáme +######## + +.[perex] +V první kapitole si stáhneme **Nette Framework**, seznámíme se s obsahem distribuce a připravíme si vše, co budeme pro naší aplikaci potřebovat. + +.[note] +Tutoriál je psaný pro aktuální vývojovou verzi Nette. Nestahujte doporučenou verzi 2.0-alpha, ale vývojovou verzi pro PHP 5.3. + +Stažení a instalace +******************* + +Příprava sandboxu +================= + +Nejprve si vytvoříme na místě, které bude přístupné z našeho vývojového webového serveru, prázdný adresář, do kterého umístíme náš projekt. Pojmenujeme ho například `quickstart`. Při nahrávání na produkční server je výhodné některé soubory oddělit od prostoru, který je přístupný z webu, ale prozatím se tím nebudeme zabývat. Všechny bezpečnostní tipy a triky naleznete v poslední kapitole návodu. + +Nyní si stáhneme [Nette Framework |http://nette.org/cs/download]. Archiv rozbalíme (prozatím je jedno kam) a podíváme se na jeho obsah. Nejvíce nás budou zajímat složky `Nette` a `sandbox`. Složka `Nette`, jak již název napovídá, obsahuje samotný Nette Framework. Složka `sandbox` obsahuje předpřipravenou kostru aplikace založené na Nette. Tato kostra nám usnadní mnoho práce a tak jí ihned využijeme. Obsah této složky rozbalíme do naší složky projektu. Adresářová struktura bude vypadat nějak takto: + +/--- + +quickstart/ ++--app/ ++--document_root/ ++--libs/ ++--log/ ++--temp/ ++--tests/ +\--- + +- Složka `app` obsahuje data naší aplikace. Většinu času se budeme pohybovat právě tady. +- `document_root` obsahuje soubory, které mají být přístupné z webu - obrázky, JavaScript, CSS tabulky a další. +- `libs` slouží pro umístění knihoven třetích stran. +- Do složky `log` se budou umisťovat ladící výpisy. Podrobněji tuto možnost rozebereme v poslední kapitole návodu. +- `temp`, jak již název napovídá, tato složka slouží pro odkládání dočasných souborů. +- Složka `tests` je připravena na testy naší aplikace, ty ale nyní nebudeme využívat. + +Instalace Nette Framework +========================= + +Naše kostra neobsahuje Nette Framework, musíme jej nakopírovat zvlášť. Ve složce `libs` se nachází podsložka `Nette` a v ní ještě jedna podsložka `Nette`. Tu smažeme a nahradíme jí již dříve zmíněnou složkou `Nette` přímo z kořenového adresáře distribuce. + +.[note] +Na produkčním serveru je výhodné používat zmenšenou verzi ze složky `Nette.minified`. Ta je ale pro účely vývoje nevhodná a tuto možnost a její výhody podrobněji rozebereme v poslední kapitole. + +Adresářová struktura bude nyní vypadat takto: + +/--- + +quickstart/ ++--libs/ + +--Nette/ + +--Nette/ + +--Application/ + +--Caching/ + ... + +--loader.php + ... +\--- + +.[note] +Pokud používáte operační systém GNU/Linux (případně jiný nix-like systém), budete potřebovat nastavit oprávnění pro zápis do složek `log` a `temp`. Nejjednodušší je použít příkaz `chmod +R 0777 temp log`, ten ale nebývá vždy nejvhodnější. + + +Připraveno! +=========== + +Nyní již máme vše připraveno! Můžeme otevřít náš projekt ve webovém prohlížeči - stačí jej nasměrovat na adresář `quickstart/document_root`, kde by se nám mělo dostat následujícího přivítání: + +[* sandbox.png *] + + +Aplikace +******** + +Jak již bylo zmíněno, složka `app` bude středem vesmíru naší aplikace. Pojďme se na její obsah teď podívat trochu podrobněji. + +Zajímat nás budou hlavně složky `models`, `presenters` a `templates`. + +- Složka `models` bude obsahovat "modely" naší aplikace. Jedná se o třídy, které slouží jako datová vrstva. Budou tedy zprostředkovávat komunikaci s datovými úložišti, například databází, webovými službami nebo soubory. Podrobněji si tyto třídy představíme později. +- Složka `presenters` slouží pro takzvané presentery. Zjednodušeně řečeno se jedná o třídu, která se stará o propojení všech částí aplikace - modelů, komponent a pohledů((view)). +- Složka `templates` bude obsahovat šablony pro pohledy. Presentery i pohledy si podrobněji představíme hned v další kapitole. + +Poměrně zásadní roli bude v naší aplikaci hrát soubor `bootstrap.php`. Jde o zavaděč naší aplikace a právě on se stará o načtení Nette, načtení konfiguračních souborů, správnou konfiguraci aplikace a nakonec i o její samotné spuštění. Protože je tento soubor tak důležitý, pojďme si ho rozebrat řádek po řádku. + +bootstrap.php +------------- + +Výchozí `bootstrap.php` ze sandboxu vypadá nějak takto (pro úsporu místa uvádíme bez dokumentační hlavičky): + +/---php +errorPresenter = 'Error'; +//$application->catchExceptions = TRUE; + + +// Step 4: Setup application router +$router = $application->getRouter(); + +$router[] = new Route('index.php', array( + 'presenter' => 'Homepage', + 'action' => 'default', +), Route::ONE_WAY); + +$router[] = new Route('//', array( + 'presenter' => 'Homepage', + 'action' => 'default', + 'id' => NULL, +)); + + +// Step 5: Run the application! +$application->run(); +\--- + +Řádek +/---php +require LIBS_DIR . '/Nette/Nette/loader.php'; +\--- + +načítá Nette. Soubor `loader.php` si automaticky zaregistruje mechanismus, kterým se budou jednotlivé části Nette načítat, takže se už o další `require` do Nette nemusíme starat. + +Řádky +/---php +Debugger::$strictMode = TRUE; +Debugger::enable(); +\--- + +aktivují [laděnku |debugging]. Ta se stará o přehledné zachycení a zobrazení chyb ve vývojovém prostředí a o vytváření chybových hlášení na produkčním serveru. + +Řádek +/---php +Environment::loadConfig(); +\--- + +načítá konfiguraci aplikace. Ta je uložena v souboru `config.ini` právě ve složce `app`. Obsahuje (případně bude obsahovat) nastavení databáze, některých základních direktiv PHP a další nastavení pro naší aplikaci. + +Řádky +/---php +$application = Environment::getApplication(); +$application->errorPresenter = 'Error'; +\--- + +vytvářejí instanci třídy `Application` a nastavují presenter, který se v produkčním prostředí postará o zobrazení chybových hlášek. To je poměrně důležité, protože uživatel by měl být informován o tom, že došlo k chybě, ale neměl by se dozvědět žádné interní podrobnosti. Pro nás to však zatím moc důležité nebude. + +Další blok řádků nastavuje router. O routování si povíme později, prozatím bude stačit jen to, že se starají o mapování adresy URL na požadavek na konkrétní presenter a pohled a zpracování jeho parametrů. + +Poslední řádek +/---php +$application->run(); +\--- + +spouští životní cyklus aplikace. Během něj se adresa přeloží na požadavek na presenter a pohled. Daný presenter se vytvoří a spustí se jeho cyklus a pak se aplikace korektně ukončí. + +A to je k souboru `bootstrap.php` vše. + + + + +----- + +- stažení Nette a instalace sandboxu +- představení adresářů presenters, templates +- představení souboru bootstrap.php + - Debug::enable() - představení laděnky + - načtení konfigurace - představení confui.ini (později .neon) + - zmínění RobotLoaderu a jeho výhod + - router - stručné nastínění propojení, prozatím zůstaneme u výchozích rout diff --git a/files/sandbox.png b/files/sandbox.png new file mode 100644 index 0000000000000000000000000000000000000000..767be2918defe516d5e83ab170842f60bd8e93e5 GIT binary patch literal 85789 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 literal 0 HcmV?d00001 From 641631f2d3d4960615641586039814301c9c465b Mon Sep 17 00:00:00 2001 From: David Grudl Date: Fri, 10 Jun 2011 16:07:51 +0200 Subject: [PATCH 0012/1741] en/homepage: created --- en/homepage.texy | 93 ++++++++++++++++++++++++++++++++++++++++++++ files/guides.png | Bin 0 -> 1497 bytes files/icon-help.png | Bin 0 -> 8100 bytes files/lamplight.png | Bin 0 -> 3162 bytes files/question.png | Bin 0 -> 2516 bytes files/ruler.png | Bin 0 -> 2265 bytes files/search.png | Bin 0 -> 2606 bytes files/welcome.png | Bin 0 -> 2128 bytes 8 files changed, 93 insertions(+) create mode 100644 en/homepage.texy create mode 100644 files/guides.png create mode 100644 files/icon-help.png create mode 100644 files/lamplight.png create mode 100644 files/question.png create mode 100644 files/ruler.png create mode 100644 files/search.png create mode 100644 files/welcome.png diff --git a/en/homepage.texy b/en/homepage.texy new file mode 100644 index 0000000000..5d2a49ebd5 --- /dev/null +++ b/en/homepage.texy @@ -0,0 +1,93 @@ +Documentation +************* + +.[perex] +Zde najdete celou řadu zdrojů, které vám pomohou naučit se Nette Framework a vytěžit z něj maximum. + +/---div .[#left navig]{float: left; width: 49%} + +[* welcome.png *] Introduction .{margin-top: 0} +----------------------- + +- [Getting Started] +- [Downloading & Installation | installation] +- [Create Your First Application! | quickstart] + + +[* lamplight.png *] Additional Resources +----------------------- + +- [Community Forum | http://forum.nette.org/en/] have a question? Ask on forum .[icon]{background-image:url(http://files.nette.l/1349/icon-forum.png)} +- [API references | http://api.nette.org/] přehled tříd, metod a parametrů +- [Planette: Tutorials & Screencasts | pla:] +- [Chat Room | http://live.jabbim.cz/chat/nette@conf.netlab.cz] + + +[* question.png *] General Info +---------------- + +- [Features | www:hlavni-prednosti] +- [Vulnerability protection] +- [Troubleshooting] +- [FAQ: Frequently Asked Questions | faq] +- [Glossary] +- [Server Requirements | Requirements] +- [License] +- [Credits] + + +[* ruler.png *] Development +----- + +- [Reporting bug] +- [Contributing to Nette Framework | Contributing] +- [Writing Documentation | writing] + +\-- + + + +/---div .[#right navig]{margin-left: 50%} + +[* guides.png *] Programmer's Guide .{margin-top: 0} +--------------------- + +- [Forms] +- [Templating], [default macros] and [default helpers] +- [MVC Application & Presenters | presenters] +- [Micro-framework] +- [Components and Controls | components] +- [Routing] +- [User Authentication & Authorization | security] +- [Debugging and Error Handling | debugging] +- [AJAX] +- [Configuration | configuring] and [Dependency Injection] +- [PHP Language Enhancements] (Nette\Object, annotations & reflection) +- [HTTP request & response] +- [Database & ORM | database] +- [Sessions] +- [Sending E-mails | mailing] +- [Image Manipulation | images] +- [Caching] +- [Localization] +- [Testing] +- [Pagination] +- [Auto-loading] +- [Procházení soubory na disku | finder] +- [Atomic Operations‎ | atomicity] +- Utility for [strings], [arrays], [HTML elements], [URLs] +- Tools: [Code-Checker] + + +[* search.png *] Search by Class Name +----------------------------- + + +

+ + + +\--- + +{{themeicon: icon-help.png}} +{{toc:no}} diff --git a/files/guides.png b/files/guides.png new file mode 100644 index 0000000000000000000000000000000000000000..9575a2497c6c11f8e241d0be0a1fa47fe6718971 GIT binary patch literal 1497 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 literal 0 HcmV?d00001 diff --git a/files/question.png b/files/question.png new file mode 100644 index 0000000000000000000000000000000000000000..1fa1028111392c0c0753fd4db28cfc52a95b3c4e GIT binary patch literal 2516 zcmV;_2`l!AP)zTWrTb8p*?=}q4I zzUS*bzu)_OzlZQ1{l56iWIKQa1c3cFw)Y#&{a5=vbTuaV!Y{_!0d#<96@U%`5*};- z5PM{Eks*QfLvUCiy}jR>HS~WWu;KC11b|KgZ3Lm+J>L*D5U(Z7ikqm7`1o^0!Q}}H z=^SICzz~;|NIyh&{qfuH@A;n*xOMlXZ3MapWUq8fa}8$4BWRsrqCRRMUt;8n0wMtf zU;xZOL#+t_7|Sx=PL}X?vWU@i(Iqn^BHN$+PD{^wM&NUgU1%qweE`}_gYdq_DCWP#dWYS0j?L8c%W8Ovcbm4n3$5%deB>%e#C z_g_^4pLuj-8xcJK08I@s%!)^08iFh7JjOF6SS*zv7L|xNCLu5k!pwLr8e%aNEZ|Bi zgNba`rY-3D%jVXet3qJiBg5SQb(*G$#)f*-MhxT&1&mMRKvWgCdZaiccWn0t5$a>L zh{fuW%NLMJC&9uHk)G$i*Vgr}2&~<8wi`s95i^4Nx_SUWCOZLUo@5%)NB*BD0Z~1a z2u#yNeO&_tg7icRmSsUidJca7LtXEPz?z+Bx{0XMG$V-B#$d69d_JcEpHvl&=yljz&BuxnZbKDA?LGl6y*hJk1_3X2(~V$pemre*yeWPt`a zs7h*IQxk<@7|7*wU}lI&*9%)0^-PJtCw}^7JAqy$0wR$bhzKmUph2hLM5Jl^g4t0l zm>tEOCKKsAg5e8l}aubGOpin44gvS6ZKXTt~VnZ{EuUBO7Q6bf4HnTs$C6GQ;BBm~k8 zV0Bdqtord_CqUf*U>IbJT5&Z5{aF2NSvwoIEQtdEj{hfzXO4{{ony2#M{vuMMl5TM z0RYl@#=U!n@$U=yQ1Gr%yOJRySB(Hj*Gu<*#8V}seD!6g2!q)IGlNB(hwTZxWAB`O ze$BOU4?F-IcrA$+-$v4{TI$;=5iPw^*bZ7kvva~tEPh4tD(%xQ|)*OX^|^y~;m#)}?_jW^9K z1I<#Y_XxJ#u>JV@Py#G`kNS`eTp!y+bTT50^W%k}Bm+{jkB0 zRS^U(Pgc5 zW#AQ{5cYdptpp;n{-ZxUme9Nqi>xOBgaCp)5E6KyO2oOQ*uD~!21l}3yJMhAEU@oQ z=1M`2XSYz7>W=+Dr}P~FdLxR+S2-@n{}=KJ0p79eDX3~Jlt4s=r~5%wW04Th;qFz5 zA*%uexJ^JH5y#)VBmnVJ1~-C|d5{hMC%3hsF=l$#{@g!`WVWQOuAXKD2{_WR?ZP+W755+QkU-X`XErX0V47S# zrCZcehk1!8RxNJEXWM6L*HSqPKR-0=tiA*U7nUbE67h(Lp9_g_AhVEwaRy10=lsFn zrjEJTw0dsnwN%c+rY8q6d?l~1cqPy_a&Ih-(R&0~cnm_ea?m6srj7JdWxrbq^#uF-Hm>f#VOY>|eU|W!q&s&R#r1LCH+95>-@kcr1^jr&IXTu}e65 zIu(c^<+XuolRo$=D&(n=IG)FiQ$*!yvrBA}s={5@-3QNM_w(m8BMlb!niG*QBCZsC zbrO*wod9#6v%3ZnDEYrrtdNSqCq$L>MFqsH8^46;{Pa~wC&0`@zFQ|>o$LS%+eQMu zUn=Xmssgrj^{tiA@-i5}LJV3N9}cR}VE~Yp2t0 z9bnmMEc+Fjc+Cn_Wr4=!O-rwt!Q#$oDett8S;e7TbNb%!qF#6x3)XuXkh+E9*ntFu zpm`}*n)Bm$^sc3tKQo3@wuJkB`#PRGaWRlCsDmmlw9I`10CrW>gN1kRKMkNQT#a;> z8otdW=-sjsAD-XnolRy-xc&!+%C;BFHn>7vX}}u+eM67my1H6X-=&J&Qx#7IeDRhy z`(71105sJ_aQ%X2tvcht{J#3IKfeT2$Zp#!7WDvd>alfwBHZgu?Cem8S{k}L78Tkn zZ;WblCbLESZQzo&2tnKMiCErZc;J0P55M)qhQ6u63V6 z@G=14?BxvZ*zvNn5Uec(2Uos~ltykyM7B?PZ}fxT?Ck*Lkmm72i_1cf}w^Rkqh9gq7&Y-ekcHgs$OVeYxjdeWCe4=hK}6bW`wAno1Cs>fa31QdTr| z8Ut|e`Cs4Bb5*{P&AW3?2Y`KWz5!QNsZfk}RVuwmpkU!C+rpILzvIUdUG z&D8O|XQC}jo-pbXEdVWppO;r`@FJ<(oZU6$oSLly0%7ZsQu5qaECGin`|8d%_H!znD!}9%107FFy)hZBMKf>0Ikq>5QN_6{R5cwOh^bS zf%MSLfA}-4aPn!~ zJ39o-8kb4d(f8;PA+I}1KD^H=t2Fmz<* z>9t_;9iV{Bu83I*`FrzVv2qa{D>({vwRQ0E&=6d|K2jEZ^Lx;I9$2mw%gkE=_W2h= zsmaN3rm6}I9i7n7cnRJ-{T6g~cEb4hICOV+mj%&$0`|U3^OnJ*2$1jlB(C^P1&oc2 z!HpX?pru6*I$Z;3va;aRsZ;#<@bK_ZP|Ww_DiOdeGw&q9u+4XXx8MGgd2nzLE;Tm7 zuU`Bmhf&zfS+F}N2m1T_;oiM_U@#aoftlZ}M42rEg-$(x6oy_8lgVd*cdO1Qe;glg zrcg>rN(OaGDg(qVUjfzC)i5zJ0RsaAI={_#=O~44G~a*NW!N~1=7zt8OiKXs!{T0*`{pWYYR(J{!$v8!fm*aBseZ%`*T_aKG0=XkJGEGzX|I%nJ*LMGF=}MMVYN zxpN0bMn-Uww|G^dg|1x+p)1=+Y0;aWx2hNc_5=j5&Nd3_)HH~Wih>1m=fU=j44TB8 zk-ECN%Dej)Ip#ZXZ_wM<2OoTJ5z^PH z;pLJ9&*mwnyEJHiyDaVEd)EN{g&1Z*1gN`kG2xwetHAW330{BoHC`h{M=gdJEOM%d zaL?v(ZU~0$1yjK-kr5HR#Gv_* z5Esv9NS`$A=K{pv#ou^rx6KA{SPsCIIx~m>ZCkXwL=dyh-poYa;LsAA)<=meSMl@9 z#R(v^Z8qZf72dVG*>2hffaZe=fH%=nQE^O_xeumG18;j=<{G?Ee%dGCy&r184_){WBu9HgQb z7=X~asgg^*3-hEup4i3(BYM%C-XG?HLoOUs213c;+J4mrup#FOTUJ{)zm4x18^|j zSHR}206vZYHnz?e^K^4TpAK1Sl?0HnWh-rN;PT}rm}t%5>ylbr%awTsz$)!E05+sV zQ)X){x-su?Ze!a?nd*;1wb*s-Rj7V`7*7^b79#9pK%9daEqPUdN|Peslv0HI}_ z66Ke9+gkqon+JH$OvY{6pPS*gdD4V_vuA+Gf2x&}&1$oBF5|5n%+qRe@@fGn!)M3< zmMw{fPx~v_{N$B<_wA8!eturkf15YD2bgF|3qhHMD|y_zbPh9p&x_ZcdY;XrIa2xd zS!|ppan7!6IQ`Ziz|>yNJx|y9_ilQg{tu7<@W^GnX~XmYCyc^>@Vw|^y$;Tv`wQGRmAU|M4jTsm`kxpzb}8L8z-WE4VobNj zIAPpvk9S7^moYD1cQQW(fMWgntMK5#1O8+1{9oS(W5X*>0Ip(Q1Q5-WMjON}`-gHyFE&?=NqVG%Ct=ee}|LC#AD&*Y7u`vqlX^V01(W-91;}+}U^F z-|webuQ#kiso}nEstDjy-C9X^YgbdaJkAnB=W$U_i25ArNz~_2Pochm`XcJfsIQ>D zhI$(H4b-<#-$8v3^#jz8P%}`WsBqL=)I9N--p@wOL_LH0A?o|6@1nkq`X-8s+}BZG n74P*W@%~SVex4Nlk)HTJn4r?zH=NHL00000NkvXXu0mjf⪙A literal 0 HcmV?d00001 diff --git a/files/search.png b/files/search.png new file mode 100644 index 0000000000000000000000000000000000000000..5bcd20087a4b7b29ae68ebd3913305d98988f0a2 GIT binary patch literal 2606 zcmV+}3eok6P)Z+CS6jXfmlu+n=2u zon~U1+$+9NG+<&nX^aI0M?fGKK}D^CkNSRGkcYf3UEk*H(|wNz>;>$wlXcHMXYaH3 z`qpc&y^dvYaF8q(3yr4za>oukUy_)tCUcZCwH_=iY^8VDEdB!6{@G^^9>0_SI?UcP zdFJLd4)E1=_|PHGPX^%AZQJsB+&BE!hWkZ}7SWv9vuWn6S=80lMf2v(qwugWdi3ZK zdA(lh?d_$94)g;-0x(vPnj}>Qc_ZAQb-8B zeEE`|K6@q@HNG$J0dRhFG<9`$($%Y1>F&LIcnszXijE#FedhqSZrz&1ePtmbA=c!T zD}{vb+_^*j{r%=9GlC%EY&MEu0bIItiJmcVUiaJM$BzBxodL+p%Y(@{r%jtit5>h4 zdn~<1UyLYLRP3GFQYxLyF z6N;QVm8LSuhV`Q6&!<2JS5;LdK%6{zvS8c*T9F=GZ@ym%4w7L=5fxW)xQc1}(S zOU$u!$r2$=$<)BWfRH--1!ZPr2=kE4>mW?RDCTcvzuCWkKXtr%Md9J$df)6hbEuDl zKvPo_96R~csZ)OM89qk3DJ#n!7#QeSl9(u%2h#|NFd0OWJzsxK85=hEGOhptC^Lcs z@7c455XCxpo&lZ{^x(k*sR=8u^UY{9-~#}YL~%TS!m3Aj1OQN*$3we!@1~fTm^Ycn zB*QQ+31cJJM*zYa8A(07FUYxDT3c!9vSl<#l+WgC8#RCp85v2un27Z+UcAty|GK-I zva+&hF*~a?5oz-l<=#vK>T_J-=)d~n3lYsQH`b6F-rTu!X*600P^7;TQ3Otk$>jow zAlcd3Z`iwP^D2|WX+TmeYjMk#En;_;YdnAcoaVAW@V#R!036e&PuHang6*fJr41he z41ml)7y%1yvmasKkXnWoKxNHZUi=e*XUgOFliAWi3u#-ApcmD*DoSHXfH9Oww^VN{Qn zv2venGyv>E>O3*xvkZ|@QBfl^YoZ0O_P!jWf-!0WYYedM%LZ*@{HQb_7}pjA1M+H= zoFvg_kh;+)Oy3>q(9;tM5Dkv)F97KSZ0JTpq($UNxw?c2Jtr48q#WVGe#E`>|j&7phWI zQ)$(zRkU#7!Vv+qu}@vNa6wcbP#oxFEvQ*54o`^vYu5aXevzJDkh?kCHD&-JQ%p=u zVrI)CBO|RibffNLQHocn`JiHfTq%*y&yXUI6<6#Xi0`N)-Mo2INFU`DsSU|Iid-1C zZrwWiDDNY#6S*lmCc0otPL^xT0MHgEB;<2+aDpj$^z)Il1_mV-9Ly2DWb?2?;@GHG z@MH_*ai~mSgG@2xNy-ToRiC#L70^=Cz)=)r6O&5 zdV|Bl3;}NadOM%BvxQ%UPYx4@{kpn(x^lId$AuJpzANA5cN8+Vf8D(4W`>j5mdjCA zK{XBelFU|RB$44zJz+_bCB;wgwjatDXI7B~6J4 zr|-Z2tCNqG`Qut%kBg5N<#pcjZ6VAMOhKj*YQ(W<_0T}=OpFH2b#p}H5`5{-ox2>t z!9lcXVD@{$M?C@#K zpa)EXYHDhPQzPs`6Lz~@1Pea)TDe|ThEHD;1_0XmbLX(%_<%tEgpY^_!Px2H9|+OX zoE#2E(u4tkR#{QuRyBcCTQ$t#=oki080bud--uT?C z0zB-q)$hL#P5e`WFqZH6>fvjg3czAmP`z3V_W_3I7Q^%501YZvNnXRfPRYs1JGjXF zw*ci^obt_K*M-VTr{ygSn=uz)pg@h(|LQY~!YF7!A+O=TO5&a6%a`Zy-msq;)-}OD zpI@q}aT%R>I3Oc|vb;qjW*Shn;Qb%8f$wvXpz>%07*qoM6N<$g0=(+)Bpeg literal 0 HcmV?d00001 diff --git a/files/welcome.png b/files/welcome.png new file mode 100644 index 0000000000000000000000000000000000000000..8b49d2766400927603edb30954abe1d5ac25f157 GIT binary patch literal 2128 zcmV-W2(R~vP)brSe*Uolke_l=Rov@8HUM%H263g*{fC;bf#=@5 zrz2wG-D7FHFMU3{SCtL`W9aKxo_fKGIhm){ob9PO0K5M_H-(|wGLeBFJbeC0$-n8j zmM$Rk^7k+I0X+MUwv?)LtLnfH*IqnQ699I+KBwD?n$*)>7x&%hHM@???G#r#ML4qk z^Opwh3Vea~)4 z_uVRk+j?fFMCcZWfuC+nAGu`!@BL(L3d3fDSzkA6VOJ!cxH-6bmEl=ozlQx9y4JJZ zLY7>5un*OjQ0-Z<{q2Ek0_fZQxy|aj&o|${Hr4z<7gCs{ICcTC^VPB642M;KRUTI$ znn)3yks?yp$fb7BfMtvtANyNNF|8z+F-`6WGUo}q*{|Cnv$fJtl&cL8@RT8 zZ`2>9J288HDm!!v*DjK1tYhf(1xE7;GLd=JgEqI=g;lGQQ~{`1bdixMI+8Z=SOh5+ zm>BG5#=HfL4Sw)s6hKAS8(iFc4h%TCJiW8O!k_5&#!~Ly76azPI{h;n$A3pdY9__8 z%QUtxLX}PrfNDxy+mnley243airm%6%eQm75Ec9w6)8@I0Epn`^QZ_IgQ}vUsHvIw z5mgZJVgw4~6R2t`T9TuxpsE-bbkhR0J(CAgV}7U&aJ-0;wSc;w4r*U8o3B&VXB11E`=i z1VB|#rd1+thynE}32H$6-&Tz=pwl&=;TjOX_lIjh)kVdvq4*_eFrcVg(S<|=RRK)E zNZYI!?XC6np31Oc^*n}0^MMV}-dZ2r;Bemv0R2Og05m0{Y$>H}#SiYc< zM>}T)=l2gyvh7QYdHJvB7#_{@=%;4Ul!#t6_MSrnsJN)#M!g!)3I;^|#^a+DhvD=j zo7T0{dt!vPmN;!Kae7aTu&jLs<2jo>2Tun#S-GUyZ*L9&Ppn(Wo`e4hjr*z<2x9n@ladJ{+< zcy-Gs-$*8+U8M`MS0?yb{_C9PzMAPmpWp+w#(zy?OEU0Xo+yO7kYfDzN3RAPRPEYn zqc}kUm)@VtrxL1I!PFJhbr3Dq4gll$gw40Ag&f+4!j! zA53U6r&tEmlo+s4sUZd|d-@&4Pk7m6&O>BEb8j1Q3pMmcW_#T+B%f&p#B+${&qfu* zvC$d=ppjz0fNI5aKvZ!BqFOE?acYPGY+oti8VE~B#FJ2oBDa7#`5J1YMK7^_4djb1 zB4kPoWO4N5cQH!V(y>KPGI$wZXV z@gj8=%!rw*gEHo}3Zv?>XvGSnD2(MClF2$68)96_c+$2E_Xg4Y=845yuZ$O-FFHc1 zG0vRk`XKw}I%zf^E#zx5p;Z=3704A_u1pj`VXEMeYK-sr>i++3kCe{+{XZ`s{qjSz zIFW9R42gPvT{C@g>25DV7rV@+7xUT%QDo(B0IPAoZVT< ziScGYK^O)wPd(DsymWT`w<4B#ylA@*x}vu(mm6DQzv}M<%Yt|`a#mCiW^(Q?zISMF zAWW#K48FoH?N)_tRoGUQ^TOkWRV1PBN?R( Date: Tue, 14 Jun 2011 10:28:09 +0200 Subject: [PATCH 0013/1741] cs/templating: created --- cs/templating.texy | 396 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 396 insertions(+) create mode 100644 cs/templating.texy diff --git a/cs/templating.texy b/cs/templating.texy new file mode 100644 index 0000000000..30d365a636 --- /dev/null +++ b/cs/templating.texy @@ -0,0 +1,396 @@ +Šablony +******* + +/--div .[perex] +Šablony jsou náramnou předností Nette Frameworku, ušetří a zpříjemní vám práci a zabezpečí výstup před zranitelnostmi jako je XSS. + +- naučíte se používat makra +- bloky a dědičnost +- vytváření a používání helperů +- vytváření vlastních maker +- vyhnutí se bezpečnostním zranitelnostem +\-- + + +Ačkoliv je PHP původem šablonovací jazyk, k jejich kódování se příliš nehodí. Podívejme se, jak v šablonovacím PHP vypsat pole prvků `$items` jako seznam: + +/--html + + +
    + +
  • +
  • + +
+ +\-- + +Zapis je poměrně nepřehledný a nesmí se zapomínat na volání `htmlSpecialChars`. Proto vznikají v PHP nejrůznější šablonovací systémy. Jeden z nejskvělejších šablonovacích systémů je součástí Nette Framework a nese název **Latte**. Budete ho milovat! + + +Latte +===== + +V Latte se stejná šablona napíše řádově jednodušeji: + +/--html +
    +{foreach $items as $item} +
  • {$item|capitalize}
  • +{/foreach} +
+\-- + +Jak vidno, v Latte se používají dva druhy speciálních značek: + +- **makra** ve složených závorkách, například `{foreach …}` +- **n:makra**, například `n:if="…"` + +Makra +----- + +Popis všech výchozích maker najdete na [samostatné stránce |default macros]. Krom toho můžete vytvářet i [#vlastní makra]. + +Každé párové makro, například `{if} … {/if}`, operující nad jedním HTML elementem, se dá přepsat do podoby [n:marka |#n-makra]. Takto by bylo možné zapsat například i `{foreach}` + +/--html +
    +
  • {$item|capitalize}
  • +
+\-- + +A to se s n:makry dají dělat ještě daleko zajímavější kousky, jak se zachvíli dozvíte. + +Makro `{$item|capitalize}`, které slouží k vypsání proměnné `$item`, obsahuje tzv. [helper |#helpery v Latte], v tomto případě `capitalize`, který převede první písmenko každého slova na velké. + +Velmi důležité je, že Latte vypisované proměnné **automaticky escapuje.** Vypsání proměnné totiž vyžaduje [escapování |glossary#toc-escapovani], tj. převedení znaků majících v HTML speciální význam na jiné odpovídající sekvence. Opomenutí by vedlo ke vzniku závažné bezpečnostní díry [Cross Site Scripting (XSS) |vulnerability-protection#toc-cross-site-scripting-xss]. + +Protože v různých dokumentech a na různých místech stránky se používají jiné escapovací funkce, disponuje Latte zcela unikátní technologií [#Context-Aware Escaping], která rozezná, ve které části dokumentu se makro nachází a **podle toho zvolí správné escapování.** Nemusíte se proto bát, že váš kodér na escapování zapomene a způsobí vám velké starosti kvůli bezpečnostní díře. Což je skvělé! + +.[note] +Pokud by proměnná `$item` obsahovala HTML kód a chtěli bychom ji vypsat bez jakékoliv transformace, stačí přidat vykřičník za závorku: `{!$item}`. Opomenutí vykřičníku přitom nezpůsobí bezpečností díru, dle principu „less code, more security“. + +Uvnitř maker přitom můžete používat PHP takové, jaké ho znáte. Dokonce včetně komentářů. Latte navíc syntaxi PHP rozšiřuje o tři příjemné novinky: + +1) pole můžete zapisovat jako `[1, 2, 3]`, což odpovídá `array(1, 2, 3)` +3) můžete vynechat uvozovky kolem řetězce z písmen, číslic a pomlček +2) stručnější zápis podmínek `$a ? 'b'` odpovídající `$a ? 'b' : null` + +Příklad: + +/--html +{foreach [a, b, c] as $id} ... {/foreach} + +{$cond ? hello} // vypíše 'hello' pokud je $cond truthy +\--- + +Komentáře se zapisují `{* tímto způsobem *}` a do výstupu se nedostanou. + + +n:makra +------- + +Ukazovali jsme si, že n:makra se zapisují přímo do HTML značek jako jejich speciální atributy. A také si říkali, že každé párové makro (například `{if} … {/if}`) se dá přepsat do podoby n:makra. Makro se pak vztahuje na HTML element, do něhož je umístěno: + +/--html +{var $items = ['I', '♥', 'Nette Framework']} + +

{$item}

+\-- + +vypíše + +/--html +

I

+

+

Nette Framework

+\-- + +Pomocí prefixu `inner-` můžeme chování poupravit tak, aby se vztahovalo jen na vnitřní část elementu: + +/--html +
+

{$item}

+
+
+\-- + +Vypíše se: + +/--html +
+

I

+
+

+
+

Nette Framework

+
+
+\-- + +Nebo pomocí prefixu `tag-` aplikujeme makro jen na samotné HTML značky: + +/--html +

Title

+\-- + +Což vypíše v závislosti na proměnné `$url`: + +/--html +// když je $url prázdné +

Title

+ +// když $url obsahuje 'http://nette.org' +

Title

+\-- + +Avšak n:makra nejsou jen zkratkou pro párová makra, existují i ryzí n:makra, jako třeba [n:href |presenters#Odkazy v šablonách] nebo velešikovný pomocník kodéra [n:class |default-macros#n:class]. + + +Helpery v Latte +------- + +Latte umožňuje snadné volání [helperů |#Helpery] za použití zápisu se svislítkem (před ním může být mezera): + +/--html +

{$heading|upper}

+\-- + +Helpery (někdy též modifikátory) lze zřetězit a poté se aplikují v pořadí od levého k pravému: + +/--html +

{$heading|lower|capitalize}

+\-- + +Parametry se zadávají za jménem helperu oddělené dvojtečkami nebo čárkami: + +/--html +

{$heading|truncate:20,''}

+\-- + +Podívejte se také na přehled [standardních helperů | default helpers] a způsob, jak si [vytvořit helpery vlastní |#helpery]. + + +Rychlost +-------- + +Latte je rychlé. Překládá totiž šablony do nativního PHP kódu a ukládá do cache na disk. Díky tomu mají stejný výkon, jako byste psali šablony v čistém PHP. Nicméně v přehlednosti, bezpečnosti a efektivitě jsou o několik řádů dál. + +Šablona se automaticky regeneruje pokaždé, když změníte zdrojový soubor. Během vývoje si tedy pohodlně editujete šablony v Latte a změny okamžitě vidíte v prohlížeči. + + +Debuggování +----------- + +O jakékoliv chybě v šabloně nebo překlepu vás bude informovat [Laděnka|debugging] s plnou parádou. Zobrazí zdrojový kód šablony a červeně označí řádek, na kterém je chyba. Společně s výstižnou chybovou zprávou. Jedním kliknutím pak otevřete šablonu ve svém oblíbeném editoru a chybu můžete okamžitě opravit. Snadnější to už být nemůže. Leda, že by se chyby opravovaly sami (inspirace pro budoucí verze? ;-) ) + +Pokud používáte IDE s možností krokování kódu, můžete takto procházet i vygenerovaný PHP kód šablon. + + + +Použitelnost +------------ + +Syntax Latte nebyla vymyšlena inženýry od stolu, ale vzešla z ryze praktických požadavků webdesignerů. Hledali jsme tu nejpřívětivější syntax, se kterou elegantně zapíšete i konstrukce, které jinak představují skutečný oříšek. Budete překvapeni, jak moc vám Latte zjednoduší práci. + +Najdete tu makra pro pokročilou tvorbu [layoutů |default-macros#toc-rozsirovani-sablon], pro tzv. **dědičnost šablon,** vnořené bloky a podobně. Přitom syntaxe vychází přímo z PHP, nebudete se tedy muset učit něco zcela nového a zúročíte své knowhow. + + + +Context-Aware Escaping +---------------------- + +Byť je [Cross Site Scripting (XSS) |vulnerability-protection#toc-cross-site-scripting-xss] jedním z nejtriviálnějších způsobů narušení webových stránek, jde o zranitelnost nejčastější. Přitom velmi závažnou, protože může vést k zcizení identity a podobně. Obranou je důsledné [escapování |glossary#toc-escapovani] vypisovaných dat, tj. převod znaků majících v daném kontextu speciální význam na jiné odpovídající sekvence. + +Pokud kodér na escapování zapomene, vznikne v aplikaci bezpečnostní díra. Proto šablonovací systémy začínají přicházet s automatickým escapováním. Problém je ale v tom, že na webové stránce existují různé kontexty a v každém je potřeba ošetřit vypisované proměnné trošku jinak. Může tak vzniknou bezpečnostní díra i kvůli špatně zvolené escapovací funkci. + +Latte je však dál. Disponuje unikátní technologií *Context-Aware Escaping*, která rozezná, ve které části dokumentu se makro nachází a podle toho zvolí správné escapování. Co to znamená? + +Že v Latte není potřeba nic manuálně ošetřovat. **Vše se děje automaticky, správně a důsledně.** Nemusíte se bát bezpečnostní děr. + +Podívejme se, jak to funguje. Vytvoříme si šablonu: + +/--html +

{$movies}

+ + +\-- + +Pokud bude proměnná `$movies` obsahovat řetězec `'Amarcord & 8 1/2'`, vygeneruje se následujíci výstup. Všimněte si, že uvnitř HTML se použije jiné escapování, než uvnitř JavaScriptu a ještě jiné v atributu `onclick`: + + +/--html +

Amarcord & 8 1/2

+ + +\-- + +Díky Context-Aware Escaping je šablona jednoduchá a vaše aplikace přitom bude perfektně zabezpečená proti Cross Site Scripting. Dokonce je možné zcela nativně používat PHP proměnné uvnitř JavaScriptu! + + + +Hezký výstup +------------ + +Puntičkáře potěší podoba HTML výstupu, který Latte generuje. Všechny značky budou odsazeny přesně tak, jak jste zamýšleli. Kód bude vypadat, jako by byl zpracován nějakým *HTML code beautifierem* :-) + + + +Vlastní makra +------------- + +Latte poskytuje API pro tvorbu vlastních marek. Není to nic složitého. Makra přidáváme v sadách, přičemž sadu může tvořit i jediné makro. + +/--php +$latte = new Nette\Latte\Engine; + +// vytvoříme si sadu +$set = new Nette\Latte\Macros\MacroSet($latte->parser); + +// do sady přidáme párové makro {try} ... {/try} +$set->addMacro( + 'try', // název makra + 'try {', // PHP kód nahrazující otevírací značku + '} catch (\Exception $e) {}' // kód nahrazující uzavírací značku +); +\-- + +Pokud makro není párové, třetí parametr metody `addMacro()` vynecháme. + +PHP kód uváděný ve druhém a třetím parametru může obsahovat zástupné symboly: + +- `%node.word` - vloží první argument makra +- `%node.array` - vloží argumenty makra naformátované jako PHP pole +- `%node.args` - vloží argumenty makra naformátované jako PHP kód +- `%escape(...)` - nahradí za aktuální escapovací funkcí +- `%modify(...)` - nahradí sérií modifikátorů + +Příklad: + +/--php +$set->addMacro('if', 'if (%node.args):', 'endif'); +\-- + +Pokud je logika makra ještě složitější, můžeme místo řetězců uvést callbacky či lambda funkce. Jako první parameter dostanou objekt [MacroNode |api:Nette\Latte\MacroNode] reprezentující aktuální makro, druhým parameterem je objekt [PhpWriter |api:Nette\Latte\PhpWriter], který usnadňuje generování výstupního kódu. + +/--php +$set->addMacro('if', function($node, $writer) { + return $writer->write('if (%node.args):'); +}, 'endif'); +\-- + + + +Helpery +======= + +V šablonách můžeme používat funkce, které pomáhají upravit nebo přeformátovat data do výsledné podoby. Říkáme jim *helpery*. Podívejte se na [přehled všech standardních helperů|default helpers]. + + +Jako helper lze do šablony zaregistrovat libovolný callback nebo anonymní funkci: + +/--php +$template->registerHelper('shortify', function ($s) { + return mb_substr($s, 0, 10); // zkrátí text na 10 písmen +}); +\-- + +V tomto případě by bylo šikovnější, kdyby helper přijímal parameter: + +/--php +$template->registerHelper('shortify', function ($s, $len = 10) { + return mb_substr($s, 0, $len); +}); +\-- + +V šabloně se potom volá takto: + +/--php +echo $template->shortify($text, 5); +\-- + +Latte zápis zjednodušuje, helpery se uvádějí za svislítkem, lze je zřetězit a aplikují se v pořadí od levého k pravému. Parametry se zadávají oddělené dvojtečkou nebo čárkou: + +/--html +

{$text|shortify:20} +\-- + + + +Samostatné použití šablon +========================= + +Při používání presenterů obvykle nepotřebujete udělat nic víc, než napsat kód šablony. Vše ostatní udělá framework za nás. Nicméně šablony můžete používat i samostatně, třeba v již existující aplikaci nepostavené na Nette. + +Šablonovací třídy se nacházejí ve jmenném prostoru `Nette\Templating`, jehož jádrem je třída [api:Nette\Templating\Template]. Jak s ní zacházet nejlépe ukáže příklad: + +/--php +use Nette\Templating\Template; + +$template = new Template; +// předáme šabloně parametry: +$template->firstName = 'John'; +$template->lastName = 'Doe'; +$template->render(' + + +'); +\-- + +Metoda `render()` vykreslí šablonu, tj. PHP skript, který jsme předali jako argument. Přičemž parametry budou k dispozici v lokálních proměnných `$firstName` a `$lastName`. Navíc v proměnné `$template` bude k dispozici samotný objekt šablony. + +Pokud máme šablonu uloženou v souboru, bude vhodnější použít třídu [FileTemplate |api:Nette\Templating\FileTemplate]: + +/--php +use Nette\Templating\FileTemplate; + +$template = new FileTemplate('template.phtml'); // soubor se šablonou +$template->firstName = 'John'; +$template->lastName = 'Doe'; +$template->render(); // vykreslí šablonu +\-- + +Abychom mohli v šabloně používat helpery, musíme je zaregistrovat. [Výchozí helpery |default helpers] přidáme tímto způsobem: + +/--php +$template->registerHelperLoader('Nette\Templating\DefaultHelpers::loader'); +\-- + + +Šablonu je možné předzpracovat pomocí jednoho či více filtrů, což jsou funkce, které dostanou jako parametr obsah šablony a vrátí ho v upraveném stavu. Jako filtr lze zaregistrovat libovolný callback nebo anonymní funkci. + +/--php +// filtr, který nahradí v textu šablony slova 'apple' slovem 'pizza' +$template->registerFilter(function ($s) { + return str_replace('apple', 'pizza', $s); +}); +\--- + +.[note] +V presenterech a komponentách je nejvhodnějším místem pro registraci přepsání metody `templatePrepareFilters`. + +Nejkomplexnějším filtrem je Latte: + +/--php +$template->registerFilter(new Nette\Latte\Engine); +\-- + +Po aplikaci všech zaregistrovaných filtrů získáme nativní PHP šablonu. Ta se uloží do cache, takže aplikace fitrů se provádí jen jednou. Cache se invaliduje automaticky při změně zdrojového souboru a je ukládána ve zvláštním formátu, který dovoluje soubory načítat konstrukcí `include`. Proto je nutné ještě určit úložiště, do kterého se budou soubory cache zapisovat: + +/--php +$template->setCacheStorage(new Nette\Caching\Storages\PhpFileStorage('temp')); +\-- + +Když se filtrované šablony ukládají do cache, je zbytečné pokaždé vytvářet a registrovat filtr Latte. Proto jeho registraci přidáme do události `onPrepareFilters`: + +/--php +$template->onPrepareFilters[] = function($template) { + $template->registerFilter(new Nette\Latte\Engine); +}; +\-- + +A nyní už víte o šablonách úplně vše. + +{{tags: nette\templates}} From 71db41d970bba37b8542c84298182d6f6e87b2d7 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Tue, 14 Jun 2011 10:31:54 +0200 Subject: [PATCH 0014/1741] cs/default-helpers: created --- cs/default-helpers.texy | 191 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 cs/default-helpers.texy diff --git a/cs/default-helpers.texy b/cs/default-helpers.texy new file mode 100644 index 0000000000..6275d88c6b --- /dev/null +++ b/cs/default-helpers.texy @@ -0,0 +1,191 @@ +Výchozí helpery šablon +********************** + +.[perex] +V šablonách můžeme používat funkce, které pomáhají upravit nebo přeformátovat data do výsledné podoby. Říkáme jim *helpery*. Tohle je přehled helperů, které jsou standardně k dispozici. + + +.[note] +Všechny výchozí helpery jsou určeny pro řetězce v kódování UTF-8. + +.[wide] +| Modifikace řetězců || +|--------------------------- +| `truncate` `(length, append='…') .[small]` | [zkrátí délku se zachováním slov |#truncate] +| `substr` `(offset, [length]) .[small]` | vrátí část řetězce +| `trim` `(charset=mezery) .[small]` | odstraní počáteční a koncové mezery či jiné znaky +| `striptags` | odstraní HTML značky +| `strip` | [odstraní bílé místo |#strip] +| `webalize` `(charlist=…, lower=TRUE) .[small]` | [vrací tvar používaný v cool URL |#webalize] +| `toAscii` | [odstraní diakritiku |strings#toc-toascii-s] +| `indent` `(level=1, char=\t) .[small]` | [odsadí text zleva o daný počet tabulátorů |#indent] +| `replace` `(search, replace='') .[small]` | zamění výskyty hledaného řetězce +| `replaceRE` `(pattern, replace='') .[small]` | zamění výskyty dle regulárního výrazu +| `padLeft` `(length, pad=' ') .[small]` | [doplní řetězec zleva na požadovanou délku |strings#toc-padleft] +| `padRight` `(length, pad=' ') .[small]` | [doplní řetězec zprava na požadovanou délku |strings#toc-padright] +| `repeat` `(count) .[small]` | opakování řetězce +| `implode` `(glue='') .[small]` | spojí pole do řetězce +| `nl2br` | odřádkuje značkou `
` +|--------------------------- +| Velikost písmen || +|--------------------------- +| `lower` | [převede na malá písmenka |#Velikost písmen] +| `upper` | [převede na velká písmenka |#Velikost písmen] +| `firstUpper` | [převede první písmenko na velké |#Velikost písmen] +| `capitalize` | [malá písmena, první písmeno ve slova velké |#Velikost písmen] +|--------------------------- +| Formátování hodnot || +|--------------------------- +| `date` `(format) .[small]` | [formátuje datum |#date] +| `number` `(decimals=0, decPoint='.') .[small]` | [formátuje číslo |#number] +| `bytes` `(precision=2) .[small]` | [formátuje velikost v bajtech |#bytes] +|--------------------------- +| Ostatní || +|--------------------------- +| `dataStream` `(mimetype=detect) .[small]` | [konverze pro Data URI protokol |#datastream] +| `url` | [escapuje parametr v URL |#url] +| `length` | vrací délku řetězce ve znacích +| `null` | spolkne vstup a nic nevrací + + + +Truncate +-------- + +Ořízne řetězec na uvedenou maximální délku, přičemž se snaží zachovávat celá slova. Pokud dojde ke zkrácení řetězce, přidá nakonec trojtečku (lze změnit druhým parametrem). + +/--php +{var $title = 'Řekněte, jak se máte?'} +{$title|truncate:5} Řekn… +{$title|truncate:20} Řekněte, jak se… +{$title|truncate:30} Řekněte, jak se máte? +\-- + + +Strip +----- + +Odstraní zbytečné bílé místo (mezery) z výstupu. + +/--html +{block |strip} +
    +
  • Hello
  • +
+{/block} +\-- + +Vygeneruje + +/--html +
  • Hello
+\-- + + +Webalize +-------- + +Upraví řetězec do tvaru používaného v URL, tj. odstraní diakritiku a všechny znaky kromě písmen anglické abecedy a číslic nahradí spojovníkem. + +/--php +{var $name = 'náš produk'} +{$name|webalize} nas-produkt +\-- + + +Indent +----- + +Odsadí text zleva o daný počet tabulátorů nebo jiných znaků, které můžeme uvést ve druhém argumentu: + +/--html +
+{block |indent} +

Hello

+{/block} +
+\-- + +Vygeneruje + +/--html +
+

Hello

+
+\-- + + +Velikost písmen +--------------- + +/--php +{var $s = 'dobrý DEN'} +{$s|lower} dobrý den +{$s|upper} DOBRÝ DEN +{$s|firstUpper} Dobrý DEN +{$s|capitalize} Dobrý Den +\-- + + +Date +---- + +Formátuje datum podle masky buď ve tvaru používaném PHP funkcí [php:strftime] nebo [php:date]. Helper přijímá datum buď ve formátu UNIX timestamp, v podobě řetězce nebo jako objekt `DateTime`. + +/--php +{$today|date:'%d.%m.%Y'} +\--- + + +Number +------ + +Formátuje číslo na určitý počet desetinných míst. Lze určit znak pro desetinnou čárku a oddělovač tisíců. + +/--php +{1234.20 |number} 1,234 +{1234.20 |number:1} 1,234.2 +{1234.20 |number:2} 1,234.20 +{1234.20 |number:2:',', ' '} 1 234,20 +\--- + + +Bytes +----- + +Formátuje velikost v bajtech do lidsky čitelné podoby. + +/--php +{$size|bytes} 0 B, 10 B nebo 1.25 GB, … +\-- + + +DataStream +---------- + +Konvertuje do data URI scheme. Pomocí něj lze do HTML nebo CSS vkládat obrázky bez nutnosti linkovat externí soubory. Podporují jej všechny moderní prohlížeče a Internet Explorer od verze 8. + +Mějme v proměnné obrázek `$img = Image::fromFile('obrazek.gif')`, poté + +/--html + +\--- + +Vygeneruje například: + +/--html + +\-- + + + +Url +--- + +Escapuje proměnnou pro použítí jakožto parametru v URL. + +/--php +{$name} +\--- From d729d53d5631ce7b64b70dee53f73c245d197516 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Tue, 14 Jun 2011 14:36:14 +0200 Subject: [PATCH 0015/1741] cs/forms/validation: deleted --- cs/forms/validation.texy | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 cs/forms/validation.texy diff --git a/cs/forms/validation.texy b/cs/forms/validation.texy deleted file mode 100644 index 1e14e90da7..0000000000 --- a/cs/forms/validation.texy +++ /dev/null @@ -1,7 +0,0 @@ -Formulářová validace -******************** - -1) Validace na straně serveru -2) Validace na straně klienta -3) placeholdery %label, %name a %value ve výchozích chybových zprávách -4) odkázat na lokalizaci chybových hlášek [Forms/Localization] From 4140d6b5947f516ed2468e71d92431bbf6663be1 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Tue, 14 Jun 2011 15:11:28 +0200 Subject: [PATCH 0016/1741] cs/components: created --- cs/components.texy | 317 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 317 insertions(+) create mode 100644 cs/components.texy diff --git a/cs/components.texy b/cs/components.texy new file mode 100644 index 0000000000..4ba84566d4 --- /dev/null +++ b/cs/components.texy @@ -0,0 +1,317 @@ +Píšeme komponenty +***************** + +/--div .[perex] +Komponenty představují základní kámen znovupoužitelnosti kódu, usnadňují vám práci a dovolují využívat práce komunity. Komponenty jsou báječné. Řekneme si + +- jak psát komponenty? +- co jsou to signály? +- jak posílat flash zprávy? +- jak na AJAX? +\-- + + +Komponenta představuje vykreslitelný objekt. Jsou to například formuláře, menu, ankety a podobně. V rámci jedné stránky jich může existovat libovolný počet. Na stránkách http://addons.nette.org/cs/ můžete najít open-source komponenty, které sem umístili dobrovolníci z komunity okolo Nette Framework. + +Příklad komponenty a jejího začlenění do stránky najdete v [instalačním balíku | installation] ve složce `examples/Fifteen`. + +Komponenta je zpravidla potomkem třídy [api:Nette\Application\UI\Control], tím také začneme: + +/--php +use Nette\Application\UI\Control; + +class PollControl extends Control +{ +} +\-- + +.[note] +Bavíme-li se o komponentách, obvykle myslíme potomky třídy [Control |api:Nette\Application\UI\Control]. Přesnější by tedy bylo používat termín „controls“ (tj. ovládací prvky), ale „kontrola“ má v češtině zcela jiný význam a spíš se ujaly „komponenty“. + + +Šablony +======= + +Komponenta obsahuje továrničku na svou [šablonu |templating]. Ta standardně vytvoří šablonu, předá ji některé [základní proměnné |templating#toc-sablony-v-presenterech] a zaregistruje [standardní helpery |default-helpers]. O vykreslení se už musíte postarat sami, a to v metodě `render()`. Tam také musíte určit soubor, ze kterého bude šablona načtena, a zaregistrovat proměnné, které se budou v šabloně používat. Šablonu můžeme umístit do stejné složky a pod stejným názvem jako komponentu: + +/--php +public function render() +{ + $template = $this->template; + $template->setFile(dirname(__FILE__) . '/poll.phtml'); + // vložíme do šablony nějaké parametry + $template->param = $value; + // a vykreslíme ji + $template->render(); +} +\-- + + +Odkazy +====== + +Pomocí metody `link()` můžete odkazovat na jednotlivé signály. V šablonách se odkazy vykreslují pomocí stejnojmenného makra. + +U presenterů se při volání signálů za jejich název píše vykřičník, aby se odlišily od odkazů na akce. Komponenty však akce nemají, a proto se u nich vykřičník nemusí uvádět. + +Příklad použití v komponentě: +/--php +$url = $this->link('click', $x, $y); +\-- + +Příklad použití v šabloně: +/--html + ... +\-- + + + + +Flash zprávy +============ + +Komponenta má své vlastní úložiště flash zpráv nezávislé na presenteru. Jde o zprávy, které např. informují o výsledku operace, po kterých **následuje přesměrování.** + +Zasílání obstarává metoda [flashMessage |api:Nette\Application\UI\Control::flashMessage()]. Prvním parametrem je text zprávy a nepovinným druhým parametrem její typ (error, warning, info apod.). Metoda `flashMessage()` vrací instanci flash zprávy, které je možné přidávat další informace. + +Příklad: +/--php +public function deleteFormSubmitted(AppForm $form) +{ + ... požádáme model o smazání záznamu ... + + // předáme flash zprávu + $this->flashMessage('Položka byla smazána.'); + + $this->redirect(...); // a přesměrujeme +} +\-- + +Šabloně jsou tyto zprávy automaticky předány v proměnné `$flashes`. Tato proměnná obsahuje pole s objekty (`stdClass`), které obsahují vlastnosti `message` (text zprávy), `type` (typ zprávy) a mohou obsahovat již zmíněné extra informace. + +Příklad: +/--php +{foreach $flashes as $flash} +
{$flash->message}
+{/foreach} +\-- + +Nejdůležitejší samozřejmě je, že pokud po uložení zprávy `flashMessage()` následuje přesměrování, bude i v dalším požadavku v šabloně existovat stejný parametr `$flashes`. Zprávy zůstanou poté živé další 3 sekundy – například pro případ, že by z důvodu chybného přenosu uživatel stránku dal obnovit. Pokud někdo dvakrát za sebou obnoví stránku (F5), tak mu zpráva tedy nezmizí, pokud klikne jinam, tak ji už neuvidí. + + + +Signály +======= + +Signály umožňují komponentám získávat od uživatele podněty k nějakým akcím. O zachycení signálu se stará presenter, ten ho odevzdá komponentě, která je jeho příjemcem. Protože presenter je sám o sobě komponentou, tak ho klidně odevzdá i sám sobě. + +Signál je v komponentě reprezentován metodou `handle`. Může mít specifikované parametry. V případě, že signál není platný, je vyvolána výjimka [api:Nette\Application\BadSignalException]. + +/--php +public function handleClick($x, $y) +{ + if (!$this->isClickable($x, $y)) { + throw new Nette\Application\BadSignalException('Action not allowed.'); + } + + ... zpracování signálu ... +} +\-- + + +Invalidace a snippety +===================== + +Při signálu může dojít ke změnám, které si vyžadují překreslit komponentu. K tomu slouží triptych metod `invalidateControl()`, `validateControl()` a `isControlInvalid()`, což je základem AJAXu v Nette. + +Nette však nabízí ještě jemnější rozlišení, než na úrovni komponent, a to tzv. [snippetů | ajax] neboli ústřižků. + +Lze tedy invalidovat a validovat na úrovni těchto snippetů (každá komponenta jich může mít libovolné množství). Pokud se invaliduje celá komponenta, tak je i každý její snippet považován za invalidní. Komponenta je invalidní i tehdy, pokud je invalidní některá z jejích podřazených komponent. + +Více informací naleznete na [stránce věnované AJAXu | ajax]. + + + +Perzistentní parametry +====================== + +Často se stává, že je v komponentách potřeba držet nějaký parametr pro uživatele po celou dobu, kdy se s komponentou pracuje. Může to být například číslo stránky ve stránkování. Takový parametr označíme jako perzistentní pomocí [anotace | php-language-enhancements#anotace] `@persistent`. + +/--php +class PollControl extends Control +{ + /** @persistent */ + public $page = 1; + + ... +} +\-- + +Tento parametr bude automaticky přenášen v každém odkazu jako GET parametr, a to až do chvíle, kdy uživatel stránku s touto komponentou opustí. + +.[caution] +Nikdy se nespoléhejte na správnost perzistentních parametrů, protože mohou být snadno podvrženy (přepsáním v URL adrese stránky). Ověřte si například, zda je číslo stránky v platném rozsahu. + + + + +Komponenty do hloubky +===================== + +Komponenty bývají ve většině případů vykreslitelné. Vedle nich však existují i nevykreslitelné komponenty. Stejně tak některé komponenty mohou mít potomky, jiné zase ne. Nette Framework pro všechny tyto typy komponent zavádí několik tříd a rozhraní. + + +Dědičnost objektově orientovaného programování nám umožňuje třídy zařadit do hierarchické struktury, stejně jako je to v reálném světě. Můžeme totiž vytvářet nové třídy odvozením od jiných. Tyto odvozené třídy jsou pak potomkem původní třídy a dědí jeho členské proměnné a metody. Odvozená třída může přidávat další funkcionalitu (metody a členské proměnné) k již zděděným schopnostem. + +Ke správnému pochopení "jak věci pracují", je potřeba vědět, kde má která třída své kořeny. + +/-- +Nette\Object + | + +- Nette\ComponentModel\Component { IComponent } + | + +- Nette\ComponentModel\Container { IContainer } + | + +- Nette\Application\UI\PresenterComponent { ISignalReceiver, IStatePersistent } + | + +- Nette\Application\UI\Control { IPartiallyRenderable } + | + +- Nette\Application\UI\Presenter { IPresenter } + +\-- + + +Nette\ComponentModel\IComponent .{toc: IComponent} +---------------- + +Rozhraní [api:Nette\ComponentModel\IComponent] musí implementovat každá komponenta. Musí obsahovat metodu `getName()` vracející její název a metodu `getParent()` vracející jejího rodiče. Obojí lze nastavit metodou `setParent()` - první parametr je rodič a druhý název komponenty. + + +Nette\ComponentModel\Component .{toc: Component} +--------------- + +[api:Nette\ComponentModel\Component] je standardní implementací `IComponent`. Je společným předkem všech komponent, vycházejí z ní všechny prvky formulářů. Obsahuje metody zjišťují příbuznost objektů a hlavně propojení (provázání) s rodiči: + +`lookup($type)` vyhledá v hierarchii směrem nahoru objekt požadované třídy nebo rozhraní. Například `$component->lookup('Nette\Application\UI\Presenter')` vrací presenter, pokud je k němu, i přes několik úrovní, komponenta připojena. + +`lookupPath($type)`, která vrací tzv. cestu, což řetězec vzniklý spojením jmen všech komponent na cestě mezi aktuální a hledanou komponentou. Takže např. `$component->lookupPath('Nette\Application\UI\Presenter')` vrací jedinečný identifikátor komponenty vůči presenteru. + + +Nette\ComponentModel\IContainer .{toc: IContainer} +------------------------- + +Rodičovské komponenty kromě rozhraní `IComponent` implementují i [api:Nette\ComponentModel\IContainer], které obsahuje metody pro přidání, odebrání, získání a iteraci nad komponentami. Komponenty pak mohou vytvářet hierarchii - např. presentery mohou obsahovat formuláře obsahující textová políčka a tlačítka. Celý strom komponent je tedy tvořen větvemi v podobě objektů `IContainer` a listů `IComponent`. + + + +Nette\ComponentModel\Container .{toc: Container} +------------------------ + +[api:Nette\ComponentModel\Container] je standardní implementací rozhraní `IContainer`. Je předkem formuláře nebo tříd Control či Presenter. + +Disponuje metodami pro snadné přidávání, získávání a odstraňování objektů a samozřejmě iteraci nad svým obsahem. Při pokusu o získání nedefinovaného potomka je zavolána továrnička `createComponent($name)`. Metoda `createComponent($name)` zavolá v aktuální komponentě metodu `createComponent` a jako parametr jí předá název komponenty. Vytvořená komponenta je poté přidána do aktuální komponenty jako její potomek. + + +Nette\Application\UI\PresenterComponent .{toc: PresenterComponent} +------------------------------------ + +Předek [api:Nette\Application\UI\PresenterComponent] všech komponent používaných v presenteru. Komponenty presenteru jsou objekty, které si presenter uchovává počas svého [životního cyklu |presenters#toc-zivotni-cyklus-presenteru]. + +Mají schopnost vzájemně ovlivňovat ostatní poděděné komponenty, ukládat své stavy do URL a odpovídat na uživatelské příkazy a nemusí být vykreslitelné. + + +Nette\Application\UI\Control .{toc: Control} +---------------------------- + +[Control |api:Nette\Application\UI\Control] je vykreslitelná komponenta, znovupoužitelná součást webové aplikace, které se věnuje celá tato kapitola. Tuto třídu máme obvykle na mysli, když hovoříme o komponentách. Navíc si umí pamatovat, kterou svou část má vykreslit při [AJAXovém požadavku |ajax#toc-invalidace]. K tomu slouží triptych metod `invalidateControl()`, `validateControl()` a `isControlInvalid()`. + +Control nepředstavuje pravoúhlou oblast ve stránce, ale logickou komponentu, která se může renderovat i do více podob. Každá komponenta může být navíc na stránce vykreslena vícekrát, nebo podmíněně, nebo pokaždé s jinou šablonou atd. + +Znovupoužitelná součást aplikace. + + +Strom komponent +--------------- + +Každá komponenta děděná z třídy `Nette\ComponentModel\Component` má jako první parametr konstruktoru rodiče (`IContainer`) v hierarchii stromu komponent. Uvedením stejné komponenty pod různými jmény se dá dosáhnout například zobrazení jedné komponenty na stránce vícekrát. + +Rodičem může být presenter, nějaká komponenta nebo jakýkoliv jiný objekt implementující rozhraní `IContainer`. Hierarchie pak může vypadat nějak takto: + +/-- +Nette\Application\UI\Presenter { kořenem ve stromu komponent je vždy presenter } + | + --Nette\Application\UI\Control { implementuje IContainer => může být rodičem } + | + --Nette\ComponentModel\Component + | + --Nette\ComponentModel\Component { neimplementuje IContainer => nemůže být rodičem } + | + --Nette\Application\UI\Control + | + --Nette\ComponentModel\Component +\-- + +Komponentový model Nette umožňuje velmi dynamickou práci se stromem (komponenty můžeme vyjímat, přesouvat, přidávat), proto by byla chyba se spoléhat na to, že po vytvoření komponenty je hned znám rodič, rodič rodiče atd. Nemusí být. + +/--php +$control = new NewsControl; +// ... +$parent->addComponent($control, 'shortNews'); + +// nebo alternativně starším (statickým) způsobem +$control = new NewsControl($parent, 'shortNews'); +\-- + + +Monitorování změn +----------------- + +Jak poznat, kdy byla komponenta připojena do stromu presenteru? Sledovat změnu rodiče nestačí, protože k presenteru mohl být připojen třeba rodič rodiče. Pomůže metoda `monitor($type)`. Každá komponenta může monitorovat libovolný počet tříd/rozhraní. Připojení nebo odpojení je ohlášeno zavoláním metody `attached($obj)` resp. `detached($obj)`, kde `$obj` je objekt sledované třídy. + +Pro lepší pochopení příklad: třída `UploadControl`, reprezentující formulářový prvek pro upload souborů v Nette\Forms, musí formuláři nastavit atribut `enctype` na hodnotu `multipart/form-data`. V době vytvoření objektu ale k žádnému formuláři připojena být nemusí (leda by se v konstruktoru předal $parent, ale ani ten nemusí být formulářem či kontejnerem připojeným k formuláři). Ve kterém okamžiku tedy formulář modifikovat? Řešení je jednoduché - v konstruktoru se požádá o monitoring: + +/--php +class UploadControl extends Nette\Forms\Controls\BaseControl +{ + public function __construct($label) + { + $this->monitor('Nette\Forms\Form'); + ... + } + + ... +} +\-- + +a jakmile je formulář k dispozici, zavolá se metoda attached: + +/--php +protected function attached($form) +{ + if ($form instanceof Nette\Forms\Form) { + $form->getElementPrototype()->enctype = 'multipart/form-data'; + } +} +\-- + +Monitorování a dohledávání komponent nebo cest přes lookup je **velmi pečlivě optimalizované pro maximální výkon. .(David Grudl: byla to piplačka a na ten kód jsem hrdý :-\)\))** + + +Iterování nad dětmi +------------------- + +K iterování slouží metoda `getComponents($deep = FALSE, $type = NULL)`. První parametr určuje, zda se mají komponenty procházet do hloubky (neboli rekurzivně). S hodnotou TRUE tedy nejen projde všechny komponenty, jichž je rodičem, ale také potomky svých potomků atd. Druhý parametr slouží jako volitelný filtr podle tříd nebo rozhraní. + +Příkladem mohou být formuláře. Takto nějak se provádí kupříkladu ověření validace prvků: + +/--php +$valid = TRUE; +foreach ($form->getComponents(TRUE, 'Nette\Forms\IControl') as $control) { + if (!$control->getRules()->validate()) { + $valid = FALSE; + break; + } +} +\-- + +{{tags: nette\component, nette\componentcontainer}} From 3027cb489ca0eff39a37230547060540ddec73cf Mon Sep 17 00:00:00 2001 From: paranoiq Date: Wed, 15 Jun 2011 08:58:17 +0200 Subject: [PATCH 0017/1741] en/credits: created --- en/credits.texy | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 en/credits.texy diff --git a/en/credits.texy b/en/credits.texy new file mode 100644 index 0000000000..006c0ff755 --- /dev/null +++ b/en/credits.texy @@ -0,0 +1,8 @@ +Credits +******* + +Nette Framework was created by [David Grudl | http://davidgrudl.com] in 2004. Since 2008 it is being distributed as open source and the team of [contributors | https://github.com/nette/nette/contributors] is gradually growing. Today it is the most popular and most used framework in the Czech Republic. ([source | https://spreadsheets.google.com/viewanalytics?formkey=dEl1ZDJhbk1hWEFLbU43Skl0eDVDSnc6MQ#chart#4]) + +Nette Framework is being used by prominent local companies, such as internet publishers and banks and even the website of the president of the Czech Republic, Václav Klaus. Around Nette Framework formed one of the most active czech web developer comunities, that holds regular meetings called [Poslední sobota | http://poslednisobota.cz] (Last Saturday). + +{{toc:yes}} From 12aa896816021678aaa266e21ff8eaeb8bc2247f Mon Sep 17 00:00:00 2001 From: vrana Date: Wed, 15 Jun 2011 15:24:09 +0200 Subject: [PATCH 0018/1741] =?UTF-8?q?cs/templating:=20P=C5=99eklep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/templating.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/templating.texy b/cs/templating.texy index 30d365a636..2bfbaa35cb 100644 --- a/cs/templating.texy +++ b/cs/templating.texy @@ -61,7 +61,7 @@ Každé párové makro, například `{if} … {/if}`, operující nad jedním HT \-- -A to se s n:makry dají dělat ještě daleko zajímavější kousky, jak se zachvíli dozvíte. +A to se s n:makry dají dělat ještě daleko zajímavější kousky, jak se za chvíli dozvíte. Makro `{$item|capitalize}`, které slouží k vypsání proměnné `$item`, obsahuje tzv. [helper |#helpery v Latte], v tomto případě `capitalize`, který převede první písmenko každého slova na velké. From 783bf79301d20c907875af9b148cfd61c9e82a1a Mon Sep 17 00:00:00 2001 From: jansfabik Date: Wed, 15 Jun 2011 22:43:34 +0200 Subject: [PATCH 0019/1741] =?UTF-8?q?cs/templating:=20p=C5=99eklepy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/templating.texy | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cs/templating.texy b/cs/templating.texy index 2bfbaa35cb..2d6924ddcf 100644 --- a/cs/templating.texy +++ b/cs/templating.texy @@ -53,7 +53,7 @@ Makra Popis všech výchozích maker najdete na [samostatné stránce |default macros]. Krom toho můžete vytvářet i [#vlastní makra]. -Každé párové makro, například `{if} … {/if}`, operující nad jedním HTML elementem, se dá přepsat do podoby [n:marka |#n-makra]. Takto by bylo možné zapsat například i `{foreach}` +Každé párové makro, například `{if} … {/if}`, operující nad jedním HTML elementem, se dá přepsat do podoby [n:makra |#n-makra]. Takto by bylo možné zapsat například i `{foreach}` /--html \-- + +Anebo potřebujete označit aktivní menu třídou current? +/--html + +\-- + Úžasné, že? From 0d857b0a88d5dbc139a631185baa98daec7ec6e0 Mon Sep 17 00:00:00 2001 From: redhead Date: Sat, 16 Jul 2011 17:50:34 +0200 Subject: [PATCH 0085/1741] =?UTF-8?q?en/homepage:=20latte=20macros=20and?= =?UTF-8?q?=20helper=20p=C5=99ekald?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- en/homepage.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/homepage.texy b/en/homepage.texy index 9ad3e10ab2..1532d2b9a0 100644 --- a/en/homepage.texy +++ b/en/homepage.texy @@ -53,7 +53,7 @@ Here you can find a lot of sources which can help you to learn Nette Framework a --------------------- - [Forms] -- [Templating], [default macros] and [default helpers] +- [Templates], [Latte macros] and [helpers] - [MVC Application & Presenters | presenters] - [Micro-framework] - [Components and Controls | components] From 6ea8bedd1802bbddb4d7e08c328049949b504feb Mon Sep 17 00:00:00 2001 From: redhead Date: Sat, 16 Jul 2011 17:59:02 +0200 Subject: [PATCH 0086/1741] en/default-macros: Updated from czech version --- en/default-macros.texy | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/en/default-macros.texy b/en/default-macros.texy index 4b6eb40bc2..7ac6754d1d 100644 --- a/en/default-macros.texy +++ b/en/default-macros.texy @@ -1,4 +1,4 @@ -Default macros +Default Latte macros ************** .[perex] @@ -390,6 +390,12 @@ By using `n:class` macro the problem is rather trivial: \-- +Or do you need to mark the current menu link with 'current' class? + +/--html + +--/ + Amazing, huh? @@ -647,15 +653,8 @@ Macros for rendering [forms |forms] and their elements: {/form} \-- -/--comment -For existing HTML code you can alter actual elements with `n:input` macro to activate them: - /--html -{form myForm} -

Jméno:

-

Heslo:

-{/form} -\-- +`{input}` macro renders any element including select boxes and textareas. `{label}` is optionally paired macro, ie. `{label}Age{/label}`, in that case the text is translated too. From fa172c478d2bef23dbbb0884fa2b7df5ac0d2998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Tvrd=C3=ADk?= Date: Sat, 16 Jul 2011 19:09:20 +0200 Subject: [PATCH 0087/1741] en/homepage: fixed urls --- en/homepage.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/homepage.texy b/en/homepage.texy index 1532d2b9a0..d0c90b895a 100644 --- a/en/homepage.texy +++ b/en/homepage.texy @@ -53,7 +53,7 @@ Here you can find a lot of sources which can help you to learn Nette Framework a --------------------- - [Forms] -- [Templates], [Latte macros] and [helpers] +- [Templates | templating], [Latte macros | default macros] and [helpers | default helpers] - [MVC Application & Presenters | presenters] - [Micro-framework] - [Components and Controls | components] From 7af98071a342bc2e001b6317da8706bfe281122a Mon Sep 17 00:00:00 2001 From: na1k Date: Thu, 21 Jul 2011 10:16:59 +0200 Subject: [PATCH 0088/1741] =?UTF-8?q?cs/security:=20p=C5=99eklep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/security.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/security.texy b/cs/security.texy index 1959968939..a1f06212eb 100644 --- a/cs/security.texy +++ b/cs/security.texy @@ -209,7 +209,7 @@ Jak už víte, po odhlášení uživatele se nemusí smazat jeho identita. Tedy Autorizátor ----------- -Autentikátor je ten, kdo umí rozhodnout, zda má uživatel oprávnění provést určitou akci. Jde o objekt implementující rozhraní [api:Nette\Security\IAuthorizator] s jedinou metodu `isAllowed()`, jejímž úkolem je rozhodnout, zda má daná *role* povolení provést určitou *operaci* s určitým *zdrojem*. +Autorizátor je ten, kdo umí rozhodnout, zda má uživatel oprávnění provést určitou akci. Jde o objekt implementující rozhraní [api:Nette\Security\IAuthorizator] s jedinou metodu `isAllowed()`, jejímž úkolem je rozhodnout, zda má daná *role* povolení provést určitou *operaci* s určitým *zdrojem*. - **role** je vlastnost uživatele - např. moderátor, redaktor, návštěvník, zaregistrovaný uživatel, správce... - **zdroj** (*resource*) se nějaký logický prvek webu - článek, stránka, uživatel, položka v menu, anketa, presenter, ... From 62b27f48c9ccd2057efcb05b46c05dc2af338070 Mon Sep 17 00:00:00 2001 From: MartyIX Date: Tue, 26 Jul 2011 21:08:26 +0200 Subject: [PATCH 0089/1741] en/testing: created --- en/testing.texy | 103 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 en/testing.texy diff --git a/en/testing.texy b/en/testing.texy new file mode 100644 index 0000000000..67cfa00644 --- /dev/null +++ b/en/testing.texy @@ -0,0 +1,103 @@ +Testing +******** + +/--div .[perex] +Even good programmers make mistakes. The difference between a good and a bad programmer is that the former one quickly reveals errors with the help of automated tests. + +- "Those who do not test are condemned to repeat their mistakes." +- "Whenever you get rid of an error, another pops up." (Murphy's law) +- "Test, test, test" (Martin Ilyich Fowler) +\-- + +Have you ever written a similar PHP code? + +/--php +$obj = new MyClass; +$result = $obj->process($input); + +var_dump($result); +\-- + +In other words, have you printed the result of a function call in order to visually verify that the function returns the expected result? Surely you do it many times a day. Do you expect that the class will not break in future in the case that everything has worked correctly and you have only deleted the debbuging line of code? Murphy's law guarantees the opposite :-) + +If you had not deleted the test, you can run it anytime in the future to verify that everything still works as it should. It is desirable to modify the previous code slightly so as it does not require a human review: + +/--php +function assertTrue($condition) +{ + echo $condition ? 'OK' : 'ERROR: test failed'; +} + +$obj = new MyClass; +$result = $obj->process($input); +assertTrue( $result === array(1, 2, 3) ); +\-- + +You may create a large amount of these tests over the time, so it would be nice if we were able to run them automatically. This can be done with the help of a testing framework, such as Nette\test used to test Nette Framework itself or very popular [PHPUnit | http://www.phpunit.de]. + +PHPUnit +------- + +At first, install PHPUnit. Type to the command line: + +/-- +pear channel-discover pear.phpunit.de +pear install phpunit/PHPUnit +\-- + +Whether the installation was successful can be found out by typing ‘phpunit’ to the command line and checking that the program runs. + +In the conception of PHPUnit a test is each class inherited from `PHPUnit_Framework_TestCase` with the extension `Test` in the title (for example `MyClassTest`), which is stored in a file with the same name as the class name. The actual testing takes place in its methods with the prefix `test`, for example `testProcess()`. Before any such method is called, the setUp() method, which is supposed to set up a test environment to its default state, is invoked. + +To verify returned results we use so called asserts. PHPUnit offers a variety of them, probably the most widely used are `assertTrue($result)`, `assertFalse($result)` and `assertEquals($expectedValue, $result)`. + +The file `MyClassTest.php` may look like this: + +/--php +require_once 'PHPUnit/Framework.php'; + +class MyClassTest extends PHPUnit_Framework_TestCase +{ + public function testProcess() + { + $obj = new MyClass; + $result = $obj->process($input); + $this->assertEquals( array(1, 2, 3), $result ); + } +} +\-- + +The test can be run by navigating to the directory with the test file in the command line and typing the command: + +/-- +phpunit . +\-- + + + +Presenter testing +-------------------- + +How to test a function of a presenter? Each presenter has a function `run()`, which converts a request (object `Nette\Application\Request`) into a response (object `Nette\Application\IResponse`). So we create a request and then we use asserts to check the returned answer: + +/--php +class HomepagePresenterTest extends PHPUnit_Framework_TestCase +{ + + public function testRenderDefault() + { + $presenter = new HomepagePresenter; + $request = new Nette\Application\Request('Homepage', 'GET'); + $response = $presenter->run($request); + $this->assertType( + 'Nette\Application\Responses\TextResponse', + $response + ); + } +} +\-- + + +{{toc: title}} + +{{themeicon: tick.png}} From bb4a0f08fe1343d3c5be4f419838875d651559c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Tue, 26 Jul 2011 22:12:07 +0200 Subject: [PATCH 0090/1741] =?UTF-8?q?cs/testing:=20dopln=C4=9Bno=20p=C5=99?= =?UTF-8?q?id=C3=A1n=C3=AD=20contextu=20do=20presenteru?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/testing.texy | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cs/testing.texy b/cs/testing.texy index db63877fd2..eb8cd927bf 100644 --- a/cs/testing.texy +++ b/cs/testing.texy @@ -81,7 +81,11 @@ phpunit . Testování presenterů -------------------- -Jak testovat funkci presenterů? Každý presenter má funkci `run()`, která převede požadavek (objekt `Nette\Application\Request`) na odpověď (objekt `Nette\Application\IResponse`). Vytvoříme si tedy požadavek a poté pomocí assertů ověříme vrácenou odpověď: +Jak testovat funkci presenterů? Každý presenter má funkci `run()`, která převede požadavek (objekt `Nette\Application\Request`) na odpověď (objekt `Nette\Application\IResponse`). + +Aby presenter běžel správně, vyžaduje objekt `Nette\DI\Container` s [nakonfigurovanými službami | configuring]. Nejjednodušší způsob jak vložit nakonfigurovaný [DI Container | dependency-injection#toc-nette-di-container] je použitím statické třídy `Nette\Environment`, který se doporučuje nepoužívat, protože je ve frameworku hlavně kvůli zpětné kompatibilitě. V PHPUnit testech je však použití `Nette\Environment` oprávněné. + +Vytvoříme si tedy požadavek a poté pomocí assertů ověříme vrácenou odpověď: /--php class HomepagePresenterTest extends PHPUnit_Framework_TestCase @@ -90,6 +94,7 @@ class HomepagePresenterTest extends PHPUnit_Framework_TestCase public function testRenderDefault() { $presenter = new HomepagePresenter; + $presenter->setContext(Nette\Environment::getContext()); $request = new Nette\Application\Request('Homepage', 'GET'); $response = $presenter->run($request); $this->assertType( From 3f2db7fd75637e0dd4996e8c641c936197c2a2f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Tue, 26 Jul 2011 22:15:12 +0200 Subject: [PATCH 0091/1741] en/testing: review; added injection of DI Container to presenter --- en/testing.texy | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/en/testing.texy b/en/testing.texy index 67cfa00644..ae35a0172d 100644 --- a/en/testing.texy +++ b/en/testing.texy @@ -47,7 +47,7 @@ pear install phpunit/PHPUnit Whether the installation was successful can be found out by typing ‘phpunit’ to the command line and checking that the program runs. -In the conception of PHPUnit a test is each class inherited from `PHPUnit_Framework_TestCase` with the extension `Test` in the title (for example `MyClassTest`), which is stored in a file with the same name as the class name. The actual testing takes place in its methods with the prefix `test`, for example `testProcess()`. Before any such method is called, the setUp() method, which is supposed to set up a test environment to its default state, is invoked. +In the conception of PHPUnit a test is each class which is inherited from `PHPUnit_Framework_TestCase` with the extension `Test` in the title (for example `MyClassTest`), which is stored in a file with the same name as the class name. The actual testing takes place in its methods with the prefix `test`, for example `testProcess()`. Before any such method is called, the `setUp()` method is invoked, which is supposed to set up a test environment to its default state. To verify returned results we use so called asserts. PHPUnit offers a variety of them, probably the most widely used are `assertTrue($result)`, `assertFalse($result)` and `assertEquals($expectedValue, $result)`. @@ -78,7 +78,11 @@ phpunit . Presenter testing -------------------- -How to test a function of a presenter? Each presenter has a function `run()`, which converts a request (object `Nette\Application\Request`) into a response (object `Nette\Application\IResponse`). So we create a request and then we use asserts to check the returned answer: +How to test a function of a presenter? Each presenter has a function `run()`, which converts a request (object `Nette\Application\Request`) into a response (object `Nette\Application\IResponse`). + +To run properly, presenter requires object of `Nette\DI\Container` containing [configured services | configuring]. Easiest way to inject the configured [DI Container | dependency-injection#toc-nette-di-container] is by using static class `Nette\Environment`, which is higly suggested to not use, because it's in framework mainly for backwards-compatibility reasons. Usage of `Nette\Environment` is justifiable only in PHPUnit tests. + +So we create a request and then we use asserts to check the returned answer. /--php class HomepagePresenterTest extends PHPUnit_Framework_TestCase @@ -87,6 +91,7 @@ class HomepagePresenterTest extends PHPUnit_Framework_TestCase public function testRenderDefault() { $presenter = new HomepagePresenter; + $presenter->setContext(Nette\Environment::getContext()); $request = new Nette\Application\Request('Homepage', 'GET'); $response = $presenter->run($request); $this->assertType( From e903e0470e886ba1a54c8ae371710a53d09d3a4e Mon Sep 17 00:00:00 2001 From: MartyIX Date: Tue, 26 Jul 2011 22:34:52 +0200 Subject: [PATCH 0092/1741] en/testing: added (in)definite articles --- en/testing.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/testing.texy b/en/testing.texy index ae35a0172d..f5eead281d 100644 --- a/en/testing.texy +++ b/en/testing.texy @@ -80,7 +80,7 @@ Presenter testing How to test a function of a presenter? Each presenter has a function `run()`, which converts a request (object `Nette\Application\Request`) into a response (object `Nette\Application\IResponse`). -To run properly, presenter requires object of `Nette\DI\Container` containing [configured services | configuring]. Easiest way to inject the configured [DI Container | dependency-injection#toc-nette-di-container] is by using static class `Nette\Environment`, which is higly suggested to not use, because it's in framework mainly for backwards-compatibility reasons. Usage of `Nette\Environment` is justifiable only in PHPUnit tests. +To run properly, presenter requires an object of `Nette\DI\Container` containing [configured services | configuring]. The easiest way to inject the configured [DI Container | dependency-injection#toc-nette-di-container] is by using the static class `Nette\Environment`, which is highly suggested not to use because it remains in the framework mainly for backwards-compatibility reasons. The usage of `Nette\Environment` is justifiable only in PHPUnit tests. So we create a request and then we use asserts to check the returned answer. From 214089c7fcac228535e9112eb51ec66ac32c146b Mon Sep 17 00:00:00 2001 From: masaj Date: Wed, 27 Jul 2011 07:49:22 +0200 Subject: [PATCH 0093/1741] cs/php-language-enhancements: opraven preklep: Copier->Circle --- cs/php-language-enhancements.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/php-language-enhancements.texy b/cs/php-language-enhancements.texy index 24ec18a15d..97327083c2 100644 --- a/cs/php-language-enhancements.texy +++ b/cs/php-language-enhancements.texy @@ -40,7 +40,7 @@ echo $circle->getArea(); // 10² * π ≈ 314 Zdá se, že kód by měl vypsat přibližně 314, nicméně vypíše nulu. Jak je to možné? Omylem se místo `$circle->radius` do kódu dostalo `raduis`, drobný překlep. Záludnost chyby tkví hlavně v tom, že na ni PHP nijak neupozorní, nepomůže ani sledování chyb Warning nebo Notice. Z hlediska jazyka to není chyba, ačkoliv stojí hodně námahy ji vypátrat. -Uvedenou chybu bychom ihned odhalili, pokud by třída `Copier` byla potomkem třídy [api:Nette\Object]: +Uvedenou chybu bychom ihned odhalili, pokud by třída `Circle` byla potomkem třídy [api:Nette\Object]: /--php class Circle extends Nette\Object From 15abe50aa6efaf050fc7ad99fa72588cec951716 Mon Sep 17 00:00:00 2001 From: Aurielle Date: Wed, 27 Jul 2011 10:29:37 +0200 Subject: [PATCH 0094/1741] cs/caching: typo --- cs/caching.texy | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cs/caching.texy b/cs/caching.texy index 6b96d9f379..24a333153e 100644 --- a/cs/caching.texy +++ b/cs/caching.texy @@ -188,7 +188,7 @@ Velmi užitečným invalidačním nástrojem jsou tzv. tagy. Každé položce v /--php $cache->save($articleId, $html, array( - Cache::TAGS = array("article/$articleId", "comments/$articleId"), + Cache::TAGS => array("article/$articleId", "comments/$articleId"), )); \-- @@ -196,7 +196,7 @@ Přesuňme se do administrace. Tady najdeme formulář pro editaci článku. Spo /--php $cache->clean(array( - Cache::TAGS = array("article/$articleId"), + Cache::TAGS => array("article/$articleId"), )); \-- @@ -204,7 +204,7 @@ Stejně tak v místě přidání nového komentáře (nebo editace komentáře) /--php $cache->clean(array( - Cache::TAGS = array("comments/$articleId"), + Cache::TAGS => array("comments/$articleId"), )); \-- From 54b27c3ebfeb46be67dcf30e6b6612fa941121cc Mon Sep 17 00:00:00 2001 From: vrana Date: Fri, 29 Jul 2011 12:14:24 +0200 Subject: [PATCH 0095/1741] cs/forms: $cols v addText() a addPassword() --- cs/forms.texy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cs/forms.texy b/cs/forms.texy index a68aea42d2..cbed51b424 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -156,7 +156,7 @@ Formulářové prvky Přehled standardních formulářových prvků. -addText($name, $label = NULL, $maxLength = NULL) .{toc: addText()} +addText($name, $label = NULL, $cols = NULL, $maxLength = NULL) .{toc: addText()} ------------------------------------------------------------------ Přidá jednořádkové textové políčko (třída [TextInput |api:Nette\Forms\Controls\TextInput]). Automaticky ořezává levo- a pravostranné mezery nebo případné odřádkování. Kromě [standardních validačních pravidel | #Validační pravidla] lze použít navíc i tato: @@ -177,7 +177,7 @@ $form->addText('zip', 'PSČ:') \-- -addPassword($name, $label = NULL, $maxLength = NULL) .{toc: addPassword()} +addPassword($name, $label = NULL, $cols = NULL, $maxLength = NULL) .{toc: addPassword()} -------------------------------------------------------------------------- Přidá políčko pro zadání hesla (třída [TextInput |api:Nette\Forms\Controls\TextInput]). Automaticky ořezává levo- a pravostranné mezery nebo případné odřádkování. Při znovu-zobrazení formuláře bude políčko prázdné. Lze použít stejná validační pravidla jako pro [addText |#addText()]. From 81b552a7a81d7f05dc9411e850c5b5d22724992f Mon Sep 17 00:00:00 2001 From: Jan Endel Date: Sat, 30 Jul 2011 00:47:35 +0200 Subject: [PATCH 0096/1741] cs/routing: detault -> detail --- cs/routing.texy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cs/routing.texy b/cs/routing.texy index 13449a5a1a..7c89bd7743 100644 --- a/cs/routing.texy +++ b/cs/routing.texy @@ -225,9 +225,9 @@ Jednosměrné routy se používají zejména pro zachování funkčnosti starýc /--php // staré URL /product-info?id=123 -$router[] = new Route('product-info', 'Product:detault', Route::ONE_WAY); +$router[] = new Route('product-info', 'Product:detail', Route::ONE_WAY); // nové URL /product/123 -$router[] = new Route('produkt/', 'Product:detault'); +$router[] = new Route('produkt/', 'Product:detail'); \-- Navíc dojde k automatickému přesměrování na nový tvar URL, takže vám tyto stránky vyhledávače nezaindexují dvakrát (viz [#SEO a kanonizace]). From c298335d3ea581dbdfb05a45aa1bd8487369ef23 Mon Sep 17 00:00:00 2001 From: MartyIX Date: Sun, 31 Jul 2011 10:48:35 +0200 Subject: [PATCH 0097/1741] cs/default-helpers: typo --- cs/default-helpers.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/default-helpers.texy b/cs/default-helpers.texy index 7c4997b163..48d7b43377 100644 --- a/cs/default-helpers.texy +++ b/cs/default-helpers.texy @@ -88,7 +88,7 @@ Webalize Upraví řetězec do tvaru používaného v URL, tj. odstraní diakritiku a všechny znaky kromě písmen anglické abecedy a číslic nahradí spojovníkem. /--php -{var $name = 'náš produk'} +{var $name = 'náš produkt'} {$name|webalize} nas-produkt \-- From 8b0b7c568c731a2d4defc5161ba1060d26298d45 Mon Sep 17 00:00:00 2001 From: MartyIX Date: Sat, 6 Aug 2011 13:15:47 +0200 Subject: [PATCH 0098/1741] cs/presenters: Opraven nefungujici odkaz --- cs/presenters.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/presenters.texy b/cs/presenters.texy index 991290a00f..32a78a41e5 100644 --- a/cs/presenters.texy +++ b/cs/presenters.texy @@ -325,7 +325,7 @@ Makro `n:href` je velmi šikovné, pokud vytváříme HTML značku `
`. Pokud Adresa je: {link Product:show $productId} \-- -Přečtěte si další podrobnosti o syntaxi [Latte šablon |#templating#latte]. +Přečtěte si další podrobnosti o syntaxi [Latte šablon |default-macros]. Odkazování v presenteru From 5887413383fa66de09c811c363d9d222da9d5586 Mon Sep 17 00:00:00 2001 From: srigi Date: Mon, 8 Aug 2011 19:41:47 +0200 Subject: [PATCH 0099/1741] en/tutorials: created --- en/tutorials.texy | 13 +++++++++++++ en/tutorials/quickstart.texy | 21 +++++++++++++++++++++ files/next-48x48.png | Bin 0 -> 1258 bytes 3 files changed, 34 insertions(+) create mode 100644 en/tutorials.texy create mode 100644 en/tutorials/quickstart.texy create mode 100644 files/next-48x48.png diff --git a/en/tutorials.texy b/en/tutorials.texy new file mode 100644 index 0000000000..fe8debf4b5 --- /dev/null +++ b/en/tutorials.texy @@ -0,0 +1,13 @@ +Tutorials +********* + +.[perex] +[* next-48x48.png .[icon] <] +Tutorial for Nette Framework. In step-by-step guides you discover how to use Nette's building blocks (databse, templates, routing) to create complex webapplications. Every tutorial specifies difficulty level and knowledge requirements. + +[Quick Start | doc:tutorials/quickstart] +-------------------------------- +First webapplication in Nette framework. + +* Difficulty: *beginner* +* Knowledge requirements: *PHP 5 OOP* diff --git a/en/tutorials/quickstart.texy b/en/tutorials/quickstart.texy new file mode 100644 index 0000000000..80c2a5b15e --- /dev/null +++ b/en/tutorials/quickstart.texy @@ -0,0 +1,21 @@ +Quickstart +********** + +.[perex] +Welcome to your first Nette framework tutorial. In this step-by-step guide you buils your first web application using various components of Nette Framework. + + +Nette Framework is an open source, object oriented web application framework for PHP 5. Nette Framework uses MVP (Model View Presenter) pattern to create web applications. In this tutorial you learn how to build simple database-driven book evidence system. + +Model View Presenter +===================== + +Have you even heared about MVP (or MVC)? What it is and why you should care? MVP pattern used in Nette framework allows you to divide your web applications to three separate layers, where these have this responsibilities: + +- **M**: Model, this is the place where your application logic is laing. This layer is responsible for retrieving and storing application data to storage backend. + +- **V**: View define what is presented to the user of your application. Data from Model are transformed into best format user requires on end-device. View often collect data from the user, as well. + +- **P**: Presenter bind the whole pattern together. It manipulate Models, decide which View to display based on the user's request and process user input. + +Continue with: [ Create your project | doc:tutorials/quickstart/create project ] diff --git a/files/next-48x48.png b/files/next-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..560544970a420e150920b962df190f2f5e369d23 GIT binary patch literal 1258 zcmVCuKk_yPdJ9czm1p+PpZ^rOWdI{M4Q4T13K60)$JBxdRcTf3j7 z%h-&gGebu%K6Li*#T}vhY1=md!Qtx6S*DYJ(7)j+x>_PQV(${si7$TMzHA6z035N< zT9eThf8RRCf61$C>Ux|`BZ8JpREtg=`f2O3AbfHl4G73${&V{hv&p{*ckHCM?LkB` zQ4yUuIMH7>gij8n5d?vJPR;+ut%YlJwrrxeeFuUQ6(n(BVsl*(z5r-#BWPHHAl$t7 zJ7($zZB0G&v~EMtQ4vY(zYwVz!Y2o8RGF@3lYer@`j^(G4Rp6`L6E3GV&8>uw3fD2 zZtAdqA~FCB1B1XoBZTLo(+IP%V<*>ceP4P9fp(*pP9w}h#$?`_0x*Ht$IsoItkiZ> zz6~MK6fg$bnnUDgL&b%no{P5>uL&vxEg33Jv+kv5akNc`(MLyfA9vH!At15$d^on} z`SK8X2lkzh$d=I47{QLRc2^Txeou`ShwF3atL|$wb9DE+9qk4h=?f=`!rSzkw4Xs0zW0SIyfTr0nP-@YM zk?{h=(o1O7RTrn$8q2b>5J8k8Btl~N+eL`{ARZYHOCVU`T3_W*O3`ct5E0TTjdn1B zZTaVbb{1Vw3dp7+TlPD$20&qn2#)Pwv@29VAsGn)(ZYjFQ~u7bTpTJ3>E2uir1xPa zxlx;2lohcUse6LT>IEhX4(KXJu9Ya(KS{$0}};GPSuAAqp~FHgsF zmGuTNcJP&gcyIx%^&y~O^w6t|myJ8tiv#h`Uz;8)wPDTQg%rdOzdkcoZoAuoIKmlU zRMi@a_>nitiwDf*sCfVyrFium!N z+Qh@!a==uImrlGr^Fuvt`{Y2?Az-42efiF8#ZM@uVl6meDu|tYw|?=k`eVQZVyAX5 zPdu!y1Ezx5SMM!fJox2+Q?$xN5&Qc6`x6hoIk039Pbx+1^apchBigR{>$ED4fG2}x zvPpFImDS;jdDD5}^oMivKrq|CH`*;@SWltbL_tlBi z$;t5r4RlfXhE@E-L2*)|3?N=%UcsfrdCypo!r2UZGIvZ)s0JKYYERjn;whH`Dop0e zI8Y7B3s=p4uK=&ON@9z|i-^=T8+F0uSJhefLeyNBDgu3(POoJ6^jCwGi**n1KSmxC Ux>+$@K>z>%07*qoM6N<$f}qe--2eap literal 0 HcmV?d00001 From ed80d6785b2e6fdcec8f9ff86b8f5256b9b1202d Mon Sep 17 00:00:00 2001 From: MartyIX Date: Mon, 8 Aug 2011 20:44:12 +0200 Subject: [PATCH 0100/1741] en/tutorials/quickstart: A few fixes --- en/tutorials/quickstart.texy | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/en/tutorials/quickstart.texy b/en/tutorials/quickstart.texy index 80c2a5b15e..c4d9fa3ef8 100644 --- a/en/tutorials/quickstart.texy +++ b/en/tutorials/quickstart.texy @@ -2,7 +2,7 @@ Quickstart ********** .[perex] -Welcome to your first Nette framework tutorial. In this step-by-step guide you buils your first web application using various components of Nette Framework. +Welcome to your first Nette Framework tutorial. In this step-by-step guide you builds your first web application using various components of Nette Framework. Nette Framework is an open source, object oriented web application framework for PHP 5. Nette Framework uses MVP (Model View Presenter) pattern to create web applications. In this tutorial you learn how to build simple database-driven book evidence system. @@ -10,12 +10,12 @@ Nette Framework is an open source, object oriented web application framewor Model View Presenter ===================== -Have you even heared about MVP (or MVC)? What it is and why you should care? MVP pattern used in Nette framework allows you to divide your web applications to three separate layers, where these have this responsibilities: +Have you ever heard about MVP (or MVC)? What is it and why you should care? MVP pattern used in Nette Framework allows you to divide your web applications to three separate layers, where these have this responsibilities: -- **M**: Model, this is the place where your application logic is laing. This layer is responsible for retrieving and storing application data to storage backend. +- **M**: Model, this is the place where your application logic is lying. This layer is responsible for retrieving and storing application data to a storage backend. -- **V**: View define what is presented to the user of your application. Data from Model are transformed into best format user requires on end-device. View often collect data from the user, as well. +- **V**: View defines what is presented to the user of your application. Data from Model are transformed into best format user requires on end-device. View often collect data from the user, as well. -- **P**: Presenter bind the whole pattern together. It manipulate Models, decide which View to display based on the user's request and process user input. +- **P**: Presenter binds the whole pattern together. It manipulates Models, decides which View to display based on the user's request and processes user input. Continue with: [ Create your project | doc:tutorials/quickstart/create project ] From 29c3d76bb1336c9d54d8f9cf4b4b5b089d51f103 Mon Sep 17 00:00:00 2001 From: srigi Date: Mon, 8 Aug 2011 23:03:45 +0200 Subject: [PATCH 0101/1741] en/doc/tutorials/quickstart/resources: created --- en/doc/tutorials/quickstart/resources.texy | 132 ++++++++++++++++++++ en/tutorials/quickstart/create-project.texy | 52 ++++++++ en/tutorials/quickstart/resources.texy | 132 ++++++++++++++++++++ files/scrsht01-s.png | Bin 0 -> 102990 bytes files/scrsht01.png | Bin 0 -> 129209 bytes files/scrsht02-s.png | Bin 0 -> 43405 bytes files/scrsht02.png | Bin 0 -> 102973 bytes files/scrsht03-s.png | Bin 0 -> 59619 bytes files/scrsht03.png | Bin 0 -> 129536 bytes files/scrsht04.png | Bin 0 -> 35371 bytes 10 files changed, 316 insertions(+) create mode 100644 en/doc/tutorials/quickstart/resources.texy create mode 100644 en/tutorials/quickstart/create-project.texy create mode 100644 en/tutorials/quickstart/resources.texy create mode 100644 files/scrsht01-s.png create mode 100644 files/scrsht01.png create mode 100644 files/scrsht02-s.png create mode 100644 files/scrsht02.png create mode 100644 files/scrsht03-s.png create mode 100644 files/scrsht03.png create mode 100644 files/scrsht04.png diff --git a/en/doc/tutorials/quickstart/resources.texy b/en/doc/tutorials/quickstart/resources.texy new file mode 100644 index 0000000000..546f001502 --- /dev/null +++ b/en/doc/tutorials/quickstart/resources.texy @@ -0,0 +1,132 @@ +Quickstart - Resources +********************** + +Here you can find resources for tutorial [Quickstart|:doc/tutorials/quickstart] + +CSS +=== + + +SQL +=== + +/-- +-- Adminer 3.3.1 MySQL dump + +SET NAMES utf8; +SET foreign_key_checks = 0; +SET time_zone = 'SYSTEM'; +SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; + +DROP DATABASE IF EXISTS `nette_quickstart`; +CREATE DATABASE `nette_quickstart` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */; +USE `nette_quickstart`; + +DROP TABLE IF EXISTS `author`; +CREATE TABLE `author` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(200) COLLATE utf8_bin NOT NULL, + `web` varchar(200) COLLATE utf8_bin NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +INSERT INTO `author` (`id`, `name`, `web`) VALUES +(1, 'S. J. Watson', 'http://www.amazon.com/S.-J.-Watson/e/B004AOGB8W/ref=ntt_athr_dp_pel_1'), +(2, 'Gabrielle Hamilton', 'http://www.amazon.com/Gabrielle-Hamilton/e/B004N6V45M/ref=sr_ntt_srch_lnk_1?qid=1312830432&sr=8-1'), +(3, 'Mitchell Zuckoff', 'http://www.amazon.com/Mitchell-Zuckoff/e/B001H6TW6O/ref=ntt_athr_dp_pel_1'), +(4, 'Andrew Bolton', 'http://www.amazon.com/Andrew-Bolton/e/B001ILKEOC/ref=ntt_athr_dp_pel_1'), +(5, 'Daniel Silva', 'http://www.amazon.com/Daniel-Silva/e/B000APEDWG/ref=ntt_athr_dp_pel_1'), +(6, 'James Patterson', 'http://www.amazon.com/James-Patterson/e/B000APZGGS/ref=ntt_athr_dp_pel_pop_1'), +(7, 'Ransom Riggs', 'http://www.amazon.com/Ransom-Riggs/e/B001JS089K/ref=ntt_athr_dp_pel_1'); + +DROP TABLE IF EXISTS `book`; +CREATE TABLE `book` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `author_id` int(11) NOT NULL, + `title` varchar(200) COLLATE utf8_bin NOT NULL, + `web` varchar(200) COLLATE utf8_bin NOT NULL, + `slogan` varchar(200) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `author_id` (`author_id`), + CONSTRAINT `book_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +INSERT INTO `book` (`id`, `author_id`, `title`, `web`, `slogan`) VALUES +(2, 7, 'Mental Floss', 'http://www.amazon.com/Mental-Floss-Scatterbrained-Ransom-Riggs/dp/B001KBZ6KC/ref=ntt_at_ep_dpt_3', 'Scatterbrained'), +(3, 7, 'The Sherlock Holmes Handbook', 'http://www.amazon.com/Sherlock-Holmes-Handbook-Ransom-Riggs/dp/1594744297/ref=ntt_at_ep_dpt_2', NULL), +(4, 7, 'Miss Peregrine\'s Home for Peculiar Children', 'http://www.amazon.com/Miss-Peregrines-Home-Peculiar-Children/dp/1594744769/ref=ntt_at_ep_dpt_1', NULL), +(5, 4, 'Wild: Fashion Untamed', 'http://www.amazon.com/Wild-Fashion-Untamed-Metropolitan-Museum/dp/0300106386/ref=ntt_at_ep_dpt_4', 'Metropolitan Museum of Art Series'), +(6, 4, 'Alexander McQueen: Savage Beauty', 'http://www.amazon.com/Alexander-McQueen-Savage-Beauty-Metropolitan/dp/0300169787/ref=ntt_at_ep_dpt_1', 'Metropolitan Museum of Art'), +(7, 1, 'Before I Go to Sleep', 'http://www.amazon.com/Before-I-Go-Sleep-Novel/dp/0062060554/ref=ntt_at_ep_dpt_1', 'A Novel'), +(8, 1, 'Avant d\'aller dormir', 'http://www.amazon.com/Avant-daller-dormir-S-Watson/dp/2355840652/ref=ntt_at_ep_dpt_2', NULL), +(9, 2, 'Blood, Bones & Butter', 'http://www.amazon.com/Blood-Bones-Butter-Inadvertent-Education/dp/140006872X/ref=sr_1_1?s=books&ie=UTF8&qid=1312830470&sr=1-1', 'The Inadvertent Education of a Reluctant Chef'), +(10, 3, 'Robert Altman', 'http://www.amazon.com/Robert-Altman-Biography-Mitchell-Zuckoff/dp/0307387917/ref=ntt_at_ep_dpt_4', 'The Oral Biography'), +(11, 3, 'Ponzi\'s Scheme', 'http://www.amazon.com/Ponzis-Scheme-Story-Financial-Legend/dp/0812968360/ref=ntt_at_ep_dpt_3', 'The True Story of a Financial Legend'), +(12, 3, 'Judgment Ridge', 'http://www.amazon.com/Judgment-Ridge-Behind-Dartmouth-Murders/dp/B000BBXAPA/ref=ntt_at_ep_dpt_2', 'The True Story Behind the Dartmouth Murders'), +(13, 3, 'Lost in Shangri-La', 'http://www.amazon.com/Lost-Shangri-Survival-Adventure-Incredible/dp/0061988340/ref=ntt_at_ep_dpt_1', 'A True Story of Survival, Adventure, and the Most Incredible Rescue Mission of World War II'), +(14, 5, 'Portrait of a Spy', 'http://www.amazon.com/Portrait-Spy-Daniel-Silva/dp/0062072188/ref=ntt_at_ep_dpt_1', NULL), +(15, 5, 'The Rembrandt Affair', 'http://www.amazon.com/Rembrandt-Affair-Gabriel-Allon/dp/0451233999/ref=ntt_at_ep_dpt_2', NULL), +(16, 5, 'The Kill Artist', 'http://www.amazon.com/Kill-Artist-Publish-Signet/dp/0451209338/ref=ntt_at_ep_dpt_3', NULL), +(17, 5, 'The Secret Servant', 'http://www.amazon.com/Secret-Servant-Gabriel-Allon/dp/0451224507/ref=ntt_at_ep_dpt_9', NULL), +(18, 5, 'A Death in Vienna', 'http://www.amazon.com/Death-Vienna-Gabriel-Allon-Bk/dp/0451213181/ref=ntt_at_ep_dpt_7', NULL), +(19, 5, 'The Confessor', 'http://www.amazon.com/Confessor-Gabriel-Allon-Novels/dp/0451211480/ref=ntt_at_ep_dpt_5', NULL), +(20, 5, 'The English Assassin', 'http://www.amazon.com/English-Assassin-Daniel-Silva/dp/0451208188/ref=ntt_at_ep_dpt_4', NULL); + +DROP TABLE IF EXISTS `book_tag`; +CREATE TABLE `book_tag` ( + `book_id` int(11) NOT NULL, + `tag_id` int(11) NOT NULL, + PRIMARY KEY (`book_id`,`tag_id`), + KEY `tag_id` (`tag_id`), + KEY `book_id` (`book_id`), + CONSTRAINT `book_tag_ibfk_1` FOREIGN KEY (`book_id`) REFERENCES `book` (`id`) ON DELETE CASCADE, + CONSTRAINT `book_tag_ibfk_2` FOREIGN KEY (`tag_id`) REFERENCES `tag` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +INSERT INTO `book_tag` (`book_id`, `tag_id`) VALUES +(2, 1), +(4, 2), +(3, 3), +(4, 3), +(15, 3), +(16, 3), +(17, 3), +(18, 3), +(19, 3), +(5, 4), +(6, 4), +(7, 5), +(14, 5), +(15, 5), +(16, 5), +(17, 5), +(18, 5), +(19, 5), +(20, 5), +(9, 6), +(10, 7), +(11, 7), +(12, 8), +(12, 9), +(13, 9); + +DROP TABLE IF EXISTS `tag`; +CREATE TABLE `tag` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) COLLATE utf8_bin NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +INSERT INTO `tag` (`id`, `name`) VALUES +(1, 'curiosities'), +(2, 'sci-fi'), +(3, 'mystery'), +(4, 'fashion'), +(5, 'thriller'), +(6, 'gastronomy'), +(7, 'biography'), +(8, 'crime'), +(9, 'history'); + +-- 2011-08-08 21:36:16 +\-- diff --git a/en/tutorials/quickstart/create-project.texy b/en/tutorials/quickstart/create-project.texy new file mode 100644 index 0000000000..c195dead98 --- /dev/null +++ b/en/tutorials/quickstart/create-project.texy @@ -0,0 +1,52 @@ +Create your project +******************* + +Installing Nette Framework +========================== + +Nette Framework comes packed as `.zip` archive. Best way to start new project is use included `sandbox` as a starting point. Go ahead and __download Nette Framework archive__. + +.[note] +This tutorial is using PHP 5.3. It is the best choice to build web applications in Nette Framework. + +Extract downloaded archive and move `sandbox` folder to *document_root* of your web server. Rename `sandbox` folder to `quickstart`. You can now run project in browser, just open "http://localhost/quickstart/www":http://localhost/quickstart/www. + +[* scrsht01-s.png *]:[* scrsht01.png *] .<> + +directory structure +------------------- + +If you inspect `quickstart` in filemanager, you can see something like this: + +[* scrsht04.png *] .<> + +Let's learn about important files and folders and its purpose. +- **`app`**, Application folder, this is where all your code is stored + - **`app/models`**, Models folder, your Models source files are here + - **`app/presenters`**, Presenters folder, your Presenters source files are here + - **`app/views`**, View templates folder, this is place where are View templates stored (HTML code) + - **`app/bootstrap.php`**, Bootstrap file, this file starts web application + - **`app/config.neon`**, Config file, this is where all configuration is stored +- **`libs`**, Library folder, here is sources of Nette Framework and other 3rd party libraries +- **`logs`**, Log folder, here are stored Debugger logs and uncatched errors in production mode +- **`temp`**, Temporary folder, place for compiled View templates, caches or PHP sessions +- **`tests`**, Tests folder, here you can put your unit tests +- **`www`**, Public WWW folder, webserver serve application pages from here + - **`www/adminer`**, database managmet tool + - **`www/css`**, CSS folder, place for your stylesheets + - **`www/images`**, place for your public images + - **`www/js`**, place for your client scripts + - **`www/index.php`**, input point to web application, all requests go through this file + - **`www/.htaccess`**, directory-level configuration file for webserver. `mod_rewrite` is configured here for example + +sample database +--------------- + +Our book evidence system need some storage system for application data. In this tutorial we will use MySQL database server. Nette Framework come with nice database managment tool called "Adminer":http://www.adminer.org. To start Adminer just enter "http://localhost/sandbox/www/adminer":http://localhost/sandbox/www/adminer to your addressbar of your browser. Connect to your server using filling access credentials. If your database server is on local machine you can leave `hostname` blank. + +We setup new database, tables and sample data by single SQL script. Go to [ tutorial resources | doc:/tutorials/quickstart/resources] and copy whole SQL code. In Adminer click **`SQL command`** (upper left) paste SQL code to textarea and hit **EXECUTE**. Your database is ready :) + +[* scrsht02-s.png *]:[* scrsht02.png *] .< +[* scrsht03-s.png *]:[* scrsht03.png *] + +Installation is finished, continue with blablabla diff --git a/en/tutorials/quickstart/resources.texy b/en/tutorials/quickstart/resources.texy new file mode 100644 index 0000000000..546f001502 --- /dev/null +++ b/en/tutorials/quickstart/resources.texy @@ -0,0 +1,132 @@ +Quickstart - Resources +********************** + +Here you can find resources for tutorial [Quickstart|:doc/tutorials/quickstart] + +CSS +=== + + +SQL +=== + +/-- +-- Adminer 3.3.1 MySQL dump + +SET NAMES utf8; +SET foreign_key_checks = 0; +SET time_zone = 'SYSTEM'; +SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; + +DROP DATABASE IF EXISTS `nette_quickstart`; +CREATE DATABASE `nette_quickstart` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */; +USE `nette_quickstart`; + +DROP TABLE IF EXISTS `author`; +CREATE TABLE `author` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(200) COLLATE utf8_bin NOT NULL, + `web` varchar(200) COLLATE utf8_bin NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +INSERT INTO `author` (`id`, `name`, `web`) VALUES +(1, 'S. J. Watson', 'http://www.amazon.com/S.-J.-Watson/e/B004AOGB8W/ref=ntt_athr_dp_pel_1'), +(2, 'Gabrielle Hamilton', 'http://www.amazon.com/Gabrielle-Hamilton/e/B004N6V45M/ref=sr_ntt_srch_lnk_1?qid=1312830432&sr=8-1'), +(3, 'Mitchell Zuckoff', 'http://www.amazon.com/Mitchell-Zuckoff/e/B001H6TW6O/ref=ntt_athr_dp_pel_1'), +(4, 'Andrew Bolton', 'http://www.amazon.com/Andrew-Bolton/e/B001ILKEOC/ref=ntt_athr_dp_pel_1'), +(5, 'Daniel Silva', 'http://www.amazon.com/Daniel-Silva/e/B000APEDWG/ref=ntt_athr_dp_pel_1'), +(6, 'James Patterson', 'http://www.amazon.com/James-Patterson/e/B000APZGGS/ref=ntt_athr_dp_pel_pop_1'), +(7, 'Ransom Riggs', 'http://www.amazon.com/Ransom-Riggs/e/B001JS089K/ref=ntt_athr_dp_pel_1'); + +DROP TABLE IF EXISTS `book`; +CREATE TABLE `book` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `author_id` int(11) NOT NULL, + `title` varchar(200) COLLATE utf8_bin NOT NULL, + `web` varchar(200) COLLATE utf8_bin NOT NULL, + `slogan` varchar(200) COLLATE utf8_bin DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `author_id` (`author_id`), + CONSTRAINT `book_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +INSERT INTO `book` (`id`, `author_id`, `title`, `web`, `slogan`) VALUES +(2, 7, 'Mental Floss', 'http://www.amazon.com/Mental-Floss-Scatterbrained-Ransom-Riggs/dp/B001KBZ6KC/ref=ntt_at_ep_dpt_3', 'Scatterbrained'), +(3, 7, 'The Sherlock Holmes Handbook', 'http://www.amazon.com/Sherlock-Holmes-Handbook-Ransom-Riggs/dp/1594744297/ref=ntt_at_ep_dpt_2', NULL), +(4, 7, 'Miss Peregrine\'s Home for Peculiar Children', 'http://www.amazon.com/Miss-Peregrines-Home-Peculiar-Children/dp/1594744769/ref=ntt_at_ep_dpt_1', NULL), +(5, 4, 'Wild: Fashion Untamed', 'http://www.amazon.com/Wild-Fashion-Untamed-Metropolitan-Museum/dp/0300106386/ref=ntt_at_ep_dpt_4', 'Metropolitan Museum of Art Series'), +(6, 4, 'Alexander McQueen: Savage Beauty', 'http://www.amazon.com/Alexander-McQueen-Savage-Beauty-Metropolitan/dp/0300169787/ref=ntt_at_ep_dpt_1', 'Metropolitan Museum of Art'), +(7, 1, 'Before I Go to Sleep', 'http://www.amazon.com/Before-I-Go-Sleep-Novel/dp/0062060554/ref=ntt_at_ep_dpt_1', 'A Novel'), +(8, 1, 'Avant d\'aller dormir', 'http://www.amazon.com/Avant-daller-dormir-S-Watson/dp/2355840652/ref=ntt_at_ep_dpt_2', NULL), +(9, 2, 'Blood, Bones & Butter', 'http://www.amazon.com/Blood-Bones-Butter-Inadvertent-Education/dp/140006872X/ref=sr_1_1?s=books&ie=UTF8&qid=1312830470&sr=1-1', 'The Inadvertent Education of a Reluctant Chef'), +(10, 3, 'Robert Altman', 'http://www.amazon.com/Robert-Altman-Biography-Mitchell-Zuckoff/dp/0307387917/ref=ntt_at_ep_dpt_4', 'The Oral Biography'), +(11, 3, 'Ponzi\'s Scheme', 'http://www.amazon.com/Ponzis-Scheme-Story-Financial-Legend/dp/0812968360/ref=ntt_at_ep_dpt_3', 'The True Story of a Financial Legend'), +(12, 3, 'Judgment Ridge', 'http://www.amazon.com/Judgment-Ridge-Behind-Dartmouth-Murders/dp/B000BBXAPA/ref=ntt_at_ep_dpt_2', 'The True Story Behind the Dartmouth Murders'), +(13, 3, 'Lost in Shangri-La', 'http://www.amazon.com/Lost-Shangri-Survival-Adventure-Incredible/dp/0061988340/ref=ntt_at_ep_dpt_1', 'A True Story of Survival, Adventure, and the Most Incredible Rescue Mission of World War II'), +(14, 5, 'Portrait of a Spy', 'http://www.amazon.com/Portrait-Spy-Daniel-Silva/dp/0062072188/ref=ntt_at_ep_dpt_1', NULL), +(15, 5, 'The Rembrandt Affair', 'http://www.amazon.com/Rembrandt-Affair-Gabriel-Allon/dp/0451233999/ref=ntt_at_ep_dpt_2', NULL), +(16, 5, 'The Kill Artist', 'http://www.amazon.com/Kill-Artist-Publish-Signet/dp/0451209338/ref=ntt_at_ep_dpt_3', NULL), +(17, 5, 'The Secret Servant', 'http://www.amazon.com/Secret-Servant-Gabriel-Allon/dp/0451224507/ref=ntt_at_ep_dpt_9', NULL), +(18, 5, 'A Death in Vienna', 'http://www.amazon.com/Death-Vienna-Gabriel-Allon-Bk/dp/0451213181/ref=ntt_at_ep_dpt_7', NULL), +(19, 5, 'The Confessor', 'http://www.amazon.com/Confessor-Gabriel-Allon-Novels/dp/0451211480/ref=ntt_at_ep_dpt_5', NULL), +(20, 5, 'The English Assassin', 'http://www.amazon.com/English-Assassin-Daniel-Silva/dp/0451208188/ref=ntt_at_ep_dpt_4', NULL); + +DROP TABLE IF EXISTS `book_tag`; +CREATE TABLE `book_tag` ( + `book_id` int(11) NOT NULL, + `tag_id` int(11) NOT NULL, + PRIMARY KEY (`book_id`,`tag_id`), + KEY `tag_id` (`tag_id`), + KEY `book_id` (`book_id`), + CONSTRAINT `book_tag_ibfk_1` FOREIGN KEY (`book_id`) REFERENCES `book` (`id`) ON DELETE CASCADE, + CONSTRAINT `book_tag_ibfk_2` FOREIGN KEY (`tag_id`) REFERENCES `tag` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +INSERT INTO `book_tag` (`book_id`, `tag_id`) VALUES +(2, 1), +(4, 2), +(3, 3), +(4, 3), +(15, 3), +(16, 3), +(17, 3), +(18, 3), +(19, 3), +(5, 4), +(6, 4), +(7, 5), +(14, 5), +(15, 5), +(16, 5), +(17, 5), +(18, 5), +(19, 5), +(20, 5), +(9, 6), +(10, 7), +(11, 7), +(12, 8), +(12, 9), +(13, 9); + +DROP TABLE IF EXISTS `tag`; +CREATE TABLE `tag` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(100) COLLATE utf8_bin NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; + +INSERT INTO `tag` (`id`, `name`) VALUES +(1, 'curiosities'), +(2, 'sci-fi'), +(3, 'mystery'), +(4, 'fashion'), +(5, 'thriller'), +(6, 'gastronomy'), +(7, 'biography'), +(8, 'crime'), +(9, 'history'); + +-- 2011-08-08 21:36:16 +\-- diff --git a/files/scrsht01-s.png b/files/scrsht01-s.png new file mode 100644 index 0000000000000000000000000000000000000000..b083a0e74e2b5454db2a6601710cd201a869cf55 GIT binary patch literal 102990 zcmW(*1yCGaw_Ggv2LXaR1b6o(XdpPj-Q9va1b2tv0RjYfcXxLdSbTAUJNx#3Q#CbJ zBe!PeoZF|n&y7-1lEp+LMgsr@5HQuk|V&D-}FwdY9-zigCEW zKF@v*_t$B;A9!IVUnM<8QE;SD1N%Zz2){B#GyIMG%YecVO&uL+4EXd(dMN1UpEqN# z%k$-c)$*=4cCtL@`^xAO1JpDMC_0q_{g|#rrxVM^RKT6)}g4B@E;?^0fIs_ zoPGUMQ$+78&thmOfL;U*9|;MJS8%j24@(kUP%E7HS8Hk-e1ITwkc|~>Z8Bh%5Rj;( zDE}2+d;%_L{Q3q9AWi}ZBECZR1ORyV3CIxvOcN6WXnCy2&s6id)SfJ%U1b`sb*gOIN5f1x{WpW4sKm`svZq(fO61*xzGe1E97zIQc z>5uwo0k+}9C5WOl;d=ZMQ;)pp6Tn&XvmACLfNgkjCR}w9==L5_lIAJ&QEHBC6A**| zIR4!L2$(rh{`%wQ`CO2kpkeEYKM&n%&F8hB&`-NC4pM_bI7geFF;Zg~t1GauytBd* zYatPved82|%)B;00x$<~6qvYd1^Re~&R69E#PI;?NYlnh%i;*kkr9NE$oL#oc)QT+ z*uXteDg-fc($Fu|vjL1he|c8|3GIXbV~GsnPxsgxuJ2bAtESgRNQ(1^XX=LC%Q{l6s%chzr;h`iF6!Qt0M{lBA6 zet-CjWE)Og)c$v;XVYpu&|EFd`8NW(8YKn}6|o@#x+z?8|9mn4P`QgcuQM4rN}DAu zA))XKZHg+sphRL}es&QN2nDRy$i7q{Qv!niVZFte#ls&p!Bd(+cd0u8LPmhZ9O%#( zAA<8B+y*UYvJPX903HB}jL1-J<1b9+ z5^Q)9sHp>De}4|BV2$kHHTEI3Vr$ec$bfq#%vf$I@d{7>8=#=ThQ{{(>gh-{y2T)x2Dtoyg{#k ziywI=g<6O|mrf`iOLO>YDCZ zrdV;C+?d9gPFPf!+nJo2`S#zZ<>nehZzgW$=8okJ7>)&mztO$my-;UHR7y2dBPXYf z36G78u8by(88PBTlMdzJh|3k8{ozrqR?kz#7w{5X6d)Cl5Udw07hD&-aP`}#bs7Jm z>+HBYxm~#}G9fr9I3c~8yjQ7<$D*JZxfq!kMK@2k zZ8x)D%ByyOU;y$v;XBtm-@EF2KD;SBKD-IMG(0Q(15yA=G)fkFI4VAR9=;#Lqk1Hr zISn3bIdLeKfpcyCOn0L{&#E88nQlz`3;c<3ZQOs7hY`mYsr^)|jD? zUYXX(+(!GE{eU%%-d*>kj3>J>*sb-}@R#RtI72>)KmAzj@&3 z*u>MgLq-SXgQlU%))z6!_dl<=NYOtt`z^zS!ahoO76zL(?tU5al_&gcQ2e#nwwTHy zwmy$b{pt60Et=Ah%4elwrGq3Uoh1og>AOECsl+{54Z3;jNKFYRTqkfR9g9wXYiy5f z2d#Om6|AqVg=`OPJZuBz)aFgCHSFT7)f*j}8k&R~fu{_op~s~2L<fprVe# z(wdQZySePSj5)03nz=x8ab9O`2HsYiNbW|SNxn||R_i}jspgB8w`1B%0_%^VS0MN6 z)Ba`NN?#jl3km)*-b|k2%n#Y*oVh$HJVn_{nOz(id|13d+xKCKIqLDkwcVoP@Xr(1 zod;OVG!-lrcFWp!!l$OE9eg5uTYMUPGxo*yH1^8t(`(1;4s{)t2@Rh0U<>Hzm&xFr z*?kVk-^*VItEW;P*KXxMe0D1LCx2YH^|cDLpSgI~8+!O}Jfl}{pKP~}+?8c_f-GCU zU3hu&KiEF3kY|x+lJkpri-w3Odj&ky-!k1~{nPxXbboQRbBlUwbN#eqcisW=oLAmt zpSW!9sRb_d&;(&`<2v&g2ZT(8`;(L)xFet=$nuXnDS!lO<-F7hF2WI90@Pu6%Y8e1Ft+=_1tZ~2LuiQ@ET zSz}p6Gm|shGSzkPb(-{&s;KmQ>x&!E>q}kFe#ArS4`d))V+*68+y_=Le@}yWC1vUM z0bhp$J-Q&8PFO-Si4(9BVY6?;rR8hKk@%dgi}h6%PF!+y@`0MnaaAA>wCvT&!Rm3k z!@|cRV*KjB<)Elz(t`{<)g^59Fd@q3yZ$hLkAL~r%x(=94^tZ2d9!~>c~I6A(()ip z6jTW?ZeyxHF=?{6J0_mXD$Jrlmc-fung{$ns9oJj9snkAB*ZSQFEy`>Eom(7ovNQ0 z@jvoxz*5^@h{>;U|7g6f)huO1H2#6_n4dQnTU6Bp$Cc}8U%}P*rb~UfR7m%`o~`mt zKARwdRq{-y9i}6hgRAYSpq+E`LC#rQ)=eiQ29$Jvd*6nhL_jC}Djd!(WO#PWb0HEa zcRpV?k(^Oc^Ur`0mZD5Yx*b_A?(e$&O=}mC7a5{oL~&Q%suOP8AGXe2Pde6|K!I=J zLva=SijIcl9K@|&6WhySAfFZxvODq&c&^L!y?Sf&p6ab2-Z%U~C}IWEbCbUV{MP&Y z1sXXpdLD5~@n3>ZLcA!NACDlu(EYv3j|RbF(@l^1QhHw!5~ zDOx3!r5}vEx_^0%c|E;r>{c8c|6EC3`Q${q#nZLqycLTvJ z#ca6g%vyL_LRz_+`ISS}Ri9^d+yH=HcmSOU>GlLCAQ}j`6b10b8-YLcpvM4=0lmno zl3Qjzby0s=p8wN|!J__(Ll^1(hk=i^+2Wq++C&~_#79Y*O=JcALM*SSQ+m-$j3R&p z&ZtkjKw^i6I=Ap)$nx`79wIsPGUH>GOxv}XAA8rpPtvIhX_DWsHL@4O7kg~cY%^`R z-Q?Z$?!xbY#A>mru?{O?zwCLdxP+|&R(9hK%A0=2WmPrh*7!F{mh35&N=~z~X)R;5 z$9HsjKo6t5lDd%mr2Id>{&_n<_|9jIMC{PGzK^$0Hu-xb!rtN)*GHg|x0Bse|Jb30=ts+#>SLSdTT1nufpt;v}VCBk-gjWf=Ok)w)!U5PS=HN+v^T=LxSWM zyGs;?ab`y*ZC&$J@t4)ZC~r`i%TTu?Bx7Z!s<%-lpTQ#hA=77e?AV^GS93l7#C!RqM*uA6XT)YKl;#hoP+env5mQWG&&9 zWmqaC$xIu+)@`ivxgo@3dZJy*QerFN9@BoAcW8$9_{J6Qms=k<5S$X?8e0)B94?!m z(fg7rG`cbqsJI<%95Ji2!%aO^I5J2)c>4Lo#yz=7&3zt|Ys5TzUump`DM$V6`-$d- zdRwuNk%Pip*)aE1sjhP4h&%bQ*rM-mpt%lNDm9gEOXn zi)sL_6E@B*r`Jz0>>t5%gzfZ|lp_4p>|FVo6lnyx6e$GR6d4rx8Hp`|327O>GE%d1 zQj$}$a?^9Wd1>svSz1~yr&kfJ9ShpD*?3z##UW+1#Nl;=gIRIdmYM3Wm{Z{l7WmUq=z;UT#Z;s5oBTo=Xbv#+wnZ4>w!#w##)viYNPOJ5dSUiz_Qxk3y7#rX&9jFb*}exuOr zuC9U$;<}|)8YQ$uI7Hwh?g%>EL3DBVGI(`>&#jfHq{~dETWfBxs{_(!s4S~m3jX)Q z$GOh+&gF6+b$97c;o`?`nRgyIf-k6j-UWL7P1H7p)uw2>k&mr|I=Y$Wsi{?sjko2K zt@aW6VSdR!vkQOj*3Z}eD3Wh4kIDM8ZguAvXOPvWYpWZxE-Li7J zxVlV49DfzA&cmpALRkgT&{?;48q$E;&~?Sq=TmqRE4}jbP=hZ2#*p-Z!ad&7^XY1~ zS2pG4l{T);#f|PZPakvNb+0<_&AY9Gy#wZL;S0}EAgwsn_FnjXZ%$l%_9K56nh=S; z_yeY@i80|`0i=I?z>Fq`IxX{T5=-@=aAxTHV9D^)5Xt9A+DiL?=@X?&WhMp7lGZ=A zC0C`a#XX~~O~tGYLUy3#(6e6B2>mXRW4}E3KifCWD`5*DD-S=GXSLU^eXHXWB?Y4H zoW_{?Y&$IXnqILTw5zw|G%n=*iqvuqJ07eP(s`i0-(cf%;dEKvTq4Np(R!usY7d?M zQTc?YBR|@KQOy5L!Rgc-bS)TsvwmJpP$<-FPNMwf5>`D`^0NFrD#S@eX8cZhbSQbwd^eW$@FHO zxVMIz8UW}d7cU|TQWglZA`^eJ0O%k9$HUeO zb*zPjBGiYacjI?UuIeAZzRJDQ|74?znN{AW{(zGm3H*Bhhj^ZV54l;W`O`h%{=a%k z!I0NjQ$?G@ZOG`s;~>$Xcm72BDOwA;CvyU^GJ1{BrA|3jQ^ZV^Q!Maj;FsU}Dsr{T z3{r$2t3TD@W#Y5qFJO~=nn_nl^b!X#m9ac&+eS1N+zMxg)L;BSY-4-EL&6Nx8KNsj zvG6|dWGelRyM(dCc@jdLmQ|p;zOH@#F}J9l$j9;d$8*Jp1PoBD2eE98D~~GI=j;F; zU*jzkm%;i`rZJ(_;i2X6>BX(tFC(f8asxU8(ym?U6?xfp9bpk6rKMVlo|Ve!PHjd- z(1RdZl0*J$CoVKo#LGXPVScC@C}yD)QC`z{38qr{(P6EaS6ciP^~5Qu$?V0?rF-1f zR_RW0W2loL6>L@Q+M>3{W8hBmE=}uTp@(<_JQPMf9b4Y*Hv{rbe_(+nZG55`sXm@zG0;j7{O^$-mrfg<@#e&Ja z=%8|cXg`oiM6>gc+gCx2Aq@?=xZn4h{^CW_t~HwJeCi`wD@rpeMpNR`iI%jsES*Y& zQvKhT6_)hD{p<4+OdCQ2C6mn?jy3+p15_hsN>$SaY$2!l?ExMm-jO~hzHPqrkEt)s zPjSyR_K8?-;9p(GZnJo~?1NEtthctSYN0OXbT_s<#CxP2?2b%d%v{+{za&fiP#TxY z3hJK4mChSYGg!C06WL^=q<|zy5es zKhJm`DmrrM#+9F1W-YL4ZpjsVc!htEe))!^^;})|;B`lS5-8Ri2s%{SS6O!M3ptBO zN~k1PA4blj1r~|bWG8#8zD0A8y|cXQLgsjq!@o?DIZHX5 z>VB+poVlE_l*d^X^1HmYI&VmeAd6uHrcp|aQYv68Mq$#T*`OcOkc6D0c2K;~Tz|Mm zmuIoaEXq+&YRHcno0{?uqtDZd_l(vZA?T|a>Y<*c(Pr6aWnu25{Grt-XWt>9-k)Yk z$w>d1QZc=6!t}uT+8*t@wA^P03;Itbwn^)ZcOT;{SOpzCbF13v@5o88G4JB~V;`zc zxik4wxE~rA>N+j&Hf4tR<}X6ukYyc8Ss=l8KdV(84amRGXxEU4admqKsKaTJ5c4PV z4I#(PD@tZbJPlkA^vHyBI!S#SHXl+NtoioW;v>#p3Y{9Mn(%@K_X)RjJyX56>;3-K zftEuGll@kK(W23=`m>{zQrm2GvnakVyT;Lllkjg<_hy;P?SlbL*^5P_#Tgz;(jw9t zpo!m)+wZ$JdE8bYznSVhpif_wS@F%{fuezk7IOPdbi2jpV5&*Tu{ zJn3mJy)JI=NNP&G%?dLGUcHR{gAuAyN7r=V!sGqPK!$jxgYucq47!t70mWc1cipH)9-G9>Q3}q>1S7h&C$v66_x7N(nU|Xl# z^z1%maelN;EN4~yEGz|ty(>j9=kGbLh-|YD&1Z7d=7(Z>QNKi>}pd4qGSfz{0i(C6SF@78_ z|2P~?^%3A|z|2l4Tn`tNsza z^sl^8gy zDt@a_XHnRQ`^BV<*?6v-FZi!;->}tvu2CAIqRhD+@v?$WMo6WZ!yTW}~zV=CJ& zv6x%#^89y@+BVrmUMH8=*KR7PWoYr-9AxFw$tRGDP{TgS{;>Q*JxoSVScP&L?Eq3h z0bs*_#wmCSd`KzvES?cDV{B27=8rX|#N%moXoDvTHz5o*7T5au{EU1778u0W92?17 z(-d{koKzW@`y~^)cdhb=nsku}SBWu$|Gd4V#Gk!#wVhw|C#a#b(|KEDRE>98Ls8?ULd!>Q8eVb4`oOyq>@& z_mg?`UE-)grrKM9oB1+MR?>yUkvif8t-sp3>0zG~SMJ0){@~O)=sl)86Ipa3q7<0c zeHFVcz(RtDGh!BR?|w-qv1&Q*d8DDJ&gE`#x3%*+O*ioMpq~+m!J!r?)iwV6lGt@p zdg(XwSuvxt!sq_14O91F!Set?G3xnvqk(f6@5q3CW0+Vzzw6?eh_yi}kKaz#2ej3N zjNig0O_=6y=fsLg{Ymtc;&HC#!d~bhmwv8*ez}FU%GDA{CyaMv1>Ns`-OU92jzv2sUfO%` z%t}z`>*I6`@a^0w;0Qjq6~yPXVu!C#bG_`~XqU@N<8OVVKI5RkGd+uL;OoJ(6&2AjTIsyw zkI3Pd@6;5p+sOXONTDpl$Iqf_GVfxcz-gV^vp|5R_H5g9L6oPjL#BERMrOYSPB%0NVN=CC+lN6Ua{s1(8VUN2RpaZH0Yk34JNx)+tJv?Ru z!E`mK$sJ3h$v}^sIoxvjs#}=ckiMYR-N@Hf(H&}S@_c&|;nYzYc^te6O8j`d)gfDz z%hy4C(RC~)OnSLq&sMV-G3@dB3cV=!u-@#UcfK*CL3QTS=~t6_rDh!atr(~6e%8x2H}V3sApgVL#^4az?AD7y6C%V^tq(P@0A^70PwMgO8PcEQ@A)P0mY)*mdZ z>6F!Mtpu7zKz`X&htNKdkF$xIaSlHwxAf2i56kP`xl^=0F6X~b$16H4R|S(Ac3R_m zhQ(h$fW14&{)T^_xwx<6o)LDRsopH@Iek_(6of=+Okft(AC*x&pR_0|{=%xXQ67em z4KI<}?^8X*IHwp(guY%SKzPGr%#Qtng%6!&G+DAVXLH_bp+3Wckna^?9T(oSf0{50`kewi)!k0K zp*Lw*>^+yBr?Bs_Y>LG{D>1hhI2|nVdqQWQHmGIcU)`J);uc4M^jt#cnh)&M{)JHZ zwe*WU-gf6@iI4uL_;%P6;0%tLDco;d&Z^z3zphdnzS1Wit!MEWwBFHI)o^|9&-3rl zQ`SY~w(S4s%%ncL(o9_U%UPfCv*$ONp;VKK_912>OnL;(q3vNf_Dao3JV!ZsM%opg zE+sq0`@6;E&$jS!j8;dzeVe?0sIXC9EbYCI!1A7`G9H|pg8jh2w}|CVh`+L9E_BNq z)4<@gG5iL|)6(z!;~W|5e7(c-!>(w=y(0+3@2`7aUALp7W!R{~yJ4z|71kosAtFg! zqw7;|vgEe$cBIaJ_TPtF$&O|gAW!sH19eG1$n#=+(@Z*_laqB`(Zoj3@z*bCYjx|~ zrB18QFvt+)=@D$(y&Ca|WhiZ8Dz2+!9gqw$=Lk93U!lRS*^UW z%R$&gx!HLaTfjvLmO{)qJAq(L1794_JtVt*eA64oQJVuGOS$fM=wP*H)^f07IP)w@p5w| zGOouFCIH1OQe8;-t5VgHAG$96yY(rH5!r5sOE@KB%*;I4fLtQ;xc@PKOQ(_uJ(UMc zi%vzNRau(1PK-Uo#ko`LM7ycTsJa95Y?5^Ap?o zLQcm6r?dDL9(B^J&$_n2TgFu~H*xrLMh+QOSg!ASG+U!WZgu-weBMrqlHs-ma(noB zMNRvx{KJJ959Qb2-E4Aw=V!-uVozr=)A}2W8#vz$NRsr8W(ua+Kh}R#WBf zZ^t={AsGffa=pyE&YeuAtvFM{ca?v49rZh=Lq~It)k9N?gS8W{+imEPJM|xeHaGM` znvUu%zIE+f@UlDF<+-c_a~l})mBLb%q7wUUTD!aBgD4U29o9N+mu~*ruBU0`URp*s zWaxXHu$V1{zm?|tdWWcOGzIn`wQ}i{F*JJL_Y0=Uy!46Ed}f|o)g=k-LKapM+S`>0 z6YV+CAb(W9<}j7I<;ATz|DC{jBL$*m7&h6tWMb8xODP0o-QNE<1C#!+?rj+oM^erf5`Kk ziT=H4EnnUq?>&uk6`41-Zx)64aq{xK#LwgDGR$ll1zZ#7vfENG)7MH>ApQ z)|Nbez;zk+4z!?daY%R3c}XI5eO zYoT_mQm8gE?=CV?-}qGlnLU?PYWLGGmqNy&y4c^riFC3JmKGZG)5Yj~^sRno87`y@ z(Oe=TvE)8S1?%g&EAI4XdH@wkswIwJr|V(xC@vU+XjFd-k7W?CJt{jPx{n-4$~->- zNU@0}M{KV0ntchD3|P;4D&OIU5hF(^D_}o`D5-IN?<^;J3K!NY1-NdIF z6e-<~f6RXqsWTfwNeok~2DD|^{fTXf{EHZ1nTich6^pGfnQ_Fi_O#;rY5@6nA0hV< zyI)q!3%(nFs zC?^$lxFW)9TT&=CS#+WQM3hm2v8h8DqWcM54LpAe8MW_mf=M6vayqBJ=?PdiXl-48 z@&I1R819T3`PkCWZ!+^-qlNq<@OVH2LC<6VIOx2~Qhnx_F(oIqs%aVin&;(tv~=x1 zkMkxW?#oh|b7eL+H;ek-ySclw>eNeVXiOW4UVNh3 zZ?Cq{Nx?!gBgOcDN;T3Hmaw+j>;P(}r+{fou{{dc@R84NdrF!ko9}}ye#iD6yPIA0 zWq0MQJrbTZwQtO%OHrPlyK%4HG*9jNt^7W;Mj01dI5gh7o-g2O8UP@cvxj_Qa5ywk zoN~KisvRECu&ooK*h=m za}|B-iC^bQwBGbrayiXpzJ2>vr+o`rI`6*eZeZkiesUtTd{un<+}qnb97j^q^ZuO4ZG|5rJsfY|Kp4K$ z?nsIKcq9w-8NlRsb93{19H5wn+|(Ge(u983*zERy+3NCzOy`~|f2=-rTyL~luGCRf zR7`pDuh0F4;zAmsb|Nqh8~2lRS!Jc0L55n^l%=e!tkrbRF-0dhg&d70whi)8gWr`% zzRZMh#6QFfDfoD>xDFRDTS=-)?4!*YJNSK2dKfop>pl6xu)@-Z8q||X^VH(H^Nw-% zRCA5;=#f@pQ(_YzQ55^~tr$_9C#V*_KW!tglYRK>%3q5HTnf2-wTH8{h0RS-i*dYs zJ<^f2PVbwuwFX!?UY+oyRq=*0arg9mxV_Es zy=V()jRAk-A=c1XY7tOexE<44xx2r=KL@q2>(mdn*pBe7MLqaKj|3rlEsp*x9b3Gv zhm&)2b5Sl@c%SiO4sM=I>#RY|)u;K;SBO*hlV$9cO=<3Z`NB78>7nx$u$bqCK2Utc z>FK1RMyzj*F?$M@NiE&oTP=PsFE3UzdHxq|5T&gW?M8co!hHuE$r6R*2q1@bA9j~0kLfUi4Pun^)#4TjfcsL;=Ng`4~;5v1yQCQ+CFR-Ehr zl897cFee;-djLbXL$IE2MFj*}y>AYk{PsvP73jzleDnA@<47}vVwyMZ@9cg)k+aSV zEq65>gRnH&Mb;({OzX6t-r0&`dxYBC+wU*I6ex(qBqa2KmxrLL;7^NxuPc*`2SBN_ zNk%axFGf9^KQ4C1C#EyeYKoOQFB|jE9Ih1?)ykw8??jy5p6`OiDT(7`sFS+8yQin8 z$H&Ll8m#ov-7!EYRCFTB$8PKVTHlK2KWXXL!4ijRFd^`DkKJzvJyT)$QdeVXj2*Fi z4_$e+QB8j4hAVUO_ITlql6Azz%|Mwh1=QlybJ2df1$}?0G3qf?#hVs1V@Vm~;o~bW zZ+8NV^=$6!?0jO@giYTUwKDL}J%RU#sGtw|=7NxBhZiPP$SZFC)8*kJ z@64{9zP@b-(&GM@@5^^VB(Qk(`i4bH$ku%lzbU-3@pOdlSax#{-Y~dU>XdwWs(O*V zVb`;wZLoUSs(OikHL&eCZ)th3fKCeMS-ARYI=$TBR~&&FOC5}qGkM1aTw-Hmf0cNj zl$HL6iJ2xZ`{`0v+hP)(uZKp(Q?>eBDN&YOU$Q8D`QILLG`Q7dp<7aNWJ#Rf4vBr~ z1AX^?j&S^d;LO1f*u45A0YglyzMn`ign{IG=0UT-%gc1d=CPc^emV_e9=5zZa)^{V1vGQImi@&zEfxYm>DM0=-;9-!HX{ z{O@4-2Hw~>yQxu*e=m?Kn#;>0mxxpj^L@DRf4v&fs?z1<;TaTsz?y)pq1xte%R?i1 z6<>~(1ASnxvgLc(H6!+N_P^-E0%2N5m@op@3*KA_qn|z;p$qcyvGm65QvF<`e&*s<$!%^_ey*vRX8rDa3I z{Kw15NPy?c9w702t<7i8V{-mfQ}m{H@08#E0s)Xt@w|8Ga~~4*Q?(1_T)|hJxM&jzXbiOAh{%DfD2-YEomm( zc>6cSAGnXO;&gO`98`^<{C?6s!ons`+B;?yP1?KG;dxmQf)BvJ`~>)2>Te7=GyxD2 zF`}Vnx|#6o!Sz;QZ8ZJ}^iGQ5G9(L=Fqz8YCE<5GJ3Fhasi~=~RG>={h9PQCz*{&b z$ty$)mDjXN$aR~Km+O-=2l#D&KjYb1fXjdSXYRmV{`;4a8K-dYrE}`8{24Z5e`v?z2V9 z&ro^?pZ+Wy%aVKVpBh1*kqGo_{a@~(uQSjb7*J?q0=O7r z^mypsX8NWLm2O^r*Dfu#_xNcZ)(zcyae6;&f$kL$v?SOE25d$v=5`@3*R)qSDKyu# zoz9<%1wMrELnmP5t&6$od`Pj|zok7t-{tujVC<-GbPI3wx*+oTuz7L*CE%$l`yyaB z0SFx~$`;0A>A6dxc)th^PTDDmMQppcFxql{ag{$%KV903`OkgB<7Iq0i3PCH)z)Iu*M-Bx4+8?spS2vdr9Z6ex-A^!X_J1#D zwEM3S?7G*Y87oh?n#B4SqA%JpNomo^^qR5gB@!?%M=xEZ3Tm#XsDMmm6QCdt?rewv zA{D#Fr|&w3`u01OvyMaZ(( zq63PGie`Y&R~XIsDA8xkffMydt&9wo%`g^ODmCH~PqjvqbtW~K7RZxxBT*pE__n^% z?XhlCT4mU^&NF4q5s95esRP^y<{TDmVVS^Ub2ZRXO+8*H)zZ>BZ8v1We;f8ccjqd2 z@qIcr4^6b@$xPCBp3m#A%}Mjn^}UQ;VIz`*6379gMJ`x5{Akr~D7W5){St{w0} z4iGfWD@_1vQjh~GPelkT^0bhQQ=Bbd#;x*>pYo9}mY3gm!aLq;*NZHwr< z$6xQIE&p+?rCJoh*c_4p^Z~7}-usg@J${W-H~EPPP)~nbfL63ws@na4EFTgzc%5MmO4A>A&KeqsDOf+PY9z7a)~E`Ggi$ zU0p31@gJ;5>78elb!gt4Su3WvkgBGeemCV5;Ogw`Jf6xp29tdX)!KEtEj@4NKL`hz{GoF*N1o3jY=jp>+480GRiZ0y1{uH-&5RYTf1V|R;qyaum@hFGNF><2;>^wY9WCq~L0LC-- z%|urDh?Lhh;S#6@WXJaG9!(F3dvkvs?bq8$0C_zSe&FLlKHg`s^tvy2h^u)TvC^^8 zk$ghtnzSkU9{UwY|#d^{>&B=etERFkZQ7xmy1&Bzeiwm~J5(~@i7EgMre zx4MnKX=eO~(Jb0?6Mw+WrEeUsKwe(x_)yIXpp>2Q@N%ASx2BgHLswXGD9#&mofI-<~(je*b4O5{D1}E>A;R?5n z2|2~@BZ05GS<3IOE^n?-Pw09+_3$w(uBrU{SD>0m*kr7|I(y=vyuAFo#`*bq zRduxzUCNN@+=J(*7-=B6alL@x8nv4Nf3A|2re*;21#HynTmbP778h5=lRt)tJ+vhR z+!nRzPeUeAErHYo3Vype5fW5XQl6eI<>h%0m+6S`@DIqy%3@FZHGyxZ|5G^3%*_5V z>o+1ZH_=0;Oli?0du{sF+AM1FFx^HLClfQYySlm>Ixzutjukr>?)J+7`+{E#LCw$u zqxXYgWb)R7bUiWX(+u!#Q9Z}iNbXA6x1Q>(MV!&#?e&KLb$yuRY;2wI-oS_ZGQ zIG&?>f?Z^-d^ZGR{vf-`OCU?t{yDh$07HuSm}!)vgv;l(7H9BNY=smI<@$$Uh@KhKEy8o-QIP` zYX3##2d*^mznj`6c#M74YRPNIAb8F<1oc3M2+S3W;8a>}&r6jt1NPe!94{yK_ETL; z7NPGQMqA{WUB+{ZD$)W;l`p$3z#=R$pSdNY^;TfdJ{iT^!lh&FgQMSVlzU+3ONQ>| z@g>mV_~(r>H%N2id4C%w3GgwS7yoU&FHRE0hy)!j%v6sU@Naau-*x-Tco`xBe(#V` zJobmdsN{PpHxw)k!~m4Cww<^_-Ht7+_yeycDY8L-CT&E|8&*0YWTiaammw6s4@g$< zjh7d$1d2wwhw)rWq&coIBP>f&QZf&sDo^jLj@WP$A{@JlVOLqhQD0-boK&l{kbIo_ zmc)FF0IXDYI27;CJQBs6P67q z1?F5fStT=kDXbFUs{>HXz`y`(HH6XYEZbt^08xKjNY!c#vvZ_qW_uR(2#u(Di?w0k55*SHO~MXyS7E zvQ7i!_U;}(W@u-ppbcgNTo;D@ya^8v&xr5d6Zpl1mK-!T4uZbak08Cz1a0-QRo;q?~W~ zqMM(7R-L9yF=}{K?MY;D$gme$2b1a}E-=L5QEYJVH8%cTUteEbJOt(CukA8>tC2|K zu2PVF8@v40n8#aZHnwljb-$6>x3X@=l-7RP{c>`8DhLSx^!9}ygYTPLp3vP~r}JTs z)5XPw6!qNfY%R>(Twh;@QLB8ndAVi>t?%DOZYH^7>pp)=$BP+KVQ4fN_+YTY-n#wM zp6@ipM1-7zh^P&c=Ubwf?QvY3@m%n?`}qr_LAT!%EI$1^waVErV07b3$tqc!pP%2{ z>@pb$=bjN+NI)k6?x>ZiFd&9}nYm$^;KCSC#@24OU*pv2iY`>hQ^1x8H&Hk$$1RMq z(23>DuVI})ix|j%nzVu;U&uOI7(7IOfd`nupFi_*N$~!(m|ug@zPGdf4bEo~WN!D1$0sJ74T^M~hB3i8mn8iHT zw)$C)yd;N-ivh@T*_WZsI;05s0tXoVgDZ)K6cp$)L;v1cT5P(7beX9|7sq8tqN}Ux zhv4|iR{r-FX%|J6UhTgV3Iyx3vU~CTG!uBCSC5N#?7h`6BPI-ED+|iN%>+^by6jo4PcSsk(`RdO-jV2; z(-N=>ojp1_S}ar7)6?@$$y9510Pz`7XZ}-BOf3;D$q7Aehsj`=Jy)PIdLshXfBcjp63vVx#pOb$+>DHXc zo%f`V5-3z;WMpDC-Ph8|YB0Ws9P-7;_Fv4dSDqFFo}o8*Yb_>*Aiu zXL~{!JG+X@*`EVT7_-WO&kHbe8O6jJP#yxs?=c&RS1ZGdlA=yRDPC-egQ<6dq)P^p3o zMI1lzj<^)g!3IbxWC-vk0G5o;$a*bFTWp2?A6ai5*5n`m3y(2iq@!fgqZ}b!5(1+~ zcQ*(UN~gep(E};zE-67my1P?p0RaI?DN#^7`~J>(uIstZ;ji8I*uCxkEOmamfwwsC z_Qv#5af3R1V`9EY`kFRNKaH=&h*3t_T>bociUohM%t}bEb%6Rfd}j)0c)8i_Q2DN> z+))derNZXfmir<*%El>M^woxxjA*~jhohi^7+XBnFTTU3-RB+Cr}+r0O~RC#BuJuC znd4skOL2OtTDLZOJ8xTMcF0_D@&^n0MyZf>upSKk9Ap3?1IoXPRL8O80IP!^ktoJ^ zU$P&40}ho^p%3Sb(JJ{iMg7naOPT@yTsP3wBVxIL=LO4S4ad{pj;)NmZHKERii#4&bgvVAC97^sEP~veYN+*MdPD$-y~-mgrvr}DW+IAoEk|# z;wzn4`B3{?`#Yw?>9NZhNiU~M)5q%{oHnT58QaSua3Tci_~-ww4{tnr%vVWxqz@ZH zSP~9$vzi8aFH^A56M^?K%jFFcDAd8tPvSk!O+VknracSAYq8^vvjV)ZwHd#7Z-wo7 zWPe6TnT$w(NS)0oGij9R^0h!tK{R(^-IP|EUG65YKCcYnjAqVSc5Rhb^Lk!BeQnE( zR+7J65DU2`7F(y#0OecVFV}{cK7w`lo*DuP#XjCC%lx|UJ`H;ra z)|9|czD>FFsD7Corddi{(X6`M+It_=q*C^@>2K)2yB=Tf1f-U6y1Jp#orLe%kqUb% zHO6a%*Vp&PqqL%m;tll8`h99p!Dcc>5#sCjKD61b&|cf6=72ri_GbDd09+;5@%oyG zF@|pAU|KqwMTGS4T1Mzyl$9Tqik*hjX5v&Zt6?$Av7pYlWBXlHOqCAehYJo&Vd)w> zlVh1&(bO@i`(HcQ0Tx2i@b5_N@?acZf>~NJ503okI-)TbYuiv&WvH)@Nl0+p><*sJ zeTu~eu>YOz^NIU%@aM>Dd{nF4^S`^bK^tDRb~*df?NU1AKJi0#%>gEo4`ExK%^w|h z>y=M~T{QyBZrQaLSbK*ol1S8Qn^KWTh2JPNy`E*zgn+NU%J^%c3{kAtBG$G8>Wo;NN zsKQW5^By$jefE3m-xo}H?2T{}MYOcX{@Km7m2Y71LH#!^&8L5J(T|;yy4?SDY1OQ9 zBD^!Z_%<$&gO64l)5ZQ>wS?Y&*{{gdDYTF-c~3lJE@%;etd5%NCOBJJXg`>=@RPn; zPh^<;HSK5dv9!Hhw|w&qJJ(_#Kh)^o zwS3pK7}t>x1GR`QsekxEn9QRzIk|8Mg2E|R>FlGyLRQHshB_Wjg#dNHx;SIT2_*cXS`Y^S-A(v!3syL|9+`SSGV>++_p z?HP*~uD9P$9(*T0dj6#IK+Qb~Ki}UVv`P8IZ6&0F z(u$t|b}3@(k}L5D^U99^2>s^6~=$B29ljdt#UJKf*R6zJlM?c^;az zg#2C5lK$v??G>xA?zO(L@eJl)sjo|g*G0?Efq#)7a{N2B?)T)%ZTH&gy8E@y5(%TZ zm$icQKa7`Ibri4cvC+n%z+{I&%?#t;MuiLAm4Ijm# zf4!?;A~Zf%xQv9o&uQU$zdut)V|L@Z+~Sq0N~@Ls@cX!2b>bR!x}VMpI>UX_LW&vx z`qyvM(`yX;0K+wruD>5T;-zfcfTDCUv74^oTfEWoMsw|RfmzhI^3tp z_lxU`b1{7H-sJA6Ri`V>{o-cuu>8UM;Mcv?pWoNwmi%lG;;ka47G*pz7Y|+8pkZv` zHl2BT$AjzHvR>a=8}N)#>ch{-kCLk$dj(!mP}*8E|91NI&wLd7e0er2WD+*k7;43p z?%*JPs5!R0na-0mFwo#g4S87*su3L>ojPX!yYjyVvhd7%7A!F=&iLlPdQ91QlfE3w z;wG|~tTm^O?XGR!|HKZpZfs$1WEt>{K<1ZRPt{ie&#*MXoGDQe5yg@@`-Y425vHD_ zX~~~wU)H{?eDqi-&s%GGKzenu);Mx$EN^F5Z(NwxUDX@|p@>-&TS8;DY69L(Wl491 z{QT3XCHZBVOrUDo#68f*L3$q7k?$F0#~!AUujjSpk#%TKzN=HMDp-sUH-X0L^=D4v z=hOKctEPzGP_BG0Gn2f;sd;Urm;PI=E7D{Fo4 z!xyG4q(nrdVm|$v*UQk1br$|~5ym}3f8v@GdcL+9{8jMDLzPcU!W>-hv|fDjAuW~i z&{*uDzy6=Uw0Z1C+L|B!pr!EW7Fz_(&T2b2IQ;K6T1xqri{0N;>b=84AR;+ax7@KB z8@-oOS6CwaF+JJc&-XnK0LJOpSaD#k&*FdDl#s4EyQ*IQ{H3`$k3|zlEb_=ffz7bV zb1{@2fp%<#6LW8$|7;drYi?YbY}+qjB8l$kXxBH8PL7oW#EwvEhBPr>?X}0v-9M`w zIy|b%%sOI#R#v$TYd$-Qi>g|dHF}U}u*gwdc6_kql#cseeOOv3gONKj)gXazr%3XY ztiZdE+EMiS=4YKnTQ-|!`(d132idV-GWlHL)_8>+LA0{VAzg_aR`eqbiLC_TiVqBY zH*O#c!ppIle27>$Bi ziz8CUcdcAba>iihA%`P_*F=#BED^iW?sJ6Y1-|->Cvs!U1rC{D%4hHGq?pi2h$45Y zG0o#0n)d=4UY-IucE38_zdz|G=DVU9uB@!|uy_DF`2IalCbZkZ1igiwn9#C1P8_My z=RYQ6Cj~fdJV)og&V*1SpWgSV9tx@uM$7n{FN%sHg(StZm7xZUi`D(KP<3)eIh91^ z8cnhn2yo(er~ZxTSdGNAA6W;76?RD!iLSWHwD_{_pXR#l>Ac0eonL1xonK%#`KPNN zU9hVf7TbE_$bvONnNftPiY`43SWF{6>sV|BUkgvG>2Nl7UX zfH4KZ=|?wGb=}?fQ(}ds`zTshCom3*O5OTnZP7i`iN&y0kR4X_H0N{$`ts&Kf7Q`1 z608hwSYhERW3lBSLbr;(QFM2(8{j#fR*6Mh9!URjSL89QmG~tlnT)MuSkZsCdjJk8 z*y2lUyjHSSz?AE4g`3&HfP83FSuCWsriPx8@$l&6NsdZrqpl9m!|IwEl&A5>5`M6>GKbL>wP_`eYoswOZ zT^{gbOK!>M={|NGf{Xm6G^O8!!PAM#E{xy)=Q`^&v}R*?fOeJz|2+MYqxp_>;NbKW zAN5G+d26lNv?Cw3uZ;UMFt@s6g>3+m_Ek}_5}7r zLjLD=U>~Qt{%2WJ%Ceupp8kK2+03x-{QrCY{~Z6H%LtDDU&mwV|9#Rlo&WFo|9$*t zC+yxJ@Uw^l6+r66H(DHKS-}tVoa4l+e@v1nz&Hcqod>i86DfbL>C|DeVoAj~U;xP^ zMKdn=-;@P6OwK@df&7SOoltgx?9KbgGNKTF!2f}Y;N^&o?tqV79USAx`(u$FotQwL)n0Gh3D8QkI zzs|uN8h(FF(LT$IeZC|}3%rHoOS7?liS5>lS8n722?!3pjt)=}0LYfC$E6cv%P~H4 zw_8bK*cyVV27y_jXUzhP6Yp|E-CLs67`*wSoYyAcqWgoD>FAt($!EUe@L{G-cj2gHClS!G`uaZ|Y`3EIYTXl+~uO5!smU8`wR?d6nx^=BeU%usEEH=@P-JgQzql#EdarpsDJwO0eZ+bK7u@m7&_ z&-E3bw*faSFx{F1rVmO@M{mE3W>0n`uW&oLZ`qgedjY?VJ?McwH4D9zLrdJMZa4qj9=h&y~Q`I$itL|H)Elg@rqJJ%7 zxaJ$)2Y{iq1oP04EZ6C4bBzUI1X=2{I3@YquI3i$&6mHce;nt?HK3W@ccs^iiL{0A zrWKRF*7XD(IzEJ1msmGAiQEr<^EPGs(e`dCg&;dl@9ABb^lerKe9)F2VvtljpeQ0 zAX-9IlconUzp*{R^I|)T!POC89MI?PDcxqz`-ovTNV&8se83thQk#HEOXB-6b&>-4 z0o5No{}Z^rF~%r8NTA_8^!gh{Y1h5-g_C>ItK+?BWbab|s+!2hJ*X|Kq9p?>QK3b&@icB+Un+m&!x7S54**CaO8$%MGIoBPvUV1! zBHb}+?E>S-E3c4jcFG@*sYT6Ow&s50gmc~!#jKf=bo8Da+L%6GU`lHYY z9ybn$6D?9%65~Lnfe^QwsRjN(U(K8bsqvz(p=U+xvxCQ4>DHP@QXMj~j_)Cs|G zoSC<4fvr#EJRij*;U)N26i5fkVggYB66)!EB#ns8p~`}!YZDNS0K3))5}S#!z20Qz z(54=CY)T5a&J3LQe3K-Y%1oB?*&Gn+mZJJ-WJ9K|L?A}sT#7G)+o|fXZeK#~+gJAk zxSNGRgI&Nvlea|yb1*O3=AgaS>wI-X^M3jpP(E@F=ia=h0?eGmpXNwYuyK{82%2ZW zQxcGyr_S!5w!+k|N55L0IgA)>T>lbL0Y|`co2eC*-A9P_Y0Ls%sY*}?69Ia~0lj?T z2Y=r=SxHBulX%)>Ia$ote_%RnLE*jSQ<%Sx`(=WwKG*^T0O4UCV7iS+uTN)I>Xg|$ z?O*^x=Tk5$c!%>QlKh1rGf12uA+Vt9Q>NLrmDNchfOa(1Dun-jLxN6fuDc-gid?L) zNJlT^&wQ!a^N?*=M3 zKSnp;4*$mQPC*{he(`JMEIzb#1239sDMk@Q!XVwTayM;SC-c~ggdZQ&3qtExBoq=q zueN%c5w+vF&-Js8TS^iIq(uPE0UOPagTL|00f#lt9!%GKU^M>v=jPT{Fb-ev5BFKc z?ZrwzQj)$z8*(Dk+kK7c@X>z=t)Sw^hxIx@=DLQSjE7p4tJk4y$-POxHU6P{)6T%y zO4jq|>erp;#!|tDn>`2%))b!Bv);SWqW`z0Q6*-aLYWyxrGVRYEUDEt^K*iSt{@dk z07?S)2Q+?qWm&j*U~9W540Zy8P!PdF8~Gt^vM1s=9ExB#doD3-cQA(lV0~O&po_e6 z=2Lg-@1;U?Hql_T#~NJM45=KpgRmJI2XiVa$XJ1g2o*xWC=H0C$q3!+)n#9dSkPbd zg-CS2f5L7p6#~^o{xj#GYVFZddq{Qgh^mCFg4SQ%Np8pOGQ1a`nBFct*lXZiR_?-X z|B=^T)Byg4Ib$u@rtSb%s`qOk^=C$bBQ?1>rDFc$VOL%p_Hees!eaJ+H=L6Dv@)Gk zF6!V|ejv!2_|dFt;NX2ft8J*E6A_4?==&hEb-=~+bz}KNTK!n(P&qH7ge*NRpcmZ7!SzZ+wKniUxI|o>8t7~F8Drd`1N58~V76t+y zy!X7nHepQMGKN-?&2*$#Q<2z`mh=gne^X|tA&?2q=E=4_93Y?fQ`;o4*2%Dzh)VoUMFX3@j11f$2 z)9EPfPqIax|z|OLSL`Mok71k3>(%%#iU-=3+-3>wE;xdEJ0^eOC$jcRzw?AOm@d{B< zcKFZLH=3r$kl)@I+2*+`Gbd@=6{3OiKxnFuPBsZ@G|uyI>iigqAxA)eE0sa|n=JsU zoY%h-buj`q7#R9BYns>n{Eau(OM`}Nw=>#J(pdUf*kSHM6N!=8#Rs>ePPfoH6hV5oy*!4JdDX)6|zlObxpIj zkkeO*0Lt|*DGLB2!ZqbaW(916z`}hJN+uGIUD;qGp^b0pY|QOst434Kx9%LHhyoln z-kJRHm%_07F|E+tU%ePlGrf!ZU0-}ek|y<*Ieubsytg>e)PzYl2|!5ubUhgWQVvM| zG$4Zqhd_1?kJUyj<&r3SR(glw*%XK@iUr^*!9yjHnV{|gdI6JBSv|a<=RL>Le6yLt ze9})vhgYooV9*tHj*`{lC#xRVTfE!d5-$# zE2)W7?bVcDti@0getq;7Ywy34slJvmkNismNkGUV^yMBcXwaD0O&aUd&`+!d={A4T zHdcOO^K;hnDhw|$&jy$w*3&CWWo<~mQtMQe_}a!pF>mi#w@6R%f~a?CzUp;8euKaEtPt%RX~-vlQw-<+AiuI{g zRzTMvQXqYXCXRin!tHjQ9-vw)&y+_U8%M%b=I z|3@|DL33(()s2sDv#3Nkleijg4-ZJsT#U6};P}f1KlE~il$U=$*73KPk(nl>lBhwQ&w(3Kcw%-!ZNc(LNu}Q@wxFwU zuZK55jCSu{e!PW|+m-L4(BqGv#wJcgy|+ccZSHuZX%i-vH>c?3%5LZK&K77T`C@OT zw*6lLoy%t_)O-tFZHL(AS#e?1u=>I1tWd@a$9$SDN5#Fy8F5mZT%XwyzW4W66ocv< z7J5W~GKR5JC$7YUa|5@RV<_prJlQepxAmM8Rq6nayD=X>`=z(cRkDl8(MqGgy_(i& zhMHZUyxx-Iu1FQo%MC?dJkB`i_k6^ia7XtB=0R%Mec+}NTh8CiU`g?7!bmhUFbmiK zdV0H~JaYf4Cmy#|fMbc?(})y3&$)2 zMMuD`nO~~niDr>rGlq8N{5$(EJLmK{@}>o+pYC+$ zNs6X3(M@Q*aMQ>32Hr9@v^LVSt>1~uZlxI#E<}bB*1$pOj?qti@Qd%~sv$Xt;d#@E zd&hk=L#!D(+IrNLW4LWO4CuI-+P`0ol4t-Y5IFOl} zS*=F@EF@%LC80UvbcD9c^-+MmOaKdewNI(Lp@-R`{6Dr zx9RNaf55AoO+DH@$m_NvmfZ@@`%S#5%`P~IAHP?&{7(P%N!!P-M3~mjU#0f%vw=dm zakfFZIv5a`kQP4@B1@mE(+5R>WLbKl0!enA2Vg}5ew-io^F@ATpXLnS86eQQeKgH% z83xpSw7}x!+8$m-+x^>T4`YH!zweH-q=^dr+|5^yp4tL`{3n*H0^W6JXA>#9+asqRSjSoby6oD*5u9ac z3PGFtbmVi1JU6F`YpL=ouKmt;e#|*jSE-%lqWjbMQ~5`n*BV7^392To(-JU z6G#PQ&(M0Mo@?YXraq2G3j5$`>&u;M8eKq-!z#7O;jE=|wR$l|QGe(f7H z8S7aLjZBk;uNd&S_Zkx!iz}P>R^b3@*lw;c>lgkZ73iRg(>+)+4ZI39_DAS#FAj=m z3jhSL0XYGnYgt|NSH3r=Y0T;-M#`c5Mg+|BdndRnk_C)MGjdjAYZ9Z;ZfT!-eTVZH znb`miy8Sk57D#}cl(scX+HvN@TS{C-tneDaZ`&DM4t!l;UogN^Gm*fRnms8UoxfT(a161)7GPmtu}InwE_ zqp@|`7LK@dkE5wtb3FHJF^D4{ZuPNrdn)KYtz1DC3SZP58S7lY-IV zx{r{rDlq{Yr(dMa-7O3(B?QP3tynv@qE0D1~9?YN8# zuY!kI8j1=T>X{k9(_JTUU_;`4Fa-ZF7ytuxx6_hEnlI5!e8ZY8PARL4wXqu@7N{C0 zbrl4`k_>S)H>gZ1F6kO+a2uG7gydfCl}Gt^BHWw*X-6OVcN_DRNv2Ok56Jm146TT9 zKe92O1R=FWXBcWDKS=Gdn_{H` zfCxqo6WpNyyhan1vT+Hp;gUgFNdQ2pugZ9;v9f*OR-WuamMsb@4Glx)t%uBb05$^c zLXH^y`-a*V@g?PPvO?o#icv9#S|n9mQDljKUVprE?SVGq*lc^e6vBbhmRw!eznhJv zd#)muw36|==kxRcL-9K{0gik?w5ri~6!j0C*Hk4@1i0O~O;ZllXM;EzoQv9<-^F{?iC zDlt}`(|E1#-tXR!s~>ItRNM z9@7E;dLf7%Ibd9scw+S9vKBQ?EO)~Sk&q11SRetB0A8%UG%#prm%u8RinWs{G~%-R z(XGvtU?>)c08=TlX99p2@?kI~3wl;x5sS73isrmgKonU+WVxz{D9FPBY=}(lZ~!M2 zD+cGot3W^RE92((N3^Ibsk-_iUQ6;uH#)mbypXg{Ka5ldf_GF6fq-mUIT(>Ta41R0 z#8HQXg?UBCFGM9e?_>je{}9TF+^N*N^6$94bw?wC6vTaxuh0YJX_V4M=l12Qn;v79 zuplBFcm6z&SRfWtWomAFGf7sbZbRY4$zJHO2gcJWe-nDa+bkGu#^t1aeL?mH@1wD{ z*`mtLPny8Xiy4OD^Bn{jg)37}D`Bjx4cYA6>}aF=Je*e1C&=*z^eL$}f3E7LJia43 z^EP8LANb3Em`oc(H73W%9?D4R5b&vk2srk)^x0Lz<0pl?y>0PtgCY*!EH&nFzB}+I z(dJR9A^}n0Yz6<_miN1~>QU~oZHGVnv!HYi-8C;Fq+bGL0`!~h-%yAV52ZkC8~zc& zc9%duq_7_N!y}i#AOiH(uMZKXNLBEnJ~gF;uy7_{;@SrU(!hY?Jab>bVoCRV&A)Q`-u*AXmpxx zc$&Gv+wSfn-7##-bF$mI?He)BulZoT516<1^76VyR5s_yO8o zJSfqrTGpH6g$(mT&gT8!rEoa|a!A0M^I7Ok+#!T^+CL-T;;yLi)2hnYj0+1iq0}Op zlSm@hMGYcuJDSq{f*SlMmMk!%30LHRqR_R`Em_#8N}@ZQuC_U|bf z$)dwufy`u^f>2zQfHnNH6@knwh4d+wuf6-c)z97$8Yy|0XEL>Nwv5OpXYBvUaG=9b zNxg(JlWd{%QZiZmhv@au04jgm1V5uUxhV?$*d(zfEAziUzdIXHeO6cr{Zsj2IMVt0 zt(0ROMgcs8z>fLit;x)sF|Qc%7Zc}R^^6+&-A%Z2_@S zF{&g-0od~3v9hwpa$xO|ff0L7xv=AW*6Z$y7l);U2JkovB0RSVMusVM@w(QLV(K|< zar>-2CoUmjVI&v^T}$LfS5#MPvf0({*kGQld01q4X@bv7fUS`1a(oh8vTAU5)^Te& zmPHPO@V~)j=Jgk+0%87Ya+a|#&`x~wwz%veM??+SOwFqOM*Qn_=XyIQObz%={_%;% zby3pS_Klpnsh&q{M}f2EY7d9zf(K^l6%6o0t%JWF&PCZbeGNSC9m>xPI@ zQQBOj5=O>%FnB@L2%SMlxxI2v+^Rz48hn0x(O z|G_cU!RupG4wBVCuGg|}KOTUK0ATZ2e2vG_dA&+Oqzfsth|$SWT$4wy4Nh=yT0O0L zw1t_0!{)#1j6{QfQsJ%JXiGt_@$uWri;S3^75*5FWUMI^gNcqtCsaypKAboPt+Xvr z;Yy~<%Hf8wE-`NFzN`7Le0S9Omw8Kbh~d{ zr=^$nRq!5@2$-Ut>AfmSZ|XbWoo_pAUr_}g^m-YRvGEe)D|>%VdGWNide-hEaOv{! z$obH@I@9e9*}Ff3;R69gqnDlI_AC%G(x0RfiIiac*S-Uwh_o*0zbo~*M}cvONGkRP zLTDg%_m*6NWizpu#Y-bUrX6#BO-^cEe@0yN^Qlb1rws8BDT(YyjHLcp_Lsr3 zBG*!tO6QVV#SgsO(!)secH>U>Pi?K*wL1c76X9DX7g;_V|7z^Y!zrk~UA%O28RYJgXvAdSfmNJE=!0+@qq9XN8gmQC|=h3P} z0NHnoskA(C^!+#zQu?>!UB_noN##k$%g2A0gkC;C5Rz=8FC$y&>!R4%;8nClD}Vu% zfd4^}#YGZvJ-`34I1-?=)y5({449K0^>K{_&qGvjz_7_K88@C>3T0CW^HgZ-_?H)Q z4qFEEMjVJTFbWh)PO1#*1-RoAnRMyBoRm`plm@-_Kp?Y_L9!pn@vFV1N=$&D^C6Ah zF-t8Kst3iAOS_tJ&P$U6Fg!V(^^4rQt-=~%$UZ{gs`2>?zzZCxrW8(mVKVG~vs$W> zbuY$VB&ccLwYJGlSACR*R^C_XRhlhV{Dp89+H!g1-hfn?*wh%7btN2`wv-`Vs$xd zB=nkEocs+TY_`=l>gj&EgUxHUVPZRT!6!2g=0xF;eHJGuHT7Iv92~IR?A1#3gaYxW z3+sDc=ExPZ3iuZiqW8E!H_Q%Z?!D`mvF11A;R21i^fWT9qD5AX`YtEM|GViw!riDRkDK3-0 zIeC7=xEsb?9AdmUSOuYI1%v@$`b86;JBF!<*>Sh?E@K&^QdymbP_ignoF-4R(^V=9 zUA(oRU#sMg=0>Yq~Y?-T42>jvYbC*28 z1zn3c%9|+o>0CNaWT6v)6FQIQH;C4<6xgx5 zEX|l!saa+h53RqQIoT%Y=)7gCB`fmI5B0;#0Ms*oivF;3G2ImOJL^e-MGPz_HHPto zL~^y3Qn~vP4e29P;=dEy;IosTcS4VHy4Gz9GEJu;c1-{AsAO%zl=qP$}kh{Bb-^^^BbNc!WwX` z%iw98AEG#$)9@LavP8pPA;v8I`dEtj>#wDW zXjYe;gOUAd7Iu`l z(pwxfj%@n(Yq*0fQs4zkYKS(K9lhPIU^-tK2Lbi3pD%=I%h4(rY6H$J(JWy{f#K@v zR39IMT*7H~yL_hLZ;su%$S7s3IX)`MZvUyq0%RDWf)psDf(d6MpC(?WJRvVKCi-fW zdF?{u&O1AIufBJV6&j3>qhDnT4VT#?R4~cqmAUcv_i{_u<(h83xng|WI6Wpy)N$;U zZ0Bcnq^})bKwZW8w-d5+J&I6CxsGv`YcX_0c%j$HPd6nCV%7_%2ob$fW1O%5G7N|E zkS?&_>&o zjt1$yG#WmlyC&iV0?Se`A5+X~NiD=!V;(s(UEhv$hUK~(4Bu=l-F{8Q=;t#DJx_cr zxlkjt<5RYNpMoAJE~DBKyxLf3;+y__J6~*vQA@HDl}Ym8>R)|O`=YBU<>hI8(50=P z+398hC(y8rdnUiE)2n?|dYr7xWSk1*!G;4NPtSd3^t&&h{dr#>`K!WFhGB*gZh=2j zei{KwSG`fb)j}r;&pV}*QRLPT`oP8-))Sx7^^M#uRA2JML#|DWavCpp<|(Mk1SNqW zFKl;n3f4ix}B33E!aErJd>4Q#U1@;HuCVn3>iNq1HD5cB#J9e z*C{S3za^-bJn+Y3rreN#`0wTMC_-y@>6N?-i3Q8M3Nh`ik>T7wC5=3V8H1+Q7!Z@z zwxGs@&zG@1Myyls^Y|fB2GDz%_(bU7v3WuQH3X3>gn*PJ0GbP7Z<ipxF zlNs3+86M5~&76o+CP?+q7l=NJ)xrhL|C|`W(z?qm6D&9M*%6PFOXESos=8vB4mHl` zVdan1%CJdme;+LMB)NVipCtD@y`c#5ti>=-v_Hyr680R%DlSnG8JNm(o(&1w%ZiC-v zHt1SAOKfNHc~OKFNRY?}dLx#kjDj+C7b2<6H~5zbYbvrzwerXrHwS_UcQv2*+L9FJ zcONN6g)%0zp?`m5)9NjtM_6rG@zWh}=eF7>K7L=oeZxc*91zC&vg*@J0o~J}IF-)` zJ3XPr*xhh)YS_|8p3>yHZVM|>u~kFaTs7H3JfH||G)s?@+>f7?BH8%mq{L<-aB2{6 ztdA$IF+KUtte9K!M>nj+OI@7ao3us$#U(8+&9uPwq5BKr$MxIox+1fFnZ{A=1n)-T4JC%y6~X3uhM$uQLR+Wx48GRevsCyGH84wN#X%&vss`SCV@X4DVq+Uo zOxhw(e*#!@8C5fo&x`bdoNvBzV%3hF*p63TE=W(tA{!zSp*uH8bJ2W4iz96fElUxx zVZJkQj6~FzG%D*EEHr2=Tu5mx=p$prvxx+ha3fgR7xr>#;>+FEP_lXkyr8_aqH6dj zpDtVi$*StqITa{uG81bA^!jaEqn(Jraf z57tqj{y?n;2Le=QMZ$eJkWZ_(kj3;uKwV(pJXi;y7#PP5XV!-IM}c0pt)#GWXa zR2Y}tpV+-=!w?GRhcPF_AcTi9LXG)~L3iJ13TV8lu~$+nV!5S-^l&Ch}Z>KE3-bA~%BFx8E+qEoR7JphDV_dzuZ zu0jIENzvT!b)5loBel<4_Su(sHB7H`kkY8wa#V>w;wyztcm1>Bw0&x(4LNTz{gkS5F|%Kz+V^B@fCI8Lqo+Yb1OmW`QecM zODXh+G~ER%jRoS!;wrAx0oSMdx$&{1{4n&s0H*^#)XBMO1k51yNdPvX*>nprV$l^S!D<& z>zW`5QAbBEK3M1Xoe!G{rgSGvJ2ebdkM$kuR+d&(9kq*yh+qZC!CPSj8^`Q@k}S-5FKW$zA4Ue>R|i zf;154Pipxu=)e;@L>sie>_nv)lh0FaS7(gR@TSm)dn;kLJ@p^K=gd?@oy|zAWtF}w zNdJ23P@2g1A3p??C&X<7G~L6nKjhFr0gfftq1Rh3o8Jwh!2zPB@GTeR4q_h56?=T$ zWa35hV2}Xj3uXWeDV-B!sLB|eh>+!Un;3IU{F6zb&qWj-2USg)7YS2C$85K4C1xuh z`G5hfvSqo%TZOSZI0|r&CwtlXug7|CLs!y46R>3tW-!X$+N>9Z0N;@iM>nF7CXOj@ zy<35tz$EKLhQE|b(V>0M!(cza_#_k&X@F)ta~48qGV51YDDEYyjE8VUdN$O%UiOx{ zezsLh)twh0HR5Y-v>-fk9^NM_PBm#i0>r`HAta!|#-Q>7aZ1`Mc_CnL-=F0|COt}+ znH)3(QxD=SqY4+|;O~p|uPJX&(d9x{RMj4z(dom>#*<%zkZ?N^Ha5!h!$YKoo{xow z<1mt4Zvk5?1MF(xX#%yCNFNP{PL?Q$^UJEU(^EbwwUE=AP$&_DW56@AqADyJC`ewH zq}$z1a@WF6LtjFK!^{DeG(A$Nd-lLii?M{aE4THHrR9yxMXF<81LrO#@TwSBM8~}E zTb*I{%rVC`&ZlRik~|d{=0OK5osi>P1+`ugWpPZ0vX#a39`G`Qet+ULW;U50-}_3N zISJL;bHJ0`Ip?vo9B6_aY+eEVBe`o94x=> znwwY`b+8S7#H|c2s;=4z%pZZ5WtTIfNiB@1hgt|Cldi8tD0Yo&QDk>F0!rECpY=y5 zVu{d6ZYvrIAC+Xa9EY)0E<#-ar~*KKD26A;=wxBZ%BX$8HDCT=gE0`hy*HbiWHXZ* zbD2IoL1`dXL6L{n*J4Ka3G#c|;&52e+`93Gk2!h-mxM&VTAhPyTgO1hb&VY1R3+i& zJkdL=!kgiU`5gwLL=cqeFEm;AR@7kVqP`NO+Fw*9;GzG`mV|0)?w9fI=bGmc8 zxq3)p4dUpCdym!T9mx^%nE~k1qP`&qH_wEJ^j<(M)%=o#umv#`pFNYrGn~uD_is*s1usxYUS3yb;gE+|%l+ySm(kAMKOt)@eu`fHh_VTe zcBkJj18%EH+F}|@jux4$VDc)+?*YfH1b>W_v+PIICDo50{ZOiD`r@AZF~ zww<+3<*Tq>JaPG&)+IjDUAwBLUUG%Ng> z|4Oy!IsY6jz#5ZSd0^c9KgI^J2Wac1>xLD9311S6>WY}(I_7BW8M~5_M`#^E9f1|# z^_XzZ)Ng7Vjt0P=*XGlTaH=GVICe^$c~TAcuN_t9OB#+1wMUPl9>y#E&EjRXOKGbVSHIw z7&)gykaCOL+C6fodr^R&pQrTr;85U6JY!zhPmU4KE>5<1$nbsKix30{2ehYrK>T#?dOhZyx_}yVr;Z;R!hc>-+B5!7OZl+2 zSlhtBZRDey8BygC?S6=Fge;gp+*oi$>ZtU#-FZ&{YUM0PN)Qo=7`v2GG@u_LXU3{N zx~WhQcNl)OQdKoY!jpuBcUTxHJ`xdY&BG3cNiT`?e_dRO2M=TIJno0@Kqzhg*)Lz} zTujyUc6POio|^3Z>VTQ_JzygXz~>1&5HSc3R&W)aM;eSeMor{s6|U+O0$Wg{zZb0p9G{>^5bMSHnKj7wPZhm$iBB`M2yN~N_0Ct( z7?V0)mEW;oh99!#tm!L3G(^U8Q(d(sc zsmGXEIpZeLAu2!1zv0J$4H)*V^*;Q)@?B^wAe0{t8mjWbzx#ci#1l2z8}T4q%x?lS z;q9Qw(v-=yTI5@?6ADC4(_!1db^!q=Ii=aays?bLGa4^tj-N3yFH<}EW zmAUNgjD&IFa#!!cQ&-!~Xqa~EBu~3seZ9@!IHA(DP^dO;g335*lSE@3WG!r~A)~{^ z$#OV~cyL)lmmvcjx5c0>a(;zAg#4lG^w)IrGSGJ{?{5as(L);N7jeK7RS|_sKR86;(7B|?hlu^pdT9)` zngjZ?+_UooZjK?a_3FI}VVKEds?erPKW5@D;R>wrdo!x4YUn~-tE?hwg17XduD@|` z#-N)beP5UcGnLWsr`3Bi#g|#%;z}K!LPelW^<>rOutF-UPGPifhlMP@o zVNnUBQG|K@ux%rbm3$jOM3c<9owtgR%bdai8-pkb{i$2azk0$XD3SlkQuMy|3J2>A zNiR=DQQ_jmQcX%IxTlt>{)i@I*{5O~%pAw`|FAad2;hhS+?oe7I$$f`~i%)R&I&oy*ATxbQ(TdW!_2Cvm059hjSf{R?E%P z?H)BwWnCEy1L@1TU)j0xko4j_WJFOFgqQ;A0}=ncx|;+ku`_JDX0>0Jk=j%a56N%8 zE@g2zN&-Wx4Q8`d0dO%Et84$dzqiuK;&R3it~za!31cdkJ*ZnBZXx8GP&WSY$wdPt zN(8b)dQ2Gu9|0cmK$bCWMR~(7M^ZUAF?DHHTsOJa_=k(1@-hjMSUWY|JKI2^u9YH5 z(gMsa{qx-Sem)5vteDW=0{a8i{z}!EGyeHB_pc@RaKT#!9*ma0d5-?r^{t{K2m|Ef zqn?B(N8XvIR&C61waR}>QZm)5j#{88MCmx>LjB*TfRAr4o&84t>Y@CJ){A-dqM_Vc zn!#0S%4iA+5#Kvu1AT9ybYF34ukI*N*FN?fV81}lknSjI`Ysu@S%rzxOQ=GUB1NIz zxi>z>57?A*Dr6cgv2tmz?66y`FgM8dQ{V{^-i-TM`Yt&&l@NUUI%ZP%51QqGUC5t~ z3U|k&tK3lwqY9iLDVCS%2wcvjZ|QYP)E$uTqD6x|h~JOVgZ##xK9*{S9V1cwwp<8x z?oYwTg**RMk3P*V!4ElP$Thv+5d5)(FI5W@nesHx65t}^2aZNlm5aUv)C!;94A^{ds)}do&tLi zE(M^{`s8Yuw$KcWZ2PX8E%jY{%;U`jjHox6k*D6NIYk&0`&O*Xs1O!H_JeTA)lLe| zcxAGL6$TF_Qg6vsh=ni#EX5L55V=bjhL$pI#=fx*;^AcXxiXUC#R7*JyAXoW>+M0i zCaW?uUl9gAg30uk-a>IyQ)El4PDYidmzyuq$ZBJ;@0)E#5GLoPi(1+113`;_DO}&} zvsWihfw!&vo|mYBH=rSn--g}ZmV?}orkB3u7_cb1vdldfY8)On#v|HAnnZ|gC z2)Ju_jeF7Nun4>S=&zo-1oP$I_cn-5!A3zyNw6Vc>;k2;$m1mCDOO21U@kX7xYJ^; z21;xKe8b*yZu45erRh}lW<3vB-{ZE-!$JSC+&5pR+kB}ChZ|ej%E9)&tvqe>_8%fa z^O=|NT(ER_o%>wby1r?zh?|Yrz~VxJPf}rRAt>ZjLgbI9rE6atAD4Wd6 zI$m=>U7xaBZ#ifM!_-}MG&TZ3M5say4!0XA3OKof#ip;Tz%{>1*HaHWkU!jyX{X2F z!)A|A&0*}n5hXW0=gsS{%dV%*7YuOkd(RvZsOL}bam~O#ehN#{X>#ng+evs6U!`S* zx&2<_cpUN7r+Dq1ZI-I?*Pf(H+>N=A-p@37fG>Be_t~Bn8C_1>DMV93&T~)#*f}0P zJ;(1WESEcVX%WiDo;<=Wwo7TgBp`nGZRFFQh$#EB-4#fV#gT`NDRyyV-FbJG_t_o=1Fyh-bs+^M)(C>4MAI zOvhFTz2=`9gyn0K{TKe-1~7s9Sgwr4px#VT&TJyIdGqmX5eJMLQT|pNw?h!0DpUopR*)+`Qoxzczh5l=+hA)_J_v zG+DWaa{Ya!;Su7o-3XcOX(D;M=^6|lv#NT>>2BrVbBs=Mc-^o4YT6pTP zZe$UD9)_B-_usA@dMJ@GpC2xqUXd#Y`hwBlPya3syvzTponp{2f;=DBQENb5pRK7= z!i_$$;ij(TYBk4q`ki2Lz)5*M+|?OjcKgK~ zo5jahf=j=vkwYGb75$*$j^whkRgX2d+jUf-R-4-zC~-v8^Od?*3gqy@zewYmLb>d6 z(%_;{3wXdcF-_JirwJvsFtRY*2nSq#syiom9m-OqNJwa7i9$8J+TMNFBGJmCX`|^V zaq=)D33bl(pu{Cs&!Zh zUuj3)SRGkpFn*&k`Y)NOVQgRiXxqH>0W&20*({^25h z@xp~Ia&Q)pZq#$1;G&#susPqDsauN|>ZCFBnuy%=w_Ym4@p#z7x0DBK3);6Bp(da> zu4HB{&bB!0Q?Q^UB?Nr@vYdniKJ^rXe3^s_DzbhO@p>KhGl;ufG%j_OQ%g%CY>};j zgsgmE0C+_Bqu6TADV^_=un~p(#Y=&l2M<6nFloIVW#hJo1MJ88y{-O=cyRQxIqy2m z^S;RRZ+#578B5Pyy}7%gFnpF<*)Z7Sy@Si_8zJ@?J9VRd5Hu z+^lwl$6{pJsx5LURFmKl;>vmliFr8xZl~EDMN^MYA$hPf(AKRq@qAr;Pdm0-|I@FM z#PmI@)E*Y8y4HS($x{e3+xdb<`0e5@7>7iA$-qeVa6=#J_s*;w%W}iP^(zmO-g_O3 zp7+DJWjgTTZL%g57LI z6&IEJO0}ClV6r5MKt@96Y1ZSS+EHbZ92!`%_(s{C9bcunv&D7%2IWkM)ehz~DHyo! z0tyy=+ckU|rIO3a?|ALH_mvXden8$U#egt=ypPYw3ue1(JQrZKV`)D+XKGCK6NHWg zp=f&yt|an5Emtwwl#t_VJlJV_g8Xf93_Z?=fL<$kTvLKwm5vvcv25v$b2z!az24Di zDy9>NhZA}MQ=J5D%aOoWmh!2X_2(g250Asf#0y}06|u#0DDXMo@dKpUb$z+{DY4{~ z#@m{!`#2o4f|KL=vM~X2DLf|m+`DJ$-7%dyAJJ;dJh>R}%S_jsL37dky}J5$FR9@` zL%7@Fu&ZWcLs$I7duv*DNJ-}#lzIY-G5jEj!_ zraI-Z!>+e`4h!`)-zf@R)VRvw)jD&W*hw%d_10asG}Gs3F*|Qf&}VUX3YGtH;>)c4veTf% zVhEy2Yp<2#b1-7BO7T-(K7uzIJ9J-Dy~b=(wGOZ92NPiXP_ z2ke6RW@jV(=QG;nlfUHzue|~V^%|WgTs;O$f+QOVE$9p;;b~43bp-?GdT}l%h@}^~ zr!sXyRYQGP3+U(p$X}2JuyD`MiJ6wm^*jdXKXOE24HfEB7UbJ%-@N2|Iq}f?=wK($(U}en zM;Uw-8m27j2oqX)!F{nV3_7&!5-_~%d~84Ow593{Tw4(l#YjREy*atPx_a`EnziD5 zxv-*~7$3P5)(E&cLXTDx_VuVx9hn@FuRd+}`L|4kh!mF)9h1Zd&6$ITNl=u6Y4Brg z7jk-qkUL?bsBp9OINH>~LF8&pyVAZiIqqBtKa#=r1ClS&Y1Nq+aqz`gXf3E!Zqa;* zePMguRLFiE?qRx6o;6Z!1$Zl5T*{xL&d4P{g9w}tgYBeT96zCZ(h0aubt?0D{?q2o{uTkf3C6@tB)9n znDOUv%c+r}6~>*^Qd03*@h|?yENp9A*AJ#)mrni6!3VC+mN+9(PL7zeomKmHf%3sw z8i^G(+nMPgTzwfgrAnPC3eX+FD$|FI&KqoWg^BSI3>Wh%BQrL$^+7H2=IuS4_RS+Det_h5KGO$FBQ!-B@FI4buoR) zpXy*2+WY!8kO82LF+kKBZj6R22TGL_2?0b@W5zvqy5X>8X!gN<+nZaTxmz1+PJ|zgA_WqPj7iX`3UrI# zwz%e8W)Z_P4>0ZP)=Nt}s;h5MC3r0e8oCrF-Gs)Xr@Z zq!?}e9Q>00=twdM-*@W4*C`AG0f0NE$avF6#GbXsw8`aB6D6slz|{~6+N_x~hW59B zWQO)rbo6qQ&#B+;i!LUHJx?RpF?%CJGR}7E2e4@*Po6x)LKDu)+&-=G#<>aPI*ccf z!zDroyF4NBCw_NmhAq|4e!zazVI7QFV34cnT3NK88W}MvDp^txFFP3cl|i4W^A+=W zj=(P<CFIlTGlSIT}RAf)MGwgt=;vPU<~?JpL=7$B7>|VuD7@ z!oh0RTh!V%^Py4=!Ks-!!Ru40#Mc|PTEv!DPd z))!KRE>aoTl||sXNys`iItPzLDKW^hN1j*$MGm`XmF@;{Vn`_?GAATMrHowpAVrIB zT$7Zr&jJmX%!tmLu8R&2_Kg)xD~cUK0<{QEV<{tN9X!UrI9=` z{1-ynsn*w~q}F-7gbTmyFFwG>!eaJ#he*fgDEBy8zJCl+FG63*UA3_{Y^^xQ*a0G-}iU*Vd-5gf9HVrGH5O>UX0 zULtVD=oLf>?RD^c`M3SEQe`&T{Cp(VAsQk1Sz#Sclm;$JeiDwwfxpYwH};2$&Z5WT zC606}=6B3wjdVmU2)YrORH;+^(_h+6b;M9K0b{cG!7CGO4+jw+GjtTOrp_jW+^aeo zPQ22%*;y)v(~DY~;R^RCd{nIon?G~2{(RmnIiBF>wz0*{ZQq;BCA=7Cq~jFGD#2L` zI!k1>uu{vylyCuQ_UE79FKx4bgZaw_cWWJjhP!Y!m+wcpnqLCuQbu;}O(>6-Y~8TS zF%yp&crheYx;K9<9ZyJ7{ApOM%~*QAUV{4W+;DT?re|+wQ_(2%*2qM`^KW9O4wtz7 z;;fLx^ee%$sI$~a@0^O6tcQW2itTr?IR6gU;nIwDy`V&95v!n}b(@)Nd5`j+hg>ah zoW!|z{6zTGi@Ov-y?4eX3ssj^l?3>CtRX$ye+2BYlNTUFJXfoII^ogq58UJ9l&;JQ z@vaM{2>4HJttrm$H-eC`c}TfM_ow5WlQk%*hSEspGuDhxqDY&dGt-GYuCJK=m7c|w z5P8TcSQuIZ4!dNSK;Utn6^|igK zawyQnO3q9oRQE8KHwBb04XKAQ=48L@SGv~vO7^mIA7k1X2ac7|1N(Ur^$NR#C0!W`oh_ebDiGTGL03a7nM*3YTM_*1;l;! zEVbdGjtWL{YYjyUEpatFH)*v*EQon4nmKHTj`Klta$&r(6h6WXsKeiF`@svY-%}y< zN;3rbYX(|JzuNMY4M=?%`LgAlAder`dz{VVC@%x2fzYZEYAk*kKc?+H7g6e`df4Y( zN5{7v44JCeW5OzvN6$pVLPpKcO%|iTyHY<~QsOj!iuQ$OP=cP9kl8x(wFw@;2m3$XJI~~7r7&#mZYrykKxXV8weq#}dLITHDD&~yC z`V494(w{9P+mVBoRN^Bl-Lc|UaEZLEki{Gr6|niVO;krNk(Wrqh+wEJYe2+T@o z80mOl|K0Gfk1pS3u)-g>+^W}UEJE(ZYlih%*$^6uoiBunv#>jp6GY~GLc;@mO|eeB_-vC?Wwi81ADQ-XvSv^mpgV4 zrS{X9%qEkcT8JrLiPtXxqmWwQ)!NbT-3*g1Nd!`=NaR?))_V4ED3g&}jueoD!ilow zk#3BED_A3q#EAlc2tpHX2bsWNkvS!eVE%c6$Phbp=Wk`_iXj!w{@II3>V_h}dH1i= zAvO&q^)lu6wHc73h|9s6n)ePDi|^@T!70VGL!*c zB-0Oo6$IUP$bNdnh>|=68-l_K4wxQ$w6v)*G1)kPuVn_-O+zTb(}-Y!vaG_6}<3`Ub)y>oWMr~Y|K zEY%H)@fIYE9=+uDJ>!O!D9^97`~zNaq}$wWb`~kUJF=;OsHxwD&MlnWsM0W`VM~H1 zk8@t^Uq}hN#ZYNQ4@afDL6_`oUZNtIL4SH3T{9b@!P6}x!i(`WF5YWg2Y8U5*A&L2 zI-O}(Yu$H9(?X6OH}EA10uCj}2!$h#LR@CeJj)~o%ME+XJVSg%l-qEpQ2_#i@h5H& z3|#gdevSpyD25Xieb1UhY&@OH+!1H3_vq<;-7_S00xB$p#u)`U@A=Yb4K zg!4ZH{^VUY#R5X%WC9VN35WLZNpvq7{?Dgbg2L>;$GyP;0B$t+Z$b2(aNKCNvrHyG z--uP)Zrg389s+H;`SQhYDBR%DbgGLL_!BXJf7(K}$9i^p8Is!&0F8X4*H`MST}>FB zGl-p>kxU7nGIG1ZCESejt&-l7KFgOi~!hx8o(BLK!RxBOhv>lz90m z^DmU&Fy=gC&{ICn+b!p6OCV+R4B=xEp%upkFN3Giu&Ce(;Ru!SL#6@J01OGVBucoD zr-#)bN_1#ttjqv45(#TS5Wx9;@boVEM^NJ5OdfPJ=u!xIB?P#ZO(pWV%j_h$5K_uu zLtP-`o?DYsh`7p&ps(izpO8lN7gtZr!ts&3YhBAr|930^(ENb8ZtDPZke3@gM1&C zaP{-bk-)=AVytgY<6Qf>4rCugzO!i15EzfRIf~%9Q44#=k;4RB`!WjmDfOWegu_b6 zboZP8MWd9JSpFne1D6$nX&@NNPb*;@Nt7}fT~(!Tw2?S~=iYD`139JCk3h}u>GY6b z7;<3Yrp2NkR;9&4_-aOn1^)eu_W!j}NF_{sYuQW($$kdua} z^_0=CY%CX#D&`X4w|~kfN*vAIdIba~n%B3GXU2$Vt7-q&)7SKa00%U~-NMMMxdYn} zaST6QEBlJT(m8=4OQ-I+xstHd2Y1)nc-~C3Y|KFYe@4;1&%Kfhq{?EbvKR0@d zIs*1`zhw;VQfM(UhoV4l-+DR2WKW2o&0e~`vSO7&$*^kK;lDWMvZdd(3PHrP4BQMsVQml{E0^yxY%)3rdXq&yo5vk!X%-+ z(>9H`5i?etghS7MU803YCnqm-ZHOs1Xng&%(*iJn;#K(fe@7V(kN}uhT~-exK%_OR z);h{B2Nxr=Q8%WgyzPznv_+2wOejFV)oT|KN&0*v81US@y;HX?HEG}h2?(09KDMi| zw>x%g`Se@W&mWrI+;p7IUSrN)H_nca&HB0VvbwtMyzV)Nft}oYet%3I!QcKuw2^5& zo2#KOXS#b8Mhxgc8CzbiSU83SBuucH|K;N{Jwyp~Z)(8@OrEU<-1*&iAUD_QChD{t z?#iVitGyR1S6qYy3aDY^W#u}zxvz1u?OnB)+fkJd2F7CY9;$o&|0A+uV!*~iD zdlXb%+7+iE7H;N|%#n(vmd{&M8hhbx{n`dzQ;YShcEdFbVw2W zJFYT{JNJfH^lzQ@8wDvDLMHpdw2MvE1wzC4ilQNyI&s4Z^rj;Z|f`ZCBYlnLpfS*7H&^u z-wp$Fo7rTa_ZDuqUuzH!As!yRGiaPxoSlIN$WBcmOGX2Slgktxk91MV(50q5kp_L` zrD|T06)vJ|MSH0;mR*a4g7!!J#)ug+m+&kuznzyxk|-@rKtRaL$!zT`|CpXtAr6+> z^5C%Ce9ADh0CuAWMAOuY> z?@#l~S{)*l_vvMq?XFATZpn%mb%|>FgdjgV5`Y3TnV5v`=S_F6x=9=2mtH4~ZRggO zO&O;Yo{j6C(dXMFOw7KJ@QsnO!Y*fO*z?Py`4@VonaAtE(~2>h{`i5%Lp1~$H0F?voA34t2be9H!+qiorc6pO`HBVyRz{^<`ERUCbvD|Rp4_LfKyd^JloiwA^r|~3I4rgq?zIfr;czK^o7VNhE$NaLN zM78vQFp=F|RC05^l>Z(c7IzmXUpA<1I=eWf)CJDgURq^_MZR|%oanUI=s3~w8$i}U z{%!&V$Om!rvjz>5V>9Z!eWV{g`dM?`HFJ<3FtOivyqu7f{qsf@%Bb@MwL5l9_7cEmRHQ%Qkk_yd-gNtA9*q_Y#_ve)0D;)*KuIUk{hTq_s1R@UgzabcU z^XSS{T~O(r7Fe*BL5!x~LV%1S9nPOr-R^GjrSc!fED^QT&7MjAFDZ8><1H=m*1 z?{GLS4`(Y}wu{OG;{UPegtbejPP{F84svp_bH`vQWZ`_JQdKG{Dk5M&j!*S}oQ{vU z|I;%6x9<`De_H1Mc2NFb8>M`HzVUKU7-#!s^r;O&qyUMZj%kDNVG$U_XR75wzuKMGN0ho6X>d1g3-^hddSE7od3`W}u z*=!05up+T)uBR;I(LQ$XM%m91dNd+-NhG z$#ius5}(P^=a2tHQ{-$oz^Sp{t8Hn6B}<1(GXsYS7muggYn(DEI?sSq0e&Bt(~qzl ztZnPRU$h}I8(626iNnqjxc!vTsIhz7`e#gRLjb1|JItB2+0%Dht#q(kSYYcx9zN*v z*KIPgM@F%QGw(P-0~K-XY2591ecYE*s*^P%Y;``c8#YBcj1e+q@HrdaHEqrL5vNAZ zTy3-V{4yYuJ%K}t^G;3jy#Dba6#CSGrm^tn@IkAs_h19$kc~M-gQhkrnR}5rVi;$T zGg1~x!ed&J@y+c-kdxbaFNBOcgre^G!M#n>a@Fv|ribzCKd1F>e(tWz!VFqwfQVuK z@yBi(pELRR&c<8oubt!N$+kLuqAsrOao`!r0~>CzProBGe%ipzW<{<^_{fb(OW^Vf zQ2LOvp|jb4vHA1*NgIJ*9S9ymU|Tz&6v_z_S`TaJQ<5G(#;fCB3EmtpTX8xrQChw4$(cBzm0pI@(h%{3vMAB1S(q^JSd$GQcGoJMf=RW5G@}}g zHG@;fv-bKHdu(E?5A~D$z(D7l@35{PyC60e}O_i1jL=1%-(IlUH-f%aJRit7y0WuYM)vqGa*+Kb3p|^zeO@ z8wzTynm$b~!9|ll9S&fQZCV??>Bz0x>ZhOGwW~t2oL_9-SU)cM5Xg`R0NE-YP2h&Z z{+4;{g3OorNiu?ryP6f_=TTeEnB{lL0mH`CLnj00%%3U!z*1K`rs>73cR&8)yB%nI z3qIml2iKNnzxjr}&f-&`E7zSzrHG%HaoACoBt#VDMXw|Q^af-X}(*?}bTel21ed4_|h z3nr3L0`r594YD!g_N;A-Z@Z&JByDA9SGvV>Pc|u}bw)KJBc3_}UU?j38otT=y;>Gc zUa@tEZFTpTSXx+J<>H2ep;3)HW^!yuy>Wkqion)Z5sknS{tK6ag_QCK( zrb*R*9pWNCS4e+pAkLq3rv?p})Z~}yDXBw%=lxPVPG97I9oqgsO~dnNj}n{5H%I-M zr9=9Veo?Kc+FzROW^-u+D{O&Wjo&@%I=D=GF}}b)FY%n;w`nsfdg_;=q)txBJ}qe; zJ$k>3m~wpjw4%3wBH5PDE){0fJ$@H}UYGlImjNZ4k!13-HI=r5Z%ENFDm`6NPc%u+(-7OTsx83TL5J}z{Ygfr z9IC~;y!VgNgw%@Ah=cdl_!(;wueM@8W&Uk4OJK)Nc!*!3B2)kk8-V*N* z{yp~L_+B%2tc>Gdz0XPW#^ufc0PXVaNPd?fn|`~3WHKs^#YxtZecdVmK;rn^A6v^4 zU_0+p3#yqpfdKS0?Dn5m@8%sB+Q5#*e}0_TN+M@*gs0yz_jD2ioL)N|fG7Zq&PBW1 zH|>f#EqRowaqM-E*bO7<+FTotU+z9duz;RU=H!vHPloH!i$5lmM#Rkv7TwtIIrwpt zp4D4#faT@k5zH^4++kDO>bY+xJ;&tHE*4#$7}7ZzGCoe9Lqn$#Ul{o(9EBPllYiwV z1GfIIFlxLSI(Yr9+&eA)0(YKY`R!bjnOIQ$AHYfHK9r&@(Bf;x?tDC|;fGcCtQ~(T#G0Xnh*&A$+g)P% zTi&p?rr*mt&j#Ojwf9GjW8rqk*Re|nlDf(Hg6rN7=YGS?xDiL8n*rEb{|?>5_m9g+ zA7A&hQ%infcJ?x!_uS`FwuJA$7EJ%$C$CyJP1xn$y#fjvTkh0kC>E05u;dLi~Pq)+ir%7X@tx(0g^y#1^Vl? z+KndTnu_r3K+hq1K#$u*I88!faY*m}*wjTBhGYFEy}#iIJj!tb z=QVWS@6-xR`oHbeh|&?=N3tl7X_Yu%`8nrGj|1;!E~_jyABRUvaxVoVha3Z(?77Pv z1q`+Dn(mAVEq&g@l!rCxq3q8~YXjR{A(N}MyvNQ7T)Xv=N2_!~Of+2qXOarOQtA23 zquHs^E%)c0_{7P$x$Krx+O$1fxfDLw$ar%)svNg_eaC6PitB4=obRCk)2hy`&bSvX zwp;)?MkC#OQ}qSpqJprMOy^>u^J0FA*s=Z&Vsonw+(w&oXp1F~v~z$W`REplZkN}d z*?v@SEnFcKTIhQ9`))*HMM@YPl~Gy0z$3%q?^Qt{@qUaJrJM|o(W-bH|ZG@CAi~dYwcj%jmdjp^YM)(;{7T z;L8=N8#iivcK=SYsTdRl53x`HE35s$U~9BqFre2RC!QEtUccVUgEyAOjMPl?yZTfG z7lornhK+?HP#;w430%KClr1eB>Gn4p+i1>j<=lHXz9Y!<+Rvk^a|F6N7E5d`C^B_i zetyJ;oF#B@^r6n^xv%_-(MgK|-ro%+_&Ht0b6)0ey!&0eWK+sdFXsAvmo}R}5deuEc22h~R82 z=h!Z!CJhx-9rzRnypJc+&0l-o$QQiXV?`G*?v2?)g9k{%mxmUvbqF86wZ^;}uHavu z+hqOWz}wjP=o$+zKQ60+E-p<=%IZbW6PY+KR}(&MI+<>j)s(yFXW`%eBZDX>*{I2I|K}>G4mJ4$_lp8H50Gr@ z-_I%n&B4y+hb}5z;us{OS+AJu-n7Iu_rAihxME2NL)tB}_NMNM$+p`FtHXxN^WpB} z$sXHVxr~>wm@Ea|3+<_IA|QR&%KDndI)@&*NjYqL-*+%xpc=&K)~Jt(NhZ|wUY*3< zDYvA%z@C$rJtApbaAp@8;qf{6Y(xU|Il9YOS)1FKgqMdy*V=r2V$cv-R-R}jW>|j7 zO33e?U7FjRowk8Wi!%PW=|nBpv(hwut_aOVCmF_b%&fezh_6 zcUy$qG&-+~)m%q0y)58n6IchTJbu)0oD>w?xWZP?nq`(=$M)lVrI&e5{Y7@{`jrr? z=kxyO_qx_!yM2&e&?bx4E97a4Vl|)^kE_uQQ}cBUZjZ_eMbd(N;G4UpW1yw4tL|fz zGQOEZn^%*uEY&~7{OTVvKe}%27fnmoTjaj$&7=skD=n2@6v2rL1KA|h) z<0Gr@2ev2%ZnA%qM!ufFM1CRL{-*k2rMpnshtNDXzra%%ub6n#1u_mT&@1$+a-=2Y z*XXr`@M6gaF0Cx+>&~UH`UcmvmK6Nnu$V=%$vr-X7vm~DjImJ|90`X1E@|N+H?w4z z{vb7WJQSagF=SRLVF$<{JmVz0k)S)#mr58kKhU`R;QwgCA;}yQGFavpR@UU}75MX> zS|x`w+%qnLw++l^eQCCod^#RXmH_bDWz}>-A&+K%l{u7}ltmEc5HwGS!v5R*7=wvj zCVS*`>TjJp;E424R{lknw8q(P)WOB-wT;2P&&ZuOK|)%6hV9u^v@bGEkEqgmZpiHS z9>DaxeqbHD!K05c5szQe>r|sw`KG-6O9pvqOf8x*zod^1bvBbBAIl7k@+A`jspUSn;)Ftff6bh)7cyS2n%Vk{Fst1~rasJcROaL`dIc%} z2XjNb0+@R-nO5^Jd@Lk%z@ph@uU_Bn)6-<8$^C zC8<`92`f5=G`@XS<%;Wx?kV}lXIvEg13FYiTuLuMW7;wB{Z$G0;wQypyKAq)k#3H3 zk%P=53xRzwHKTSk?qKa{TAXn%`y-x^1P>`!Kp-)0kELT~b$LP1oXTo8{vukNfk#rd z%hj)w^V>xgL7#ddo}9+P0Tl!F#M)pM9ZXug3mL!+9H#%(L2d~2RVn&0p`AAW{Zs^v z&9KL^J=lzK#i>8M9w*@QV91!yHGNRglaxXxNgy2 zFSw#`~YDvw8#LvWD19r+{{e<%|-T_ z#&IQ`jO-PHCa3;cEGht@kl*+rPFPs@k<{MzWK63p)oM5qt8t^$tZffSIGSv^ap7zI zTT=j_w3zpxN#}O}K8R~oW1YimcbBC^1~uK6Wk_ z_0Qkn*tIyg!V7t-+h@j)TK6XjBme=gB`YUNW7%{1>VkZHU6eG2d>Sl9*Nz5!o@>B4 z2@&uKo|7LCRyLlWx2LU7{8jK77?9&z$x0>*dynSbQw^0ZgB*{GRj zrM6So`jYe7t{0Vv0HX3bos7E~7;U{RilCk3RK7*?26!t+=`0IyvQgInPe+}+*X-QA_| zf?NL^<2GLRz3Nq~PUFai`4K?Y({Q^g`aCAr@DT@TkF z6jNhVUD#WA9Rvoz$C1->x*OXQ0j2P{YkOU*K?Omki4^hDAqS&rJ@rlGyKJKtj*IDl zZri-nbj;TIe1;G*05JYxroO}0wU?{qnr}E5`%XYe=;Bdjxz3`W5Lmh zmVIT3mT|)uEZw5%#I^oMwGKxG^%JhI4l7T0_X}6yifx1CfF#VH8**M!o0TNCx3rCRzy-&!sp3xekq84AT9EayscZ-?O{&byE*wZS z(NV1&fM=FoF8?h8@F*x?G?cshJNbA11s#uukQg?VJ*Z<;vW|mqfRkf&l3R0mmeaT% z#^1s*%gsKkq^-xc0Tzg^jk<3@cjf$)pbG16*7|sbaIvnp%Ini%?3mT!XP=c@1`8~w z71Mi-iFRQI$Z@llBLLGU`1q$67LA(AEQn;6&xL$J%buDin$5v`pD}#V;W@s=@O@Di za_aWInoF|zdI;fW&Nw`tH;2ak6GQ+vyh3etbrJoQt#@$_FN=M-@PDLTaJ}{1n&(Eb z-kVZT2g327`Mzq*Rla3xyy!K@q64d)>bwJ$J3GYf{)3Vvjo4k6i?=c)`}G0tLt(t+ zZJeBfd$Y9nslY7tD!yLowyJZ9!K;NemEX7n8t7f`StJA^x+2z{cSETCm`13__+ag(l@Y03vd-^gHM8U)>Ih z(?{HlsI9oUd|Xc3RAA95u`Db>#6($K-i@8zc>G4*4!>BS>Ru(3&0@W5^L)=QJtH4Dx6kn4pv6r!2inQdiGSjAhSQF zmyv`wx*PWUlVOlZVk(jJ04g?W{RZS!v8(Q`YRnKZOa>W;C0Qv!tQ&nqqmG95;pK0e z+RC?^M4Q1d)C{?wp0ACMQ(=2#yt7NB%*u+7Sd1#pFyV%wjgi6)I zJP-rY5)0-!f>9$@bTS5Kwcq0ru0Ur-YLgIj7_NCgspu#M zyUs8YKF|Q2QhHVuLp=uio@0oTpeici{H@{q>!7I3QWI$>qtsOXuWZ;_bh}84&fhm* zUKnKkPD19zrXOmm<7}FL>6VGJPj*G8d+mgISkKO_&+Z$2XtI{`=kuMqX1G!BSkhof#>uho?yBTjbJ}*)>(D{jO@84thqcjzBB<1cv-oZp@JO_6J zp0#Tf2Lq>!rmEh_7kx|Tn9tEs(jiyJLHr2cD62&XK7Pk%x3bw zT~MZk(iSO^5Ch%uIlua^_gR$zaXd^4d!Ef9b>x|rlRukS1?Xk?LZ3b({ zQgsg<`7N8m?0>&R?f8>%+y>X>z6}RZlXDK#6EkQxIzmDr!HEKw!7KZcf8mfsz6k5r zQHTO$h+*Dt{PsTNd8E`p_S95I0{u0D4Km_tG;E~kb1;eH)easK2fU3bM6#i+vO?a+ z@x*AulPvV>M>x?=p{bW?QuI;HmdfMZ@Z}@sX^oDkhAT} z9UjnlW4#$1(xKZ3e8f(f{OX(i>evKi>lN(RVO{9t%2-Ghm(u??gl9wfXI|4=pW3=u z_rWW)blUZXFF*0Vii}QC3@2@}$rl@jB^!em)WYn{hV-CQ-X@Z`ze$}}a6l_l+FUpt#Y=~V+17>d>@IsNc)A4M_nP^99j^fGVV(Nu!-Sq?ksWUTu27>1 zIJ0cRaF#vLkSPG>O-t%G+-`-S`8P~BvP1cY)Jc}55?iSKZEGHl-IbVzAfUUkQM#sh=J?vr({`e5P#QjFT>4eE~16yh$j08qk%~DeCo&o}Z8GYQ={J3mh|i)sr(!;^;Jmct>!D7=&F>NB(F*Kg($vpPEJbJMT@$xiQ3 zz_S(t2LSj=O6#avEwH@W35js6srMyZJH$Z-v}p^xz)J&m%{%1?q^%d{D|U}-CoNHa zKD&$g&6!)g3SLhS*>SkYQR%d{pcmQ(>1D|@tCcptn?tUo%q6GdU9XPin<2u9_L>9I zHsoD`(x->E3Wg2b22Lzu&NX5cnU@NbYN49?5-)!=eNwCE>zOkNaGP&MTXt>_67Z+6 zB!A#+K$C9V_Rae(YaC(o=!~EnNT&j=nYLYm>%IK0yjza=>4{1i+tt??aUksI6|+eh zCAOrolU?kyu6JUA_nCbBP}mOrbbW*E1tLrY#-=nGYkM1fa+aLXcASK^HHtQWcbU=& z`)SGpS?+G)SK}c5Z)IIS{PN%LxTZ1@ulqe+-=h;7l3WOCse3{Y#%zgN zwN>8kxraV99wb4X6ed%Hc|LQHxBKlGH>04du+-QQGju%*5@@66EGhb8!!Kv@t_*A4 ziio$?>G^6z4F=$rCs_g?WjmSR`7c{ zey10a@B90F@oX~Eh}-FNzFAIwQ1MW4X7T-K?}!Rco&s5M1SYF_bFr``+R}!7pi5Ar z#^=pI*Pi2pg2U^i8Gn@A62M|*caI1pQ%Uwy*Zpj%tH}iq{(`ua83F!Fh2!ZR-u0)$ zo0Hrfly^n#u>2i7I?Hf?S-Ur+om%(UO+oQW@=jTxdyh4uR_;kTE&$r`LG_hd+*3Bw zah?x#+b|fYh!myE^fBv@5N>}~M~X{c^=qf){#FYqyT`O$%xZDoY-66dfm1hno?Y#; z`m(pMadmmI;l*Gw6*-g*6SNgY9xOlW=KS1LOjdQj_)Aa~OdR;$%!WZV4@I!m$xK$# ztgFb$^<#ff2>?hzx^g8RxrILBhzPg)4Fu9N;6a==-67N@x7qQou6pi+;30X0gDD@BVJOus*jgN<+HDfksh2)CEKyj66-B4oHC)Az#pD@(Q8{Zahs zZNQt`#YwQ18uJ7lPi;*fkZVF+TiQ8wES(85N5fe8V99VLcEhiCx@Dho5S<<|F2#TQ z0-O0$rWwB2Qd0Yuz^;oMnS#znu1q0>%cT|)|`1AWq%0Zgq9FZbzJ zgp(hx*v`c~K}HfiR*A;%I*sLf{<7zX|E!o%A%R>vv-d1HoE{s;_JX^-^cXf8>%9-2 z%`BZ!lpnE}eTOJUGtbJj8w{2*7BYENX1J$4B_^a=&3aakX14lpbzPC?&P;HFz27BP z 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%0At_^%lxheB9f!knVK% z*%P0=2U?xg-~^gj?yJgau3B1pB)#j_qW2m^s{&%Y+Jm0t!c8lCoET9j(O4m6ZqBu+ znyTUHDA}L*L`$I|!x0;+it}506YcKmvW}#|bRQY%Wo>^Px#9GOTgH*633AJL7Udc% zPVFRXA-s#F%$(AB@D%Zip7P#Va~E9NazMjtXX?z~RnR*A@$+EXLccmk+}~k5w+w+h zzst{4o(#u(?|G!NyAC$xzSpABSZ>&iT-Mlg@#LMM$B`)Hre8l5+#HQiHTV@JGOn#W z$;Q>Jkcm;VME$FhM6!t6a*VZJnx2NGiULY}EQX>T6Ni;qa!ljAq-+e;C&P0?;Zk0x zsK3|dw4(~oRRMim64H^ZGD&^}MRq=KQ`7P|EQ~Et-bm_hl9c;l*1^E#?6)$@qT634 zz75RCFJxkjKC9>B7+G7sS)6u#?XHXBY-BM>yVY5O`C|4WR{^GQdzx`jbGZE-K*{6TKA)z3x245VC7>Yg-j zP@?mpcGees`BQKYZ)2q)gi|^Zdi&6|)>9x?$yx^H9)eIr;o~hT`$lYay zp+cZWtj*P2M)7cDmt5k)SB%IwDQPYqT2m;8#$%Ry1Lyw4F+VE!qmOD zfbNnY>5}>(h|45p#+vhdPH6;HR^ik2Z1T_GV&(COIvom@TJCmFsE6CdP z(Qk7)i6x%qtagr~LDZ*{WU@_jsl4uP!pABs2p1oE^SC{R|Bm4J0EwnoWWqj1i)qHj zlZrF_iI53#JtFKD-``zHrr5(G;zzbEE$}WeG%8|HakD7?=&83RpEugpAqwc*?M$8f zaDX^JeX=cKmg#^sHnX;dN!ml@1pFn~k2@^h*nV^QGfR-bCb1mSz3bf2z%yD9wl2W# zvlhi6ZCVIF8y5C4o;V@zB2s>O@N#BsBCBI;S#xEEN#~s{!R8i2j2fslT3tX;r`@UoC$N`%@f z@hAI#R$(72&6Z28b_VT*k=GwOx(~-Aqi^`vYjdkBd>xGycQ%bwU_wLkx#a~oK;zBa z6N~CZoV~&QeY=jMN^TX*oItpTE9|+W-JA(sTiV%ArJSBwxV@4HvCOC_PtVXlR;gLU zqDB;|a!~X_afnLeb7rkk1DfRwhrQ3NaTGbfy`R35B zg$ocav2ZlHK&6`Q&beUd&g-}Fj3hs~@)1p1+;d0h8K@_s7d!uFM5}bx`J`Mht6^fi zkeV(bM9N}&l+mHtqdE;Y%9Jbd1U}*82k5qE$eSt!Wky5DxvBZ2@ha&BZBJXHUn>^5 zUj|nc{B^r({(29cG`kcv?%nPQkH+cTm-^{3?Fcel9SM8bt*uYow$h9koYJ&?1I2sW&bXr4jgecI8nRLPE=!K@H{*115aF^XCEfx|^;3Hv0|4uF= zKj80jdO6GClW}&$`e%l_hSoAFPy7#N|5gPxY%p1c*EYJHW%Z%apXoP#d%^{Ln9IkI z&){JmE5UT;Nv?k0Xypdw!Q3uT*omQ~29n=Z>-csW9m>xNQ%2y#O{PUS!iM;H#R$Q;{k7GOf z>r){9+ei!y;7^==H$qY)#LUaf*HR-F)UJ|!;`6-p6w^DcpXYI-1Jx8rzGL$-@B2Oc z+~4kz#f+t_m?LDaUMPbKNTJp`*ty!tG7e3V_+sy->t*#_+sDGc_To5zMIvh=a<{;g$A7?_(eG(f6GOyK=vJjYWB#)L_9h8$rN37ZqAL> zYlF{o2j(i$j~Zf_@25sYk|Fu z7KhUo8A2HWJ>QNvL+CB&Wf{ziF0-5St!^h+>iT&jHj7_+(+Vbl< zZ|TJy&24PC214Mu_Ar%yQC6;km7ex<+4Q9DV_dc{*Wp}Q->+{P!ASu4+4XN^0_N)J zGL6nRIzy9-94$|+OP^WoJ*xfR{5r)zp~g_B56z(;{^gq{yfaHvD<7d>z1*-Decx)k zXz$AM-J#Pu8|Zh_N`Vscu?Rx)Nr@`;q=IFs!8tk^2)mZWpXoBxDEWwn{n&DJWL3;g z&~$ETSIV)cux_ZJsMuc!%_d>Jy19a4%w+?iU$cisfriJ+%bhAou1Lp`o!J{|9z8s^ zjHi*LGDQ|P6$uFeo7@MU)^3ukza;ZLG23xXyON33IoXWWPYx3gmy=vqXC&0NUavc< zVaDA(Q=VLdpBN^?2e8saoxipLYfX<1v-X%RSKXl<2U~5-la5P`ISB_PN*T$NcxV7p z!DjcZ^m^|dl7eEWkf&k%TC$i~Y0Twy#4hM8L*L14g&%r`MZ&$8*1pU9a2jjN-&DK5 zftvUvM=D9>4iUwRvw!tCD?>B)x^%xP*3%@;9X*X&bth}~L|G;~>u~%Y<^gFc7(p14 zv9fQ!GyD_t0Zryh;RrS^P8Ko2$EL*{ZI9S=Zgp7k=vub_9Qj#JL{d*x)FTm7C+T$M z8?li8dTCeQJGoXyW3k`<%NsvQT1&9(pdfu57-?t3&vhDBz~CYvcsSHhPdH9^i0NOy znN*6ICF&oA)+@D@up=Qyf7|>ckdI-!bu$b$Xc-BK&b?6!m}VMw8x032LK_kE$<_>` zrw^xRD0*io>L)Wk!9UI<*zyuCD#yEdz&}pLA~X9OED`k}L-*SeDt6%y@98-aycq9) zFjl35g^~nSoHm3KWt-}q>WJqd@Ju-6GotnJ$|12!07c%$3Ps3r88;WbXJBL|jNnrT z;`={v3~pW3J&QA*|2$jw-CB$HaD09&7N)9jdIl1W)M)TK1uZ6px!vHWt_Q4+ z%@@njt-F@aK&bE))msXx8c%;z{=NF z7w4PHw;;N=GX`uF-74*KPUOng$U%TgE49hRxyEm>bfO872OjxoFQP(gY8Zu zp^zSV_|G*eAPM00Vl@WF5GMu_0I}603^5At4@cay+j;lB>>R1Rl7it6$%irjZyzP| zhs7Cx4-{6_Fjv%~HLqT&X(ydxsedO9+q!Rb74UnE&S#W-PQ>y+% zzEh0D`y-x30RYHuAU@PwE4~8Z0Fo#{5;e*=zX>#(l)GNzlCamr*|Ahc{c1!|F5~?a zul3QZrz|aQb-s7*ZE|Ff9f^CaU-vqT)6t^*D{=kK_-LYpnm95H9e*$BbV>T@C|3Ou zJ@_*h#*_PBi_DMmTZ)oaMfp47N$4~KFfvQf1!$Zi4Px8qVRNc;NYo; zIoPgJiGx{hQ`$Nd-xpXy-Nr&<{N47Z{YM&JA-85%Q5jX-RHt)JXqNjSo+>w8yK9 z*S!~~-9o9$`cIqsZ#9^0LSQ+CEWqy*wOJOB@Y}p=6R#kq_RAp6-Kfh@>#n%&^JLex z(M_@X8Asf7AkpF+xqb0lH^=!*nJAfO&htSm^%p)i7@9;^7j%EuNyS>@ z?v6UVr0?m;`3?{}aZ1bEwN1SC*NYC&;Qr)tSX%mJA_B$RJ%dPN^xymY9Si1FYEzP? zrGcB4rRy)riv(7=Q%u&RxS>@b9w>g!g- z+|n$%>|xH67J-4hD~k9W=QA)UKr;A<5fRYV?u*Q_N+0c`-A2D*erQzLFXLIeUx=Tj zeOuAo@vl5snWcT(GFxe;E-=85uuO_Y=vh+#c$SJRs$sc6^&>H{k75@Ekh%D7(bhSy z?bAjcBGTl6dx%OPd`}s!0SJ(mWQ_*@p=Mn;fDmruFP#B@aGc7lT)DsB25fv%=48z{ zIbWW?!ms}2C4B>(wHaQ!!#Ss{@{*#ij<(mn+J2?E(wvzZ(P{7BY1!2MfDOCIs?`rM z2bM})oA1|>`p0M)iSY%Zb0a0|$}MW7`VSj;= zJF_?XpKMI0Ev}|yHFWK3<6FVW^X|7R+I+Y|`8&FIAW!-=!Vzdw<>31-1<`Mp*?;j$ z41V87I9l4A8tB~hjh8l!-eM^%A<}sPdDP!?|-y+1s9>j7ZWMz z%Ipy`h`0GiV@&Ua!)JIvxv-RFI~glqbLkkH z_1SmuUdw{HB z=N=K>I~re$ zafyno??JW*j?N-D_(*1?~EPVERyejY?omWg%kr)!sEqav$mYHGXFX;W)F{wa9DKpAUZ zX*^w+mQ$I{)6+q{f=xd(8)OzT?EY;#$ZqS0+I;ZRyO1rQ@!z!BrMwwKU%IWUkw<$= zA!eiRKja&CN3KpU2i1$eyXc-a(?kuCgKhl;`K)3**KyQ^HB)D>58zoIb`yz@Ons>q|H2 zKMa3)n4iFqs75E_^KkkSG2&3c&cR};^s|}6XRqQ+Jc{SigxyaShu>#DiX*%0OeoId zwm3D7$J4?_j_$y5OwG?@&S%U$lE`=@0s`RCT*T5cdfE(m(U0A{L+v6Mgu@&1Vqrl_n=J)r=@?y*2LB` z)=cn1LDfepf1C)cXGBAR2Z+g@*U{VyAamfN0I&oiIpHH1gAhtl5kCj)B9Zp0voQk@ z2e6kXva7BHokjE`56pgLN=pOX-uRpy z3@WYmtggI80^FeetHS#nB)aZxqSfiu=e_o8Dp1JE(-qJ&6=d=U?&}fJ*~$2WxA3Ey zsB?bqlUJj^OM=Bq_G88(ujfpVewe}BeY0E}KK=Y0iu3MJ@+a+Pi(B+`!kUIQt0+7G zHV4}%XYb}$dp{h3Uf3}cT;Psm=p|9PVWTmZe(XDeKMa6|2CJK1P(quQSk~INQ5yzy33LVErtQs+=Pj?G2AF}ILSR= z%fbslOkBXuanSZn<|b5y{Y!9E(0(40MDNL-p5(T``Vb0tz*R;{=f%3GdOz$Jm~Fsf zcq=w4$I}=E~iEQdZH746x?Rn;BK1AQfSgjfD4l&QxHb z$|&b5b&B~Dt8a)O_+#^9;Ju7=8FjdH1^l{%pRllqGL@sm8hn0gL05ppsBe*H)pk6T}mv@{#&g%O0pdJ{xHvM|vr6=)(O$ze`XE{HGaY8&%Azh>2!#PHZ8cV^$P zXvg&{M67&@j%2c+P&0h@4|l`;mvjaqjZnCW>7*IPoK8A-x&(ceL@` zK0!DjOGF-%J};VrhOVJf=^P(yCHH>)s%P)*{QzyKyp<}bDPE!aI0S^h(8!$N_|*`C z0f#M<5q=Z><#)=Df}V4!<_x+oBD%4z`Cn+h-ngJ4h1L3EA$-v97#k_oDpcBNL%=TV zHD^R5UO&WR6{6WN?WDmi?zdOb{`i}d_b?ZcT+R$7f|$l7NR(QaN4f{%%*gzC0F%ge z=BEO_B%B>(7{fU>-SX~Nd<7}9&`K0USFPyc*T`P5K{RFA^}TgUF;aI#h!tlX0wO|5 z1_3Iobf`OsSc0nng8(4nw=g1=6nOnWTwxN!nIIO0r#4qAp-1@z!_d!|zQ03E`wwR# zJQ9FtAS!^B*iQEChW}aA_*5;~Ao_E2;=p!`Oz1b7-{jDPtxF4uDxQ1mmMMfio|Ws-!-h&>@7I1C zcHh5^(BeX?SJ7x|^{wXj+zMeZedt+aL*@Tf^F_W%U?cwgudDB0O^~_X|6y|A0|OeG zTSNXhQb&D1(>*JJ;NmU{!THspZDR$yVXFgRTVfMyTgRTRE%H^(a1e3eS}MLJ_~Yu~d@M_Dku`>EE&lX0 zdsz()`$qhqo5Q{iASB;+ZOsUUy3>ZGtl|%qEgK*R(07%oP?Rv@4{9{i&`5;oZq%u? z5dnxYc1@JH$ib3hSA7uC6!Ay%92D9wP)o#D>f+{zuiQyL;G*DjiNo?x&;XUt2`)bv z(rY6rQ8P$JBz;eH6-3QQuan0(`FIR?Tgv!z7w4>opNF8-Jn^mR2ltZW$5|_$|3nG` zs8J$N7=uc+6fk5!^I9Fus^Z}L0afWhYA5x)uOwlZh}&p_D!6XcJ@vlO%n*}TL`km6 zvwVF6q(Kfe5oHayba*L;II_~YbfmZ!+ky9RaYTA5f4D;a{OG3L&t&{gOs`SyV=ILi zLJ)A(D%yzD!?oPPit~y*@CuQxQok1H6oI_$CUVoz{KuJC#;|e}NFWU`#zq9e$~QZQet3)?^{;UiwySP~D& zhh4U!-C>t%B#n4SS!A-C#22(TmMc(kKL!>RDn;g(Diy!u+PG^I#L+6hfw|;;+2im4 zGCK-vaX$g9uxM9D#4C%a2?1)Xs8cD1##nAyc$O&OQSO_Ve@;(ikOZ@)0JA!NC^ZV8 zT+JGoge^!V<1Jql*Rw;jSH!4*D8Z$kr_Lot)E}r&u-O`b@==}{Kpb{Cm3gkw>x5AN zA6Q;4gxw3NRlr53wVqsBUUG}P_(b9ytR@v^nh!l1_(B(10N0K6TGt57XUzR&NY6mh zok66Ac+hFXCO^6q5M6AI_#$Wv#70R=kiaoELo)s<_!>V%l209U-;URc5_B(2NINAa zr{P*LGzI`{)i*aadRtKfh~qmO8%OZI`qiAP7|4~(Ur^ot#(Rh>er!@%dAmb3Y?@T5 zcv)upV4T|6RGgjvApS_A+RUpt&+q=Ms*}3^+rwieYmqX4Rn(q>0^_Y+rlQ=Qtz$+4 z&P%WMcYaar*u$Ht1&^rz>$7C=J6=9M_?{pn^t!q_W)_w=f|5YSs1C-YqIs5iX5iNyv`~d2?Q$)J2kYL@6swN--@>FZmDs@+5f+HUtWx z3I&qbKx_fvHd6MWddW;Vz)S2Ga`@@>yn@fk=--9AOE)oLzD1y!9Cl0Y25P)qulph2@k zxz(|zwQ_aSB^%j-PUBJ%Gf5CN{FXy$HO6_VY-}?>zlVq5+QMT2vcE`{L0=wX;CbIX zS`t%o(rmNsSudXD+zZQi8^%YpE*javqmt?X5GWx8tnlE1S0YHfp5EDC&R2 z%uyYN6(0QaNk(P)I2iq$xZz!o_}-EmC?xW@u;(6kD2AMjS z@9s2JTsB<5^V(4k_<4l3WDGVY`!>0z^H!z)>P|Xk{eHeZ2bQ80XPx3bTDu(pRWu#H zF8U1!VmjzMpQ=*;>>hSIc(81K>A|Z$MeHIzm=V`C=nrVx)EQ zTi7e`Y=0jX)w=V7h45jovpvV|7muMh3N0-yi+b;|6t9hBBOKsI&W1;q&E&&!ij0L_O*gmH?4^dgUqc+fVVF#^`Ns;?d1so zrQrs+5D@@rQWGuu#{LI8yid_uHf&MLY9Xn5FS7;DNXy=feK{NOYY))1% zL+otwl%Xo#dQwNhxi^a?*0E=}^Z*vd+?&f@d3zZ&lG`T5TVHXN17@Q)tO&z%n`FWC zPOF*NKO^>IS;@|YGesaH1Z{171v%A1xoX71ESF+NU5a^}ngk}L_VpEwq}T|JI?RTc z3+DE0j?K2$9~gJWMKk2;(UR47Yu)iv7b8gVjt<3AU8^TlY;PoqRd@CXoAj6(Cue4L z!L_-hK+>N9(4)(Wn=rr*lgQ=P<4ZU^T5wHcTWR5Y$$N80wzazMgd)3Cjy(@=nPiMT zcpkt;L|w`D_t!jo#nfv3X7N-xC-}1!>YSe1xD;73bp5Q}rPbw~e3(uSi|G~9Q_{*z z;Y~o<`!f;1&D#hC;?`aTm|EAijhIkD1G=70))S%QXsPY?C}kzwj~oMIlJcyyWb|~x zdD-nH++g7ZMv$$fx0yj{*%_TeGbb2W-B#hjr06_$9}uxa`-=mne1 z%FHraW(6+8qY`Qv2*A{jan(LQ)Z4Lh)uN;Zon;>NqzLA;}Edd1r70$sS46`z{wl zxqWnS?D2^kMOXA+&+ACm`<+yl!@1q_m{)`bm&(RGeQNy5mF4BnSmfM)p?XHfj>@O0 zBo@RUlF!5>+`GWc-YrIZjCCixaUpd^gcEn=Fc2j zq>1@X{pi)lO+RFotR{G-B*&3&C6{r==&`l0w5cn3Kb(Lk5SG_1_^rJkZ~xKfBFKvB zkFNe@ljpm0IK1l*!pFi;|K_&_>!=EFp!3!s0U;qftoL(wx@I|{qxyecGGMVu?~y`yp;Vy4`5I z_!8Hi>#2(h4`E3zk8>Cr(GdI?Huy)s!ZzbZD0$jS#N+w8C-6lzTWDowhFbtMl`EMh zB1cP8qh1z{Ig;<|pf2mM_84p^NfTiAx8)_Rgc9RDAE-kNQIc3&Grt<~{meglLpb{Y z9JdyJCj1XFd_5>UCn{8Y?%U%(&boXn>Kbwjt6TbOOgKNX^JvOw#AFtbq@%_vwOYTT zv|=z~4jF2(EZAFn(7LoLoHmcrgd6hHKknxxI%t3Lx-LaEoq1-@iTIvBCO^j?h=x!z zf`b?aILr4^4S)|rbNU#WK>j(A+1}Sm7i$O(MTG3D%nb#W`1ej1i-*bYftJe|FQz4y z4?fHyaHJBsBEIUStw%Fyw3#vVJV4T1ia+N-Q+NUp8K?sg(F4Q3^{qvWyuT}+G)=wc z1u$I-Lo7A&di{O_DzZr6$x8P<1yT4v} z9R?J|as=NqRNr=Io3%67J!_YKssR_p;g`HOG;Kj&{{)3wFhqyn+PS#^RYiT|CQoZH zv+Uzf7acD%xp>2|wC`Guj`@ck*s02O*!2ZmF36~Onj69`RosjPn_tfT$U-#za; zl{!!SVmDSBoij3qTfifICYT zPB5}``v9|JT~qP0pjdmo4V38blv(%Q6Tz&H*S&=JfG3#L2vX}X2<9i7zaRI^Q zmd&wd%pH%|9Fa=Zdn8D4a?XiR!tAOVSZGhmZI^mg>uR%|iXbJ$cvRf~avN2FFfk3^ z+YgfBFvnTwKbn0erq^oisq8-RFgrwSB-OBbH6qNxPm4;+oeyz%-QQxf42#Qg0B!-U zt4|EbPGX?n7|eW-4p}%jI$Z?C?^Z`#>6H5i<8GQwmO~ zEra?n^D&r6@v7uDbF?C1w@Nvi~mT zv&H5O(YoIrt=9IGm-ow+qc3hckJ3Wo+irVKvX-{dsIbw}NZe?IXq)-c;Mx%8*@GmH z?1&zbV^q|_6;zf*${+1TJNyx5hNP>tNGSEa4{<(-aI z5}zl~lG>dI+pP9;OaqNUmvFN>oy&VyE$5fp{X`Ehw~ooFBAMw zau{;d;=Hx)b5tehy8DryUL}otXMo70V<*KxHime5YU;P|!(xu_Wu$RQJ7}{Hilg`E z=;CW>M1F)+6$dM8m!_|vpx_4~=6~NEUN?><-Q90umDz-1m+iPz(nM-I@{2q2?fULf zYn?|*R4AK;$v;_6*xFk!HG))?+;}2ZLn6062aP8|Iig^OA?hd;Kx7?zlsPuiP6=;> za9;$H?uOS-BI#hkN>TsC_;7>jZa*(SXP}p_;dIv;FXheez!v~gra777RTJfCw8B^f z&w*jA%n;c#KO{}t#8B+4*FbnwQOK?-Dq(PZnl@pJMvFVs+#9aH=OD%1gSIQ1Z`z4e zRc*^xF8s>~M;ifMIP;`TXqnAc7q^wAf6S@#a->_x<}wIlP92P?W#~3n zZNt@-aA~BCP2>7Iwg<#^XmrW=ecDUMm&3?Y>xSe#JC**STfQ79-?PyJhdzJU$lQ)@{vdBQvRYlh6C7n=CqZ?@=S)PrHVu z)?}`O(71;D8lST~O~Lq`sN&#$%pxJ`c7KUYL9k2p^21@-yuRy4lt zB;x4ErLw?)!Vk1VL(^IKxWj_rNIdGV+L+1_;yNB9(*ty2`IttB$0V*pm>AAN;7-|p zB}>;hv%=bJ*_ZpsSXCe!9!*xV{?BxV?(F%}W*cy8XFg zIG;*pTazi&bfnOH`Ea-B+kX9`+W@+XTcf}To5{{?`9Q^LQvcOXzc+N2L6uSrd@1cT z7!pp|A#S|&@a-wSN(Z6#Khtv#>>Q3N9jxu`JxGdS<2^;&x@N4s9%j$FU%tx|uhe-j ziji^5j-pCS0|5PM@cln4RLcf~wiqBpcU1oUrgzY?f^z>=_rJ26@H@)nB3myIaVp%r z)&&1a$h2Px8}?T+7Ra%vHs?igiB8Rm@6~-wFquyCzunE?8H3TQV>nBox2^2LRKt&T zd8#_HnjETP>{(gm93khziuP!v8*ubGX!Al?lps{==B9F3(8pI`i=DA$>UeNSsoP;U z#+s@2+x>h{Y?g?nS-IX^sA?LQcC0I92|s9ejYHJ6B4&?PBOKaxzCIrEd!Zb+VkH=b zwK&G-`?P^;xNPd8I|O{+ICR!AX$&r^yPmn|2Z7T=K$Lzyz81s1RT;vP8NaZnb&ZWJ z8-dvYv-%oZdZuV`v7BDrZw^_4rVDlM8OB~4#e?{noPM3>HBkk-#inbcwY}-YndoT zeGbQj>)9Sj?0!0JudZfKR!B}xzFG5xhK7cMuO|3aMJ}ZE^p*yqi5xp`7UnB-EX~Y# znt7n^i$*#AuMg*&{WXTI2{}0s=T*xb@GWe`$`k@GAKkpJ(|o}Rz!Qku14K+t-abEf zydrQ=NM<5fZq2xEGZaX9_r5T&1uvsALLyJl`)jLQj@E#ToWi0}()2 zltQcaCzGAOh=|A*=l(u#O@bN2(DHjOSR*pyL;ElV<=&agGCvLMS5TxQq*|xT;Yd>x zL_OwHP_aP;k6uF$MkE`ebG)~*@Q@jdnY&i!)IE!uSgik6?m>Owiw+eJ+W`d67!~|T zY4eZ!!zi6V$kgf7cHSLp$7$cDa{J^C4q6el6FH=wd<+EMxHxCeSs7b-k?I*L^AgSV z;TX7XsSE&M#XuCNY3Tby4-d=3Qg)j#A8%zGZ$2TV_+1j1%dfZC*Dq^%Za#A9^(n6If>o4J9jCXJDI&bJT^~zk1~*H4F32JG!ES_>!AIAxSK+D@i+`2+ zKg($}Ol+NdHk1p*ZF)`a9;2${+&^!{L;Z)`#HP0J)C_~m;jp}{%}d1?zm#ab8wewF zA{h0?36-Ltgq{T=Q`PCl^hTBus|*V)rdBNe9sUthNKLi3E7N;)c zKh*@4b-)GIZ$<=2>Za^?#cc_;Ca?mr2iymAtr+ zY;$teEX^+LbO3=2+!k^RzYrA1k5XdWx?W%Fu0`}EWOEtPX<&|iNf`T)p01s&5PiRl zMJ4zFUHKq23B@gkG_>SBsSsz~`S`(X344fTygVBEX>~>11Z5^RYrisA@S~i;$t|TY zokqpB031M|>`!fuE##Z0b%T(c#z8M0k(7G)pV07gKP**!?u1zaG>usLG0uI2y)f;Y80%-+HiEpjnK##>!hS2^&9234&DX464hmr!k^z-7gM8Qo7 zNn>9~RNX0-n=9t!NtEev`w@XW=`^N&{eAu8kH60wLVj}wFBQ^?P-1x!wGlu^#Q5X50=*wFp^PLkYM4i5o3IP^yy9X^ zbG^DA%IUg|)vm$YxZD|YcXxkzx)b*}{m4pz_w+J>9K7Llptyvn&-ZURX=O_yERwj2sK?@PRG-0 zvOP%2^PJ}q9}nL`Ecs8ibMhhXpq>H|BPdBOC)lS29zf2DOHN>TG`*YJh}$!adNH02 zuHrHAwK&TTj;$Xu1796)feuCQR=FIYDJKu9qn=gI+e?-yhyxaJ@>o|sz9|E{Kzd-hq|CaUsW$NX0z)yO zuDb1CeX8OZhe>sLxq#oLle6;G(g|#hKNMuB0^R3@D&*}p>X>MSSYoQi=UWp6eM32k zS5hMT#1u`0STtFx)1N|c*75rpW~EHTo3BjGN6M~mYnLs-09j1o9TJ+d=5TTxyo;43 zK=I%h#*T?L(QZFd%*ro95fbPQSaEbHAqsMoaz!4by(AVHZA#cAGxM8OXIK8A_Any zCNy{mqS?CoAjjWzeGzta+EQc#Enji;E?SEcahqMm5cE7;9Z7g(H~pQh#-jd&tV5XX zU~_yd?iQ3^em)J#uCdvVL|q6HvaxD&IT>=yVzN`K*nx+jiZE~oE~pF*3!gr^Es^yX zY*QF{V0#7b`N&CiA0@tkv@ORlfRTBFW9|fzgTpAUG4gaArS|gVX_cuXK*M9_3oLQh zoL+-Ym>jEMXOEEs1pp=MC)17FGS~0qV$I)?_-6DJsV;tz2@HEE$UvJf6bM98b$_p32 z;G0LUj>gh_ULM;B`HF2{%nHb$*N?br_SGNv8avjF%<(IqL~Lg|@_^x<_Owzlg{u>; zA}qHmncJX}B7^{x2quvPj~hcK_DM7{=K}@03B17{KR6$TiI-~oL3gBm?=TLCJSU<# zj5n-H7LftOXj0JkrqU8V3~+fNF^!({e1_A5SpM4!F+oNwO)o7UMCd>+Z({MEAi+JZ zosIPHVLt&96zjFsdY=ww_oxIfPyTHYz+oWZ1Q2-vu(9D0F#(7hdfHQm4X~5TIkz#< zySpSxajkU{@^1^*s()RsL9$~1)(tGFpe>g(uzZolM`V~+DYGR3lueQ~qh_!+Mes|M zmvN&Hun9t^I2WM(6lNwf;`!2I>L~RXgqkM6R@(SW81U}F@o$*?JG?G&=Z&(S*^_aJ*!H#H_;ou<$SPbKa3pf8mnAVU3_NuhC+o{>2tclCI_~jRaJe%#y!dRt zio@gt)Yycid=}SVf%rE<6fzHt%mMi*L3l7{*fNAP=I3oOC%eSFwt=v{UuWYu3r}l4 z(a#{e86ybRO-q(TjlQK)guG^`YykU5!9J^2KSCy2(Wc*w$XN;L`O?<$8GXSTyXi9I z{q*CR0U!P(m3>kRakRIgq~@m^2y3NK!I9(&#QIv-@xKC+32pW!!k`bX>c%?3f%M?k zTBe-vd1i;2XmxXm36W-_A;O}(+~`b6O&+DefKUtyf4H=& z$#h#(WLQWbL6y;Dk4lPFA_xblf)pdeQw=JD^7#cp1OSJ_J$&|!gvhkDx)Oz>_$sf`E*K!ZY*T}P?-)Mx-0IraM7(yy0)_$m@``q7XP z^Gw%FU2?fNF8~M}ZSU%Ia+>M0Zn<#o*^gd%L`!mB#Q5}_d7+9E8lWt^OBN-9nGDCX5DSPrpfjnGd$vaPJ>V1FEb7RCeFO&O6B|SE_zUn z(-a=^eRN)Ultzx&f%~RpY>orBLIYE4NfWBdV1ib^q^~F zp2-zjy?pGJE>B6U7ZJhywFlVknZS?PsvV?|0%4j zNO_$uw+a9l%I9#n0xSS1V-u1}^9nwCZ;98|=JAm&oi3L0x;zvB1Sq%D=>hs^bz;azxgTt0RNM0TlDEzkb=;ZO=S< zk@5C~WL-CVRQ9?vs~wuCzA0$d&Oq$oIrDFA%Rjzt^*2KXE$^wy+jY2j@QgWz5an+g zN1_3L^1ChTB4bPjp6{`%{0yzz!gr2>HJ>S~r{gMxwp;HH~yYHx4X>-9#X z5de-KKkjzB!@|MIq4bKBe7gM)*$TJ7(S=@3*91VrfF!GPyD zCLjt7!!Rr>m&<56;PrS2f{@E)3?1-!c>s{fNS2{}UJr(1BuRL^UXJ513?oPaMA7bW z2!e?8zUb#Ukg2pW{ZL1}v%JFNcA9CAj`c#YMwfB}Cev~ZEmx^DdTkg0$I?zuATGTh zaIDMg*Jw2&FPI}@!(%X-3HWIa0RW6tk_gA~gi^t=oJ>xNA|$3~AfiAAC;?CeK=cPt zi%GnDPPaFZNaCL(zyxS=I?6#mzn`8SGd3nfSVGMNGcr-$u7Vgka^ZWkrjYB`2cs!5*X zWHOZ)@G)}Tm?`5?k@sedPaPGN9AUO~cLSl%9y$zAobz-Nm^vwI^yKlgOk9uO6g_2P zT!5lj0X53Oaf2vg2-tfZAc`1*h@!yr{O?Q(1er{REMLBS)~s0( z5fOj=sv3s!2S~XZ$54)?{S2p6s(K#+q7Z1QZ{SFEWK`s}V@lrdqftUBBSB>R6obpu z1P&s{G&j`xI4mYEPAMZ??UhU3UOINc-4g~!djfc{r7xtQ$I;o|*<*@`GHZSr0Fkz> zSn{enaprS(&h8aYfu)=4YbcS7jf+)~1OSLU)!ET4Q|gTd1;rpr*|q&Dv8Su0+wKdC zjnm0xz_EUs!Idfk0gmyCxSHUcOBcU^#*BXS-WveG-r3UD)e{^M6J*l&&9yrC-TGr! z?p(B_f6y-$JBzH}W^<4#vrf)aBBqp)AhLdn#^q{4q$!4%DU}$2-`Q2y*rGHP$)$@;1@)>LV*GR2-cQHk3dF5MQ{NRCR3A)-;WSV8Nsp)$FT~93Iv++ zb27OK!+`O-nj2eWrl5$RpuTRY-zVaPf*?7@%kYR&(f4HVyX{R)&2mFfOhgy}(6k=_ zWHLqXXHf*XTp=>Fhw>6yy&MF8AfQzKn?|Dixen=opK=of2EX1{$3QpNkK#aL=;5snOL~OEGGVR!-u)h=@E(Gql^*a_)R-;-E1@2E@>mpYnPrnjvHg zjamhwhyd^NdV3e5ASjOV{>qBW4bAqrl#G7;;sYL^2#89pAqi9fROA@1*TeCk)M%A* zl4m(UF%&qL%Poiqf`A|hGKET|REUBI0^@djP*Q2otGzCV&(CR%W{mqk%&L{R`ltux3GzQ^v6YxHUb?s7N+ z46jsaluEhCbAkv2fm2=&Dp$!6uE*h4sPt+%YVYYm2>z_S@KfLXH;O|ayb}IKygB=)*y%g2*yxeZ-CVsO&Cu*T}}Zdv^pa$&~}GQ zsWYe*q{n3!Fr`*Wx||M%7f|Hiam9MCX^SH7bh_32zUqp03b|N}gE$kggq(wzZ9GvXUENx5yz+<&i%UlujBc+3XF3~WI zYmaR&lT~U`+6goChm@$>FdVu#ynjy!9F7!CB-NjYKU8p3kz|n(hQOCE;sXIeg>Qx) zm*&|VhW##@zBrdVp@ufw^084Z7zX`xJ4iGOd zCnE(ZGzJkcdVPZe2;l<(cvpz-0KmS7O#}_ljE(gn09nu^3CAw#(10fvU_l)nK@K3` z0#g{+qtQ^?MG)I^xW8@{fjmP%@n=j73JfX@3=kUcfAjMZWh%Za+r_Kj;ME!%07$f1 zF))mdj{kk=)i96voBe|VxJgH5p#W$IRAIA(U~E7U0ySpX#QSnTA} zduagM5JDojKh+_+eBzUiJSgL~(r2fctnqw6~2#c5biJa(~n278Nv-9017zH ztpog~P86h^Zl2G%iLmQ7pE$D-%~!l$dvSa;^J5OHKjX}hr=$*5>ql#I%`NUM(M6kz zL}%RC$H3CA^x*?008`!%$4!4P_mJ7jEIQEb0I2b*6P0Sv1qrlLPw25aQ*EB%;E+_NR0fX2}f|g10sh0#7{Jx|A#)ohD zURUHtOF3+aFoBrpXQq#DcYzw+kOu~gC0!?52&%{nBCbl`=b_ofkpjc63wm=SPjWx~ zfw2n1D`@?*)3sr~>TjYP>W~YCs7&%1ofJbz_tnYzo{=6}b(zHXw7Xtq~#L@%B`5$2lDl{nxW(YQ#2sx^j819V7 zXH=E`PmU6NsQ%s6v+Hj&S>9rNXZ#yf)}NknX+w}Hgky2Z z{bfc-f7LZLYyb{|v0l3YEMwZguFF_9l=q+RA>7b;qx8hCs2F8L)s&3qiS8tDkIYyeqxuKpH_}LH>XghopymfboNigiA*ZgU3S5#`2+hREhXz@)eW5 z{`*nTw8{@vP3dJlF15#ahn#;EaBBUUA*9N5v)@=4BGJ^)?@%|$v>AD*co@Gim{F#X zxCx!LE?01MHMe*qJ?dXET;am&!>hm-_v`;GN58c2VMEmZT$!-=JtGk_xjt1kr6ReV zwuPL6ai2b!(pCGUlr5t^(53lS|Cs2Q8y6lIJ54q%kp)yst_8IswenWWY2rUTGWIlT zo7zV5psugDDJ&rRUigXu6B(4&YZl5AiYDHkA81s+D?H#WgF~TLBvoWpL~0sco6Vx~ zlzaUbL4H7yLcU0T{}+wcf(X0#UExU*URQdZcJ?YvL);0=3B*a;y#1eQt0Sv^3pNW` zi)#xWs{>0nE58}#StAQI>lh1_dfSG&2HtwXQ>xRDV}e=Sx%~y#nT@Kog0}pU>Y-Wd znT(m#8I;B98GjQYb_Z4}_GZfn)_S&aj&_@7i$e1xlXnaS!{`H1sMxz9ZablDC~k(?}H*UWTW{jy9GsI6l2%z`zW+u z%jwFk7d5SUPmNC7IQTd=In+3&Y>I5Y+9<3}t{ku0*0h<$)w$PhnSKllj|c8d?=c!%&-^R_kjS%nS8vCGD; zzk+jJUjtCLF&x+o{emaLeDRB+T%i!5BsoXzW!Jd=N_(h`7t;!73g70|^)wr9ZDaI| zxoCJ1`U>=u7Jf5{{V}jSPGq(?`?u zrzNDdq^W3OX*KBlswCC%t}UuVtSxaqbBaBz-IqAr9GM$l%X*;S;_Rvusvs%Z-sfnu zr9|XL&5v9Y%}#T z4IjPQcib;%8+Rkzn&{v)ei-9t@LqkGy~nzIYh<+85(+x3Gbj za!xrreIh2jW{Gcm8^dT>KaR$C6#0!D!f_CwF4*_C7dH_Ve?&92v%v9tS&Mx zI(K1rf_Tc&Nzt}Tp}%d|D_MBW{g!rP_RAV_W6~=dvZ{USMTu3lt+8z# zZXX9fJ$`k-_=x#ZycWLgL#c9Dz~I@|ukK;)5sv2$h1;0EVt8>?u(vZB@i{R>;>blY zN8d$9#WBiTtglaar8Fne{m#!gNp9rs-~-*J!^WTV1yy>SHG~Szp3Y zjndlDcq+EGt5l6Q@cC-=UGRDfoP#Q+*Dv+b+;WS{+MXwbM@cvO0wu4l73PtaJ}fZ# ztsLpj9`B1mly;du3+;{H;V5f4ppbjP9CVr82*QbG4$0 zy=kt#gxi5T2$VU8aVU^_aObVt)EwH(>tW%6;7O{_y7}PC@Wk<){A3OtV(WmU+oa@& zVULP_%j^*(fa(-DgVRb`LBhvL#>kSBMx2bDMVyG8L7YmQlN#T|9haQ?J2fdIGch4C zJu4-vll`mpcQZ4y#gt0im1Azp7E4dlrx=*jrWnl5tw4HohDDkhMx=L2S941(QP0CF z?>2)=t<51l(ypz-**75%HM6^_^swNp@G#^qzUzWmUB;E%r6UiQIp)QybGZddZFx7& zxJ<9P>zmIlYVC4w6$9LHH_`X~h%kiSj2v#+UGv^gJ;|whmsOi>Ze?xFl)J62jFs*! z_7xvzFkJF6-o z0$6Uzem_Lu!De=w*fh`Q*OR-fR=D z8|sq~l#w5_TRZ#LsX(T+EGoTl)%?ybMlZcb+e$lXm7j;AHQOu53*$K)=_pJ&OhqC* zhO-hw>tWa=uCyF?;H=X#8KzHp;JSQ);uI3!T&L_jM6biQJ~*W>AH-gAK3T=^%Al~g z)WWhczuwv6?q%Y=>QUplakse-+Na&-y>K5EBo`vx28G>sXU4>4JaTp*@ZjqTJs>Il zFvJ1n9rlj)8Gp?rOHMl*M^SpnpBhl@FCKgvz^8~Hudwl(Jdv+Zppi8zZZ5PczAB+F z>KbltD59_9v0hsYIqN0}*X`gt_Q{4U+`egC3Y}Xsck`ipR(|c+Ge16&m&NVOtdFYA zutssM?iScVxOz)SW`W%+PbyQhW91eRpDfLuiC^=0v{*SRZWQdpGKCZLQ5NZGGGh zHbG44oHTX7HfXr6csCKgOdt4vhicj5Zwyq2D2JQ>}r;&oTE zf*F=}BB27@00pi9b3&mvQ$Py}kog*b57Rw{%A}7Qz;_Dte{^p>z(P`?1|o(CVb%BG z`H|ljtE)((i!HHfHwa5v-hmW<;Ug^m>RcbRU3?Z_|eeSd@T!J zo^X{x@!iyG zBRR{1?Ze^y$9~*?&z!N8Q-mfWciK2S1;lEeORX}}hVZGM_R)et{=&Jsiqd}-sKjv4 zs=m}ACz<+~>7uH$2H|XEr4kiVQzCZ^O+W zj{UX6G$TCAg9D4Blk=O?!b3`P(tTQe;?5l@<=GiEZK2`8B_$g1?iC6t_ALelANv84 z_y?TV_ACfS(3geop+4|xaK<6TKRqTf1lEISv+>loMc zcp3DR+nu)YbQH`kUt=nvtb;QyH;GgHg#0z{|2$m{{B%}0%|4X%?7;NDdv#sVSxReo zm>_-?$aAJQcBl*u={$UPvo9Wy(vcX zOMA?GoO3Ye8_72Z6((^hbqm=?Vl@0;YBS%BaCZlH%h5aPm8FTPEla0nmrQ9)3id1Z z2KM}E_|)4AU8K0x2GrD~V{-4+eT53dovYPTI8=r-mgJ`t4JL#p6;2Rwk{=aI_wy1T z6frYgyt7Hp9Od)zv+8*fdA=VK*B|IBvipcmdP-HeFuPzcjW6G;>{VwZdUbkKIZu5a zC^&NL#E_X-q|Y;NY|7$(c!hirfB6oh@my8&;BiNE;xEwczjh$Mr?}|Q6MPo_E3Se_ zWe_%-T(Cf(IwQeT=`E6p@V)hv-gNM0qw~RCFqimFAap$0PvFLM?{vvC`?5^%4C^RL z$L~VlO1ra_rS;j)771Vyf+mWGwsip z>CEwrt}MnZpVRTR*>4Fo`Ux+)pHO1WUx@ulT{|@NL8|U#~x1Bg)X3 zrWItW{Hn`|8kv~z4W-Q1h;@(D9>VUa9_S*Q{;Em0M^8uFPU56dFKyGtrP7;hMnX+V zK_ZvZGiJ2!aBYL2DlSc7YfAa0*y`6R^&MJ_DLuEXdsbyD2z04CW1XRi5q4=0ykbhbr zfaxu7(!;Ktj}L4yw|K#x^mj0&36K~|Da!$X?QZ~Zjs<|HC;$lY005sp0C)hGGhPD# zTHY^?m}~%IyHHw8Sk+_oEX&NJzqTxfB{c%^#9{BZC3grTe-{ zQ$1IAS4USgZ`d!WH4w9yYzQ8dj5%k_rn8b8|^lssAehSMcpNVNp|8 zPf1B>Y-+M*!&5F&hJk^J!C@9DUtsw>x4Ig60{34%IOu$oZLaKu1au-Izvo-aupd&{ zhoIeEOoY(B9ifKc|I^ltIae%*OFmDre_$XvDQO#8I3z60i6Fe})BlmN8x&DFJ*^l- zB9%byNO0&$q=xW6E#UfLAch-Xr02egJJV)G`W6=C__LMDa!$C?GRW)O!eff|FDH$6LHwy)= zsmoshXgxk?BcZN?1+1)wvcy^AdhD*sl+}EvaxYD<&& zNO!J^&Od(a#98CtU&fGMp~3%z4>N2msyTVAxqsFUB^5h=5d$nr8R(WjI=DG0B__;E zD99yox>XI_@1@F1h4bLmVV-!K+8g(lj5FfY2#R|D6pn{%Yl=p7+{um{n;HAY%h*rD z6r6@P*VmjIwA^N>oc%cy8*SK+D&jr=x#HOB=WDlT_qqpiEs_R>!J_%f_qUv`q;@Hq zP2l3uq<2gZaMILVZgDMLJbSGmpEfHw&OgbN)!L_aT-{%@<8#<7JLd9nIlDy1{#m)Z zZ0hVbpTMO#)oc0BAXZmb!NczxgX6}=nQF7yot#3K%}cpgJ7%~ig$l@L+pM&i-wjR_ z^?qu3XD|?;FE4F5Tb7X9NISjAsU~F4nvaI=<{Fc}Db18K@HcRijW56J^wG9GSj<#e zE3;vD-*g_kO&SYQ8v&+`=qIT+>b%aq-sd?gd8jnQeY7LK&yq)`+b#-->?ZZgOQL+D-Q0CMR}a%qD${5V211jIu#B$S^q zfn_p}SCo&(lz*x|$3$gi@Mkj8+3>mbFSQ^Q4XNIlSG8MJa8Q3~s&`=5X-=Qel&s@m zJ|8U~EIXNEOCq{)y;!+U{IWPYW)>qCBVS>95?6o0H``j5ZHtGV$a6mG2rjGJr<@rO z)!iM24IlaXiimRC0e6LKH@Yc61n0dhsk3gFJox z?mBi7Q+_#iwy=_tFp=TEtf=7rE}QvsUo00jx%AVV6N@*Zo;N3pmBIBWiTh)%`D#$i zwWP9{1X`Pc;HD{qQLAMq9Pd_+6VefWgiaY1x@U+rgn=5bOeOr94ihVY0}j&(JgOLU z=Xrb?r7BCwnDD&~35Psuqb#5xcA8K{jluGIt|9=)c17Tbk|-LEMx3;#y-BvOEal;2 z7b#W3Y)G=&(~cyE$PG2+$s|OGVIiZ>U(}?Beq9$O`9vv0Fa(i%AFKwOvMKlr=mx?k z*H-+T`mPxpu>qmm`Zl5rPW6!m-@9IX4uY-Q3&f0ytGG@#(7S)jo9?wk+3YFiPdXhG zd%jqd9A3twVH8-70}g#=flL6%9TW6ErtQ0%i?;S3hY5(Ufc@}V`iF`e;Cl&czxPd_ zzkWZJIIa=$Pw~dxQG3k{5b%TRQ+{cR>(oXL?`>6h2_-~8sn6v}^&(b8&r5=x{&l~L zPEVtP#;dM56d;xE@&eT)m!xLzZ7hly+c!%|tVFT#FOIUR;&~@o@<#dN>Yob*uw2eb z_hIBMObh&BF?-wJz4?U_>WJ#&prZ)(1Q2qa2v(RPBAV^cMTbqYe*se* zpbSADw>tK_gOU$6{;JDGGSrB`01`N^updDvxp~Z5w?p;gL9 zEfv&h^J-?6T7v4h={TYjjLEsACT0Gr2Q?(vz)~+$b7NuQf8)yV&06hACo}F7j^$=v z9o4C@2~R%%>qsc?V8jv;9sBq1H;BOI`XA9AqqYj0{GWytsF%Ro0mth?LFKF zkmqtz+dtmBKIqQ0p7u8-AVjMDj~YpWa99uXQVlxkrE$I9M4MoC9)EMAbXP1Nixjd#2cwrK2db)HK(9wJAZWEJyoRnKj`?Tt;nQxA9?)cL>9 zlfeZA7}u8`EwP`r95Z&l?!Nxm%TBi6Q(b`;c1WXv<65&TGnNuY%~a!NWPItA;sC8s zjHS?f?$4agQVDNs+1%PrF}ys2urG;JJS`@!XiE5gjJ{d~k>p?cT@M@*|1QOXhO~B? zXKp5e69J_kZjMsR`#6ofTz1`=nE6iXOjTN%zzBCUmt2h(f1#b~7knDsIw<6FuUKB# zRpMhYeP>r{G~VL-cn$ZynfgKu3^B(eioAz4b&gYazCFFn?FEsr`Q7c-iaxJxKEHy@ z?Z;m4>YC)!p@mTaO7L>!D70JOV(h?YG1_jf@8{WL%ADW88;Sm^^>SV3tW3ad;H4EM zMDhs|C+vxUrJG5%D0kk9y?7=_8%l5~zXN)d`1*Q$hs;|071ks>9kd8Z=zs`=qBR-wuTs%1$h zBr)33(m7E=x;%zl7ltkx0@ps6!e=_2jYQC2^2D%z zQfTEyuwQd5Y`wuZ9sdc^5d1hcs3Jg1Wj-G|#xill zP}%;r8{+U=Q^l6=&L)2C!z2L0(737qz+3tPEvWfvK~e%5BgCyAG_@gvDjBN=rlKWL zJ+6Bdw){QB&f=w2!qCM^M+!pPosanKyY81VTqhH91iV3)#P+r)1WBrB+6QNy$vNj% z?N2QzRZ*B{e9N>>3TXYerKOW)X1;?sgcpBokB{g+e*zAXbIUXCaE*iD%x%BJ=1Gr7 zld!IxCHAq7ilVd5D*YZve^p>gh9Xs&CSe&fl^B+?#>~BfDHsd z(c5C8tLw1{P3VUrj{`v;b6{PDt=ng)Rg;VOHntKHI7riJ!`~bUOlcLs_TM^ff}t-6 zBB;;~+rL!i2p8@?3$;zef~<-U=;mWDd`{HX%a?N^=` zcp&&}@i%=K+X(eRo>f8| zHOR#35lBTUw_RM*UMCeNbnP{`p6U09^0ao?O`O zZWCzTK{Qq8a`EgGQqNWrI44mnT3?=Q5-M(Z7WUzK@EM{2aEy_^&@+rAFcrhm&sm>3 z3L_Ib;#w#nZ3P4v!lx7wwg)rw=EZ{3yrf=wY_ZAbdo zEQ<=K{1enV66brJdX*JkySTcFg$z)_;YzpK5oD6=VN%0Eq9#?V=(1(N(5riEXhG+| z8a5{m^he`nAPwN5kB_dZmdI6?7KzDRB}8QhTgeUS===Y@1lYe?yv#oLAaKRzaH(H0ZOU2?%o44`R4j<8ghHD)ojNNJQg3ureHy~x84p4wNJ$C;wUw7^2a_eq6e$PDuN2A>LP?1!H_MiqyO z&e?C-4O~??Uf~5cwweXIdO`EfVAS|+-Z(UgakK!#6k;9TIngNGO1rb&&1f>UF%+iIzE zIa}9^xo)ozCqac0Gy5;(TRL``MVHNs4-ZY#*3pr*m2VM=A33K}*;-dt)?bz1UUkHP z(~CEO_7p~yN>eU|XKk#nZ&;koRO$9;+fX(z&{Nkot^WiwAouOdCxgRLYVmlU!peq* zqLyrPAynw{1#Jx-18v<%Zp^eAV|FJ(?GQ9a%f1DI&9z@FKU|U!g#ONjl^PElprnME z%Z^8W3zjrUW>EcTH(h)0@J1mJa9c#@u{5EhMvUE$a=R4x>p%7DH+(8gIj=v_vNxO8 z>*M^@hCH`1auyp+3SWtkd=L^c~2|zj(YLY(v3h=Q0<3KPeRupN(ZJ?*^Jx!TGS%gmb#w5Zoauu_CgM)B|D46f%^Op(3ikXSsPKuI#KAwK_vd`` zXo3v1^pkE!+p&GH59gpE`R_aUQOK#`vRUX+@U4~_DCN)R;kMrQ=ll-&M1!w)IVcj$ zSQ6V-;6_i!(K2H^!=p;!=j!G!SovU1Cl|IZ1l&BfviZXmQci}}ubbKir`5yjYK|N{ zhntzbTxa)H`gGjS9_hD;_&Jylu01j6&Hdg@m%yEUAm;ytpXsXA{%JBfR85AEBu;+% zoTvR`FR&xF*|9Wi`afM(-`}d+9xix2YA2f-BxU|w&9&hUZ*Cl-DlS^-TAgzE_u?nS!z-2RBzXr@DW8zVRpqty zp6-^Io+~t-#Z_GugXc}_99hrfj*Q)I8<>U^w#5ZkCP0YT>r!y2_|cT^h z6*YH!#vCkoq6-ZP!6l9MySs*t(PixuLEm+PAcev)ZmZ*QMowJk>4>GHRU~xEk2ZO; z`>y+~OltQICi>WXsUF*KL8i=nxIlh$D0$_O-!u}fMR7`)$9<~Ng;JlP!+v;cnc_$* zK?lMUh_d=@yPlPppu=X;PI+pB?S;XOhKA;Eb>}k;HFaq?_8|iha7s3vdLeiOR_BU0 z@TzkEF07twT_xSHanLD>gH$9mtPK^ezevi{(^KfXYgSz6Q^6#7ed@xFOk)0;c`k7| zEx&_nY=je46D;8x0&YRrBb!pm1R5IBQ6Em;IBHL^)6mjdcmYhrF>I6+ki=85K>okf zTKJ*oy6^N~R@v{V{$mtfKDG~Ex1KZQ?QdEYpU7T*y$$=B2-Xs>#GOgr8wkC4W>Z#m zy+6mt$0J@)+%!5FdOpSf|Eqj`nHqXeNx@1u^vphdtL~?(VxiCe_TF>jI*|FEb%8 zS5LA-!nLXdEz%k2==fZY6pf5_hktzq59i76-(c^80Fc8A8XFsPbGP?K62E-;g7Hlj zhs7j9_S;ReS@l0t9sBdkbJLr|Z~wPb|C8-!($(d&<$c+aCmQ~&VO2$EZDr;6cDHl| z8k)-BWMpHTS2&@krx$$v*SFIb{$E?m%gZ+!x%{hc*+aL9H>m#`pZ_cBqsY=9uOb7*g9r!tO29!JY4VzpM7XXelWxE32)& z4jMO|vtTnGiX~(=f{q1k8@KA(*cbhJznxv6x0yckoT+a5?6;w`UeB0TTb? zddcHQOr)iyze>hpQrdpM-*}sGe0e6h3Od~X&I=zDK(E*8^7wD(U4`3WyZhHy$rMHd z1_s7u9nBQqgEaHOSVHeD--jpkyiVu>&dSP4V*l3~^>RXPr@}o5?}v*9O*+QT$9$P0 zo~d>lj^9rE+1S|l`SoU@>dmLJ z5jP#p&CS1i4LpmIOC5y%SU#RB;q6O&#4NITE-Nu9s6A;)K1uY<;{B z3BK1@FI9~(w4L$!27C(M34|r`cs?$vtE;0ZKUl6Yrd6*{q{1W^$}-nS2;F@;%<(_U z3$LxM?T@LdW*HDXIX$)Sdb@voe2k4njsJusYm;oC$4_eP1%*RFNg$#%Q12Ci6qY`fO@w)OEwES<2c`D1I4 zQ98kAI}kR7K`%Wk%lAE&xI=$yW@d-7D(q$Wz>_R>OwUjJ(jG%IMNUr6*3OOt=d(;v ztp@el`TgSJB6#rrj}m04i`52zL)IEV-c5;1sR zu(6jw2y?qFp`oGGV2_XdLfgKtp{uLw=5`;3gnuxRacDsPiH!Vh82~m}iy)=Vk7tV% z_^v`eF1h*9F?CS-m^#B$n(S6HAFh4Vf3cPbzFF-IvJY&vr@E~f*gtk*Lx3sOupiSZ zQ2(+2fr zTn!NqV2BfE4Kdf5PrW~MefVy;F8y5a6-a!dxTAIvZ^o`mk);$A{Mc~c;`h8Z0WWi! zn#s^ds(28gR*hRbaH_m94?f&PA+7>NXO^U2J# zq$EsST+fqv>eRjXvt|lj#}Bd|8;;b}RPes2kxnU}iK-S)EWC@(M>GT%B=ij5v@ku5 zijQBubov%&;6%{mb$1dc`2HKjl_fvqnEB$v=&o|>C*#6(7G zz78kbo#?hhN~+w8>4z@7@GWP#LGkxxJSsP^o9>M!jP3XI^nm#@@Wsv^8Xo?_^ILT& zew9>KGMUE=3m6WXt-NcSFx@&%u)lJRTtsEiu)@Quw>)WdnZnn_fuwq&IBeyQkE1`}^OyCS+H& z$L=YZK%rOte|%fu44ezpC)jZG_4P$XgL5tnG8{z5j!`@pzrC}4e)~Rl z9OqHoSEAlctz5bkHW)5e^5)asdUQ;f;VkpgmqGErO_$k7u>SB8Vg56&$WnyYd&|y1(O8^5K`|x>LP7E!f zC^CB`<-_zSLJ$fl`nfw{=Wse~oGIFCPovEqm#Kc4pNl17& zEG#T7X5`@DAQbd8CRd(U#FJ_27j4Oni8QLl^YiA#$44>#VP@ z|1Z6)U*FKs@&0@YUV{CVl$4~Tq!bn7wJTG`_VYI}yQFW$Ei5dYo$DUln7bjwl~~d$ z8XDLsDG#UfM874DY8GYx}LJ(O=P)mre$YeIB?;F?QmTb#0fl~lvnr5 znzG8V4zq&M>YJ25Szyd0pkpn9@ zVH3Kqjzv&(B^rgBSMU|>p}n<&0-k4#rS3q5E*r#{{%Z$RuHhX9r$E>4i#wJvPMGP| z)0^d2AOLi0^jXJob@w7&_e1%jZwdLlSewHKsMbGy%QHTXjWdsQBZ;4jQZxnBNR>?{)Jq>s_v!=)k4{p2rE zqSTRsUWIB+zMH2?Iv~Kf?*?2f!WXu2GZ^#G(MgW)Ez<5X5xzMxc~Jo|b`@7L;c3wv zr^mW6x_estUm|M&j0A&&gC(PJnEhTK!5~{gLSl5^>1yO_>e$z>U&E0JdFZScZZX~y! z_kI_N@<2c2i$}Hhp&#FQT`KW?Ak$yQ@-i}_3|-C6Dz|OeHE55GjyBqDXoJm5MWxOW zG#D9)kT^olP`kdlX;-63&U*peT!X>RD3TJsNA$rRm6UD}#KS+kmQ$ASKGMVyzJx~Y z$|?Sb^=y7`5m8Z55fQKtD3>O+kovh&XYV43D}hgF?58^;AxC}!qgzn(A8$N-eD{m> zmHByc?tr7yUDqUqzTK)?eSced`a^gC{9qn&8?CORWDZ9!1L*sODA+<6vfAz z!a67ZrJ$Tx=j+L+eW#;sDyI20xyOCvPlEx0Ht(_8Oa-Fn`y{0d4&$d_Kx@jDyZJRe zBQjwJB|zjr`7cB^kK91>wZ&kS4VpNbxMV#0xuwxe7)^V{p-+2+GhWK zX{Sdk?Sd%lKyK=Qq0O!^9AXf3S*U-dcz?ao(C{=ix7kT{H3`B3Bzp{uzIE2K*nYQ@ z9;w-QFbf5k2${~B)*~a=??`EL-i#EA%xm_whdnJX2=D1({k>fWM|D!(2cKp6J{ENJ zN45PbO35CYV22cepR5<&e29iKlCW`a?9$X~(2ch>{j>sU&3s*rdufH~O-qM+3oAgk znZWP0`IQu$vC{Qm`YcG>p;0`1#BMuZzvqUyj<*wcSXvpL8%O}|m&)|(ps7}MIGwkj z-=_f3A!YR&xviSG%0SPCe~b!bJoEpII=a%&cXG{rz1HsOd8&EG+^QOMR8DRKbz|-w5Bn>38eV%Fb74Y7U8ggL1!8^PrZ3Kvb_Cq^ z3rj5C^wpsunYVxQdvi?PST$&uFO;d$MCLmXV4J2aD}nF9lRRSqEgb*(N@$oZuaCHl z_d4YfqeS(GmcJ$Sqdp67d8obp&V+4yOEPEEl{(@i3y%y|C9=#$yy({b5@CXQXjs@} z8tafTsIqDEgw`oBCyz94^5Nf3-_60q*!cJvIL5HGt*od}EnisDbKhWJ(#81lMNL(8 zesR&PMss&}*RJinQ8XOc(|z6V+4M4Y^Dfa;D~N>e6HN4qyLV7_;g_p)(J|1p@b z!JD0iVE9A@{(J-_S&;R|ZU2n(j$!XDe8Cq04TBYsHK%5d;n(_p%{DeU-O7WEzk0*iGwTR^t;To}GVXdD_Hz=U5}A!P#9j$lZ{#nS~*_|H)?fwnUqOe{!2 zGp59qFMDf~1tRTP!FKOu>v8&1Sv7mxTZaljKu8ipH9n^Ab^olnGx1cDAl|pm1&Hn* zR<#4`68SHPMH3hL=bfYPdLsu<)Choshi>u37b5`y^YO_ezMbYpe^m#v;LqWTL#hJe;uP z)Kp4xa;ZU6Oz55+2UQIXa}yJ2SlI8B3645y3ouCnCTAm= zM{vU&xd^IC_l*=45=Wo`iGrHa($dz})rA)Cq0tj&##qpQI1n7Ff9?aP4|)tyL8KAO zHjSs%UHZ|vX$c9}U=xC-lImvX97`p1YFW2x@Um7eU*G{pgJ2Be2L{Hl$OQjzO27u0 z+;7(e4)djb4`e98L4$yRel*d6WX%)y0FjP}h{)>N+Ue=(S2D7GG0l`O#+lg)|KOI0 z{ZyTml%&19ten!#yU|Oj|83iZ;#U(M=i%ZoK><*?z!6>ABNWj6d78T+A{v)PV-jWuIQyJSln5K-yBbi#$9Ofl}%h@kSCxreDs4)6q(6gHveU25Xqj8=V2u| zJ{hKk=|ST1r=HpHXap$)fK!4iB>yb+ng(AWsQF=au&#q{5F|e4_i{S}c7;q}+r$T3 z7#T<^_bQwTT%rxaGCW%5Vys>}joa@IF83Qhs+X<#7rcesuj}Y}a?13u@LK(mop<-g z&A>D#gJ4dLYiex1qZg^~aw=#GdB1qxN5K8*LL8RCz>~?{WbW|ax;K1oR;%Gm$M<_I zUD^+F>y?_KbK@#5RfhsQ3cg1tGt9^JqC0ObG`Ri%a&qzzP%{|CEiY?6#BS|3g29)R zwDeU`4Ul`k{L*8|`4bNjz?1j4l*&4-tN{Ydpo6gZOoY_S{vGNxl)}HO)Al&Nf_b&q zDgXDr+6v`T-DZcpoZvU_-|PPR-scVAkZ6d>=4d)^WMo95;1@~6e<2&W^p$-q2n_GR z=yKfbX1-KKoHAB&55j<_M~A%qUoRrD&%eM&y*$}(&XpZ-0A7qlW`Kgyyov%ph0Om$ z*;_~D5j@+XAMWn%!QGt@B)B^ScXtTx?!n!i;BE;P9D)f$I42` zM^Do|)7@3I_pX{o5L5&yY%56{4m$eZ#l-_wXj)|0$V;{J*6mmveQ#D;+F>8knfH|{ zU{dk%sOP`Lrj5G3X3J#N#JbQsA6%xdQliyLHZlr&^j z>+!*pE?8n&*L50nmD)!cGJs$vIXu3vnsq)+S2_!~QOt2>%ApBf8wZpN-mOO8GOxD3 zv`RKTGj%*>?OcBtLA$ieii$0h4tszAiyQa6h;T3myCt13=x03 znOb=^k0$08L?HI^nC{Y=T+I-D`nP-k9|up`!vhf2$d_VV|K4=i;2}oea`tU+YN|b( ztw^iO-sYN!9jxdh5sPh=X}8b!Tt0jnI-DEBi2Bo#19$hcP7E+qX5$%9Ai%249N)g7 zq+|teuR0F(_ZO9vOk{A5+O;H6rY9tj4Z3`lmyeB&1!BA@t0uDs&%Z@dhlhuKVJP=! ztv=!wiI{KzHtKyfOnv*k3)ijJ$1X)Q9~K@yGCbS^Fl^h~+dgpU_SsXkUsfA1yVz=0 z0Tc@WpNX9tbj#Thjq5aB_*Rn?gxV~o$+PA6nHpAtgjy$OD$2^jV`J}{l}l$#&CE)Q ziz9;ax=Y;JM%mmgPYip)${9xGGr3|4$^i5*ThMF1uLy`W0UUFq@@Mx|QYwkme#KNl zK_U!stNss_f*N!`^@TY=4wZP+-kwa~<7UfDM+ZkKU|H%Le@xnv*E(@v@R=YTxz_jj zO&R9jZo}~7-O#oxgZ0YA+&@s9erhpPv)%F0+|V)Kt@LU>iL?1i@~Kd)$*@jFlIu0( zx#!==;d>z%-uoI})#3U`uKcsCW$B}5ShjO6Zo^-!kP=>_ZdicHRoqVb7#`maLRk$5rxtm1Q%25hXqz-M;?5V94nZLH#=+J1d(KMi zUtLZyBz#s9sWQ`D%Mi33`=(bF7mb$O;5#4zZl;WAVs|PLc_sl5 zwG;sU33i+W+u8XYqfs2dwH?dwXE@|}Kklk$^xX7=0mh9QApcG-0LULXr^OT7RVs~# zgr#ZuTosnqsHQ32DHo)L$t}V*TrT8c&THA-b))>=CO4K+?~R^*A#ty;cwX%Q*5$6O z&igi>n8@AQx>A!bSz1j+1qh+J-A**qWlI!k>Khuu5b>0?wD1TCtJEu{606F~6ENWt zmnD=bc?e?xf?yyD$7{?FN2y#Dh&U}A99ZOLx*;QWN`nD>`Nt22>FMc#fq^yUVWLn& z*-tY->*c+qsasHHh@4#Svm0@kb3=fto>63i$k>R6&f`qxLhr4TmeRj#bBX_q=PzBm`r>Ql+P9n1^0V!)uELyzm%B{OaQ%(?VIGh7Yy8|~WgQ%3_ndi=;8bvg zV2^)(MU?k;SRk4lANM?re0PN|`I}A9;M`?2?21Z$pU#t}p~wG8R|?8}m36!Ae9w#q z)Hw6@M%XFDoz{L7FJ1tsC$fx3N%S92npii>bAJ)VnFlPvf#SKg6|^qy($f0dIJuep zT%j$RM(m0y_Fr1I3Sl`xnKEMW#t^%t1ZGrerLW}uMEz6o=)>q^q9 z=#PAVx&2oU>g`$%@?zrm(EW4{uTdoLO=vKfXpI3PHC%B9La)_~>BCUz*1I{Nyp5ck z8YozKUFPTd+D3tneoT4E> z3^AqEj02b3BzLX?r#snhcADt-+x($0cAOS-Vn3rPrLF*Y@a&Q$PH2`tCAo52URt_d zyZS>QUT+#DUs_pS4me!^db%Z2!9(#@n(O zIPh?}-SfCdpda*e>!hr|U+lc~7T|w}u*#{h>h5>wG;lM3GAj0UH&!O@&ge* z5F_J;=F>=5t4oTDj{_L~)6HQGRRL89*Fz5YIqQpto(461xp>qWfM?>o$2#kff2_}$ z85Qx{(@jV%Z)u+Udt}49MejoM8sigeewrqDkmgI1!#xbLVj?`qUpuXCrE?p|l&7u! zOm;W3JYA}5j~M%cqW*hZW@W#$0Y=Ev=M3Xf`_LOp1;=k}<+UUmOuAgnB}UkieXj}w zI4|Utq(cHB{o|mX{i37i^QgeyUK+(MrxI&54><577``psQb)I%XFJ55_hV6XW2Y%F zx znrV~sv%|ZY;nBJ~tl#;I*YCpPU`dFjU7!CrXJI9lbqnr1gaAp)l_`e`86!ay7C;8N?quk*-*sBH8&X3ospU9UD9&StjyRPfNk2jy-2W=b4`t9!f zH80-S=dCE_PqJx>N=ldi?0e*L1hi0t3nk-X3ApV5%+%}dqzwRVsR|pP@%_>H?ewEg zF9b-4hGe{e$fge{YvL|t?tKV{OwG;D*SdhqmjbGeSAakT zwSQ|MN{?7R&gcaAd@PN%OB?&&0;a2d{?Vq_jr@pJ6JS9Z>FKQjN)!MTv7^K*=RQ$W zPiFDX7_ewos|$O!Ik~+5{k00Zv`;NSC((aj z_@Ml2(&~I1_Y&1D^nbckDRiRyV9-z?&9RT`x9g{;lK3Ut9l&P&w^mC0N7h_Bi-+KQ zP#67DbpgizT-wWvf5;J_03`}p85nH(!_h#B>K|WbEVw+e?3v?hlYU-a)x~W*_Q%&s zefx(PO#IzX*PaIGwwdAw_Yiu9euY4t-P@qg0jG~Jzn@J3|Jl|rD-|tRe*a1 zw$Mb5;K$Yq4GjgD`(kC<)KOD5Em9%;g)wq{m~b#597gRMfWuP3Y;xEXZPPt-;d@0u zml~(ABNLn_xlz>C($doRdv$elb5m9Q;Xe0OnhAivETw&Xd_I5v6@()6hb7w2bMrV# z_*^+)mTrCO7A;_>V1-g@&HH+sEgf;laT?6JPP6}9)N4%U3T0aB$bskY%*?m%ySZDE zAvFpJ!0rXxc!PP{>FR22UBohPo-A6`NfcJtm)wqrTVT*Ts*~e?Z(4w!Qjw^DJ)^Ow zAI>Gn@<2=7xG%o|a|0H)7%5G%^d*wt$zoki3=kR!Oag=#Lg0qB&(D8apINuhUlR6l zT^-OtjXzG|<#OCuF^7C2OzU)O-ewE8u^|IWEIU?(0QRi2vlAdz5&HnvcBK9!o(zEM zL?a_3_r}rzX(^d}t`Y8F$M#(@hIa&Hs_K*l2f&9yPF@4*Ah(V#$WiRM4-rs@N}&ZIDNWI-r^65B3w=r?R*!HWZA)RN5|h7-~UFAXFl5e@|f z2LA5r8%VCD^19RaeJn03J9xP!mvRCgSgO8n8&CeoKXLM;;Sa$G0y%o;_0^OTwL(t+ zH}A^0Ce)#STZ0eFAFDV&m=EC-y5f`VOj zb!gskj!(ZQkGS9JKIDL1_WR%ek!tyzc`n&BBUrzC=6JC#`UC2p|D|s6+t~l^Uh--l zlpFi}a=gB6a58|SKQ;n?!!ED%N+jg{FqY0vMn(oKo`i%1z<0nDkEn!fZfcraSkTbW zXlZUnCK2*}dAQtK@a|DadMXt8-yQ##%IKbyn|nduL)kto6F0~DcQ9PiCpkKL`pU90 z8hUzwlizYnm&L}!#Kgu<$aS@xo#MT$lOu8Yw=nfm`x;p2(L8@n+QCM2K>(qKL)aXI1b+Px#2}*rm@w` zV?&yyx8f33Yu*pJca84<)FpvVVT2tUz#X?9d7-_7Nsra|x+5{eA^wjMyrVSssF>k> z*M&S2*dZRR-%?Ip>*&2F=Smd6ZBTMTBGmtMYu)|lO=iWHa7c{~ODYj!bSd^@3BLJ5 z`ZM>uTm_cWPx$TgFbN60RaDjhOgfD}wb4}2cB?MadZ(wet1IVcRQM1;;h@S0B=R|0 zCT3;Hf{WPL*a*Aw0?)O&`V=4qy7zOu6kREppoE?d3a6%~c6Ll0e`%9ev z@G!2(GpF>!!`kNQ2DCS{DkXVG5{Pzg=W9g&QEYud1=3FbBm;SosHtoma!H`67N~qL z$Uc_3OjcaP-Q8VcHtWsbAzjk8fPZ!nNXFy@2%nM?6JZ1MXh!DV&^~_EuqZf4D)BXe zWAb_{FG9N-S#j8QwUPIH_nCvjT;A_#?strJWREBFX>-rog&%XlaWF0_DrCNTC2b_S zp4L}0GC&}asPzgJyS-H!$1vJ1n)Z}mR#x=Xd`zNK2EJHp{KBmgX3!v6?$-HqU;RZw z-+9&MW)<5=mgA`d(BaDc}{&a-dWg9HCOddN}^(MPr zD&GViM;y2* zK)=IP2oVSKPD9UWJB>HzR{@pfJPX_ls)V$dTlTt;pv91(w&QAmneJAzIDFB2{ilQQ z{+Nl;_eAyc9*0S{^s*b|!$S-j4J@0SqP z!)hOTFI_RV;}81spfK(!OC^qtUQm$pEHj3GURzJvdPv*)k+DV3dG+KiL90j}3MBb< zx#UI=YKU7heYr84@E3;td9CAiUT3|^fCaJd$j#^badnGbwHf#vbu|>p85l_OS;v>e zgfL$f!e2tdAnh!a6Hr^Fmm=NF+L=}U-LHOd8R&GeT|cTko61mV(O7+X3DaqQc{xn< zLqwovMO3K>0tKpiY>3C#*V`=s1jWIUYOFWZyk50b=p%Abc9$flpsY7`y@4FjdK(PWH7QZIyeJ!#1(DiYtf<2GA`-D7VAIo!HuF&I7sc}J2ak0UAheDJY)1ua?iFWL3 z%k@H_0yklUXPVxr$q|rj@kAYVbc!3w$_Taoq9O2j$lQ|an!|4ST$jDhpjm71YbH0x z_OOIvHy9k`k>Ogex%H4X0aLATMJ2n0uB#V5XyxUlBkHGoeTuEu&id$f z?vu^&lY8GCgP+MN-lR?I^699;TIbDSDTx<6sF{cs1_TnV%@XXeeAH?BvgYxa-#8)& z$Qo7s?{WCSdbOKRH&ati6IS2ODoE5j zJ6y!dqVs<5``p-0~;}txJN6o&?R@Lds#XozR)-pe> z4=pJRUNI{tr{p)GYZDfzc6Z8t7#j-Ii*h^vPoj0m%a)$!j-YovyxpnNm!Wrh*Xy`O zHY&l;36b=4`t-d$*=1@zo20A0VScmsM=ONEiR3^1Ka__qGsELQZS7k4S(kYA;|U>p z9pU?;f$lG6h2JF2XOaBPGab^ zx0mcbRb0Qh&cmOtt=FnCx9ya?(4c!D8~$^4watEJWe91pR};S}9?99G;SA1scc=G$ zed=A7$HlGWPiY8{|5np^XLF&`Q-#_>JyML(R_*cBlOa(xkg^vY>$zORm%2iLmW>FS zK0M5)>uhUgZob6;9C#o@E6Nu>(10rw(0bq#0(U%ICg!~7ea)_=!(NFl8Aua3zw9SA znGYlJrD-qxnusZhs8OZ)tDa%VQDE}@ancXjp`Ybqpb-%N{hd)sn)&-&_4hkj1E}|} z71!9?OP&6?{@pD>7^oy}h($UU*bhaN#m9dENiwv!1LPnt5sEG?YsC#B6kNT7Gmn}8a|%sZTwR#F`V5Ne_APdm_t z1sI4W5nZPI6Tg)??^R| zp6+n+bOK{;+494tAW{~yLOJBqPhcPi=}%`w1ZPzh)^2H#pvtMP`!ECS99_4;R7dUdpmII%Vu)P6)Qj5A02oC3U}0?Xq;~z zn+y7WfI6*TnY2^CaURaVFMa53u$nzE}uz+js(LTp{#dm|%RciMaPxwu;H8j2$k z1}sy8{+bNL!(EGtI_rJ5&RuE??kLJ@Jpw5szjlaW9{6IDk4D{+=G(t{Mvx`#^s>B6 zot<-5AVve2!BQzfq|O+icj9vnYa%8+?LI8ripDAi^)8+en|1tEf})OvTD;w!aB3)I zdf#F4Z>*!uUIIQn%tX~f}Ldm3+NbH6`uJ)dmbudln_WR#Y4*i`dfBNPd;|1zkmvVjK4=DhWGHk$h` zCi>lrA%c1nuV=SfKp?Z8_q}oH37QG#kwPzkoNX=+Wq>J8I*F;Kv(Ki2kq$Kj76B*1c5y>w*E7)t(tHa8u<4P22sttmh!#LB-)|1eKE7ze`Zi0m3&YR=M-Wlk%Gx>%g``Hg zJTWP$vZ4Y!8K1fHLR3*vkun@Y6?&U`T&R%67q=CKKQ4$6*r`zsl6Nm#1cZr zB^u`3yqsZ%P4h*p6~8c>5Y-9m(5Bq7dBnv~iSPFwLyOELR6-<1>|`=> z)tIG@*qUlfH#y{m;DHdDY*#fo+06Y4ob)_gi0Ydz;MRD6O$=;^Pr80csPkeNvoJ5Fn} z7Rh0F4ueumsTWVE7c6cPau~jl`&VZhK4(6wm=Eq0I#_X&r?s(eiQLJTRuvW}d;0B+p07+u6HkfS5NCh3E zIP9lbm|m7><0{aUu1c{oTI){|Co8ARIaw)hFtXlg9^Wnw#-VbATLRqQ$y^)tRU1-?I^hcc>5LoR)Ms zH`LZMzTcL%#x}T~cSUW?afIBFrZ=!Awl_H}Zu}-~g!_}mH>SSTN)`#DFj~mWL#&fX49vHJ<)Iy`Qli1Imw{FY-*5A&}Tc@tg2kfiIdLA)^BtVB5fZ zGvB?@=b(Ve1Gg{OPZlU=UW&0^IiN*eW1rK{Z984wf8Dui=XX8MEv0Juaoxuw>$Tx( z0hGoqEf69O4i1`{Y3h}(!k}S>|N3!ww?);+h;-)or>8mqvE}FEL&w12#E&_~<3SO6{uXo!18^~$EUwk02gM6LhTdDox?$6YJhe|Prn%Zy7LLBiO_^9A}pz={9g z--@vPXNth5|GP0PWy60O0b~3xu;gR7=^v2I$E7CN|2573Tl@d%^#9WSzsL4J{r^w< z{~pBu^#9-O|7Q^Ym-hcXXaLgrUvvMT_WwQT|DTg|q!mGK24@xZg=*=^;$J1tYJ@%W z3jDFCD99z0fQzL-dBo~+iq`d+hH0BI#~p=>gIGgXfXnG+Fvy1D*m7qjLX{?xH8B&^IFlD$$bDHzmQw%8}!0l^$g6WB0Dmy8>?)cDt78YyRgwNSm zWOrm<{`H9D& z*tlV7*9k9c=5OABXOhfBzUap z`^6qN>PT#cyZ>B&p|l9%C#7ANzl1}snznA4tD8lZ8DRcsePI^@|0-Q9$s<$|Vrn~|PQcH$j)f{~#?{{5ewKaV^AL`p)^1fj!pEw7jQAxk(+ zO+6|RBg5mB8CtIjbN9pP{Q$WaK(9 z0+B`N`Lwn zwpHj+*;V~blnE|cApG$Hdd^k&ALT@~4ShfP-@G{u>L2=Jc7L{;Ii6czFu5quddQOS zi9#OF$L@&DJ0@u`ZqR0{a<2pOZr zO8DB7YW?El;{oMidYE~bXE$J4i5SzYVmiMNdK)CxAyF_&B6F6Gg>-{vIi zm&4l^{Cn4tO2o6dKp{(!)$t7^0^xfq#x`po)CofBc-P_dkM~P?Ji>JECGYYw!DRK~ zar9(^4-I>Ocqr^-F4!J2;mGb009L436jlr_c{&sbgnb4>GE+sYpB5j@Pnd{biQvld zPEF)(mU4ir&{)CdTD@i%k3W)D+FZve=vv7;pexT>ijx24C78Z1hCd`H50#R%YHrrKItL`mZUzrO?ggmZ2N-R50xN^9aTKk>6?r81y?th5cv-$5`h)( zVeDrT0q$4>Mpr>`r$IAQsb{(|`K&yF+{s7DECjEU$Q3=b>M;oYzt7{{XK)v8jL}o{ zv1d&WM=>iW#>9H3i)%-f{5vV$hbqQxi|#9L>iM#T2_8#IG#r`=)fAjxmo&F7W;KCo zd9eE@>m7ZU``;j=vF5Xl>|XHkSGg>~-KEQtt@JeFwRE2Z<@0Ba0@lH-(v^#kugi8w z)ZNNUphRdezw1_{;nW-6>sLbabWhgRQpfDR{dlus_Blsh&qY#sz@?Sq<`oZV1m6Nb zVpO7kLFR4FMARl;L6Ghd{~!^%hrJBmV@h%gdzMr(@$XDay~5ty=*< zs8)YQ2eoDN6|sF4cYrzzJ+Z*Nb-%}OtzCsn0!vY6$vN-4LT}eqPxGHo>!TI8D3!sJ zJ^3w=dn2!&rOZf+4Nb+5uJ@VVCNpZz129C)*!ORr>Xt~BvFd#@su$)~^)_$YEV^VB zGXj+F*7FVZ!_|?H%(LI!OBQam^lbFdah^oA?Ozfg9U37}!)t1@e7pY~2kjhDgF_SG|;Yx6S&HV9u$f)|PC8aRObHgFGtMDXg9sTt6lCi7F$1~*D zHY2Tj?zOd7k46_*uZ2-GThC7m)6HUbj8h%-lIRTXKX{V3p5kE?GiE zf3YAA)gkt6@RTUt*oo%RP|!qDN`VitX094?GdC8YVNKh?qTDWS$OVAe>#hL^M7;xwDaC;uU`a;l~01rJI*H-93b%W3XRC3(Gf zF=pn67f?|E@7vSy$!Y2G_hC@;o$#f~%)2 z+#WioU$03zNQu66>(Kq;>iTt{6i=VsX3z|hIR`k>$*FnUNqZi1b)wZ?Z&%QJ%5Y+3 zkkiZONLJEWn1WF?0Sywa#PV|0`$Ol1mtuKs2t`;WZsuvlQpNEt9A?1Ms5SHZ;7+;r z;DC>7vN~!hz5$QJr)QFN78r>ozx&YDA$26uodxOH{VeO5Hz94ZTB7LHKh7sVY?cPm z5@fn<7B@`yhn+IU6zjPr{|*jqZd}@i$r4v$Lh_R`p^2F%hp9R(;6Z+anpjmi=Q@Q*vIJ&;%I33#Ne@piz0iS zGEW7%6O1XQ(Is~x0*2jx^DQOpr=By;so=HVllSD69NTExki^Vy)>!1VA% zCzKAOeBNU$QIJ$FVzG6?${R3xH-6p+i&fkDNE$u00V2*RNeUY<4#Jm#=g_g3-VETYLHD@mAxXi6$5}3Y_9IDd%#7`ztU!mqR9+%wq0B4Y7Im%0 zh9Oqm({1{gbHX%|wZ?vE@7;crkiLb}4%nL}M@qq41W{W&EH_knp~$NVkh?%8~f6S zS=F?Bb`;s)9o4kz9YptquJ|1JA4_qS`5YUanH}atqXy5Z`a+gjK%qT81?Prsy@ngq zo!e~fanXqF*BD=$w7>@Sf6D|~gS4=Ly)#u)Z#$xLd!8DTj0+{cuGS|-n)16gd2+k* zGEnAp4R{1l#FQ0sCE0}JET^0{_m>3AZoY4ZC*)Cze5509&s_hxcc4(_B#*_bxauka z-Q9~aAs<&)SMb9kzuJ&O#q_eZIDqq=a60h&k-Jh^?^I92J8 zv~$n-BI)8p!aaVU62%-xGrEJ z!}uL>T%VNxn)`_qT>svU)Nx*|?P5oj6uYH=%5 zq!}5ZqYQhr$e6aAJG7L-4Ml@YPu1U%u}n@;iy0%{bKrpuJn0M1FU670hozKG@e^Y` zD*t4A_qU#IIB~>8^}BXrYpbi4R*1D-x}+2VfzIzfQC%JAU$|TTKeTKU?GLe=f98fs zDN^CBtCry5fLE2TE@<_!IndnOVN9?^k>g*#*E7h>L0G4TH*Aa^eg*@>^#{o@CSC_L z8sCE3{)pY;CfQwf49nKMkv85T`cUsFExrP9`JtKh1c|HG{vjGv@vlNcT; z#MAmP`mv(ATaHA&Rkm++fGaLWe-)sJB+8ymC_&jE%j=b-%b%)#9Xyf>kenurr>|@% zU9f8E4py3skzu+<0d}vXp|+DFXPH z7LG{J0_%uA^$3zOgBoX@b>!LCQxQ&6XH{Odn4ZsdFOQH zIbp)^x?(*%=seYIP-e(DR&%{AH=P1H8kY}?4@clBZ32Fw{z%ow{DU5l=&;f@1&t~G zG_467-kgPW zqHGwY)MuW3EA->})WN@&bAX|)N!;T36s!I8+rkP30SWtyH(9!?(&`sTaXOY((mMNK z-ExI2awN7y=Z6jySW7rq$j~Ip2dx8tu#Lm+aU@HNL>@Ugba3PIRClm0@+^m^q-c=A z?%FqnpAEgmf5i3f)>{m7B`eQd*i4n&bGN!r26VX7##XE|TYnmxymzI9-|&`0$e;}L z%DoTo^fqviLeth;C6p-jA%1k>i7}){v*f* zKgD#{$x}?Mti|St>6Y(xU`c6GZK(H#2Tm(2;c%g^c>ZirzlUfxi|+lCht&^fsi3l=`^aj= zTCN%hEikhwkpFJxX`wy|jCK!Al*B>gh{h=ND8F~Yvw#G)Co_*Xi1np%J2~wAqqpV}wi)UawS{6!E>^7BR!5@Q11Ji0m##ljE>$zjIhVW@@NmuK&Y zD%PT+Y2n~3qZ3y;YVt#-P!Us0jiy?le^WFrLTtsyPuU)iOWzE zCF--sn1hiP6CdBz$}u|GT?G2Q|MNz+J9$k{ROF~n@~ogkXW1BFt3Df+=VrL1R(v&k zB{Mjz!~F_L<77kkn>Y%L%fH2363J)$Qv}StUW3~G031kDnG$+eRM>?8r<;rXrkgzC zRzK(M`>MU)iI#c)v1w`?Y<3l^Fz`ai*gsQ$eZlm6ar~BG6#Lw6K`TfNjWdHI!vB^# zf6Z3n=y-|mw9lk8+C>xT}+u+iZ%2(Xk z#d+ivTFi6jn?x!=gH+N~-8=TkFk@p^?zew(AiRESRcJ+xV;w$J43Le#dRGhhOtOP+ zQZPtIUwNUj31DD18&8C$BFOlk#J-L&JeiT3OqPuPE&H`+eNbpD_pATeyLL7mME^!8>7UThl3qQnt(7VO69j>V>I8jrX>x#yRs+*a0P$$ZADMpJjuCn)KL6 z;ah~FG8*-4-F`j{eu(e!8ZfK1S=76%X-;77xX2@cn#c2g?}YH|+qj$^)OE6o*NT+s z-c0*7O-RCdcZVgATu0}yGxBb=lz|}Q1<5_9Ol^gSu(T^BNy8$%L)oM=5`5!xJ|z@P zWCmyJCJ)zz*6CK2?Lstph$vb(z09Y={z+&E$Hfn_%OrE!ge}7xiUDgs7>Ok1tZpsV zOB3EPoz!unW9a*5zH04KHLohH)ul`KR}MEH{S$hk%<+_jgiyn@vaU|f6hAP!(9BYr zL_^Jm1yHwiMk1jw&B8ytG?k5}{!Rn4bXDE37L8^T0TGjpH)x!@y|2tau!Z|ksd!F- zD)|Wst+UdOv9867g$do=1~^Xg(z})FRCK&G)jb*Vx`7KLWFXLrj@P06Col?Dj**{d zKl9{7+h!})T2|6H=m`t|(F>gAt}_!y4o~-s7OAdxb%^5bnBIGcsI{VRBfbVr+1Sp5fCA2@P@zmW^A$?^K0{D}s7iP*a`nwl`SuJi*hyfO(q}Mi!fG}9M?ZL@t z*km^T#^fCC88}e_4A?)#k2Zf5S|>vBk?!jDPcw-poIt%hbLiG&T1{slEXGRXx>Tx$ zr8Wa)Zo7`TXJ+CEFd!u1r`ph(38iLGB&XLPU=ZHLVS%b<>z*zk8 z-NeD3J)8C=1Z~q2MA$hXdat9C&8tB1*c8u0f=b)-^IhuHN|o6VWOgo^A;=OS7SSkc z0kjzl)^UFn?wE^9WJ=gKV=9j_s(VgI+DIE36pKby0fzoV7g+Ecn#2B(EFVi`B?BsI zYA3?uw*v)i=r66YmmKWsBRD8R|d&uB&>y z@783L|9tVp*YW`CBZOXBvAowy`CU8&A0d(NEyh0csMZc=R<(~|Z4{-X9;Uz7a*^ya zdiAoZNp-yEI5URD{2Dejme#lG3wg1JJDs85_SviNyz28wxX|IB;X(}qs@AEI_r=8} zTHUV^`=IM-Vq_)IAZg`W;KlwvYCB1ms-cji;jZ1h2V3 zhT_(m2!1jr>j`1Lx#uOm+>=XypD=OG>`UMb4IkaFq{_J=a`y>X7fkQuLR(OrGTd_~ zG8L-2D_#>d3x)V+cec>p>dkPu41MTjzsN~t&6O=&+q`&}^61$NnU zR;o`g)Z;a5^~M^PQG~Gr5;1(L(R44$!DZa72CICWM;Q*GFjU2zSbQuDS!p*jj87I6 zftK#Od%{)h_Z{juVV}87mwIS(au)RkyWVF9qPUfLFh16a-uo>cF=fzDG7D0be)U>GO*&OrRfMzAfiQR^1KSkQOD9Z4- ziXmHJ4|)4miV!23U$@V6I)Vo`b0c7T(rpuy;Z2_O-s3&2;rTZDdXxI>#dS4sOpdAB z5p$^TSrbl9f?~LS$BuF7e#BqvGVB4Ser-!))WCkpfv3uKd3+SI#wm43Ki1V%cX&F1 z!(=rh_(R(}7WJXX;!k;!K!~0*`aI%RJW4aI zo~5z<+3Rjj?C5NKeyzSs2KaE-@@*p6S%UjN1vPd;@e$WsE=;T zS2AKBHMg7CO{k|K<&0UXu4Gbg zu2xxFl>+UMxmdTCTKtAhQTn=g1pUSPYCaLhRQ}5>T6-O6(6^SHBj!8L!AoK-Zzio; z%d>VAFlYFgakTu1(r@yxsvgmDYUbbaDq3+zh%f%V_F62~QAALaKYy=ZyLj5g|25r@ zSh3U?-i`VPlrGBTtPiV|HD&_8LGT5{auBql$1j~+FG)4KxMP;feBi(zq>1mChvdnz1)Q5*!Oul7#`JXp&@z$HG{*<@td14M9 z)7d{yL&zDkhOdxSKe8z2|CLZWVpuP>5W_w?yP%wP(Nhn+pSQ;eO7^u_e4VMNYjd7sMmlsgHwZ^wyHKpkIj?p9Dtjd!g+t!y$YVJ+ZckA`5|)Ha zsS8w0aFBuo!R{akrAN~-RvKx^J2|z7m4Nwoz7%|eD{OCvzNeMjGMc26QdOVF#7u!M zn*)k9HFRi1(bU>-d42O$veZ%|jre2oql{LsY3KNhXe7C~yB_Hg(s0!}o)Fhs+vaB4 z0=4B91pO^zQUUin<8}%e=8Tdp`#pzORKfdqje{W#Xj5oZIzA!Y>pdU5_YUbe{!E{8 z?g%xHxwM}xjLM%pG0;CJTEVxh@=5mWp0%1wl(WyRGS@_>vD4Yi>4$c6v4^)bLtlj| zpet)Vb2S~CLV8{PicgiKd0BCrTuFQCt4{dLBS&Vv$zme^{}A_< zF?mJZ*67Av+Tu!mG#vG#&4aQ=t&Cu8|4ErEKcE;qf`g7U0oyco6vm=BSg>0IDuX0BSzaAqa z5ONz5 zhRMuQQ1J0=fEv6LH#TmhdS~q_4n{!sgAhK6gI!I-a8|j9i5NK4xpjK*&PBp5FxowL z|I0@S;b{g!RWFcc4~&(zY0fB22gp)_1gaQ_FkMV1yOA*kqw(=7H?!%J)y0oNVhQ|2 zhmy*6adGVaEl05E^GG02aCz$vIexOA+U09YG{1^1x2_HE)L*vwQGU}p8b{+?&q@22 zZsmv|bS`mx8}?gMOG4S=zav=vv^IhoHjGR)sG$Fab*)u>K-7s)(3Hf5<{DrIRlof~)Dk>j zUm~tmN?otR2rQ#Z7Uwo!X`fchjdUWNbl%nAVnflX*=FLaz5kAUQrl+&o$Qcn`dNr4==voHCdmxCnEefPGpoR0_rFw7q*KZC;S;k>R)c9QF@jT$qu6$3Aw176G@9$J`L#TE2F zK@AZ#Mq{@c+&Pu>?vNtWGM3b&m(|6wPq?^_(%hP`&?!rNf~K7`WXEMb+(t))POhpO zcTLIQgl{69@LCV3Q|3xD|2U@~E05SSpk(&qyt=wk{q;AA#NeAoxs!`#9W9qIaeO{j zL2ya4FlC6spJA+$iTP7Rh8^1ioGSibv28n%;(xrq7L4J2m8KLB5X(_*Hr3Xk!wTBL z!%J?JIwT5t%l^BqeCW*M;E@foo*3x>e)sJp@E{%Jwg-rE2lMn(zDt?9@OL;!%Jfe| zllM7Hu53`l6O3_l6$H9yJ~hu$1S!!7=aW+5Mn?M?0g&(jcGfM<21F;>%2#A-&A3HzNW?+=rD=| zbbKfA>u{vos^FJ*ly=TS3h3bV=-qg_?^M3+oULRQmgtX#F6w}P-v_^64F7o@I(-9| zw{QOOW$+_x=I}qanT(pxIR1V>D{6DNJ$L{6>Sa!7hs}Us$_UZAUmEdJkZFF4YWsl` zk6~UKx7Kut2qd+Ih=@5D0H-xQ@Qc^j)^9Cy4061BMs$ho+V%Qmg+;u`+v)43f(swW}a z`QNIJuCun{M3f?Dr#qz4GTPTHr7^OO1RlAo zSb0!DEl{cxBm>#r?gkg-Eq7WtDK%nXKz@G-1CZB_bKfm_s{!x@4AdjrvfPIz?6d~s&3;Yr8pOT)jr^Br-1@sRzwG{vuF3y6iFb{%kwZih{yQ|$ zvL&N9zZF$=ccc~?k)7NGKHupdA$L)H>IQGei;FE^u*d5Ner+3uZN_IM9h5g8sz~%O z0({va1~~BF4c%b|N;`$D>~XF?Zy1n*`|_$4eM=aQ0=auB4%s0Zb07%&8ZdX{ zve0w*xSX(d;2?_U0J#7$*LcSQH)v0Fn-~lj%C^!LUe@dwN5Eu3RF_ zR^RaGtP{>4ez%n#APEAedk_PJeq#Xh)*O*rKnFiz0Ev1$Nb6e;Xc8GpDXV4Qqf`EZ z5OQ?PR;NlCkwyQpOb?s*Z<#a({FN%kQrIkv4JADoC}$Zo#*p}Zdcc)7DztgPOMn`h z4c-LsNrrAE(h3);U(pRU{ULW&Q)Zx?B^g)$YKrm^exsB3CI%^x({Zr`Qo!P{us^{x z_yDFQrz~CE<=;T?dZ#~+rLaSB)X(}ZT9uKHp6nAH$5 zME&QoNBzyoqF6#T3&sxCxhOOg&n9|5=NJAO#yf@|-8k4jRQSoR5@|yzvm{9{=_w_q zgIm#T-RR?(EXxR$Zd;SIG;U4`qBO4yiQIJ?=b<6Skg%85lUta-8?B=a(EV8AjjCg2 zfo|Vx{v}AwhWy=So=bergaSdh=p#D|GEY}6$2=V&q~bq->x9&ey}|(e8|-rx7Hr}T zi7KchgfdzHv1h(TU;||KQll^gUBiM*fOa*Nkdvxli3{Gr5J7plYwnh{DP=bE5S&7I zKC(;=HSk{!4uzpeiK4#v%fvtR0*peqn(O`xjXHPQZbd!`VPr3;;e#+bCH!A#(2!S5 zT;JGMF5f4{3xwnUMs-f;DQ<1P!}X@^5vBV5*i{w$-*{ACWb7J23i}ael2%E7j6FrC zs4VL9e}K?N5r-af?3_X=29kZBMEBf^u2#7VVie3SP{uG|Kfa=|6y@_TpV2(3Nld!w zD1Hpl=6DSZIftlbkch&IO^!hgTG5i3jCq&$-=tzDDysO-9oglet?jfZS4Z|=0Ml-v zyz=s_tf~cxsZF^iX%3G`F1wx23ftge3(}#)lTX`xZ`1*RoyUgdut=Xx}X{ z#hNd3L1qFC;d;hzJbomOO#HXHl*%tTSqt1pS%Pwd0%2Pm9rPBM&}*neOG`_OO3Txj zZ4ieX5d*VJONE~goO!-pF6#>J?qJ7)Fl|7-NZFzY0Yg-R2TWqMwzRdewq{P2c1)7a zQ_TC+7xRhKqf$7lf1!?%lz~D(ASk=v)v2#&xn@D5i_MZeH03||-tP6!MT(GqRP5b5 zpp*JiSeduLTm4p`1yJFLdYPzm=VwN_2^H z6^o?BV!-UTwWB|w#9d54recxilJw?zQr8ALdD@Dpn_$?UhakuI>0BxYQOlYhNp$Ew z2awPvPm!IoVUugrp)@A{2DXh>xy~xjQb9GH&xHf*Oj1%+X^?@GnUov76q=k_rK?O!VjNIp;-3c?)UoI48+J? zT#-l2CXq%Uo(3f-6Fee=dQIn|iQtql1}X^v&@JZRs1JF}DKGzAfd+2P%)E9ne8acx z*VU4FEO<)@0oFFGMasosEHgNULPFBH9tQuqe6z6x7wmJ*9*5M#(yk4VGY%RIkt6gm ze+KU2L_AY9cG4TwlN_5`!CUssIm%DnJZX`gE6@LhweHrZ=$Pq&{=CS&ed@R2k=5Et z!}2kFOI^XXDW3s<0WI*^8)-JyY{lUm( z?0er=#Z$IuYzYUnj4;F~fPCi93(L!v<44{z(!n#ZfMs3K9t^Vs@=@x_R4~?Xd-KRE_0N{5`<1(dell1$7?Hal*Z)BjcUR>-)nt&1$ zxG@A7h%)bGHNbY-Z-7_I&L`2F?c6l4X$~VcoM>}y1819Pf{V7-t3D9v$TuacT51Ep zk4VqW^q-Q~g{|l6Xx8cpO2)9jFOZL>YG{VP)r-ebK+C5CI+OUKJA*;V^R;z;#u#n{ zYCW06CBqZ1FCBB}t`-owKZzQZiq-ic>bza5?vn}T<1#tVW|$Rt*r0VgmglVWLZGw6 ziAmhgPnPWUc7jdXusWMwI!(jN!CAgjA9+R5JE?%lq*$pp?Q3+LATb1BVcx{uQ>TT>G37bFy0TMJq$IuP0casu&1l~r>adQEHIK^M)z;YOSQBs@u;CiNBaNXT8GnuC@n_LI(EE7M87Hc8JK z)Gb-p$8NhPyGl|pBn-7#eHj)8g>1&&JE;kmQ=h{G=7ETbFRW8NZA6w5$dBmn-r*5p zO^(l}g4h3#iTaf+9k3`S%w!b!JZ}vB)Ri>61z1>wT-L|SsRB-i>Vb+r8?l5&SUn9& zl$;{knw?g@*vXMEvqhkaB9bDkIIQM?cIDuUepCiFIi^>;*V|OwneU@FuFQ=>kF!9e zyEd_$Zfu@O3sGWk>q#F^t?m+3<+AS0LjmpDoAZu%%OR7)aj%zD#iQ})+LvX?o+0D! z%N1ih^oDu^)LT2g$_6c-TDap&>;N8Ka=c zkgy-6X7_XC44BqL;G{E~OwLPu=ruOZU9jdz8Hsd}!|MWbU|L4X=infOw5?+YrdPp! ze)o>%(d*ktwVT?f>;<}`8V@5Jtan7J8Y*VvM+gDv-e1AR1!T@x_Aq~r`pAlmp9?BY z>gYg;MjPUSj5gqJ05twJe~?Z{RFs9a+}tNNn#^gQ2u1 zefm7*VJHr<4(L}ro+z6Mrd6%);`|-pO2wx80;&CyMIcUd^!G~&uVCR%0;jGOw9)a~ zL*wDIu`skIZRdsqmv;`vdbWR@#&jS zJxbaO8@4XB_y6j?*MA_de1tow=zG#3VarM?>Jm4ONM@oVIKRT@XhlEi9K&#zuv1Og z-uy`R7Y{E5As`lmVAGjap&K--B;!#_Mz(5r(bnScRWe6RKNPTm$4i_fW(dfz|8Vz8 zyUh|)q~mNgQL9v>2%fNQ0wG)KzdyB_g}dD5;#$Pb)PYvBA#P8i7FkX3gRjv$`~=A& z^gbaSnvu5FQ)=h~ws#u_5I!ATRHtnakniHXjl@oy13+2XHiI|zF=^Xn@64&VyfnwH zeWp=O8$0?po2Sb-UI)me85k18REd6kz@%;rzG4beM4p zZ9%fGJ@cS&`r(y2vmt*|T6s&G$3h3Sh@WSk%J!HAsK-2tlh!bju$DURgXbF`YPRA! zws()Is(y7;7b%&U1}Xr+Z8H7RX!R#1<>NXvR3*sTxINo7m*(OXRH4H!IYAM`ywvpF z!SAFGs=j#1#j0P=8wX5o0;OWa?Z%xmG<)Co*oY1pm1s|znMGfOLkfCZ8Fl9OBhx&s@y&mRFS8^s&`o%!~f{= zh@ep=B8QS$#^*LvzD4f}NT#scst2E8Uw&9}y-{~=s^0s=^j^+! z(b;(J^~J*l86ck$%gdK*w+1z7d5RHHQ>j@Y03q>%av81bcUi_V7J*Ok-Nyz$@&2kI zzQQNn^k-D$acSsKv;JY{1 z%=vyMPzw+a4PWpelsT6lNTc;p}j!{$DdJ)=e*_aFT7U6o)K59an1JA%Yy%1*8Yc({B1?naPfJGl<=BS&PJ zgZ2Q{J^V>XSU#3!R(_&!480>sUNDRspt{hXD4ThZuU?3th#Bik9YF=kn=}B>VZGtd z4Nq6m&^ZcS(I1Dy9IxdXTAkaboXBGLv37NkFzNa^_0Mplkiq%Bl~^&suO@>iyl3p; zP^hf=bFy~D6x&HoPHM5{>>M<|L8F>QJs1@(x8&PC<`gQ1wIwvLx3MN0RF`J{p+Qc= zJwml|cJK9Z^^xz6!>Dxd={Bqt0qL~$qb^i!U1s4hJdiwYWqMSF8l%riJW5*w=|^!L z#0@)a80*7nzS6LZKQ}e$^U+Kx&*t@uQWrqrrAoi1v{n}eQBqf3^ygCO)a1==Pu|Q) z<1;8oq_jQFJmDC$u@vekhoJ%qd_rqe!H#|Eq7+QCbV^!O)|;*ULudCabEijiuyP+& z`r@dC=~SL!S;Svib}KZ1DK{on07<2Gl(Z(W2%_goyDd3SSA90!x4!uPp;Pzc@bzkH zwOOmUvMA8&dOijda+=@RR_fYF-PFFEf?)?mFPg7y#P3c^>1qG5IZ(*p^I#cqXBC}q z|E$&oEehPSDZJE`ii&o{sa;kN6ET2_hIjJdS!D>N^TA5++I!#|XV3#)!(SdG)KhA| zXd{Yz%yPYr7Q?LF^PmdXxn?30xO(;n>Xw{>YED8uH{Av?r8wol9|paqdKFVFep72U ziRaG|8_stcj3+(BKCLVJmhYvt28zCu7Yt(aePeYsJ&SG~ofV$TSkXgsKu~ruX`ny( z`9X2xx`o&#Mw(P*r_XJ$vNe#M!xLv&TTxxn7}hT!dn%2;gd)9St=V{nRBa4OpOLvP zZaXc}@yUBCd#5)vJK!TLkUGkH(kuiM+<;90+pw!#dphKKx#2abLRX9Jdtc-nO}0=U zkj(-BPKzpAh6}~TP@8gvgq|aDu&sZt_kaGz0{qT3kf@7YuY&c69F77ktd@SJ%1~ZX zyxxo|@Bl`l(QcrBmyqE13yQ7$<$3RYm6%Ca!E*A)Ej)`yZ8Wn|*Sz)QaZ^U_x{7V( zo$U5i^on1j!VDGj_kRSt_HT<{#4iCMqcCDj%-sTEMHN7Q@p6Haax~AhA%15jekV@P z*Gw$Q49P++^%vf@K6i#Lp&ls%7;gJ##l}>>z*i43rmQDl5#>&~_v0lb+H(=aP)6if z6i6{MA*cL82Y+aBKRX-WGR<{p0U(QWEYjfsiqfq|by-_!r3xyG9FIR`?w zJXa%(D`CI}86X4@B=HaPBk6SoW=kL-RI#0Wk`OM1KCjx2R8J~Lcp~V7F+{^-dtOoK z9ZQcVdG&bSlfm5N|83tjLrqhE(ygf`{+`8p_E>{jCr3VbmdNsx$sQ~ObDlIoC#lfM z;>RmNZe>o--qP@2qd)a*f-mVc>E~3ZXUY!6#u_)0hs0b==M$GcMG-JFmt3t+k)sCU z`BC#JEl?v?Bm(SS+Jvry-5OKXJZGuBU4n!)9=Dj1C zbpo&KkdNV)b$2XjT74RwVH^#Rf9_l$oy6wE_F1T5@5dXD13sf`5p4P58u`^6&h>$s zG)}_gg8MeEQNDBvtH#2&VYwb*@e4GDh&&mB=mXzbrkO7bO@mi$?71{Q&bc2y@cT%A zL;>V4wjy02odk#LpZdyQRZ;{_1}!eq8kDydWn7{)VtT`+vGIS>8PDGjnaZTHxh?P8 zYW4OW-M%)Cs39g2w+ETb`Re)ZeIHZxzF#Ot6V$4+UIBau zt#-9}KV~`E(=?!OI}X0Y-j`lnoaU@t?oSv6xje|wdxgP-+8;j*m_^qOeEG|($6g$c z7*RJ$o}Y$^!u1(vNV7YmON=6T`gn2wHw$ip4)4&6IX;>#SJ%d*33r3&z>M|V^^$A^ zIq}W8;Aw;s#9UjjliX)4c54w+^SO%Tx|SsgZJw~=R3c=k?5n^17@Cri4@KzVexWPv z&K7hJAw&61>F*0T(kCLDmU9BbBceXNL;{ZwrV$|Y{*O6`-y&zh33A~g_!D&4x&z;J zuZ=SPqJP(=9)HEiOR$2_?Ov70$9P}WC&vJx8l4#C9$I07vT~%2PGax%i}T2h+;Vw4 z3y$V$-wCZA-!4hgKL0SLkC#}1bn5l?nt=YS(OP@=@vY4Z)Oi=BJlxeWvzP0A61!j> zENi(a@(oAYX_5dXr|PRwfXs=0m?Ex^q;v|n(8Z-GyAe_KoO|(v0tQ(SLSpEeGMkms z{UdO|(1GI7%$NP=nzWVk!VBu+LE$@NnCCRRy@>tTNazb5>xr z%v%<2elIVN^RaPTZMcX~mr-c2XqQtS5Dm^KXe~~&*FMf0aUOAdxt@ojaU=jjHgzKs zs`m>^bg>UrPR6x@UG4=LZ3qSl8wTz!2kEc?4(C&RiJ`~r@1;2;XdqK!G~E9$=&kZA z?4~9OV`GKt#DWxx(A-w#CmfEO4YI}qdm^IS-AiZf4&jKI$9uj{MWM{Nxo5rToVIva zwx?PtYN3`7Pc4&2}kaoDu zf179BY}VSJdgGV)veY@_5pyOu$38Vv!1INJg2Bhrfp5oHT%1wsQU)JTCOT-``(vd@ zV=0Tp4r$I(Fp@^t#WFn3COYHLKtKD8A|s$=F29UzU~_XYR$be)Mw`kb%fQ)O()AGa z=AoR6*x_;h)!JGNee|%R{Rnh6l#OZmbu6$b`_M0)>^@UFr8n9+(yhhUZb#VhcAHI* z$weX=P>O!LeBD(9GU?ew6US=rIn*1>)u+c~ZUA`=v);J6z2~|flMxY-lzXlCI6{ax z+FLg)n`fQ3L|)}S?mm>Lwd>nOBS60HjE>(RTUjHs@k#=!<IQ1|90L@4Kr^N*|@%0mHxr;kZ8cQDD{;HgtfEnA; zIkdC~>)DTil49tWp%GTzXMx@sOE2?9GO~AO>S(4@s9I(feOzg!bv+g}>1r(`*}W)A zbLn-EiE{BgG3TR*QK@{YjPu8A#O`V9w;XE0&U+C?vCbtU%gU-Y7fP7LjTcC}K~J{G z<$otjV~kEz;%-z0i>lNM>d5jVXB@Fos-h94aP0iLdjG_}NUsF8u#c*QOt`h=Xs}!- zr--FJ-$MIc?GZ=j8e#xYfV7c}8Ul@g&w)f#O=>{={=Q_q2~6*HtuwG<6P8!n;fwfb z_V6e&MEa|m+ksiHBpfZ(ogAeYU89|HZn$lQK8|bmOpS_%hj`?k@9ktvtr^Q6o}#e` zlU+&8m3t{NqB(FfA1?3Dp+dEiZ#pFt;e&#T`x`e#Ne^kAj=loLvL4EhL&VI2U5h4+ zCOf5jSv*o2%1Xj(Pa`KEWu}TSP8KdF^e1Ytkqn?uUAk4#n>#4%MNNHD=)fE+7y$!p znT97+QKS@+Q*m<;L~=m*)s&|Hfw&v}t7&jJP-%b1!pU}Df}WC>eKi_F6lbtrs)EYv zJCx%a7bvzRG-#Yy(+RSlfqV}-_t9Os@3v+rQMDk1K+C0yy?rO2{t9}MmrBn<# zT^_ncIyJ}{%y&LSMKQ!m+$}qdJeF~rl$F1xSkUn_XYcRNpwSWK`~ZgXIH{lulHdRm z`1+r9`gDFdQodhLT;`8!+c8uQUXhV5tz6~ZDypB{<@CM_=S2?ws1b+AJih)}qk}2n zAf3H#z3Zh!3As|2pD0H8;TW|>0f@Zu8nB*$dwp8a6^!U?EA+ehg;#VO3ndwm>{RQ@ zVVV_X(#Nn~=1?yD+*y@K=d-Nx)6BOl^I(vyT*AN>RTcpb5kkG;482W||1VQy{Y`2> zt^;We*4u+-s8c%rMJLm!=c#;}*r>)4P7sVefqETZ-;UbvqmJMOr>{CR9<)@pxj$~oCC&)IaBaW*ZEbZJ7Z zqrsiW4W9Q2ajNNMh9OnJLZE|d=i}R`=z8wOoG9KYZIdWXbAmH;T$aP~L3V2S&94$t zvPd?~5??nC2=#M~Dh@$alEAmFVS(z5NiO~*A){J)6qN40mXLsAIlu(f5uNj(Ci-*h zL0e|dFL5;!7Pgr}&XqsJ!c6G(1D?>YL2D(L=+g~Q9rsVK%$z!KKx$c2=RP!0M~ax4my&K(PGjzf ziqCIj{Z}4J$8EEJcd!tij3q@miA?NGBs_{POvznU)$k2r69;0n6*`&a^QBx z)$Y28hxWv5{Yh_o>=?ab9A8_H@z)V4VG^^j>opsS^J_fH3e7Sr?wgBapZc8?|n5;Xg*EDGHmfge1I| z0Khy(G5Av;gfo|xq-b3#6NN&rqip?Ek{P$oysOKec5D5vtkjN!0gd?$Ls*NWBu?Dd zy|i*SNUpgGelQGAnrkQLE~>KBO-cZUE4<8FVkpInG8JgTh)|A11NWDv0WrWnezuPJ zGbF&}s9MHt3hQ_Na5p9keTMbdfeirscfvM3o<`<)Ieo1N2y3svM}s6h3n zz3*3jy8Mi!+bM6h)R-BrbXhZxjB4(hEXQ_`0FT>Eb8ZX8L5k0U^WQ-bDAQy7=||ne z0=_8^^!Vw}C~Y!_9k80+0z(adY*3y$HnCgeQrkkt%(J4@jpcFel4aAT-bL*12%Ai53+7k-S$seW$iP! zb;sEEv+&E`GbP#{s#_~=n{gSGN?KSn+n9}S?Ny{s)6ee0GJ-^24w7ItbQUw|-;@{j zOZ6AH-!$j20%!MN8 z&l-xMSe)H~pFN!BTnJ)Fw|K0Tj|+`8Y;aNZUwszlI7f-`2d8ZxEHd_O;!$wl(TtDy z$P6TVFV%g1LVBx-g!Ow|tB*xai`iE)!+gH)WSkormT!1@oH`wiN5{^=Oubpv==bC( zm4R;+-pv#JEW-~Zw!eM5@^1K);&ew)2y&-Ucp zkr}*R)5FmQjYjv==PQ3eJ>hbkW~)3#-kc+=4eLn8uHQBv)~8W3OpSEkA%Z{?9TIB8 znkkcD{AMwpFMW~W+XQv1-ap@X-VMWqF9l+G>AWQ%uU(|P^>$RHK}GlZK5sYDJ-rcS zfH^Y_e-v5mKPLq5o!Wxy>FP+%Y%~dO9lE^1q#eB>$Su<C?`hVzPTEnCP|lrV~;8 z({P(@|5FMgM5g6g6mgRYhVRaE?)q1883VI|)#kG>x7!E}`!{xj)V_H9a>C0AtTk#7 zly+JFP__K!)a}5p>#Ws&-dj$*Z5%{yn6b@wE00UNSw*j*bW!qtvx%SI(S7e#;c=yBzhA#THMORF!kJ%Ir&`3} z>C*|BARG0D(d5C$Uunin7z{-gbK7M*Hg=%R5hQ()&a&B=(8S%Pty8z=tD4HMW?I-p z>`&%MnDb)UdH_8ZO%PWs>ZFaok4>=uy8bi?bW|l((`^&JD^QtOUS_9EJfD4TM?QTu z`w`?$@8LE{@&z;JutZl(37bCowpOFTrfmK)xy~T$x5d$o&Xn$^GD7+(c_l|pffq_k z(^jroXM9#^gs67u5_{#znXVoB`WQMs3%zYA^49jpP0gU1u*Sb3m>&RzwA zJz=SBQH$NO_mA_&#jh~=+Ra*F&*eDQ3)MSqGZlhO9$0hVxKdz*@(NqBJkK2l{6;p_ z<_1)Nj_OK6hHaq{W!CCj{NE^C^p>c|P1+w=l|IbAsA}MAb+AA$w)@Z2Mc?;A*&stK z+gX-REzflBY9gEALz=5B#}qDd-KiXl-FS1%4SW8=ogM+Rac>!EYE?NoEjcaO^gs3W zqYI^6>NSW-eH0_4B=INFL9XndcMAoAL zk_*ZU#pWk!ZODy>9J4DySb+7PK=VrOX-6^5JbwC{3tKyfTO#$dvuc>GCO!^8WeO!w zcqS^ewxRu04clN3ebrW6zY6CE(V)^}YdEd_CtpZ3g>nZ zTHxhLURdl_c3PeOGs?nYXJKgpgMpYRcoR!qBD3->c*18U)~3HkzOD*{d(Qn>nsrvn zGC#Tqt)6?|?8?%&*e&gZB>$zRe6Oe)`Xf=)lnFXykhM>ab{XW-uwx~4flQe>$Mz)( zAXHXJYsY#}FL~!Mudu@*>f)sI!A}5^gNd1ls~a6SrOn$ZE9QVY)&HObF}^k4jm3mK zMWQB%Q+ua{ffAQ2?tEA(1(I%~S_$Dh6=>Y*KkkX`&Ltz+E5+MoaOXBXrfb8LKj=$+ zD2$V7(8QGVPTA+LRF!abeLeVK&7NIR%}V{2=BceZ9{VS#{#<~uo6 zx>|6^MMoA1p6@Gmad(a0D;>W^pr&o^;%x4gd|qdf=X---Va=6_pFHy`PiHi=L22d= zbel5oIDLI{<5G`Ht)&;$y6PK)Ba;pmQw!N=9@Vp}72VBa+RD|{8I=+7!_4MMq&`PU zTUCqGoO->Bjp|N%PF%4CwWmAPqu`V3Kj5fCghkYI)D|r*+9jNN12~ltC@3iQ?NJjm zYt3)XEn;V0MOp9006&OR+LV?xUfT{1Cg{ae!N$0jJ=(T}a~xM|GOQ(d^Og!r59vU` zaz7O02x&H7*7CRS^@2Q;baUiy?hfZVfxmkU@gWYMBt@5UU}xn$NjJ=GBi;iPu(mhE zD~lHoHDk;jEStDE`?w`My-=j>6>LXnFK!2C4aJyk1fGkhC7MKAvx~~~hZ!}^npvl3 zk6<5--1&;NEl$(7@!d66xOx4osp#DfFcA0MDV^)&HHPjh2* z1itPUtrX1%d8o{coRW5zHy5{v)w{{3!Cl?rmHgAAxK$~4WZrtkGUZoK6`w*v5$ZSc z-(jOs*?tg58(Ko*`fhd@v$Y8Z%pKc4R!VPue$6Vk=wv^Bt>JR8Lp*%nxGdvJ^<+q3 zy~aIDcx7pgC{k=tSV1^oR0=C7E!)xla*ED+YDAQjAAsQNVX`P+UhPk`C`&c+aeLr; zdOHcfEo0Mx+Xn2(#=C-MsjV?>x64L#{;iAMD-P{)1^h*2mK(6N&7I2Spenh}7Fn$6 zyUT9HA=?2HWjA3W7YueacFw8(Put8)xfCQn(1qc%*uuak>5oaee@}GDntxAW_&kk& zPg1b>zmMgUMgQ|L*pB~88DR^o|4W(w`Ktd_=6}BG|19&rs{ijY|Ev1Tf=*Zx8_T?) z|1|sns_#Avt6aY@AwIiq**WWx3Gso^GDvH zSC&*)R4$p2A-^4aB?X z`Th$qwomKK0oSZ$IzvL5zxJw<$mi1y1 zFN-}4mQjKGSTbKe|4)U4oo{Y@v}cjX+Nk$f^+xGwA6*HJ0v=n>-oPIXrm+p4jGXTJChz+;593s=&Htxa-A@*M!fnRgq&`3D?W2Gb>}D&oH}hJD&)N zPul;cAZF4kR?^67uOLvRZ)$Y90g@oBN~zUMnyBlbw#TSXHerSxLOZN8CzY=?p9dLs zn!MoEt4h-XntV9*MOGFI9Q!P;&ql_MAdK;gVJP zbdz5*)kRJsYucvbv<~l;$$b*FRQ+fz=a~leKv7{~4msg~q3ULYEz(!w;*Q;9);-5$ zfTUuICxUz6jpk3A@f4r9kT$i)Pvtc|Va%EkfWY9%r_3;G3 zMF)&gmSIWN=F*oN={IT2eZJ+&d4_0?)2m{$(KTYvx3h>}LqHhhnsUsX!ZmVqa4V(hvS3yWakCP3!X3ZRZSlt! zlh>-Iu$YyT*?5;NN?~!QNluWr$EaQ^A*DjvnSR`pzn+X7Z-1YCs)US@*NIAZ(#f;n zprA35V95FYzUoUe<9Q`ab?2F~$=m^JI??=}BH|jmk_k`NHnKjvo!uQ~gT~!G-i0?F zZ*lt6^T7bKk;S34hk;Ivkuj`IPP0hjvXalkz0IK+8OPiMtM7%5(ui{e_;TCKhX{>~ zguQS{fBX_GqP*}&{hmgVs6%ZIjVD#UB2)+I_Yi_GI+()EX_t9AJCbsY2moe(S!Z>e z=-O}I64~GrIWD(;`OZKHx#+MCtBB=TA4lAmQGD3_v;C-SHFblJeOXQg*sC*TY_l%m z<;}6u`ui(AzlgiGt4Q`ix;ZVzg!>bvtftu@N;|nd>~;}irvS0qjf+%{Oh?+?C#gz{ zR<<0vDXJq(FuI_i(bo8P-odk7Gk#_NH2b&5(b=Le8s`M>>c~OqCYK0ADux}aRV*1_ zvjM#zC>-0{F~*uR$o{c5W|!H*i>r7{-Pir!kn+oIIZZbs&V!R0M!@wdNm+y3>s1WK zi8J<`!-1GD>4`CTdQgpc1|YlPMg_0}R{R{#`Rpbg2PEIs=9D(xGfQ}RE3Kl42F#9Yp zVP^SM8ng2$VFR1h4ro+R3@q1(&VJDf+$v}`kLRqrOJrf%8sR~;}m@($~ z{obZg*vY41CXpg(H`q!PvyvDJI846uO1r8Irmd`?NkOj1{gL7Z(a7-7N8rT@9PTdi z-XH?sobUmmE#JEyFe&V`oh-`6qhYB_$BQFm0m-hs(oSDpyCkdD?%zH?m_Fn65D@H}~5S`VcSt`-)hH8_RD{>R~P=*~>%7-xXp) zL~SHr3uzNI@5R00RaVzhr1%!M$aL$tSrF%?=pr(i_;B>)sK4m%;Zoq*w?{^a0vMwD z4uK>MbE0p7sa<+IE2VL()Zs`=?=A*TL*!ihc2yy$q@L&smSR`i!spNIu4hO_ng-zB zUT!uR1$l*|hW;67>C=LQHvF?iWMO#R+N>^r@eBn^$bbn^6WtA`e{JzsZvHe z^v!%Ie?;LY_lX_Hij^{yd{J$U4E6^y*B>tpX0PMkVAlL@i^VBq*UfO_iUIKprB+I& zdLzC4>BT)vjDoK2NvAH4r}-LXFoP;Ja5AMl0}xer2$b+md#}37h!s;kjQJB1pKv>i z@*;74i(FDF<77oOwQLXO+KE70y_qxh|GoA0xDlCs2Wt^cohc8ncxwMM%r0~DHJFHx za@+2LdA}ucOjHt3O#ZQY9G?GtqUUeqRA+(FS13*m$$PZA|qrqur4D*roOT0dKKWA)mF?=eaJe}p1Y+y zEAa7d28BEg8rGP^e7TZA+lm>KB9<~Yr(zemS^;MlW{Q<5|JS{S+vyP*$4W4pBcaRS z#?61%Q$i&T6!OKY?+WzR>9KD1D$p(8yu9f-ABVXusw=9mR~UiK+0;ay0iA+J>wgyb zcGT|e$&#t5DJTK}3k%E5%?*13n7`UsSvfg5wfMgINJ&Y#yK|)^OLrNMuj^*y46rbt z@FPvs`TcA%kM(#nVj^Ulca}d>5YYDb-b~a)_3mbbzFqidLicB+k+MVlUrhJ^vC;pR zJ^bIs^8eVj|EIzI|Gl~YKlS{-vZ0A^pE#FY2PXP+9}#G=Wp??8H3JXS^xDUZugYfp zjj$J7D-sjM8G{UQtB(aFo~!%e=_lEHmiMu+LufK57L15+pY$9gdTrS!2-xYC1(fk; z1Y!IebDtWvBeB8V%K66(;)h8!F|I=&skk_Xg}WGS$gZMDs0_OUww^pyP7Z2JCV5De zK$U118bHWuUXAm6TSl^VkENcp1KWvfHU@ASJA14$@ZwEZXGg82BpXZopg>{4?u={t zSfA0a0A$KAD9zH4$`?YA38neo&X%)A^ppX}Izb4Kt--SOhpW?dbH%P1G5A`E4^hp& z=ksktl8J~ivm;d}>WZ2QPXlk3F;>&N1YMoN>dg-4yjF{(T_8|9c zfAe`VA6jv04ohb$TUAWCEQ`dQdt8i4j#%Bv?aid0ruwqiKR<;cGbM9;5Su%a9jZIR zTC*N5Z+{~hv9wu;p`0@gxS5Ri-K&#Mo=rC$*x~gZ$4d9A*|=%j`Kcu~UtgcE{TmbN zqft*Qb1Tw-nwqv^gWZ+S=}7PL*!G4Uw>x}`^17=;*F}otvbDtM)E`AXGOZhpiy)z3 zk9xWT_JQjP{Mw3!)rtxWY5`YPEsjmUmds7Vq&McKU3!TKx>~W8<{O*5DV&_YAJp{T zvR+o}RBsMwT?#7t1+>`3V*LNjp>4G*{N;Dg>5(R{opdl6#@6H$#~xx6$lYS zdo&!_N9aXcb@o`iJb%BmusHNRl$RbrN?yAMH1W|aoJt|Y8^Yy$7PLQ{bcR*ig1UPR zV@wY2Z+F!;;)T3#YD0kFOW{CO_^aK-evaL|WxzliRb1ANkXIzT-QsxL)bQ{U(sng) z(8iujAVn3T&cb7u+(7_n3UVok8>NAp;zONNx}dB|?43$S#BWoX-Rm*V1|tdjh={qY7j8GFY_uF>Gx0G zm1Iv(;`nH2eYL}T7Z@5}V$$4&BJ8mU z>wmNh#Pnq{zVXYIrU(rD)yw;DAzG*k;+&w=JF%a9^<7lfN8pipmt=0$o6Z*c9d8BA zPrkka*=3A#>1fXTp`=a!L?knN36fxndn-a#PZ9FhbgjsAEzsd%alaW&M2Jn^ zVrsGlXKBdcnAY+0J`2;lZ4QxE^oo*trUzhf*3irw@8$8y{kaP#g>NL3Vp`R-D6_r0 z;=y0xq+(I{0h~0krZ)+l0BP9Bp$3G^q|yAvPG_;^&6rhIIcL;eS_O`@hr{)p(P2$F zryfm0Mtm_uX50gl(&5FRP}+cQ4xT=Qd5cETz|%YwSLk=~;xLf<@L<}Xk#9ui@zPXy zPWwVN;(gZwkbFqonx$yv^k*&~Ep0gXeUO+nmC9Y`&ScrY*i(N7&xj&33oewu{CHHQ zGVY$$*(Fgfe_3%oX%1}ig}UE+d9jzXRq-0QdhL=$HyOL+JnM`QOVtL5=JqhPZ#5E# ztOo5RBvS$qm{+FZtL#%a^by40JXxDCZ&VzqVGn5vZl=P$-ma_6n^Zl{cfA30yf95I zA8QyOx<;n*3Fyz=Nmd?&4(?N9hD$x!~7QoWl71HzvZg0#m24))wqG}l+XEy z#ji8|gZR|~+bY68k4ZE+PnZ?Z=u;5{suKg#-@TvkkNFwnnc_9EEq3>o=CQY?v&Pik zCG%D?GCj3Z;J+*tH^rcGOZ2y+lR!qc-tufGuY!+o`NqfNgg`-NW-ql|E7(MsX+ zmY8QU^M}#gd)X=x$+}!jpjQ_CaA?Nyil$(XAKqnk`ZM2Fy@L=l$v{l2vhAnndde8d zLN3#x)Ck9`SU=Cbxw&S{9(>z2P4#y1(9PDtJ>EF(Cl81y*niXT^62p-9de8V4_at^ zr(!u#6QYvk(1qXVMM>wo2OwVg5<$v9$mkHR&87!=tXSx}IcS<|Pa|&kO;?Hc)jCoW z0V)h4NM~pQ>n{udb;60_0lS{)jbVP0O|80`ZWK}fd=K;D`y=>mJ-uvUD##|W1IFFg zYeD!5Q~0Mc!v90sUkAm}MbV;oV0(3iJ z?)~A`=GHn!)`Ns@`qk>%wCeu7^`w@UG<l|-3>Uh+T3^q{&);x= zeS)yy`4JratZYAPG_Q5#{M09ISlaPgi?xeR5rtIi+tmf$NiATWZzOy}F{f<`aDSyzsO6nWLr0!t2+^Sg}-rWg;tY^Il7v_GXCqo!1Vv4lHwGT3xEQR*RdnDd`0xnuh7;JM?2#BVP`}hqm4exe}NXCfwZ-LzH#0 z0adl0o0GHX^UTFnTUVEm{B&wYJsyW>*x=}c3E zQAP7^tvYvBGm$s5=-M=n_+NfdjuK(WQa}bd`>r=+uh;KTv7ERmoZQ;y$W-3WPBp;# zlk?f%C0*?R>**X+wb(W~X2sS8#~-B6#AP10<4QRyRZq#bZc7FyHU?>Dt4l3qQnFis zbOkBCt?x$rb6v_Ee?dXTG#csi<6e21*lx0*KEBqYRpmt5g_wRkGi|NsHd+Nn)SUHx zO8Af37ETrB^<7@~Y}hEdUsOZwYH!ughmVt`(cGV$EUZP-h+l*fn@GA0$0%C3NYUG> zbZOBL>{bxd#eQJsQ=(a`LLxzecK#@Uq%#nlH>VAelI9?%7HE?!uf!D1NqlVBA|*_n zbv7zA{UBw*wS1Qy<#DH~IE(34${0Tg)R*Tg|24&)`(Dnwr;#h)YmVh1Ed0>i)^CWJ zgz#o*ORNpY0VwdPvSMV+*6JD>4OL{__$uh$DU{74f8@}sVE6_}FKyr^mC9E+^IBFJ zeev1*HU)-(`kgBMMTU4G-HTHXVZK?li|;gyAka@3N|qWA3NG~_w%egJMfIZQzJC@T zoYir&i- zFHVVdIiW$h8t3#hRIX!^)m3qGd*f3;{mp{Nilq>5-JS72i~d1VUCErf9ddms3*7W( zGfXt8yY{WsiieGBk@)Gh3Q%*-(>F)A3{+t{jtUHO2%&0p6$j7nS8Eua;c?O78A3*f zIe9$Hw{_V=@oO5Inj6W!~r~3Hyw$TdLgGJ|f_IL|rdVOY3GkAPANc0F{ znV_|7)h5937(!!o|Be>W)-WAt-c?Nrgy|u}54E-!Kd-N^^;*&KD<%X<7N7u2cod6* ze`A*41BvrUM6=Z%SpOu<&!NRw!K>feb+R#R;C+>_3nBFUnjQ+Ce8=ESY8!30;VD8cz~*-+x|m0>dv31=gctM5gxlNw#+2p6mWec+N<9ywER_HSLd zk85nUcrgSa6NjXGY;vEgAD^y*xvryc0-~(kl&@RqMu@6G%Yi9Ov_@T`tgno7x^@Pn z7_)R9Vd!6dO*g3Wj>E-&fBo(Ku~?^fLWj;O@J6e?c*%&mwZ3SY%Z&}}lLjDt@EvfKoc%K!1h+(8SHm_H(> z|FS<&nMK6K#-Qx$9$r?zxiqRh779T~iN;_=GqsiX$w4ryf}f3zI$Kgp_z3rP&f&`= zP|L_h#-T&y4lxnZWb)LF>J{+0rhy9c41ZsQC|b-nW%>wz7@k#W>U>Q|-FD=8y;+d@ z*6seogPp})XwG7Q8$)VK#f{}&&!6r^xBg&X_KfqlK-R7rER^zIYTBX#E6kw%uOP^Y zD)#xrb-aMWyh6LBvuM5GWG1lp>G7wuaV0*1xU!E{G^6DKZuEoA!13nRK|3rmS<~Ca z`>WQ6r2u%FkkEasLRAxV7Z;@v6YrjV6=(dA@&so0$VLB7XgF~_b5XP=XW8>pFSxa1 zAzlB3s&ad)=#!(qyD%gHF+0d9>`>X4-uVyBpn#9!#2z7LbIrFb*-Cu^Rq=pR?1mmP z-?6jAaC7CH!U02OxS!wZjFM)Mz7w7ncRy}%HBA5G9w*)c+;8-J=()-6y7|_1oPqAX z&MvX-?)wNyen$o;|CtM<>J2#_zYF? zyyB`gp-dqLq|wJzwYGa$-Lg@TH)JhVEz1py77K181F8OZOP6vh;P$0;53kvl@z*R3 zIFYNO&R-_#d#jpW&NbTyQC4?^g#XmyziWz>qlm8bvir>5I(wL8#*Tp(GJr-w&w`Y; zOy0<(@$ZA*hKha3u-<|3C!$XtHtODdIjYJ|F41zGkx{{vI5-h_i>LynbM*nK%WACjG}euM+tCQmP2H z`ZbQf{5$(R>isjcy1In)Ck2Fv{ffFv+G;R(z35GJ%_yp`wzV6RhlFN@Cee-J;oW%a zwxurZsB5y@i%)uqv5>utO(7`0wl=+No{AOEpyD*6L3`i&>+qY4bV)9UNZsdz~VEw9nps2VuUZMBARymegLhcfwy>#L{f zcpMSYz{KKtD^-fr{tWz?Hp!-U(5p(eVt+?@e>e%B@Bp}NugcN%7+$vU@q!P-XGNY8 zC!0^pNa?hoCo|f_65MI}7i2@oG#pC8H=f^q*Yjw0h|B!fv|Vu#88R2VKbH#}mca;qStly(-$<0YcL zpLGwcQvv4h;g3@b3#N}ghMfdDz-J-3%%VDr?|C3TS5HOwmG_$$jlRd9HS$7K5Yh^V zf|{VP;MLd7fqlE6Pua(8;4KMbS% zb7QMQ<#d|ucQ2?2Q)+#Cap02i%a=GEdpL5T&h*_{E#&0tvMI4*s`aNiptG^@AaxE6 zVQCMIDzq{N@+PL1A-yfMVK%^=4%&}i3)h8}zQ#sRxNzsu2>;*L)$}hWHpc(HLd!kG ztVg2n_ZgDUOvSG3qPREZ=LEgy>Uq)mjzKQ)`FxHpk$?2?WjI@{-`3Tvd%+3S&eepe zwEnth`Wa{cJ+rg{n%p3stYQ1nqLRfzHPU?&hmHvGN#rP_^BqeHlJc1Uz?uv|0ay1b z8~%Xoy}8*T%7WR(H3H5LHt8LQ?RBO!#!1434V`=_mWYlOISO4<=B}I5TM9No%Um|s z7Z4c&I82}-ITpmRT1P?OLF%COx(ytH54520wN>Y;bImE3h;v~vcW4zf0ghVhOzh7n|4seExXk)%| zPIaSIKSel3)1$g+vF=akrR6eZ8FzqMoNqi6;Vs&tsDM&2OGP}cLt4E@AA#KT^eFt@ zq09}JbrH+#;NQ_(Q=p56vzPjWi~cR&3tZy9xpT3hzr2Lxw-ubEhla7B0q@?^pOXY3+0R%KgRt7OnGcpJ9V^}R znpYMR^t>-G3L8(|<8`hTPLr%ODKs&qJ3KWQ@ISnFNNYGPifgQOo+aP8qyzL^E7;jI z1nyZcJy+V>Pc79X;@kwNXv^#bg)I6zWbPY-gCQKvH%U4~`f_x8C~o2IS3%=cSN z+hxydo?zEwKfGQuxj0!@0|gjR*rc!0iw_)Dlc9Ma!V_1?%>_!&H3glUnYie_#L11= z7edmiGu|#cU@}bME@bh>%$rvx;fz?zbbWk+>iRS3Mnw;UigVy@A zFMjZmTt#S12Xf~U_{FaW4Trq#Ny`gY44VA}G)`GGsK$Ggqn)~pv&$R`5yIBWh8Iaf zD;kUA-<1{FJL5qSfGPA^?TA3cTfCpAQWhTv>g{fabo18b$_oET1Bs%;!KC|hj_B-B z>3VrPNvR9_Y8eIT+T)VtQN4V#lIBIJbSld0AqX9fQ|6J#PTs8?h3k_11}C`K%$tZG z-0pcN2psxOm$_-eNf8EJARAB)4Q)$Q! zdy3Kxdjd>DhN1=_<{)_&wp!Ch@w~y>Sd?egGWMXP!oU-)NydLr* z>tZ5m`QU&!z3HpVKg)Q*0xCew8ZgIy$jR21UuryWy|}AH)5~|d>gW47oeeayUAbG& zZNv5b{r~uc72H60dBb01aT+NZN!*{z05lwevFJCYtH<{J=!PvWVZ3}&X3qsZev8id zFHC0y*wWVDE2j^ZJ9^j#N$2g~ABI;;1#bDNzK0&jaVT!G5Riy$5oVSsTg_X@K0=PX ztSCevIJbW*YG}_F>&#wIC$00ocboQ3>~B`6<&8}=H|4I(fQQcB_&W*qd5=26utxt1 zXzqY5kVGJ5j8Du8f1LH2-HTWNjtVAezV^f-0PwV`Uzw2dVAW%)Uub;0Xr)-`m#DuM zb&BiNd#GY`JYM1>x{CRgrwCvN_wX1T{E!gGIhB@A`%Z2(Pq-^$u%A~!9g#72!##77 z{+kg;oAkKScNQ7syYunp6!hoE2m>U&U*zbF*-&Z+3kmu105Km4h;fi!3gC%m^7AgC z4d3>)QVqF?#&a{f-6J2ZYI0i}&^&)N{QCLz=i>_zeZ4gv0dKv5cy=rC>#Y{0OdhMJ z)$BsVXW`~1kGONy()4sJ$ipMkoy47^qhsr`)X=sLb$caWuOiF!uB^d+pR@}Vy0=@U zh%(l$9{y$#iT_Twp+?kr7w>V=c+rD$^ofsds|A0xpnyR-Q#O(a?NCmaw<+Kfz`znHfh17ou;m~*diBIB zrpg_w2x0nE;5D$&5J=^j-@LO-zTIZqdlr~jx;;-NYJ%kG)Fg$ozC`erYSxnw5Qyk(w-&-{vP=x3kXGMM}aG1x5V5X6JmF zNrrju1!`^{k)C}TXBRfKm4`0Yf0e~M$7=_yzDj%0-)fL5H}157uY=X z;3$y0ZQ~zN)x5mo1=i=rk6vpDbNeT<_>GZGCo7+ryFGbK608zw3^bM>T z_&OHmS=4!4vOw9g*Kc;N&9++Wmy(h2fUQ|MYbcV`5xNZ8n4?@8X6Vxq7s6b7d^f6W z1EoN=|6$?N@yql*!DFjP%_Vj$F#)Nod&D5ivPv*qv!oF$_^JJ`kkn&qXB3I=6YKnP zqM)a8eUA(vu3kN3yB?9Xi|4WqhEqfhmZY|-CsN>!7uick@rw&`YYB9BJJpEf^ zaKj4Eu0?gT)aC603%%&_6xPFLt?{~4X3O?i&3Fnn|CjQT`ZgjIGd;bm)w8;9O3?+5 zG)W0y3roRG-*TIXKXR&>;)b7VziJ)OzZe-$Pp#3BE^75X)^|Cu!_V5AOF58)1~3sT z0M^V0znhqKuT-r?yyVhtbTtHMjIZ;tuHFo%zn+3m?0l8 zQR}-(q#*GNzvbBE7ppL}|)2FNPUCLzf>GGISvpYEEL(7AAeT7a~iQ#8^-l>+Kk zu|(Pp(fH8i9V5u-sM2C#L5pW!ZCiMa+t}pFUWB0)5;_s4;xUE`QEv$>P>0Wzwj)~_ zzzUsL`7)jjXwy(~z86@Q*ZDTG5*)I>hBu~{B+h-knnV+B@LKhXZvBXK)pmmW!=gVk zncK`i`6+(}wU?g~APPfEO2q^4YzzwnC_mIxOcx$4aOaRqCh`j60gt_rZj~=8nvRw51c|cI&&f0-G8nu8(iuQ$JQSvm$8u58jNo7SdOOp7JGw zg{qgtzZw_;QI{1##Ix9)8S=Vo77;0Dx%t=WXJ~qq zovLl4y1w-MY4Un+J?f0WV{!f??f}jrMY8hyGMLgr(+7RzlTJrHMZS8DG6!+x&tEpj zV`3hfq3JSab?Ud$*LQZIBeql@KF?~OF5Kb=5~@Hvb;Sn9^}3WZ+M%Xq zYa>{Mb?Wa)4+7o-iHUb9N53{rbs1xY?$~*yAM*oKYh;U=Wf7jDII<&cv^>O@7Rw_Q z4{0QKXCFU)i=%qubYoMd_ANov0Sh`=XeXF}0loayfR|oY%q-Y?TV~n`8bFkKenlln zA7L*l9vBsB{3=16DCUU%OLjScISp^P>Jr13{`tVj_-sKiRl@tjWR7@ zim)K|-Kpoa-Y9Y2yZL!E!Ywo=^zKA99U`42frVZa#zz-FW5?b$Z^At7kZ2Z-^5s{W zx|+&bBjR2MvgzN9dIEWlbSc#+sLBnPOI0u5KwDe0va%Z2WO2H6JJi1F`kWbmjMv3+ zK-WU*6*DDFBr+I&X+X$~RQ~Kyo-K7DuCUVi+wcQ^jqH#dhqo*dyAF*#tR z?d$d@!!NTPmnspaQpX2qpftAex#~%-v%Q%06V_B_(42}lXrBhG&Xfov%uSXKp}Awv zAdRmG&01G_$JHl!rZfvsbqV{bHI(PMzgUW}(Qr_fj1VA}pPvqjuF>_BU+Ef%ODp!i z9t?9f?&hz6xZ4^RwI;5Nug?0MbihzzYfO%+f8l*fXlp4TSaSlPV&{S&8t2iD514}| z%Oy+#vFGax@nB7Q9_yV$mn&X_O(qG~Z#V69+Ie|sA@_U*vcR^6QG9FS#8iYj8nN>b zDJQQcW+)cBeyf&p!59TyqqyzaZCEdwMI@zelNk9|f*qn+CgAuh1Fchg_$U(_$H33! zSSGZJCof6L+B`x6;%AqzkK<80pG18lRi;M!j7Yw-8Kzpr2UMoLDRt=$Ld?XLh~R1l|F9{)NPIO`&ScHXD+ z8nCWXzTu&UHhGIf-8F3Pj&GlDEG@wtVd&D-qG4)z0~&txxLP&2mlGrs*b!v5WFaXXpLpSA>9 zccxd0^)dojqa-jTq)ex{OGunO`xVaNnW`aegBc1?=zboEPf8*~`Y!p}U`4-5fbSh6 z5wP~A*1krwKOGw;V$Zd)AA&F>&cZOP;WJxJ?~HHJWS{zR(#GXA{f?Gq>GY^S-g#EC zREGqqvupYHQ(Q=q%G%M;$&a0SfYcKF4XcQYyGz3m zxge9Ec-BeHvVMbCU;nfa2Z)xL96F|aI1C$M5x&{O=x@W~!TOmd{rHO@5kq{Jgyf;Q z1WwnEJX8MfBmV~OHd3WqM%{ybdkV*znO{1v!o#75xAkw)^HwlJDReOt2N3SJy6}-o zNp^f}cu^nJpL@h4KN&6{U6px~X0#)wtvUeY6`k!!MN##9a)l>5W%?)l%B2(*Tybn| z2MA(DuTShV4;29d`5NQTM0|N!Lu4b<313w4%v8q-e8wplr4_1QS z4JR|Z4?6HtQq&(y+Nq1IgqzPB5EdmCSN!ut0gKQOZZWg>aP|gU_ueKIN&v}@nP6>;1z<;g3fU4$Qb@g_^KI`G`T3PUov+H*Pj=HuI?Q zUwZ9y!#!a>)$jsJ>`{~-GZOlBJQmLu8ZGs=eB192qgbYbVo4hq@S&$=dPev+W3#gh zSZO)^KpsFJL4Cf461pOb--j`<%(C-T#Ll(C@ zdbvqalaf+^`nyQU+>Uyi`3bo6xEfuP?_+arb$g=Ow|y`(3wU2A4njPu!V&$28Jx24 z-xhau)mA#?bi3)^?_AEZxDYp3kKo(|IA=oK<{Q}XWQ*gzyyIQSc1awYn#w%{Ws44t ztA13N)J^1Jx}T0=V`GywyU!k^5BaR3tvz}E@<6nl$)kcQ=7ED!iR z)X%^U3`VrYe4x|(BF|HysK^QeiB-||Ja5@ZWJ#?}pO4|cp0~i;bggZw&R2OGtv2Ic zE;Tf5HtLmb<+T~TsKSJ}mAk9KJG*s$E57LpjY2VQO&yr@w5GJ?^Ubt0*N(c^OadL0p`syz^8;zlhF*GAk!g5wnZo;6L~{dbk9Pa|oH#hw$Gihc!DU~s$Gq$*(jm+0 zpN0qdHTxc>oXg4=_i`$DOA0SLdM{fd)T)ELad4UwHMwv;%;(hBAGiD7a81kEEUcHe zD5eX!-d*lZ7AR#3 zxfa*e#TzBv-QBV2)K@-#Van;8&@i0u{~-K3FQU?~_v}Y~J!M#R;2(XBjb#|-d|Wux zcKm_?XE^MhQv&(A6QdRV{rnufN;yM(Ec53btF#i@{UlF1*4_h!Lw)Cr#_7-h(P?jM zN$0)02U6moo%zy|s0n=E6?q9Uk<_;|X;Yon+c$=IBm3M%bvksBoyR-TuWPjy=G<7` zJ%=?owap&B7Cs-?nxBiDnm6TpwDMG!l-iG)b%M*$2%Tncj3zA{=j4>pvulYdpS1XJ z*HG~n5%fc1@zng>IA{D3_I0B}`H!M8&HuvfN90JiQ|UY~11Pp#Z|RtqnB-=!shGls zX0Keu%agVJG85*(0K{f-IJ=>27gxdEhETmg9 zol{pu2z{7mCwnTF*Y-7p*KJWI#x7}6%8dfLhURZ z9gvy?mN&^vp`quTmajGf4Q@xT9=DMmGDMsHE^&WN6WgsjGN11=n{s`r-#p^-uwm>M6K&eEA;a7E7PFhGMww0lhIGz$u+_5 zPbTi?g}eq*>`o7oL5>sk*Ut2xZLV{qlVVo~@%dBpnlrriFVnXT9_F+?26}tne=u0M zH{OyKix9d|&-<5%TflYp_^8Za_c&;!&=);NCmq?-N7ba2cLM{pORMsmf40*_Josue za_+$`yz}vMZfRqaC<;NR%`Z|BcOidi{4^Do%W1Et0`QwFJdYxW_~-qKHGpc8+k6RWvOK-XT>~}O2dgqQX4NZileQ6f z(f=gAv|9H+nt@q4Mh0FywD!B$2rxKp1T*DzI7qN`Xt*>L79xl>HI?hH`VH- zgi#>P-SMfskaY~trA`GMVj*q}Zxu37OvOTV>rkGjn5nrrRY&&&pUmW^>yZsRYe~<+ z;$H-}qa}R<$+S&P{ZZ6nzQS8_=$%HAmuDOQ?PjF549NgVf8tDX=kszWs4Pr_qW|8_ z!4RIO%<&(D45sSL8`4`ZD#8(WL6S~BMi?kdAN!X?(ah%fPdFIIXlu%yw?}+}^yF)q>SaUE%HQ4ge4 zHP`FstdYF!GLj}zt4*F17AwrBCx^v@4*u$gj4# z?=0*YR}~}{%=ziW)JMuA;G{h}<0`GgH?7>ol`Stgy%X z*HJx&4fEpXnhd!Yhk<~q2Xi~s%D=NZ(#3#3F|cJ#pUe84<=9NS(7B_bQv^%u<2bf% zOTS?*01${j5@H0kSN7ePEbm<%BZ2iZgw#gi;K)A0bKOJ*kJDLY@+iq5hAnll@9Pj0 zO?3HnlsqQtpaR*?Bck{>W<~RPYZ!WM`r2!t=!){6y5uSSr)iMZ@X#9PcPbfmIVU9* zo)Je*C<)pB)U0`ZW?H~8te)zQcI$OIi0@{#nN9?A0fP=pGb$v7k!)!6f#pNKn)BD4 zc{ZPW1w7@eV3uyMhcG8L%1g<&U*4&7ervs?#?0QFr~2Cge3W zpX%-hO7xx>`)<0JPwi=3p40Ev=iB^Kjo-6h@Uvgl4=&ZQ^O< z{4v}vV~*ktWv!{D+rR9vW>Bw|MOs*|oJB#ooSlf{lg`r zb5yk;Qrru7R3+B%d4k1p5lA}dAMww7N5n)NjWcJ8&p$q9S;5gZMd@5&rePJu0&FZQ z9KJ-}&^Is-3A$e5^HN9`84sh+=i&h9^eZ25T5&?e!nwt-}fb`$@ z!oyY`jM4&FN?vP9dODf91IR(MGAy{lSzkh5{~Pn?@*49qEER5ic&qz$nIC)7SoCh; zC?p*f@o5gSUHM(k7Af}y1)yi(s)8DkoTl~vWJsyXDjf83m!>GyODw;xH=Ct;6lP|B z(A%1!Z1)|xk3Ih}Qu8#(@ntaKlmfD?O~_!HpKxQpCk-^y)BQi-+r#myAu@T`fQ*~U z+o*odaLXA>g%tIaY7?d69!24k_Z-sdl6IF}Q)94mzhj(AsPNHbl1hnHYQpH|P{n&+ zqWFH7OpN{csn8U16&eoO4+U;Z`&ZcCJaMJICwH(I({;YzRYKLYA$2EOKY46Kr(GmhDCj!}4d-CE} z&Ad+1r7y-5%9`Do*%h6;J}_}b_j6)<)JV0=X`fzUM?v)KqkLfA2(X>p21&rr;RD2R zCW>DpLfW*nM|e$qvseb8@6F|8Z?Ae5tg)%4KIxL5sakGwcqvo~8Gi>XUQdM)pRfz1 zHnI@2gWIu_cU~H*4>yGFId5E3>8x{618YxPfAu1ffof`@$8U}<&O(*+>}Js-cu5r0 z=na7_lUUZ$skO)?*QGT%Z4o(-RL+xy2Ndt2=0J8<<53tZQomBpJG+a?9Hnx|0#9j! z0s`Zs?;+}RMi~hWsP=6=n^_|_`X86W;_(K`bVku|YedOrypZSET-s=3Xr)yU+8@D3 z$bo$@pDz@!BwPaqao(OB*z90@N<|Xpwad;C866iLaa!9+EbZJp*dyRbcPz(*Yn{e? zIw#)HPZ3P+->f*WU5@k}7jbh%oxEK#u@ZCdt3gb*KF_wz^?}b%kF>bslsjb+j*b_H zp3uc~`xrV?1#Ih$?ieFcvG?WyIBUFul3dID`ZE>I=q=R25Q!&UtAwpwNqd%9WB!UZ zpDmT>T&g4LZ+!{|(4W7aP32m*N%Q(-*V?B^`9-6}2{y;ilJB%nG+$FIe`9hUbN~63 z8K`9@72kQ9NqRElJ0xn>b`|n-I?^}j*c}ec#+NP`7Q6zoR8Tl;(*Ga8_Q4-kqS-%M zrOqZQ0ZpL2oeEvEEz|QR_XO3?RzuyHy_}$Ys1>wLF-(6WE!mdT=(y#%b7h2eDAcc( za3unC0ITCDS$|HGD@F$AW4#{aCFfc@UdDzJKf>I<8(XTlO+Cy$6b#_we;7qsszRXf zSbjg;$5_l0F`c9Iw=QlqpxH8L4v2iv{}E&MmIus zNK|$I1RSjKf>U)yQ?mw*&-tl-n7P7Cpd%_@<1ZO>KTYB^-!rlf1;`OauU=V6t~Nc3 zzs`12GpsY9!DsiKTurDDAj-rP=%6ODK>_H#cYlr^l2GlqHQM&7u=-bpF~5TZwcpt1 zD!8-!CS}leVM*0o)Z})MlTDB(tr280yMp%69^9{9frd{-%NdBhebHu9_xKx?1~8rF zAVT``_zvMN2*t2gL~3*?xX{nFwn1JKRQG;N+-YRwcaLU$9%JvEw$i#++5Th;B)ffb zxF)0Xs9cUTI9YB&TMHYTE>Peh9drfyIhM3Qezk(Hs+RbX-(JtJIP0f$^o+ld7X^Z~ zRqN1^-~-whu*p%YjqwJn3n*!Qx-}b+?3TD);_?lnV(2?D01UA8~`hC_DGT6n=U_NnmHm-;^H1kdVzqm&RzIL2*k zp7w1pa=_bA1a;-)Y#+IxYyLo@+_KmdB>3gWZX7jp#(FLa5{Ht}1|NX5(-ohWAJhUB zT)laH{od0`iXNpyb4f@^C60Qrfv)J4Fn9-}+fLoR>00tXY#de(*^3^*|CR8~rOojV zN&ah(k+O}{VZLLkKWPu>g5AAw9-Y(f#tlvH)eHQnbLn~|r-7J1&lyvKEo&qn^N|0e zRhiKKAo78NzWuzA1&T$H#{{DjNzV1Z@&0%#ecyF{@Se95syKV777EACzhK+|#782p zotk~}QGusn!;Wkb8D;P4x(ZB6X>WzSM$y8WqT5f>n94jOr1Qz^>$9FJU+kwC``|(> zlX53o@@XvFTe*E1rz_hruVNVpI`WzZEPBvBcMI{h1;)Q(Y?}uhT2`pS*`>|W{~KuS zMZETfUK#Y4cu~@3*5(tpn%dq`f6QxRW8)=$18EwKPL0_+&1qrYHouJ27KpuvWvt1R zO~pztpocfpFX;h!=_pq+01YTFDPfQbIhy19voXJFp6lcO@BZ>~b6556cs3LgG9=$j zXlHC5N`KjIrCP3hEd;mWbk>W=vFOc5H|SD@?}Vi+(6rPAthm)qJo!X=YfO?`*hq?-H8Fh}`vymTVCoPr7dY4U|w8G4&_2NohM2bsT0!yL61@%)89e z35<5PyHv8Z6y)hY9X5J=LeFkt6Fyl!j2%N?5O(Yl$NJvrM9xHEH90C`*nbOyu5_Gv zYCy#aQd!L^PgzWxSJ*UUe@-mF*xrVcF*WLS4CkJJ5TxGk9JmiV^g(US4_8%0%k1w( zBlC|LLzv2yO;Ah3x;Ls`V-qH$d|B}+I{WJg{+o$%Ei@R`50rWC9u=;(6z9t?DMNaM_m&lBS6%YtbJ0=9dbjzw;k0IbI%l zKq-a(qpl8>3*#{VQGpo`{0~Gm=N6NKc)-)%#8g93u`l{`?1zMwcX)%b)k>iv)-xwu z>tk1P0QHkd8JS!As8zmGD0fV5Wh%?DC-x2w1tvW=S4k}bh}PH)E=gd!uT=9NXQvY1 zE4arGV>wsC1(1vP#@r{<8Mg^6gEfAz<*ax}sL*mK1QHLl)3o2!b~j6XV_ zDK(G~JbIKjHX`<#C;)QZtooaW-hbZ_RT1S&nK+E0&S3{U+@FOrNFAQ0Le4|a(@dl# z64-PIb%5hJ?Q&uI6GKy3#pyQhtzN;Z_0-w+7QQMq+(Nspt)8Qs*``HI(ZrIb2cBUs z!wLl)1VsuX+Drb!_|WX^te=%b=MQ*XUU_R{R@P0yPy?{NpoG?oMjXaMcE3-Vq>#o9 zBb%NMcUTxY!ng8?N-RJUd?xnIZ7j~u&t4k{rrzdE+6Dz;RnGT8FH8I^5C|+)81@iS zam|SOz;xSXq}0~!C54P@-MgKVSTj7SDHEH0^#3#PUTEP#fWj!Fb@1;^8i)53q>2vG z;NrcE)YP)N;LX!fU;NH!F_reLz#~W6O%#klVS$=NCt~_{z2?1Hp!BEj*+|z+EA1El zn+pEHqX}QYL%0=s3D~Hu+-=vB={YAV&Qtc^8U;&oi?iQ>FP5@4m&hfYk;o^qFMs{& zwgBf%RJVTD0n(%}knn*$gnF}(j=H*&$A!*csQa&-ul=Nt3$?{`PkS}~o4?)%SIZU; zvfE%SsjYVOjhB*i*scE#fB1uifkhm=m(e~!m|M9h;kBS`+10@=V?gyrTT5L>C))40 zU)S&kT5xw9XE#|fsDZSvy7A#WZ~IY4)8bDKH%S{<^dD_=zm?JE1I_DDw~AHo+U)v& zyDRbIF&RVGZpUN)c^Dc^=0Ue{RjVnQt3tn(%jxQ>w{pH zRHB(6p_S_O2H5pc4x<n47q!#m>AswW*3ooshopKLFN8%2_VANEI>shthispiD-$z<{9 z(4BqmBlBtCBVBJPN?na&r(m&83;``7b)JF;e1*sA`xW1~0a+Jg*{Y4=gO(>piwF zM2Z&d@!wvp`2w#-76`W&!6yKx_sm}*Zk#Y5>ZL+cKBKOgyfh`e{3A~>Rs59EiK{34 zVZcGU^%dh2Ej`Fc8rNgyEmbad?4xb@jx3%Iq%9|%pIk(WyGg+6;TO6pT~u8W(&0uwP&nxqCpmD52PcEtv1)RXP+Gc0eyv;n5 zvRn8!q0?X$_iijA!_tohMlHvS1feY8Fj{ z4o*jr-Nm~nWQmrd%~G&d$on44y+3F;0*%IrQ(8F+xXJ*{?1K1a|Tr}y$ZT{-Z`Ot%PkQh1UC#*WKWq8rJWEYZ@U8Rgf)ZqQ9nZp=SMRbqVgxgwbEegBhW7C zN;h_tboz2}S+TL2jjFTUZ)llc@;Aa%TRW?HtM36t#f3J?f951i=?rMs{91LKO?Fvcr8}i>XL1tw$_u+ z;_B+!dw~II%M`XA%$4)owisrWY_`Eiz{f@_65pPBR#RmJ-sKpiL6+W>LfjvK+_`WLCyY-UA`@9mS$KjQ!!zPlxS)JNGR46~nEr2F5P zJIkoJns!ZZ=mbd65F}U=LU0Z45J+$f?h@SHodgK(9wfNCdmuQCyEX3a-qU%%`Oe5X zXU+VYHT{RxMYFrvRqS0nRo8Wss%Z&iEVOSSgbtdRJRGg#e9G_xke>ORe zGxl;RE2?cPz!AEQ=ehiGD%S{v}5 zt=3akOgXhjjvD7wY^%3Oyg;#Zq=!|cPOFO_r?kP>zEQ79bj$46+Ro?hHnEdJk@mO{ z_c5z<4~M4J&%K=_^K+YtAHdd2-p{hz)k%-AN)tzWRBleTF&^P_Gw&XR(@53aJqM4j zEDBro%EiI0YplqJD~Lv!xM3bO?Lb%N$1wbPId5sFIc=xE-EtVl&Q28&WAOmRidH_Wv9dAXu^rlJRafD1A(bR4viKuQWTQ0ensO z6N8NB&%AX%Vhe-osUEU^$O?=C#7V=FdR8>w-4 z@RVKXi>EIWmiI0^L;tRd&7=xk&vBVMU0-_ymujw8GHYNUxY(PyuytEs3# z>N)U!Hrl3M8&N;?vhhK`S*f(V@LnSyF2D(x&MRP`FTqvQ#Kf}=saCvhY3ImosI15E z%(}lLv(*Mok6`=va!wHt!Fz<Xe%JM6qz{ME!U<+OTk+@dz`NHqP98{g!@VO>pex zUPxcpBf zh^Ync*g?IG)+&HI4SL9#7o7_Z;`H!2A|;){HI*`Gh1+JHfX_d)=ZqB=5=Jxir>FWK z{xqe1qNI%bYA#>GZ7PKmFrMGjMrE5Y4k?No!OSs-`d33WZHAIM5QjfmhxNmY%E7)#6JP_;Evh4+HGfR*5blJ~jTz(j&qg{Ne_v7<+t;Cz=tt&cP(s@sLg=H0mE7#iTwGFX9}(3_46`a{_X^*$MIj^(#yf6rN;n# z9alth)r{MNbt%Y%KfcU?c(umSM&4H4qtllaf9|i=R!n5= zdykIq>WYU(Zrp-D?{x$$Lt;xQnkivtrF%p(6e5eBl#y%NaF&kuaF6S_e~aWcKkFhE zM1^$6kY;3q0R*~B5pgQ%8C#hxYS=Zdtj(dSB88Z^MQ$c469wnXY)l!KqCdJU0W-OS zFpgd?O9#6dx@Iz;bKNl7D|#clF2Tx2LWywPP?AhJt#gOHc2G(kgGPJv+=5B-7CpK zFl|uK(9n>Vx6PgGoHG~_l4Z&zc$17)Q)9{q5%k#Gh@3f=J3lA+Rb~lZS$P_gf2@S} zN#>@t{`_3Ah*%`6F`*HJvmFKvFpl28uuG6v{ZzJ?u3em7XFF%%z(=1%1og={{pL6u zCef8rzNORLi+2yfWyjZ|wXwa_oRVMZW5 zI;MPMl~64cJ_7?wYe-p}ZEN0DXQ2c3@{Jp7Ms)lV(cTu>S8rGBdkv_y@ua3AofON2 zaIY{!~!jRJCC7-x%rxXV~QZY*ZtLDx(^RwhoT(+)bwa|NWm~Q2aiM-A!kgGFgclhM&3Dil|s~H$5UHM2p)bn%d z3mJz`bQ0)bPZb^z2F)0|DiyVj3{zVusXcKjBQ~^MtbJ+|_8U{wIc+42Pw>i{gw9xJ zx%xZR8IDf>h_9pXn3+TFeN#e%nn3gzrRhpbvb7~r@$wRp(ZFOoW+x3oMU;E=k#yVoFPUC>D(lzhI@;`oTD3gp#$&qh0`F3_@%Z%NRmE-)Ih9Jwm_jMdF3T8oO((tqr0|1kv1Q zu3dqqm@q9(F_ZUkoHagXvf9xx?_bGkTFu-ZF+JuY$kP!0K6kAgl=&V0A2sV;WyW3< z-=$ESAE6?Om`8F`Z9}jBfwzipb9q?zmWE{aPc(4NeRCCP-`0#zFRhs&=lD;(N_)Ao zYt6?0&oSR(U{vh8;~nsGEQN!BP9xZ&fF0l)NS+EE1pNo?#lh@8&b6V1l&L@q6x0aX z&g-sL%&z>a@XeE0HmRgo=3AX=(-zfgF|dhZKpqW7=u8xD9Mj%P>+9=X)}BtJomtt$QtOqbR3` zfb~+QHuNKcX{rW{*4S}~0v_OS**xQVx=-9=w+hFTat4b>RJ*KKk@xva0P2@tRgahs z3rO+%+Ld-~O!C!X3T-&(_5oWhpuDy(=XX9^}Wd> zmJKABQ+1l;(+gFT<`rtb8f2=Kw?L71lkc|5u_jXtCv|4q^^)Jo!40cJ9=%?n27>7qV1PUV~`(tCHdT0Ub#Trf*BF@4YIMcWsC{h=3VK z0F@r_^!E5ELUIrV*Sv^Y&3GTResNTfWj*b9e*BRE{E+$e2$63)*W;V^*s|rBXrN6G zGJt{ambkZ4Bq3y8mI&fo`28>*Td443`gkEr;>rG9A_@IWf*G6=*;i_eTtX2TRr{IV zb&_|v#AR9Izg=xnE?B%h+;uefBxkN`;qmZw?N|AE?ry zxSOBmvk;GAv?vg;wydkUxouke~sI^-y*&_qjN+{CL-s)9gD zOD!P{KqeE%V|aFh`z@aQ<9g$opX@tjBYkd=*<3trKpNx?C$Aw@z!T}RyTO3%Rc_e# zBsd8JBAHVbvtbuXff>Xn()^2rv9$dir)}kGmq2%{H~hN~XUNT(%i&n`$^~keDCsqQ zd{(~>(t5ky8a@!fB%_p&CfP?HP&?vEhj%^+-&()88+xGMcP~K0fVr}CS6I_CH9T-{ zbFSd>{y;6&fT5}^K?zi`1pvA}>&%4YfC+L_v!Z_+_AXvR{Tr4>RhR5_)E&2A)}4U)`c3;ltMUwU2K#w`v`Q@ zpPxDKW#H5cYF7XHr^@ALkyl2%~(6C~w~lm(g9P9(an?KzYk*jM?kD zTUzif0FYFy9^k_ZtJOUJt(oD~BxvSi8j}aDn0K2#YrjoFFdn&S(AYMj z`eX#c;t5G>oO2667UW-Ta6$0-KGTL7=$)A0R1A*AyX$L@?6;T-BlePE82N!F7mFw~ z^d#KjepzNUf2>|a*Ny>Id?{0XCAf@7Rrn(^D=8ADTd2VVYykf(NV<;N&Ryy`5^uOQpZ}KMGK4ZG3j!5f7zb7TjCDrG$!oeJNJQ1u-N&|*|AR`+D}u7~s!5l!(=@5XA7nRIM9G}n)bB;;{&w1!Va zQbrYbY^I(zK9)-vd_!C;`jd2+aNFU={+`=~J9fg6luE+@X%wARpoCZT;fMQG+E zaoABwF2h^eS5LrsoBWHv&A+U^=IQ(JrhVhjva#P$T^!HQxQQ7P2X}A7T_Vby?hO03 zY#o<;&ZBbSLrre|qWDEvcq8$Z$W(yEBKr<}M}EUG_Uht zWNfxzz*eWR-rC&ME{t|*`4uxGZcc_B+`uX2)7MO?_*gRDS1#&(Z_J?jzDfZHcM}(P z>H-!?Q}sXg!eeN`{9tN#YYXc(dtyf3oN}t%$X*}@bgKZ!VpU@7^wQ{>eU8KDDRCm=}?*`Dp$=l?fl>0=1Di_!G z1Ool~yrn7fdJp~hpt5#jNyuziSQBri$_s$L1=lK9K6Lnd&_rsPlFNezpBW1 z_kC5O@{Y3biQ`N!Q5dP#-_^Ym0H_xn+vet90`|D*|JX|TWZUmPi%`NIqg;WH_iYde z|Mj6?_`6K%D^f8!Fbkwn6_$JP+lIzXrj_1eQu8AcG2wG~%?Rc8`NMp*deuHYd|kZ5 zZ>7Huu%v>ZzL0zo!Wgp{`&(reW-sYoRD674VW*?rEv=s~6GQQsy-V zpIe#*6`2hDbj? ztsEyoPP^f6rKuqSrKR+}rNqfT*r}6QVfhkm^y=$-c9J3pbS83QHJ2N`-fI6dOlZe8A~{A`=H zz0>HLroeEpoW~Yu&nh+Bf1F4(m(xWA7B^d1UytIiK1)C7Iou7}=c%KJX7NxMKs6$- zm)n|P{5vH17~8Kti=?;eemy#MiPhX4>1a-eVL9_BI-ncfJIjS*xVBKkSL$Hog7>pVzs- zsD0&tZ4qdDB|t@7vrKAJuojxfRA^dOq;Ix0rSqoTWc-KV+q3vz2^~3{YD|aaae(S^ zQOB#6c5$UIb6Q>N9E%A$j6Sx}=NiGrDG=LzqHGfl0==+ICm*}-loiYGlu&D*GsFK} z+~-ndU5CfD4fpgQug5X|>El&1yja{uH|+}=I9_~S4>Q<&Pqf@svV7LgcSzA=!!l^| zrrs-G#wf{P2ItD4LDUiiIi{Q+sH6&C%gnvfH(VGLa7QU0Z$LS$eXQJHg|8V zR18_aho_dxBNAUJ3VrZZnG5Nv8b*bhwj8rgqv0PRmgX}_mV*q$FkOp^RvVO@*Q&N8 z$)GYLiSHm{DP|^((ryO83$_WflAfyhOTn58t+v*@1AXB`%rfVnKTu1BNMA96O#!Dy(nc3YrIJ* zX_(N22`rpUzo8Ry=xY8YasM3dcs~r6S+NbY^;N-v8Y`s?6l;3NT-WwT#0!qRwJRdQ8i2Wet^IPbBY3N{*x<vYpV0SXH5?`S~< z!``}S_b5{<6+x!nQN_q;xU$Z~qqenI>#^*lq~#W?Z+wl;I(H%h*&T@oNXgx8QIlX? zie99g1ZjYQGBK5pWBWbJ=SEx|1hmw>W3f6J4x)h*29|EJF^y$|O~sz`kR-^IzLR3_H2 ztM0Alq{pYaWb#+lqpZU3cx+khV%kDgOT)#=%vfIh_9*9bJ@X(t9@xi^^F8zF9)d1e z=A|n(pQA85Yoo4Nyae;-jxpmz)AQuQmCa_&_4r` z^c$RQ{T>+j^r|?otjJ9HcZcU&xzTlRa^=u0Nq17>xXjX?XHnH22|*wryQlN`FeVK+))d+9tdG!g;v(<$+q;o%A!u?tIeHwNs4ehYSs&!LwP>(CqE)(dH3G z9~P#kx3;#NVNZ_<2?-}BCxRyq?dlvVJ$K6nL=INrq=TZf94e9J=*m{Uew#uh(B_R7 zu66v3IV>{hzw+4=arTWPw`UUB)29VwhoomC;iToV_?4>^=K{G(cut=Z-t z1+~w*f}R{&jPWGXJPS{2h=HLX^pKx4Ig}Le59jT0p?ctr-+D5>_DV7Jm?$}gZzF`h zd`_;paWIquf-aq^6+l)8qMWlY{0L7`fUgDqNXU)vIQue#3(r~neo>F|H(LQp(qt+Q zA5HMgjQ=-@qyK)N|5F4JzxB{qYwEXeoF>Z5cM0-S>DojMrBS=b`|TpQ>hMjwE(s6V zzgUbszI}_8G_1jl()FdaSa5{(p-y7?YzUMMBpqS@grO1(r)P>>#4dd!Ih4)^Nme@+ z@VE1F@N;r{9lIo6P-54k%HnQv7T?|99e*!5i3$ysGHk=?XkDAkS{#J5_ko?6*g3Da zj_YvyY(8l#+P>$w>Z?TT9_e3|YST{CBE4C=fsW`n^}%rkLxIb3(N!{^#NBAY^PGV? zJC7wYPE*yMbr{;sK1mjA614u2cVc%X@sGFgI->;4h93~Z_9}Vj8e=ts=C7}0363=R z`m&?oc&3@^Ej**6PN-v_=baG?ZYsmdDVV=f-!SZ@Wx8+gkxEtE7eBbH-Q6)<(bn^7 z-?c*K-(L3$r#ME%$^h*wW4Nw8ckRXZmh?yZq_~(g$i4!}5-xIPLEqi`EySQu%HgDd zHawb)3`>$f$~79uZLjqPz0Q#240bE!zA~j?u)s5um8m;OOb<8qxUI4n_FZE4Ha=Mk z2(X!kmM__yAgF#h7jfq3Vol*T=*+$tWR6g2{<($H--W@of|5pT3;15C|Sh6AAL0zasc&{E--X zZwMwHPXJ}uv=^4#_2J8{675P}Q^ih;xpUF83pfNRwo~HmgE8igB(3q`bG{;vS z@aNr(PpQ=dhC)+1KKO|c2{fP&+h1F2o@ylbHky&~NxfEE5KkQS8cELOHT>o7Axl~u zqyyu!L99kW)3W#;e-XuC?Yv_Mbu^s({SRui{p19x(p97l&6ieCKQ(lA!Xhv+F<*0K zt4o;{pyne!z;0kAv#$7iL(&c=v-0yr8WZ|DP#1d z%4tMcq{SjN4Fi2C$xYnzNO&FqN^U?d`${$Mp`|$-JC)xTCz#irI<0GSa+moC)+hPf z=9rSEpNh_5K~GO#5+L-RMK#WZ>QjJqL~DVC#U7YQk#57@i+!rC4k~0_NORoi|IL)y{{}4p-Hc?MzGCouis%pvg)F>U*}Cp|Cm; zkC`S{_q#2pG}Y(?VsuBl^RvGX$5W_hUC3D2c&*1ZQd2O0_kC{DwIoo`WXmPb8UyD> z8U0@1oB!TGZgLeBmnS9JsNx77Ydp1Nz;P9@8OIaEt9=uyZ9_uM2{5nPa zLdoA3L|)myXn8x)Zk_1rXrsEqW*~4<4%?Y^adiAtj=peBrm@|zW7Eu^=l6>@@Cp5_ zd8yZSDxm9$(K;noc%|+cgiL$;m!^vAY&Qk-+34`@{JN)}u(y>*v(dBq-gOSIQjV=4 ztL=yhzw{3vK)U-^?NbW-w`=e`0hia|s<7m*r;2KI>Hgpwch~j<{{GTFKDOJ`jYT~w zCLk&uUF*#|Khy3y}DFJpG{8T*Q(7E`%9qd z7CtBHVdxajm*`4?gU(5;Cx`PPzrxoyJ}-CBnG51J7Wf=+ z%2f}_T9;(M&lG#f zm}Jxm(qE!HPM6oUIdajK;`oj_nawJw{@c4v`5BMruBCMnnt%zMg|H%b8c4F+oVe;f-ktZBF53)Qm!60zG_TrwS!uW z5azbD^Km$S7*gbLO+t)%FZQQX-`RJhW4Jl=;vgn~47@V{hF+&6nxH82Tn~s-Ij{C?Hir(ix_H)@$~%}12?}>5klGF|Jv_CQW|X0|Zh$L{ zBS291NkOqu11vnpLu2Yy?xYCy|tsVaiSbbZsAF0_Je>+ODF%fS^M?Svvt&YJ< zUk!eP6E@(qs=s%>mtLs$0C9FpYHitQ?ODY)T4-DLeMN~ZO|c9!p4{%~;T>AOstnp_ z_sEVFY5%#}sMg}>yw|irdChL210Mdi?8MtmP92FlTC3f$)s2gB`icOTh;qRhqUhxG z=|^c>pz`H9R;h#Df&H;uGk@LRO9Xz~;mliAXK>d+XII;xiwK)XuSd0}PuPoK40!VL zcAZDYn9~jz^|?F_$rm=CeLwu5WeiO)AzqE8spy)a7K&Db1Y%+-^7K57&)xk%h10p} zr;ISWuY#7mE5`XdT0@I6@?%^V0+a|^gA{%LndDDswi4}KHkdc zn1A8%QrY_o_|$+MtuzPXy6+NRBa?T|*Ri**TTG%#QPn1y7K&tm>AC2bmKiI7v zvs=$!{_K@*UTaX`x`R~nBuCNst+xco<^IV{YhE_x^b1}(@#Y}Ec%k*!l9svgXU0zA z-lbsL<`mcMhG&~%1HRBDyuo9E*Z!8BRe!|81$wvb{{l~5DG`tErx)HGpN+1rD;q5t zWjDkOp4%#Kc<8}dhV@Q0BY5i)CN-!JM7ySEvMI-$tlCmyzbo!mHK0C9N-v$3?5uSY!k z2frvs6L~SSJ61nrc!22N%H6Z&O`6Z=ZL;2;Sp;W%-uy6MNd1VQ=627WNV%z;$Z_|K zvAS$9SVHFhSZ+;EmCnh^PD_{&VCD`Eeva1VyUi!cHx@P}WwtoRM1NKY%}~*35Ujz1 z?=jm_Pm|+@4z@vR?av$plH;iQrDJD3FYp+)t}yFbNh2K0{jf9BsBrei0dCbH`W4mmulpxx5!zGyu4h%7xxf+w}Z z&Ndi(%O>zBpk`Oo{BTUQBL@_}osgd}Z6MC7C*aXriN(YrZ|7KD)><{)KV@0f?6Hz^ zs8a_JpDL^s?mY0aT;=rpc&XsH8~mJ+#uRJam#uqHjzBU+diyeDp{)!K7Z z)p^o`Q)_8)xL5*dp+PgIRx{N%t8H(?{R5QQDko0Mf99`&9`FgQ9XeXtheev$Yl|q> z+q53$SgaPTq_mhfUqN~?vALZ-ZU@nWsZ{#{jvzow<&({c10v;TPnv5jIOy8k`H_p- z@3ziHFwJZb>A;}P@)F)GkUg|p9=SXWza&)o}MO9>;vWN z(?~%&0}MsS;#!2MfNPyi^gn>lrra_8pIO7dIR z*u68gB2Jebw9Y#nSca!==fl&s$R+zMaG20hZJ)2~@7vi|{vXU@#$J?6-PZ z{#n>`Iz{r$YFW8>ukHbX`A+x3nkj$nT#KA$oeE`q?ev6NuRrck-Bf+mPB?~44^Dj=K&7e&)85<(-wetT?khSn`-s~@_e~;61PXf^#vXx){Nw7_*5e1L zUnsL&iwr8~Fzn$z3NeZK{x*NHRwK;yDz^~d8O(Tlw^mXRJ^H~nU&m=5Pj%<~UXcDw zVCgQ27f@Q@TnX3)1+c&Z#rd)uN3XfrH#&Ajm|7aS&2xBt`%F+1O9tm$ zHU?76x&Q`d`%4%-anJAXWHMr~n0#cwTdvgLl}!E_?#YTBgTJTniu}3ysUE2i2+%;s zB7AbK&;8Xb<0Q0mJmlfk!?eVt`;yrR&`F})yjrBAitsrsZSYE#sB+le#C-|)wujmc z5&&s!y%w$B31a~8pqpe!8@7Kf9L5D(D8r~!mH#?~@*%2@ixxd*bf*tG5}}T@l1&5E zMpzkz8pT@!i}I>yD+e-2qvmfT(u}!B3@_?+ia#7d#^P+XOdP&^C=Mt zRQHpF25s!Lba~PBCn_<}$Lc^JLa~RdOvJ7{^pvWl2;@fYz~n$YpwXt!yj3Qb1_)jr z9xbIo_I)82$;`fXB19uUlha;Y3Ze|Z+|&RI`c$9x-pm;fIksxvJ~HAoNFwfiiC4db zdeI>N`5L(%B!CPD3SWM{qN0$ZlvA8Sr2YK*?cUEDC zh%0hQSb?i#S#ODSf=8|7yA2{UL0&z z_nqn<+rR$SP?2oXXPVD}eP$z}r zfw^a)1HHgYHlDAE$E^p5XK!Xe3Fc#+;X|99C4*QOr)ezP;RPpD+$5|nF0bB&lI&Vf zeQ^bB?H_ezowYUn?;YpDLQ0XHtrfALI^pgtGFHz1; zd4xJRy-~sZp%d&j{o89Ftr+>42y$a;z2WmPk>U8}o@0o{kB64#f6MttwS?I`ZCPYN=0<4eH(l^;`@_Rx*xDkR#KBc-Y2COKY{M(qYaVOFsL2|?E3Go%@^ zcK*zc3ixdLqxGwgauTQpN5_l#h4cy~>RIa+cUu__3jVzxB6wTo9RYjh(>F3xuu6yMJ0IfU zi-k4Mee{;WmrMV2+;-ixkVeYQ;kYB}jnEqwUN$Q!4MMDDgYPp*crREK6*r?8NhdbP z3Q{JLX>XXI^)AcQfV6tk%a!C~nZ&X}thdiHX{0biN7QP|4G96??XP6P-ycPRMk>0b z=LkL7s%`gpCj=Wt<+pp)*s6;tJ}$YIn|yPUd6Z1%#%DfljeK29D`L-Hk|L(_A`@dE zYpDu!tlI;1wXYhK7toT9k07*2QE2waGuYi5fV@3^R#&(1B(u3wRD5ggU zX!6lk#fo=u_$~*g)!$7;tqrvoFAPQJxhlCmMb*2YBauG%(^ZvV{N8F5Ro- zG4?oo_Q~MOmf+KI7Kd$*zq;J58hUd$QUj68?35Csm-O_>Z^xvb=cB)J4r(yyYtrBn z`^=icsjNut_9ero;v@U#E5~HMt@=95j^72(+7EY1KOa9Y?+d>zdOsem<5sq!C{)#I z3;Xm6h|`HP>|^-(H74iE{bJ+;;hVw+$MDYpJ`mSP@KT(It+s93zX&6zgqLRNF`eEs z;())7hlY!?eTR=%^&L{6oR>O>OoxtiKOn4#LcU zETX_8e~Iuh7=7%JE(au1lhy&>_pnxvjPs_>>SiYWsTIv00D}d5dk;P(54na{F+ZlY zgpyV7pR3NlY3c$YtVq|I2WDUbb#=lR-!U$T2hPR3y#qu!zMudp=lQh0J0C#4n%Dc= z>7#W?`HYN8eF#3-@)4&M{AOyfL%|KK-Un|blgLeh`>*twH`kR#t7Kn%zxMmbjhh=O zj~yjVel>XM(Mv-1*8JC-qA7=1IA_7G{8@r^-C#ArLY*|eYbQ#z%6vfkH1>fuc~ZbfQkh=`!T z<@SZzf%BPTVQrdrwS22K#oNc*W}&%j{2JSghc%p)4PGL_Ql;sssh_tOOD=LON!XW` z4l=j6NPGL+$8TyFJqs{>Jdo+-;Ewmf+HV=)7sN|6X`40r%1HzG(|0HZbi21<4!ME&aR=;lkDFFx8e(9 zG{syf>1Dh*-F9_dz(`@Na&O4e(6kX8jzaBVG@wS+o685k!TZS{Z**F_AuF)y&Qd0O z4EtmIZ@q{krY6_TwZg0mmqbR5i=)q0a*b13C2<+e7zHB(BTDJqPFq>ydkDX`irpyi zZI%>>mlbDCmn!a;Wgjkzv&vDgsbEIy`*?RKcs`jW2PhIi6zE=a+CIrm!f?AeG zg-#`FUVpe~l%UX2z?WH111+kVhjIT?d{Y|_o!u8kto!XB;PiMOK1;kzwJJRkGbfo{ zKXf{KvIy__!AhMun-wgfFKV_~d3m%<{C0MEh@)D{Nq5m}hWci;O+nyC)-WVs5!j%D znO(ogt)ivd4cB_hA|Sn?_ED>V?kqO8T6VH{YASz33mFUUuE2dr5!}#Ro=s3yDK8n2 zxHYhMuGITf-)Iq9h~6rTGWE+Vz{tE(WM-ZbZc~4L*Q_p8kWQ4v8-X^~9@tS~)@9I& zX)pAKgAO|+>^nMg(SE#<+d`I#NuMSXI`##d<91oZAWd-@4U-l@>`QSSv~wab-gD}N zKUUPGg{msJZ3G!e;wFNJ=LQd!tj6CFUX2M|g)}y!4h~2;Yz^m!t4AJLs$5p`;Z}Hx zMs0p9&+p9bqZd%?99FMj+8kKiIOzV+2nZWwg;p~mV1=a^oV(6+)Vp<9oVAe*;xjB) zeYI}0d!wCRInkiTbb=azM?OP7uKTRRV$BjZgl6Pgp*v&wNsb{rzN}9=l_(wwex8T}7z7y_Ys`A5pR9c~Nf|}^IZ74i zB_V3sKM{bhW}QcIwv0eqs-2uwJ_HPWuYRh#ntgEEUo$CVB_wHecFr7CxomKzvvx~W z!6BhG0lJsNGnyC)s~l$F1-mg2epb5sS%2aTb+OZrefUE)>33^V-9 z`mnCE6WhA)Yv(lXFjP`&*A(u7X~Q6B8OMY`#+v0VxObH6MS8%1;G2D42WE#96If_y zo{eB)KoNbrJnF$nzBGdz?R-5X9p3|B6F*3}gPhYitc|h6^M>3GZ=;WVzxZh_)?Xfa z<*|1Wuu@$d{sv5ouMheD0Qi_B1?f-Cd2)i($hM~^utB2OyR$dGug}i1#$8;F78=07 zr*|lo>&m_05U2Z|!@3!^IODj04`6 zLO57d9#+D-vgh445k&}b$C5CfmDVxXqEiwA#__vB z9aN_)SE+VVLmwmhlnJDILxJ$tZkaM@7!$|R&&GEKcG4U`C7bhpOutaFvi$sh{IByY zirdCQDSHH=lqjs&goIY>qjcumEI&W&4P(ZLRr~>?f88#VqVpMoB|!izDK2N%Tbtx- zc_!>h@xf=<*it>l<|2>FabjN%Ajg{nnw;NJ^=rd2^$i?pTMUwJv;o-l~( z;ijI{ZOX=>gIiEoUT87i+;DYy`HEY?Sf=(Rqp#4xKE*?DYZ*M^*7*0~`tI(Hlt3yG z5&Fu>($X!-%o|2ZDof&aXOp<{QdG40o@R}R=FR6z@^}pH9vQjzh&AEi^NgE|oJdyd z+6*_-$pkeJdT5%>Cy;_5D-2s0LZqr-O18FUkPEO8t^|`7PqcqgL z@^NiXqi!^gi1ha3B?C9zf3#Y*iKWcSxe#YOcL%3LE`L$Uz{Imzaw+Su>G5F}#3#+Kd z=`QvQ2>5NXc< zomT3JnPZcEkf+>;PCM)3QuW}X_Kybc7m;9eHW_!J9fuL=1Dy9~r`4N;#UapUY!!nrkr`*Y#M`}NGZby!iK}XM zXQHfnk?V3sX3K@q`?tu?-jV7?XN$PRrf-I{SmqpWhOf3+2gqc+FHazMd`#a&DB~3L zbf`r9Dk11j&?3SWi~2(seW-MA0rVc*=CJm!{Jq@bsJmlzYj}oZnnS-cj-VLovp#d) z%-t?KyT$XF|2_5#*nGE*tnPRPW`onS>@Ca4_>zTaxw5)`gU3a10JTEGgUC_)BNOY6 z@%=gTsNzXzJcOjySkeDkck%W}Scv-1;;53PSk@&~q3|`7$dxRzk66z>Vqt1&6i?B5 z(e3YTl0Tq_T4=DnNAZ7)vgX%?8{9I)wDgWR01y2Iyv6^mxbZ9a4?O!AHT3T9OZ?v^ zfBt)f|D=H>bjO!wJ|W3Ib5GUU=+ZB)AqSL#9Iae^HdILG;_V)bt}2_>GH#lQLjKQj zAKhu7{8EI`Ww(V@CQPKX0^ZfRK{zRAOA3W-tfWF+@Wndz2#DtNF#`vOJmk;I#D(NY!G>-<3Y%chx^Fj&w)9o-@* zCk@vu9Z52nNNlQj2>|OmQdr@_{>IZ|$M-^mA;Izd)+)QP@y?VCwYv&PBJHrUl2Tk8 zF+;ga4gF#KH>p@mj)_?z_-T5WHdMJiYPdCfS-{enYnMw1q;y_+e+4!F& zswPN{X~_8N+@3*Ue{#cxfvG%QN#v+kq#SguXuef!771)z@a6vZYVZSRvzZg-@o3|{ z!p6e`gTdH*7S}I~Wo+E!w06nHCnk?4`y0f*O~dNSSU#a8kd5qf(4}$Vp3wNjEex< zO7$?61qM>alw?ha)_vZbUBs_-uF^1Uc#kgS8-fv$g6P8pYTnh;INqM&lfGX0Q`az+ z{L*ZwC?I-SjI+E?IvsONRf?(!v7ir95Yfz*J?BI>Nthi809cX5F|Y=U&vBqGTys>7OnKTIQx?bI(|CY44E8i_vYcg z-;COf&amuP4d`L?u^ZQuaZ{OGV~F}x4wI@mx^L|#DEtz3Uw{1ByH)>7;G)58-gWPF zGw%7$P3mY3S2yk; zEt}Sp$y@+AS~fvn{>O$^_$v2fUC9+KWnPUDa^1r*u@I{%>W zN>e1wIilw*WcfY$*}|BA6J12ceXVICOmA`0HgO;(_GPV}kkBMud0^yjaqHPs%q8+O z#D3OT3f#{W^>4%x^M<`d&bh|uqxUg>43*r;D{`yw+RvrT^m;fM z*Ev^g+I?B)hR{k&+j}(|9&?}X#>Dyx0a==q_d8K<^S~q=qyig}GkIeD2ta3dhwl?d zZ+xmG(Bs{6$v1J$+W=oyV|LS>=1{B2%|y#PB$c5I@$qmrg;9-AGxuMmX*}W%uz_aO zp8-SuzMu@6ui{B9ygo3@IhGGV(dC0#`}v8dT+w|1cytjMLzKj8J#O|y_=#x#1h%A$ z$#fiYQc^3udXA;^UMYh}kl7fPCecM|USKt;P}=-#_3OzTK9Xq5?HwWY?ds#^$!WlZ zd8&Jte9Y6XP-Jd}A`0@eXDCtVm@3N|FR0F>!UuXLm3lETsLJ$_^{c^|b~4xJo?p@M zBqzGE#6|ds)|0+?YX_@f8m0Jg%3xXnoNkz$1A<-0*EVO~3XBVn6t11MnG_IX`RhJq zrLM(hMlKI3-*ha#G4Je6T)-D%hsX6)rUqwLf-615g`^;bLLS3BfPCV+H*z{B0u z&L%mN;EJ)R`|0X!i4ddj+wEe%yF&q@76`0!{~P!5399rkF+9<*@gfF~6rD}bXS5_? z%dkzY{%qzRC`ha)Hv95-w>W}2VROCPVTBOVWM1vI4-R1W_O!(pRsJQU!%BA~;9-X> z0!urw9(MRPuUdU0q4}Y<+Bq*m)OYpE1u6$3q=uO`uj?vE`WWo@G#sRkf~o4B$p888 zvj}I!ju2?pLV}?1CaP!xg6HnKIb?vqBmt73cN{_$X{cF;F93YWKu7*4BaaNU?IE}* zGT*dv_7848Yb7%6x>@;1u*v7QoOzDQ9fvoXE}@sL+Rp2bEK`b-HNgXregrmKUKQ~v zPgdz`0eE8XMw{_cVpBvUShZPWWtvV_cpk5Nm}0*`?Gf&krlqbmej#UmDXKqhMt?kw z70=}rA8n=Se?$h%dV#tuloK4vee>G12Jn?ZSDspTVKJZ~H?rFk6I4)+54@9BTCP4n{HfdfG zNl{;6G0!>CG#-1P7t?gJSQaIf+guMyxip1+i+lvz`^`yhzVY5#33=HTI5#S>1)VbO zs^m~=E<1DRpCPi8mVQk9Be~Ti@lLFO!YAvKj&-x7y6O-NC zq2&o=u-;!PPxiGGQvxZe_EUV%eKWrr{qaIm@%TL^1z*0R5!{1P4kYxw@UlnX5-kj5 z2F2A=dKEIw_>jC*&w)@>E7q%_1t0nG;Rz%qE!hFL-tIh2Njy@Xo9~H8s0qdI#aAwV zXqDhW1UWg&qO~v}5++i_{;Ot)9>a4!toi3FH?q+?mX>+_l@rq?!|cgxj1E;c#X*M@ zCk=U(wvy?t;!8rVoMcJ37x7!`^XU)${z5(&G;(eE0mF$!dl2#58~y}q65>ea>II%Yn+U5#qWPH&NnSGS-!Ll0(69C1 ze1r)4fa;P4uaT2$! z0m0icJxdc5&)5N?fFOs>27oi{wRcUj^9~HqiFZAneZ@xywl^|+>CZSpbl6}zj$bFr z`Q7yy=7!FEE)u8t+#N^sDK9Z59QuC-;u&<^0fxhzrpjssIGkqqD~(J29(G6GqG+df zX1e691;GvB+L6vHDb)XfV2&rYk1=3RGd)Ay<_c!Ut?2%_?$0lxlu7Cl`cxh#j_~Ep zHMM?|)k}WzN$Qj8I}HLx(wT~&1;XX8>@CE{T%g4tK`D9l=S#6LQhqxvx|bwqWY`)r zEQ7Eb>5`F{T1-+phyM$nTij*T8t@hpHoS0FXgl!xNl<`_&^DR>U5=4r6EcC`@?wIv zx=~y$NG`Y|$FLExqK<~%NwOZ6p2 zH)KSW)y8#NZ5wFX{ocf;ba;YA27><(20rr8uE8#<3NslgR3l?(F)999YyC0Y9qQw+ zg;jmO!19sMC!b|-A2`W=%+{a#0{RQ@s#`L%_}7hOt>1xJSVq%?opVV3@O;9}y1u+F zU?EaDR8d)mM;)P04&@^q;?i>c$tf(B*hlkqR^va024vh@^JEcaYaf4}41Es{Zs0MZ z@)2;9TmP0Olcjs=+u#3I&wWdvOkbR;WLSywxS?o3E?(Z;oRriO?sr)6@4qrRiNgZDk>teTD-IU4jiu4yIwVSnC`e9&6u9pFMW=LC zS*JyOv$I9Tw)~Bp3Q3Y2UffGJKDm{Co9gH0*H^Lc2UQfymywe_xtGPq{zQYMM35%I#Ea0e_S>E zsU8(T9&lqXO=+a(@w8w7zP1t*06;5A4VJ@hN;JxR_#Mv5x1sAV9KE-K{*w`}Y27Ks zs?Kz_)M{tO~G>}e>m=J~9 z%glK%t~FKIq;2Y{A$==1BNwiftYmBi&VAJLFd zIT3rhua$mUtm4`Eav=l&<9%q3tRAxVUnf=o zGLgb(J6)o8L6V}L-*(Bki_V| z>6f@ap#|V|^e%BjDTrnfA7b|VHk39i-eO5B=4dsR{ZyR*$%8HPf*fAHDdsu=vAi^K zxPZCFP!|VUG&?wccxq#=gg;1dckNP;Pl0rh)m&k_5xcXjFE}*Kf{HmD>5k>#ezmC= z#@X4u85p@Sa})tPOn4l447@P6bAIA3n!JWkbmX z>^;1^ghfO|goM&XJ%9IO0vk^Y3kzSqd|8;E|EQ-YV83{+dNjO_9!O~Od4Fre+yBNY z~etX^<Qg^shdaP6+?tA#l*(A8h0KH{E}*4P3fP_(}f0 z{%6C#;gJ9I_;(2vHNE9Yzu%K9j#vxIBkr-d5C^$mpzHmkafQ3i7ys`oDHD-+_`q} zlAjy)DlIC#=qY=P~sXBm3R<(Fj0aY`SsXH1Y6O| zVs?8ca8ltfIP^_7s#A-=?{YlWDL`_p*L!GlClBRzd8g$3j-}+xCkRN=BNd|Fev^ZA zL`p1qGRFHx1js7MuE+ZGCZ&w(xTQ(~^;Bo&-b!s$h#v{4vb!5ysfZ#gm_U%^v0Y%S zMF46^kX+UN{tutDIF7m)YuI$Y>6$$92=LJIx!twr;QJoYmTn~S+2zMzFhQ#T)m=Zi zQxE^=g33|!n;vxt!k8}?z0+qXfVQ2-dzOx7&Tp2tGX){ca61YP6BQe_Y53OARU*bf zM-8bM+IKl>IFyHn7q6!}9x#q9Wr}K~O(0ags-C(t55F36ACI33MoV}?Jx7qF?+e~6 zS7yRq0udFD4^OtAF|LxinrM5;&?iBrv8xv+ube5}Q2^orW&M@=>f8^gT%)^aUr)MK zGrx+n_lVjKfSVHY685Q2-NG?e(+j3+KI8M4S!LluS~y!RdU1x)DY}lDb}~uJ;8oWv zKk#i0T%jNJr7qBY5jCPLt`*L+9TxI<=sb%E+hKKE3%(0CO5QvioYhzfdoQ~gB~soz7=vCTq*O|e2)=;#rtM3D=quwiw7?WI;|RABtTPfOAhx=Zochf<|w;i1Zn-bTtJTG zK~U^={op`l?J}>W!~Ol?MyhK)80(O`T-R^2!*(UfylMpAoW8NcN5$?dsv7!x5d+Oq zgphDybB1(_iXZIL>0c4r@Xyc=o;jDYpam-$W|a91;7%MSYd$(0J#sq{DW0qWAb6bl z?Gg1m-SjRV{De=2Z5y`CB9wUjen(!6)z5e9<{9X<-w;_&CD@jn7GD&xlK+KxV~P! zARX+`Kc0BsAKF6I@@W9Sp(jGUWZJ9Vq+ZSJYoIlT%r7M_FU6}`TK6p5MbK{@U)XfS zuE0}S>34x0`4v|21;KBq+X!;8N_&8w%(~^9kU{h5*TD$b``?mrQbNdCk_x0>`l}v zY1g;)_vWcU79tTT7Q2rS#G$}wMmohi#Zx_@af&~8BoWeoMi<9aVrE$o*(}IbMw*Dl z2R8cinx*I|ACZuMOy_pWl*067>udQSR}s-?r?w!;{nt6|wa&4}ei4D*nFbtKga`o` zxXFI%DDg{^YiJm|o(sHh87LTBY^U27e5rYvCDlsQ-fr5+yJ}yqWKk)AO5k`aq^G8V0l+()l?QFG?m;;vT9-1~{MFK&ki#+%e}^TeCB z?4KvpU$lC6;O}Sx8pF3~6Frr1kte1eX%_{e2I81CUPUoO7?i)J-G)Q6G?ILSgS)yB z)nAbMxaKB(P+*Hg!uPCtf{^hX7~QxsGlJbPg9cFqU?^W$}s z>60>=+=bhw6Ps(9#04ZS24{Y3NA6825YKl#h%zGdPDScX0cl96XZyk{*jY;#yCw2~ zgRWq~iu2DK)Jy%r@wpf5gq(Z=hEKT!klBTY$hPTbzQb6R7nn%}`Zw1FRp>$&tjl~c={*DIv}9Zj1m zW6#g!^KA{)BoVP=i4nXa=c-$EjsD@RL}ZhSQMw!9{GN)4DKGMZ|8M|y6vyAKUJ7zv z6W*WW2ar$~zEXum7B`J|bi`pa9#{Oq&4mwO#vg34G=sXaO3>JTcGSnzL6=$?3>zfLHoL_g}Bwtx@1(B`)dLg$JapQJCa1FD24ap_Ubr;%Q zXm`ZGbG<(lmhYN!?aP>+K6VADNp@&4E=aeg-MT#nwlXRvTx$KrUH%+r9(=ha{K>l7 zDJR&cjt=y()qQg=sNViPy!nMfT}1yWyQf+D89}eBspN{u*nM-Bz54R-#5A{@pehpr zu=!G-W2UN-bodg9IsB|AZzm8ejgxUr+`9fb(lcwoR%ws&@ZkN;sWzYao?DG(+~s%2 z2?EP^{?G@SDk?j1qSNg4FScoc+Ek-PJQg|qwIDC-nYu3+!@=TTr16n%7n@aEcXgI> zKZ}%zE|i)%EWV%Q|CCURXg6+>b9xBRQLmr6g4EKwB+j07{7z!$XHfNSuYK;**pC*k zhvbXz91r^z50b~j;Oj(&l*_n+_+gv9xqr4VFns$$#L~Fw9fe{NgPS5N69+ilbvn37 zv5>Og|4GtS4xlwqEkuR9kt*t)&__`LzC+flOfLzDg68jkBa7*T3-5!JGLm@ZkAjYu z=2@n4`}5+a*!+pt>aEhk@2e;|?XC|#B<>?JoF~RlGmq6=R2G(`hX_UERB5?Movyza zXw|oQTe)2gT5^9Pv$W?utIfC?+b6J?$`??cAb!ek#6N{@e@P5I*=Ie;H1x5_2^EcB(vAQyB+}|L)&wJy#sM!4VZDoJ4-@62z?CM4y^1t%Q13N;5~ghtuQ=wPqXs30QxqRY%qOOf30QU? z7wzp1+sW?bsuV}W=4pfs`mc25jfdlXKLk-g`Dhys6mIv+K*>!Cw9<_ti7#jJ^xMyT zBXZo=>r&OEqD*7rkwngsHSK*pI1C6^ET0nV_?PFEY>m@JH zHt>DesTiWLc_q$r?X8-B+9HLpoNiyK=F2R7%=;1&(l%H<*r4a_i_}S+*7bngakTIq z^I0U6f}HVHwAqX@hE94*OFw`;(`!Qy&7&d4QeXH4tafbNTvld;@stfb0~H}ap@^B3 zeidbjGKj&q&%`i7@6eFN_`+&hzD{-4gC(?IjLw_6vSEfGrN5ze+TT|B>uh)!FV;DB zPE1V9&CT`q?{4)Q^9_z0Jx0bDK5Y@-VJ8wAGle>BQ=JPl zvY*6h)8g1O&j5w>`fIPo#a>s$?6&Dr);$TakKjcKmy?Jct13UA;kv!P{hj&b_miWV zo02c2Vv8u~cQ?(G4TuEEv-iag4+00BPj`2I7ttU~1!Ojh3h7hH8kQ|9&>}=>OGF_> zc3cs_K;A>CeyJgUcT+wXhL|>NnqtcphbK#aXl2? z5$+X-4|xfmdilJE*C#22^1e>N67Ff+-ykGkeNET;k6ZMHdmo|AndHJ_MQs!H?`TjT z1@Y8F{(gYFVgK?=|LunU+d2OKoBKRnN_^RM6yNo3E;!9;e`7B#{#`OFSE>A2s-3Ko zp}hV;Kq1x6e9CzjReHaQq|*42;9M~C_KevJ^*T1kPL&NN^KtuRJ3RuVvZ;kn6-d~< zJbL~#TfNseb&c+mA0-EOEMipFCNL5R zJmP_DE2kCLp3Rk(*@_mI4K$tqdR`D4TK5YiJ++6ey#so$IBziUkzOK}CJr=MgxEIu zlA-6pqSy2Dr|D5{^bCo3J$=?u<%gyo`B&r$!)ytI;RI|4;L2BE%2L6%i+js+nQ; zLj+uFjY?YO0)X5jlZCCt{se1a$bNC!D z?|ZKUEQO4@Nh4)CXZNBpf2!FwEE6B(Sd#QuFc`xb8_p6->ErqPQ+vz$1Kc$%9o+DW z;;S$*@*)Ks>pFn?+yN;|t*Ft+j!{MHr&`fe3hH*6J;}3y3I%yLRP=^l<1V(6v$pxr zsXxn?1_nd(;pA{SZp*LD1%aLw9zB`AUs-~!U9PGVQ3BcFLIf+q0$81G${y&8qClPC zs$um<5X*G~#j%AXQK4VmPj3H_2g9ju?#Pq^tr{DE2&!)B7wjfuX^cRuV{TCN0mQ6S zViAw!Is0wk22MgeE7nWbLvG5G)q3JPXr$HCi_R$8=3IA!<7Ef`Asv^}lNzFYhEyE7 zULvG%+pE5-7Dhd4h2^GNI`3xW_ujTD&5nUYh?JtxE$JRZlUqf15PX`cC}9BQ#Mk$O zJlk&vI#f1K62lPEt!LR+7{Z_bLqCDDQ5X){O##U``ZyUn&_WFH3p_kRNxOAgE~l6pDZC#cA!~XyTWQn&q*{U^bGl~!r(q+S z%3mL>Z@+p$*aqcdg9C$9FmP}%q7(+W8D5WmlgoKMwY{n9_&fBMXpe^|&1+vhQ-}An zBNNjrZ<68bHFPy5CI+{_u5$#&;4xdO@V^mj8ZTUtn8iO55xv6tdrmZEMULO+f2dq_ zmDB!mVMIkm6-jHehg@cwLYyNAA{IayrX~aCA9jzpBbzY?E46|Hi&^27aR)x|_x<`8 z&ju7Ul}la(`}E>B{JO^0`fx!dFHON9EIC(HfjLrPrTG<&ARVhH>pRj!b*&XOuk{*` zWBV(US5)~3=GN1!)@9|nj<1E}$pol}EeEBv{M5{C>i!|wd{D3XnsdPla8B)3gvOMW z!E+A9tm-zZF!60Qc5de(^o8Q2em8vf55vbIQ>L%x`xR$*7W)D&<6nvp23qWhJagf+ z%cQWf4d$pWi-7;6BO|v+4XZL~LN0`v)-c5bg21a8#BJ^1@%PYic=tnEye9f8^s?yK zHQj%zpk==*bNKH5J|2g?rRwf?y!+tOxsqiC?5UA+_aV%(#xQh2pX6aJ=MN4u(a!Sw zCri&RRHB~~qY`IFIow#l+ug6JPwEc)$M7`I!}oXfa>tpe4{JfYsYMotEiWJ5NH6YO z^wgAyyMpfTb}SE}e!HFF>eHD^ZiOTO9E0RJ)>iyz)NQ z>-A(=0^lH^5ytO1|A_BQ6*we!5_%5?x#;B_vN!_KIjA4DEeABqZEKGgD#c#SOGtpa z#WyCkF*I(H=V}>q?B-umF{^Dt7t{-DG7aM@?JPc)(>UGS9==9%O}3sRC|pqT0vKz$ zOGcOydWz>`%U|~x#U_jTr*=C$GrqolLVWooY>J0qi7tUkrxJBu_}Yg@|JnVy4pcld*8L`ee5%Ie0^^G*XdF(p@-qU7b43 z0q!3e(k3}Bui57o{A5yvj2ptP5-Y|~c1#5nqHoP!ABxoUDs*>~uzbVOSh&E^s}>fo z?vSv!%kUNXu-;8DcZwlyM(%(Olsp?4NiA)`9t)^Wd{tE&u+S3^Y}U_(8dUpEFu#te zza9R7l_mZ{KtLDz4LV=t3-Woozemr9?l&&;R7pz9e01xYr|@7 zoGfp>3A>o6+tO7FuVtbe-*^A?t1ConGgpRw$Cc>gyl@)Gifbn&J;hPn@9;K$Yh3aa z&WGYO4(Debi1B7!i7)3c^Q~&70m&^2srA9$b3w*tx4_Dz#sA@JMfiI2mxQVH^E};J zC#N4jP06jD&JnC%#~+IDvn4XYw7Z&gEugL_bZDXgfO1*y)OQ7oSFOFccXTKm;(KpjP}Dh3qXb ziJgn>wVdI3Rz|>TT5~V08vt(RL>g@t=#F{<@-M*M?g3F?1)$9t0gz6|rXfNDvS9ba zD$okW;mE`m8)U#ek?Sv_RkW8ziWKe!NTxQ80LEEuHlg_M?{nI+JD7pJFnlLTP5okH z1SXuF!Y(*8C1r%lTU|D7@XY6xYFhdNUZr2}W#Id-Gy)E zuDr^lFC{c%M>?Mf{_ywGldTyPmQ&>?h}+bmQH$HdQ|6?#c^)6Gq>@wr65&35-r>ts zV!um7E>4!L7iI7shJl+QQbYATo!`$Yr~bq8Pnw@^jr4@gUIJ(%d0Se4&Wr0S#*Ge? zE>TWgGVx!XO0O6h2tT5w?k4Yj))2biaBmU-i$Z*9MWwcLNg2_8^AN1hQtT@9A`!P< zQPV~a+|SIwlUDs1d-GZC71#RY!Dw{;P9$FTt!ggfZ%q}?0txxSAVIg4Z4^V`o*&#m zQBLFi*zj`+)!Z>#r-Z>|{7?{@$SLZ!|<%dxOpB#y9YQt_&Kd=elth+eq2Z zQG9N#k>|)gd56~6sjcS6iCg%VKT&XHOP`p9(l8ig`H4cs>m=q-+pZ-!4vV{!Gcy!Y z9+7L!K!Gf{F4g{1Exz!xK~_^UcXF*$h^?3hHQIi)WwohE(Sb)#9%W-|lwiMYOF{iB zuy@x7UlBgveuy3$3#|RNa{~}>QKY6Ad}5rnh4H`ww(hV;$mjtEi{rN^i)=TRdrS5Q znl6N5p14O{d9HJ!T^Fg>D{sEJYG*#r6c@^3R>*}2ZiPPyEG1$@%s0vs@%t;dnZT2d zv#0hVJvHXBd)%HI0IO(E`&_YBU6G#^K)ovb`HT(WZG`FOKwBfYegBJeO5@jsm%WYp zL-0y0|57; z-}~))&@|Su(ZKkcagN12(*(h{?1vTq>?dlReQAdFlPB!%hQ;H_{y2^VKOBJR@lAjl z)bcFg`n~^ZAy>9lym{hyQb^SI7NFl(b$O{1W`7F;IE*X$?n9wqJ zjN&Z7H~NMg80x-pI9*M6G-LW=*$_HEr`~-0mpAAY6YSGA_ue0AF5pD6Da{z(MFdVR z4>)8-N*F%*gK{4_V`DsTWh#ILoF?@Sbr#R4$Hf>}NHjb2y+dP$#l3~aJ>{z@XOj$qv7Yz<$+_^N+ z;@9>F&LDxpuNNHmR}m5|TyPvO-WK7{IVSZ9sl>6$EmE@F*PW5f64iWQHas9Wbq2ww z%6`sKAWjKDm**bu1?Djk{zPd_wIP1(Z@SekYRN$inHH7I}> za;BPBslA+r<{Jbo)-6L2fpa38h=tN4W&bNX*@^*Mwg@?k`g^{f-sl-I#`cMcpKAAq z-CkRBZwY?S2DT(yucVctt$hc6%l(utTQbj@k|f8sCl%HaYhWK+?kzKWG36E#Z|EY1 zU~D$D%WeN>_=S}}D>}LBs1W_ant_%vk7_BjDn_?>S@5kjI{)Z+oT+KA2kd6Pp<+nC z9@`G5_SY*sl?D@hx=KI(D#$Sg*ZTcI2W)4*B49T8O&j0YeU;NfRlXv@{o9|G9GQF; zZRxH>6T*yY*X#!N3vLsQfTa2kEt^+d1kWU*E~J;oi^kPwD>W9)50aDWW2vrTK$z4&f~S7vdkd z*Mg`H;e?orp$un;-^3#nyksGnV}+P9)udq}sZ(U;p2nH@ zLET-g@5gCgUpz(I5OT&d$2@yBtNY%%hMmO_Fk>Iv$-1*0B~du?8j{e*>Hdi+5~~TP zde$ND<--HttDB`yTu#xHB2LOd`T0zzB~?@OC~x{gT&5fXUT=fe*LE#ftSI)i_=D5! zvCGG8y~ZzEuKDMBk|t=ccnIfkj$><(Tz|PLRRdAJ?$&Q4sezTRXIje0fYNTwkiKW{ z>hcBqRtGAlX}-Wx8QM2p2`bi;$+OZ|-h=ly^^#WCI@!D7cx}^ZBO2}gH!aO@*5A&C zCgDn^-KQxtFHrbvy=|!=@)Oj+|Ih*>jM9>uu;l0)*6ix41$=*@J-%P4Xwb-!Jii4H zAbzxv#W;eY&%lPU+g2kOA@hx)ezUnPXZ02VWOG?LzeuxPu)FkrEe2g2dota-lsC*) zfH;B(fD|^pJXz~h_R19o&!y61T(#7?z#?+`nFhaggJ0Y335>tm0noca6NgWYG(lVi zC757thsH#zb3j8{n@^!R5OCNlGUMMS1pv!JO`dxnpsbp}iP|NL(O3wyv9^ZfF{B*d zA2Gv%F|pF$NX+eh+vQpDRcz6uQ7)ypi$I`b#o)D`kV?(Bg8uN7i`CD zQSg>PQgQ9^I}MQkI>3|Y+aZaPW5;^VT8|uplI}pNH)?R#waQ7zy-y@*3%pN>pk?WF zPg+RS$^W4V4~E%Mq1w+CEnlsq8d|)1QBRzBV_$f|oCOPcX1*Eo^(f!22fA@l8g=qw zkN3`hOf2+R^U$CxFOvgx2a7qwq2G=Q0aIGmUW0q&OE7v6zx{*(UFwq^8uy1<;J2oq zq3_!tv1v6Zp^9jP_o1&UYCEI8FP8KC;*2(OZrWe^v}$WMR8E48`1~+Rn*ZEk#;XE*Iu8aY|DGxuF|*= zFhRT0TxKm9Y*_8#{Y`+9rfkaJmDJsF8XAG%MaWCQ-i#} zK2xR}tNMw~PEggLlyz`{uv+--GPhMsR_&X;!sd^$>Gwwg6{N1sFpYA3IF}!jFQf4< zZ8OE91-Gpp-+YQslaaq`cnCFRg@Y1*E&T9BSJUxyo{<+Th?Pf&;- zq+79?v^avI_C`maHS2vwJ#|rjaYG?13%$KuFge`zS#pci+@h1uso?e!kIkAZMhy?q z3t4KJFnw_5VX;t&OR@jP;CVLrTW2?HsH$Gg8lc(OXy)N|nrVJP`4}{HsSu#&-!|Nd z^<&)aHxV7t(Tifkgc@OStdm4}YVA7DI-uh}x>x}}l(-(S3i{QdeIfXdqW`8gwQz^1 zB=W%jDau|YyV(g`ystXgOtNc}5ax$@Ye0~0f8p~b=pO3b?@o6KX zvhX?6gfy%B@A{AIXY=H@z39wB?0WD-Yzx}QbkUu1-4mxi^#C~Ebsb(09dG-unSGH6 zxAEW4lFyzPbOksWO=kxHarMsfSdg}XIDs|6?}7j+pvBCrtM4-DL4*n#v``N`b9W=z z&;DXdDO}v5dEo@dfy_kShG~NvG7hTX4$J#&;>*R@=di(T%2{sx&R$M6 zcQFFmzs%`4xO6$bEb(KEPgA+@O^=gmCi;{8;3rttnw&?L3+HEFDpG!;Gm;S~`Z5iP>mS7iblWqGv zXg**O)Fo>{9+%w1QDa!}Ne3D-J80jthhN!|_&o7=PK2Yap*W?1p*h^v$cQR->uS-< zT&xai$`RYSuKlxEty~|6imFKAU@G057qd<(V3qRGWb#6(#NmbaSLCY^^%9LmYZU!k zY*_XCBZxC`^@pheIKdUI#7NXeq%$L*Lqe_4C7GDt5SdWl-gi9Mnx$pQ(eBA3oGkJ* z=gr_1xwo}LQN`B_xB&T;vrI`b*c1h^JaH!4vrAuHz2q|nHSV3;cIRIPEYl{U@g(1c z5?sXHtMI(crdo#jCE7u?SW&^hl-+~eSVez@-2owqi4V7&n4R!?MEdrYC+*#O>nxjY z7z0PW$Bi%>8FR?&Tk6e+_=iQ~eC>T=B++-!ADLOygY0MOm?8%9m2@)9JJ@_MC(0~Wbm}VBO@cq%F2u? z87|yNZP!nimzS%nt2H$>@K{|WnSc|OrtI@(AK^v@Z6>@6aWTC+Ihc)*)XcFi<*L_N zrvMQPb;9}n3GvKe@601aSKZ^!odTnTs$|8+4aDC32EEyCh!w6GKCej-Z;|TVA0c=i z6m>024Z{m1A6DPoV64z3TJfG`$Gw>)ojd$Aix0i!=`Z4;8!wt}r3^0o;;j9t)BonZ z9kL%6e+ih+Q{dIp8yg$- zC>`D1uVAnWQ7MUl|I#v#+lq>bQF$Mf!%MHPG*P%3 zsZd#3S_1IN2Fx!ku;GvWOHbXUg7`mUqW@+P|NHCzuY_SY8eJ&R2^AOH^H_?K0~S-X6^ zwPHNo|*8)Rf`OPfnP^h=nGV2iVm@oQ^gr2lxEZiO5C_ zUwK$2z0+AKRpNXn^~_<*3kkg~4ve>-oB4W2{QV*Os-PGm+a|**@C>rivu_{|o#ioU z;%TGk%NAsWhoY0WIEyPB#v6P9TyY)R^Pn3(5kD)fKh$nJVo#Hhplq7#(+DWv&guou zC=YW+pay60(>0u52T!@$QEX_%hi0`+4=14|mfHf=cM5Ric4UQ|Cj0cSIJ)L1}xjKB#IMGOhu9Wh&1zq)E_J8u*Si#{V*CvB+tO|xPikIa!^tneP zva)3CNB}lPbI)D+RTHCPUX`nRMT_mMvm6ek<%hAht2 zH?URq%7nu$M%!-~N6Y|V>fT;K@@+TzbbM|3N&o5OGd3iIjKj3)$`=3jIpkJhfNg~z zscFWP?xzPNn{VGpVBjJq0v4-;dtQigSpEEGvH#Ok%4&zN1?F+zX)vN|st%opm``6? zufg}NfpeZ7AsvG~#+gsCZyCIt;m;cXClz1&^fyD!luYX?Sg?$T_&m7Xk!NgW_uF=D zat)>N(8}szrR0`h(2}L<_NcK zb#{#}U0QH0)EM5^&E3wbmTr_{za-|B+b@0TA~$k285y` zCcv^???-D>X^eZL(~w~Q@~*F!O$s~dzQ#pyshyz9n!-?H12v>3h)~lUCUBw-bAR%?vaV{ToV_9C3}-!jq?d-7pPG!1Tdjip?k|(@$(e>oeD<@azv1(5YQ7M0UCUyuC-F0x!npo zLU2}b>f~#ppNv?`{QdF6?laZE0D37=5<~f|W%JS1h|UJ$H~Zm4EW#VWA%l0)H^OpZ z=PuISWu$_n^Kz6-@GB}nMb%_zrrTtjS&Z_9cF5l@ob0qWHVrzp#`$zDWnQQp_{o29 z)ygc)_JYb_%v~#!QRnUlxMM78>h-b+#|;A}_hZ4+W$;w-H;38PVxl{RA->^{oNZD} z&VX6;s2mxr-p*o)`S2z1uJcMJatk)n^un|BPUZxV^ph9+r8f{|X8^R7ySY$X!4(>z znIT4!76pTD93#c>a73aKIkfQs;IZduwOZsqAm@#r$+98i8>&ihsjJZCoW1KLLM`>p zJ$6P?Rm&FlCDXbxpk025X7|2tP7J~E{%#YxHmhJ!EaBnb20b$ZIlUowL9L4|4!z$!;F*=+V6yCc79Xf z3fX;=jlCQSVAd#t|UrBt~${PYr$Um_XL5(+;olx&O`MqvJSL?gdfmHkdM1T>yR)zD__U4wSL>8-&egE@Iu2U=cGL>AI)mMIpeEz0V#&!L^ zwVakgVw>`0Gp6K4PvuZ73)@a%#1TR62qp1JlJ-Co!Z_{XPub^7HO56f0fdfz zjBc~uDlKLq;e?s49u5<$%HpT_|HW%AclULP zsT-U(@7l;kL(F`muRoF98$zbrcCSO;69MD2*c#8?a2e9&148Mc+aK!iWnjPMT_Hyn zy+~FxwOl&d}?dFV=TMJT$1rATXd2neOi4&=VmM|Pv?`rzWgPyl7aPXf|C4L+*)1q zVxFG}3fIRYaXOT}EtyuMfO_^Hn5I+q2z)$ETWZV^D59_Q_`Gp!UY6prb|!R57crb$ zu59taz$eOC`vuw`B|wtDpV6O9Q~r`0@sDLY zg!M~PAMdQ(eZ7kC0DVH`y{kp5#{jVzCl~B<&EEObH_zDqs%bW^lZmiMqzlj?G-elz zH>YPC+M9)d=406Pb$zm>chM|*YY~UArjgZcDfHy?vOm)(Z%MafI`No0F|R*I{zAO_ znTvDCOWYO$F^_e#`!EdtWur+l6Gw?KH%Wg>K($Chcmh+>GusVZa$3VizHGn^tNWrD z);4BYW@Rdw*+{e}KvA@y;gI)zXG{cJxRCbb&}=bZ!$C@S-WZte;P~Fty!RlDBWY<{ zZNOmI&=|X5HsL};&cq9ohJT z4^cC;;leb9kB|pgxUK)|x|_sOd&4P{6V(mO#G^syVTkx~Rs~Fa?}qkcSMk}Hsg8oXZOT!X!)?{%wG`*amNiaXaP3IRIR7xlp~x_9ndcX_ZGbSSIBG^BwR)Xq z?ed6x1`^6PXgXZ{l^h}jrwSi25izHsi(}>6n`kqWkZZ7c^^-KsQV>u`-q?hQp-a_K^R%xy?H_qtXF$75fe5$DW8Gld;^QX7uN z+wo6JZv$AxfOnhqbuWwH4yD?TOo9Zr5nFTvcbb-TT?>tz#1xvPJitL z*AkV)zliDVfeAPDlu8HO=37(<_RhsreJ%6q9_`7Y`J=2_w0ifi#1ZVqrv~1E74yhi zYi$hh_x8k2!1ZLNNXwx?_))h(sPI8+J|5_D9fFoydH0hO|4R=WTQ=xKoBS^)um_y~ zXkGs;ZT-J>s{hZz)&J;g|9>FFevn#r{(qy$SeZ>d>i;<)^VK2#w?r02u{7qt0Ol@5 z(KKw^fWI?Ipq0NE9mVtb2Xzk1`btT49ja*djypKqG2By)2xM3?fxVIU7ZMz@FWF4^ z*lb#Ds}_|j%(R%)uqHYcd+qb>Q&NI{mo|xN^5$<7ViIWHj456L9SyD4clw1Sjmyef zRr$|N%rq6-J7sJF6lpYx{ndUZuV!!xMk4Na=hvl-%8g?}Aak_eNsGK3NRx{F+6kYi z9M8b>!^^*wd?{#HciTq}a`##=MErAj2H9s|1s3j$fuvxrj%0H zM9O!na=5Yz%f2&p#Ro_=$XI2W=&UhZOkUNXL9S6dE*cUo`3VSBkEAGJtn%jDH;?k{{TCPmxG#{VQ3#Wm zUd_Ji@9w;@@6lPvVw1k&)}pGl!)7PK7}!KZf)6FmE4=Wbq>y-4yd4&8-aQHR!P2twh44T_Q+ zs)QdyC^n3>HJKq3aMgWpm=^ZTMw+NWKbM;mrYyLa2XMoK@BnvusI$l99zO@L5GPLYs=)*Gu$wY>jGcMG zm_;)>B%u3dBLDDUNnY0j3IZO?GJkAyPJm6f?l=tB7-`s1MUM`g=!$&^FT9-le>;_t%b9GTR+0R%z``7Z>o%m`N>50 zTLF1m%9dRLRt17gpNW#IS!h@Rv={KX6Nf?;9%>(DU5VT_YD_7a+KM(H^#<7tzoYcg&TLxX}426(z;B!2z+B`%&< z^DUx;+pvE<&*-mj-+I1WJ#7Az?-XRr3EP0I44u0X(SK%4q^0fq`p*Z50Te%g`$~UMF6OhmM$;aVG?B?4PiV0^huaK6EuNf3w}Hkd3cUav z7T*;b6V{tad`KoU`7EV{*{Mz!9CW}k<5G&_{Kfs-*jZ(z;T%*v+Vtc{y8Qw9bZ^R; zDJ7+r8jTZkq(KM9uYXq+EJ2lJ-Z6#812sf10#KgQp5f$=#Ck)VquRr1(G94syLOIpgGrl%O_7KtWTmiPXvX%p9#%M{TSU)kekX z`2@wj)Ek7R^w{^DdA#^T7>PAmxrZ$r5k9KBu&zFSvJS?%QeVp60 znun`ZIt)ymH~+$H)heh2xHo(r<}Voras$@8nOY6OsV&#*D$cKo+I)NOek3gpKA?S^ zlTY&|Fsqnvkd26_tv|CWJD##}Rrc_43w|$bdLJV{KojwR`_4Y8O0fmzYfDdo87-f} zZ7Scpy%JlSvAm@@=>n@RDJfa}pyul9KC)m-VT%r4e`wm==cV}|i*u`^UNP`8+MwA_ ztqk#urc`(WlzLWH)UAW_ZRb*eLwQ|-$w?*m+j+wqe+Gx5N;GiOdJu^cED;vk?#>pgAdb@T+{cDugVueaC6MNoTMpW=(k zK-1>QJUKnh5j`sGjXE+fi7_dCMaZFUSRc)N2u#6n{GC47Hi_Vwm$D0+l(n0YZhUPh zd*aESsL^AjDVnc;%Ob)hY&y~^WNn;(HaK-m`Wj|S$WDrySt(pzfsi_g&Wqbf2%yz% zmbOI%bH%0gf2b%;AI~iO)%^BE6ekz+||c z#J>TnBjlGmLt&VsIdZ(k+N4?9YveV)Bdw$ir|S_1H%M8oF11It?kl-T)hDnUmd2A< ztu|lZG9ABik{$l!E<9V!1j=j8Rt95(o;wTwkMrLel&9zGKi!se>o9i3?{i+6*ccEq zmP_lkU?}~;_pX?4HTD&M%UHe5HairB)~eC&g5gn~0fNr#A5QCe z6E`fyw+ZqRSCvBTwP}zzG}^RE;3nzTw`d2{#?{iG71768Sq5-Zt}s&sw`d__jPv{6 zilr)F2+nWas#?`R{g-xKxiL8qQed;y(!a=pzn+Pn-lEr1&D;AvI2IoXsXKGRT}C;L zhzy6zIkW@@gFT)ZeEs?r&$J#|>NfZi4Q)l+T)~BzTacdq%0=bAQLm~8tLH!@1_Ld% zv9yoBx9K}Mn?Y;o^ux?_c6N$@LVbOG)Hl$1u# z*tA(V_bBCU#XOXN^v}bnK*ZHm%tH-Z+S!elwT;r~;P(>DH1DE>V539%W;1QVbl;r1 z4Uf@5y%M*n@)R*K&iYiQA`iO75bUVT71#1Q*wH{XkY@EDhZ)N%KDWuhL99Gq{XUxy z2@X!eovWU=_kJ&DpxF_>d6|E&`TZ`W|KUAP5wVV%o}hmPG6!GfrHKuYo4t46X{vgf z>dn~D(9pbkeQfXhAe@0;zbNw7`Bec$K(98n?B`V47j`gkcvxpZ)Oq}?H}dP(Uu~*8 zL&LZ4>FIaa40L(8PX&;?RM2~nhZgTlul^RNSpi<{eAtdc*83lYG?HzH{4-XJO!PbG zDz&w##54LxkTbqUS2HE0n<{?eA44rtY1#|UUK)RMBnD~SnEx*Cwm-Y<;#E-ftZhE- z;w1$XWchbVPMz4p`KHpAbHbpc^aWgE9Io>p zb9dhbK6TE(5PBH>o8fE+P;bTE zH{L)ascQbjQqFJL-&@rY?V;J|_vmG8oGY1YX=i6fAXz%K=fa<4s+Gh|@De#Nz*H+k z0r1U~&5zK!p*xa*U|-JTfxHR^@VWnI4!Am*@3Yb$rr!$9nx&`i*%TG0=TCVeaVZHN zM-Ovo!D!&y61;X1k1~AF(54D52=h@-eHXbM!?hbUyleuFVY3p-KYg*%$irc#CrqKA zmhopHzU{s6uaSffm5Bl>=YeaDsqdfWE|rQEI?F8K9;9TW2+^`45>}lZxHV!KRpHhcCCCN#nNTR_!nX9 zmG<&8V7ZB?s2D4GT93bV z<(`h<7sxb{8tmYv^c90new|Z7uPj{d{v6q&oY!i0jath`e~I9D?){XA`-5o44hcd) ze2K=Pg5|Hr>4}VK%J{1B=>_HRoON!YF7u%$)w*dO&2#C8*TTJ~+V0PmaY2$&PkwFyMM*Ad{94eBqgHonT9m{XZ9_~E37(}u$@~%&6yvIF zZS#_Lv8Mv`36;c3ftu_9VK%k2vI<}3y~$5R+}l3N+rFpq-^F9^UZBGdeRQ{Oz9*~W z;%(LF5D^|P%*Csau5P}v_#c?+x--6+>$>{&D^uFO;f!Pr`Y6dJ7wcv_u~|!$E;hsz z2stOiOG3*P1GU~20Ym2Vdg6AdH%!7c6ge!NtA`8q;&tQGIGT(aUiD1jhM4UYh;(`I?~gFT=(S&-#`AK#8w zej`Hw1X6R(MShjyRTbLZqXxqRho-5OUaB&9E4KfLZ9cKdvbSssm4L@D3s*=>f&C%% ztKID&{SWzD3%bFk4KnihE$z*BK?U<4B@i(%ip6y-3IJiWyF1qn|5PhQq`-Xn@*tO+ z_!s%j50HLa8nfiln6cDw@heUQyvBCZCp7KYkT}Z*f6wtM~7L`p*2#CaC~Pc zX>qakmYC{KU+Wc2dnHZqaJSwzcbV#WbL zWhpIto8XYeDZ(>-WRrRfBQjQ9Dfk{LpnF?Xso3T-Ok1A5p@$OXk=!?pEI$MFeMYsP z<1;?`+UI{HhF`hkB$gBk+F^xNz=swyqHD3GR!&Ip&eWF zst?Ug35jkrw(;=19Z8~~c15Sq+uWYweM{75 zsRRC)eO2IVr{a%bFMz{8UP_X*_Q}_5_=iEmXU3gGVhDmqs+MN)QN zWw`t`@^*ypH8biDhQ0-Rujuf5_Kce(nD(vLCjj`c*}~#IX&qvw1o**tGZm>PM3r15 zZ>PZHe+-IdZxL!gg6o4O4aGmoqK5~MM}B+RxRe$Gp}-M$tX8fuYUw z5P1K+FQV&`7B!Q?5JlBo)M_T>P(g*Q{ASLQ;{mhI9uCxGo+(pLzn^Af=+`%;i*Ohz zDEVjU(SL3{QYy;JvZEEfXKO2%!`znmGld+d^kA#B-3;HCBA z{P!@gP5(#7>dIPe+uO$Ni|cf{hAiZ2mDv9tBL;yrPSBq~t0I>4tK8E?wA~}o=Wy(T z%xFr?;R{OIDivjnKAgfBal?M|z0)&JWT2H@rVW~+-&~Rx93XCW+a}y);nHu5QSD|mGe)0&{4bS3nxze-V^lA3N4?cIhhp<``Dw6N>`*q zo>8(=*H-L?A#`%0dw0j{(j>> zZnjl*ZHGOFIbWyW{MpqIkJn}nPrC}b4a?v;w2R#-ZcsXH`Z9GusJNmtJ8y;A_P=8p zwRIPnN$|p+xIhEo*IGMa!y7am;^$qMD|Vkjt4kw?`Wdw!k4FvHzk4{`4>i!}Bn@&C z5jQd#?|Qrj|A=M?{ql`deQ*TyKrNwm+uc+i<8=kwjE}508RWgvq~Q6;6A|eoKw49u zo7DZg(%ExrktL;%lM_z*p?imx@c#(D1+}}Fp9>HN?_L~Md5(R1Se&G31X0LKhsnqd z=<~WOYWA7rWKb|`&bwBtk0+4YN0~p*9$XhVlcE!p&Q@Z#UwOfN@-v#wmq7Kxx;heY zK_JB3Et16?Z{yP>+;e9*8I!!XA}c+-U+t=9h8+Gb6%nTod7)-;x!_FA{GEu29Nk4J zt7NR7Z4N|et0kjA_pGe<_f+r5IBe7ya3bdUH;n1L5@n~X1nOGL)pL|4OH#dl55{x# zNV%FJ4?Q&0!C=6@iy$@0^9uPSg_ny}Z0HL5)AjZHms@nN@Gnnp)Udd%mFaQn>Rk2G zC+6o%X7-!?p~+9JjBADnbInbEzjKQF@~mTqzk72anT;v+0*lqfJHy;sWdb&_Y>q@~ zn>&5*QGKLq$-Dvr^SK3bidL#rk4AtJBcMz}Oj>#Q>u2^!MH&hDCv9uoWMJ~FyI?wN zp*95|w%nJK-WOY5CEDJvUthnoDz?H!`)C{6F_za*rbLf}w%=ZP0$F~4^CL6BMtLs0 zj_hltTE22|)BM~%xQev>${U8@dMvxtSkcD(zL+C6(6v`tUQvD7;6SJym{D0|ai!k^ zyCjbGcsl)2ikG^Es;HqJDLI=jM~K74d<}yOdmCxb<3>(vc!Mg_Z^V zB7GSsH7SQ?dQVr@FDe{gdaeav$4gvD;v1PQS>5F2qchWXt^>&~ILObTYB3lKzzm^)U*eyH{D5dQZ zKhi7MRp9B*P#A|e3a|Z>bf#Vl_1*Y-Ok%=l5Gk?Q&1Wo1lC|mj1!Yd0I9g`RYflgB z*Yr$rBI|)KkOpCr3+>4&U;4k*sBCW)z=Qp5u0*yz*Ik8dOD~USYoOBCqbb-ERO@Zd~T!JfLCh})qNy9qESVgBhsQ2v~$ex zEDfE22qhdv>R#e8Ed;<*fxkBGm$v`rY5m~I)@Hu{jSB*;ERt+!W|z)TPH$axiamE=uEovg>V-=&Q#&U8_eU-!4_f(q z7_^uxO}}GqXkFF?h#DKu5JzI+%;loyIj3RJD;-^FPlXaOy~ciQ-{XA|7*=743R36L9qdlfEDq1lrt4z zCJRGAynTd4wmFY5DjXGwN~baRvp?^S0wnL8_W14LK1 zjI`2CXV?{r;=F2P%S(F|IQ4c82sw2i0!`1(v!of*866{VAKU>BQ}749PU zDWXDNT@hVi+>Z)fQ#d;!M%r>^?Hhe+*1vomF!bPUs?GU!xut+VqhEEs-GA_^Dc%3+ zQdtPxKf%3G%7rw5Y#`{wx0W_s$FeID zc=YWXMklMXvWN?M0jFD6xs6`T#W#mEp#E4@*j2Q`!Qs;f=krsu?OG9xs>(K4t#@MK zbxo4=Vg7A0wyeO!C!*tKO65r*{lt8&Qat-&_Q%aOtKI^>4On}^fcO?QKXT(-4|z$X zUKWgN5ep1NC^fQkLIO#P=gW)M8>n$wd>b4V(f6YM`7_^e?p3)^sC%*5`o^}~ywj2# zK%Fe7e#?gkWpcUzp2Tm;N#sehLrt<7 zH3T3E5pQ!1+qABwo!aR(+!Z8kzyP7BDm{Oh1QcOipZsSD>3@56MA0li{9)W5e`np{ zOt#T!YHbz$Rf74=r?V|kTvoY|N3<)hV^na2XL>xmc_i(ARjLDgwsL*HD@pNhLXeB3 zfcMWx8Qq#w+QILi*lXRZWIeY^WQ-fn^Nu9(mvsF;Ab^-bMSH2SylFy~(5xygAoN_K zctHVAPA#rO48el=Fa;)fBcD5K%0)-sq+f$&S(!3MH>--y_6_xAsVXhIb|$OZJF2 zU`laUlI<}wQrob%$l$H!(DG`vl|^L`ctBFCec3b@zX_o|IBi~`*ofv2v+#M){S4xt zHsN-9HYzGfpH`a-4ttOT%8ybEpgJCg_jBD_j-J;%$bbs~Bjb8N?D4wo-Q77aGGSs; zk}Wy+7@M^qR{M{Y+aq7gY*4z)a*GW0oq5~4GZ_9I5u25T^YcD&>nE~JLIScaDX!~S+JN7D{SV)MeJ@d3Ly2Jpyk?#K%GcfRg=`*d)M8e- zse)_$K%UIXwxZ$%^ocaR?L!xe3P{sev`)IV?W5B>1IJu@lW(^r3H8dG=VSxl0IG~! ziH*aiQ2VhsTOM2W2sB_g|KdbT)4^SX6SNcUE)>6@`5NRQBiJjd_5ytPe)IJt7C6#o z4*L`tr0^+vi)^#8F$^y3FT43(MXC`Vm1I~V0~1^_R`h%RX}dGxxhn1}>Gc2~_8l5r zgCh*?BR*~~6yen!W*GYDp%5g(;~MJPQE(`x4aHd13>Uqh;-Y*L^BR8j$&Mbs4pRtf zZmArrshMy6sE+|!!|oCXIiS5b>+-~H=h-n-{&2KT1E>N(nwmy!{di~L_UWJrdm#r? zCP1Jul)A%NPF|?PzcRBNv5=hdR={0f-^iu1?ejZp@NXI8PsMj01f_*V2@)ja@A_+b zc==7>$1#_3Q&$%k)<~xiy+@9D0zW8#+$)K*JKH<#;M+SVx-Qjxl#pfgo-{wS$W`i4DI?$@-p-_EgzaZ}XMqq%A zeaT`#ySsx}x}oCOVQj@Ns3_I78LfQES?cMMVIOk9?Mcb`9he^s{!wE?;rdfP9OsUo zmvN?{hF*jt5B^=^XgjL2U4z*$Oclq^YF%gqxHPVRHa(cF!dm%BIpeZFzL{l>l-)WR zXPn94`0mI^*}B!*0wuepi04Ra%e9Ekb%Kx^~mWvGPj6aS#4qUz5|D3nj+%Kwj znjhSFS%2r{TVr-GHiJSqk)U_X_I#{LD2tom!hzH3vU)yAS6_5goG#mB&e3o82|O zqf*G92Z4^(x5+mmK0J2k*D>xS`zgKaSyGyN391le_!E(e0?$|rSq&EHdrX+U=<)$rM%3Cfe$~kdis8nS^{b z=guG8rJLtJ{o1w_ZFf-Sg-d4fRgSbBYy-5xVMkx|C{a&XT69g%76L(SRZ?jC*jU*uj z(w>6aUDz(J2DQ09Ac{`fkG!lR0I=x&DN8?pk0^BgEcaZ&XbmP8l8r$79w81^-R+nW zv-Bn_)fn%HL0)ad?4hEnw}7Q=kEb&n85Zbfx`6nZCSDEStp%D~Sh%?UmK@r92p}O^YI4QO**v_&(8kl#$F}OqE}N($ zn%DIZT=AQ}_6%$-P$&$o3H?1aa5h)34wFUKz{0287KV%!5hj*r>`&i%jeE~m07Gj& z61b5U?327ZT9`A13)VTBqyq%$4T3T4lI2&WmRJR{cxRG}RbRt@d8Z<_D^-~3-RQlMAYh7AQ_&*6mMSb%&dD{Ue-AR=6rdh$t=Y7Te&zn%PYoo~R7K@Cu0#_TpTGU-?->j>zl8<(8Bq`_YE!J46B35`x8<;p35?Vxg>9p>&urR;i;)T#j zL_j*g9wnLEs!}MJXrPxQavAL}s5?|uH##@ETwrd*Ub~9{$XE~k&CkhTMa`}zSPNxN zyW75zjSGsSp<4?6bqx&-|DeqciUCumNF5J_#_mGKjC8a8IU7b!=48p&L%ej{@~L+V z^$3!&1la8TLrbu$El7XA919Bzf5uT`-$;XZ1F@WBY`9%>hV;?6o2;rCI#G3qkSaWjPQCDX;+Z{4jcP!n#`UY;3RdPXd}{ zhoObFH7CJKXQ@s?TUK9~pcG0y;e2+{WDUP|-V?V3N2Es_!AtExxK#&FlHrQqWDcG! z_qDyF zx}V*FkiLpYw~QsCS~TUZr`sSwgCHmv)Z^ND<#yu1N`lWipFLxVVQX8NTPN82+zP#m zFrP5h8;VY9uIG|>*VaCQ)^c$`hWHWoyYSIqq1HZ`X&l@oI(oB71?owi*Dm`UAM>m& z$G;x$_1p&^GeErPNEfD0p6Bk*PUs^bkM38#)uA%*G86)D14L)9_1Y^tO?xBJeun-0 z`FjukD?Mu%Dk|!0oJKIgE5xq^6xko}I#Z`!QJ~M6e@oeg>|IMKhP(}WTXcQxd*_%b z=;_tetdMc8?mAQKte~djp`VRhH)vIO$s>gwZmz}DS;U2`hEYdQ+TD+;9at*+wBqOc zqP4a4x+!jBfz6WjkRSd{K}nRuOQbcvt&yD@U~$8#VnyxV zVKOb3;d0%+&pE39#FJybRkFbXcwiiHtmdQ;x)E!y94%{SDBKK=;h}tPb0zc@r*aogI|QVwMK! z|FeP4SX@M(C~M*sxU6mp_m&?PuOy=-^RCyKRT3W}HZad8{+4&VCR!3fbV+D2kum>M zPB}drD_aFS!9`TY>D5K`!l81CYPk}<8uGNhmP`Ey#&{18@89n;jpn>y+Kj*EAw4ZXbTm3=EN$ZAgp@}b!3g*1ZYAU{e&)b88 z7=Q||q4oBJnIiwgDueei<)hn}@k+PuB9A%>s7Q7NoAY5kU`0LX(O3Dvjy#PkB3#j* zr-Uqb_bBBvEK?2v9P`ZARtzcsY<7?{Hu1w=Vfd_1vzf;BKo0xyna<$`Xp7p%AOu6W zcHMiJ=E+3@Tz=zR6vEg+I)}>@V*6I%ra+T36ZwXOYCF3rRgJ8IhY9ziV~L5!Y6VYC zb&OxbqdBKxdbNvI5cEZK_xVBA&UUbQtJ|#RGjCXZV#EkIdTqZg(7Cv}vcOy7{NS}=4g zbieJqJ!DoRTMR#1q3GU*2X}fZfP)sST#SQA$;-1m?s|Gq+YKxxX<)yWy-#N z!yC=jmJV~PX-Ody>fF<&OYA-{uF)r(Uar4ceB!My6PXpT`c%pD{AX*1H*@d)&%lNN zHxrwf-hLXBMCc3qSj+AOBvCV~{M&(hh~JXr*xQ^IQNHCZkx)~HPL&us#>TE+To+X4 zPBHR+t|;Jaw@blSc&^*Y%OtOjz8Ngn`yD1>z`V*a`vt15q=z|6XE0C`GHws1u+(X< z7KAz=W|RWpbiLm3FOs2f4G)hqo}hNP)kd`J^Plb^yNwYB*gS`iI}^X%N^@(YJ!(J+ z)ik|xod|lN;bwSj4nZgIBX2Sh-X%9HiMwbGe$^D$bM41^|PRpfBlf&OUf}aOu=d=IkFu5Ni5Bn|$q;bo zkFLaJQU}Hqh(JO?K|w?W-T)UC8R-m+WW68}5fKj$511tHm5yajx0hkw0LBU=o%$ER z%l?OTGt$`VCsXGiNyRh#vz1B{@Z@guS6De;?r&~-UfZ2+u?R3H$tKDot@d9shpT?~ z+1mEK$5K_(%K8CpiYYM(7%K`oGV;;|ZhHia=KwtgWdy|fU(m+H+Aq8H*st0?p|6{|dId}Y-b9p*xPk~wnQcXwqeyx-d7#vv zB~7vZ`b>a8^-CvM5*ia`L%LU7-pwO$dY*XtVqqnn)9vBH^t6w#xHpqr#P{Ha&mfB_ zJ4pHdFz9liCnihS?IGQCKXz$zZw4OZbs-+B|4kp3=j)|0&p@ptKt0RX?@&9gK%OT| zqq;X|cX^h4M`V;=%eDG~fuhU0Quci6w0Hi5qVQNJAYG=Q=@WVu_Kl$o)_51@L z)4U7D$b21JU~cW%-ZXVmwmKL$K}m_&2cBBz7A5qfJb{R`$qhwE=7NCx)e+x};0Sry z?82|f#i@zQlO@EloR1z!XM$^d0p>_C`9M?GscD0AfPVe4OF@_LZJbXv=maq&FyJ8M&}lHJ{P_cuLONyPOeQS*F4S_FfSW8582`#e2G%!CG}a&SYl2+O5zPh8(2i zHwD4H?{DzW5|q5BtIVaC`7=9}#2MZRL`40#?WxA$MLNQ7&vf;;!`1;yj3|;nD~QiO zUYgOg08c`S8qR;f(Yt#OjpB;-e@)@sC}_(v^L%yi>DS;9L`1qeQpC2=nyOg@c75%2 zw;-~RhGap#fI>??02k**jdchsyVc6)j$ZO{PUz5#OW7r$$Xy7l30}XL2*t|kXRQM< zx~nKPFC%zCdAQ%NpI8=$o5#GxR~659kKGa8IkhtyUL=9u?5#b%0F-K4j_g=5(Zqbr zlPX9c@s2V3H*#>-CuFvNX0XT_ReP$@d?W27)|*1S_~v-!$*lXIe6`Zy)oV$Gd49{R)R7UdbC=LtlRB zoyU^Ouo}bVdw;kVlV}PKFLRO1eNBRc+*tOxEHzJ$J5f*2Z?8Z44MrkFnJ|$MW;8ZHKKq%pugisvhz6XWsoHMx!dbv#1l~y0e_C@&ga70GD zyNmTzege&E%*PX^LZuV+Qv2&MJ%lG|RH2Q@)7>MmDl$l!&_o$ztm{O19;%8QgR)xM zb(%-rzHlv2rSEh4aqO*ji^u6=qcgA@ywk#OzueOIolZklH7F!7OF$=TWe;Z&-sOdEn1`6)|Sh>|jASSGN8-EQ%HlIi`$uJhG_78_f|;NW0) zB>wSyo%QA36aoq+3ANJO6wt%p zWW$@+X&-W=bnVO^>{qx0BZxYixoX7~{YE~m`s2kU*?g-y?Nv`f3XQ>>);EV~Y8h>i zxPiAp<0bti9c$l00F3c?xgVZiR;(1w9&}rHT_HO-6!<)Pnu}6zt8NX>VfSzL^R=v8 zW~tncYYhm|#`bP~n7$1xe79G8n^E3&-CZz)MMT?j(sES4q_ey-Z**^c<7fMzIJDLF z7}6?ee7((pbmfS}O9X6Jig4W(Tr z6aPl;)1Eu;b<|6eUNn-;_W{Q3oS9_ZZ7P}O$D3xKcjDYm)9i8A6Kbnhsj_odhy5n~ zj|zmXuMe=Gda1mw(}LaQilL|)FQ^jO-H$VRa=pG^HBq<(ngZ>gX8ICQTQ+ScN;oxIVSa%Yte-Lx-lQj(aRhbSU> zQ`7jJsdV}b>t)1Mt)(<(HIywjHR8%*LA);Ov-=X~UchKu-d*R~9)BoN^c6IEmdc?-})E6bkmp*j3n#omz6Um@kNRM+LS zx0Nwk^0GDEhE^fqE5WZWze6%PLNFk2vNi3QE#?%jCBm8tG)xw`I@;>=&5Y=w+s?AA zf<69@e$?k9+A;KvN^|S{3f)Riqaf`QcI!)l~rwmX>? zmeRMdqIe{1d^)Pc%Z{6@!j=Rt4g29@-__*hus=1~Ix0J~`+%2Ce;5V)b1Q@T z4h5dRrPp8?vT4n-{L^hZ5{PxWXdF26 z#H9cyUX(QgYD(do?<}Aw7H>DVDIVrb=;uQ#f^^Rpz27toC(gF>h%39H)-%$^TF0~* z3Q!Pxw!t%0mff7U&69m%_u+%3pVxTnMc(A+fy}+r)jg%S)C-9ch+eZB{;+^HRGX$0 zv>!f_^mf^08Z&a!s$-~B#yphS%Ltsr@c8jVGwqk8$mZoX&5753YnnciyR}Fg^E_c~ z?z@SR$%G(_Wtc$?$n%OVoYxLsln8&U-W4ThRaSZLBj|)Z+OEtvp`dV4ng!W`Z)!}& zmU{!tf$MNTa6Pl~Do457g^(%6ekzWO+YGg!|0k-_SJZ1}7K&Na1pJOwxJ;B)n$Udq z=cnq^(^G}|2>_%zbh`&0yAePg9UaUA5j;uB$ulXO=2l*rCLD8#Od5-eizXZ?%EbwN zCZGh_&CSVy1*q-!K9et^O29a6)2UdM-*LUG#(V_6!RxXlIXQXG2Jg0^vFRzmU3I9w zL7bIZ_4n`Jt9<2UWwq7SPG?N8M|aJQou8Lv zQ(9WulAS@DU*}L7uTHJSYoICS8z(43AhoJoPgOd=@KOn`h2quxj&kfT+jE{yt`h&a zf-^}o;nm!6cLH{fo5gw^b(ntRMegUdYr!^Im4$Lxj!FWJZ}WM3eOqhe?NlXE!5br6 zf}67kM@T@Nu)*7X{8k~3aSE{nc+WQ98lf z9p`2t)q+(uLD)qKAHxz`yiK`#Uyux(z8tAs+TN9#&5 zBsL<~aZ?PW!yMHZ!MzJNldK;ZkV-E|`Rg|hVhu#FK6#qQ^iEAU+=xwzT0IQI>m_oN zi}nl&s9lJC#}A+*8A+ZScptEhiXts89>}&(k=~FvD~=$x`l5HQ7Pq|I6fGs=wPqnf zkOf#mBrBiFcz@|rd+hAE$U@L|JsaUGJH&@&JuinpR|#hwhal!fnArzwh+$JBGnu!r zZ*?7!zTCY}4HKvR@1f}Sz21d=)Ui5Zb}|Fg705-MM##`y)85Kw&{yb)?2lFfW5*TY z=S=;Cj1<@APs=|4D?lE<;Rx_+c1ioKpJdG3a%4m&cL4ecu`gAUj30NR-^+uey(wgE z2S0%W$+?wNqJ!g3pB$ny>WM9V)0$srZa6fqlNZoNH6iw;N@7VrT~~k-P2X@obc*iT zDOLrbPQ8`?l2ey3Difg~)yEW|MA5oyG;p_Lm)KA>9@LQlNIlzrlKkZx-KTcg1dLmH zdRd%1{+I*nZyhuQWTx=&>e2SLmAU(SJ^({R?@j?K0Hs;C1Qh-5cxkt3?WbaI9(9ge zL0ty)jt+E;ou@aQDrh+W%Gkc|fN&2-xT*AXav=aV>r3b8<q+zb~k!1d1CJ-bR?E(` z0L593WZj_dk;=w8hFo4(6-A91mqxgK^y3emHrBICr}!xWKxK3nHTCt@HSuXx=?q18 zSO^5|J1li(`Ih?a3+xUOJ+sQt1N{ zhNHwz`uUCO?>~A_%P|8($1qmrJ`R)sl+t>c%Ukqa^X2Co-WYrJKWh$US7jggV4o#+ z&6gj3wPn@xUfu^+ueoNa%gSygE*&3h4Ztw4PYbn`u>ph#gwQe=MtuCAEU|#eFYGHHOY(3PK3W0-!8M8h92Qe+sRb_!a76P}g_EAMs{2KGFGKN2Yes z#v7?-z?`0$gF*&?Tg&Je?&i6hIVin-^QQckI0#0!Z3bjtz9bg&ANc%?{(%4jjVrgG zE(UPv*PNb@2R+Ef8u`kyj-Ei@R%@1SDg}VTQY&OvlB%=5dM}ti+yM0L6}xxEstXnX z=_zSu|9hbq)nl`l^$bv9^nksq-n(D{V9vf(=92pm@)*K8`{P_LfRc+@mf=yV+gC&j zQq`$bfU5Xh(}igg-EJ7GK{Zr+esNDf8Tz!`xM+PY0F;^;_|-OiiZ3-H-k1ipt1X&a z$HBv!AtUQV9^lb^^ypSHfK6+-vFd!|fT?nZm#c~jE80d4m@3!Yuqfob+`F#H=@!#} zxCbv*hmJ$X4GK`zs1Bwslb#&eK?|@2zXbV&Ds-$ideoRs%~?xUPRhj_OtqnTkJ>!D zV1}Oztrc(XIBy1^jF|NN^bSDxtqVTP0)WaYz7hO8$F#+XJOBmhcZ67Vjg-Xfd{(IX zT{QQMF%hQXOIsU8KIWcazGGjU9b?i0$aa{xNZPu-x}9U5T{Ok7S`#lnA0Qo2>a|VX z+hWS+->jH4^u3JR3WE|ZMrhOk;9?XFta3BV98L!I8u#vJbuE6D&CbqtyFjRZ2xjs zQBje%x3?e&#l^*zvZ7OG&nG4(%H@ixs;bJ$N~_Hp6w*^7mHeKa@%{&EBO)Tg!o$Gx zgw!*oyj-BF;^l1v4cXxG)yt4Cp)RGNzLN$a? zs69gsIFwmnZ{?>1l-g$EPF(d3MFyiu^tRLj$9X>y2YSc86ab|}?cd}5_^xFIg=rTL zuKRjZO7C_(J?rUs#Lj@{!LndE@H}tl7@pWT!U>e&3G4zV@HYz6Se^~?2((+7`@|zP z#HgS2%>zw9StV<$vZGmmD6>%4Fjx0K(bs0!+1zMOin14xHnQ1@|x~lo0CRKsXlYu=m$>AvNBj*HQqL zOk`47S_*j4+bLh7!?qLa+PeYyLH{{%SY*Z6SVGkR7{(09eOdwTt5cWstO@%)FA+}x zfOCi^6UE|~`vu6jbAP==0f6OdF`-24ON3(polHs^aZOpXR(G4SW6Yb0a{@N> zeImB(owG~&>i(R)B9Tb`miuM}#zrAE89?T_WLN;8ML-J^?+4_7$x8mIP>gLvwhIB6 zI|U9;Meear79FeoD(4>@{7{95hzoU+J{ktacE1b&L(Xa3Tjl zPI^9^mW@Zx&Z4a#Gu^u(`;K?8PgA#8S0KIV!ZaysY8up)jF&J?doyhbJemisI{W$0gY8Rt*?2QJCaKQSaOmQ za*`4Ns7w*D!-kLW(>72YIEJZ}WUq>uI5A5ULDwtmq*=7G?9c#64a zUO_=Pe-S{tj-vm@y}1Xn90E6jztS%<9EWcJY++_rj>ZB&Wi-HSVTyBdGHtg-M_p8~ z8}b`NKBoG)j~YKiw6W?>+==PvSJUmKHUfaEg;$f)w4$P;rhN9zfBxNlTnMXx84L@R z(rIJewcy7x3|qe@qIKB)iCNC$xpU{byStzN_1BtalTxXysHkvSU01GL2@1M5McKJ? zr}JhnFRxj%W&xwjQA(-v zzc_N$7)%JIiYlwMytLSAXUodUOuqgql`1nM-Ob(O({*b#TFuCjV-k-gR#sZ1GRZT~ z%u%V7WhLcpq9a$XSp50sug+gM@8RLO?vr&kyLH5fkrVzka^ zoAb<5*E4btBz$Kux_rBD?}6{W;|0Pn_PF80hYapztE#MbWVuwRQmNG)Tk4H!nM?|) z1X3x=Y`m|BF0Mzb^J#bYr&NsSps(2nPp^L^{t|{hJ5*P4Gc!+s$}Pyx)X#wUkM@Ty z8K%lUwxiispp+5L zwR1LxV;P=htoB+=SX;TZ*lI;pWqFag!c}izvyaVsYv0&~AB<>zXWO=GT}O0prm~*- zazg=HL^s#zZhNEf$eGNJeOhU*{F(}cgnG+sFubRQZ^r??q74HvBuOY#u-whQbw^!Q zawT#1cNR?S=>MRvByF6y4#0|4A9w54ZFl$To)9`>w_Gd5wy+E$8e;Cw;R-3qp3?zK~3Al0m?X4Mo=Sw2GJ&h+{-OzdK_-?-TyXkv2Cl6RSHz4o3uH#oP*?nwm zuxW5dy#2wh*yWESBYE|^=l$lB`URjAVBiqAcD;ni<+}9s2hTt5~ye4_%5fR*Q%KT?NYQ*U~>yc#f#T2&*D zvN}|zkvsENl-};nrj%8e;vhV%JYn6se3&?U!pB=u} zGYzm<>V1Bz-EJ<%y68Lv{-#LLk88PcA_)LY9UqS^Ie758`SS6fI12!n+O{*5AVcL~aRgRbo$x zq|0-Q8V$^eUZo$79C4lr4h~+iV#T#<*TkQ8yM5}^seAV9QLELzXJ=2FK0P}-Tdh`$ z5k`x}vUBIo)YQ~EQOLL6daGy8p7Z9-v(#v_B}Retr9N_4V^_(>mzLk))E+ z5+V?tULO?|)xK@0T&{ll$%%S{{?@HqAtAxBv9Xa6E#*r63v*_DfA}~B?c29+*Dmcm z+&zLq!#zAaE?vB6XY2r)HEY(ROZ(;l%_*S*&)>hBmzALwyIil6Dx?yHOd^wlQt$%R zD5MNW1PXT-_2s+f;&Q9IQSHoODlP(Po`;XI&hRY9v346rPiBGp~%!^M)XbJjFnvk|)%UcV!0Dx}7f<-MP zHTm7s;+}XiHMEovLa7?~dDWty0l*M4;l<}33sg0{lvNM}i9|vLI<3tU)n5gWa2!K; zj&LmDS&2jrN_c@I_slFETpXBIyNq;Fse17I?HTi@kL@2107G9m{6rK%ZVNG5N{B=% z19Va;A*7mvI^@kgt5%I&@VH||Z_kg0DJZ2l@zI16A32!Jic!m2EE@XJg7G5&bc_Yy zrjyG1zr5#7)yKFcO1jnEJ;sN_;$cL={wvX0RFQTUldE?{(o641t|9dI$0HAE%E&x9`bKg~A zK3V|2fht^fj#EBu1GNCOCLd4SEJlreN(F0CK^X%;=jQXkD%c0$rO^Y$08)OvJ~Xt0 z_$=h6J4A7H(*cedHhcYQF*=K@ZtfO3!c~F({w6$}JW9U~?Nx^_Fkr7A-e2t}YvU zU(XQ-*wkzJU3)ceYWJ&A-R+Ahjxb-}8B+(e(aMAqAHSNI|G=Vry@yT3AHk8~NIeIb zb8iBGZ)ixX0u!#AOK&;?evvWFn}qybr`=zVL)Q=x6Ubh>oX-Hv{+&nLIJbV4x%VG9 zz-|bA*xfM(&Rf>1OP>#)8#lI+wsC`*!!M;cW06e$@~Cf{cJ&sixo1^oW+s3hJ$g9L z%%4ABtyb^ZvuEkjrJ}KQ_Uu_dKR@wm>(;GHOH1S97(J|M*4XWgAe28bZ5*Xk zB9XEjXD%-_8eLv|eiqN!rE&!Yc&5tB({t+7aRSFuN@WU#1P}zlX0<33@+p(Y3M?y; zOC*pIL9kiN!oovB!-55#mnjsK3OvVB!gTH2woB(|f#W1niBu-1ga{ljZoE{FX>#L- zNR3OmIXp)a?Bk{}Xyj#;?5`Q6*#+h*D^G}E;hZ)Hr!zBd>AJYOj3~UL z7i?KuS#E*WpjS#kDOCh4*s=})1)lt9-Bi}bvVv0UxLC7v%TdcdaloaH`)HjAox-=< zwk_QNVEhZ)#uBU53Z-7FeBj=%)Mf|Aqhm)10(c&Ff#uqNg=Oq%!#5Pl$dy@j-c$Nsf#?_bb9M9T7?-D_9 zvI-it;=-tVtTjP#7gFK?N);`i`|PJ_7Bdf}n?VauiWZAfPKshE1BP5k86p;QazH@0 zSGIifuOO?9*J{Kj@fh>w$sw;)3M#EZDW-Z;p4AVYyCQBL zAlzBgut14;o{lD<3`Ffs;5x5Zl?tX(5mb-`baRYTf6nDQ=P z%JPW}G(6-S;r6Lr`^CJd;33aV8!)1EJMYa44`w=EU4QWTsg}XT%R?(;a?kB=z{YBn z8ttow;7E6zt4=X9w(>E0s{Da;X9ienKUI^EzuS-)(L*N=b^kSO#cmcreqzFf*a_{u z0Awfb+JB~0$(*uzEFKi}5H76%KTlcD0Z;5Xy<_&j@(OR4Fu3g-@#L4=8`zRmsZ{ps z*AGCqZrz5*4F}M>ckdlLcD(b>I{+Sk{PBeg7rMB(#Kpy}UAy+gi4!?FIW8_P(b3UQ zKlPO89-B35mZzuZ(xpoQOqw)l&YU^o?xtB;Sx-OxbWToAbaeD9FTX6_ykWzJ5hF&# z$H%9prUHnLjvhO9?5I(rq*7@Utt*l0eI;`oE0Ib72_-DYaRBT#n_MoJNM$_7iS7h( zKowU+@+?D$u9+vxhk`!!z!_HM8Wc%Shjl<_k6ah z29LlIU7FwTZD_zVA^>pfJig11JAN((kagm#4^P~?>fU8Sj9V>Nhb1#<`zQBybwKc_ zP9~Ym^f2;>_DZKt$`d)&j6Gx9RqwFXs4(ye2|(6O0LVQZzxH$^s5XKXpVkOCb?w7O z#cNQzdggYH{X#G7TYusE?u%Y)(}+B^TQjI#17xaJCP2(-Gemc2)->d^8x(_M zs$l3mvCEI!e->5S)hY7%R!V?l!I;@PyFWCInm2Q4-mF{fm0K@HwtyNR{c^3*BHw@i zeVsFtCr_R{d2$_V?3GtudF7Q?>g6zI%$PA_#?(3K>+5?zX8=Qn3>h+H$iu!s>sT|6 z&!OCxXKS-JBUyWcOv*T0VG{__;V{e6lyxuZcD(Vr{KWJ>Zm^Bt?XxT>nmW;0u@ zW~o1b7-}`Wi(x>~s zpC0Xhztt;O=|%UC^8U|Y>BSF)MvQ!QiedYXV^?cl3m-UhQvbSXye1D-L3J9Cdvx5) zNj+o_E006js9rw19fNCd&(Incd1Jz;dd{3*`oVkWsyEv7@6ubFk#wWvLHSh;%T^ya z%39#mp(bJVVD0J-)g2!*UEE#3IO-J|Z!G5x03b8Y#~e*Pp20CK)Rk@fuG zAg9nZOFb-obmi7R>>cV%es>%Ilu(KEe|3~VB9kk8!{HmQ0`z!9ef0N^oT+590)aek--}ir1KSwRN#tsvwig z+dC@;t_tzrPEbnYgTo9s__Eo*T>8No( z7#JwmXfz%k9*Y(&TCrlqKYS8k@bdc$ze}fe^AB=saH!-Mz~E^z{5g4wuO%iVrDWX{ z{UxDY!i*0ujLg;3^k2tHC_1qtK3Q~|8N@{ijf>YL?P}|yHT+3aM&@d2?)sN@Ev=_X z`@gfVHrh)c(VzDWRi|W$Z(CnK|Gd20CFRyf$ULG)^bdQ|U5q+U&t?_XUx{d#-g@gT zFE1~RMkD$9>#qetsI06kE-p5k&CYB)r#U7Fg7a9Mw25c#CseOwb|x$Q1v&bU=n*}l zNA!pu(Ia|9|4kFB=7G~SbwAZ~UpXCG&SR-mD*iMYjh>#Kdc9sIll{K|05%@5z?7u2 QTmS$707*qoM6N<$f}e0cT>t<8 literal 0 HcmV?d00001 diff --git a/files/scrsht02-s.png b/files/scrsht02-s.png new file mode 100644 index 0000000000000000000000000000000000000000..30aef3a00e29bde55bbc18fae2f35ad51bdaf123 GIT binary patch literal 43405 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 E0B@;C`v3p{ literal 0 HcmV?d00001 diff --git a/files/scrsht02.png b/files/scrsht02.png new file mode 100644 index 0000000000000000000000000000000000000000..3dbac385b2a4db6f8d3a4fe3dfe7e77306c733c0 GIT binary patch literal 102973 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

+$strong = $el->create('strong', 'Nette'); +// or $el->create('strong')->setText('Nette') + +// inserts an Html object into
+$el->add( Html::el('br') ); // $el[] = Html::el('br'); + +echo $el; //
Nette
+ +// inserts a string into
+$el->add('Yes!'); // unlike setHtml() this does not remove the current content of $el + +$el->insert(0, Html::el('span')); // prepends new Html node to first position +\-- + +Method `removeChildren()` removes all child nodes. + +Child nodes can be access as though it was an array, including iteration: + +/--php +echo $el[2]; //
+ +foreach ($el as $child) { ... } + +echo count($el); // 4 - amount of child nodes +\-- + + +Generating HTML output +---------------------- + +The easiest way to print an HTML element is either using `echo` function or type-cast it string. Opening and closing tags may be printed separately: + +/--php +$el = Html::el('div class=header'); + +echo $el; //
+$s = (string) $el; // inserts
into $s +echo $el->startTag(); //
+echo $el->endTag(); //
+\-- + +Output format is set by static property `Html::$xhtml`. Defaults to `TRUE`, ie. XHTML valid output: + +/--php +$el = Html::el('input')->disabled(TRUE); +echo $el; // +Html::$xhtml = FALSE; +echo $el; // +\-- + + +{{toc: title}} From 14dd38166036ffc09c04e3a26b40715a50ad0348 Mon Sep 17 00:00:00 2001 From: Mikulas Dite Date: Fri, 12 Aug 2011 12:43:00 +0200 Subject: [PATCH 0122/1741] =?UTF-8?q?cs/routing:=20basket=20nen=C3=AD=20do?= =?UTF-8?q?br=C3=BD=20p=C5=99=C3=ADklad=20anglick=C3=A9ho=20slova,=20zam?= =?UTF-8?q?=C4=9Bn=C4=9Bn=20za=20cart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/routing.texy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cs/routing.texy b/cs/routing.texy index 7c89bd7743..0b32d9f786 100644 --- a/cs/routing.texy +++ b/cs/routing.texy @@ -259,7 +259,7 @@ $route = new Route('//', array( ); \-- -bude generovat anglické URL, jako třeba `/product/123`, `/basket nebo `/catalog/view` apod. Pokud chceme mít presentery a akce v URL reprezentované českými slovy (např. `/produkt/123` nebo `/kosik`), můžeme využít překladového slovníku. Definice v poli rozšíříme: +bude generovat anglické URL, jako třeba `/product/123`, `/cart` nebo `/catalog/view` apod. Pokud chceme mít presentery a akce v URL reprezentované českými slovy (např. `/produkt/123` nebo `/kosik`), můžeme využít překladového slovníku. Definice v poli rozšíříme: /--php $route = new Route('//', array( @@ -268,7 +268,7 @@ $route = new Route('//', array( Route::FILTER_TABLE => array( // řetězec v URL => presenter 'produkt' => 'Product', - 'kosik' => 'Basket', + 'kosik' => 'Cart', 'katalog' => 'Catalog', ), ), From e080dd1280dea0e89c57b8897ebf4131bfa2a29a Mon Sep 17 00:00:00 2001 From: smasty Date: Fri, 12 Aug 2011 12:52:42 +0200 Subject: [PATCH 0123/1741] en/mailing: created --- en/mailing.texy | 119 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 en/mailing.texy diff --git a/en/mailing.texy b/en/mailing.texy new file mode 100644 index 0000000000..7d20f4fbec --- /dev/null +++ b/en/mailing.texy @@ -0,0 +1,119 @@ +Sending E-mails +***************** + +.[perex] +Almost every web application needs to send e-mails, whether newsletters or forgotten passwords. That's why Nette Framework provides necessary tools. + +Example of sending an e-mail using [api:Nette\Mail\Message] class: + +/--php +use Nette\Mail\Message; + +$mail = new Message; +$mail->setFrom('John ') + ->addTo('peter@example.com') + ->addTo('jack@example.com') + ->setSubject('Order Confirmation') + ->setBody("Hello, Your order has been accepted.") + ->send(); +\-- + +.[note] +All parameters must be encoded in UTF-8. + +In addition to specifying recipient with `addTo()`, it's possible to specify recipient of copy with `addCc()` and recipient of blind copy: `addBcc()`. +In all these methods, including `setFrom()`, we can specifiy adressee in three ways: + +/--php +$mail->setFrom('john.doe@example.com'); +$mail->setFrom('john.doe@example.com', 'John Doe'); +$mail->setFrom('John Doe '); +\-- + +HTML content can be defined using `setHtmlBody()` method: + +/--php +$mail->setHTMLBody('Sample HTML '); +\-- + +Embedded images can be inserted using `$mail->addEmbeddedFile('background.gif')`, but it is not necessary. +Why? Because Nette Framework finds and inserts all files referenced in the HTML code automatically. +This behavior can be supressed by adding `FALSE` as a second parameter of the `setHtmlBody()` method. + +If a HTML e-mail has no plain-text alternative, it will be automatically generated. And if it has no subject set, it will be taken from the `` element. + +Of course, it's possible to add attachments to the e-mail: + +/--php +$mail->addAttachment('example.zip'); +\-- + +Can e-mail sending be even easier? + + +Templates +------- + +The real power comes in combination with [Latte templating system | templating]: + +/--php +$template = new Nette\Templating\FileTemplate('email.latte'); +$template->registerFilter(new Nette\Latte\Engine); + +$mail = new Message; +$mail->setFrom('John <john@example.com>') + ->addTo('jack@example.com') + ->setHtmlBody($template) + ->send(); +\-- + +A local variable `$mail` containing the `Message` object will be available in the template, so it's possible to set message parameters directly in the template. + +File `email.latte`: + +/--html +{var $mail->from = "John <john@example.com>" } +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>Order Confirmation + + + +

Hello,

+ +

Your order has been accepted.

+ + +\-- + +If you are sending e-mail in a Component or Presenter, you can create the template with `$template = $this->createTemplate();` and you will be able to also generate links +in the template. Always make them absolute, via `{link //Presenter:action}` .[tip] + + + +Custom mailer +-------------- + +Default mailer((class responsible for e-mail sending)) uses PHP function [php:mail]. If you need to send mail through a SMTP server, you can use `SmtpMailer`. + +/--php +$mailer = new Nette\Mail\SmtpMailer(array( + 'host' => 'smtp.gmail.com', + 'username' => 'john@gmail.com', + 'password' => '*****', + 'secure' => 'ssl', +)); +$mailer->send($mail); +\-- + +You can also create your own mailer - it's a class implementing [api:Nette\Mail\IMailer] interface. + + +{{toc: title}} + +{{themeicon: message.png}} From 8de943e986bb1a5f130b2b73296ee41da5bed8e4 Mon Sep 17 00:00:00 2001 From: MartyIX Date: Fri, 12 Aug 2011 13:40:41 +0200 Subject: [PATCH 0124/1741] en/mailing: Typo --- en/mailing.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/mailing.texy b/en/mailing.texy index 7d20f4fbec..1b78b61a18 100644 --- a/en/mailing.texy +++ b/en/mailing.texy @@ -22,7 +22,7 @@ $mail->setFrom('John ') All parameters must be encoded in UTF-8. In addition to specifying recipient with `addTo()`, it's possible to specify recipient of copy with `addCc()` and recipient of blind copy: `addBcc()`. -In all these methods, including `setFrom()`, we can specifiy adressee in three ways: +In all these methods, including `setFrom()`, we can specifiy addressee in three ways: /--php $mail->setFrom('john.doe@example.com'); From 2d84e9b936e558620cf46747e22bf6ef718db944 Mon Sep 17 00:00:00 2001 From: Mikulas Dite Date: Fri, 12 Aug 2011 13:49:45 +0200 Subject: [PATCH 0125/1741] en/routing: created --- en/routing.texy | 393 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 393 insertions(+) create mode 100644 en/routing.texy diff --git a/en/routing.texy b/en/routing.texy new file mode 100644 index 0000000000..f07c947d84 --- /dev/null +++ b/en/routing.texy @@ -0,0 +1,393 @@ +URL Routing +*********** + +/--div .[perex] +Routing is a two-way conversion between URL and presenters' actions. *Two-way* means that we can both determine what presenter URL links to, but also vice versa: generating URL for given action. This article contains: + +- how to define routes and create links +- a few notes about SEO redirection +- how are routes debugged +- how to create your own router +\-- + +Thanks to bidirectional routing you don't have to hardcode URLs into templates, but simply link to [presenters' actions|presenters#toc-handling-presenter-actions] and framework generates the url: + +/--html +product detail +\-- + +Learn more about [creating links |presenters#toc-creating-links]. + +Routing is a separate application layer. You may even create URLs the tiem a whole application is complete. It's also simple to change routes anytime, while keeping preserving original addresses and automatically redirecting to new variants. So hey, who's got that? :-) + + +SimpleRouter +============ + +Desired URL format is set by so called *router*, which is usually defined in [bootstrap.php |presenters#index-php-bootstrap-php] file. The most plain implementation of router is [SimpleRouter | api:Nette\Application\Routers\SimpleRouter]. It is to be used when there's no need for a specific url format, or our server does not support `mod_rewrite`. + +Addresses look like this: + +/-- +http://example.com/index.php?presenter=product&action=detail&id=123 +\-- + +The first argument of SimpleRouter constructor is a default presenter action, ie. action to be executed if we open for example `http://example.com/` without additional params. The declaration itself in a `bootstrap.php` file might might look as follows: (`$container` is a [system DI container |configuring]) + +/--php +use Nette\Application\Routers\SimpleRouter; + +// defaults to presenter Homepage and action default +$container->router = new SimpleRouter('Homepage:default'); +\-- + + +Route: for prettier URLs +======================== + +More human URLs (though also more cool, prettier and user-friendly) are easier to remember and do help SEO (search engine optimalization). Nette Framework keeps current trends in mind and fully meets developers' desires. + +.[note] +Apache mode `mod_rewrite` is required and all request must be handled by `index.php` file, so the routes definition stays in one place. See [how to enable mod_rewrite |troubleshooting#how-to-enable-mod-rewrite]. + +Class [Route | api:Nette\Application\Routers\Route] can create addresses in pretty much any format one can though of. Let's start with an example generating a pretty URL for action `Product:default` with `id = 123`: + +/-- +http://example.com/product/detail/123 +\-- + +The following snippet creates a `Route` object, passing path mask as a first argument and specifying default action as an array or a string with second argument. + +/--php +// action defaults to presenter Homepage and action default +$route = new Route('/[/]', 'Homepage:default'); +\-- + +This route is usable by for all presenters and actions. Accepts a path such as `/article/edit/10`, as well as `/catalog/list`, because the `id` part is wrapped in square brackets, which marks it optional. + +Because other parameters (`presenter` and `action`) do have default value (`Homepage` and `default), they are optional too. If their value is same as the default one, they are skipped while URL is generated. Link to `Product:default` generates only `http://example.com/product` and `Homepage:default` links to `http://example.com/`. + +Mask can not only describe relative path to web root, but can as well tak absolute path (as long as it beging with a slash) or even absolute URL (if starts with double-slash): + +/--php +$route = new Route('//.example.com//', '...'); +\-- + +Mask can contain traditional get arguments (query after a question mark). Neither regular expressions nor more complex structures are supported in this part of URL, but be can set what key belongs to which variable: + +/-- php +$route = new Route('/ ? id= & cat=', + 'Homepage:default'); +\-- + + +Route collection +---------------- + +Because we usually define more than one route, we wrap them into a [RouteList | api:Nette\Application\Routers\RouteList]. The following code snippet shows an [bootstrap.php |presenters#index-php-bootstrap-php] example: (`$container` is a [system DI container |configuring]) + +/--php +use Nette\Application\Routers\RouteList, + Nette\Application\Routers\Route; + +$router = new RouteList; +$router[] = new Route('article/', 'Article:view'); +$router[] = new Route('rss.xml', 'Feed:rss'); +$router[] = new Route('/[/]', 'Homepage:default'); + +$container->addService('router', $router); +// or shorter: $container->router = $router; +\-- + +.[note] +Unlike other frameworks, Nette does not require routes to be named. + +It's importnat in which order routes are defined as they are tried from top to bottom. The rule of thumb here is that routes are declared from the most specific at the top to the most vague at the bottom. Keep in mind that huge amount of routes can negatively effect application speed, mostly when generating links. It's worth it to keep routes as simple as possible. + +.[note] +If no route is found, an [BadRequestException | api:Nette\Application\BadRequestException] is thrown, which is shown as 404 Not Found to the user. + +Default values +-------------- + +Each parameter may have defined default value in the mask: + +/--php +$route = new Route('//'); +\-- + +Or utilizing an array: + +/--php +$route = new Route('//', array( + 'presenter' => 'Homepage', + 'action' => 'default', + 'id' => NULL, +)); +\-- + + +Validation expressions +---------------------- + +Regular expression conditions may be set for route parameters. For example let's set `id` to be only numerical, using `[0-9]+` regex: + +/--php +$route = new Route('/[/]', + 'Homepage:default'); +\-- + +.[note] +Default validation expression is `[^/]+`, that is all characters but a slash. If parameter is supposed to match those as well, we can set condition to `.+`. + + +Optional sequences +------------------ + +Square brackets denote optional parts of mask. Any part of mask may be set optional, even with parameters: + +/--php +$route = new Route('[/]', 'Article:view'); + +// Accepts: +// /en/download => lang => en, name => download +// /download => lang => NULL, name => download +\-- + +Obviously, if parameter is inside an optional sequence, it's optional too and defaults to `NULL`. Sequence should define it's surroundings, in this case a slash which must follow an parameter, if set. +The technique may be used with optional language subdomains: + +/--php +$route = new Route('//[.]example.com//', + 'Homepage:default'); +\-- + +Sequences may be freely nested and combined: + +/--php +$route = new Route('[[-]/][/page-]', + 'Homepage:default'); + +// Accepts: +// /cs/hello +// /en-us/hello +// /hello +// /hello/page-12 +\-- + + +URL generator tries to keep the URL as short as possible (while unique), so what can be omitted is not used. That's why `index[.html]` route generates `/index`. This behavior can be inverted by writing an exclamation mark after the leftmost square bracket that denotes the respective optional sequence: + +/--php +// accepts both /hello and /hello.html, generates /hello +$route = new Route('[.html]'); + +// accepts both /hello and /hello.html, generates /hello.html +$route = new Route('[!.html]'); +\-- + + +Optional parameters (ie. parameters having default value) without square brackets do behave as if wrapped like this: + +/--php +$route = new Route('//'); + +// equals to: +$route = new Route('[/[/[]]]'); +\-- + +If we would like to change how the rightmost slashes are generated, that is instead of `/homepage/` get a `/homepage`, we can adjust the route: + +/--php +$route = new Route('[[/[/]]]'); +\-- + + +Foo parameters +------------- + +Foo parameters are similar to optional sequences, but they are used to match a regular expression. The following route matches `/index`, `/index.html`, `/index.htm` and `/index.php`: + +/--php +$route = new Route('index', 'Homepage:default'); +\-- + +It's also possible to explicitly define a string to be used while an address is generated (similar to setting default value to real parameters). + + +ONE_WAY flag +------------ + +One way routes are usually used to preserve old URLs functionality, when an application is rewritten. Flag `ONE_WAY` marks routes, which are not used for url generation. + +/--php +// old URL /product-info?id=123 +$router[] = new Route('product-info', 'Product:detail', Route::ONE_WAY); +// new URL /product/123 +$router[] = new Route('produkt/', 'Product:detail'); +\-- + +Additionally the user is redirected to new URL, so search engines won't index your pages twice (see [#SEO a kanonizace]). + + + +HTTPS +----- + +Routes can be forced to secured HTTP by `SECURED` flag. That's useful for authentication pages, as well as administration etc. HTTPS must be supported by your hosting/server. + +/--php +$route = new Route('admin//', + 'Admin:default', Route::SECURED); +\-- + + + +Transformation and Translation +------------------------------ + +It's a good practice to write source code in english, but what if you need your application to run in a different environment? Simple routes such as: + +/--php +$route = new Route('//', array( + 'presenter' => 'Homepage', + 'action' => 'default', + 'id' => NULL, +); +\-- + +will generate English URLs, `/product/123`, `/cart`, or `/catalog/view` etc. If we would like to translate those URLs, we can use a *dictionary*. We'd extend the route so: + +/--php +$route = new Route('//', array( + 'presenter' => array( + Route::VALUE => 'Homepage', + Route::FILTER_TABLE => array( + // translated string in URL => presenter + 'produkt' => 'Product', + 'kosik' => 'Cart', + 'katalog' => 'Catalog', + ), + ), + 'action' => 'default', + 'id' => NULL, +); +\-- + + +.[tip] +Multiple keys may link to same presenter. That's how aliases are created. The last value is the canonical one (used for link generation). + +Dictionaries may be applied to any parameter. Although it does not work as a filter, if a translation is not found, default value is used. + +Besides setting dictionaries as arrays, it's possible to set a callback or a filter: + +/--php +$route = new Route('//', array( + 'presenter' => array( + Route::VALUE => 'Homepage', + Route::FILTER_IN => 'filterInFunc', + Route::FILTER_OUT => 'filterOutFunc', + ), + 'action' => 'default', + 'id' => NULL, +); +\-- + +Where `filterInFunc` and `filterOutFunc` are functions or methods that converts values between URL and what presenter gets. Each handles one direction. + +Implicit *in-filter* is function [rawurldecode | php:rawurldecode] and *out-filter* is function [rawurlencode | php:rawurlencode], which escapes special characters (slashes, spaces, ...) for use in the URL. + +In certain situations this behavior may be changed, for example let us have a parameter `path`, that can also contain slashes, so they're not converted to `%2F`: + +/--php +// accepts http://files.example.com/path/to/my/file + +$route = new Route('//files.example.com/', array( + 'presenter' => 'File', + 'action' => 'default', + 'path' => array( + Route::VALUE => NULL, + Route::FILTER_IN => NULL, + Route::FILTER_OUT => NULL, + ), +)); +\-- + + + +Routing Debugger +================ + +We should keep it no secret that routes may seem to be magical for a while. But you will always appreciate value of Routing Debugger. It's a [Debugger bar | debugging] panel, which gives you a list of all parameters a router got and a list of all defined routers. It's turn on automatically, as long as the application runs in debug mode. It also shows on which presenter and action you are currently on. + +[* routing-debugger.png *] + + + +SEO and canonization +==================== + +Framework increases SEO (search engine optimalization) as it prevents multiple URLs to link to different content (without a proper redirect). If more than one addresses link to same target (`/index` and `/index.html`), framework choses the first (makes it canonical) and redirect other to it with HTTP code 301. Thanks to that your page won't have duplicities on search engines and their rank won't be split. + +This whole process is the so called canonication. Default (canonical) url is the one router generaets, that is first route in collection without `ONE_WAY` flag. + +Canonization is done by [Presenter | api:Nette\Application\UI\Presenter] and it's switched on by default. You may disable it by setting `$presenter->autoCanonicalize = FALSE`. + +.[note] +Ajax and POST requests are not redirected as user would suffer either a data loss, or it would yell no additional SEO value. + + +Modularity +========== + +If we want to add separate modules into our application that have their own routes, for example a discussion forum, we may define routes elsewhere, possibly in `createRoutes()` method: + +/--php +class Forum +{ + static function createRoutes($router, $prefix) + { + $router[] = new Route($prefix . 'index.php', 'Forum:Homepage:default'); + $router[] = new Route($prefix . 'admin.php', 'Forum:Admin:default'); + ... + } +} +\-- + +"Routing-in" the forum into existing application can be as easy as calling this method: (`bootstrap.php`) + +/--php +$container->addService('router', function() { + $router = new RouteList; + // our routes + ... + + // adding forum module + Forum::createRoutes($router, '//forum.example.com/'); + return $router; +}); +\-- + + +Custom router +============= + +If these offered routes do not fit your needs, you may create your own router and add it to your *router collection*. Router is nothing more but an implementation of [IRouter | api:Nette\Application\IRouter] with it's two methods: + +/-- php +class MyRouter implements Nette\Application\IRouter +{ + function match(Nette\Http\IRequest $httpRequest){ } + + function constructUrl(Nette\Application\PresenterRequest $appRequest, Nette\Http\Url $refUrl) { } +} +\-- + +Method `match` does process current [$httpRequest | api:Nette\Http\Request] (which offers more than just the URL) into internal [Nette\Application\Request | api:Nette\Application\Request] which contains presenter name and it's parameters. If original request could not be processed, return NULL. + +Method `constructUrl` generates absolute URL from internal request, possibly utilizing information from `$refUrl` argument. + +Possibilities of custom routers are unlimited, for example it's possible to implement a router based on database records. + +{{themeicon: icon-map.png}} From 6ba92cec277e4b8f61af55a4c07b5613c938def6 Mon Sep 17 00:00:00 2001 From: smasty Date: Fri, 12 Aug 2011 16:32:24 +0200 Subject: [PATCH 0126/1741] en/auto-loading: created --- en/auto-loading.texy | 77 ++++++++++++++++++++++++++++++++++++++++++ en/localization.texy | 79 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 en/auto-loading.texy create mode 100644 en/localization.texy diff --git a/en/auto-loading.texy b/en/auto-loading.texy new file mode 100644 index 0000000000..9c53402895 --- /dev/null +++ b/en/auto-loading.texy @@ -0,0 +1,77 @@ +Class Auto-loading +****************** + +/--div .[perex] +When working with Nette Framework, forget about including every single file using `require` or `include`. +Nette cares about your comfort and does it itself. + +- get rid of all `require` +- only necessary scripts are loaded +- requires no strict file naming conventions +- allows more classes in single file +\-- + + +We can load Nette Framework with a single command: `require 'Nette/loader.php'` (the path may be different of course) +and all of its classes will be loaded automatically when you use them for the first time. +That not only saves you a lot of writing, but it also accelerates entire application. +Why? Simply because only those files that are actually needed are loaded. No unnecessary files get parsed by PHP. + + +Nette\Loaders\RobotLoader +------------------------- + +[api:Nette\Loaders\RobotLoader] is a tool that gives you comfort of automated class loading for your entire application including third-party libraries. +So we can forget about those famous code blocks: + +/--php +require_once 'Zend/Pdf/Page.php'; +require_once 'Zend/Pdf/Style.php'; +require_once 'Zend/Pdf/Color/GrayScale.php'; +require_once 'Zend/Pdf/Color/Cmyk.php'; +... +\--code + + +Like the Google robot crawls and indexes websites, RobotLoader crawls all PHP scripts and records what classes and interfaces were found in them. +These records are then saved in cache and used during all subsequent requests. You just need to specifiy what directories to index and where to save the cache: + +/--php +$loader = new Nette\Loaders\RobotLoader; +// Add directories for RobotLoader to index +$loader->addDirectory('app'); +$loader->addDirectory('libs'); +// And set caching to the 'temp' directory on the disc +$loader->setCacheStorage(new Nette\Caching\Storages\FileStorage('temp')); +$loader->register(); // Run the RobotLoader +\-- + +And that's all. From now on, you don't need to use `require`. Great, isn't it? + +.[note] +When RobotLoader encounters duplicate class name during indexing, it throws an exception and informs you about it. + +Inside sandbox, where the paths to application and library files are defined in `APP_DIR` and `LIBS_DIR` constants +and the path to temporary directory in `TEMP_DIR`, it's possible to simplify the code added to `bootstrap.php`: + +/--php +Nette\Environment::getRobotLoader()->register(); +\-- + +The variable `$loader->autoBuild` determines whether RobotLoader should reindex the scripts if asked for nonexistent class. +This feature is disabled by default on production server. + +.[note] +Therefore, it's necessary to delete the cache when uploading a new version of your application. + +If you want RobotLoader to skip some directory, create a file there called `netterobots.txt`: + +/-- +Disallow: /Zend +\-- + +From this point on, the Zend directory will not be indexed. + +RobotLoader is extremely comfortable and addictive! + +{{themeicon: icon-search.png}} diff --git a/en/localization.texy b/en/localization.texy new file mode 100644 index 0000000000..4c11e1b649 --- /dev/null +++ b/en/localization.texy @@ -0,0 +1,79 @@ +Localization +************ + +.[perex] +Localization means adapting software for different languages, regional differences and technical requirements of the target market. + + +When creating multilingual application, you will probably need to render the same page or form in various languages. +Nette Framework offers an interface for translation. Just create so-called //translator//, which is an object implementing [api:Nette\Localization\ITranslator] interface. +The interface has only one method - `translate()`. + +/--php +class MyTranslator implements Nette\Localization\ITranslator +{ + /** + * Translates the given string. + * @param string message + * @param int plural count + * @return string + */ + public function translate($message, $count = NULL) + { + return ...; + } +} +\-- + +As an implementation of translator, you can use for example GNU gettext or Zend_Translate. + + +Form translation +---------------- + +Forms and also individual form controls have a `setTranslator()` method, which can be used to set the translator for them. + + +/--php +$translator = new MyTranslator; +$form->setTranslator($translator); // set the translator for the form +\-- + +From this point on, all labels but also all error messages or select box items get translated into another language. + +For individual form controls, it is still possible to set another translator or completely turn the translation off using the `NULL` value: + +/--php +$form->addSelect('carModel', 'Model:', $cars) + ->setTranslator(NULL); +\-- + + +Template translation +-------------- + +Translator can also be set for [templates|templating]. Again, by using the `setTranslator()` method, for example in presenter: + +/--php + function beforeRender() + { + ... + $this->template->setTranslator($translator); + } +\-- + +After this, all expressions within the [localization macros|default macros#localization] will be translated: + +/--html +
  • {_'Basket'} {_$item} +\-- + +You can use an alternative pair notation: + +/--html +
  • {_}Order{/_} +\-- + +{{toc:yes}} + +{{themeicon: earth.png}} From 70d08097c40bb40c2cf8f3ce1b3f787de4377620 Mon Sep 17 00:00:00 2001 From: smasty Date: Fri, 12 Aug 2011 16:33:27 +0200 Subject: [PATCH 0127/1741] en/default-macros: correct link to localization#template-translation --- en/default-macros.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/default-macros.texy b/en/default-macros.texy index 7ac6754d1d..3032a3968f 100644 --- a/en/default-macros.texy +++ b/en/default-macros.texy @@ -426,7 +426,7 @@ Depending on the values of the variables `$value` and `$checked` this will print Localization `{_expression}` .{toc: Localization} --------------------------------- -Macro which helps with automated translating in templates. To work properly a translator has to be set, see [localization |localization#toc-preklad-sablon]: +Macro which helps with automated translating in templates. To work properly a translator has to be set, see [localization |localization#template-translation]: /--php $template->setTranslator(new MyTranslator); From 2bd42e0373e5a7070ac2c7a2c9bde3bf4d2faba9 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Fri, 12 Aug 2011 18:53:32 +0200 Subject: [PATCH 0128/1741] cs/dependency-injection: finalizace --- cs/dependency-injection.texy | 372 +++++++++++++++++++++-------------- 1 file changed, 229 insertions(+), 143 deletions(-) diff --git a/cs/dependency-injection.texy b/cs/dependency-injection.texy index 09f4e321da..3ef645d1bd 100644 --- a/cs/dependency-injection.texy +++ b/cs/dependency-injection.texy @@ -2,7 +2,7 @@ Dependency Injection ******************** /--div .[perex] -Podstatou Dependency Injection (DI) je odebrat třídám zodpovědnost za získávání konkrétních objektů (tzv. služeb), které potřebují ke své činnosti a místo toho služby dostávají už při svém vytváření. Řekneme si: +Podstatou Dependency Injection (DI) je odebrat třídám zodpovědnost za získávání objektů, které potřebují ke své činnosti (tzv. služeb) a místo toho jim služby předávat při vytváření. Řekneme si: - co je principem Dependency Injection? - jak vytvářet dynamické a statické DI kontejnery @@ -11,9 +11,9 @@ Podstatou Dependency Injection (DI) je odebrat třídám zodpovědnost za získ Co je to Dependency Injection? ------------------------------- +============================== -Narovinu: Dependency Injection (DI) není nic tajemného nebo nepochopitelného. Celé se dá shrnout do jedné sobecké věty: **„nic nesháněj, ať se postará někdo jiný.“** Nic víc, nic míň. Ukažme si to na třídě `Article` reprezentující článek na blogu: +Narovinu: Dependency Injection (DI) není nic tajemného nebo nepochopitelného. Celé se dá shrnout do jedné sobecké věty: **„nic nesháněj, ať se postará někdo jiný.“** Nic víc, nic míň. Převeďme to do řeči programátorů. Máme třídu `Article` reprezentující článek na blogu: /--php class Article @@ -24,7 +24,7 @@ class Article function save() { - ... uložíme do databáze ... + // uložíme do databáze } } @@ -39,7 +39,7 @@ $article->content = 'Every year millions of people in ...'; $article->save(); \-- -Metoda `save()` nám uloží článek do databázové tabulky `articles`. Implementovat ji za pomoci [Nette\Database |database] bude hračka, nebýt jedno zádrhelu: kde vzít připojení k databázi, tj. objekt Connection? +Metoda `save()` nám uloží článek do databázové tabulky `articles`. Implementovat ji za pomoci [Nette\Database |database] bude hračka, nebýt jedno zádrhelu: kde má objekt `Article` vzít připojení k databázi, tj. objekt Connection? Nejspíš bychom si poradili, můžeme jej uložit někde do globální proměnné `$GLOBALS['connection']`. Říkali vám, že používání globálních proměnných je špatné a že máte raději používat statické proměnné tříd? No měli pravdu, globální proměnné jsou zlo, jenže statické proměnné tříd jsou zcela totéž. To je jako říci: „Nejezte hamburgery, tloustne se po nich, dejte si raději cheeseburger.“ @@ -86,214 +86,202 @@ Proč jsou globální proměnné zlo? Dobrá otázka. Zvídavému programátorovi nestačí si přečíst, že to či ono je zlo, chce znát důvod. Třída `Article` tak jako tak databázové připojení potřebuje. Jenže z prvního příkladu užití není vůbec patrné, odkud a jak ho získá. Uživatel takové kódu může být až překvapen, že se vůbec článek uloží, a ptá se „kam se vlastně uložil?“ Naopak v druhém příkladu používajícím DI je kód samovysvětlující. -Představte si, že zkoumáte nějakou knihovnu pro platební brány a napíšete si: +Představte si, že zkoumáte nějakou knihovnu pro platební brány a napíšete si příklad: /--php $cc = new CreditCard('4461510140804839', 12, 2013); $cc->pay(1000, CreditCard::DOLLARS); \-- -Kód spustíte, s číslem své karty, a po nějaké době zjistíte, že vám to skutečně z účtu strhlo peníze! Šokovaný zíráte na výpis a lamentujete: „kde jsou mé peníze, jak je to mohlo strhnout, vždyť jsem to s žádnou platební bránou nepropojil!“ Třída `CreditCard` se s ní propojila nějak sama, podobně tajemně, jako si `Article` získal připojení k databázi. +Kód spustíte, s číslem své karty, a po nějaké době zjistíte, že vám to skutečně z účtu strhlo peníze! Šokovaný zíráte na výpis a lamentujete: „kde jsou mé peníze, jak je to mohlo strhnout, vždyť jsem to s žádnou platební bránou nepropojil!“ Třída `CreditCard` se s ní propojila nějak sama, získala ji odněkud z globální proměnné, podobně tajemně, jako si původní `Article` získal připojení k databázi. Takovou věc z kódu nejen že nevydedukujete, ale ani nevíte, jak změnit platební bránu na jinou, třeba testovací. DI znamená víc psaní -------------------- -Můžete namítnout, že používání DI znamená víc psaní, že kvůli vytvoření instance `Article` musíte uchovávat a předávat databázové spojení a podobně. To je pravda, nicméně tohle psaní navíc není samoúčelné, nezapomeňte, že minule vás „méně psaní“ připravilo o $1000! Ne, nechceme to zlehčovat. Připomínka je zcela správná a my ještě přidáme jednu závažnější: časem může ve třídě `Article` vzniknout potřeba nějaká data cachovat a v souladu s DI bude požadovat úložiště cache v konstruktoru. To by znamenalo upravit aplikaci na mnoha místech: přinejmenším všude, kde se vytváří instance `Article`. +Můžete namítnout, že používání DI znamená víc psaní, že kvůli vytvoření instance `Article` musíte uchovávat a předávat databázové spojení a podobně. To je pravda, nicméně nezapomeňte, že posledně vás „méně psaní“ připravilo o $1000! Ne, nechceme to zlehčovat. Připomínka je zcela korektní a my ještě přidáme jednu závažnější: časem může ve třídě `Article` vzniknout potřeba nějaká data cachovat a v souladu s DI bude požadovat předání ještě objektu představujícího úložiště cache. To by znamenalo upravit aplikaci na mnoha místech: přinejmenším všude, kde se vytváří instance `Article`. -Co s tím? Věc má řešení. Místo ručního vytváření objektů `Article` si vytvoříme továrničku, tedy funkci, která bude objekty `Article` vyrábět. Když se v `Article` změní konstruktor, upraví se jen továrnička, nic víc. Takové továrničce se říká **DI kontejner** (container). A jak se k ní v našem kódu vlastně dostaneme? Vždyť víte… o to ať se postará někdo jiný :-) +Co s tím? Věc má řešení. Místo ručního vytváření objektů `Article` si vytvoříme továrničku, tedy funkci, která bude objekty `Article` vyrábět. Když `Article` změní konstruktor, upraví se jen továrnička, nic víc. A odkud onu továrničku v našem kódu získáme? Vždyť víte… o to ať se postará někdo jiný :-) +DI kontejner a služby +--------------------- +Termínem DI kontejner označujeme právě onu továrničky. Přesněji řečeno, jde o objekt obsahující libovolné množství továrniček, každou pro jinou službu. Co jsou to služby? Obyčejné objekty, jako třeba zmíněný `Article`. Jen v souvislosti s DI kontejnery jim říkáme služby. Zřejmě to vymysleli konzultanti, kteří chtějí, aby DI vypadalo složitě a oni mohli konzultovat. -Nette\DI\Container ------------------- - -Nette\DI\Container představuje obecnou "továrničku" na služby. Co jsou to služby? Obyčejné objekty. Jen v souvislosti s DI kontejnery jim říkáme služby. Zřejmě to vymysleli konzultanti, kteří chtějí, aby DI vypadalo složitě a oni mohli konzultovat. +Příkladem může být kontejner, který vytvoří `Article`, ale také jím požadované připojení k databázi: -V počátku běhu aplikace si vytvoříme [systémový DI kontejner |configuring], který nám bude vytvářet všechny další služby (nebo kontejnery) a vytvoří vlastně celý objektový graf. +/--php +class Container +{ + function createConnection() + { + return new Nette\Database\Connection( + 'mysql:host=localhost', 'root', '***' + ); + } -`Nette\DI\Container` nabízí pole $params pro uživatelské parametry a také "magické settery/gettery" jakožto zkratky pro addService, getService, hasService a removeService. + function createArticle() + { + return new Article($this->createConnection()); + } +} +\-- -Dynamický kontejner s definicí služeb pomocí callbacků: ------------- +Použití by vypadalo následovně: /--php -$cont = new Nette\DI\Container; - -$cont->addService('mailer', function($cont) { - return new Nette\Mail\SmtpMailer(array( - 'host' => 'smtp.gmail.com', - 'username' => $cont->params['username'], // údaje bereme z parametrů - 'password' => $cont->params['password'], - 'secure' => 'ssl', - )); -}); +$container = new Container; +$article = $container->createArticle(); +\-- -$cont->addService('message', function($cont) { - $message = new $cont->params['message.class']; - $message->setMailer($cont->mailer); // zkratka pro $this->getService('mailer') - $message->setFrom('John Doe '); - return $message; -}); +Výhoda je zřejmá, nemusíme se starat o to, jak `Article` vyrobit, to je záležitostí továrničky. Nicméně řešení má dva problémy. Nejprve: přihlašovací údaje jsou natvrdo zadrátované do kódu, proto je vyčleníme: -// nastavíme parametry -$cont->params = array( - 'username' => 'john', - 'password' => '***', - 'message.class' => 'Nette\Mail\Message', -); +/--php +class Container +{ + public $params = array(); -// a nyní kontejner použijeme pro vytvoření objektu emailu: -$message = $cont->message; // zkratka pro $cont->getService('message') -\-- + function createConnection() + { + return new Nette\Database\Connection( + $this->params['dsn'], + $this->params['user'], + $this->params['password'] + ); + } -Jednotlivé services jsou sdílené, tj. vytváří se jen jednou. + function createArticle() + { + $class = $this->params['article.class']; + return new $class($this->createConnection()); + } -Pokud místo callbacku předáme řetězec s názvem třídy, vytvoří se objekt ServiceBuilder, jehož úkolem je později třídu instancovat. Metoda addService onen builder vrací. Pokud bychom tedy vytvořili builder s metodami jako addArgument nebo addMethodCall, bylo by možné uvedený příklad zapsat třeba takto: +} -/--php -$cont->addService('mailer', new AnotherBuilder('Nette\Mail\SmtpMailer')) - ->addArgument(array( - 'host' => 'smtp.gmail.com', - 'username' => '%username%', - 'password' => '%password%', - 'secure' => 'ssl', - )); - -$cont->addService('message', new AnotherBuilder('%message.class%')) - ->addMethodCall('setMailer', '@mailer') - ->addMethodCall('setFrom', 'John Doe '); - -$cont->params = array( - 'username' => 'john', +$container = new Container; +$container->params = array( + 'dsn' => 'mysql:host=localhost' + 'user' => 'root', 'password' => '***', - 'message.class' => 'Nette\Mail\Message', + 'article.class' => 'Article', ); +$article = $container->createArticle(); \-- -Zdůrazňuji, že AnotherBuilder v Nette přímo není, protože mi to připadá jako škrabání se přes hlavu. Nevidím moc smysl ve vytváření nového metajazyka, když to jde jednoduše pomocí callbacků. Ale proti gustu… Kód AnotherBuilder by vypadal cca takto: +Daleko větším problémem je, že vždy, když požádáme o vytvoření `Article`, vytvoří se i nové připojení k databázi. Tomu je třeba zabránit. Jednou vytvořenou službu `Connection` si proto uložíme do proměnné pro příští použití: /--php -class AnotherBuilder extends Nette\DI\ServiceBuilder +class Container { - private $args = array(); - private $calls = array(); + public $params = array(); - public function addArgument($arg) - { - $this->args[] = $arg; - return $this; - } + private $services = array(); - public function addMethodCall($method) - { - $this->calls[] = func_get_args(); - return $this; - } - - public function createService(Nette\DI\IContainer $container) + function createConnection() { - $class = $container->expand($this->class); - try { - $type = new Nette\Reflection\ClassType($class); - } catch (\ReflectionException $e) { - throw new Nette\InvalidStateException("Cannot instantiate service, class '$class' not found."); + if (isset($this->services['connection'])) { + return $this->services['connection']); } - $expander = function(& $val) use ($container) { - $val = $val[0] === '@' ? $container->getService(substr($val, 1)) : $container->expand($val); - }; - $args = $this->args; - array_walk_recursive($args, $expander); - $service = $type->newInstanceArgs($args); - foreach ($this->calls as $call) { - array_walk_recursive($call, $expander); - call_user_func_array(array($service, array_shift($call)), $call); - } - return $service; + return $this->services['connection'] = new Nette\Database\Connection( + $this->params['dsn'], + $this->params['user'], + $this->params['password'] + ); } + ... } \-- +Vidíte, že DI kontejner není nic složitého. + +*TODO* + + + +Nette\DI\Container +================== + +Třída [Nette\DI\Container |api:] je pružná implementace DI kontejneru. Vlastní kontejnery můžeme vytvářet buď staticky, tj. poděděním této třídy, nebo dynamicky, kdy továrničky přidáme pomocí closures nebo callbacků. + +Jednotlivé services jsou sdílené, tj. vytváří se jen jednou. + + Statický kontejner ------------------ -Nová je podpora pro statické továrničky. Tj. místo dynamického vkládání callbacků můžeme vytvořit třídu (potomka Container), který bude sadu metod-továrniček rovnou obsahovat. Jejich název musí mít tvar `createServiceXyz`: +Všimněte si, že kontejner nabízí pole $params pro uživatelské parametry a také "magické settery/gettery" jakožto zkratky pro addService, getService, hasService a removeService /--php -class MailContainer extends Nette\DI\Container +class MyContainer extends Nette\DI\Container { - protected function createServiceMailer() + protected function createServiceConnection() { - return new Nette\Mail\SmtpMailer(array( - 'host' => 'smtp.gmail.com', - 'username' => $this->params['username'], - 'password' => $this->params['password'], - 'secure' => 'ssl', - )); + return new Nette\Database\Connection( + $this->params['dsn'], + $this->params['user'], + $this->params['password'] + ); } - protected function createServiceMessage() + protected function createServiceArticle() { - $message = new $this->params['message.class']; - $message->setMailer($this->mailer); - $message->setFrom('John Doe '); - return $message; + $class = $this->params['article.class']; + return new $class($this->getService('connection')); } } -$cont = new MailContainer; -$cont->params = array( - 'username' => 'john', +$container = new MyContainer; +$container->params = array( + 'dsn' => 'mysql:host=localhost' + 'user' => 'root', 'password' => '***', - 'message.class' => 'Nette\Mail\Message', + 'article.class' => 'Article', ); -$message = $cont->message; +$article = $container->article; \-- -Všechny služby v rámci kontejneru jsou trvalé, tj. při volání getService() (či získání přes proměnou) se nevytváří služba opakovaně, ale vrací se již dříve vytvořená. Jakékoliv jiné chování by bylo leda matoucí. V uvedeném příkladu by se ale hodilo, kdyby kontejner pokaždé vygeneroval nový objekt `Nette\Mail\Message`. Toho lze dosáhnout snadno: namísto služby `message` vytvoříme obyčejnou metodu `createMessage`: +Všechny služby v rámci kontejneru jsou trvalé, tj. při volání getService() (či získání přes proměnou) se nevytváří služba opakovaně, ale vrací se již dříve vytvořená. Jakékoliv jiné chování by bylo leda matoucí. V uvedeném příkladu by se ale hodilo, kdyby kontejner pokaždé vygeneroval nový objekt `Nette\Mail\Article`. Toho lze dosáhnout snadno: namísto služby `article` vytvoříme obyčejnou metodu `createArticle`: /--php -class MailContainer extends Nette\DI\Container +class MyContainer extends Nette\DI\Container { - function createServiceMailer() + function createServiceConnection() { - return new Nette\Mail\SmtpMailer(array( - 'host' => 'smtp.gmail.com', - 'username' => $this->params['username'], - 'password' => $this->params['password'], - 'secure' => 'ssl', - )); + return new Nette\Database\Connection( + $this->params['dsn'], + $this->params['user'], + $this->params['password'] + ); } - function createMessage() + function createArticle() { - $message = new $this->params['message.class']; - $message->setMailer($this->mailer); - $message->setFrom('John Doe '); - return $message; + $class = $this->params['article.class']; + return new $class($this->getService('connection')); } } -$cont = new MailContainer; -$cont->params = array( - 'username' => 'john', +$container = new MyContainer; +$container->params = array( + 'dsn' => 'mysql:host=localhost' + 'user' => 'root', 'password' => '***', - 'message.class' => 'Nette\Mail\Message', + 'article.class' => 'Article', ); -$mailer = $cont->createMessage(); +$article = $container->createArticle(); \-- -Z kódu `$xyz = $cont->createXyz()` je zřejmé, že se vytváří pokaždé nový objekt. Jde tedy o konvenci na straně programátora. +Z kódu `$xyz = $container->createXyz()` je zřejmé, že se vytváří pokaždé nový objekt. Jde tedy o konvenci na straně programátora. Kontejner je možné zmrazit a poté ho již nelze měnit: @@ -305,10 +293,109 @@ $container->addService(...); // vyhodí výjimku Rozmrazíme jej vytvořením klonu, viz níže. +Dynamický kontejner +------------------- + +/--php +$container = new Nette\DI\Container; + +$container->addService('connection', function($container) { + return new Nette\Database\Connection( + $container->params['dsn'], + $container->params['user'], + $container->params['password'] + ); +}); + +$container->addService('article', function($container) { + $class = $container->params['article.class']; + return new $class($container->connection); +}); + +// nastavíme parametry +$container->params = array( + 'dsn' => 'mysql:host=localhost' + 'user' => 'root', + 'password' => '***', + 'article.class' => 'Article', +); + +// a nyní kontejner použijeme pro vytvoření objektu emailu: +$article = $container->article; // zkratka pro $container->getService('article') +\-- + +Pokud místo callbacku předáme řetězec s názvem třídy, vytvoří se objekt ServiceBuilder, jehož úkolem je později třídu instancovat. Metoda addService onen builder vrací. Pokud bychom tedy vytvořili builder s metodami jako addArgument nebo addMethodCall, bylo by možné uvedený příklad zapsat třeba takto: + +/--php +$container->addService('connection', new AnotherBuilder('Nette\Database\Connection')) + ->addArgument('%dsn%') + ->addArgument('%user%') + ->addArgument('%password%'); + +$container->addService('article', new AnotherBuilder('%article.class%')) + ->addArgument('@mailer'); + +$container->params = array( + 'dsn' => 'mysql:host=localhost' + 'user' => 'root', + 'password' => '***', + 'article.class' => 'Article', +); +\-- + +/--comment +Zdůrazňujeme, že AnotherBuilder v Nette přímo není, jeho kód by vypadal cca takto: + + /--php +class AnotherBuilder extends Nette\DI\ServiceBuilder +{ + private $args = array(); + private $calls = array(); + + public function addArgument($arg) + { + $this->args[] = $arg; + return $this; + } + + public function addMethodCall($method) + { + $this->calls[] = func_get_args(); + return $this; + } + + public function createService(Nette\DI\IContainer $container) + { + $class = $container->expand($this->class); + try { + $type = new Nette\Reflection\ClassType($class); + } catch (\ReflectionException $e) { + throw new Nette\InvalidStateException("Cannot instantiate service, class '$class' not found."); + } + + $expander = function(& $val) use ($container) { + $val = $val[0] === '@' ? $container->getService(substr($val, 1)) : $container->expand($val); + }; + $args = $this->args; + array_walk_recursive($args, $expander); + $service = $type->newInstanceArgs($args); + foreach ($this->calls as $call) { + array_walk_recursive($call, $expander); + call_user_func_array(array($service, array_shift($call)), $call); + } + return $service; + } + + +} + \-- +\-- + + Aliasování ---------- -Vytváření aliasů pro názvy služeb se mi jeví spíš jako chyba návrhu a doporučil bych se mu vyhnout. Pokud by však nebylo zbytí, můžeme službu jednoduše vložit pod jiným názvem: +Vytvářejte aliasy pro služby jen tehdy, je-li to skutečně nutné: /--php $container->addService('alias', $container->getService('originalName')); @@ -327,8 +414,8 @@ $container->addService('alias', function($container) { Nebo mezi dvěma kontejnery: /--php -$containerDest->addService('mailer', function() use ($containerSrc) { - return $containerSrc->getService('mailer'); +$containerDest->addService('connection', function() use ($containerSrc) { + return $containerSrc->getService('connection'); }); \-- @@ -339,11 +426,10 @@ $dolly = clone $container; \-- - Auto-wiring ----------- -Autowire umožňuje při vytváření služby automaticky předávat do konstruktoru další služby dle type hintů. Vytvoříme si k tomu nový ServiceBuilder: +Autowire je pokročilejší technika, umožňující při vytváření služby automaticky předávat do konstruktoru další služby dle typu. Vytvoříme si k tomu nový ServiceBuilder: /--php class AutowireServiceBuilder extends Nette\DI\ServiceBuilder @@ -375,8 +461,7 @@ class AutowireServiceBuilder extends Nette\DI\ServiceBuilder // přidáme službu, která se sestaví auto-wiringem -$cont->addService('message', new AutowireServiceBuilder('Message')); - +$cont->addService('article', new AutowireServiceBuilder('Article')); \-- @@ -385,24 +470,25 @@ Klíčem je metoda kontejneru `getServiceByType()`, která vrátí službu podle Pokud přidáváme službu pomocí továrny, není její typ pochopitelně znám. Můžeme ho proto "napovědět" třetím parametrem metody addService: /--php -$cont->addService('mailer', function($cont) { ... }, 'Nette\Mail\IMailer'); +$cont->addService('connection', function($cont) { ... }, 'Nette\Database\Connection'); \-- K ověření typu služby slouží metoda checkServiceType(): /--php -if (!$cont->checkServiceType('mailer', 'Nette\Mail\IMailer')) { +if (!$cont->checkServiceType('connection', 'Nette\Database\Connection')) { ... } \-- + Tagování -------- Při uložení jakéhokoliv objektu můžeme u něj uvést doplňující metainformace, tzv. tagy: /--php -$container->addService('mailer', ..., array('tag1', 'tag2')); +$container->addService('connection', ..., array('tag1', 'tag2')); \-- A poté můžeme v kontejneru vyhledat všechny služby (resp. jejich jména), které mají daný tag: @@ -414,11 +500,11 @@ $list = $container->getServiceNamesByTag('tag1') Tag nemusí být je řetězec, ale může obsahovat další libovolné atributy: /--php -$container->addService('mailer', ..., array( +$container->addService('connection', ..., array( 'tag1' => array('id' => 'mx', 'priority' => 12), 'tag2' => array('...'), )); $list = $container->getServiceNamesByTag('tag1') -// vrací pole array('mailer' => array('id' => 'mx', 'priority' => 12)) +// vrací pole array('connection' => array('id' => 'mx', 'priority' => 12)) \-- From 64752b88f5d1fed97c7ee4e89e33a85a9374d50e Mon Sep 17 00:00:00 2001 From: smasty Date: Fri, 12 Aug 2011 21:35:11 +0200 Subject: [PATCH 0129/1741] en/finder: created --- en/finder.texy | 186 ++++++++++++++++++++++++++++++++ en/installation.texy | 92 ++++++++++++++++ files/adminer.png | Bin 0 -> 52142 bytes files/cdcollection.png | Bin 0 -> 27528 bytes files/icon-application-icon.png | Bin 10638 -> 6467 bytes files/requirements-checker.png | Bin 0 -> 75084 bytes files/sandbox.png | Bin 85789 -> 70868 bytes 7 files changed, 278 insertions(+) create mode 100644 en/finder.texy create mode 100644 en/installation.texy create mode 100644 files/adminer.png create mode 100644 files/cdcollection.png create mode 100644 files/requirements-checker.png diff --git a/en/finder.texy b/en/finder.texy new file mode 100644 index 0000000000..139fd61b9c --- /dev/null +++ b/en/finder.texy @@ -0,0 +1,186 @@ +File Search: Finder +******************* + +.[perex] +Class [api:Nette\Utils\Finder] makes browsing the directory structure really easy. + + +All examples assume created class alias: + +/--php +use Nette\Utils\Finder; +\-- + + +Searching for Files +------------------- + +How to find all `*.txt` files in `$dir` directory omitting subdirectories? + +/--php +foreach (Finder::findFiles('*.txt')->in($dir) as $key => $file) { + echo $key; // $key is a string containing absolute filename with path + echo $file; // $file is an instance of SplFileInfo +} +\-- + +If the directory does not exist, an `UnexpectedValueException` is thrown. + +And what about searching for `*.txt` files in `$dir` including subdirectories? Instead of `in()`, use `from()`: + +/--php +foreach (Finder::findFiles('*.txt')->from($dir) as $file) { + echo $file; +} +\-- + +Search by more masks, even inside more directories within one iteration: + +/--php +foreach (Finder::findFiles('*.txt', '*.php') + ->in($dir1, $dir2) as $file) { + ... +} +\-- + +Parameters can also be arrays: + +/--php +foreach (Finder::findFiles($masks)->in($dirs) as $file) { + ... +} +\-- + +Searching for `*.txt` files containing a number in the name: + +/--php +foreach (Finder::findFiles('*[0-9]*.txt')->from($dir) as $file) { + ... +} +\-- + +Searching for `*.txt` files, except those containing '`X`' in the name: + +/--php +foreach (Finder::findFiles('*.txt') + ->exclude('*X*')->from($dir) as $file) { + ... +} +\-- + +.[note] +`exclude()` is specified just after `findFiles()`, thus it applies to filename. + + +Directories to omit can be specified using the `exclude` **after** `from` clause: + +/--php +foreach (Finder::findFiles('*.php') + ->from($dir)->exclude('temp', '.git') as $file) { + ... +} +\-- + +.[note] +Here `exclude()` is after `from()`, thus it applies to the directory name. + + +And now something a bit more complicated: searching for `*.txt` files located in subdirectories starting with '`te`', but not '`temp`': + +/--php +foreach (Finder::findFiles('te*/*.txt') + ->exclude('temp*/*')->from($dir) as $file) { + ... +} +\-- + +Depth of search can be limited using the `limitDepth()` method. + + + +Searching for directories +---------------- + +In addition to files, it is possible to search for directories using `Finder::findDirectories('subdir*')`, or to search for files and directories: `Finder::find('file.txt')`. +In that case, the mask applies to files, not directories. + + +Filtering +---------- + +You can also filter results. For example, according to size. This way we will go through files with sizes between 100B and 200B: + + +/--php +foreach (Finder::findFiles('*.php')->size('>=', 100)->size('<=', 200) + ->from($dir) as $file) { + ... +} +\-- + +Or files changed in the last two weeks: + +/--php +foreach (Finder::findFiles('*.php')->date('>', '- 2 weeks') + ->from($dir) as $file) { + ... +} +\-- + +Here we go through PHP files with number of lines greater than 1000. As a filter we use a custom callback: + +/--php +$finder = Finder::findFiles('*.php')->filter(function($file) { + return count(file($file->getPathname())) > 1000; +})->from($dir); +\-- + +You can go even further and extend the `Nette\Utils\Finder` class for example with a `dimensions` method using the [extension methods |php-language-enhancements#extension methods]: + +/--php +Finder::extensionMethod('dimensions', function($finder, $width, $height){ + if (!preg_match('#^([=<>!]+)\s*(\d+)$#i', $width, $mW) + || !preg_match('#^([=<>!]+)\s*(\d+)$#i', $height, $mH) + ) { + throw new InvalidArgumentException('Invalid dimensions predicate format.'); + } + return $finder->filter(function($file) use ($mW, $mH) { + return $file->getSize() >= 12 && ($size = getimagesize($file->getPathname())) + && (!$mW || Finder::compare($size[0], $mW[1], $mW[2])) + && (!$mH || Finder::compare($size[1], $mH[1], $mH[2])); + }); +}); +\-- + + +Finder, find images larger than 50px × 50px: + +/--php +foreach (Finder::findFiles('*') + ->dimensions('>50', '>50')->from($dir) as $file) { + ... +} +\-- + + +Connection to Amazon S3 +---------------------- + +It's possible to use custom streams, for example Zend_Service_Amazon_S3: + +/--php +$s3 = new Zend_Service_Amazon_S3($key, $secret); +$s3->registerStreamWrapper('s3'); + +foreach (Finder::findFiles('photos*') + ->size('<=', 1e6)->in('s3://bucket-name') as $file) { + echo $file; +} +\-- + +Handy, right? You will certainly find a use for Finder in your applications. + + +.[see] +See also: +- [Nette\Utils\Finder API reference | api:Nette\Utils\Finder] diff --git a/en/installation.texy b/en/installation.texy new file mode 100644 index 0000000000..b7fc9ab12e --- /dev/null +++ b/en/installation.texy @@ -0,0 +1,92 @@ +Downloading and Installation +**************************** + + +Nette Framework installation is very simple: just [download|www:download] and unpack the Framework into a directory accessible from web server. + +As you can see on the [Download|www:download] page, there is a PHP 5.3 version available, which uses the latest PHP features such as namespaces, +and also a version for older PHP 5.2. Choose the distribution according to the PHP version available on your server. Both variants are functionally 100% equal. + +Unpack the archive to a folder such as '`nette`' in the root directory of your web server: + +/--pre +www/ ← root directory of your web server + nette/ ← unpacked archive + API-reference/ ← offline version of API reference + client-side/ ← script for form validation + examples/ ← examples, directly executable + Nette/ ← framework itself + Application/ + Caching/ + ... + loader.php + + Nette-minified/ ← minified version of the framework + nette.min.php + + sandbox/ ← prepared project + app/ + libs/ + log/ + temp/ + www/ + + tools/ ← some useful tools + Code-Checker/ + Code-Migration/ (only in PHP 5.3 distribution) + Ini2Neon/ + Requirements-Checker/ + +\-- + +The entire framework is located in the `Nette` folder. There is a minified version available in the `Nette-minified` directory, containig only one file - `nette.min.php`. +It was created by merging all the files and removing all comments and whitespace. Both variants are functionally equal, the minified version is intended for production +use (easier to upload, higher speed). + +There is a copy of [API reference|http://api.nette.org] available in the `API-reference` directory. In the `examples` directory, there is a set of simple, +directly executable examples, `tools` contains some useful tools and the `sandbox` is an empty prepared +project - a starting point for [creating new application|presenters]. It is a functional project, so you can start experimenting with Nette immediately. + + +Running the application +----------------- + +First, make sure your server [meets the minimum requirements|requirements] for running Nette Framework: run the Requirements-Checker: + +/-- +http://localhost/nette/tools/Requirements-Checker/checker.php +\-- + +[* requirements-checker.png *] + +The green title "Congratulations! Server configuration meets the minimum requirements for Nette Framework." means everything is okay. + +Now try to run `sandbox`: + +/-- +http://localhost/nette/sandbox/www/ +\-- + +[* sandbox.png *] + +It includes a bundled tool [Adminer|http://adminer.org/en/] for database management: + +/-- +http://localhost/nette/sandbox/www/adminer/ +\-- + +[* adminer.png *] + +Also, try some of the examples, such as: + +/-- +http://localhost/nette/examples/CD-collection/www/ +http://localhost/nette/examples/Fifteen/www/ +\-- + +[* cdcollection.png *] + +If everything works, you can continue step by step to [create the first application|quickstart]. + +{{themeicon: icon-application-icon.png}} +{{toc:yes}} diff --git a/files/adminer.png b/files/adminer.png new file mode 100644 index 0000000000000000000000000000000000000000..22848e4998abd7d216df7be7ded2a6fba088a187 GIT binary patch literal 52142 zcmZsCWl$VV7w)3LS$uIPIE%XkS%L?L;O@a)gFC?;f;$8V?(XjH?hxEA?^kv2uRBvy zQ`^B&s z0RS?9l=v4Fx8+lBS1+Bu#P`&uz1!TU^?1gixC+amw!Re1G(=)dX)*&C#Qb<;*LXby z<9KVSn)J2Vu{g#h6Di6R+(;}tfYEBystIS={eowcjj4~XKw^<43=ODpV?r`}VutA; z%fif5p75{N%~*8YT%<)O0Qjwxyp%%!vJwtP#Ow+rA+QfCf@PBFW^;VI%3#iC!S%|% zw1EORSWT0&lYgT@9DfjWPaaclmU^=GZ`1b22DEAVH|=G{pB=$vG_+zZ;HPy!PvI}7 z=XoD6UTBqc!VRZ;dc*g4giP_Hzyv-n4l1snYaVIdu$I#K`I(pE_-m;hBx0}7dg94U zvr}X$x@IE$3mVHXhZ2cD6Rbr$C=bX88D9)V7O=x5-jv&lniMQEn{apEKuPR*Z=s9USZW;*NlVj-zrFP_akqYt<=3FZU}bd(8- z@HGjVsy`Q4s&W&^0}GS70y`Zix`I)^edn7>Nv~P(nSMey|q%*Uh zBEO4^&Bx7ZglSEv&;6t7lFmNIWppK(sb!+^8({;WL<7HNi47&}A`iIbMNO>=0@BNl z9bL(sa&sM*eY^-e_d!vPz>GG$VQK{4XQZT=VskziN6b+j{fYAga}QR>drvdQ3u}LN z+Mbua%-7CtoX|pBWIS4y^!x4flFpzJ{sYlt?>PgS4G&Uh5QNSo(ku`o5!#6SVz4cH zUHr(Y51smSN^&Yh2$qTIn@T>#zqSi+^w8sS>!;Z>?zAXFwPsuI>mjSk_GQCrW8oIp zi*-WV)+@%o!-rfz4mXP=22y1G+l*Mp+tK@*RnqX$Op#-sxtddH>F|w!=+`6@MGinG zlU9;o+cS<>dyvDZAqP+zLo^M$stjC@R+|gWuc+!Py$9yLpz&=@)Qo;Iej}afhf7Z; zGvQrJ8M`{N=d(T@fQBVcZd*b^=8D>cCKVKOH)H>$wGM|kT_Q2=f9oPYjC_;q%It5Z zxt@v{+{VI>lI}|Rx_$;mq0Ngli&PxO)~saO!)?mc3=05y{7YL!dO1#-S^uYhqmc%I>3RwdPKqDU$-0&xX_zyG@-t^VzIg(Qn#MQPl*TEk zY5eMF73JBQphAep!7ohJauVKx`R&XX+YtXg4kZ_J(az4h8k5iYBN20OTR zIbzd{O|5gVT_xY>UnGGDwD?!KgV;vfww}?-PRCUPP!6`=r+x%#3YjV`wSg-laMGTA zSkYlSQ}TlmB0xVuzBD2VzNb=MubM{(KCk-GZJ-&MSwBq_r=Y6JwYZ?~oS9|ZRpaz6 zuSM^KqU$!D<@|`hy0IB*>)gN8q>e4}pR2CpW8V~tW{0T>Bo2XGa~P+RLPD`zZ2$+) zCOm&P>SR6zW&4ac-DnuV&e1-FK7B))@*=kY8C}Sy_(;fGD(|T4-Q_ z2sv<)@c7P(zH8y&+z{=9A)V|H3{e0rZd9{2bJjt?Prs2pQ*4gk>GO{Fz`npP0YGH1ny*I>^TAQJ8vQs^ejvhy6a{=* zhri0o%PzqVZ-r+Bi{;)kPX4^EMM7Ub%ZXvJulF{9z=3`>sj!aHtmntjJJPg)KqKWd z!80kYOfilhzDDM8g9-MQ*JAMnkeL%ot)Co4;$TTQc?R3@bxRNT&kR&ry7l_*2bG;+ z*I6ad7$YUur*)|~JgWT-Ej^>9o%R=5t~EV>mWbiy5G#23M`5oVHwtQu}Wb@v>k0_6ItrUTz1lI1j>)i1vm!pDZ*((j?35O{pWAw3YrBo zqpr@*_|`$xeeOfX(_3}`5gsBJ9-FGw~Xl{U}tQ#S$tWK#4zz}6c+xnvCpc^GwwD+S$D_51He3(tvl%~TH%(g#j^3hN&L5Fl(0~4nAT)s3+KbhE7Q@H z43LFy+$TBuhEEOF&7o`%I%2(I%wVXcNE(p@Hoi4DE1{)?on|ONCJ?7|=I?VF9P*+5wyNpkhr*Ls;%g>z!?N(BBk$PUaN9>K~~at|Wr za~kDfWldBJ+E_Jz8(&~QyPp^_8Ww-43JIlSkeTC0iQd8nO?+_@sO}{kH0?*WhDINTvpkdA> zD&R}oBjdJ6Hfd_UTuo`?6@%537ab#qcceKSHAH9Rdxei{; zQVHwQ1PW&_WzAEL$Jr#zoZE(V(Y=e=&A3Gk2p%lIhmGlC6gH=uV+@}Wl|e!&W9#ZQkjB`O-nFoDCrCP*k#{0 z^TQ29DYK$lG}itgC%>1@!Hw`fXV+2GeaH1fE%|X2hPs&7)qh)+UY#w$AM zG!cG8?#jND1#$P7TwSUaB!AV6{*@hZR?^JdgOJ*Hmtb>4^ha=sV`dSe%uuMA)qmzJj&C&HhJlZCQxvuRU6Q5u939*qMd%CCyTn7D*dt{b!aeoRygc&_~nyCi3-W z@@2}fMUuL5RlhZf2@6H}%p#_i;@CpY!pQP7NPe+zeV###yfOw)bwf{@@2W&yM?x1w zvcY!($ELFmPnAzLESPPus7V@dyFfuwSZ7hi{3JT^6kk&|Cd1<#7fDQOS zUy3AtiV)fy%`V}sl$o?^ML@{e9#1n$hZ~?2yw_ zwy{T)5ygw~*O%Vpb+T;bc1m_j(=GVSs@bN7b+=f&O78wbre9Nmy)=gET3kMU6W~S=hgx*&=;XMN@**-o8_asl+^@{=%MuBwH@iIbEN!g1}fqjNe z4{BVeM)!3EeD5uMXi7{_M+! zf`q%fJ0)p3ni=DWXipp?BE+DM``3&2s~BGayUosaZ%^0r)h3s-@9{$%TETC34ISPu z_Z*<>2gVXX4&3c*ho0IxYq){50_ih(@Kiil(B;sKKCu0 zR`cTB$pkqY4$n<@lZ&t2vZaSVP-v9c%dT3HZ0%(ikx4w>=*N{QB ztIZ+vep5wR9;G!kO1p!X8ogxKHH=2`hbL!hIQRyUyd+TZ1(CUmUpDbY*!Cj|K{27_ zmbtXxek!^i04ro=d0AZXpGTW%ZR&v?UuL17TXdeZ*I;@iT(JB-8o?M>?T{bPuyoer zI-dpGl`m5u21GqjFklmnS$tt_6bQkrN*g8osz<9JV4heqLHBiKWmfJ#(RW zJPvi)0xqnOd(E|jM3PF>WvicG z!Hk78#(;s;@HcpYfwRSG%2Ziw++C{#dk{Nh#sbliC?qyPilHAE*e z8L7`5O^b`Yhlen-G@N2cdY)Bt*cb$uun$j&#leA!rwTI|rOc_~Wl7`nV$9H!yJq?Y0V?lE zw*LVAbgiYR@sHoPeq@R)`6ML@skq!ye=-1!rZmAEbLK=N4C2V$iQ>VK?x zY<5D4(5A|A%`T{`sbPxJkSeOqnbr~udi*Ue{)#P;Jff8y>>cMv%0Wwz;V@b ze|}*ucy6a2@}%`v^Zc7OG;+EpmRAzBh455{-Ko6P>%s!KC<8o^XvBPhtRx`NpC#)fjYT|^fgSri&WRPrv7fVv$Ob)vneYL}*3ETxuk!$SZk& zXQpxQ`ndQA9B1*01isw{~XfR4S=3af(z~={RGq^fq0+ z*sB?$=u!CmlbWp39`s6adVOcMMX&(+HHaV|ZwVoTZh zxE@_!w$#ylb{(CfGc?KH4a$s~N{Z(DZZLqqb#+bJmB#d(vkQbWG~Kbq=3w)qht9zi zVGt8D{p#bgRf74O$Orq0b_<{;S=ij{EM_sUUD31sp=RQ4=f;s5NzIm~`rErFFZOF7 zc$9;aD2yt8$cfK}jX;Z^&;O@>mV~w7M}PZ9ajoo}^k+#UB`K%!1$ZW{>Xu#vGYhAW zYoOWpB>Y-60nsk$8bk% zd321AAi150LmlQO&~hRH>chISS*cG0^z4KfyzPe;5#6YWL=!xZ&V`WRs@*KnO-3$9lC2U!T1;eWvv1ct#n2 zrC|-W)PIj&>e}`}WZ?n>8xA8(dQa2Iqo$5`E_ZZ+lT&$;A8OT^OA8V*a_*G5qoX4S zfdQ6YPJ;Xoh1DMoYd=^R7{m~o)_!D9B)5Gud^1%4!F=2A!lT~r5397k^V_z+j`ug0 z4(hANuyCziyl#BW*LizxG ztIu%C(6RaVcCW^&s){b6g;iR`pTR=xw=$wio|iUz!pA! z@7O^4kuE=O>M~AeRE~Z0!US_#9u7X-sL$*}p%Vv1ej_6zo}QixSpx3YyF<~@Xi{-J zSyncJs;VpBR1PC0d)8jX>TXeSOwLu<5@icL_*QDV#&V}rHYR`PV|6Ze7Q6O^m=-CaOed9SBAwILM#*H=UTq*P zB~2c|P^L1R#L3kkAk?qXd4c}W7N$X!l|+!lB=eb~4mC=NZQi4%4^N6#iG~0T4GlGu z$9{WvD88bi;^Uj7E^!_qSoyA%JkQN{mZU;4&kk-audZ(F+`oNHBOqL3R!`fJ<6z&8 ziHUSaoZ@>9PD@K$4U(6eL6RB%c$gv2Em&c_)kXvIAA{fS4buk~TX0nUZnSVWay66u zm=uA$zyKf7S;7C_ls=;x13a62kUu53GRcD7o;$h{I^8F3gl#72P^3u}Qjpkh#>BEpfFGH06#`|YVest@ML z92W~go134<#lg+8v>5uTq^hb~i6*ODS6E0B_|4f_&c^1fc0x!?P0f@owdip7K_GQ( zzqz?NPco)??MKm!6vEJWR3K1J2`36IODIL}yIHST!1|?Ot&`n?l~rYjk<$jL3bhn1 z6N?i7U|a8L{nwM{k9z^Of^^c$_Q;P$=jZtii{-j44Zf2m{Xa|4Q&do22PhZy?Z2Y{ zIwM+hEw3WeLLbDfe14bJ*&VTw^O|mA*wOrsTg&*Y88M7hLDY{gwFOjCMFogQyCyPX zeo-_O%45oAPk~oxxEzmjaD@W6dAB!Dw;HvzLze^LBXF500*NezFvE*Db6JN`TE8jP zr_4+X7PZ9Fvx3NR6;v7N0Zf9}!`9`T?wkr0$o>7$d0#qOe1eW`ZZU^U2@dc%ZW^n8UN>f3r!1EJn+&8eVy;&LQcYFIS_O zMHXi2hsq2U2EL)R(q83rDy>Oup;U9NFZol)V0tCm1TN(MuiEkw0SUmOzD|IqEDZoH zr5m)vYt4BHNKq{4w2(HhFO-fMvUW&=1B6DS@ZinC_?amNE%~9sQP+`xi0*jB1qbrCXt__G#nbGUwNE(you_Nd8wrxwyL|V23poBh>^t=%1;<* z@x94s(`n?qjY(avjv7Y+TEwmqE3$t2x(}Yf!s3FdMpMOeD;JtQ#6D|D1d){x7O*J+ z191iuFaGnkFN#$Czp|hQt&|4g%vhsllVTRU;Gr{o6OY zA?jq~xgQ@e3mYj-98Cm3f3R}uGu~AGx6>FXk>$!le=z%ZaOSRE-WQttdk~4lSZ_}# zcekgLG7G}XT(a+GgF?F>D_&Hes;bV^A1761RN28vDbB05`*lLJAhE5>o0WQ-wPsG- zh&7Lsid0#6@?KgKltzZCR)^cPIdMu&@{->Ch&^?QD#;k6NS^X+rLCAfx^QTxO$Dz0-{1;%o z&5D|ij*hPG`t)>-`BZLjFue4TxQFPZ%G{3z!l?doaWwdVA!7%9{ogq`jd!jM}TxXPxA+v{zew-co#b93x z)uo}G0UT2eHNBa22W_=FiVy=TDi(US&n0=ii6M2PCG&T=apA$i)Wn}-*lUY=6SI?( z&A=eQ@85rZ6-gh6{2tsJo*0otv?Z&YpPfxe#wHPb;j48^O29E%Z?37#ZMa3KQ%h_< z?YyEkp~fxCb2u_o+#KVw8p>shSX0YL9snk*r)29LmKK-lZ=Hi0lU15u#oAcMl#c0` znW_#g_|f*aYb2-<$ctvec$rrqXdy<|8>hJ%5h&P(z;vGX&pkCkj?njGn4xkK`CPztI>d%4@OZ|mf?jjg52Wcp=u^a%cB z2)VSTD-nv{b=QDLwlT)$&d$yfB_|JCJ(y-Jj=Yi~A>xu2nkAnAAId_78UtX_+C}~6 z>*3Jd_3*KTME&?Y))uz);vc?!Qv4gZ`EqlCX|I&)!jDeV!ZR$`0VkK%*G&mr_&IGyw)#!y|_DbkW{2R&tfZ z)}MEIEl{+~W$X!S!2 zCH)B&=E2$}Ynfqzu`$U=#15Cq|CESy6h&Q$UzVl zSsh+bhiIG4O^=6*Gq0{*pTUzw-k5LA8ulzGlgvMwJ2-VmVrwK8HAU8{9wifN-rC^1 zyQh9H{CuGEh}I$u(yXl^0pv~<)0)bR(Har$S8!Q{4eU5H!NbEx6Z1o8E2^p%Li-(G zVktwW(0wigp3hqp;s(|(Fhm1?#l~VJm+_>pfaDzA(`ME3Wcf@!;^S!u@0-3qS?|tO zo9BJu%#mC=S7Jg!aVg&yOSV5y?T=%&KiW6_pPrtCh3;3c3-^-s?3)T>rCzIYX+HuJ zG$4DT!Snw7^yQDmOyTwQHSbs(a>No2;FesJ*FszJDn2({#E;P(o(FDWcL-Tw2tyn~Qd-Mkf> zG}Fw?yE_!6t|>(=sjw~CR3g(>&ha@$wKk!SfwQ!+8zPzusSqTQLs`;ccS~}}#xH}{ z^3{@!M!l|XwdbYm6ipwV6}6NRD1BYZ*T0jw_mu@g*kOWq57`7K$=V)U%h|7%R#|Ir zVf>X)em{RgMfAxYji!+1O*NWLWa+fHthx0>-J;%#&!9kdeBbYV^L(GXI@X>`JWVuH z9jrwWj55kHGxie%d#udfTHphq$nyu;avV?8KHg|*DJASa%j&`KxFO?02ET&vaHO>o zxezpBUz2}#|1@msdEqu2d#DRa3r!L;VqT6hNInEH8Z3BIbkAHzL?JHkIK!D}=9JXM z1XeCF#__DCfG&NPqzLgmtOZ9?o#7XscWYba52N6aM?Gchb55!z3k_u&c3T zWsmHCno!R73zLO!8)wZto@`bWR`FXwAN*5M%RK8KnBZICTd}X7ys zMlRzQYwABwdI|y~{a+>?6w(Q-od{5}qlj2$<@*`7>4L)y>HnPQBTz?Uk%zvjHSnbH^CVcos-CosvIz%__1(Gc&L8aFZU9b6rE!6!(o%Oe14zhzE<=BVTmtn z2Wy<}Kc6SzXvP`Cis0Y43B-v$#^$X1*@`QiRsL56nKDsY$M?3NVckRPybrHIc*tl} zuDSH+Lt_t#ek4PnFW6DM3(qyKxXbyLBCPNbF|c#NgC5D6HuKf zXJ9`coa*j_1iFT8<>mrX~66V z;1?$qLV*zsh8|bl-mhJ+*om1^p{F+CDC?m|f`dOIEb)d)|^90x+ym| zm)qDdS5~{lg)^o=1l*5*`XPDd9yK1)ey^^f6XHUEn9YQnSW=vg*56!28iRX(7)tn_aip#wz z!eV)0)?IyqsK0@&?SWlZ5f3rwm>AU}RaSCfh$AHf*GR3qLy;`-BTTeEuU*vF)qU`@ zG}*%V&k9`J+#R(!%5n5QSLx}ql?K^VtB+SWB2@3@!$^u(=L`rz8l$$P-soK?>dZ zm8*H)xI-Wj_hJ3vBF0iNn->qNkKwrb{>$wNSw2>;#F<-cKCxvV*iN9Kw$`fkC`dvu z?ripXrDwt))*lE?l#!Hd?c2kVW~3-Nd{S6H2}O&fQ8W^>p*XE=O0LvYqaHaNKB<53 zD7TAHluakN}#^&va;8DhY8ZP}f!Hr>b#B0~^z5?CR~45i{sZBCCt z+&c9_1$%1_J^K=Jgh}cwmEUWg!Xwn#Dle~P7LbVOZ8f%PaJ9YnAQ>BWx17l-Uv%0Y z18~3PR?qHI1OVf1b>#XCjq>vHjM~4>dS0tYDr|Hf1+;jN+CA*y8OzHCi&@aM-X10M z*K3H^J;{EZUJ+jPraICb#0VGDL*CLC#T zt!`ZbJ&DY-k@ahHuCa=yzX&D=aDvj^u`4P#ud#SuQfymrVKiNdc2vFu^t{3#Q4yM?wSoFSY#WolOv^0u< zQyx@gzaW67#MRd%f3&?$@U+K1_DO_ammji0Ht)a*;yZQhD2h}BP_fR)`r?RR2SZ8B|J zp~v<-7P=`xH>0YoSuL^nJzOf}=bRy&{$$-AD+K`fI0hn2aj0T3NhDi0)zpk;N(Hv? zH(U3?QInXdo5hra%cQ8tG?)sfsYjSw%>#OrRIH_3|K9I+qn4>2~CzDl@Z*^vUbYrM2mfatfJf4EuTx@Lp;`o zF1*}kXfyToD}ysWeY$jbd8lQexylU41OH^i!JOz=9Gfyn1nyRC|D^+%|x;Pvtnj(Wz z_Z|5<*`|41B;hnwJ3(>X5DQ3OrCI%$8|5Dt7EHNlto8hJEUHchw!FTd(9+BUc9)FzNVb5w18dOSMM+>W+Tq* z>zA$T37>0IDh9RmOnL%kh@{l5PJ_14vUhW>ZLh^HRYHS@$(*sNfG7evw!xu|?c+!^ zp6jWb9Hh0=pkKr0Ls;>BQl2o6JOF;aB$}2d;qQycEyM@}?z{col@n8)W2kI2oGVqW zVVsb+yhW2zgy5fg`Anjftn(D4=EvCz-wucBcj9T+ZkOqqgAT*%1vhFQ3U9Mt#dWe& zQQ+!gyd1{7v%lAsPv>HkT0WGH?Y-F<-^XJ7?C}#(4K2+-#VIg(T#YtsX6Z1xRTo~M zg-(&n$OWp-(;C%?0v5a0j265cZ0tGm_j!}lczH;o;0~W|;nE;<)OUSl62TDpc1DAr z7;}nho)e#iUpMipJnm9;9^u?o6hjFd)hY(DU?U_{a5yvP>sNh}hkW^L{-%m&3>gor z*)TU41n$Cw$XjH{eT(B{P$Mh}21df~qMlgZx7Q$F!4E&k;r$>BN74YwamDb*9Bq;F zjT`+A4i3f-8Ov1sRT`dafo(8q@QriW9s&3nNkh$it@L(|`DXC)a0;skU<8QnkyTU~ z-)w!EuIow|O5>|OctC(LW(yAlXB_~@Qf1r!P0IlM!29k(grCYR0(XF9L`0|IB6^_6$EbwDPvj#&=i(z{27%M{r-+dQb1ZS zw+PF!eE0t%{T?KM>AlM63}D0%OahqXrO8%_-n#5G zpv=R?f02>Vm!#2#i>uNarC?zIqw#pxy7PAgMEEj&Hh+GqY`gm&$x8m==A?}6hmd$2 zeuN6DQ1~xI?`GGZ03cND$rES0@%46}fFS`3tW60RN{9Qe!#4jqe1^?9Qfs&!g651} z&ZT6tDo^REWN-gfv|kz`$I$MGi{0@-M>d5?PDl~sqXfIoH}-;RHG2J_mB&*VM|F*n zQThaM#@%s^m9s=ZVmyr0@ikrM8Q&7Y4J-5rwk1Abh)avxc3{kbd!BvG*e_PIyFC=h z6ab)Kp90m%F#@;P8?W5o+ZdcfCANL!$Dhl!Wdf z>YqW2gcBj+UUv3^1svqtWD^+C%)p=vfIH}L4I*jknr!p@VT`I4MlvaLUiN=maKwId zKu(hmhSboRj+ZOJsZ!VOD42Of{krgII%shT_K; zXA1c^Yt0U7bNmw(yd;B790NLmKqYx%p??Pl@3T|vvKYgHhR@pd649+fGDo9MKPz`$ z=^#_RJiD+vQ+TA$PcZ0jA5z{n{l43jVVx51-Qa}p>NM$}?~F9HAG{ib0!d$EMiNk_ zc)ll%%r9OuQ z)$u%rHSwrKrFFv&OKOAy6qOa4T0M=(-`BjT6=!_u5PnK7ayiWd=lm8dQe_>7S5n~W z5W5Tt6KHkc-4E|kR*9qJZpI0n&aB27W7@OdtRJ+)q88{cs=KC z_ZnEs<`qgg6uO@NeDN??)c!)8JsK_WdZXZVoTc#gDt!OgjY1v>gy-X%T=V)XLE#6C zfR{`|&;B|{FZNYlGMbC@E_la}6tnEF%8^DYsrFci7RJ0eS?$Ud2Up@ahFmBEEKYox^6ko)&CyyFT!|FoR33{K-514$~m0d1kGpUN|((YkQ0Y zWUszduz0t#vn7{*0f4rrigTxU12II+SJ$8cP+2_nwm)Jy7bp^$irrHlh5%52a7l_9 z>HVZIM@BA;yzc@@zhyU;PTcTz#xhXC-Md`921xJzsZ_MOEkt|c|B5EDMxzNlsagT~ z?m07jh;(4`aS=ze^`)UH`Gf2>O=iFSg#-wIzF> z%DC#bATnI(y={_u?m@>Sw*TvHzYu)vy%yNH@@Dz5;@)jAAMMij_O|lAsA9QNciTbo zu*47}e80HuWu-<2|Fo>T_WnJzb4qYRn1HA0s)j+PZ&1PKI;BsUZF!;YIy`3G=eDpt zV8!>rmt~%N4z+<;x`n0VU2M;H^(xtp?cWP~hp_%g%WXWVqutZ5*{gPqD2gP+*K75T zAuX3FCUqO_*8DW}IJQu(`1;o+n+fZU0jOc)-J0g`F6A>7a7xt6;-3!du)4iP^C82A z4$nVs_7=Zegqh=yamonP8C#BeNSogFV|1Upn%m{|y0+P3Ev*glB~t~n-^ho6h2$FF#f1G_t*gQ^NzkM{@6h#1?w21HlaLfwy0`&(4f$5|~Ksx3vQ<7jDCud{3LM zZvg;-`-k|)+vL^zC6@Jf?qs3YmWnqXtChF1cdw`3gO1xy_4d2X%mwesQOB#;q-=qg z2OB+~Lm9p2yMptn=Z+^*z-DFfl0#n*uKls`()Muh%6V%~xBeOR!iM*R&Mi*TC!zbG z(wLXE4WFa8iS_Ee>h~8-vh(-(jkk{Ox`oyEN0yhFg^q8^x*D~20j@r~^kuy7g)2fn z7vBFpGE0?#XH!mkv;0InJYYI$?Vw|y=>2-D(dm?-DSkr6u*9y@W#l`7*h@ktGs=>(( z5BpIJXm9Sm5c=_NJ&Ec%^WLpmaqL^>UTXyl94a^+S_-mX003ySN$iq8PcXv1jY4xP zKKY(x)IUp&IRLuKAiq-jB`)tnVP6Tb>%ZFtFAOQJ;F=Z->Br*&8EYc4+LMUv_g=}4 zrw0psp3gKY*WwfWT z;MKBYiW=B&4O`c?wv9yna=tswih;)Pzf0%=ZZW5Pe6q~ZuBSc~Ot_H?37%{TR^}Sl z0|P#m;rBMnf4A;VSPUbF!@EJs#&CW|%ZkJoc&x)9PM+0;RVQT15AB9AMaXTAGhw5|;D)%>0dfSdDCFolm5jq&Bm1&w>3wP9$B#s~dk%p@F zJ+%+1#cBGNKb+CrG(jM+z-ev&Hj?#2dd1e!7zHs9H%!AAq1eB~_1DeGg(`WBeEvZm zsKQifmN2iPsw~Zbx4_;{ORed7-BK9~f{E-R1vynUVaU9_KMpA{u(ZDUrxnQ8+E>mI zuH3&|ph;-!HG0a#&YUNH9vML>zy`2_n}$)tk-it&Y{+P#4+uL>jO`g^hN1%HnDjhv z-(RMioloLpUKh|wY7<^=CVX*FXhzj!Oyt_+R&o}kAv#m5?q1)5?vz6?p*JeVY`<*Ip71E!4>oMsbfj|Id8f2-_mXow53Yjk4x-5U7(f8YPw9Y|KKKV2#;$K9nf>*{D| zn6n{R5BK)angGC!W+%e$h66f!ts|=6%sJDiW`*2KFY$ea=^0I@-Y(t-Y;9Yg$EhQ< z-QCfCC+s|C?SvqyX^XS<)z?M3ZPxlu6@u4Z92lr8eFN`9W6mjxXb z{RATcRB?WM8Facc(ayq*8OW6S2-1AZ#BH}(&%W=Yj=uL-BXh8CjE)9sBiAvuwXGaFW2+BI;#`ijMaNLVmwr zjL;$Kv{HC8yyjj51hoo-1g9e$MN>`NpHWZIjrkh-9qJulXZvsk%l`(3)nq4 zI7xeVM9@r%AIcvyb>ty(6#9jLB6vSb8V^qx1}A#;@XhyrsD3NP`|+e~_zdt(Q#A>6 z^0afqve~+pbW z>v+bvCvmO*n@UGTyr@+WboT-~PPAp)?WIDui`q9cu^N$MN?0H^v*q^(EHtWuGzL$gKqJ@lb>GMQ!=VXN} z-?-V|`g#umlIR@-@>JP=YcAn`lVYv9EC)EazbI_aaWh6-_ubf^J(cp>Hmz(a6+ReP zz$CZge^fFjLh(P^`2Qu1|Cc;AgXTWW9yFcEcC5judQm^#-X2~#I01~F7^tlVmKrPh z;R}7TRFa-Tv4QT*i8D7b1cT@UU~w8eAY}&(Ek}u91R3IuP&7aR_Ja^|c(*t{Qr$~S zb7>Q%eji`RIaN8^{6%&dwI}LNz!Y7#iz{N(`~vi2MbeNDHt{6|$(pKj{%N3YL?+Lt zm1axLPxx{wjelP-9&9knxc`A!r603R}aDE6?Qz zll)sU;YjcLrK>)~ew^Z1DkR!92Shv()qi7d7-$lL4~D4VkoShp&v`U*4>GT}LUtdw zqI-0{)Z4!v?+*G6DVz425!{)L1r$>GD~`p-Pm+))3>ou8*RGsdP~RqJofSbdCDv2l z2@HH2s5T-NOS~O9DPsWt;-;S!&6#{_d#)yH405t5AKTi1R?qWMSI#KYX^<{ zY|HyFM1TGn)d~{8IO)paTMzhHynoS18C7)%{jpl;EUUU}eK1_8w<*eU%Qbp-kxTkn zt*`$_ScFUMW}$a9z%1W^<)#vCuGa_~e;AJ0wWpHgZx8Z8!! z*rL;VMa zqeF?nFoU?93TuSCt*xSIS~{IhrBWlKzVJwUsQphwie?X0I?xsU&s|Z**xnP7eWR(v z1M-|f_K4Ev(+Opw)waFn3n3U6xKw+lB{|uk^UYNg!j}Pn$YX+;)yN4vhH<$}o5$2^ zRyYz}fvvsr#PLqbk9I~TNgg;63E_plGM~nvqc=GuQ#gy@P+j4m<6XI_XOwb0Ur=40 z424Wir@y0v6NFSep4~no3SB2(w-;XXku6L2|Nd9&Z~4qpKG3tfI~C6!TgCv8DDtm9 z_q(>fk($l7I3h=1YEOOkt_!|;|1WCmiWKay6qOaHd)qRi7E2b|4Rz}`MmmoTjtu2B zUM~#2a?%H%xc6^P{`n6fjTSArWcDbNBq@#8~i zPc2qUG%3jxpT?CSKyTj&rj!ywBuUQ1dt7{HzPUcw_L^(;4Iyt@a9XYYL_lL{iM)I~ zTJ5n#{PCTA>5c0=?T5X~*SW4#oQ%BlIU{)jwUUyx5X@aGCMHo*k0QT$O3^;~f)u zR_S&RdSai?T$OvD82j6E^pi`hwI=q$*~sd(g%1>op+MsMdnYeM;4i+A|I1f~f{L+R zWNmvV{%%D3@fQo9+&*F|cbUe*dlN`YkOBp*X|Rv>MLYfJipKmuZd9^+IE(ifH#)Uw!wzCK1-IT35TM zc&vY*bm7tmHm?CZFh+|%^Y9&1)%az7BZOo=q}4Q`WcmkyAV{k!XPh$5bd507uy*qu zwS`MQ{Fzlnrnq2z;G-X=kx=ILOBiskHBZC>lUN|>(-Kic{e)_7YnEX`h^ne;e6+yU z<8Td3_8;>sxgP+2eo{Z&7KW<&!!t>8UO&hTjJk% zsIcCF7nYdrsxc2tkS(?5<(0S~RFl=9PKt*VZpxzjW>9HGSdUm>SEh9E@NjN+grGcA>ReWclUhbyb!U zv#@QMO^xeGjX!w1$CFH3JjQz)E#njE0=J>Sgllre13jw8A{=Uu0{~2l;5Opr1zB6x{0-?!PU^DuQ+O_BCaO{*hF6184Ex z@dzcbgZ$g*y+%Un0wok&l%pX*$(>^4ETv^1rF#I?3f&%g0}WBGDBp3qZ?zyubH z^tW|ZAVjg?kQ6<^%a*X`KU}|I}ZFL%q7-2$s!_eE{X*+N zO80n-Yh}#xl$lJZ`-a~*IeN4%vbbsFlmQwo!0~wVV}Ap_`|%Z@FaUn6H!(1hTv1^= z-W@a8BqPQOBSTUB^pIBIFnTq5zBg{oF^-QX`y;HxDal4@>q6W+mR`Hatfk0CuLS_W zAiA^8_WR?ZFtQgbbbn7=7X$+U7K`LD$=eoN3W_Wv-ArcOYLSc>niceVOSIT26g#r{ z$+Ea5Fz0-udNMhD@?_HQ*EKDp4<)K<$;+$Wx>b;6&S=m-7D|HBk^+oSA~YUJQiI82 zfcm&U2(ggk$+MXiJsBDpkCv7dYw=JdMRQ%YXk4|J#I#Bwgj7q*R=XaLVp#zI&{SkH zNv$TcEJ6Svl4OvM_~O)QwHOt7cAr&MO(YVksuDs3L2x)627>_r5DWUo0uhHh*X?q| z{KH{Qu$dHD7OAd_Mw1>7k4^NR>quku8@g7tr@*gR7&s4-bW001>jRRBZ;3FBq~v zUW2AmgFJN%4EoYmt7OJ}Bu*^`Y{NWC5hOIC^CG7hjOrRk`8HuRs4|2K?4mEIQW57{ zgdtx_Fw1$yDKRCG8VjW-ZL&R>2x2HmP#TO3RJ#{>EcyPhHj$uKt5j^k(YPK|d67%< zPpWR06bNfv5Ud!)Rbnv9R>+2;M3Hcg33iQZUYBgetiz{Qc@3HF`a)^~;xfAsPw106 z^qP<;qI8NViV%pXP!dg$%Lc5bsVE^109DCoin~pMMb4U`vUo>v#eAc4CZn8ls%b1^ zW0^4-2?Ca7@MhjgaJlM##${)^6k5hUa6=nl_7=)~o-Vrt5JDK^nN-J9W%91#L_>6q zawtpU<$IEIo=>-A0fjt}~)zQI?Fh`Stm&(>6~;_4DIt0i$F*jF^T+MNlkP@~oN} zz}cTOhVt28&GL@|Q|~^@qv&cMIAx&1Er*jdl%#N${T%=R0px&PKJoxun!I`Ho=neX zKY#k0*yUk*?*O1-YS-iVsbk1TCgiw&>Yf-l=le~-f z47l+sX0u6N<}=0^V|@7qZ|=-1sy4)_g6o&_H4s8Yd57#6obz0(m}|{&#HM$B#T3}z z1Is$gjb`z#BO45QD`{A=DwIQc|Awe6-fEzm5?v?H<+J| z+AEV8(XWE22EDP6Q^k<;mXe+&WVytTD;wo});$P|xXX#UH;{L7}U zVO1lF(Xx5lr~m1D-&CVfC`gzj|NpOi-h1b#zxt{Bt%@?v5MTd1qaWSYo|B4L5Y9wjW4D zCySSD`|`sZAq0AO_-DU*CaG)KQhL{lir@Y2xzgIo?sFY$KJ^bwV|MpmziA`@j{n#&GK7L^5GcWCA23wBZJk8=FlR-Ft>dNfz<>SYzl}%Z zuRr%_k1NwD&~+(btjVZ-Xm;zCH0 z{!rBFF1hW_^%A8s)bHbe^ri75FZ^QP`P(+pBJ{k^C-m4};iZYo;<7$KZf(U`wxS%Gh?fBOqBPg2oRyrQ8%MaGi*?qAw2x?81^_sn&WmasK^Tw6jYgx4oWQg6~{FpEL?Ht`kIAxi|cc2#!Tzgiy9Wxty;Dq zPmq+t^2)`HHMeiRTV`bABVT^__8Ja_vIX_^4NF!psrQyF-L|pT>B?WSxJt1V{K=pF zNrA%2D@5A(B8P9z&|$R%r744I+s?wRYmT1tJuyZX*DRN?d|O)B_;2Sp7gC# zlYkrYG`c9&%k0D@S83>?@xL^&$d&3oUAs{LKsLxdi}x>XPHK`VT>!c=Cn-p>U7GeM z^;WF$0sug9Rb7T)xbuqv0L4}H(-iq#6Y6Jw#u(osX8KFJH)m=DulAZ(Y3K^=&fGP- z8*^y%U7Xh}vUryu%x|A}cXyjiruWAXP)a8!Cre67-gWo;EV9Vr13^YP=We(AiW2>M z7X<|cSsI!}7FoQb+-O$$l|>d=WRXEO!&4S>Mz*YR7FpaVH=4x<91y}-EEWs~-=m!` zDk_@olW-%)NmeY&0?bP{3J~O(#gkb<5JAcSW7#G30YW4a5d^_vvAoBGFNC_gy9)~o zGm5FMuCCG1Q9+pVE)WEvva-_Ua%ERS7V{ya2=YK222vt~kPt>G^T*VMUYKteGKVul z7$Hb0xty?Gw=3eMXFfuRb2eSr3N?>ZP@?OE1V@K^hlVMHnyM0(QL%ACh^nfL14fCi6G{o=fD*zOXN+M%Xg_iw zKp*;hlolaB6XN~$5rh*berW_2W zO0-g4C(}U$oH52`J%VS3nu4o;qiZVV8~{!!(FwhpIP!kdP9TIBB_uPF5M?m^???=q46=n?8>nj0Z`Ai4_1|W(`phccDva?lHkG9eaf=hTq;@ZMkzEo!9=ryxuBRN{Jt_viUQm5 z;>%`FE*9j44a*E9%4LgL7Glv5!v;mfsdU<6wM2p;t6ki)x4EunfhRv7XERx4aUug9tOmFv6of7o3G<1DzMbfj}%B8=Fj94eIEG zx@zs>&cpjudx8H#s|p1S)b5eg-FGiO@cRC~?!HhkBwFCH{d>-J_8mWRJeDK?Dm8Vr zRTbWNA{F~$f@Z^aL22tC4s3YIT&$SQFuB-fB1~V9~IqqDKH%|fS{;sw| z$4`e7v5s@Cy`5)v?>>6Gsd=Ei>2z0LOLIG6%s0@w^H2-toa*X@=Hu=Cfsq)TL3a^K8@cQ)d#X z)L{Sc!9&NO!Kj7Cdj<#h?A{+w2Y>zZUtj1So}3Kp?>`$oXC{l?Zg<-4HWKlTO!%6b znl+{m^>lT0_qClo);{R-^>wuO4g35dT}@65oTf!oVa$gUEg1 z-HWRnU1NJwY6?JTGTI}fEsy@+$A_b7#<0U-#6a!r8$pnDpKChN+$9LKw`agpT-bH; z;8+4l2yo6!CLi@^ zHdU6oFLZS&Ie8`lzt0FMWxTk2L0)c-2-S|3w*Jxah%b<$B;cDE9Ub$HP2`o84s~=b zT)wK%W5Wh({o(~9y+bHVMzgpfp&o)rQtukqA!o^Ss%7Z7&CL^@O9iq>*dh(vnDG^sGNA^K?gZ6E9wNp}83?Z*OWsJaNv!+vav~rP6rwaB|2vSqu*kn@lE$!||RQ|JK&lnwpwS zZk@Kaws1IXG@3F?mobJAf)G&35XPBwHHSF~+jy%Nst_-p&!c{NeLzZvOeFZb6Bj(yZT77Vm;ke+d|) z8l&%zO_jx*;P?9ziNt$MghyyL-OTvU&%-#0F@Dd59%OOrlF=+an8?Y=NhXu;#hzDG zRLtb1E+{Ct5y3ng44TC}$>{80&>7*5F~G7*>H`DLxxrvC7!2>}x47};nqBZ&%#(~F z$bE4XNMZniPAH|!A4%8b358DKEl%uAj1A`iA(%bJ-|O5>cJ8vsZonJkMghPGi^>E? z5dpEZrdpv@77E|&2mlBn2qEB%0|)^`h>rUrIW~HtC3ySVT20e2#sF}}078&4mZhpQ zN3= z7FoRWC@Cp(a4eg<}E8ayT=+A*JbB#29#1=*WZ~MrCDT=#S91`^S*aJY#?J?#88o; zK}52ERg4gPQwYUSJK54#T;%QUjx$;F`Ga;dwAk$;1P)I@Zmz4V^McV`jOh_9h&efK zgDen|Wxg&F?ZJ)dA35h(5ClPh08pY6$}*nzk}NSoD5C&kSrXK=dY$g~oO6T)Nfa1k zj1odG@)6GbDq^JR`n4V+N&?~l5TaAc000moQ4}};2yj)?XR;|n2$3KnPBfift&5xk zK@bE11Hd&^W3viGPiJF#vy8SV$$$}^(6>m~JasRGNDwc&7yu5SD2bd=N+_6m0^l4f zMuVD6vCD^%a}Jixb?Ut!G8kmQNLtlr)JhN{1OdI+6I>J}M)gak{sxvf&m_|193YG(NdO#B zqUq$io}U>uNtPhz003Rr=VRiY9?Tmr=YY3u+qQi9^2>inr_RZH6D*!EEb#1cKNTmt|tRs& zJ&!;B#0#(NCW@mp&kX>SCHjm1_+e166y~~O{`SBB&d=6vy8{z#*5k4-oi9B0 z(rtZal3(NwT& zD0JevAD;}EmQ?0VkrD_+fjsr&pN?o^Nr7i3{=g{5{_w$XEPeRH7Cr`6qw!N_*nI zbq!OA86nhSz6-hrj!s|2lqhZ%8a&Sm?ZX&GSnpYMRMFBG#VxKmWYHx$Q(#TUk}DQJiMw zF6jopNFm8*e-8nK&_C3lf`TGTjIryf)am#8Ef!1WBqM}~qPS3Zr~bIxj4Z%U`t_Az+R#ua_1_Z?~OF0EfC8N|MpL!n4& zQ=Nh_o*e2refWfuUw6mqMc14F#;Dy}cF)#(jf#9?@2kDOWI<)avNFp{uOBp7jBZc< zily~KXAgA+xuB(1Zrs${a%^BCxoPVbk6FsBe@RfE_~CEA{P^?L231XjcfbBhP?OfK zUV;&V2qJ{^_{6KP?Uh{l`sn%H=c1o~XocCB)7Q~_=v3$GJMKw#AL;Njqa?1neWP8O za+qfnEMB)YM?LlO?)EQkbiMrQes6XC;GvgK`0ao9XAkXuZMSJniyHs{AOJ~3K~%lC zX8o$g28^cbFe0E%Zhv(TR~)OB*LR*fGd||4TD!H}6nSmeaeIFLXw!k_pks42>Tf^2 zOHQv?xy&fRX~KwPQG5DlzbUEBjZ^QkGQ*+%o)qPjs3-ToJft}`tzEQt$Khq`mb9Ka zzxjb}W(W|P+VtVEzGEj&V|UG_<({X1{))4rsHSe2Hgx)Ym?uUjlgTk^bu$QB5AA3H zxewg6f=&yVqHNsq;9aeI_lTZ26rZUExuWo$D{FTXWmeDh@bA z#=Gvn-;1>qZ@e}VLw9YgdE@m1IVDwVmsTI%w{J2D?%1-$sbGH5>4^JVT61dZTaTU? zNjyAwaz7W0Di&I|KRIY<_{Qfp96WHUaqWi6LU-ok&`9qte|Kb||tcve3c?>sUR z)(MB3@7?A#iyQzXN_~5O*CsFg;kQ1n>U6y4+)F!JY-P)ql}fL@v`@-$*(5Tac5K^F z{@QbUB#+A~kO|fP@Ya>bcfT5d-n%!}JoosEr40p1&Ct538`-CGPE-RS zWE|);^M~t{YlP2AKo22=(+Qgy=S5JfR3C&%q} zyWQ@hq9VWFp9u!P<{VK%bV3=WfTd5J>To#a9nZd!MyPN>$umECB9287vjaQcNHA^J zD?8H=!D~MgrDBsE?QJ6y;hxS8e<0A@(%!t|nX@4=(s$;3M`ughg^{kaCwroLuzTO@ zI}e=crNNGa&BKB)-C>@NCIv<09HQaoeftNPG`jEQ!@ZJ-0RRZ$(azQomCm0z#gM#c z+4A7|lP6lbPM$aw4fMXcuVtj`?Ad|nYpdZ|^+mP!$@caw=51&jW(;Q?MtAK$sgo)7OMG(lWaosU4!*YMRMVl|qPsN54EMjjuWaek zQ#)VjA0KZ$-#65G_GE8Viwq464mY1|Z`twe{+?KJysi0cS5w!xoF3YFsCU`YMS1xJ zn6oJc6Ty(Lf7jub#$^qyZ#>=X<9%n3jgItgfAy6edyl;M?DI#CoE!-ReZyUCUE>%} zv2M|L$|M^YV;GZHo_Zm#D*v&6{!uU$>FyoqYB>wtIXiy#>#;=SLU&*H*;bh2+VQg| z2Sa0fb{y#I@AHRz2X^cdoX*qxkJ_InN>;0SUAIffiVF5pX9_bhG} z7-OMOXkubwe0)3@49+QRkrGYSbR?jTBfC4t!i*73Cj;l(O@$>A*Aq$Ao1fFu-YHvc z=vql-AOMV#bXuj9GR7bPCdH)dny0KhIocggBLq32ln~uwwjd59i&fG?7e?bwt316f zIN{c94=jG+mrp+Z`xpJhAjXHfgQ&dFo=T-ORZVLo9Uj?t@RUl3$!HiI99DH5Ai-vl zhem@1`8kXdv)KYUpJjjJjOm?cPabX^TfM3#Fw%4ERGUh4i^VwDI}q><9XoYSXC%|U znvAzKA3t*PtihE>{XM;ty3Hg=qG*t0UDG`!MUk<=Bmp+7X{c{d)isOB%qX2{3qqi& zDj`Huk<(?OY0c%fj!#TPB2geHb}Jel_A5gAbZ6wwdpG*eH^&)*5U8oh(S3VQoN9M^ z-6OrdSTQ2bIhV{vtm&w#D(75lpCrqYz$b&jaEQ7+7Me=aSz9`lh#uRwH*L+yb6VRD z@47G%A%rV39rK0Tj_m3hk1|F%gb=bsjI7?Yv2I~GQJFymuELVU=mlSb=N9DS_}GQ< zl*@K$UUM}(ettYvlIz@b_om%1zp9uGT^G7y$&}S<8tNamIPK%3{v5XpAqY6v)U>8) zMuSnr0%6qUa&s|$w-k6 zk|63t6ET{Y@bl>mM?@!9XTjFnm+aen$X-;IoajvgW#c_}pWpRD={;YFweQMpxV^+7 zba%9e(*yzt0H8XlTD3v;w?6yQD=%)}YxjEEPPG&)S|~7zu`CG&r`^oew9Ww*BuO+l z>?W?JkZh8$7MP66qM)hR=`@kFZjkBdc<2Vn*PJsv0l-5^7)(kKLP8m(EErcSJiu!c z-a?U!1rc&eD9ie8zg31O0Fue1&*!6b%B~WLM08!xXi;OaSUestEiJt+J3i;>R6--r zYBPm=6I>8EgQAFtrctc8tWqeHuviRSA#?k`DMnz7fi6St93V3yP#D3$A8)VgGc{@ zCKAb5%8}~``y(!|8%>3)@OUJc*12R*tY%|4;A2>X5K9;UQP$%ThD89d(`841jE@9z z^1T9J;b2%Yn`J~NLoq=VEoM_J7NS{Wk)NN+TA5OU)#y~JCD~iox^p8&% z>~0bZh$b7=Rif(#v%_Q%z*Ha)hy*7IKoBBD!ii)G$!4p9qR}LTP%$fEf7s!1B%+C# z|GM(r$#5`DvD0CmoCrERj(8*?%a}pQY%&mCudc4X=Ek~WhNt-$bFXk5`) zU5+kh&1Wq2bL;!Hk`N*+^fn(jaelOJ^``og9Lo6h-+R@zu65(=ak!~5FMJ-GIru6z7x@!ms1ro2dDj2``@ecw7ON-11L;s)|xV=@klk@p<K^{^-GJyHWCDsYzM2kn=6hY&=N-52m<67w>jC?-mo zgpoml1__A*7BPae&LYZKX;njBe$ME)PfTbF>z3FJf&9`1xp7imReI#a8wDomse{Ac z`1Y0)6RyHsG&vaDuzuy}3r{Rwe}@tc5Y9iyk)fP(tJSI~$~83u?^uoaXf$fG*>2?M zS5*}ubaOZD)kYwrHOqJ&%t(xc@^^Ox=89x8X)qXW?!j}Z9wQdBTCMLQM+YH{Mx%30 z+e#@_Rn=%T-t_+X{r-23jAm*vbx#lom`*66G!)Y|)mkBtr&(>B>oOhfOO&rJC>HRc zmfnT8Ev_mJmgO6#fDpp#f5`Qy?cQPpCS$}O<&*(RnNBI^WNC#NT`d&qI<$H> zWd!CX@DUtpa=j^RtX>gcYf&OGa7MdD!BK)d%0(Zgd}b+P4hORZgf@%%Eg82|{#f4u5X zAb8sX%kW4{^jJPtCI5Jr-=1%Nq~3yWrR9Acf!zbH1UVQSI z$V5-!+IxiLNJr0Y-#QJ-6MEm&bD0kVy6ZG`)zCLueasyJvedK zD)(pW&9#Mw-hs&XU-xO55g3n5TCM;49#6FkZ(i*3_eNemG@jGoUMTCwMs9V(17kd% zrW)lsF}u0|5k(^KAC}w@bjMl*VE)&N;^T^7?C9 zT>ZuI(936&k9{?NPjfoY1`qZmQMJY?eSEiXO^G2K)F`LGYK;#Dm#+41%$uh)1d(7A zBmeNd-)>y#8q>>cq_3kt`jtQX%FZW#=_)IwDW%-y213sIYPUa`YHvCkAJ!ZNcVB#9 zkNwZjPkiN53!i&=Z~cZ&@wYA6$^KzAe;rIi2 zLRb^h34NAR&8;YaCDY{9mWa_JdhPP^LW9*PmRjkr1N!<~n7Yg(7?j6VI2IMhW70@O z91aTYqb!u9SEr#olK}`L$ociMI%kX!y?Ei04}J9h_}D~c z!^%xdt5ueWq5RFOs>g;V1W5)Ub#5?dHGdi}CZzOr7J}+8W2I96ahzbS8Q4NYa;l$F%ea zGL8|5a%jKgnABKHZ>+4yyvidE#yQl9WDo%W4F$5QQDhNE1Df4{EHbpnFr`mTEi_4= zUX`=C0Q~wy^xQylRgJB|h6bWc;9Qh$Z3`|3l7#N4vzJ-~k4*r8Csm>g!m4~Zbqm`} z=HoZ25+Q+n07uhACtM4w7N=hH7ThZq#DTMi61Li!A`9c!t879DQpzFZA7poZO6ln6 zXht`R5L&%@^(7bBO~PPjw0@C2R~Ai>Mya^D*3{mct}Zb-C8XJuhbpv3kEj0Nc6;2P z65bRd=M1~Y!>zcs+Q6uxuCdDHaw-s54c_&&rv1(St@p2OK6$u#zqamUpU(m511EP5 z^}Dy+xq0@906^Z-V)aOSZ0(ww_+-S9S5UdA>g?_ptp!!<7PvD#vsoM@+2P1>+Ltw2 zCF_EUe6!UiGt=D2C;_%avpsffbo`K|@RO;$MldBl!7`UD%hD%n zPCYg$l+X!f`DX653)Ac)#25hpIj0;z43UJx|M`=>6>_-YQ(yK1!U15MBLDzI8Qus2 zz!*me^67|a2;u(cpKg5kGcK+J2q~o*t0m{`y`IhFt)rMSC5va$IC0K(UC(&k3z-z6 z5CQ;VvDl2K2xA;TfFR6ddO#2`4$zzQl2ZmSf?(QmH&>%mrmbmr_cwETPXEm~2M8fX zDF*;!0RToR0{~)-GOF$who{UnGp$1i8KqbNM|baP?H&LKHQu&mWla%d8~{E$ec$CB zo;?CHW0kqAxj(i4#sAoBy$~|ijOTw00{-y2qKlruIpqK&=#S{Kg3SWt5a2fl5YA|? zuGZGgBplP-ri{;68D={?QN}p{0)mWj4grQ>C`{ZYLBs%Gl2V3q0O5F8H=D2#PrcO4 z?UZo{0eVMXYEDb*dbFiry62QqP1COF5jYQwkB@u3-fLcVbE2340E99KfrybLAW=YR zRo4igVr(IlMev)SJvKNxT)p{=i$LphO~G}wu91P>P<$|6dfYL2;rMXkp;hh!qlH4x zt1(lN*MP@?X=|hF#Y62?HA}Z`UQG!BGwzPHv^xH2Dy zF7qkDg1|XgbH|o7cf3hf5Q5WApKwk+%nXPmpj99K|DqgWz={|F037U&U*#6?7FrI% z_|jsdT@l{yDIN`LT|PB4jU0din^a_-I`H;(#e~b|7eUbPziQYJf`DJ;SB&7fk<|SS zwgUSt%9AqA_g(3gXV~-gm8M&;+w*e2XI#Kg7Lg=CG<8bwSpxx!3-dK7d7biTYi!eo zH5S2NS-&hdVXkagbow_(>{xhtfA@V~zBBF!T^N~&`r=zZ|8U=b%-aD2vda6 z=8InECbV{2g^{zj{iSYXslW9rYZ|%Y)ZdiOyo0(?2;yln9-<-w<%;%HN4K@O!YN|OfZG|NUDW}2<+k3|Hiai(Suznvx*Y(RS@|QA7H&8cb zt|}46*fsle%{PJ&-o&L3A=GtURn;q+AThd>1=Gk4tr$(yuGZGu1WnU!`oVMgq`bo~ zb;U`X>(XM3WtP)T@6U~_&-u9D7ud1Gn9)-(05PGW(=5y+Mqmu)7Zu4C=L%0QV%mCd z+-kS2vk?hZr3jYu*Fyjn)G>$*4?O&k3M559qQM|mH6VWg0I=t^mnLIr0F*nn-iatE z%gb5399jkam8K?^Q&zj&{k}KePv>a|GgXP+)FfW381>tf!UsZ#umCxulwNM4%9MT* z1pz<=sHRb1kVVD;BU+}C(hR0$b_4)`STINerHnI{sigxTL=XuWYC6G!z$tkPHTczZ zrU-(*03%djoD<488$9rGB>%oG?TsA^miAVPo=u2L>wC}9WzNK;_IfN`J_4iHo@NNDWM<{(567(@s; zNKfN&sS02ogZV344yPT3YrGGr7m4ln``fE3}12pIz!;dIu* zc-PGg*N7$I06`#&5J8aEc&5nI>`n1r73w+XMj07pbma{U0q0yan7v*z001D#>2v}B z1O)>iTc!gvGC^o2o6|H)v~jsToU>KyH)pb7iINBb0E(P>`e*;-&k({HRoVwfF`7su zGPOeh0Lf%BFE4L)0N+Ik@c@7TKnVLUOn$eOe07<1WwCPYxxBu8gfQ+raX9VFtFI`< z5Hd;uLJ$DP7=%a=aqpRvO(bBOmXIzj!V_iNrsy6aTv< zUG5eiUT#->;jg#B$G6#&)4Vg}+#k_?xN9;j%YVL9{{E3fp$R^?!BcOAM_NKVhjb|6 zMkhShlVWc3_tu-f_iNvmK9QfpxTvK*{PXaNQqgM_dWTbfEPZE%{J-|aYrWzlYg`2q z}jv*4+N{(T!dvRKpt(87~<%B#P*YKghBHeDDAvv|6p1 zL=0xLd1Pdyyu5r?N_Gg++M@@8ipTV&2Gc92C#|{0*AGXFoWftf;QOzSc_MLLuo+@w z$;txhSI49GEU^bh6S~z{K+~sU@YBof^7Tt0lw*+Cwf(hFXmas}t)Z?XeKG0&t(%8h zc6Wvh6%Kjzrn{Ea*Z%q+{(7SEqqp6$?Y0{D+{riukWZ}^h(Yw=vEk(nIWIi>9CLXl znvOeVW&KA!ruH-i{9(5xhjYN0-qC!ru-E}L!t~(t&+Zl-?sXeCSR{D;%ae2B8>_$= zSPfhm-La6LiS^XkD>qK2=}3ahjJ!0=fAL9=P65%FBhUD6A2Rk1MgOxUeSeiTXDAtB zAbue-B#1Z8@L&XvcO?az&@-A69ESh3%4rc`ih#xn^NLE-f4&wt)R%hjc4vAlH5nl% z`!ySoE-B~cvP%E-iGnvyMV@PleeOPQRXVw&C%t%yxNib{`%c#{cL&xj^FS;tuP~nO zN@A-gQC$={txeDguCFcI$^)e6g`TbLK&jDfVy82|!? z1_6YUx@I)|WUGzc!e){AxZi68CRCiza9qW)G@6X_w0==BTad-gQ+tQQVZYz+_xmG} z$mM6$;8-$clt3gsn$&zrkWA2gyY#txayC?&U?TmSlcA?ihFXT`=)T1-J@rZwo21D2czkTn>A>yvwxcI|F@lV7lgX^7 zlPxC>zWT=gSenc_aUtfhGiUqNbTpwVYi?V!eA$xQ?_9j^#TR>qCr#EVtAb9rJJ;d! z1Nkf2zdEnV z7>F3O_a&Qrq|z#dOJSZ~$Nt0p*ZT zc1wE;au7}EPaK&1@BNdn_oM&-kg*HHslR(Q&>v^-pI}f3Ks1dfNerS?nh-+t$*@%C zapl?H6cZ7G9~_^gw-uRs%LaoX<3M_ON}l{&MeYpz=DfOXr8OAUutnsIrwAVnsCtdb zXqHl=;oQceU?B3VBZ+NG%x*ckJ5oj9#=#KuN_iCB!vVogI8kH@L1 z0$>0DKtTQDK4)QRrpBGgF;pue!1Fo`+e`{K2IzTlZ zvB)WpMrbHWlM(e)fHsyG&V@m~Q-YXA6Qr)tFyu?8bO41L;(#CoI^k)Z+ZCMWka8u~ znWP$FO#|tO%4@ySWRkBeSCB?0)1b=Ac1H+>Zwhx1fJj{b>Hd%{S6NyhZ9fyM5=n7v zy#-TTO&hK|Xs`gm-7OH@J;B`_1_(B|ySqzphd_e6ySoQ>cbCES%==ZHQ+0Oj{sXI~ z*R1aQvFolh6)49H9s~NrP^bNdN14DwA64&#g3Y6=Y2JsI@<&o|9*AxF^(tbl-ubu| zVO}#_8u|G(r7*wS_DfgGJmvTAUp2p`Qs*r&Kq1`eHgAHjBSgckN{0b;>Cwvh{4sR` zxa3$huCHpE6TLE-eek@rVv64LQADobE6Uava%5~9%r9aGl}eAl8uoG51BVT(?EyLAldoGQjr1t`I~MoyySSF;M&)$I94t@ zXD#cbqN5g>cgSFedc}y{U839`w~#^J;+rROdz({u{lDz1OGZspuZlF5cTnbVzs5^* zhWreXP0E9myimk%ImD8AjpT*!&`wb)+a1gR#_o$4nX{4D(JFkpDU@Lto^%tkL`DI+ zOzeG?(w1z)A*jkf+Bs51dO?cS-?sTr7~#d~8Yx(%V)FH}f^^~4%9QO#iW~o#i})*m zUv)KBvH>WtYWZ6tZI2&IUYC!pv8Nku6KAfTeY{7+u*wL~hM3gK9m*k*Q6{<(x;s?9 zu4ijJ^AU*xhwCp{J68Oi3P$`XyD3X4Hk@N8G}Q4%m<&?48;X}MP3bLuMCh&zIxAT!R>Wf$f9pRUo6=kt#@&kR&pA{V9cOM*^H?$qOe z?N!8TsEfMSZ88#w1+7d*RB6Ao0P^Ie`Nse~hejq$#0$^s`P%1FQ0Kk;vdO0XZuWG^ z#(Ep7&ok*qo(>EAYiiiC^~KQ3u z)l|aziYbZeaz46&4#Wm+77?Jq4)`uVaXi4_r0#PaG`p|&Y7EvnT&4w~aC1}v9aXpi z92`p?u_W&2`#mGt-Oan9UX8Bx7JN`)*nsi<16gL1Ydn$VAi^wBC44DduFi+Cz@lSv z8FAmA?B*dsAb^YMfQu{{4klUs7TG|zaSFhn)ex}H6ab|+QJlj%_%rxR=?wzP?-5#@ zRP181jb(}(Jysa@@~WLEQs>Zxq$?D|5@jP!hfIRV9{9XA&mOJ~EznNX^uMLv844Hx z>^wDvae2vLyHd$c-vJ{IJlEXSKw63kwjx{pz)5cFdV>F=M#k106XLUNyz*bnL2`7s zey47K)=@)g3cRqz)f$gPRhIR;Zl6!6q-XVnNx0^TO*k_F6jFgZ3p(9wk4)6xyrO3b?oIGu+V@}<XByyE%W8UB%hm-6~F%TX)>|P$Le#}|h6o9SJIoa~tr%l39)75Xv zxKuRPV7X>P|9CHo@&5ifCg*e=rV99b6v5Vttz@xqT$3Gw%fuJ|Z7!w}z?w8%8(0py z(K-I=MF_>xorV$2*5&>jb0L41ubtqOp1%A&EH5wBU6u*wjf7ln99zc{_rkX02FTaM zWiV4nBd(0|FlV5BImhwY*jxI`7&9ZZM-3d6w2nsU2}aEV2zV4e)_)vHmIU=1;*}sh zgMH@MQm5XU-^@ox5S2L&J>-DqT5%o8Mu(?UR&P)1Rin=yDKVjx$uODetH=AH5S^l zh0(UihJ0&1nHqjvtIELaftY*gUN-NUjNdZ~>WVG7YZ-11Ti1&;me) z5V&mJISjxg@4uyu-6vh$YwiaG70rR$rO&;cq-HQDSMDbp8U{Sb#Yd=S>f7fyh57c(tvhPH zalx#D(vqA&)ri8Q(kzQ|`Vzn(1jSo!mh7&-=)01*v2>zycmTCzB^bd&E7ZF2EMb?x zH{qrsi)F|}p_!5nX9&>byMeIWGtkToa;Hg-948@pDAlX@2?Z2uXQ3`od$+?Q%<7t? zCq}EzLGN<$dce)!%)ZzGy*NQcO475k9aA2!*7(D@c z#`s$~UfZ#Z5%aYXV+7XUU&xCt{%>*HAV%!ogwSb)`VMl~E>6|{B)rqLMiu-}KRD%Q z50T;S&xR5;6_W(exW&P>opCank8H*q+8p-bPeb zl+!3w^4K&{rT}7xGi@0@v^#Bn8~s-TG=&CzwuZ}C(!IHs*o^g3wgg13eKiPUKjiTp zd3rOZRLvWHQaC0hrGUUw8(8%F#7x6<=*~8;K$_k`^5K^V5jj@4 zNmnC#g2qU$5OHhQEIt}8-uI>4U0IvVvy)sQTzKiLxPn5p4B7q8M>#3}p|kFNL3+U1 zaC>9J!tLIL(gyvyzRdgf1PY*(f!)u!j!}I2O85Q8$eQ^~S0k;5TNwC`J7|P`Rk-L# z3j?F)brPlrF|#3ERX=?i>ZtDR>A{&_-PMbpTccxI| zfW@wP@|5?EiP2@eQokwZScvhLTBO|vrbYN*^gvBi_$~)Jp-d7y@n#SkTM#j1PSr)ot2Zv1l)>$(udg$&KWGvS`tal3 z-9~;t$c7siO=bVJ@-T;D$JlYR=Pqs?yg&7Rd0|6%;rm$AkenJXpP_^?#uCscB-@X* zTGvoQBh*}EJ?k~LHnW1nKEoMOoqHZvzYUu}S=#I>Cm$;D6rzg^B0*+yNmwsZO3PIs=0)?{ zhTCmnbDNzb)X;pq>4HMc!p+K~6UEbik%YjOr-umS|LW~JNvv#LE1CkvKy0k8vPCa< zKyARBp2b9Z%e-|EK4wZ8fru1ecI?pZwfk#UTUwUuG^kfMvs_Kx$|{@FY;Et0-v{|+ zMa4ZlZjNGIM30F~LhI@IgGN+K)7vXzagU6t&qovxg5EU5?6`hUhyMs*IHP4`Rdhadv-1Rw?_~=5MR!Zg#$0;C9 zK0O>h)SCOI*JYcNl@LK&xrC~VWkNM#KIe{aE@-b|y~@3f6dEvY%#PMgR*=8hG3Iuq zr3Ryfy{=>NQN~a7X~^-x?%t+qZ}<2WF`a?jGe@t3t2$|1$h&Qds?0(AV;=Txwt@@b zA4t^g-4gz#I);&{sIr|y{{4A-6sMdvbs|q02jNgwhS4gky__Ak91rsiGt)*`0Piqs zXSjW*#wZTk%O=Zr^zSTD;glV-pMjwFp&=L6WQB$6ybN6xRG`tf;Q3*_NZ&IB(g-uO z!D2)JdacfHJgHS%o$%tf%{c0*`0Qx|+dmtGHH#c)`=|S^@wX@)dhRCwfVFSwc zfMss*S1wi=-kOfV1T@enzn)KD4WN&kU!2}B`?{-PUil(Xr<7XjYOW7sHcsvk#-rE? zta}my3S)D5HDXA;w4E0cU$%__w8*ni%qG@)|rF}^Y|ozBr}c3 zjZF*10(CQN-axxj%uk2=fpXiWz|KtqY4-T4uV4HcnIYb+BoU=|s2BZOc?C25VDmA8 zp&BI;hgVTX_YbMc@)b)#r%0O2#T>qz($ZQR%f@z|GzDpA(GGTWP0t`pw`5)|BS$1D z5rIzt6d9sGgkRwdt>LsFHs9W?--63U+?ur)8mqFjsxdg`CBPV{Onl>ceMG>;=8m9X zz@&Y0;wM1j@UrHE)_rYaIG!GLYO%=DdPtV56!Ke)Jg}vYQ zAV~GPOE}4|c=b)I$md$8R1bi<4{n`hqE>~g)Bf8!sC!057-5oEI?gN1pPDKyYQ>&X z$3E*6+{D4PU=J{t#)vm@XDW~t3X@)-Lz~-ig`=hYM&0?Z|LV~i9o^FW^hO)DZg${{ zdUXb}_Pogs-Y%6zi@_pXLO2or)LqB>IiWlZqRCXnlN^MN(AH7u9$l`S=${S{7q4)YSK(QTQ~e~L%qm4>NMrQ zc!cv}jHv5LNtoKPuTS61spwKYCKO1voH4%i(-9(nWrL8(3YEkbJUXW-QDBoCk&&>> zy;>qLWS|gwrxqNjQi%$UDROikCB6+A8Rn=rq43@i-#|j_ge_q^Zwl`$E)+Rz*dSXlw2UQ@1Rz6L!y4Pg zfkvdLI&bi-eTIqxA+L$1jsPl{EI}h`UvUq-i$d4^?%;A=t;EEQ;*X95Vo&-}AX{F8 zYh2fRQKP3Ugc=9>A_C|qO+^gRLS+$o8Du-mAb?Mr=G7B$&s#^0HbocVQPdYuUaHy9 zZplap$C@pU4ox<_Zp7s_XY9CcD)&gG`oh|*K!9{;kjM1C4#K^tMqaEFSUf^W7-`4* zbls~i^oGHs`SN)7dX9{fVq8$_!^v3P(Bo>FI&laVFh} zs&S0Lq`Ztsj_b=&S<4a{-6^YtwVywPB`96B`fBY^x*hpdK}N6g&z-pLv3G&UST1_= zs3B49Hzy)DL2OCoqyg*Z#S4tZN|mE>zbv2Zf#sYrJ}1_Q;Rd?&eX=t{oHRI$I0 zsa8oedpqL2c-XTBxmI5M2Ru2u0CW~0Eg6DrNv!aAx$nHDaB-mj^{?K!qk@;_xdil*9=hu{HIYISu8t|Fzgysmi>{XxZML5B4RC7dJ_+E^ez-DAA@Wb?i`$HDwO2 z)^j@QmkI8Ma@$Q7|V$J!?oxbw@uY;^Q1`b|LY9?NX+^(_ zC65bt+kxAMX7kX(%s7fA@-2JT;7A(eu^rEpITWlJv8f8l#f6C2HnpWuja(4|=g~#n zb0F88M%lbI*UQ_xspU;s(DWsd0;c%Oq*Y!AxHKc#&sCttuC%(g$|_iik3jm+XbA1X z>n4J>PrKq_tJ0vuRf!TE&-YZbZ9|57mdoI2;z0o29bCej+&q?PyE?-mgssEYDoV8X z0$=D%{XWX<_f(c@@IG}3sRmtbXIv1%CgeN}MeVC2UvnF5vI}7jgV-`sHr__Z+BSH8 zv%J@q20DFAStz{(R3OC{GRvh17yBE!se-z*2z`nF~ zq_GBtG($~HE{AlHLc%U0^-#0*DV}Jp(eeB}_H(jW zkyy5=VR=m6nyMK1X-YXCTp|{MSlW=)Hu>R+>qAYLDNdAn2l5lhFFv%>8U#S4!J6Rw z8iq19WQ8Og_|IEOG&G~S(2dLM>mjZ=^ZSn2MYt&VzXX>S;TO8VuFIS~=dc!60RHe5vOG@)Av%ZkS(8Rp(Q;%vueFD*G=2WQf-LpN2 z@l2TS)SgF=x`3KXweuJMV-ag^Vq zl#Qv#;mUqW?b9!FyQ^z%E}|9!E)gh_ewb{FWnzC*~agm=H> z&R>A&ImkZZFbvui{TfY`JoPd6@$tI!asEd;_*eI?nvRc4eRl;xl`JH~MLUDpv04k2_Ppl8{v;=yrK$!*d-vK5|ca`HFeYlveBB77vqwW!B z9+hJ{5DIL7lgC;{R*~8#|CJTby5;;|WA6Uw5JeIJ`bB&b!7tAP$=khbR}e>Iba&&; zeqE^_ydSZ-*Yv7$$c~^VcRgk%vHt)=c?`iTf>?xEl7&d}W=BN4%KDsqpijuE9XaA> zk%?T5v`z}-o$n9qCwI{KM}yOYnU4A`u$|aCK!09HV1)&Lr71$J%50&q`}6?*<^S$K zUsSnOt4a7;u<+XjH1f$xDAO9ZW-CQWn=Jm>RKXlwMQ-zn-B5$RFSPUN*G<14Qk0OU zQ7OK+`aIvu8zVdTyZ`I^2Wcr5EBYu__Hi(8)()i&j_Lg4Ci~#%=%}}lflw~9&L7B) z=W3#@AAO<*1a?@*)aL1(jC>iqZsJw z?9iDlrDb_;)?7}r#JaRa5)X0r8f(u|4aN5og9e_auBSF`%*%a4bebxs)9`~7#Du!( zrKxK3^-Xi6>n&rt+N&E%0}cp0EYkNP^vi3@`vG@cJsJiE7xqh>W^K3Oc?fxGIlmqw z6zXZwiDc495ViU6O~XZ_YxtTB*${PQrja4WECg0u`N4H7)8Q9e)0Z|*sEQ`4IM;cc zjUXLEh>#zd0LJ;yq9ANds`zedO#*GM0jjC(7&E+YN6}|@dFS#AMbC8>44rMNXW5#e zg-&o#ZjHQUur#?ccMEDiYsu0ON2S$;F=&`bEVI_Mq&{1Pd|F)gT}!mNy=huNTwED8 zL+QO1W9OyoWuP4t;Jv&&_@?krecJf#UDDc)NV-7-nLzO44Tdau-$g@DY7}=ESrETE zswq=*`d>P$#8;pZ0)B!W1CvIx%)NVmZsJZ4=8XZnaQZ=iYt zfjoAXTG|9z>3f>;r~{G2-;c-ZbVDrkQoHr$$`UxV!EC8C!c9smI@IH^jn&31JzmlrF$C76`)&+F%tPKXa~g zZ@huBpSww`S6__^!E*n58qM3{yup#O0a3=U)R)%bW_LY?KUwn(9R#ANe<;n{oh$e}yKc%%z_JeFkpq;7 z!b@Zajn#l0ISP_DN?5h^d{LxR&JolD1mv*T4WBP+=|g`l8-2wx8N`D$-hznYmlOrK*vc9*aWp2)$+0I18QI}pTG)GS(_ZQU(2hKh|Dg|tSXMg2w`Ve+|_m! zo-|W0iK@b7vwT-* zarRO{haHJlGweRc7d+pS#aH8dg0FISg~IE;n1=TAZ37Q_CYm*G66(FCT(#3h;vP}s z?P`5HxOSH*Uu&dU<-Ponzhh_wG38FZcy}_8#FGW9sqgb#Kqou43Qmskf@#>{EttO2#y%ugI*rLbK#%P(WR~Ei*n@V+@abe`h zmu=^z*;UJ?7xl&Gx}|MrlK@rm(ga=PH|?zUAfAX^3izqLR*Y{d+v5v)D7vb83t3sJ zP>S+?V7cWXJHWYtg`Ja?gQFB+?&#|6?(XiaLXI^_;FtYAo>YSWakl5qlcP_EZ!D(i z=z$MlyIvY?MZ~Gn9i|!_q%rALQU2K4vgb)L0(9SwOmEjjKrmyRoU9}h!+>#NK@xgj zFPGgRBaJN)@+wt=oXm`@&x~p~-zQ8t;Y+iKi3zfD&<<4~B<|^Gk*Wb$Xyfk@e4Iil z!+W^MhSe%~Y|jcB%KrUxBSre|P7Xh^_)V|L0l~L5*AdQq25SPTiv5KkGdht0X3_VE zZPt$h11nz>b2dDo+@nw$iBGhJGto={G7;+rxk?| zCEy~!pT^UT7!jZfqM^kc**j%!=W%?E5&e_*)Y78&qwCr0uZgPNnfKGudy|jp ze6qFOm}f7+UJ`t8IdHluFp!?yPp5oN_VcXGhxJ;$Oe#V{eZJfL2--aMxE^xotY1@B z(E&F7w3$6x?BdI1B!&1(JRyq=g{5>>e-ZP&zuk)Uvg~?TH*nX@JVZNdoL{(D^{LM9 z*Y9xc>s7xQNzL)aPxn>LJhN)Intk}#_OjyBZCda6Q)mLWBU`vL(vr?a<<)*{=jfh{o!s&F{n!3uCT);b+UM;R&(hNC{Cm3op z-*RBa$8}9jCLcWl*R`55T~s!YP)2#na&4tg-)GmhyP}V4prg(6=)aM8LZPdgZJ#j5 z2Wot8Df3>!cHXNR}T{?RM<>1P(6}*~)pvdgiEHN#c*w7t$pG zZ%5nR(1naU-PTi|o}L_z-D}fyDg-F?>W+iyp$k$W=lt?KAJGoxg7KJsLASMkJnlxt z?rcTkVhN_FHmkz#HIk6X4U{8-EUD63d6QpOS7zk{DjH+jc+YvLthhUvK^|)+Vzy~9 zwIU}$mQ!F5W3)Lsv$hNW)W-mxB!7ySR+@d^1o`)jncqEGE;ytiuAf@#sDuDV z4(rFG*w2!2w-g&#cuR}+;J)4huMvIJQdAu2Z=OZ?Q?cZK;G>KYIhGgwZvF+p{`}AB z6;2vMTp23>3NRS1Y|Z|I2|JEoW{l?t&wKCGkaN+Hg$ROyh7L(ItH_dN%@xrUxSdWW zfr@OByw;g1v(BTvwXi^xa!90Au{-#v#kxmTr?tF!S*}-@cakbXY4kd9LY;yI8=Oye zC0;-i9DMMWKTne}fk$38&j$d(QZh#N9Ck(rf?=QvR0*P=+vc60D4C} zKfJPb((^PP@uoAZX_U96ow{ zw)(~0Q`Y3ofrn7*aKh4w|FFz8Fv?D zE}LtzG1T<6mp#CYb&~h|mO5i+bm$0!n26J79Ec)7Q6Nw>X6zj7saH^-AJ%8f#}F|* zBaf77f(xBSq##Jh%bMc1DY~lV>B^(ke4S#W`eM*j?Y>|BHEf@X8omX2(N@;IW^qTNb+L0dtKL+Ro7%G*#~U0I3HFq7o6@(ReEWEM~C zTjmFr&qO-5=EBcF{Ch%ZSzLH6&=r`cj0YnrzCS#@%Q<1AE;M8@gc_u3Qm37HzVow@ zG9Ge^4dJm5IsWq*AFL8sjv_d`*por+C-6)y}5cDO4j;(!PSMj;tMJQUxk4dKb`?07zOOn+XeP z@n@1!d&;*l&0XIrIwX;!*NcbYGkb0xK|r?_InktnQHjQ1ICPO^6utU}szSI)m(l!? z;mHRVrd0NHxy3oVxveva|dcyWGmIDb* zT!g%qmX@BLo`HY)n)ad2d~X40-oGC`AP!NbrTY8cWu>JtF)_r%#DL!xE3=Bi9ckmI z7;t0T_SVa_;#dPBdG>q5@zz{k$KoOg)QKZ#zE?p55xbO;> z42O@}FoBEfwhuG?7l&#o;1aw+EkR-#dR+ z2O#G`oS;zhO|M}zxpW%>AZN{@ojEfI<7*59vjc$ad$=-^KZ{6oNxb>Sp%Ysxx)c_q zFl~C6s!5$IZF&=E;<{ub5C-Lc#Ah0P!iPg0z%STDdFa$WLSgT&tYIk4@h%=-*qpxVN}vdM=*UL^_w z0tmSRf0Cx}PomTJ9e%e5x^(9s^J<*Jf~-Ou0vPfmGD4h(XgS#um{7z#9&A`B3UcFn z``!Xrc$sOkVla}iIcd4s6PTPF!rX#_m?)2lyu1SJiL-lo8=WJ|08?vQBc2T1oMj^8 zz1(afe3EREOVV7$?4_6IBZ%aWNQwF!Gi4M%RY;-gME?64*rphmGd2p6Q!UeucRR@4)bnqnO>+W zBbo>K1R)$V$S`PJoT|($qzeD(J_aS*`}qk-uWm*|vvaNW(Oo@AMuH@#5M7AGCo-I7 zz{z6bd}m3g668?XSe8eHk>&L^u`57zPjaSd>fviikv19$oqPR2ikF54AE*$=&Eo!z z>2&(3<=DfIB2imNhBl&wr*nI-LI`nx@5qUnR7~fp-yYBDSEK}%;M3@&=&_igx6zH* zrk1&@PLDvGHr*ClH0nO}VRt+XpW8u-Yaw;54AA&=qG?_IGMVmQdd-O8+$KMdsbqXp ztU@r%yCDmO6&5zd&@)Kf;punSVT%Y?;)qEN*#M<-!gVelYAlhj56?Hnn9m`YybQU^ z-~}c69n##)>#!Z!KZ!~*XB(pzmG`aBoCRFAmXpGcJ7R&=H93@&U?;GXs-)M@fg%ag zsR#uRsrt_FAfHnQgZhUZitF zisPWbt_>e=Me4|g_JwtrLIOKG-{ufMc|p`E4L&yNCk-ET{bj$n@p zWFx9hgQFOH_@a0ZGKqoGk{L7eM8l};FNK@G`TUv5c55%9W%;+nB!Q<nVu*ciqddkzDoFCu|-WWl_#yDSGh`iZk$zQ+yeBg%F*K{1rqfi#YwtR&XT zyfu%#e>p=R;Q7)}B-pe=bn#fm^@enlxwCr*D)1lDcYzefIgUyj21yvFWz$(`grEB8 zTBu5hMeGKpAaysyFqqSCaSi zm+mHQH=ri=b4Azt0A|&NpoUUXVEIo}T`|Fw8Ou`HL^$zo5J$q$E+qY1qGoAnNuR9% z0TM<=A_YSXNMQ^Wy7~Yfgp8-)PJ)X$N(t-FTWS$V zr3_sBy3317nIcyJDc`KDtN^|*-lZD&wzRf}?y`tTsj82Iqg4j+28jmKjtC6LowU?l zesuFe^@rzM5^`BXP+z%I5BK*nG?+L zieNJ{GuN{vWxc86?loreSK|hj{yGW!*p8iu1n>yl3>lj=JzgaiQpnP z_~;sEK9`@uB*97o81!GOWCnI`$0=C{WsT>DYxSakwi?0)HWqFWqJ}I{w;^G(qwo{O z4(yoLEsIh3YBMhuSp0z0v&`zossbIfXIDgcivR4#LgDQe3^7C|$Q8np`wcKgqmLef zi;58N7#J9w__EXG3OhSDOxS>ih&imTt1l#srObFvf8YUzJOULWkc?@h;*EIy?+Rl7 z9B}dA;NZYic6RpIZROpoZO&nkN-Lgy;%;-MZR>GuEj4ZtaTF>zfvTaQ0h{s{QZZD%LCrWt zY!La?{onef3G1g(q@Tc`!}8)5bS-zIa@HR4s~WU z>)_kl+rU(f7K(B7wMg^4D(U38xdF;&^`vQQt}(DcFHzVR@;zwo5S0v>0*I_MncG_V z{7srJi~gF&BWL!eq<%EH+4_+G(Wq70xCUY(no6~uwY~P`D8R6`d@cxG$CE4g7d@^c z-14!j!Oj|QfttFyxH3~iJ|xarR=HfIp&s}wn^E{hB&AV~b@DqsN&K09;;?D{&z|FW z9&e#H;O&$+ph!vDC9ejFG1U5oHkAqEbE1*U!m^XBvsF(U}Xr7%zqC1CQ$ zJz3GORdux@N6;u^@kaCfz=8|tOWWo7PBeuNZK(y3tNIch6AeQTM4f+xgp(Ux3l4Jp zPVD{GZv2@q>>x5y2uxKL;!zbUjT9*mNfV}mNL@;;90~%!LQ`-CHMX@7c zd$ei(01ai>s`Q(e@0050d9J&n&p}w#XWOpJ&}_x7f4(o259`fbJc9Q-?7|s8&IwTk zUiy4gQBj@3H{P$j^nG`(gDFxQ*X7^B?r$gGr-v>-;+Q}F9MGMg9q}x$5=wP%zD^Xm zzF!&a*H*eDnZQq%mLCM!s?cq;LGf1$O?I8DpoT(qj*EpygZ!?E3I_Hs4v_13-f@? zp_t!@BE_FQq4};7mKx3%BuKfFuV1%G1w8le-T*B2M((RGLTkkn$=01M6(!UA6;DA^ zevK^rK1UNB9@?4NL`{n}tzNR2fRW+l%FGKJdbg()+xEIL?fj<&o2C?F>Z*5GKc7IYZObB&}`73s+e%B6+LAZ4->RvJg0ZYR&7iBa_QU z1o;&`v+R3uBlOvht6k zXUvCle{DCe+I^0WHSX~~&33z%nWQ)O+Q_iJtSr#X0MA1Xv>@3I%6vK@cgdGYkHd<) z#?cidUi^`(SPZvJN-yh)i3jVYdW#`rQhHo;fJoA@T&c6D-PF>`T?If%)qpqyPg!rC zDHuO~LIat4c)zy6Zq4)1$IV7-bGsoEVimn)>F_rn9E>aZ(8(5mC_6Uho==|jvhP#{ zK`(A#NYdaaI8Cb5T#X$*xXX-DMH#>Jp%r~XGa0BoM_Yr8#WZEqRHC;w|q-w&NbQO7)2%{o?Kp+^_Mo(Pm?1y{59Ra7FUiLN^0_rn+)Kn1h2= zXhxXtvQ`)R{kygcHudP)ngGbbwd(qorr(nRozf?fwV1nkP>Qfshgjp9w9HhQW8L9{ zIK-s5y>TG4<-u}qGRRwct!7Y^_*E3r{Qu(bL{oFTK;P>F=+#Ocft-_tPh&{FZ5 z5@YDgpK2ZX_MZcM(d39>Bq513M?3L(@5FxkhFj?6^P1acBy2b74su}ljn_PSjijXNK#&@{TXFg zqmi7X3d9vV{mktw?o`~k@f-D&!@(dN`60S0~L zwDcauK6$@VBG=9HYU`jDjZ^sMbD>GH7it0E}yDU-G+@ z&u`a41HK=&CWOGzz;jxyL=L5DGK(!fB&Pv>7gT%(bX(KEH&j!UcLdebyERQ1_?42Qiv8dnQDKS;RT9 zu6!9T`pcF)q>G_@_@M2QyG_=ejGFUYs4j?c1N5H|s6@nd3;uB^c<-2HUOBpL_GAhL zxOsYge0+TB{R^+*R(9H|udJ;6s;8p^scg6ig)J1E4B>&FyorXO{Hde|ww@3e7bT#c6DQh?uo|L!^ViQpQ);9{x+7phP$ zmH!hW8oiA^hl@L-zUJmfZHUGN8~=Bm0#Ptq=Lg;-A)!Ti0X?MyS|tWRvS1^8!7709 zcSyHY!HuPC!}2%BLloC0Im@YcSqFJ{R+~2wrD@fTTwH-e-u##xKEo$X+1}*98dw`c z$Q5VDevR^(VfROY9oHs%IzI043fAJmHvEb9(@x2SUq1J;x&wdaR*8wyP=8)j z%KK7h>^*V%XGo%PNbvk?h)pc%S*-QReTAEoQ(eiFP`dZMlZzcm>=9FD%FMy@?k;ts zj94ww>$ADo10P9oqJnnn8UN6Y-<^^LPacZgfvEKUh3(L68zqp?TVCqreS5D%SHR%u zcx2a5tUbXyh z=N8do(4*tKuOS0E;ikyEF-PLm1<{evpvLqI+h3??)JV~y(88SYk>;KWH;kwVh0C!_ zs~6mqE~l~zw*xNzCj?_LRyGG}Q5V818{`0tFa{Ci{h z?GH4I_Gh~Ou7W>a?q`ocAV1_(k&86BgMoV9!ckSK=4>vIY)T@EL+6*s)Xf?me}RS2 zjxQMXxfoZ!LBj*Kn$)BC23J?s=e{LT5=4(oR9xT?-rG8xs`*g;z=e)vfk*IhuG`%| z4qP1FT>pt9*KAdnsxXq!uetJ1@N}Jbdd>!e9Z%TPc*M8s00$l5s8jG@8Jstr_8P=!af3^{3SX>VMlwLZjOvO6P`PrwLWMp8qq308fwUzi6peBBm4{50A~#5VD4g z1O8j&e=en#cpK$w!PW%=L!0R}r!(DKHr-lAI`U+}{v=CJGE@Ix`@*@GZCj0Bo(F5e zq-A%+f*LcmLhRm#m)}qRkotX4Gb!LB3&BHTxX!4&7q`x+ZYOJ}~*|UD6eGv&SEPgKe z?m2GB1tb9`tu06G|6aeN`w!=2 zE}!ixp|_K`PJXgf-wRAMzhlaW?0>pK;F8S_8!NYyN7b$eG(}zcz}3^!GrG53#dlLV z%7Nuc)x7gBc8x->*NTN`!fznIH+5anD7b&aJqEsDVPE~urv=BvFODPKhSaPgiF$TS z=ox!@7W|cngEAcfJ;^_VX|&&%8&3b){O_#>dH$b4`+wz>|KBx7c(n*cBs$V~;rqovw{Qm*%IT5yAyx3dHE*W6 ze!Jrt&XPw=`IrhQTmS&+Kw9jFTD;#zqF~di>a`kVZqC<*J_px&M-mhs7=O0u@jlxxo;ug#zssq z0Fd(E^nfP1xN_}sImEV#FZ*zg7jW-)PxE2qr47Pg6t2q7n)FFDKk19cl|8Qpy zw0=$X<3rx(YNG#e4banF?=*n|;7mAf-bvbx)?E*PX+Tv9MOS-04sAL!sOXsf9 ztj2PSkQNzzuX9ewX%>PW>VX+1ppb}b0ZDy1@N861yWMD+NQCec6o6t6ZS5Lui?Kov zlLBQ9W(Z)U_UH1_QYMd?iNc#tvnA2Qtg#!HTjm}VaNf^wUPeY?uVM=FSv(oj)WMe?XWeCEol?6;T8u^c~OQ=7ut0 z&5BYRdJCPrn3Dg~bu<^22BL8Ts=o3qX=m~b{;tC3!A#kZ2>&(q%#X>OG?N_}Mm>s@ zkDW?q-LKsE!#;Kf-ze%#WRk!7IFb3->pNwB0Spt&(~V2+8>X0t>t61Dqltw{lbg2W zMoW60g$0b`NhI_SvP$n|%DTsLyQ=>`ja_Rr8(J0)(eY@w^p+;BO3_xMlqw~j9j|CK ziWCX0cw9mvLyDj%ty0%{<2WC91xy@TNpj8*R zt+8|?GgXW@{=y*1%Ou<*Ul`NYZMObslW_%zk{#;JR(FQ9)pF>s`3U^lb_{6c!il!F zk$?>;V31oxWXn8;jXn{p5Rq_tQf;SwQ?s%*!eK*{8o9BL~_|b zAf6EkOwQiX1I+%J5D`MbvnD8E#EU)z`l&kY6AqOb3Ps@4+H#p)v$CiaXR8c^Rp78( zi88IrL1#qLPp3{anZ7A2BL--eGg->#LWAwEk%q>W2M5G^dt-$+OV6&J18|@fMt}r_X4O zTa{*Vhr{sU*SU)Zt6$6nxVZO1v$`Zvi-;+tO-b?EH%D9|u3+9=>+Wpui(l-Iwb|Yh zA)qdxr>j7Nfr)7xYo|EO^w2#uuj$0Tl6Q>^t$j|aQ3dG8;D#-WAQTEkqoLYFvGo{s z9iLSSP28XxUR&JmZ5Nf=Zoh~f>cE7r`$p)Bu^iR+5pBFI<317%jz>K5YmQ!g2IpP! zJlMif;vTw}e$(Wj|5*zuZ=sKD=Of1ocV;lw-EWo3USDG*G>N8azt*2rkgKAd{7^@G z(ng8pf>WoYUXqHgqmf$An)yoA9@bgjQ9Yh{cRA=^W-hx$bxb;I*((_RQi|E8G$!Gq zNTlU19?^_6cIwt;b|Ss8*V}*rJMK9Z_dW({L*}JkG&|_{ur=3)ajbGeGdIQ}o40mK@tfTV#FvCCqWFNp-0dS-OaL!38h58AsWcy%Ij%TX4`|BJ6uDGl9 z$W}`Cu$fiqRh0sdRzbGy2P@^AwXQzoo!wQH^RP|U21@TIE@)~Xy1zTZ8TLv1`%eCe z{l3)G=bXAtVQFs+lNgv}$DVVzK;HDuVe6i6ZmzhBn%ctkfFpT>yz^K+9b zT1{rs&+vsn{$EtOC_a2iBeBiDYx^Cs~XtJ``^d}Y;M#iva{Xd=Q z0^Hpq8yZ}ApQCNr2UQb1Ae~MAa5~tlBO66BfRO{LcAr<@;Lz*f!J~!-^7uEzWmK5f z*8PsrQ>^48;;^X11T;^R>1*L3-#xWKx(z>O$Y%W!81lq;rh8WU*JwL^6}@f2p|&lX zurHHi<#(GdQJkOe#MhyUGGEN?$Hgr1DOJ2>{#Dgq z)TdPQxOiLP_Beg*dw=K+g>k2sc>-u8tOL_0g z!5YJawWFWM_ut7a^yIp1ZVgYCyy|Vegng}SH+O4Ewy?mwS{0VF>C>F~ur_^`C|`tukch;fBG;!M5m$iV zb%^!2FdXY;t`VYXfmBrdODYv;REDqc;qO)R(!dYgX|UP^|8Tm8UR8R-<*H%#Gre5# zZlWeg+Njk$>*wt5+lGFOAzpl04+kU}Du}^gJUxTKPV>wFu%e>k@z2r#9h`%D`bTru zkT9s6j0|fA*iJqT3hGQ(to33(uC496RUioqdBrM1_+>;Q;pkGRuVNR<#12dLU2rV$ zpgUJe>USms{o(n0;p1|-%hS&-i!UHyXUtN(y}ftkN9V_Jv6Hdc0EwM zp9sMb@ye#&IjJ z$+APWT^YY8c`67D_%V}{E2am0<_rv_O##j?ber`zezKJHm8@zaNc+C*Wp`e(x5$Y0 z5e%4Q{WEns{eTW2Aozy%rqtH0=XUDt)73JZ_yH4j)$*Wkm6n8?Awsd1^ECLpO;XD*>n zh@SS!i5%X%0@4d^5-~Ld#b?<1sDS{)-3<`}NK0#h@{gsTp&PFB@C3d-MEPwk?lCV~ zYN%5-5Khq{suyk%k;Phvdhm`}wt%|2f1O#j3YNK&{h0|*yhtdDm}Z?pu9p<9VOljmWz8q)!k^aV%W?n^f5BcW=h(OZtAS`_%lo|gnM3pQ~ldMJd?+A8qs9~)E zSNg?ZAh!&juG5Uwas-t!j7L*MC$_-4JX41XY(OWi(pmJ>@&{3+^0)x(hztTc5h#C{ zDO+L5;#6^ke(Wj$Bdlw}fk4G(ko2x+KKQv(kR%ouM;{&~lmc8u7>I)fU;j^8G@IlD zGE_t*i<;t(R;eZiIqXp-{jMkA;7|w{mo@~07ziVds?q7_gFiJN_>e?tMe|#}>Py~4 zhg-(!X!NlXLyhZ0+|<~f2o7+-90GL3Z$|ru#=y&%@8F^O@|2L#-zK%{iNf;|e5a!L zaTfPRrA^0U2^E1h=R&R=E2tNhdPB7>Rhy0)kbUKhHw&U&0Tnz_%tbT?Id_cvqZ3wX zCkY-zuS#tnY!VaN_3^w^RC*Dyi5TS_mO6sp>Q&-Qc=4KQ zMRF;ZG~BjGv3p&Mc90_X>{kX5wl4&sm)8LY+hyL0>F^Iz+RUt=_1S7W8b0&!YP(04 zkQWjeQdNkO~+V}6T;JCW0k)S=jT%b^9@!@PTUH!eEQKm;BPBBUsqBe=Pe5&9O4+$ zDo8cTie?W@s$Jc+1m$Gqten$kd!~iEs*K9|8=&&!#_8-xy}VmpJbQ|Y5e`V{xMt}* zc8ck^Tabu&kKT+S{&Z|x#ojRNy$A;rcu9F)HpTR&3n+Uj$~SdCo==+*xOQX9qH5T^ zVWEa3p{;(t?273QlIicT^x;%)D*a*Y-9{d&j~Ln<5PxJVf#m{kXTTduByy-J{S5OI zRS1wI3sDKg;IjDeMHt* znJj#?n^A$Gp&_0<;Fs54Fl6aa{nQX79hyfh0)Y)$+b%MH}RC1={nHll%R|{rY&sWn*r6-klJ9~I(A`FmF zTH))F=*wLa-n3m>20=qf0LzCS8yM>)<8^0T1p$DB8!sD5}TL9r?iXp$eZs&p@S@!0wu69P;rBlky-Va;7$#G2=#jrkfps|zuS#3YYYZQUKmri%PBr{T9U4x0 z|6%Wm49;#BV=7Ch=tdu3+Usv5xH2F;!MEwKs+WL9vR4HDoWU=Ye?|28%(rP89g^Ue zthyq?`*?)<4Np{!1nbcQTq*cgC#BS1dgV?QTnezQQkVjE@S*BR_6Bg9ns6nW!4Y7U zEapvlMC>hjwJ^MmB-#5) zJl&7Ik|)M%0?;w0ArGVXp{1QqogWsJnNTtf$ z1UweX(D=gV?<#@SDiG>07F#_eszw(|?;9^m`l&FWI2AlLlgjdG%Dg-{m9Zp?%^I-7 zgCxOsCx|*~V`+*;;9?iof8)kd2S739&J*ygX7?Et{^c6s(}Q)Qpa0$5ghfR~MMvAL zbqMYeW3jQZ)wvgZ3%Beq_c+p7?1=OJV$igFcM=&rrnkD;8_R1b)E5RXBkb7TzEv8C zUBU9!&3d%18r}C-(}+;9KKgfVp&en8AHDWgflwe@RE-teH>}Uq&nA!sC^r!JMBi&M zKd^+}gP1=@4Fdd$+Vme7Lzo~}le=wM-UnBPV*vpHAW}MdW@<$$Dk@p3iyX2zhmO$o zbYWOeLtJQ|IelJ)28>gsAgX3^!d|K#kXz9#>xFH@_?P=D%;8C#buwV0!8(~Nsl3=l z9Uc)G@&4}4*u=EnX3oG#Lj>}#&fU=luZ_FC_mCtxHic+wM?(630srOETUc=>-@tY} z>N+#^Uxzr}w}rPufU^cb^j>Ft(kJ{B;$(?a(~jCP-nR+A z-t`~Ig26DzQz8l^f$Vl-+zOJS;`ft=M2iFTKwswY1AQG6zy*yHfJ#4nB)I8nN*&Q2 z@v|OPs3TU3h%Em+ihW;uG1!|I3rrIwJ5UG8zj-h~5B1ICmp*9V@|7mKj+r5Rzjp(D z!Va);U{hQa1$A`?AcL}P)*hn<$X-tx*S4bj=E^jytXEp{BtC|E28Od!G)ZP%xIgl zKrGj~3RS3s!F7SEH-aX@xw&64A-Et4LJteSZSLS}20oO~|KctPatdx@2DAD~BTvo- zpm1V+=MJnSL`d?5nK?F&9l#ni`(uk_G78?rkcamrg?|K^kDMe6c-)?_r;XNI%#95X z%fXU@g4IIqPQFass@on3Dt3%c!*>E)+^wxWG~i^hzQVB6yRpFx7Y)hrJ5Kq#z+1uj zLTl+?(Md{qV-;fLhspBxwTTtK(+}uWo^Pcb8(iIIX?dED))$baB7TuGKZUG5+dk8T;GH#tPjV-OEI#qt$E6)e;g93>rtGyYeD!5>%4K z+LO}yqfhzTqhC5RqcPsbFtL3NS<=xLATs<8^YTOp2naeO@3j+WKTD7+ey%kg&CUjE zC+6iHrBKGPk(N2p_OO)Q#&SX$T=92}5fG83p~pM;o`-iEb?Nr6gritgR&^@$3`|bB zG`8Y;(S-IziAIYQzUFb=SRuK=7BM>FlNHN&1+wPNB{!1U+lyfgZ7L+1v)(63@Fkd8 z800<5gd)B;FaWCTBx0+LMQ&%0JV^y^Vf>?BRgB_K1drg}K5g&sZ@lyCI~A?F*9WDKEyfgqPP{^vEOV#Lc%RR2T&eU;BL4?>o9 zd!aE6g+e>FY?Sqi5ur7V(L~&p%6XEvSIuV6!PgpPPD>3|;{uoRM}I52 zc`hMn$XWkh0)-n3dabgQMo?wn=G%{yax$EonWr~$Mf<+(X8d9qluc;8_ny^bvp1|z zANE$Y= z$Vj!>e_JN<8UeH^lv@ZTR}tYUeWVX+Xfun7*}~7}#I@ew;1u;rH_l4u^rd53DnbK~ z+TX@eN2n^)pcNGGM4t2Kw1Vu7Qn-We@Go!CUXexS_9A8m#(`4S!BRr7Q%y4Vw)2D! ze!i56{%%AiX?|mU89G~oxqhQ)n9&2W$O3X_&wH0BlpoLXc8b4SQsCPwhV&$_jRpe| zz9f#?@jI7mw=Y_9&6R6k4$@?Cq{y4wGUVd0R^B3}m=FNO7|4g`I$Sm_r4F+z{dG2KD=`Wh zG00dwPSBrI+wYvFCcYv+jO?f2a%cZ|Oi`B*u1&N|gPOig7#El48l*YfQx(qtQD4?c zX~@3)sJVVowhN67CyuW?`l$ytF$n&PfE>U5$cI$1oV1OP6A9hk!FOJuojKg``J{MK zR7w_WG53lEd3}q5uwMu(B-Gj#>ubBlt3sRS3V((l zh~p;BI3RBO*-WVu8zNi7_+x>(-JdsgYXRL1LU-sMj)DZ5PzOneu&JEQ-#XU!_&Rsdf1`7qJ)t_r*&nHp%~b=c*(#k$HMi;2Z3q7# zvKfd`UQ;mT1>{uqYC&F(mSvf$d`vr?h5(#)&=UVKlNlR0K!ZeR^#;+0nIEfLw)8_(3{zfL$7MhU2}^1{^mSF z&GCpl+cmdGs}$T%H1G(s-tm7BAZn`bv-v)ye;#(5YJ34V14&Om$fGa9PMU*RyL%#cVtVP(0QR37qtLU=I`DTItYU7iv8u( z?e#$+smSb3%=UkSPt!Ox+nm<0vKms765VkHGlaG;JsyC4*TedD%peOha=dFZ` zQ9eB{!IE5bLEQZ_~78jN}A&dr6H}h4-P2)x|3+`IXki$IhcPArbW7$ z_~FP~px_TuIc2+IedL|=l^bs>De$kgV$5ypS>Lio)LNuCElaJi49~)m)Y)#!Hl6Mj z2Z^g~=Ne2p+pS1O4YpfdD%qk3?9IiM`OI~37EZC+DibMG1eST}`GxDWVByapI$-8Z zG%qIClm00p4GJ$aWWdM2vim95R2e+W>9A7D9XdCJi28|@b)u)Ihch~mA~%&r(n6z& z{yeq9o|Bz4wmeWPfa}X>{Rgm@;~G;4_&YrBVJ5F%=3h0mv8jsqRw?WcVl$s3tEX!l zH|p&{Q&Urib5+r@syfor(#3o|;t{LuH z6uxhR_tn}dKP&unnAvixw>1?1TBIJVr+t4Frqa^ad{}5Lm}b5uU7`XNayhZrJ3$c1 zLN{H96M;Yi2aQ!sOWvTOqNQ)>WYlyhYATE+lMyA{M)I`iOrJa#Wg5?xlJ>L(Cm>{;NN%HO#r z>Ov_Xaf1-OG}|&S$Bo}X$Yh?j6J4UZ4VIHrhH+mHGq})yN~;8$HL^#+AmKlT8d7<;h%Di+6Tg{{Ap> z6cDM0G4wU&-0pQdP6-DW*W>!|dOt6E)$4XewNRdpmUe>s?zHu+bnTy1@3`=*=f(Em z?5nJ-?9UssgC|5Ejrpbjs&lWuV@lfc^rEV&njrk1#XxVCYXKhmqTN|bRwRvxZ}nY3{T2vXwW;t~>IojzX7rwnt61Ve$L@55mt%I0Rgry6w} z9U~*7fWWeKpTv%%BOKZTG3^7 zXRBMt?P#{j`>A3n`(+h|^G|mICrR&FI)pZCYbrd75>bA+P41n^zYOWz-UM@cfi70P zoJN)nH6$92?;p^jSqwWoCvzpD1umowE`p{Wm=rAy)6x=~_9ntYi;*%-mpiP=f{s0I z$j;HDuWoCs^%{4dQsShPXa;(FrKLlgtR{1l8yfeDGFO}2mKL_lA3ix@b;ZUt*{|$I zkQ;Eb9T#PJ!^RPx_miubn3#r!#*ZIAMhUTXxhr`cpXA&3zsCiJHhB#~AFQlz-&RcL z>Fz05XmDGss@=zc9kjvBeQh~)86mDD zJpB#}Z_|R;{px#}Mul&!Fn2jGaTb=Uu#Onr>$l%6*FMySjKxIiXds*ht9r-%A;n4- zOl$8meL-E0QdNWGxH!#;PM=p8Uh9PfRlK@|nK`BbWkVl3MCB?@dFEv)3d3mANo?l0uu!$$UUDAkj<6i zIjwo!lJL0No;*0g{tgdcsx+0*gmN9aSkG^u zYi;fI>Atr@w=vaZ!3n%9h%VUm^89G@?Hi>G)P$Fu+&|QOrg$=26h3X#w5^6gvhnEd zj{nkB$?alrBedzeeDrD0S_Zd8so>WBlsbQA)bqEEwlniN5AB8dY4Y~w%KZU}@WKG0{ zbD_K@<7skf{nsq#%&L3vyImU|8QmIJqs>|K+ggVgGA5~jLx7L3Vlb z7j;I+Tf$!+N0Mvngs5emOdB`N4AI<`L=D_I-~YvYjD)wBl{+z0BxOOj=4< z_c-$wOifYDkZn)){oZM_V`YM?*E zOL8Qx_Vp?H)Raew#f~LIH6{mB1u%0;pwz21jhsGEGq-haZFkrk(@B+_8&a{evkS*( zIls72!T7zjwDhf7Pg;i8^X~JJMupy%l!)|a1MAD{YuGGUSkLKpFASZWc6dFKlN*is z`-?FJAbv!qdSHElJXLivM@B?YlG~7FL7_N?hHG_obt&wf?l&oB%^JcQ{_n4HsEVfP zWS}7-QfXXP@llv*qq_$O+BrG5T_XVv1UbM2Bi{$WAjN~#!5s`hIL&cM9do5x-^<`% zTK*^j3;~fJ&G%LRy#CKxfaifmQp#M6oQhBg#R*``QxIY#QwQ$21U_V}g4^ocv#H z0U3PL*73pB$7m;nT$%?*N^%QZ3XQt@nZM+(kmV~}yYy+89%@=UJJC`#%dXR~3XDWTEv0CGjxxcTLpzuBIku)(aJt8chceY$Q zKUg$!(-id4YBn_rkW?U?Wrz0-@d1E%y~^2B%+IE^3-LiX-Yc2^F3O%k;6e$rw9%W9 z^;2Nx*JXBl_CVOe)+D4+ciut= zjW4dxqoRJ^eP3Mu8gOR4oSk{WznM;{rs?|)a9OsKf}#A{ni?1cCfI@*M`xARBy8B$ zO}JQ%va7*m0-+95e}|YF7y4n^!NXA%d{^=(qjxkaNVRX!&}LEBgRSRD1>N5g^L$?0 zjpSaXrK5AZ+X#V4Xh)8G*Sun~Z2Dy(ct9ev{sRm=`^WwK`BPR_u0NVc*lLkOJ8=+8 zw&d-_0A!%;rT@rq^obr8gBE>?MpO7{goK2^;4i(Q*y-$o!UXo!7o33%Sw z!X}PGFi3P7tuvrdm9JQ@DXAT97^L45i6!mtKtJ8Ln@TsrpmFHY;U)hcnv`Z;E* z_jxwObH5o~Io>gox{l*qevN#TBqRPuD57oq{W85=RS^z>mcMbhY$X8j1^Oa9<@Xtf zTOBneFbW}B(z~fZOss2*+;D>|o0Jt%oivu+?G`2{nsPc7-6!RR3a)aL6N|Zh;R~wI z_6i_9dBy$37D4cC*79eZ#TNaH&pXb%8H(D8<0gsq@L#BYcsrdUXA^Ro10u32o2%r9 z>){RMqtIrnh@eNo3za=qc5Gyk=if{^1h@TZTg6xZsvY!%yO-b@tuno+y6El30PtmR zi?U7h;;-9YUqywe%yAEs5etbFYp|1+sZR*ZfKhfX!gpo1Z*0;Sc2`BHN8A zprouIE3TPNt6(Xf(v)w|zia+>ke4yN2(kTH2LI;1PWHDNe)m^`>z3|Vdk)r(d zc58)^w|=(h8X&KEaMG^z(3oyf%3R>=!RGM|9qG__ez{hV&!CCB9ic@h7J*QojXgH{ z;HmG0MR*y$N4P=u4No(h`@t{vVeLA>-X+uP>16?0XSLVu?bSlQi5afZ_V^IWS5NU) z31jcjf7w?=ag16%IVLWSV))|e{u0I_UbX7!8Q2|Q!zbbsQy3wZW|0USji4C|;2T#R zE%Z>_)Z{vqF9QRqL*wJa!=uCFET7%Kbho39CbM(XXimZ+*Tv-}zvKP{jH!h5W|4ia-u_%ppx00^)6>xC=c!F*3jOoJ0TXuu zifs`x3*$a8EC%O0Xbd&EpRYFB+1ZhbCau@0Sp1#=4+sfoIQq0c_~q1}5uB3(o-GzO zRSoC?6h!ILLtY+Nzglu$u63@!RvxV@);uOR>vd;Q9m_ofG+z$0R(|(9jh$())G4}- zx|6&=U4{pGkZ&Npcb0qW4MIa!PgY}d)vChi784RBb3~Xu<}A;Lmp{mq9=~ZQh_#(5 z0y}Zn{L%2+1@W+jHH$^U*1FBMe;;wFSs{SyS^F)J?E+t=1Y-l&M}{ndi=QzmTyRpI zU*8k)yNy;)6#wx>YJYSiHDq_PKQ1TpabgoHH!B;guI^;kzp-7rsgC=W^eTb!Z*IYI z2cfm|Zn0r)cc5RU#@J9y6kBeXmZ;|};D(}r9Y2_kOeBnGS4XT=s>mDyXR4(N*K0F_CJO$-3?Di|Z7{8W;*Yx3J zbhyY`9;d4hV!r)epl7@jb#?alc!@62IFkY4c`kPgpzgbCSv7tiZTB!MYZ6Pe%=b<(8O>K85by@I(X6?E?Ap%4qIVeRmdM#dOuH2=GvqKw<${<_xv z?9Ob^(%(K+Dqp_!VCdXBIxsgkJ-t<+oJUSU0S^ZU6H)%%EZKOty6z{)n4IEtTnsUs zwLL~<;wxs+8@cen%xD6J^1YuQJ{2+xf0Yl|AM%g_d=*2s?qkPqkLJ$&kV$R%G9Jv^ zLz$N(fcX5oyE_7Q)9t-IIp_>*)lQP3_rf=>)~SS#hnGd6;A^o%?lteY#6&Ki)u%qW zL}Eerz)v@m`O$U1)CE71xw^W-^3w*5_eT=Jj20P#xXEPrJw#qs7Umn{8HfAbUrdn9 zRtm|Fnq~F0sV48P-?UB{GCw;l#N-5k)`eg1#~;r+ZJuWC5)P(|q6yd~?;m^n@peeg zY_^c`Zk*MRln1I_N9`WFG`tfaM|v-R7$7%#u}zK#7ce}o-ja2Ati50g6B4{0u9`;% zHC*qPPPgD~ERg!kxn?^85?;I{_VI+-US6jXEP}5(=Ujg;5>uip&+?0mY-q)4%~y$r z{%iG-juv>#EGpXR_H!vHG$G~n-WAi?t-36vzn$E$-QL|!HeO)mmm5}*2Y?!F@3WO# zVvK?N%RQgF4dk-f($VqYXlk#(shWud5w74abRaoUE+B z>gr}Vp#hb3e;$kq1v|^dgAr7%PLjpe)Ej=`s2OjW{1hi$yc^3$qs7nQDKNF)%psGdx^@I&L!L%2Bw*aL_bd^#D4xcTUmU-#@gTnz3!(P-ev4 zRWBf$U-d7Kl6s20YoAkhRD8Dli}4dQC${ny<@;a<^Tr`BykljHb5^3Sf%b73ToUcQ z7__sqv+o=B_|KS_&jt1cM(j@;wmgbid?ecZDg;z2xPG)wJXU^;RB6y2R>|B^cQGJF zR9h&C0uI{SJ+X$0K#a;uZr^^or-K+?r@^PW+rl7vx!C4Tg_dCM_$Q&w5DYSJ-mDM2 zz-v~EwMcF)Wy&aId3U@iR-sdmJD$~3SkFHLDZs$)vqO| znzn~b_7lC)uqZM3@F|^0j7~h2nJ|iFD|Hw@G?{BVYF9#a#`@HgDmVEw6*P_3OHttG zCQwy*=PLL`+^*JEfI2!=|vx$z8VQVE!Crxg1>Q_C>np zupd#}x?8r%Ja@=q&;JqVrPAASHs2_tnJMO)i@EvNV$X8_wJ9Jn1@wx}jBVHdM@t)C za4^pLhdDJRguMQze`*CZ0)-kiTdV+J*uG(Z&x03r1YHc=?m(7FX*@esv8EJ9bt7Q* zU5b_&kF4mV2{+qb5+y#`HJ&y zcKeMtdVovg?3_-UX{Bz8STSQd((<1^qQtUuz2%?5QlY11Hinp$9?XvTnz{wQO(w1B z(pO;8K2*NNMp~9aiJ8glV8JAJ8UnN3gW_Rfl3BYl2f5)CV&eU!7PmUr+?}o_#CP7e%@NoW1T=bN%WT^(5f03Rqj)A5B zo#X#sS)N@WkW&_Y9|ODpRUo2C$*|B+-}#NpzGgiy83;m*p_VsCJF%XPnv2Z?{#1?J zR;}fFgXYK}bLO3eSP~uT4kXlaBRJk~dh^zP`;?p<^3FvQ=DVm%B6oL$I3AB5A5YvX zut4vbgr9%2$oMqY$e=tuyA_3u%2k611(KnvXh~W0)t^KF;4$5*IV?yIPQ)eb5msx* z%XwPSsT7q#@(jM1;L;uJ`JeC83#L>IA`-Zos`iVLT`1kms*UNG+>T=4C64r9FGWi9 zgjs%soQn?S$Pm*o1ci#c%joeEjp@7HuXdA(p6O2ykGY%jvD1Z)s^VO4y$LUhmE}+wn4+qZ+c$7%#bht?^xY z9eK#XFn(T77_eW9xOcnYmgJ1hQg<^tIOJg>F_u4YWGImMGW+r^u5stSLzx8L_IYeZ z;=JI!P4wimIp?Lu5CY>Eb86d1_U8DI5O?7v{@gHp|KfkJuGeQFk_fzevd4wvC8-`* zxGJPZJ-@9DBE^B*>&$dU8rm_BvEm1GW3g{V)58}hHTq?ohD}=D zQ~lq55&%5JV{r#2M!Q)&amKaSt{(A%+*{uVKL5}y4Zv!zFo{-Vxx1P*b-Dj`Iylps zWE>kvkX2T>XzcTE_a`A|H%I!EZq&LNHS3HYyo(~=o|sD1mmmgigRj4VUWDi@UzXrUXTHF5BA zgU(n8TxAR0vQ+qT+=(B-o=qja5i?a1SbCdM2!Dv9&e+0u*E0)OM~NQtNVGIeOCx{1 zq1e$oB(|a=&jPAg$llcQg4xS>a7(xHj9px#zVD36v^08wk%50r6!O%pw?B3Vuvi;I zQBEV+czM&6m=;sM#yz*4{)=m}g*k$pqwjeQy-#|m7BeWGofTmpMisZ%qY~42&(>O_ zI^%fa6Ijd%fZo72`o_+u=Mw&J(dFZ&xrQ)D zv+usRf0}1P9Y!v|bYfGsL#fk1zGGWCy-UVZlVj$9hAr9>Npb#>1l|&3L~cl$KR$gN zT(0km)(n*;;Ui(GU_l0WIkzf*(6}pwzwYKD05sg`N-i2kBWt^~qTo135`Grmy)81E zrkw<&+gT17=+$5Db7VA#(|_-NSlCZ}Yfb*<&G{9^`2jQT`}aG%2i=OIfUCy`Q1^{z z6bcscl{_WyFo{wHi+FC*;+^4QE^=@Db{iwA-+4Nmhe{$Qg=sW*4};Mb2`Be`6Eb9l|>cLj|H0o}g^+2t2k7hVgmBVkTVWwaTxT zNhbKVj1(4)v}nkstk#qtnVu+C5T;1r(>zy)N;|W>S#w^=s0=H|yxkp{DnzXq%)TUm zfDtwyE9Xr?C&mTd0wTpEe|XaNA`I;8S;Fa z;{}PY$OO+&QaXaj$!RHxzhg-bUjFvj2tXu5#=#!<)zr*&m~U0&c(ad6W-Qs31#L?a zmpaJ~plz&;u_cr9K0iLu?#yCD$GGv_nnYsZiUIjLJhj+-PcDkLt9Bh5OP3!!94HwX zJ4pw8c@h>%M!NA>_73G#4A>M+oDELbfq!$K(u^CQYZxq6J3LvG9I^~Pxdf;5I#5tj zZrlI1+v-7~)N?JgT7bd&KFfj}t_Jj%u> z6)6hgcBYu<*RtWtppm5@Y=;|I_ymA2Pj}}&oyupY6#FmA5{>mq{F>ICwyXX%QX+MY zkR*B8(n5x>c=580#pX%Y<+5C*ND$Zm0xR{s;TLe?3j2X$CV@hx0fW>Wj$ruzipo_Q ze`TVj9+9+k19c;1E+H9;{{`dkoJ%i-W06mRPB5pv0>zQx`Y(9@kLdk>2k-w8z5hqN z|NkjV&MPuk>9*-#b`DKfH!qZaFO|OA|ImW<8zL%layY4*B!_X@s+m3kY@f%oMW)b) zVWkijL0f%XE{e@dlHDxPWj>!v_uvP%Tymzmn3xF#4I(OEBSR|>w;5-eY!%#iN*TC+ zH(bL&XmQ)sIcM5iL%XsDm7P{~Au4gN1~G~0=>c-kpZ5zr2vABHoECNOoS%Z>i>0t9 zp_}C4Y(8F2XL*ZxZ?RwiIKSpM9J~Yz-)5zLfddy=9cSBk2^Mv8S>a6k| z_fUJyeZ*PKAH$`CBPnFw;K&U6Qg7tjkfHF{0Ik-dp#dx8hEQN zEw{EzZLK0f$m1=Hsi+rS&(^2WWA1h^f|#JS*kmGDDOcQho?q= z<Spb1A4sV1`bzmAj;W)P7QR7d%7oYyZu!VN(|anV#> zzZ%L=XBPMWX!k@{ka5(6SS_Te>`V}_x4#TeyCH6Mn7cbJp1EmYYM)!!2%`axhl`HW z&5cPNr>%{mX(LZA>1$R>c(?ySnBba81q$x=$FCkJCBj=BBVxW)4G)~fU&#STjIZg* z+c!6fDA}7WSE0a{^BYF9Ul%-und7`p^sQU%3ZS+Qw@(aNwY9emcXw`8KhVNmMiyT! znd+&cq_@sqCk+@jUqmMr6^l>afv~#wGXDnQqsgNrsBvS1Kq%!X^2-je5JdDx65DWf z)6V%i_Wlx+#v@Ru{gG*J*wJQq@(gh_zQ8uP;1vH7BIn3YL zf0y$o$=)#X8t{2q3eCixXcCXC4}brgB)I!_D$p{zzy3*x$Rma#_)ozg6*$)6w%Z<( zEad3)XkAbKbXSw{mW};p=hLJoJ`TFJ z6P?#YTKj%iEX!`@jk((1DF(K}*-3JP^_fdJj(J_Bhf)zr?E`0cQlm@7m+9~ zlL4NBg_&#KCn<=)l^UhEn2Mf7E=3^oMagfN; zZ^ZLVjf}{hDdXY$u-w&A;S&{9$`n}tpNxc_oOO`;*^r!eWaOLg(1Tp>&!3i2X_X%G zhJSh~(?s+Qm2@8o0PN5%4X6#xOd}0kJmn-hEsW7zm74U=kWoiv@SfMFsII=;Y@HFT z2T@2_(VApDFeIe>@fPB3d#(2$c&eli_*G0yf8!AzgX;1#7s3Fjf z$ zr!X^JO=Z(wffUfC=6sRV%y7I*7%g}?udwwgv`v8N>gLZ?guttgsLbPBg6m?#=~apD z)n4-ywA}icx!k~EF27;n(fi45)Q>+a{k!1nWA~jn4UR*m_m16p`hVoD{ZR7P>IY|8 zbRCZJA4V_jr28REXJNGbj=!l%=2O}JT{m9byvC00pd9RmjzfCe;LAMLuAhRf&J~UV zfyP0n2jR73#?KzNKP(>motW=j!&H+a3oOySquV+FI`yQToX4wW}S zIM`q2lx_6qAD+*9^}v;0|1nKiw;bjENr@9V!8dkB#=b+mvoWl0(0UWO_M%x!Y9;6J zQ}#lIV3lLGZmK+9GVg``sw6hg;K-Z#h5Qo@U7tU3rl+mkH=WE2#lPoXeToR+C~qO# z-Sr#0 z0{|3PcD27)*r9aVT38=cTggA)k9?hmZPZwp#l()~{V>f9Q?+p--T$NM|ATZ}Q|eo+ z6;t{-G89@R{xcP1=_Ptzm(Z++StobK7~Fkg8jrPEjG-d;4;^`;0Qeu2_U>;`S2(y9 zo1^F^E;Y&wh&%tJ2Bld~1*|0vElREKBX=G*sXpBVS`&nI{C`yio{{sZnF@7nMp62h_|969vx>#dei8;jB26} z%0g4F-h8>bbW(@(bmn6|a|G%FbiFnF6z|y#J~l_R#M)}WYUyJr?EUX=BARxHOQl}98{yhHDWSk$`+HfmQZk~or6+LSxYWX=MQtO{wN;Q3oV>^5ODx&Ws|cGfl>uY!cd{X=@XhR2rLEf`oasJEfZ6ns0{}St& zM{2*ZKR|kUjY9G=_WR+bRL0$1R=DlS^#ns-o)^{4KAcaK0obUjDr~!Xv2RCp6CciO z{mAlt=gHf!{C;_IyQ8BptKr?R9io6v*QGRg$F~EJU&$4sI5eFtE_L);nQ%(~PjlZL z6xGwUi2+4akRU;ll7}FYBr}R286-;<5RjbnFr!G0GJs@IqGU;u21arQamX;_90vv% z!i1gQ*7w$a`&MmzyS0Dp-nvz%Zujkb&+TxZ?$dpqrrc`kjrTu6OtA&IZWFM~!H(nD z^VOC*BT}Fn#uQ&o&l7nfO7p_u&fQy&M_9Vh*RXtaKX1Ot(0zZ+T`TMB*Lu8ZRAktA z94RNsi*xMN37l?(kmYqu@dzuQHn?xw?MpJ&P+rW=>0CF<=XV)g zvxH{wDY&lDmqilc=N#xfvJ(G>88i5lq_NCv=uqYil63N>DwC5mQjn+h@z3J={=t^l zVgaa_8}+(c!AJ{U8o^&e?(njwfBw31DTrYi~_WNWcUW1irf?5vb+v4oIK?3M; zuB3!mS*v4)=>9zc5&gcTLx2?XO=$ZO(TjG#qLwG$hlvF7N9*f>daf(8HJ`xGYwnB; z4^CVFi|BT}SC2B)V+JY|NpxQd-}soOLYP}<^};`PGjz16QNk{SD(1H}uf!%nhy69*`8?ORyCq-{+6O5`Bt}-P~=nKXOT-Zp$o|&Y}z|-fEzc1 z5V?q5kN8m+R@|_SB}W@%N_3jNq9X)Cv2S4aW~~h$Ky(m6f3RAQX=pSVNAC~4>eC? zd-yMYbQ6J5-T<+iSe4zoo8S&l6bfqHG2pz2{fFM@bm(>{Pr-w)Ec7>M_yX>}D2?O(^ws zp6g#UK0v=n0y5JzprLE-o{IgP91m>mQ@$p*Ur8-7$D zN(w2Tm02s4*rsl1wHjnvoiS(z>xZGg6#T7+yY9#bmR{Ua;hb*q^VVG{GeT0n@IG2$ znyR%~F50?DPu;ABt8%=F$J}o_r1op=Uh^6K^GV`V%EE7uhLz7-U2Uj@*!%vUtj=59 z6ZL0t2O4(Ag7)3dZ#jgGWP0ydH_<##mhOhBKlz^7^SWhH{KCYo-s3Y(I!twX*hG?9 z#nz?UL_D&b|pF1)HsvHXP?^LI_S-7KkuW7YtJYD zdRA`4m-Yz%xVvMXO5=3{d!zHsT3aNQIlRosgDqSs9gN4m(OG9QcyHu8%u-v-x?x@T zfCyhxMv;x@pEo1o{e8O-LZAlWL?am{QmSNn+fC6Q9qdQbA=9E2ug@yQrcCzbUpW^}qM7u=~3lN+eEp2a?e$iuM>=NpFIpx0&pt ziM`Bg3FTR5$fFQ7=nY8-cJFOikkZW;zs5l_k@abzc*qu;s;2d-6&nF%B{tp0g0IY< z;xYUP#g=1ri!I-zB^a!nLCfbApyl6}+o82X@vN-e0t15>@_UkX4pxSl5kX3~q*>NB z9k^fE2V673+1?~kY3?(jsC)k5w2OW;0fL_c*sU~Q(e4vCfq`pj7B@(~%rN+Uof%7p z2oLh`@)n_6U*7B*BzJ)c02etPk24L5pw&KiI=$t(ZU`0@r5BW6eu6g|0O}u~PW7WF z2_F?-yyq8u?Pe*e12$w;EAKjZL81tdl$~FDmh;Xb>NEZ3L;qW$xBSyRYl#NSy)8!8 zN4!sx={MGB=Rnsxv2q$};Xi& z!qh8_q|;dL9|r`#(EkFTvCxNRxM1#_-9HsY{!RZ7s_1gkJTM5AX(X~rxVSC)O`+)? zON$a(5B{=AhhfwFW+O|7qr&^L>4sLauj}1Q0XqZ_4gOWmhg)ox~n6d znO|9K3v9uQ0ecdO)d#}3h&^ET&g6*vf1T~jQG*L}Ea!fkv}UUtVuZ^# zU-O=^pP?JnqlZ~-qCi!^8SWHz zA%R0YvV>X97!fpo+1MD#<<^?)w3bkw0!5mbkx>hCYa6(jDHXchy?roPFB8(cXzURw zoFVL?Yi4FPFd%=e%yw}eLm8C)YrG;`c^``jwl3feINa!^wOuS`3al8478;-^yu~;c zukE*Q6I)`KI&AVwp&)Q|OqPm6Jt_|n5moK9+lK!T0e}Dgr&ogDRKh;SIoNAtUAOxO zq|7!}$IQXV8T8&cIqWagsbQLmo=v!FIO|3_L;CgC`Eb)03FfVSZc2csV8TMq$;;j% zxATkhdL9W43DRB8AImbW(y(c+HtVB#fvOHZ?8=X?!t8(^VD{OnRO@$_O-K9O=NE40 zFx!d#(FEqo4`VHI^PBmtUV;j5EL4qk8uV<#7SxS(i6#fmWcQem22tAqr`8-FDKkup zd+%g9ou+M>xmju76$SHj_V_QZJ8?!;^5tNJX|A`s5ePq4x0Z-p46+@l>!5$eZeRdp z16D5P0b-*%nEKv^E#PuIqy+9;zj7$x)OYao^N{d4tlfKe&^(cufCItSlhjpiWnRU7 z$dm(xNv&Uh%IG95&tNENa z^39WWzb83c?WRCpGekVw=;OR;=onWt17h>0{Gx@0+T=Iyn{d2cNh~jDU~NkDnaJnZ zzP*c;?=B+<(MXYDYJR#O%S`w8eb39(uck&G0~@p-)8(%PpY$axG6RFLAG$?u>$8^o zbGut+F|{y1&WEQyhH3!xn)Y;t-2rFDnG#d_$JSz%r;$-*hAGL)bFIxeoWe?6#7sCI zDFY}fjz}X<<$BwIKV6nkW29H!eTJ~|Fcr_2S?YX}ipd4OtQUV~1XgqMzQQm+?90t` z`1?B!8?|-Gn-^~PN2+cF{yeNpblH6<0ci;RMDSX)OV=lM^ysYG?f%Jo@Unpy~u#np?AJDjCoiO z7aRPStprI#E`!pH)$NB9?iOTA(`QH`*B=4jO@I6}H;~d6c;HP?MdX4?_sXO6kQB;@ zN6(GMX4P-s2byvDA`*HtXt&zu6E?+^KFtYtEFyG^3_&MSr&en{Mi@bm6{?% zr&FUfpOucb-1<}POcf;gGX9Y{HBT$N{SjBqh(ERTJ@8+#V*>AAG4Gd(9rp;x((hp% zsW)*ivj--de))HWvW)di@Oubp1?Gcmr764C2qp-?QckPX}HjK zKIrAKVPdkL`m4{m;fe5htT2G;YC^UH__TvZ{P=be{PN>N2Y(#x_AhEuRzmL=@s=VP zaQ$luoIugZ$?pqwDaVDuLlGGcURo}`Su33a&h#Y48fh2VADLZg-PANL6>qpjDjPF} ze|aD-8rcnzoMHZz5{EcNGacUu17Y#bRZ;z7^9gUwFP*l2QnapVO{}k|oAOw+Vul9p z0ensC=GepfhRDPqB5uEe~kdVB1eU0QF`JVQ_KlfkqU%~&9|9jE@-2IPs|42NZF@^Iwe^CM>9L1xhxHeO} z+jZD%ET89O3J1P@ChW1V{T_w3J)GOR3;_?f`0v!E@Ed_zaUg$r zcu-QD@#iU+@Xk#hc5)Zvpo>xD>QpN4I-Bt|l5u`c^; zox{~Ptlj#UMh{rnYo&eup7xf}U2A)YwEsm)@g~gFoGK(T!0TjjVXcF}e^Q^UOKqc} z64)?9&lsEdV2|F3goMCx`}Ao;5GLH*A}%QpBwR$ubBRzHWSBkLj@S|36UVi1bza@e zdG^z4Rhb)-s}>t93mYx1V6q5U_GwQ;neX8h5F0|U?fRL{09}QaK+5ws-_@(yP->fW z_t^p}Bc>k23inK>War9_uZ?}(zufr19EMo7Mt_GVP zhXm=N=~Pyh3n{S0|jxh~#f>x?ELy zD#snR^2xxM`=^`O&KjI+o4eKLU?HavZ0%~SFdc01m&(|v_MA7YKpGtzlEg;>3I2TR zJ`|Gm;4j2h8$Ek}WSv1bhw*Zht3N8&^;B(p?yP?VtsX%sBUreW6R#Pl>fzke5LB4l z(v}mfHUJovO)0zs(2jl70DEWnIX9T&u@D7Q+gr75DY&PN<70^Mg4Ab=!wcOcx2J(q z_qTsKLz-#X35E(}Pi)l|E7{JUx|n-DISBsY6Rv*lBc2hyT)RRC3-!;7oyY<2s|)@p!}(|zHpcgCdZ_X^B- z)$^17Y5=P01AOPYvw>B8$$ud$IH9VcoeLjmGBjeRS76vO2+|v2qzX9i?n=M}D$8DV z-vJcf6N@%2y*qQXP?%bHJ zv`rWn7)8HsF4bgEG~5_%25nnk+_o%L2(Qx*#V zD8*FYWqX);6>pvi`N%5oJk>`fC`tS$va`2W6vXPTu85W2L)Z7Hvl_M)D-~G z8#_xIr!Q;XM5$Cids>hTrJ^d~<6x(TT0JI5VcuPMNuUe&4n;kG4bzD_>gwfrefpS_ z>B%ej6pttW1=(+YhX~1vRJoJ|#~D-_t(?>(^l(}DK+cYCzoKsw4>(bYKx7t86=G`( zuT@z>$!>|ULpz=wqm5ea>M4YLoR6)qf--n{j7FJjFE?i^7KeB9R)UJv8}8`^yP{-` zuEU@Cb|_c>id4=?DEhd_B(LN2fqUxurx0-f*;ZoiqySb@dKH^~bR&Ywm@U#$&SxWb z-r08gP3hILX&KyD*cLe%WPx*ELKG_3Jvto~>Xq!s1Z{hwjh>sjjD%UXsU)wXGjh~Z zg=pg(L8&fBvvt%NRF#lQ<-x=H7Ryog;0WhIS+=ZS1(kTa86L-B!HgyOG^;PkpRecw z@;0)*%9&_v=}?R+e1wZV|M2JA(P}TD{re9A?+}qg8D!A@i?6$%JgHbRFljATzKRQF zfMuw&RfDfw)OeRyinfm!b@^Nyb||BD3+D|}H2s6-YCBoI0~EMz633of#?$3+=^3QH z;sSuKC8a%j=wf3=rWEMqqboR;IBDY7EAD1|ze?m9*5^K}?D=TyYq$CRyN*RTNvG-Y z_pO6NB~+Yu&7+X+oH$dom4rrs)XrZtxY-Dm*Si!9NOf7b?D9_KklL_CP_6 zk5=y^oL@;N^h+P_{0Q415vR@z)%%|ov-pu=g~)D-14u>48(hTrLQxmjkGgHZo69gx zYei!3BVbV%KLt;8Oex``y34^1kd*K_10H(~I3|UM+s{JAymEN?22zreVq!b?1pz#& z#~9XO^_XETjYrLue5H=nX+;1@o@NJzFwD5G96E0t_Yyvpl(bAqDj-~V=rD%dh=g@s z%SUYMl8H3I8tOU@u}$PkR?&G6sD!DZjBQzOW}A|cmWEC;#}WrwyUY|pytL$m&>ERN z6BPoE^4o-+xOXjzHgmXW_w{m1hpSK;;eLaUB(p>&Ya3%?vOMI?l#h}QF|=4qTzu_5ZW;M+#U$7Zrn;SVzRqWjkH;(w4OSPHhGS4)icAIR zMw+H}lXQD}dO~kkSX2qol2av?mR45_LnIwzwQMC__*gW@b_~CO1>IV)_!o~Kkmdg2 zH5AZNBfoha40#N4h@$Qm5vipu>gu9PRG`+;(yE->uX!tA7CE0~#=eqOR{DrWFBBl%-IyzE$o{<}C0Vq& zvc-&wIJvd}_v<~JAL`p;&$bA5>4``p*LFbe6n4jK&}uYgWK15H7#7E~p)NrZzLrt^ z7Tj{DAlJ&?ZEw8w$oyLIs70k&lNv}N@!hkuERgULT(@5B0>x3ztLE#grJ<1s3=~1K zktsGK8yZur7^-}Br63DKC|wcJ+Ja;v1qA7+Ko74BPlJm03FO&h12VV-xu3O)2}-Er zAq)97)d6pkS4$_Laodyr=;BqZu|R1cY73A%YFeU8s=F7}f?*8T5ot?%Aj_T?*}GdW z#S&((LXOsV65_9qX@Qrmev*j2<<>1H6Acup{;-vxcVuYnQ1sXCkh{G-_w2qRfL8S1|yH*ys%@=FiuAN=KT!%zo*Vss@^zquT7z+ zMwJ@=Bg^y?U%@pn(1nPHhcNNX6(s1Ado2C_o-N}SQ3b>zt9K_|^bKqe7jU>s%Kfo2 zOJZUEMIeCq^V*KV6kW0>(O=^Qi5w*5!;eOh(; z!^4losNm{SE*EaSyiYy~gj}8q#<@#NO5Ek9TlkG4uJxQ9D^%}AP4OF5YH4f3K^Mm% zVd@=v?D-t(DJ9Q|?2wj=Pr?qPRR9sKGc&7!Cg z4a?+@Wsw4buvhsVdUnG^P94l#YSmj@H@&6X)j@G`GQX&N2El7ZzN}jdB@XPC*D;QAHZTY-eAS?n-z#dJ`P?l|NCy^B zTeLgncE=J(OP(zoz}>Mt4|B-0+WMy$l@trrQVJAmk=~wY*efqTfA}01oF`1<)vC!K zGE!2B&Y-8N(ecrbL>(2cD9jnFiHzL7p!&I@;W=NPgLG+^q6tTH^!{bNlf+1R11|@M zqC2G+2?_byKYIjtEiM!g-5m>x%`?SpdzxzLxwX?@LUo^-Tfo8SffP$|XKYt@3}6x5 zVl_3=Wj^O;VlWub(vnTldwH7KK&bP=#3LypZ2FtBPeP=BI9+rcRQ*0Hulq-XNu5fpTnf2Y*7dvnw(s=+N14w;hjk& zqpCQ!7Uy{G@b@Iv$@nng>fOU;K0yAqr>hRKvbZ#5EY&!=Lfzx zHi&)OtA%`66e8qQ8FTjC# z8ttcy8C&|bou+QSMzj;VM`v5Ovmr|07u`1eY?+();mT=X(8<9R+_K8*Fg_|KE-uzP zf}St*!`0ur!HbN4@hSAmtr9PFlEs}Sb7lP60#8dxcU2X)rKU2T2a0v35@$hs3dBbv zqLc4%cQrm$qoRg-J>gV++BjjS3jex%6i6@d))Vz-8RG=I!Z)hAoq=uII|>DJoi~2Y zwZJB8Ka4e+V32d)ULwt-g3^<12UEbyO~s8%K$pdO8R2TRlmVrfo)kWV;}UxlHjUYb zjN2A4@0rh(@=KIA!ztK&+zBIOsZPr)g{wSTxPypXeWkbrA*zQD4N5$_iM3`V6Mo(| zW)t^FzK@F@T2`u{SUAYp^)OD5n#SDUD>Cx#)55y90)}PcwB)J)sZFy;)I{Tw0vW*n ze2%Q8)_WVe&Yv9gZ2_l14(%efkFK#XTB$@v&G{V=n~xsu(#L74vL3kod!lZDl|;Nw#0kmv*xewYOntJAZktVh-ASj^T9p=L}>bVGK4Il@H5vp82SDaW%~Ci#s80 z8G1xV>-tXDUMneAnzww{+}*s7;068trf}ien~)2-NEsOfnmVW5(pgZU&DUuh*63X0 zHlkf0NJ$bNyMA7gx!xx%-%Iu9Qu>*M~nus;-O>Q2m91RXrMU8Ijc=oX|Q_3LH z&7%IM{@uwYxA|!*o7eYQWWOD@;clzZ3K1#IZ896cLZN*F0~=Xx^NsaJqf;HbJ(^Do z$HkChO>}?nb^Z}=)hyf0%gYleN#u^CiZ7?8E=pU!Mrg56F~eSIqSp`sidy8|iu20ERT!N1vHNAhd)Yef#^PZYj? zsoZUU_XZ(0A~gzmTR~S=TB_j_&cQU!RAKa)m`J zHnZw0Q@GVu^HN9N+i(iTpMj^*Zg69(1{rw^v10S9%H^4GOa8m(HV6YHSnu6@)&9jHExNmeFM8OKgI!NT6J(mI$FTx+^4CRc*c)9#dI7Tz$czqaTP`s-H4%>Ww?bY%IcA-F@=Ez&F7@O^ z>n)0iI4{KRsr24is>QZ`{_FZ5DpU5k6%EJks1M9sx{&w3dP0KT`(~V6QNa+BeU6a%$^2uE~u&n(-NA=Srp50R=@4QfKz$ zm%sMl%w!)7Y78fw&)qe)TMqiTrC3H5IGi=veldL4TCk&{SRbN-U?iZPay`Ynsh|nJ z>h@t7Z*6Wa7K+eDhm2U^_4$T+$A#|u`+NPkQ)w++0~~d-c#(Aa`#XZD`_H-kA_s0B z9v(|cJ;JBi20U&>E(jyxdh+HO1J>&auPGE`^h<;0y6u~hCS<9^WK%S>d3h|wS3=LWJyh$G^Nnod&l#Jy0i{eD5vMN zfZuTrE%X@tN@MHO-k`FG5VP7s%SJy0Jc!Q_x*I`|?p(b;?P3_w`4wYY4GE4Ni`1bx zqNbUz+@!IIopGKNv*aCcfzyl{If2BT`gdG=2G%scDZs-$mESrC1OytLzEnfPi`~srm9g3Gq->(o(Ecco*{D032jCivR!s literal 0 HcmV?d00001 diff --git a/files/icon-application-icon.png b/files/icon-application-icon.png index 368313161fb5c399c3fafa3cac28cafcb854faba..eba1d154c3fd95db40809f06928516b9d97178aa 100644 GIT binary patch delta 3788 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∨k5<`mlu*XIUPCVgtM@+I|1% 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 From e579d096edc4431e1113ce1de6bb3cfd92dcd123 Mon Sep 17 00:00:00 2001 From: Pajka Date: Sat, 13 Aug 2011 01:11:09 +0200 Subject: [PATCH 0130/1741] en/php-language-enhancements: created --- en/php-language-enhancements.texy | 297 ++++++++++++++++++++++++++++++ 1 file changed, 297 insertions(+) create mode 100644 en/php-language-enhancements.texy diff --git a/en/php-language-enhancements.texy b/en/php-language-enhancements.texy new file mode 100644 index 0000000000..e59e547a72 --- /dev/null +++ b/en/php-language-enhancements.texy @@ -0,0 +1,297 @@ +PHP language enhacements +******************** + +/--div .[perex] +Nette Framework extends the object model of PHP with a few syntax candies. Do you like candy? Continue reading and you will find out more. + +- why you should use `Nette\Object` +- what is a *property* +- how to call events +- how to add methods to a class +- how to use @annotations +\-- + +In this chapter we are focusing on Nette\Object, a class extending PHP's object model. It is the ancestor of almost all classes in Nette Framework. Being transparent and non-conflicting, it can be used as an ancestor for every class you make. + + +Strict classes +============== + +PHP gives a huge freedom to developers, which makes it a perfect language for making mistakes. But you can stop this bad behavior and start writing applications without hardly discoverable mistakes. Do you wonder how? It's really simple -- you just need to have stricter rules. + +Can you find an error in this example? + +/--php +class Circle +{ + public $radius; + + public function getArea() + { + return $this->radius * $this->radius * M_PI; + } + +} + +$circle = new Circle; +$circle->raduis = 10; +echo $circle->getArea(); // 10² * π ≈ 314 +\-- + +On the first look it seems that code will print out 314; but it returns 0. How is this even possible? Accidentaly, `$circle->radius` was mistyped to `raduis`. Just a small typo, which will give you a hard time correcting it, because PHP does not say a thing when something is wrong. Not even a Warning or Notice error message. Because PHP does not think it is an error. + +The mentioned mistake could be corrected immediately, if class `Circle` would be descendant of [api:Nette\Object]: + +/--php +class Circle extends Nette\Object +{ + ... +\-- + +Whereas the former code executed succesfully (although it contained an error), the latter did not: + +[* debugger-circle.png *] + +Class `Nette\Object` made `Circle` more strict and threw an exception when you tried to access an undeclared property. And `Nette\Diagnostics\Debugger` displayed error message about it. Line of code with fatal typo is now highlited and error message has meaningful description: *Cannot write to an undeclared property Circle::$raduis*. Programmer now can fix the mistake he could have missed and would have a real trouble debugging it later. + +One of many remarkable abilities of `Nette\Object` is throwing exceptions when accessing undeclared members. + +/--php +$circle = new Circle; +echo $circle->undeclared; // throws Nette\MemberAccessException +$circle->undeclared = 1; // throws Nette\MemberAccessException +$circle->unknownMethod(); // throws Nette\MemberAccessException +\-- + +But it has much more to offer! + + +Properties, getters a setters +============================= + +In modern Object oriented languages *property* describes members of class, which look like variables but are represented by methods. When reading or assigning values to those "variables", methods are called instead (so-called getters and setters). Now you have access to those variables under your control, which can render itself really useful. You can easily validate inputs or generate data only when you need them. + +Being a descendant of `Nette\Object` gives that class ability to imitate properties. Only thing you need to do is keep with these simple convetions: + +- Getter and setter have to be a *public* method. +- Getter's name is `getXyz()` or `isXyz()`, setter's is `setXyz()` +- Getter and setter are optional, you can have *read-only* or *write-only* properties +- Names of properties are case-sensitive (first letter being an exception) + +We will make use of properties in class Circle to be sure variable `$radius` has only non-negative numbers: + +/--php +class Circle extends Nette\Object +{ + private $radius; // not public anymore! + + public function getRadius() + { + return $this->radius; + } + + public function setRadius($radius) + { + // sanitising value before saving it + $this->radius = max(0.0, (float) $radius); + } + + public function getArea() + { + return $this->radius * $this->radius * M_PI; + } + + public function isVisible() + { + return $this->radius > 0; + } + +} + +$circle = new Circle; +// classic way with calling methods +$circle->setRadius(10); // sets circle's radius +echo $circle->getArea(); // gets circle's area + +// alternative way with the usage of properties +$circle->radius = 10; // calls setRadius() +echo $circle->area; // calls getArea() +echo $circle->visible; // calls $circle->isVisible() +\-- + +Properties are mostly a syntactic sugar to beautify code and make programmer's life easier. You do not have to use them, if you do not want to. + +Events +======== + +Now we are going to create functions, which will be called when border radius changes. Let's call it `change` event and those functions event handlers: + +/--php +class Circle extends Nette\Object +{ + /** @var array */ + public $onChange; + + public function setRadius($radius) + { + // call events in onChange + $this->onChange($this, $this->radius, $radius); + + $this->radius = max(0.0, (float) $radius); + } +} + +$circle = new Circle; + +// adding event handler +$circle->onChange[] = function($circle, $oldValue, $newValue) { + echo 'there was a change!'; +}; + +$circle->setRadius(10); +\-- + +There is another syntactic sugaar in `setRadius`'s code. Instead of iteration on `$onChange` array and calling each method one by one with unreliable (does not report if callback has any errors) function [php:call_user_func] you just have to write simple `onChange(...)` and given parameters will be handed over to handlers. + +Extension methods +================== + +Do you ever have to add new method to an existing object or class at runtime? **Extension methods** is just what you need. + +/--php +// declaration of future method Circle::getCircumference() +Circle::extensionMethod('getCircumference', function (Circle $that) { + return $that->radius * 2 * M_PI; +}); + +$circle = new Circle; +$circle->radius = 10; +echo $circle->getCircumference(); // ≈ 62.8 +\-- + + +Extensions methods can also take parameters. They don't break encapsulation, because they only have access to public members of class. You can also connect them with interfaces, therefore every class implementing that interface will have that method available. + + +Reflection +======= + +If you need to find every information about any class, reflection is the right tool to do it. You can easily find out which methods does any class have, what parameters do those methods accept, etc. `Nette\Object` simplifies access to class' self-reflection with method `getReflection()`, returning a [ClassType | api:Nette\Reflection\ClassType]) object: + + +/--php +$circle = new Circle; +echo $circle->getReflection()->hasMethod('getArea'); // does method 'test' exist? +echo $circle->getReflection()->getName(); // returns class' name ('Circle') +\-- + +Even in this case we can make use of [property |#Properties, getters and setters] convetions and change the last line to: + +/--php +echo $circle->reflection->name; // returns 'Circle' +\-- + + +Reflection can obtained without direct relation with `Nette\Object`: + +/--php +// getting PDO class reflection +$classReflection = new Nette\Reflection\ClassType('PDO'); + +// getting PDO::query method reflection +$methodReflection = new Nette\Reflection\Method('PDO', 'query'); +\-- + + +Annotations +======= + +Reflection has really a lot to do with annotations. They are written into phpDoc comments (two opening asterisks are mandatory!) and start with `@`. You can annotate classes, variables and methods: + +/--php +/** + * @author John Doe + * @author Tomas Marny + * @secured + */ +class FooClass +{ + /** @Persistent */ + public $foo; + + /** @User(loggedIn, role=Admin) */ + public function bar() {} +} +\-- + +In code there are these annotations: + +- `@author John Doe` - string, contains text value `'John Doe'` +- `@Persistent` - boolean, its presence means `TRUE` +- `@User(loggedIn, role=Admin)` - contains associative `array('loggedIn', 'role' => 'Admin')` + + +If class has an annotation can be checked via `hasAnnotation()` method: + + +/--php +$fooReflection = new Nette\Reflection\ClassType('FooClass'); +$fooReflection->hasAnnotation('author'); // returns TRUE +$fooReflection->hasAnnotation('copyright'); // returns FALSE +\-- + +Values can be acquired with `getAnnotation()`: + +/--php +$fooReflection->getAnnotation('author'); // returns string 'Tomas Marny' + +$fooReflection->getMethod('bar')->getAnnotation('User'); +// returns array('loggedIn', 'role' => 'Admin') +\-- + +.[caution] +Previous definitions are rewritten with newer ones, sou you will always get the last one. + +All annotations can be obtained with `getAnnotations()`: + +/-- +array(3) { + "author" => array(2) { + 0 => string(8) "John Doe" + 1 => string(11) "Tomas Marny" + } + "secured" => array(1) { + 0 => bool(TRUE) + } +} +\-- + + + +Callback +======== + +Callbacks in *PHP* are represented with arrays (ie. `array($this, 'processLoginForm')`) or with strings (ie. `'Helpers::myCallbackMethod'`). Nette Framework creates new pseudo keyword `callback`: + +/-- +$callback = callback($this, 'processLoginForm'); +$callback = callback('Helpers::myCallbackMethod'); +\-- + +What are the advantages? +- it is obvious it is a callback +- checks if it is a valid callback +- unifies behavior of older PHP versions (< 5.2.3) which do not support string definitions 'Foo::bar' + +Callback can be easily invoked because variable `$callback` stores instance of [api:Nette\Callback] + +/--php +$callback->invoke([arg, ...]); + +$callback->invokeArgs($args); + +$callback([arg, ...]); // requires PHP 5.3 +\-- + + +{{themeicon: icon-coffee.png}} From c524d908b12e36673c19d769059a314418a1b067 Mon Sep 17 00:00:00 2001 From: Semik Date: Sat, 13 Aug 2011 10:45:49 +0200 Subject: [PATCH 0131/1741] cs/php-language-enhancements: Bad method name in comment. --- cs/php-language-enhancements.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/php-language-enhancements.texy b/cs/php-language-enhancements.texy index 97327083c2..ff0f158028 100644 --- a/cs/php-language-enhancements.texy +++ b/cs/php-language-enhancements.texy @@ -185,7 +185,7 @@ Reflexe nám umožňuje zjistit takové informace, jako jaké metody má daná t /--php $circle = new Circle; -echo $circle->getReflection()->hasMethod('getArea'); // existuje metoda test? +echo $circle->getReflection()->hasMethod('getArea'); // existuje metoda 'getArea' ? echo $circle->getReflection()->getName(); // vrací název třídy, tj. 'Circle' \-- From 662f949ae318992243d0666fad2e3506eab270ee Mon Sep 17 00:00:00 2001 From: smasty Date: Sat, 13 Aug 2011 14:31:04 +0200 Subject: [PATCH 0132/1741] en/routing: mini fix --- en/routing.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/routing.texy b/en/routing.texy index f07c947d84..ae20ef42e0 100644 --- a/en/routing.texy +++ b/en/routing.texy @@ -65,7 +65,7 @@ $route = new Route('/[/]', 'Homepage:default'); This route is usable by for all presenters and actions. Accepts a path such as `/article/edit/10`, as well as `/catalog/list`, because the `id` part is wrapped in square brackets, which marks it optional. -Because other parameters (`presenter` and `action`) do have default value (`Homepage` and `default), they are optional too. If their value is same as the default one, they are skipped while URL is generated. Link to `Product:default` generates only `http://example.com/product` and `Homepage:default` links to `http://example.com/`. +Because other parameters (`presenter` and `action`) do have default value (`Homepage` and `default`), they are optional too. If their value is same as the default one, they are skipped while URL is generated. Link to `Product:default` generates only `http://example.com/product` and `Homepage:default` links to `http://example.com/`. Mask can not only describe relative path to web root, but can as well tak absolute path (as long as it beging with a slash) or even absolute URL (if starts with double-slash): From 6f9f3d8929f26d28f2508fd691af19422f4b7b43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Sat, 13 Aug 2011 16:01:28 +0200 Subject: [PATCH 0133/1741] en/presenters: created --- en/presenters.texy | 639 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 639 insertions(+) create mode 100644 en/presenters.texy diff --git a/en/presenters.texy b/en/presenters.texy new file mode 100644 index 0000000000..913d6319b7 --- /dev/null +++ b/en/presenters.texy @@ -0,0 +1,639 @@ +MVC applications & presenters +***************************** + +/--div .[perex] +We will learn, how to create applications in Nette Framework. After this chapter you will know: + +- MVC, directory structure and file `bootstrap.php` +- what are presenters and actions +- how to use templates +- what are persistent parameters +\-- + + +Model-View-Controller (MVC) +=========================== + +Model-View-Controller is software architecture, that was created to satisfy the need to separate in application with graphical interface, utility code (controller) from application logic code (model) and from code for displaying data (view). With this approach we create better understandable application, simplify future development and enable testing each units of application separately. + + +Model +----- + +Model is data and especially functional base of whole application. It contains application logic. Any user action (login, insertion of goods to basket, change of value in database) represents model action. Model is managing his internal state and provides solid interface to outside. By calling methods of this interface, we can read or update its state. Model doesn't know anything about view or controller. + +.[note] +Concept of *Model* represents whole layer, not only separate class. + + +View +---- + +View is application layer, that is taking care of displaying result of request. Usualy uses templating engine and knows, how should be each component rendered or result acquired from model. + + +Controller +---------- + +Controller does handle requests from user, calls relevant application logic (model) and then asks view to display data. Analogically for controllers in Nette Framework there are [presenters |glossary#presenter]. + + + +Directory structure +=================== + +When you look at `sandbox` after downloading of Nette Framework package, you will see recommended directory structure: + +/--pre +sandbox/ + app/ ← directory with application + models/ ← model layer and it's classes + presenters/ ← classes of presenters + HomepagePresenter.php ← Homepage presenter class + + templates/ ← templates directory + @layout.latte ← template of shared layout + Homepage/ ← tempaltes of Homepage presenter + default.latte ← template of action default + + config.neon ← application configuration file + bootstrap.php ← application boot file + + libs/ ← directory with libraries (for example 3rd parties) + Nette/ ← your favourite framework + ... + + log/ ← contains logs, errors, etc. + temp/ ← for temporary files, cache, ... + www/ ← public directory, document root of project + .htaccess ← rules for mod_rewrite + index.php ← triggers the application + images/ ← another directories, images, styles, .. +\-- + +Moreover in some directories, there are `.htaccess` and `web.config` files, that denies access from browser (for Apache or IIS). Make sure, that this is working, and you cannot reach `app/` and `libs/` directory from browser. + +.[note] +Don't forget to grant write privilege (`chmod 0777`) to directories `log/` and `temp/`. + + +index.php & bootstrap.php +------------------------- + +Browser is sending all requests through one and only file, located in public directory `www/` and that is `index.php`. Inside his body isn't happening almost anything. There are only definitions, describing directory structure of application (`$params['wwwDir']` and `$params['appDir']`) and passing of the control to the application (that is the `app/` directory) to the boot file `bootstrap.php`. + +.[note] +Nette Framework is saving all its paths consistently, without the right trailing slash. + +Described directory structure is realy just recommended, because you can easily change it however you want to. And all you have to do, is rename directories and change paths in `index.php` or `bootstrap.php`. + +First, file `bootstrap.php` loads Nette Framework: + +/--php +require $params['libsDir'] . '/Nette/loader.php'; +\-- + +Actives [debugger and logger |debugging] in strict mode: + +/--php +use Nette\Diagnostics\Debugger; + +Debugger::$logDirectory = __DIR__ . '/../log'; +Debugger::$strictMode = TRUE; +Debugger::enable(); +\-- + +And creates so called [DI context |configuring] by loading configuration file `config.neon`. Everthing else depends on it. + +/--php +$configurator = new Nette\Configurator; +$configurator->container->params += $params; +$configurator->container->params['tempDir'] = __DIR__ . '/../temp'; +$container = $configurator->loadConfig(__DIR__ . '/config.neon'); +\-- + +Sets rules for [routing |routing], to enable translate the URL addresses into [a presenter action |#processing-presenter-action]. This rule, among others, says, that default action of presenter will be `Homepage:default`. + +/--php +$router = $container->router; +$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY); +$router[] = new Route('/[/]', 'Homepage:default'); +\-- + +Sets parameters of application, for example error presenter, that will be in production environment take care of displaying appropriate messages, when error occurs: + +/--php +$application = $container->application; +$application->errorPresenter = 'Error'; +\-- + +If we wanted to do execute any other tasks, like connecting to database, it's appropriate to add this on `onStartup` event of application: (note: it's generally better to let [DI container |configuring] take care of connecting to database). + +/--php +$application->onStartup[] = function() { + ... we will connect to database ... +}; +\-- + +And we will run the application: + +/--php +$application->run(); +\-- + +And that's it. + + +Modules +------- + +When developing complex applications, we can separate directories with presenters and templates to subdirectories, we call them modules. If our application would contain, for example modules `Front` and `Admin`, its structure could look like this: + +/--pre +sandbox/ + app/ ← directory with application + models/ ← model layer and its classes + AdminModule/ ← Admin module + presenters/ ← its presenters + templates/ ← its templates + + FrontModule/ ← Front module + presenters/ ← its presenters + templates/ ← its templates + + config.neon ← application configuration file + bootstrap.php ← application boot file + ... +\-- + +Modules don't have to be arranged in flat structure, you can even create submodules. + + + + +Processing presenter action +=========================== + +Now listen up closely, please. Every request on our application will reach through files `index.php` and `bootstap.php` into object `$application`. But, that one doesn't understand to http requests, because of that, it will ask [router | routing], to translate the request into something, that he can understand. Thus to tell him, for what **presenter** is request meant and what **action** should it execute. For example, router answers, that user want's action `show` of presenter `Product` (it's good habit to write it like `Product:show`) and passes parameter `id = 123`. You can read it like: user want's to show product with id 123. + +This is finally understandable to `$application` and it will proceed to fulfill the wishes. It will create object of class `ProductPresenter`, that represents presenter `Product`. (To be completely accurate, application asks for creation of presenter the `presenterFactory` service). And presenter will ask for execetion of action (`show` with parameter `id`). + +Presenter is object, that takes the request, translated by router and devises the answer. Answer can by HTML page, image, XML document, file on hard drive, JSON, redirection or anything that you need. Specifically `ProductPresenter` asks model for data, that it will pass to template for displaying. This is usually done in method `renderShow`, where word `Show` corresponds to the name of action and request parameter `id` will be passed to the method as argument: + +/--php +class ProductPresenter extends Nette\Application\UI\Presenter +{ + function renderShow($id) + { + // we will get data from model and pass it to template + $this->template->product = $this->model->getProduct($id); + } +} +\-- + +Then will presenter render the template. + + +Templates +--------- + +Presenter will deduce the path to the template from simple logic. It will try, for presenter `Product` and action `show`, if exists one of these files: + +/-- +- templates/Product/show.latte +- templates/Product.show.latte +\-- + +Besides the `.latte` extension, you can use the `.html` extension too. + +Presenter will also try to search for layout (that is optional): + +/-- +- templates/Product/@layout.latte +- templates/Product.@layout.latte +- templates/@layout.latte layout shared by multiple presenters +\-- + +(You can change the way of searching the templates by overriding the [formatTemplateFiles |api:Nette\Application\UI\Presenter::formatTemplateFiles()] or [formatLayoutTemplateFiles |api:Nette\Application\UI\Presenter::formatLayoutTemplateFiles()] methods.) + +Presenters and its components passes to templates few useful variables: + +- `$basePath` is absolute URL path to root dir (for example `/CD-collection`) +- `$baseUrl` is absolute URL to root dir (for example `http://localhost/CD-collection`) +- `$user` is object [representing the user |security] +- `$presenter` is current presenter +- `$control` is current component or presenter +- `$flashes` list of [messages |#flash-messages] sended by method `flashMessage()` + +You can read more details about template rendering in [separate chapter |templating]. + +Actually it's not hard at all! When you're requesting action, for example `Homepage:default`, then + +1) will be created object of class `HomepagePresenter` +2) method `renderDefault()` will be called (if it exists, but it doesn't have to) +3) template, for example `templates/Homepage/default.latte` with layout, for example `templates/@layout.latte`, will be rendered + +and in template we can [create link |#Linking] to mentioned `Product:show($id)`, roughly like this: + +/--html +product detail +\-- + +I think that making of applications in Nette will be easy. + + +Modules +------ + +For more complex applications, that separates presenters to modules, everything works wery similarly. Lets say, that our application contains module `Front`, and it contains presenter `Product`. Action `show` can than be written as `Front:Product:show` and class `ProductPresenter` will be placed into namespace `FrontModule`: + +/--php +namespace FrontModule; + +class ProductPresenter extends Nette\Application\UI\Presenter +{ + ... +\-- + + + +Linking +======= + +Creation of links belongs to the strongest features of Nette Framework. Thanks to [two-way routing |routing] you don't have to hardcode your URLs or nastily assemble them. You can just refer to actions of presenters, and pass them parameters and framework will generate URLs by itself. Creating of link is as easy as calling a function. You will realy like it! + +When programming and coding templates, we don't have to care about URLs design, we will refer directly to action of presenter, that's for example already mentioned `Product:show`. + + +Links in templates +------------------ + +Most often we create links in templates. To make it as easy as possible, framework does offer even three macros. Smartest of them is macro `n:href` + +/--html +product detail +\-- + +Note, that instead of HTML attribute `href` we've used [n:macro |templating#n-macros] `n:href`. It's value isn't URL, as you were used to at `href` attribute, but directly action of presenter. With syntax + +/-- +[Presenter:]action [,] [arg1] [, arg2] [, ...] +\-- + +After click on link, method `ProductPresenter::renderShow()` will get its word and as parameter `$id` will get value of `$productId`, We can pass even more parameters, in the same way, as we call a method. Could it be even easier? + +.[note] +It's better to follow convetion of first big letter for name of presenter and small for action. As separator is used colon. + +Besides that, it's even possible to pass named parameters. Next link passes parameter `lang` with value `cs`: + +/--html +product detail +\-- + +Allthough method `renderShow` doesn't have `$lang` in it's declaration, it can read the value of this parameter by calling `$lang = $this->getParam('lang')`. + +If we have all parameters in array, we can expand them with operator `(expand)`: + +/--html +{var $args = [$productId, lang => cs]} +product detail +\-- + +If is template, in which we are creating link, part of `Product` presenter, we can name of presenter skip and write directly `n:href="show $productId"`. Or the other way, if link leads to the action named `default`, you can skip that and write `n:href="Product: $id"` (don't forget the colon). + +Links can even refer to other [modules |#modules]. Here we distinguish, if it's refering "relatively" to submodule, or "absolutely" to different module - then path begins with colon. Lets assume, that actual presenter is part of module `Front`, then we will write: + +/--html +link for Front:Shop:Product:show +link for Admin:Product:show +\-- + +Special case is linking to itself, when we'll write `this` as a target. + +Generated link is in absolute path format. When you want to generate absolute link including domain, for example `http://example.com`, we will supply two slashes at the beginning `n:href="//show $productId"`. + +We can refer to specific part on page using so called fragments behind the symbol of grid `#`: + +/--html +link to Product:show and fragment #comments +\-- + +Macro `n:href` is realy handy when we are creating HTML tag ``. When we want to print link elsewhere, for example in text of the template, we will use macro `{link}` with the same internal syntax: + +/--html +The address is: {link Product:show $productId} +\-- + +Read more details about syntax of [Latte templates |default-macros]. + + +Linking in presenter +-------------------- + +Presenter and [a component | api:Nette\Application\UI\PresenterComponent] has method `link`, which can be used to create links just like in template. First argument is target action of presenter, followed by passed parguments: + +/--php +$url = $this->link(destination [,arg [,arg ...]]); +\-- + +They can also be passed using an array. Examples: + +/--php +$url = $this->link('Product:show', $productId); + +$url = $this->link('Product:show', array($productId, 'lang' => 'en')); +\-- + + + +Invalid links +------------- + +It may happen that we create invalid link - either because it refers to nonexisting presenter, or beacuse it passes more parameters that the target method receives in its definition, or when there can't be generated URL for targeted action. What to do with invalid link is determined by static variable `Presenter::$invalidLinkMode`. It can become on of these values (constants): + +- `Presenter::INVALID_LINK_SILENT` - silent mode, there will be returned symbol `#` as URL +- `Presenter::INVALID_LINK_WARNING` - visual warning +- `Presenter::INVALID_LINK_EXCEPTION` - there will be thrown an exception InvalidLinkException + +Default setup in production mode is `INVALID_LINK_SILENT` and in development mode it's `INVALID_LINK_WARNING`. When setup to `INVALID_LINK_WARNING`, presenter and components returns error message as URL which stars with `error:`. To make such links visible, we will add CSS rule to our stylesheet: + +/--code css +a[href^="error:"] { + background: red; + color: white; +} +\-- + + + +Persistent parameters +--------------------- + +Except classic parameters, that we know by now, there are so called persistent parameters. Those are different in very essential feature: **they are passed through requests automaticaly.** That means, we doesn't have to explicitly mention them in links, but they are anyway passed. + +When your application have multiple language variants, passing of actual language in every link will be incredibly tiring. But that's not needed with Nette Framework. You can simply mark parameter `$lang` as persistent just like this: + +/--php +class ProductPresenter extends Presenter +{ + /** @persistent */ + public $lang; + + ... +\-- + +If actual value of parameter `$lang` will be `'en'`, into link + +/--html +detail produktu +\-- + +will be automaticaly passed parameter `lang => en`. Great! + +But we can also write parameter `lang` and by that, change its value: + +/--html +detail in czech language +\-- + +The parameter will be accessible in class variable `$lang` in object of `ProductPresenter` and it can be accessed through `$this->lang`. We can even set the default value of persistent parameter to presenter class. If parameter value will correspond to default value, it will not be passed in URL. + +.[note] +Persistent variable must be declared as public. + +Persistence reflects hierarchy of presenter classes, thus parameter defined in specific presenter will be automaticaly taken into account in every single presenter inheriting from him. + + + +Life cycle of presenter +======================= + + +We know by now, that action of presenter causes invoking of method `render`, thus for example `renderShow`. But it's not the only method, that gets invoked. When writing presenters, we can write following methods: + + +[* lifecycle2.gif *] *** *Life cycle of presenter* .<> + +`startup()` +--------- + +Method `startup()` gets invoked immediately after creation of presenter. It inicializes variables nad checks for user privileges. + +.[note] +When you would write your own `startup()` method, don't forget to call its ancestor `parent::startup()`. + +`action()` +------------------ + +Analogy to method `render()`. There are situations, when presenter executes some specific action (authenticates the user, writes to database) and then redirects to somewhere else. Name such a method `render` would be inappropriate, because method doesn't render anything. Because of that, there is alternative with name `action`. + +It's important to know, that method `action()` get's called before `render()` method. It can even decide to change what render method gets invoked, by calling `$this->setView('otherView')` (`renderOtherView()` will get invoked). + +`handle()` +------------------------- + +Method handles so called [signals |components#signal-aka-subrequest] aka subrequests. Designed mainly for components and handling of AJAX requests.davků. + +`beforeRender()` +----------------- + +Method `beforeRender`, as the name suggests, gets invoked before `render()` and it can contain for example setup of template, passing of variables to template common for more views and so on. + +`render()` +---------------- + +Usualy passes required data to templates. + + +`shutdown()` +------------- + +Gets invoked at the end of the life cycle of presenter. + +.[note] +More accurate would be to say, that we were talking about life cycle of class [api:Nette\Application\UI\Presenter], from which are presenters inherited most often. In general, presenter is any class implementing simple interface [api:Nette\Application\IPresenter] and one such laternative uses [Micro-framework | micro-framework]. + + +Termination of presenter +------------------------ + +We can terminate presenter anytime during his life cycle. We usualy do this, to prevent renderinf of template. + +- termination of presenter directly by method: `$presenter->terminate()` +- termination of presenter and immediate render the template: `$presenter->sendTemplate()` +- termination of presenter and dispatch of the payload: `$presenter->sendPayload()` (for AJAX) +- termination of presenter and dispatch of own response: `$presenter->sendResponse($response)` + +Presenter can be terminated also by redirecting or by throwing a BadRequestException. + + +Redirection +=========== + +There are two methods `redirect()` and `forward()` for jumping to another presenter, which have similar syntax as mentioned [link() |#Linking]. For example after submitting of form and writing to database, we will redirect to details of product by calling: + +/--php +$this->redirect('Product:show', $id); +\-- + +While `forward()` will pass to new action without redirecting, method `redirect()` will redirect browser with HTTP code 302 or 303. If we would want to use different code, we will put it before the name of the action of presenter: + +/--php +$this->redirect(301, 'Product:show', $id); +\-- + +To different URLs to outside of application, you can redirect using `redirectUrl()`: + +/--php +$this->redirectUrl('http://nette.org'); +\-- + +Redirection immediately terminates activity of the presenter by throwing so called terminating exception `Nette\Application\AbortException`. + +Sometimes, before redirection, we want to send so called [flash message |#Flash messages]. That's a message, that will appear after redirection in template. + + +Error 404, etc. +=============== + +When we can't fulfill the request, because for example the record is missing in database, we will throw an exception `Nette\Application\BadRequestException`, which represents HTTP error 404: + +/--php +function renderShow($id) +{ + $product = $this->model->getProduct($id); + if (!$product) { + throw new Nette\Application\BadRequestException; + } + ... +} +\-- + +When user is not authorized to see the page, we will throw a `Nette\Application\ForbiddenRequestException` exception (error 403). Other error codes can be returned using second argument of `Nette\Application\BadRequestException`. + + + +Flash messages +============== + +They are messages informing about result of some operation. Important feature of flash messages is, that they are available in template, even after redirection. Even when displayed, they are available next three seconds - in case that user would unintentionally refresh page - thus message will not by lost. + +Method [flashMessage |api:Nette\Application\UI\Control::flashMessage()] takes care about passing to template. First argument is text of message and second optional argument is it's type (error, warning, info apod.). Method `flashMessage()` returns instance of flash message, to allow us to add more information. + +/--php +public function deleteFormSubmitted($form) +{ + ... model asks for deletion of record ... + + // we will pass the flash message + $this->flashMessage('Item was removed.'); + + $this->redirect(...); // and redirect +} +\-- + +These messages are available in template in variable `$flashes` as annonymouse objects, that consists of property `message`, and `type` and they can even contain previously mentioned user-defined information. They can be rendered for example like this: + +/--php +{foreach $flashes as $flash} +

    {$flash->message}
    +{/foreach} +\-- + + + +Presenter and components +======================== + +When we talk about presenters, then under the term [components |components] we usualy mean descendants of class [Control |api:Nette\Application\UI\Control]. More accurate would be to use term "controls", but it has different neaning in czech language and "components" did better catch on. + +Presenter `Nette\Application\UI\Presenter` by itself, is descendant of class `Control`, so there is major similarity between components and presenter. But mainly `UI\Control` (and thus even `UI\Presenter`) is so called component container. Which means, that you can add into him another components. Just like we add to [form |forms] inputs (text field, button, ...). And just like with forms, you can access them through brackets: + +/--php +// attach component at presenter +$presenter['mymenu'] = new MenuControl; + +// get component from presenter and render +$presenter['mymenu']->render(); +\-- + + +With attaching of the component to the presenter (their bind) you will be able to: +- create links in component +- use [signals |components#signal-aka-subrequest] +- use persistent parameters in components + +When you don't need any of these features, we don't have to bind component with presenter. + + +Component factory +----------------- + +Component factory is an elegant way to create components only when they are realy needed (lazy / on demand). Whole magic is in implementation of method with name `createComponent()`, where `` is the name of component, that will create and return desired component. Component is then attached to presenter. To method `createComponent()` is optionaly passed `$name` of component, that is beeing created, as argument. + +/--php +class DefaultPresenter extends Nette\Application\UI\Presenter +{ + public function renderDefault() + { + $menu = $this['menu']; // access to component + // if this was the first access, method createComponentMenu() will be called + ... + } + + protected function createComponentMenu() + { + // create and configure component + $menu = new MenuControl; + $menu->items = $this->item; + // and return it + return $menu; + } +} +\-- + +.[note] +Component name always starts with lowercase letter, despite that they are with uppercased first letter in name of factory. + +Because all components are created in a separated methods, code is cleaner and clearer. + +We never call factories directly, it gets called automaticaly, when we use the component for the first time. Thanks to that, the component is created at the right moment, and only if it's realy needed. If we wouldn't use the component (for example on some AJAX request, where we return only part of the page, or when parts are cached), it wouldn't even be created and we save performance of the server. + +You can access and render component using [macro {control} |default-macros#toc-components-rendering]. So there is no need of manualy passing the components to template. + +/--html +

    Edit form

    + +{control editForm} +\-- + + +You can read more detailed information about components on [separate page |components]. + + + +Persistent components +--------------------- + +Not even parameters, but also components can be persistent. Their state is then passed around when jumping to another presenter, just like with [persistent parameters |#persistent parameters]. We mark persistent components with this annotation (here we mark components `calendar` and `menu`): + +/--php +/** + * @persistent(calendar, menu) + */ +class DefaultPresenter extends Presenter +{ + ... +} +\-- + +You don't have to mark subcomponents as persistent, they would be persistent automaticaly too. + + +Where can i get some components? +-------------------------------- + +On page [Add-ons, plugins and components |addons:homepage] you can find some open-source components, that were made by shared by community of Nette Framework. Nette Foundation is not liable for them. + +{{themeicon: icon-house.png}} From 28b9810f59d39f87ceb41d3fd0a54be116d30e31 Mon Sep 17 00:00:00 2001 From: voda Date: Sat, 13 Aug 2011 18:55:41 +0200 Subject: [PATCH 0134/1741] cs/presenters: oprava .html -> .phtml --- cs/presenters.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/presenters.texy b/cs/presenters.texy index 32a78a41e5..8d24c09413 100644 --- a/cs/presenters.texy +++ b/cs/presenters.texy @@ -204,7 +204,7 @@ Cestu k souboru se šablonou odvodí presenter podle jednoduché logiky. Pro pre - templates/Product.show.latte \-- -Kromě přípony `.latte` lze také použít příponu `.html`. +Kromě přípony `.latte` lze také použít příponu `.phtml`. Taktéž se pokusí dohledat layout (ten je nepovinný): From 1cf2382867dfb4179dd01d35540562b78435945b Mon Sep 17 00:00:00 2001 From: voda Date: Sat, 13 Aug 2011 19:35:26 +0200 Subject: [PATCH 0135/1741] en/presenters: typos, corrections --- en/presenters.texy | 154 ++++++++++++++++++++++----------------------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/en/presenters.texy b/en/presenters.texy index 913d6319b7..d514bdf0f2 100644 --- a/en/presenters.texy +++ b/en/presenters.texy @@ -4,7 +4,7 @@ MVC applications & presenters /--div .[perex] We will learn, how to create applications in Nette Framework. After this chapter you will know: -- MVC, directory structure and file `bootstrap.php` +- MVC, directory structure and `bootstrap.php` file - what are presenters and actions - how to use templates - what are persistent parameters @@ -14,22 +14,22 @@ We will learn, how to create applications in Nette Framework. After this chapter Model-View-Controller (MVC) =========================== -Model-View-Controller is software architecture, that was created to satisfy the need to separate in application with graphical interface, utility code (controller) from application logic code (model) and from code for displaying data (view). With this approach we create better understandable application, simplify future development and enable testing each units of application separately. +Model-View-Controller is software architecture, that was created to satisfy the need to separate in application with graphical interface, utility code (controller) from application logic code (model) and from code for displaying data (view). With this approach we create better understandable application, simplify future development and enable testing each unit of application separately. Model ----- -Model is data and especially functional base of whole application. It contains application logic. Any user action (login, insertion of goods to basket, change of value in database) represents model action. Model is managing his internal state and provides solid interface to outside. By calling methods of this interface, we can read or update its state. Model doesn't know anything about view or controller. +Model is data and especially functional base of whole application. It contains application logic. Any user action (login, insertion of goods to basket, change of value in database) represents a model action. Model is managing his internal state and provides solid interface to outside. By calling methods of this interface, we can read or update its state. Model doesn't know anything about view or controller. .[note] -Concept of *Model* represents whole layer, not only separate class. +Concept of *Model* represents whole layer, not only a single class. View ---- -View is application layer, that is taking care of displaying result of request. Usualy uses templating engine and knows, how should be each component rendered or result acquired from model. +View is an application layer, that is taking care of displaying result of request. It usualy uses templating engine and knows, how should be each component rendered or result acquired from model. Controller @@ -48,13 +48,13 @@ When you look at `sandbox` after downloading of Nette Framework package, you wil sandbox/ app/ ← directory with application models/ ← model layer and it's classes - presenters/ ← classes of presenters + presenters/ ← presenter classes HomepagePresenter.php ← Homepage presenter class templates/ ← templates directory @layout.latte ← template of shared layout - Homepage/ ← tempaltes of Homepage presenter - default.latte ← template of action default + Homepage/ ← tempaltes for Homepage presenter + default.latte ← template for default action config.neon ← application configuration file bootstrap.php ← application boot file @@ -71,7 +71,7 @@ When you look at `sandbox` after downloading of Nette Framework package, you wil images/ ← another directories, images, styles, .. \-- -Moreover in some directories, there are `.htaccess` and `web.config` files, that denies access from browser (for Apache or IIS). Make sure, that this is working, and you cannot reach `app/` and `libs/` directory from browser. +Moreover in some directories, there are `.htaccess` and `web.config` files, that denies access from browser (for Apache or IIS). Make sure, that this is working, and you cannot reach `app/` and `libs/` directories from browser. .[note] Don't forget to grant write privilege (`chmod 0777`) to directories `log/` and `temp/`. @@ -85,7 +85,7 @@ Browser is sending all requests through one and only file, located in public dir .[note] Nette Framework is saving all its paths consistently, without the right trailing slash. -Described directory structure is realy just recommended, because you can easily change it however you want to. And all you have to do, is rename directories and change paths in `index.php` or `bootstrap.php`. +Described directory structure is realy just recommended, because you can easily change it however you want to. All you have to do, is rename directories and change paths in `index.php` or `bootstrap.php`. First, file `bootstrap.php` loads Nette Framework: @@ -93,7 +93,7 @@ First, file `bootstrap.php` loads Nette Framework: require $params['libsDir'] . '/Nette/loader.php'; \-- -Actives [debugger and logger |debugging] in strict mode: +Activates [debugger and logger |debugging] in strict mode: /--php use Nette\Diagnostics\Debugger; @@ -112,7 +112,7 @@ $configurator->container->params['tempDir'] = __DIR__ . '/../temp'; $container = $configurator->loadConfig(__DIR__ . '/config.neon'); \-- -Sets rules for [routing |routing], to enable translate the URL addresses into [a presenter action |#processing-presenter-action]. This rule, among others, says, that default action of presenter will be `Homepage:default`. +Sets rules for [routing |routing], to enable translate the URL addresses into [a presenter action |#processing-presenter-action]. This rule, among others, says, that default presenter action will be `Homepage:default`. /--php $router = $container->router; @@ -120,14 +120,14 @@ $router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY); $router[] = new Route('/[/]', 'Homepage:default'); \-- -Sets parameters of application, for example error presenter, that will be in production environment take care of displaying appropriate messages, when error occurs: +Sets application parameters, for example error presenter, that will be in production environment responsible for displaying appropriate messages, when an error occurs: /--php $application = $container->application; $application->errorPresenter = 'Error'; \-- -If we wanted to do execute any other tasks, like connecting to database, it's appropriate to add this on `onStartup` event of application: (note: it's generally better to let [DI container |configuring] take care of connecting to database). +If we wanted to do execute any other tasks, like connecting to database, it's appropriate to add this to the `onStartup` event of the application: (note: it's generally better to let [DI container |configuring] take care of connecting to database). /--php $application->onStartup[] = function() { @@ -141,13 +141,13 @@ And we will run the application: $application->run(); \-- -And that's it. +That's it. Modules ------- -When developing complex applications, we can separate directories with presenters and templates to subdirectories, we call them modules. If our application would contain, for example modules `Front` and `Admin`, its structure could look like this: +When developing complex applications, we can separate directories with presenters and templates to subdirectories. We call them modules. If our application would contain, for example modules `Front` and `Admin`, its structure could look like this: /--pre sandbox/ @@ -174,11 +174,11 @@ Modules don't have to be arranged in flat structure, you can even create submodu Processing presenter action =========================== -Now listen up closely, please. Every request on our application will reach through files `index.php` and `bootstap.php` into object `$application`. But, that one doesn't understand to http requests, because of that, it will ask [router | routing], to translate the request into something, that he can understand. Thus to tell him, for what **presenter** is request meant and what **action** should it execute. For example, router answers, that user want's action `show` of presenter `Product` (it's good habit to write it like `Product:show`) and passes parameter `id = 123`. You can read it like: user want's to show product with id 123. +Now listen up closely, please. Every request on our application will reach through files `index.php` and `bootstap.php` into object `$application`. But, that one doesn't understand to http requests, because of that, it will ask the [router | routing], to translate the request into something, that it can understand. Thus to tell him, for what **presenter** is the request meant and what **action** should it execute. For example, router answers, that user want's action `show` of presenter `Product` (it's good habit to write it like `Product:show`) and passes parameter `id = 123`. You can read it like: user want's to show product with id 123. -This is finally understandable to `$application` and it will proceed to fulfill the wishes. It will create object of class `ProductPresenter`, that represents presenter `Product`. (To be completely accurate, application asks for creation of presenter the `presenterFactory` service). And presenter will ask for execetion of action (`show` with parameter `id`). +This is finally understandable to `$application` and it will proceed to fulfill the wishes. It will create an object of class `ProductPresenter`, that represents presenter `Product`. (To be completely accurate, application asks for creation of presenter the `presenterFactory` service). And presenter will ask for execution of action (`show` with parameter `id`). -Presenter is object, that takes the request, translated by router and devises the answer. Answer can by HTML page, image, XML document, file on hard drive, JSON, redirection or anything that you need. Specifically `ProductPresenter` asks model for data, that it will pass to template for displaying. This is usually done in method `renderShow`, where word `Show` corresponds to the name of action and request parameter `id` will be passed to the method as argument: +Presenter is an object, that takes the request, translated by router and devises the answer. Answer can be HTML page, image, XML document, file on hard drive, JSON, redirection or anything that you need. Specifically `ProductPresenter` asks model for data, that it will pass to template for displaying. This is usually done in method `renderShow`, where word `Show` corresponds to the name of action and request parameter `id` will be passed to the method as argument: /--php class ProductPresenter extends Nette\Application\UI\Presenter @@ -191,22 +191,22 @@ class ProductPresenter extends Nette\Application\UI\Presenter } \-- -Then will presenter render the template. +Then the presenter will render the template. Templates --------- -Presenter will deduce the path to the template from simple logic. It will try, for presenter `Product` and action `show`, if exists one of these files: +Presenter will deduce the path to the template from simple logic. It will try, for presenter `Product` and action `show`, if one of these files exists: /-- - templates/Product/show.latte - templates/Product.show.latte \-- -Besides the `.latte` extension, you can use the `.html` extension too. +Besides the `.latte` extension, you can use the `.phtml` extension too. -Presenter will also try to search for layout (that is optional): +Presenter will also try to search for a layout (that is optional): /-- - templates/Product/@layout.latte @@ -216,30 +216,30 @@ Presenter will also try to search for layout (that is optional): (You can change the way of searching the templates by overriding the [formatTemplateFiles |api:Nette\Application\UI\Presenter::formatTemplateFiles()] or [formatLayoutTemplateFiles |api:Nette\Application\UI\Presenter::formatLayoutTemplateFiles()] methods.) -Presenters and its components passes to templates few useful variables: +Presenters and its components passes to the templates few useful variables: -- `$basePath` is absolute URL path to root dir (for example `/CD-collection`) -- `$baseUrl` is absolute URL to root dir (for example `http://localhost/CD-collection`) -- `$user` is object [representing the user |security] -- `$presenter` is current presenter -- `$control` is current component or presenter -- `$flashes` list of [messages |#flash-messages] sended by method `flashMessage()` +- `$basePath` is an absolute URL path to root dir (for example `/CD-collection`) +- `$baseUrl` is an absolute URL to root dir (for example `http://localhost/CD-collection`) +- `$user` is a object [representing the user |security] +- `$presenter` is the current presenter +- `$control` is the current component or presenter +- `$flashes` list of [messages |#flash-messages] sent by method `flashMessage()` -You can read more details about template rendering in [separate chapter |templating]. +You can read more details about template rendering in a [separate chapter |templating]. -Actually it's not hard at all! When you're requesting action, for example `Homepage:default`, then +Actually it's not hard at all! When you're requesting an action, for example `Homepage:default`, then -1) will be created object of class `HomepagePresenter` +1) an object of class `HomepagePresenter` will be created 2) method `renderDefault()` will be called (if it exists, but it doesn't have to) 3) template, for example `templates/Homepage/default.latte` with layout, for example `templates/@layout.latte`, will be rendered -and in template we can [create link |#Linking] to mentioned `Product:show($id)`, roughly like this: +and in template we can [create a link |#Linking] to mentioned `Product:show($id)`, roughly like this: /--html product detail \-- -I think that making of applications in Nette will be easy. +I think that making applications in Nette will be easy. Modules @@ -257,10 +257,10 @@ class ProductPresenter extends Nette\Application\UI\Presenter -Linking -======= +Link creation +============= -Creation of links belongs to the strongest features of Nette Framework. Thanks to [two-way routing |routing] you don't have to hardcode your URLs or nastily assemble them. You can just refer to actions of presenters, and pass them parameters and framework will generate URLs by itself. Creating of link is as easy as calling a function. You will realy like it! +Creation of links belongs to the strongest features of Nette Framework. Thanks to [two-way routing |routing] you don't have to hardcode your URLs or nastily assemble them. You can just refer to actions of presenters, and pass them parameters and framework will generate URLs by itself. Creating links is as easy as calling a function. You will realy like it! When programming and coding templates, we don't have to care about URLs design, we will refer directly to action of presenter, that's for example already mentioned `Product:show`. @@ -268,19 +268,19 @@ When programming and coding templates, we don't have to care about URLs design, Links in templates ------------------ -Most often we create links in templates. To make it as easy as possible, framework does offer even three macros. Smartest of them is macro `n:href` +Most often we create links in templates. To make it as easy as possible, framework does offer three macros. Smartest of them is macro `n:href` /--html product detail \-- -Note, that instead of HTML attribute `href` we've used [n:macro |templating#n-macros] `n:href`. It's value isn't URL, as you were used to at `href` attribute, but directly action of presenter. With syntax +Note, that instead of the HTML attribute `href` we've used [n:macro |templating#n-macros] `n:href`. It's value isn't a URL, as you were used to at `href` attribute, but directly an action of a presenter. The syntax is /-- [Presenter:]action [,] [arg1] [, arg2] [, ...] \-- -After click on link, method `ProductPresenter::renderShow()` will get its word and as parameter `$id` will get value of `$productId`, We can pass even more parameters, in the same way, as we call a method. Could it be even easier? +After clicking on the link, method `ProductPresenter::renderShow()` will get its word and as parameter `$id` will get the value of `$productId`, We can pass even more parameters, in the same way, as we call a method. Could it be even easier? .[note] It's better to follow convetion of first big letter for name of presenter and small for action. As separator is used colon. @@ -293,14 +293,14 @@ Besides that, it's even possible to pass named parameters. Next link passes para Allthough method `renderShow` doesn't have `$lang` in it's declaration, it can read the value of this parameter by calling `$lang = $this->getParam('lang')`. -If we have all parameters in array, we can expand them with operator `(expand)`: +If we have all parameters in array, we can expand them with `(expand)` operator: /--html {var $args = [$productId, lang => cs]} product detail \-- -If is template, in which we are creating link, part of `Product` presenter, we can name of presenter skip and write directly `n:href="show $productId"`. Or the other way, if link leads to the action named `default`, you can skip that and write `n:href="Product: $id"` (don't forget the colon). +If the template, in which we are creating links, is part of `Product` presenter, we can omit the name of the presenter and write directly `n:href="show $productId"`. Or the other way, if a link leads to the an action named `default`, you can skip that and write `n:href="Product: $id"` (don't forget the colon). Links can even refer to other [modules |#modules]. Here we distinguish, if it's refering "relatively" to submodule, or "absolutely" to different module - then path begins with colon. Lets assume, that actual presenter is part of module `Front`, then we will write: @@ -309,7 +309,7 @@ Links can even refer to other [modules |#modules]. Here we distinguish, if it's link for Admin:Product:show \-- -Special case is linking to itself, when we'll write `this` as a target. +Special case is linking to itself, when we'll write `this` as the target. Generated link is in absolute path format. When you want to generate absolute link including domain, for example `http://example.com`, we will supply two slashes at the beginning `n:href="//show $productId"`. @@ -319,7 +319,7 @@ We can refer to specific part on page using so called fragments behind the symbo link to Product:show and fragment #comments \-- -Macro `n:href` is realy handy when we are creating HTML tag ``. When we want to print link elsewhere, for example in text of the template, we will use macro `{link}` with the same internal syntax: +Macro `n:href` is realy handy when we are creating a HTML tag ``. When we want to print link elsewhere, for example in text of the template, we will use macro `{link}` with the same internal syntax: /--html The address is: {link Product:show $productId} @@ -331,7 +331,7 @@ Read more details about syntax of [Latte templates |default-macros]. Linking in presenter -------------------- -Presenter and [a component | api:Nette\Application\UI\PresenterComponent] has method `link`, which can be used to create links just like in template. First argument is target action of presenter, followed by passed parguments: +Presenter and [a component | api:Nette\Application\UI\PresenterComponent] have method `link`, which can be used to create links just like in a template. First argument is presenters target action, followed by passed arguments: /--php $url = $this->link(destination [,arg [,arg ...]]); @@ -350,7 +350,7 @@ $url = $this->link('Product:show', array($productId, 'lang' => 'en')); Invalid links ------------- -It may happen that we create invalid link - either because it refers to nonexisting presenter, or beacuse it passes more parameters that the target method receives in its definition, or when there can't be generated URL for targeted action. What to do with invalid link is determined by static variable `Presenter::$invalidLinkMode`. It can become on of these values (constants): +It may happen that we create an invalid link - either because it refers to nonexisting presenter, or beacuse it passes more parameters that the target method receives in its definition, or when there can't be generated URL for targeted action. What to do with invalid link is determined by static variable `Presenter::$invalidLinkMode`. It can have one of these values (constants): - `Presenter::INVALID_LINK_SILENT` - silent mode, there will be returned symbol `#` as URL - `Presenter::INVALID_LINK_WARNING` - visual warning @@ -370,9 +370,9 @@ a[href^="error:"] { Persistent parameters --------------------- -Except classic parameters, that we know by now, there are so called persistent parameters. Those are different in very essential feature: **they are passed through requests automaticaly.** That means, we doesn't have to explicitly mention them in links, but they are anyway passed. +Except classic parameters, that we know by now, there are so called persistent parameters. Those are different in a very essential feature: **they are passed through requests automaticaly.** That means, we doesn't have to explicitly mention them in links, but they are anyway passed. -When your application have multiple language variants, passing of actual language in every link will be incredibly tiring. But that's not needed with Nette Framework. You can simply mark parameter `$lang` as persistent just like this: +When your application have multiple language variants, passing of actual language in every link will be incredibly tiring. But that's not needed with Nette Framework. You can simply mark the `$lang` parameter as persistent just like this: /--php class ProductPresenter extends Presenter @@ -383,26 +383,26 @@ class ProductPresenter extends Presenter ... \-- -If actual value of parameter `$lang` will be `'en'`, into link +If the actual value of parameter `$lang` will be `'en'`, the into the link /--html -detail produktu +product detail \-- will be automaticaly passed parameter `lang => en`. Great! -But we can also write parameter `lang` and by that, change its value: +But we can also add parameter `lang` and by that, change its value: /--html detail in czech language \-- -The parameter will be accessible in class variable `$lang` in object of `ProductPresenter` and it can be accessed through `$this->lang`. We can even set the default value of persistent parameter to presenter class. If parameter value will correspond to default value, it will not be passed in URL. +The parameter will be accessible in class variable `$lang` in object of `ProductPresenter` and it can be accessed through `$this->lang`. We can even set the default value of persistent parameter to presenter class. If the parameter value will correspond to default value, it will not be passed in URL. .[note] Persistent variable must be declared as public. -Persistence reflects hierarchy of presenter classes, thus parameter defined in specific presenter will be automaticaly taken into account in every single presenter inheriting from him. +Persistence reflects hierarchy of presenter classes, thus parameter defined in specific presenter will be automaticaly taken into account in every single presenter that inheriting from it. @@ -410,7 +410,7 @@ Life cycle of presenter ======================= -We know by now, that action of presenter causes invoking of method `render`, thus for example `renderShow`. But it's not the only method, that gets invoked. When writing presenters, we can write following methods: +We know by now, that a presenter action causes invoking `render` method, thus for example `renderShow`. But it's not the only method, that gets invoked. When writing presenters, we can write following methods: [* lifecycle2.gif *] *** *Life cycle of presenter* .<> @@ -418,10 +418,10 @@ We know by now, that action of presenter causes invoking of method `render()` ------------------ @@ -433,12 +433,12 @@ It's important to know, that method `action()` get's called before `rend `handle()` ------------------------- -Method handles so called [signals |components#signal-aka-subrequest] aka subrequests. Designed mainly for components and handling of AJAX requests.davků. +Method handles so called [signals |components#signal-aka-subrequest] aka subrequests. Designed mainly for components and handling of AJAX requests. `beforeRender()` ----------------- -Method `beforeRender`, as the name suggests, gets invoked before `render()` and it can contain for example setup of template, passing of variables to template common for more views and so on. +Method `beforeRender`, as the name suggests, gets invoked before `render()` and it can contain for example setup of template, passing variables to template common for more views and so on. `render()` ---------------- @@ -449,16 +449,16 @@ Usualy passes required data to templates. `shutdown()` ------------- -Gets invoked at the end of the life cycle of presenter. +Gets invoked at the end of the presenters life cycle. .[note] -More accurate would be to say, that we were talking about life cycle of class [api:Nette\Application\UI\Presenter], from which are presenters inherited most often. In general, presenter is any class implementing simple interface [api:Nette\Application\IPresenter] and one such laternative uses [Micro-framework | micro-framework]. +More accurate would be to say, that we were talking about life cycle of class [api:Nette\Application\UI\Presenter], from which are presenters inherited most often. In general, presenter is any class implementing simple interface [api:Nette\Application\IPresenter] and one such alternative uses [Micro-framework | micro-framework]. Termination of presenter ------------------------ -We can terminate presenter anytime during his life cycle. We usualy do this, to prevent renderinf of template. +We can terminate presenter anytime during his life cycle. We usualy do this, to prevent rendering a template. - termination of presenter directly by method: `$presenter->terminate()` - termination of presenter and immediate render the template: `$presenter->sendTemplate()` @@ -471,7 +471,7 @@ Presenter can be terminated also by redirecting or by throwing a BadRequestExcep Redirection =========== -There are two methods `redirect()` and `forward()` for jumping to another presenter, which have similar syntax as mentioned [link() |#Linking]. For example after submitting of form and writing to database, we will redirect to details of product by calling: +There are two methods `redirect()` and `forward()` for jumping to another presenter, which have similar syntax as mentioned [link() |#Linking]. For example after submitting a form and writing to database, we will redirect to the products detail by calling: /--php $this->redirect('Product:show', $id); @@ -517,9 +517,9 @@ When user is not authorized to see the page, we will throw a `Nette\Application\ Flash messages ============== -They are messages informing about result of some operation. Important feature of flash messages is, that they are available in template, even after redirection. Even when displayed, they are available next three seconds - in case that user would unintentionally refresh page - thus message will not by lost. +These are messages informing about a result of some operation. Important feature of flash messages is, that they are available in template, even after redirection. Even when displayed, they are available next three seconds - in case that user would unintentionally refresh page - thus messages will not be lost. -Method [flashMessage |api:Nette\Application\UI\Control::flashMessage()] takes care about passing to template. First argument is text of message and second optional argument is it's type (error, warning, info apod.). Method `flashMessage()` returns instance of flash message, to allow us to add more information. +Method [flashMessage |api:Nette\Application\UI\Control::flashMessage()] takes care about passing to template. First argument is text of message and second optional argument is it's type (error, warning, info etc.). Method `flashMessage()` returns an instance of flash message, to allow us to add more information. /--php public function deleteFormSubmitted($form) @@ -533,7 +533,7 @@ public function deleteFormSubmitted($form) } \-- -These messages are available in template in variable `$flashes` as annonymouse objects, that consists of property `message`, and `type` and they can even contain previously mentioned user-defined information. They can be rendered for example like this: +These messages are available in templates variable `$flashes` as anonymous objects, that contains `message` and `type` properties and they can even contain previously mentioned user-defined information. They can be rendered for example like this: /--php {foreach $flashes as $flash} @@ -546,31 +546,31 @@ These messages are available in template in variable `$flashes` as annonymouse o Presenter and components ======================== -When we talk about presenters, then under the term [components |components] we usualy mean descendants of class [Control |api:Nette\Application\UI\Control]. More accurate would be to use term "controls", but it has different neaning in czech language and "components" did better catch on. +When we talk about presenters, then under the term [components |components] we usualy mean descendants of class [Control |api:Nette\Application\UI\Control]. More accurate would be to use term "controls", but it has different meaning in czech language and "components" did better catch on. -Presenter `Nette\Application\UI\Presenter` by itself, is descendant of class `Control`, so there is major similarity between components and presenter. But mainly `UI\Control` (and thus even `UI\Presenter`) is so called component container. Which means, that you can add into him another components. Just like we add to [form |forms] inputs (text field, button, ...). And just like with forms, you can access them through brackets: +Presenter `Nette\Application\UI\Presenter` by itself, is descendant of class `Control`, so there is major similarity between components and presenter. But mainly `UI\Control` (and thus even `UI\Presenter`) is so called component container. Which means, that you can add to it another components. Just like we add to [form |forms] inputs (text field, button, ...). And just like with forms, you can access them through brackets: /--php // attach component at presenter $presenter['mymenu'] = new MenuControl; -// get component from presenter and render +// get component from presenter and render it $presenter['mymenu']->render(); \-- -With attaching of the component to the presenter (their bind) you will be able to: +Attaching the component to the presenter (binding them) you will be able to: - create links in component - use [signals |components#signal-aka-subrequest] - use persistent parameters in components -When you don't need any of these features, we don't have to bind component with presenter. +When you don't need any of these features, you don't have to bind the component with the presenter. -Component factory ------------------ +Component factories +------------------- -Component factory is an elegant way to create components only when they are realy needed (lazy / on demand). Whole magic is in implementation of method with name `createComponent()`, where `` is the name of component, that will create and return desired component. Component is then attached to presenter. To method `createComponent()` is optionaly passed `$name` of component, that is beeing created, as argument. +Component factories is an elegant way to create components only when they are realy needed (lazy / on demand). Whole magic is in implementation of method with name `createComponent()`, where `` is the name of component, that will create and return desired component. Component is then attached to presenter. To method `createComponent()` is optionaly passed `$name` of component, that is beeing created, as argument. /--php class DefaultPresenter extends Nette\Application\UI\Presenter @@ -596,7 +596,7 @@ class DefaultPresenter extends Nette\Application\UI\Presenter .[note] Component name always starts with lowercase letter, despite that they are with uppercased first letter in name of factory. -Because all components are created in a separated methods, code is cleaner and clearer. +Because all components are created in separated methods, the code is cleaner and clearer. We never call factories directly, it gets called automaticaly, when we use the component for the first time. Thanks to that, the component is created at the right moment, and only if it's realy needed. If we wouldn't use the component (for example on some AJAX request, where we return only part of the page, or when parts are cached), it wouldn't even be created and we save performance of the server. @@ -609,7 +609,7 @@ You can access and render component using [macro {control} |default-macros#toc-c \-- -You can read more detailed information about components on [separate page |components]. +You can read more detailed information about components on a [separate page |components]. @@ -634,6 +634,6 @@ You don't have to mark subcomponents as persistent, they would be persistent aut Where can i get some components? -------------------------------- -On page [Add-ons, plugins and components |addons:homepage] you can find some open-source components, that were made by shared by community of Nette Framework. Nette Foundation is not liable for them. +On page [Add-ons, plugins and components |addons:homepage] you can find some open-source components, that were made and shared by community of Nette Framework. Nette Foundation is not liable for them. {{themeicon: icon-house.png}} From 7f3aec6609b54e8717bec40f55824f4e31a077b3 Mon Sep 17 00:00:00 2001 From: vrana Date: Sun, 14 Aug 2011 00:02:52 +0200 Subject: [PATCH 0136/1741] =?UTF-8?q?cs/dependency-injection:=20K=C3=B3d,?= =?UTF-8?q?=20p=C5=99eklepy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/dependency-injection.texy | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cs/dependency-injection.texy b/cs/dependency-injection.texy index 3ef645d1bd..8464b6b003 100644 --- a/cs/dependency-injection.texy +++ b/cs/dependency-injection.texy @@ -101,13 +101,13 @@ DI znamená víc psaní Můžete namítnout, že používání DI znamená víc psaní, že kvůli vytvoření instance `Article` musíte uchovávat a předávat databázové spojení a podobně. To je pravda, nicméně nezapomeňte, že posledně vás „méně psaní“ připravilo o $1000! Ne, nechceme to zlehčovat. Připomínka je zcela korektní a my ještě přidáme jednu závažnější: časem může ve třídě `Article` vzniknout potřeba nějaká data cachovat a v souladu s DI bude požadovat předání ještě objektu představujícího úložiště cache. To by znamenalo upravit aplikaci na mnoha místech: přinejmenším všude, kde se vytváří instance `Article`. -Co s tím? Věc má řešení. Místo ručního vytváření objektů `Article` si vytvoříme továrničku, tedy funkci, která bude objekty `Article` vyrábět. Když `Article` změní konstruktor, upraví se jen továrnička, nic víc. A odkud onu továrničku v našem kódu získáme? Vždyť víte… o to ať se postará někdo jiný :-) +Co s tím? Věc má řešení. Místo ručního vytváření objektů `Article` si vytvoříme továrničku, tedy funkci, která bude objekty `Article` vyrábět. Když `Article` změní konstruktor, upraví se jen továrnička, nic víc. A odkud onu továrničku v našem kódu získáme? Vždyť víte… o to ať se postará někdo jiný :-). DI kontejner a služby --------------------- -Termínem DI kontejner označujeme právě onu továrničky. Přesněji řečeno, jde o objekt obsahující libovolné množství továrniček, každou pro jinou službu. Co jsou to služby? Obyčejné objekty, jako třeba zmíněný `Article`. Jen v souvislosti s DI kontejnery jim říkáme služby. Zřejmě to vymysleli konzultanti, kteří chtějí, aby DI vypadalo složitě a oni mohli konzultovat. +Termínem DI kontejner označujeme právě onu továrničku. Přesněji řečeno, jde o objekt obsahující libovolné množství továrniček, každou pro jinou službu. Co jsou to služby? Obyčejné objekty, jako třeba zmíněný `Article`. Jen v souvislosti s DI kontejnery jim říkáme služby. Zřejmě to vymysleli konzultanti, kteří chtějí, aby DI vypadalo složitě a oni mohli konzultovat. Příkladem může být kontejner, který vytvoří `Article`, ale také jím požadované připojení k databázi: @@ -213,7 +213,7 @@ Jednotlivé services jsou sdílené, tj. vytváří se jen jednou. Statický kontejner ------------------ -Všimněte si, že kontejner nabízí pole $params pro uživatelské parametry a také "magické settery/gettery" jakožto zkratky pro addService, getService, hasService a removeService +Všimněte si, že kontejner nabízí pole `$params` pro uživatelské parametry a také "magické settery/gettery" jakožto zkratky pro `addService`, `getService`, `hasService` a `removeService`. /--php class MyContainer extends Nette\DI\Container @@ -247,7 +247,7 @@ $container->params = array( $article = $container->article; \-- -Všechny služby v rámci kontejneru jsou trvalé, tj. při volání getService() (či získání přes proměnou) se nevytváří služba opakovaně, ale vrací se již dříve vytvořená. Jakékoliv jiné chování by bylo leda matoucí. V uvedeném příkladu by se ale hodilo, kdyby kontejner pokaždé vygeneroval nový objekt `Nette\Mail\Article`. Toho lze dosáhnout snadno: namísto služby `article` vytvoříme obyčejnou metodu `createArticle`: +Všechny služby v rámci kontejneru jsou trvalé, tj. při volání `getService()` (či získání přes proměnou) se nevytváří služba opakovaně, ale vrací se již dříve vytvořená. Jakékoliv jiné chování by bylo leda matoucí. V uvedeném příkladu by se ale hodilo, kdyby kontejner pokaždé vygeneroval nový objekt `Nette\Mail\Article`. Toho lze dosáhnout snadno: namísto služby `article` vytvoříme obyčejnou metodu `createArticle`: /--php class MyContainer extends Nette\DI\Container @@ -324,7 +324,7 @@ $container->params = array( $article = $container->article; // zkratka pro $container->getService('article') \-- -Pokud místo callbacku předáme řetězec s názvem třídy, vytvoří se objekt ServiceBuilder, jehož úkolem je později třídu instancovat. Metoda addService onen builder vrací. Pokud bychom tedy vytvořili builder s metodami jako addArgument nebo addMethodCall, bylo by možné uvedený příklad zapsat třeba takto: +Pokud místo callbacku předáme řetězec s názvem třídy, vytvoří se objekt `ServiceBuilder`, jehož úkolem je později třídu instancovat. Metoda `addService` onen builder vrací. Pokud bychom tedy vytvořili builder s metodami jako `addArgument` nebo `addMethodCall`, bylo by možné uvedený příklad zapsat třeba takto: /--php $container->addService('connection', new AnotherBuilder('Nette\Database\Connection')) @@ -429,7 +429,7 @@ $dolly = clone $container; Auto-wiring ----------- -Autowire je pokročilejší technika, umožňující při vytváření služby automaticky předávat do konstruktoru další služby dle typu. Vytvoříme si k tomu nový ServiceBuilder: +Autowire je pokročilejší technika, umožňující při vytváření služby automaticky předávat do konstruktoru další služby dle typu. Vytvoříme si k tomu nový `ServiceBuilder`: /--php class AutowireServiceBuilder extends Nette\DI\ServiceBuilder @@ -467,13 +467,13 @@ $cont->addService('article', new AutowireServiceBuilder('Article')); Klíčem je metoda kontejneru `getServiceByType()`, která vrátí službu podle daného typu (třída, interface). Taková služba musí být v kontejneru právě jedna, jinak se vyhodí výjimka. -Pokud přidáváme službu pomocí továrny, není její typ pochopitelně znám. Můžeme ho proto "napovědět" třetím parametrem metody addService: +Pokud přidáváme službu pomocí továrny, není její typ pochopitelně znám. Můžeme ho proto "napovědět" třetím parametrem metody `addService`: /--php $cont->addService('connection', function($cont) { ... }, 'Nette\Database\Connection'); \-- -K ověření typu služby slouží metoda checkServiceType(): +K ověření typu služby slouží metoda `checkServiceType`: /--php if (!$cont->checkServiceType('connection', 'Nette\Database\Connection')) { From 90786f826bbe73e87d79953c0d911be500b1b084 Mon Sep 17 00:00:00 2001 From: Petr Stribny Date: Sun, 14 Aug 2011 00:50:07 +0200 Subject: [PATCH 0137/1741] en/presenters: sounds better now, but needs more work! --- en/presenters.texy | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/en/presenters.texy b/en/presenters.texy index d514bdf0f2..2ef18f4db0 100644 --- a/en/presenters.texy +++ b/en/presenters.texy @@ -14,13 +14,13 @@ We will learn, how to create applications in Nette Framework. After this chapter Model-View-Controller (MVC) =========================== -Model-View-Controller is software architecture, that was created to satisfy the need to separate in application with graphical interface, utility code (controller) from application logic code (model) and from code for displaying data (view). With this approach we create better understandable application, simplify future development and enable testing each unit of application separately. +Model-View-Controller is a software architecture that was created to satisfy the need to separate utility code (controller) from application logic code (model) and from code for displaying data (view) in applications with graphical user interface. With this approach we make the application better understandable, simplify future development and enable testing each unit of the application separately. Model ----- -Model is data and especially functional base of whole application. It contains application logic. Any user action (login, insertion of goods to basket, change of value in database) represents a model action. Model is managing his internal state and provides solid interface to outside. By calling methods of this interface, we can read or update its state. Model doesn't know anything about view or controller. +Model is data and especially functional base of whole application. It contains application logic. Any user action (login, insertion of goods to basket, change of value in database) represents a model action. Model is managing its internal state and provides solid interface to outside. By calling methods of this interface, we can read or update its state. Model doesn't know anything about view or controller. .[note] Concept of *Model* represents whole layer, not only a single class. @@ -80,7 +80,7 @@ Don't forget to grant write privilege (`chmod 0777`) to directories `log/` and ` index.php & bootstrap.php ------------------------- -Browser is sending all requests through one and only file, located in public directory `www/` and that is `index.php`. Inside his body isn't happening almost anything. There are only definitions, describing directory structure of application (`$params['wwwDir']` and `$params['appDir']`) and passing of the control to the application (that is the `app/` directory) to the boot file `bootstrap.php`. +Browser is sending all requests through one and only file, located in public directory `www/` and that is `index.php`. There are only definitions in this file, describing directory structure of the application (`$params['wwwDir']` and `$params['appDir']`), and code that passes the control to the application (that is the `app/` directory), to a boot file `bootstrap.php`. .[note] Nette Framework is saving all its paths consistently, without the right trailing slash. @@ -127,7 +127,7 @@ $application = $container->application; $application->errorPresenter = 'Error'; \-- -If we wanted to do execute any other tasks, like connecting to database, it's appropriate to add this to the `onStartup` event of the application: (note: it's generally better to let [DI container |configuring] take care of connecting to database). +If we wanted to execute any other tasks, like connecting to database, it's appropriate to add this to the `onStartup` event of the application: (note: it's generally better to let [DI container |configuring] take care of connecting to database). /--php $application->onStartup[] = function() { @@ -245,7 +245,7 @@ I think that making applications in Nette will be easy. Modules ------ -For more complex applications, that separates presenters to modules, everything works wery similarly. Lets say, that our application contains module `Front`, and it contains presenter `Product`. Action `show` can than be written as `Front:Product:show` and class `ProductPresenter` will be placed into namespace `FrontModule`: +For more complex applications, which separates presenters into modules, everything works very similarly. Lets say, that our application contains module `Front`, and it contains presenter `Product`. Action `show` can than be written as `Front:Product:show` and class `ProductPresenter` will be placed into namespace `FrontModule`: /--php namespace FrontModule; @@ -260,7 +260,7 @@ class ProductPresenter extends Nette\Application\UI\Presenter Link creation ============= -Creation of links belongs to the strongest features of Nette Framework. Thanks to [two-way routing |routing] you don't have to hardcode your URLs or nastily assemble them. You can just refer to actions of presenters, and pass them parameters and framework will generate URLs by itself. Creating links is as easy as calling a function. You will realy like it! +Creation of links belongs to the strongest features of Nette Framework. Thanks to [two-way routing |routing] you don't have to hardcode your URLs or nastily assemble them. You can just refer to actions of presenters, and pass them parameters and framework will generate URLs by itself. Creating links is as easy as calling a function. You will really like it! When programming and coding templates, we don't have to care about URLs design, we will refer directly to action of presenter, that's for example already mentioned `Product:show`. @@ -350,7 +350,7 @@ $url = $this->link('Product:show', array($productId, 'lang' => 'en')); Invalid links ------------- -It may happen that we create an invalid link - either because it refers to nonexisting presenter, or beacuse it passes more parameters that the target method receives in its definition, or when there can't be generated URL for targeted action. What to do with invalid link is determined by static variable `Presenter::$invalidLinkMode`. It can have one of these values (constants): +It may happen that we create an invalid link - either because it refers to non-existing presenter, or because it passes more parameters that the target method receives in its definition, or when there can't be generated URL for targeted action. What to do with invalid link is determined by static variable `Presenter::$invalidLinkMode`. It can have one of these values (constants): - `Presenter::INVALID_LINK_SILENT` - silent mode, there will be returned symbol `#` as URL - `Presenter::INVALID_LINK_WARNING` - visual warning @@ -370,7 +370,7 @@ a[href^="error:"] { Persistent parameters --------------------- -Except classic parameters, that we know by now, there are so called persistent parameters. Those are different in a very essential feature: **they are passed through requests automaticaly.** That means, we doesn't have to explicitly mention them in links, but they are anyway passed. +Except classic parameters, that we know by now, there are so called persistent parameters. Those are different in a very essential feature: **they are passed through requests automatically.** That means, we doesn't have to explicitly mention them in links, but they are anyway passed. When your application have multiple language variants, passing of actual language in every link will be incredibly tiring. But that's not needed with Nette Framework. You can simply mark the `$lang` parameter as persistent just like this: @@ -394,7 +394,7 @@ will be automaticaly passed parameter `lang => en`. Great! But we can also add parameter `lang` and by that, change its value: /--html -detail in czech language +detail in Czech language \-- The parameter will be accessible in class variable `$lang` in object of `ProductPresenter` and it can be accessed through `$this->lang`. We can even set the default value of persistent parameter to presenter class. If the parameter value will correspond to default value, it will not be passed in URL. @@ -546,7 +546,7 @@ These messages are available in templates variable `$flashes` as anonymous objec Presenter and components ======================== -When we talk about presenters, then under the term [components |components] we usualy mean descendants of class [Control |api:Nette\Application\UI\Control]. More accurate would be to use term "controls", but it has different meaning in czech language and "components" did better catch on. +When we talk about presenters, then under the term [components |components] we usually mean descendants of class [Control |api:Nette\Application\UI\Control]. More accurate would be to use term "controls", but it has different meaning in czech language and "components" did better catch on. Presenter `Nette\Application\UI\Presenter` by itself, is descendant of class `Control`, so there is major similarity between components and presenter. But mainly `UI\Control` (and thus even `UI\Presenter`) is so called component container. Which means, that you can add to it another components. Just like we add to [form |forms] inputs (text field, button, ...). And just like with forms, you can access them through brackets: @@ -598,7 +598,7 @@ Component name always starts with lowercase letter, despite that they are with u Because all components are created in separated methods, the code is cleaner and clearer. -We never call factories directly, it gets called automaticaly, when we use the component for the first time. Thanks to that, the component is created at the right moment, and only if it's realy needed. If we wouldn't use the component (for example on some AJAX request, where we return only part of the page, or when parts are cached), it wouldn't even be created and we save performance of the server. +We never call factories directly, it gets called automatically, when we use the component for the first time. Thanks to that, the component is created at the right moment, and only if it's really needed. If we wouldn't use the component (for example on some AJAX request, where we return only part of the page, or when parts are cached), it wouldn't even be created and we save performance of the server. You can access and render component using [macro {control} |default-macros#toc-components-rendering]. So there is no need of manualy passing the components to template. @@ -628,12 +628,12 @@ class DefaultPresenter extends Presenter } \-- -You don't have to mark subcomponents as persistent, they would be persistent automaticaly too. +You don't have to mark subcomponents as persistent, they would be persistent automatically too. Where can i get some components? -------------------------------- -On page [Add-ons, plugins and components |addons:homepage] you can find some open-source components, that were made and shared by community of Nette Framework. Nette Foundation is not liable for them. +On page [Add-ons, plugins and components |addons:homepage] you can find some open-source components that were made and shared by community of Nette Framework. Nette Foundation is not liable for them. {{themeicon: icon-house.png}} From d51be0c8313f34183b77d025206628415b415379 Mon Sep 17 00:00:00 2001 From: Petr Stribny Date: Sun, 14 Aug 2011 01:10:44 +0200 Subject: [PATCH 0138/1741] en/php-language-enhancements: typos --- en/php-language-enhancements.texy | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/en/php-language-enhancements.texy b/en/php-language-enhancements.texy index e59e547a72..58980fa57a 100644 --- a/en/php-language-enhancements.texy +++ b/en/php-language-enhancements.texy @@ -1,4 +1,4 @@ -PHP language enhacements +PHP language enhancements ******************** /--div .[perex] @@ -71,7 +71,7 @@ Properties, getters a setters In modern Object oriented languages *property* describes members of class, which look like variables but are represented by methods. When reading or assigning values to those "variables", methods are called instead (so-called getters and setters). Now you have access to those variables under your control, which can render itself really useful. You can easily validate inputs or generate data only when you need them. -Being a descendant of `Nette\Object` gives that class ability to imitate properties. Only thing you need to do is keep with these simple convetions: +Being a descendant of `Nette\Object` gives that class ability to imitate properties. Only thing you need to do is keep with these simple conventions: - Getter and setter have to be a *public* method. - Getter's name is `getXyz()` or `isXyz()`, setter's is `setXyz()` @@ -185,7 +185,7 @@ echo $circle->getReflection()->hasMethod('getArea'); // does method 'test' exist echo $circle->getReflection()->getName(); // returns class' name ('Circle') \-- -Even in this case we can make use of [property |#Properties, getters and setters] convetions and change the last line to: +Even in this case we can make use of [property |#Properties, getters and setters] conventions and change the last line to: /--php echo $circle->reflection->name; // returns 'Circle' From 64f632815d2b7d3ca93d354e4cd53d66fe220724 Mon Sep 17 00:00:00 2001 From: Petr Stribny Date: Sun, 14 Aug 2011 01:14:28 +0200 Subject: [PATCH 0139/1741] en/http-request-response: space --- en/http-request-response.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/http-request-response.texy b/en/http-request-response.texy index f8ece2924f..4d0b56977b 100644 --- a/en/http-request-response.texy +++ b/en/http-request-response.texy @@ -109,7 +109,7 @@ echo $httpRequest->detectLanguage($langs); // en RequestFactory and URL filtering ------------------ -Object holding current HTTP request is created by [api:Nette\Http\RequstFactory]. Its behavior can bemodified. +Object holding current HTTP request is created by [api:Nette\Http\RequstFactory]. Its behavior can be modified. It's possible to clean up URLs from characters that can get into them because of poorly implemented comment systems on various other websites by using filters: /--php From 82193e0faf50ab44b58a4502d5e0faa640e7383d Mon Sep 17 00:00:00 2001 From: Petr Stribny Date: Sun, 14 Aug 2011 01:32:08 +0200 Subject: [PATCH 0140/1741] en/testing: typos --- en/testing.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/testing.texy b/en/testing.texy index f5eead281d..b534735af8 100644 --- a/en/testing.texy +++ b/en/testing.texy @@ -18,7 +18,7 @@ $result = $obj->process($input); var_dump($result); \-- -In other words, have you printed the result of a function call in order to visually verify that the function returns the expected result? Surely you do it many times a day. Do you expect that the class will not break in future in the case that everything has worked correctly and you have only deleted the debbuging line of code? Murphy's law guarantees the opposite :-) +In other words, have you printed the result of a function call in order to visually verify that the function returns the expected result? Surely you do it many times a day. Do you expect that the class will not break in the future in the case that everything has worked correctly and you have only deleted the debugging line of code? Murphy's law guarantees the opposite :-) If you had not deleted the test, you can run it anytime in the future to verify that everything still works as it should. It is desirable to modify the previous code slightly so as it does not require a human review: From d3f4cdf3bb0c80cfc1b6148ce2a39c6740a43ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Tvrd=C3=ADk?= Date: Sun, 14 Aug 2011 10:09:05 +0200 Subject: [PATCH 0141/1741] en/php-language-enhancements: typo --- en/php-language-enhancements.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/php-language-enhancements.texy b/en/php-language-enhancements.texy index 58980fa57a..1a17b8c55d 100644 --- a/en/php-language-enhancements.texy +++ b/en/php-language-enhancements.texy @@ -11,7 +11,7 @@ Nette Framework extends the object model of PHP with a few syntax candies. Do yo - how to use @annotations \-- -In this chapter we are focusing on Nette\Object, a class extending PHP's object model. It is the ancestor of almost all classes in Nette Framework. Being transparent and non-conflicting, it can be used as an ancestor for every class you make. +In this chapter we are focusing on `Nette\Object`, a class extending PHP's object model. It is the ancestor of almost all classes in Nette Framework. Being transparent and non-conflicting, it can be used as an ancestor for every class you make. Strict classes From dbaf3a5f6a0707c1caa773d31a66060b32b0276c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Tvrd=C3=ADk?= Date: Sun, 14 Aug 2011 14:57:19 +0200 Subject: [PATCH 0142/1741] =?UTF-8?q?cs/configuring:=20zru=C5=A1en=20term?= =?UTF-8?q?=C3=ADn=20vyd=C3=A1n=C3=AD=20+=20dopln=C4=9Bny=20n=C3=A1vodn?= =?UTF-8?q?=C3=A9=20odkazy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/configuring.texy | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cs/configuring.texy b/cs/configuring.texy index 1ad511601e..5f0a2d768d 100644 --- a/cs/configuring.texy +++ b/cs/configuring.texy @@ -1,8 +1,14 @@ Konfigurace prostředí ********************* -.[perex] -Omlouváme se, tato stránka je ještě v přípravě a bude hotová během týdne. +Omlouváme se, tato stránka je ještě v přípravě. Než bude dokončena, projděte si zatím následující odkazy: + +- "Syntaxe Neonu":http://ne-on.org/ +- Ukázkový "config.neon":https://github.com/nette/sandbox/blob/master/app/config.neon a "bootstrap.php":https://github.com/nette/sandbox/blob/master/app/bootstrap.php +- "Jak se připojit k DB":http://forum.nette.org/cs/7867-nette-2-0-config-neon-a-dibi-pripojeni#p59459 +- "Struktura definice service v configu":https://github.com/nette/nette/blob/master/Nette/DI/ContainerBuilder.php#L28-38 +- "Jak se dostat k parametrům v configu":http://forum.nette.org/cs/7828-prace-s-hodnotami-z-configu-v-nette-2-0-alpha + /--comment From 80bf73cb56efba79a600a8ca6f6eca413b6ca1d1 Mon Sep 17 00:00:00 2001 From: Darkry Date: Mon, 15 Aug 2011 09:09:32 +0200 Subject: [PATCH 0143/1741] en/images: created --- en/images.texy | 163 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 en/images.texy diff --git a/en/images.texy b/en/images.texy new file mode 100644 index 0000000000..3d02c8a4bd --- /dev/null +++ b/en/images.texy @@ -0,0 +1,163 @@ +Image Manipulation +****************** + +/--div .[perex] +The class [Nette\Image |api:] is assigned for basic image manipulation. It simplifies the basic operations, like image resize or rename. +\-- + +If you want to manipulate with images (like diminishion or sharpening of images) in PHP you must write an unreadable and unintelligible code. And it would not be Nette Framework to come up with a better API :-) + +Initially we will load the image from a file: + +/--php +use Nette\Image; + +$image = Image::fromFile('nette.jpg'); +\-- + +or we can create new blank image, with size 100x200: + +/--php +$image = Image::fromBlank(100, 200); +\-- + +Optionally we can set the background color (default is black): + +/--php +$image = Image::fromBlank(100, 200, Image::rgb(125, 0, 0)); +\-- + +And we will write it's size: + +/--php +echo „Image size is: $image->width × $image->height"; +\-- + + + + +Image resize +--------------- + +We will diminish the image proportionally in a way they will not exceed 50x30 pixels: + +/--php +$image->resize(50, 30); +\-- + +It's possible to set only one dimension and the second one will be calculate: + +/--php +$image->resize(50, NULL); + +$image->resize(NULL, 30); +\-- + +Any dimension can be also set in percentage: + +/--php +$image->resize('75%', 30); // 75% × 30px +\-- + +In the mentioned examples the image is only diminished. Possible enlargement will be allowed by the directive `Image::ENLARGE`: + +/--php +$image->resize(50, 30, Image::ENLARGE); +\-- + +With the directive `Image::STRETCH` we can allow non-proportional changes in the size: + +/--php +$image->resize(50, 30, Image::STRETCH); +\-- + +Both directives can be combined: + +/--php +$image->resize(50, 30, Image::ENLARGE | Image::STRETCH); +\-- + +If we write one or both of the dimensions as a negative number the image will be flipped (horizntaly or verticaly): + +/--php +$flipped = $image->resize(NULL, '-100%'); // flip vertical + +$flipped = $image->resize('-100%', '-100%'); // rotate 180° + +$flipped = $image->resize(-125, 50); // resize & flip horizontal +\-- + + +Image modification +------ + +After reducing the image we can improve it by sharpening: + +/--php +$image->sharpen(); +\-- + +We can also trim the image by the coordinates of a rectangle: + +/--php +$image->crop($left, $top, $width, $height); +\-- + + +The reduced image can be inserted into an another one (so-called watermark). + +/--php +$blank = Image::fromBlank(320, 240, Image::rgb(52, 132, 210)); +$blank->place($image, 0, 0); // place into a position 0px, 0px + +// coordinates can be set also in percantage +$blank->place($image, '80%', '75%', 25); // transparency is 25 % +\-- + +Nette\Utils\Image simplyfies calling of all graphic functions from the GD expansion, for example [php:imagefilledrectangle], but with the usage of more understandable object approach. + +/--php +$white = Image::rgb(255, 255, 255); +$image->filledRectangle(0, 0, $width, $height, $white); +\-- + +.[note] +Functions `sharpen()` and `rotate()` require *Bundled GD extension*, so it is not sure they will work everywhere. + +Image saving +--------------- + +The image could be saved into a file: + +/--php +$image->save('resampled.jpg'); +\-- + +Voluntarily it's possible to set also the quality and format of the image (if the format isn't set it's detected from the file extension): +/--php +$image->save('resampled.jpg', 80, Image::JPEG); // JPEG, quality 80% +\-- + +Alternatively the image could be saved into a variable: + +/--php +$binary = (string) $image; +\-- + +or you can send it directly to the browser with the setting of the applicative header `Content-Type`: + +/--php +// send it like image/jpeg +$image->send(); + +// send it like image/png +$image->send(Image::PNG); +\-- + + +Such API si really pleasure to be used! + + +{{toc: title}} + +{{themeicon: images.png}} From 44bf40b28d498deb0e98e38e503d652794239a93 Mon Sep 17 00:00:00 2001 From: Mikulas Dite Date: Mon, 15 Aug 2011 20:18:16 +0200 Subject: [PATCH 0144/1741] en/security: created --- en/getting-started.texy | 63 +++ en/security.texy | 385 +++++++++++++++++++ en/vulnerability-protection.texy | 71 ++++ files/application-icon-80x80-r6-r1-c7-s1.png | Bin 0 -> 8292 bytes files/communication-80x80-r9-r1-c1-s1.png | Bin 0 -> 10994 bytes files/ecommercial.png | Bin 0 -> 7403 bytes files/icon-communication.png | Bin 6791 -> 6671 bytes files/icon-ecommercial.png | Bin 9613 -> 8686 bytes 8 files changed, 519 insertions(+) create mode 100644 en/getting-started.texy create mode 100644 en/security.texy create mode 100644 en/vulnerability-protection.texy create mode 100644 files/application-icon-80x80-r6-r1-c7-s1.png create mode 100644 files/communication-80x80-r9-r1-c1-s1.png create mode 100644 files/ecommercial.png diff --git a/en/getting-started.texy b/en/getting-started.texy new file mode 100644 index 0000000000..258a85c59b --- /dev/null +++ b/en/getting-started.texy @@ -0,0 +1,63 @@ +Getting started with Nette Framework +**************************** + +/--div .[perex] +Feel tired solving all the repetitive tasks, those tiny distractions making programming a dull work instead of an kind of art? You've definitely come to the right place. **Framework will make your work easier, you will write less code yet more readable and you will really enjoy it**. What's to gain: + +- an excellent template system +- unbeatable diagnostic tools +- extraordinarily effective database layer +- witty protection against known vulneratibities +- modern framework with HTML5 and AJAX support and SEO +- with well written documentation and the most active community (in Czech republic, that is!) +- with mature and clean object oriented design +- which leads to best-practice solutions while retaining a feel of freedom +\-- + +That's free of charge. Though it's worth a try, right? + + +Why Nette Framework? +-------------------- + +[* ecommercial.png .[noborder] >] +How's Nette Framework different from other frameworks? **Nette Framework is build to be the most useable and friendliest possible.** It's a framework which is not only easy to work with, but also a kind of fun. It gives you a comprehensible yet efficient syntax, offers a cutting edge debugger, lets you focus on the creative part of being a developer. Eliminates security hazards. With it you can create e-shops, wikis, blogs, CMS, and whatever you might possibly want to create. + +Nette Framework is [used by major companies |www:kdo-pouziva-nette-framework], such as T-Systems, GE Money, Mladá fronta, VLTAVA-LABE-PRESS, Internet Info, DHL, Logio, ESET, Actum, propels website of the president of the Czech republic Václav Klause. In the [poll |https://spreadsheets.google.com/viewanalytics?formkey=dEl1ZDJhbk1hWEFLbU43Skl0eDVDSnc6MQ#chart#4] held by Zdroják it was awarded The most popular and the most used framework in the Czech republic. + +Learning Nette Framework will give you no shortage of interesting job offers. + + +Wanna get in! +------------- + +[* icon-multimedia.png .[noborder] >] +Start off by [downloading |installation] the framework and [check requirements |requirements] and following the guide step by step [create your fist application | quickstart]. A handy [Programmer's guide | homepage] is here to help you any time and if you really feel like it, you might as well check out practical [API documentation | http://api.nette.org/] with overview of all classes and methods. + +Yet if you do somehow feel you got cornered, check [frequently asked questions |troubleshooting] or a [dedicated forum |http://forum.nette.org/en/]. + +Are you not committed enough to learn it yourself? Roger that - we offer [Nette Framework training | http://www.skoleniphp.cz/skoleni-nette-vyvoj-webovych-aplikaci] (Czech). Feedback from former participants is to be found at +[skoleniphp.cz/ohlasy | http://www.skoleniphp.cz/ohlasy]. + + +More information! +----------------- + +[* application-icon-80x80-r6-r1-c7-s1.png .[noborder] >] +We've got a whole ["planette" of guides and screencasts |pla:homepage], a collection of various [addons and components |addons:homepage] for use in your applications. + +As if that would not suffice, the [community |www:komunita] around the Nette Framework meets every month on so called [Poslední sobota |www.posobota.cz] (Czech), sharing experience and just having a good time. Come grab a beer! + + + +Want to get involved! +--------------------- + +[* communication-80x80-r9-r1-c1-s1.png .[noborder] >] +We will be very glad if you contribute your share to the development. For starters, you may share a word, putting an [icon |www:graficke-podklady] on your web, or even [support the development |www:podporte-vyvoj] financially. Thank you ♥ + +You may as well share your knowledge: write an article, capture a screencast for [Planette |pla:homepage], or add an [extension |addons:homepage] of yours. Would be great if you'd like to join us [writing and translating documentation |writing]. You are the most welcome here. + +{{toc:yes}} + +{{themeicon: icon-ecommercial.png}} diff --git a/en/security.texy b/en/security.texy new file mode 100644 index 0000000000..785c08377b --- /dev/null +++ b/en/security.texy @@ -0,0 +1,385 @@ +User authorization and privileges +********************************* + +/--div .[perex] +Little to none web applications need no mechanism for user login or checking user privileges. In this chapter, we'll talk about: + +- user login and logout +- verifying user privileges +- securing against vulnerabilities +- how to create custom authenticators and authorizators +- Access Control List +\-- + + +Before we fully emerge this topic, we should note that all examples do use `user` service, which is an [api:Nette\Http\User] object. The service itself can be get from [system container |configuring] using `$user = $container->user` or `$user = $this->getUser()` inside a presenter. + + +Authentication +============== + +Authentication means **user login**, the process during which we check whether the user is who he claims he is. It's usually proved with simple username and password combination. + +Loging user in with username and password: + +/--php +$user->login($username, $password); +\-- + +Checking if user is logged in: + +/--php +echo $user->isLoggedIn() ? 'yes' : 'no'; +\-- + +And logging him out: + +/--php +$user->logout(); +\-- + +Simple, right? + +.[note] +Logging in requires users to have cookies enabled - other methods are not safe! + +Besides loging user out with the `logout()` method, it can be done automatically based on specified time interval or closing the browser window. For this configuration we have to call `setExpiration()` during the login process. As an argument, it takes an relative time in seconds, UNIX timestamp, or textual interpretation of time. The second argument sets whether user should be logged out when browser is closed. + +/--php +// login expires after 30 minutes of inactivity or after closing browser +$user->setExpiration('+ 30 minutes', TRUE); + +// login expires after two days of inactivity +$user->setExpiration('+ 2 days', FALSE); + +// login expires when a browser is closed, but not sooner (ie. without a time limit) +$user->setExpiration(0, TRUE); +\-- + +.[note] +Expiration must be set to equal or lower value, than [sessions]' expiration is set to. + +The reason of last logout is returned by `$user->getLogoutReason()`, which yells one of these constants: `User::INACTIVITY` if time expired, `User::BROWSER_CLOSED` when user has closed the browser or `User::MANUAL` when we called the `logout()` method. + +To make the example above working, we in fact have to create an object that verifies user's name and password. It's called **authenticator**. It's trivial implementation is class [api:Nette\Security\SimpleAuthenticator], which takes an hash map of usernames as indexes and passwords as values: + +/--php +$authenticator = new Nette\Security\SimpleAuthenticator(array( + 'john' => 'IJ^%4dfh54*', + 'kathy' => '12345', // Kathy, this is a very weak password! +)); +$user->setAuthenticator($authenticator); +\-- + +If login createntials are not valid, authenticator throws an [api:Nette\Security\AuthenticationException]: + +/--php +try { + // we try to log the user in + $user->login($username, $password); + // ... and redirect upon success + $this->redirect(...); + +} catch (Nette\Security\AuthenticationException $e) { + echo 'Login error: ', $e->getMessage(); +} +\-- + +We usually configure authenticator inside a [config file |configuring], which only creates the object if it's requested by the application. The example above would be set in `config.neon` as follows: + +/-- +common: + services: + authenticator: + class: Nette\Security\SimpleAuthenticator + arguments: [[ + john: IJ^%4dfh54* + kathy: 12345 + ]] +\-- + + +Custom authenticator +-------------------- + +We will create a custom authenticator that will check validity of login credentials against a database table. Every authenticator must be and implementation of [api:Nette\Security\IAuthenticator], with is't only method `authenticate()`. It's only purpose is to return an [identity | #identity] or to throw an `Nette\Security\AuthenticationException`. Framework defines a few error codes, which can be used to determine the reason login was not successful, such as self-explaining `IAuthenticator::IDENTITY_NOT_FOUND` or `IAuthenticator::INVALID_CREDENTIAL`. + +/--php +use Nette\Security as NS; + +class MyAuthenticator extends Nette\Object implements NS\IAuthenticator +{ + public $connection; + + function __construct(Nette\Database\Connection $connection) + { + $this->connection = $connection; + } + + function authenticate(array $credentials) + { + list($username, $password) = $credentials; + $row = $this->connection->table('users') + ->where('username', $username)->fetch(); + + if (!$row) { + throw new NS\AuthenticationException('User not found.'); + } + + if ($row->password !== md5($password)) { + throw new NS\AuthenticationException('Invalid password.'); + } + + return new NS\Identity($row->id, $row->role); + } +} +\-- + +Class `MyAuthenticator` communicates with database using [Nette\Database |database] layer and works with table `users`, where it grabs `username` and md5 hash of `password` in the appropriate columns. If the password check is successful, it returnrs new identity with user ID and role, which we will mention [later | #roles]; + +This authenticator would be configured in the `config.neon` file like this: + +/-- +common: + services: + authenticator: + class: MyAuthenticator + arguments: [@database] + + database: + class: Nette\Database\Connection + arguments: [..., ..., ...] # database access (DSN, user, password) +\-- + + +Identity +-------- + +Identity presents a set of user information, as returned by autheticator. It's an object implementing [api:Nette\Security\IIdentity] interface, with default implementation [api:Nette\Security\Identity]. +Class has methods `getId()`, that returns users ID (for example primary key for the respective database row), and `getRoles()`, which returns an array of all roles user is in. User data can be access as if they were identity properties. + +Identity is not erased when user is logged out. So, if identity exists, it by itself does not grant that user is also logged in. If we would explicitly delete the identity for some reason, we can logout user with `$user->logout(TRUE)`. + +Service `user` of class [api:Nette\Http\User] keeps identity in session and uses it to all authorizations. +Identity can be access with `getIdentity` upon `$user`: + +/--php +if ($user->isLoggedIn()) { + echo 'Logged in user: ', $user->getIdentity()->getId(); +} else { + echo 'User logged out'; +} +\-- + + + +Authorization +============= + +Authorization detects whether an user has enough privilege to do some action, for example opening a file or deleting an article. Authorization assumes that user has been successfully authenticated (logged in). + +Nette Framework authorization may be based on what groups does user belong to or which roles user has got. We will start at the very beginning. + +Simple web sites with few administrator, where all users have same privileges, may use only already mentioned `isLoggedIn()` method. Simply put, if user is logged in, he has permission to all actions, and vice versa. + +/--php +if ($user->isLoggedIn()) { // is user logged in? + deleteItem(); // if so, he may delete an item +} +\-- + + +Roles +----- + +The purpose of roles is to offer a more precise privilege control while not depending on a user name. As soon as user logs in, we give his identity one or more roles. Roles itself may be a simple strings, such as `admin`, `member`, `guest`, etc. They are set via a second argument of `Identity` constructor, either a string or an array. + +This time we will use `isInRole()` to check if user is allowed to take some action: + +/--php +if ($user->isInRole('admin')) { // is user an admin? + deleteItem(); // if so, he may delete an item +} +\-- + +As you already know, logging user out does not erase his identity. So the method `getIdentity()` still returns an `Identity` object, with all roles as before the logout. Nette Framework does profess an "less code, more security" principle, which leads to not forcing coders to write `if ($user->isLoggedIn() && $user->isInRole('admin'))` everwhere and that's why `isInRole()` method does work with **efective roles*. If user is logged out, his identity is explicitly returned as `guest`, ignoring any identity that might be present. + +Authorizator +------------ + +Authorizator decides, whether user has permission to take some action. It's an implementation of [api:Nette\Security\IAuthorizator] interface with only one method `isAllowed()`, which either allows an an action if given *role* is allowed to do certain *operation* with specific *resource*, or denies it. + +- **role** is an user attribute - for example moderator, editor, visitor, registered user, administrator, ... +- **resource** is an logical unit - article, page, user, menu item, poll, presenter, ... +- **privilege** is a specific activity, which user may or may not do with *resource* - view, edit, delete, vote, ... + + +An implementation skeleton looks like this: + +/--php +class MyAuthorizator extends Nette\Object + implements Nette\Security\IAuthorizator +{ + + function isAllowed($role, $resource, $privilege) + { + return ...; // returns either TRUE or FALSE + } + +} +\-- + +And an usage example: + +/--php +// registeres authorizator +$user->setAuthorizator(new MyAuthorizator); + +if ($user->isAllowed('file')) { // is user allowed to do everything with resource 'file'? + useFile(); +} + +if ($user->isAllowed('file', 'delete')) { // is user allowed to delete a resource 'file'? + deleteFile(); +} +\-- + +.[note] +Do not confuse two different methods `isAllowed`: one belongs to authorizator and the other one to the `User` class, where first argument is not `$role`. + +Because user may have many roles, the permission is granted if at least one roles is allowed. Both arguments are optional and defaults to *everything*. + + +Permission ACL +-------------- +Nette Framework has a complete authorizator, class [api:Nette\Security\Permission] which offers a light weight and flexible ACL((Access Control List)) layer for permission and access control. All permissions are set for roles, resources and specific privileges. Roles and resources may be linked to hierarchies, as shown in the following snippet: + +- `guest`: logged out visitor, allowrd read and browser public part of the web, that is articles, comments and vote in poll + +- `registered`: loggin in user, which may as well post comments + +- `administrator`: may write and manage articles, comments and polls + +We have defined certain roles (`guest`, `registered` and `administrator`) and metioned resources (`article`, `comments`, `poll`), which users may access or take actions on (`view`, `vote`, `add`, `edit`). + +We create an instance of Presmission and define user roles. As roles may inherit each other, we may for example specify that `administrator` may do the same as an ordinary visitor (an of course more). + +/--php +$acl = new Nette\Security\Permission; + +// roles definition +$acl->addRole('guest'); +$acl->addRole('registered', 'guest'); // registered inherits from guest +$acl->addRole('administrator', 'registered'); // and administrator inherits from registered +\-- + +Trivial, isn't it? This ensures all properties are set from parent role to it's children. + +Do note method `getRoleParents()`, which returns an array of all parent roles, and method `roleIntheritsFrom()`, which check whether on role extends the other. Their usage: + +/--php +$acl->roleInheritsFrom('administrator', 'guest'); // TRUE +$acl->getRoleParents('administrator'); // array('guest', 'registered') +\-- + +It's right time to define proper resources which users may acccess: + +/--php +$acl->addResource('article'); +$acl->addResource('comments'); +$acl->addResource('poll'); +\-- + +Also resources may use inheritance. The API offeres similar methods, only the names are slightly different: `resourceInheritsFrom()`, `removeResource()`. + +And now to the most important part. Roles and resources alone would do us no good, we have to create rules defining who can do what with whatever: + +TODO: chybí příklad deny() + +/--php +// everything is denied now + +// guest may view articles, comments and polls +$acl->allow('guest', array('article', 'comments', 'poll'), 'view'); + +// registered user has also right to add comments +$acl->allow('registered', 'comments', 'add'); + +// administrator may also edit and add everything +$acl->allow('administrator', Permission::ALL, array('view', 'edit', 'add')); +\-- + +With set of rules, we may ask authorization simple questions: + +/--php +// can guest view articles? +echo $acl->isAllowed('guest', 'article', 'view'); // TRUE +// can guest edit an article? +echo $acl->isAllowed('guest', 'article', 'edit'); // FALSE +// may guest add comments? +echo $acl->isAllowed('guest', 'comments', 'add'); // FALSE +\-- + +The same is true for the registered user, though he is allowed to add a comment: + +/--php +echo $acl->isAllowed('registered', 'article', 'view'); // TRUE +echo $acl->isAllowed('registered', 'comments', 'add'); // TRUE +echo $acl->isAllowed('registered', 'backend', 'view'); // FALSE +\-- + +Administrator is allowed to do everything: + +/--php +echo $acl->isAllowed('administrator', 'article', 'view'); // TRUE +echo $acl->isAllowed('administrator', 'commend', 'add'); // TRUE +echo $acl->isAllowed('administrator', 'poll', 'edit'); // TRUE +\-- + +Admin rules may possibly be defined without any restrictions (without inheriting from any other roles): + +/--php +$acl->addRole('supervisor'); +$acl->allow('supervisor'); // all privileges for all resources for supervisor +\-- + +Whenever during the application runtime we may remove roles `removeRoll()`, resources `removeResource()` or rules `removeAllow()` or `removeDeny()`. + +Roles may inherith form one or more other roles. What happens, if one ancestor has a certain action allowed and the other one denied? Then the *role weight* comes into play - the last role in the array of roles to inherit has the greatest weight, first one the lowest: + +/--php +$acl = new Permission(); +$acl->addRole('admin'); +$acl->addRole('guest'); + +$acl->addResource('backend'); + +$acl->allow('admin', 'backend'); +$acl->deny('guest', 'backend'); + +// example A: role admin has lower weight than role guest +$acl->addRole('john', array('admin', 'guest')); +$acl->isAllowed('john', 'backend'); // FALSE + +// example B: role admin has greater weight than role guest +$acl->addRole('mary', array('guest', 'admin')); +$acl->isAllowed('mary', 'backend'); // TRUE +\-- + + +Multiple applications in one scope +================================== + +Multiple applications may work on the same server, session, etc., each with separated authentication logic. It's enough to set a unique namespace for each: + +/--php +$user->setNamespace('forum'); +\-- + + +Events: onLoggedIn, onLoggedOut +=============================== + +`user` service offers events: `onLoggedIn` and `onLoggedOut`, useful for logging authorization activities on the website. `onLoggedIn` event is called only when user has logged in successfully and the other one `onLoggedOut` when user is logged out. + +{{themeicon: icon-key.png}} diff --git a/en/vulnerability-protection.texy b/en/vulnerability-protection.texy new file mode 100644 index 0000000000..2684b97028 --- /dev/null +++ b/en/vulnerability-protection.texy @@ -0,0 +1,71 @@ +Vulnerability protection +************************ + +.[perex] + +Every now and then an major security hole is announced or even abused. For sure that's a little bit unpleasant. If you care about security of your web apps, Nette Framework is frankly the best choice for you. + + +Cross-Site Scripting (XSS) +========================== + +Cross-Site Scripting is a site disruption method using unescaped input. An attacker may inject his own HTML or JavaScript code and change the look of the page or even gather sensitive information about users. Protection against XSS is simple: consistent and correct escaping of all strings and inputs. Traditionally, it would be enough if your coder would made just a one slightest error and forgot once, and the whole website could be compromised. + +An example of such an injection may be passing a canned ur, which inserts a "malicious" script. If an application does not escape inputs properly, such an request would possibly execute a script on client side. This may for example lead to stolen identity. + +/-- +http://example.com/?search= +\-- + +Nette Framework comes with a brand new technology [Context-Aware Escaping |templating#context-aware-escaping], which get rid of the Cross-Site Scripting risks forever. It escapes all inputs automatically based on given context, so it's impossible for coder to accidentally forget something. Take the following template as an example: + +/--html +

    {$message}

    + + +\-- + +Command `{$message}` prints a variable. Other frameworks do often force developers to explicitly declare escaping, and even what type of escaping based on the context. Yet in Nette Framework you need to declare nothing, it's all pretty clever, that is. Everything is automatic, consistent and just right. If we set the variable to `$message = 'Width 1/2"'`, framework will generate this HTML code: + +/--html +

    Width 1/2"

    + + +\-- + + +Cross-Site Request Forgery (CSRF) +================================= + +Cross-Site Request Forgery is attacked based on forcing user to visit attackers own webpage, which does silently execute a request on a page the victim is currently logged in. It's for instance possible to edit or delete an article without the victim realizing it. Protection agains this attack is generating and verifying an authorization token. + +Protecting a web form agains Cross-Site Request Forgery in Nette Frameworku is a matter of this oneliner: + +/--php +$form->addProtection(); +\-- + +That's all it takes to protect a web form. It's strongly recommended to use this verification on login form and in administration. + + +URL attack, control codes, invalid UTF-8 +======================================== + +Different terms all related to attacker's effort to give your application a "malicious" input. The results may vary greatly, from broken XML outputs (ie. malfunctioned RSS stream) over getting sensitive information from database to getting user passwords. A protection against these attacks is consistent UTF-8 check on byte level. And frankly, you would not do that without a framework, right? + +Nette Framework does this for you, automatically. You don't have to configure anything at all and your application will be safe. + + +Session hijacking, session stealing, session fixation +===================================================== + +Session management involves a few types of attacks. Attacker may steal victim's session ID or forge one and thus gain access to a web application without the actual password. Then the attacker may do whatever the user could, without any trace. The protection lays on proper configuration of both PHP and the web server itself. + +Nette Framework configures PHP automatically. Developers thus do not have to think how to make session protected enough and can fully emerge what's key about the application. Requires enabled `ini_set()` function. + + +{{themeicon: icon-communication.png}} diff --git a/files/application-icon-80x80-r6-r1-c7-s1.png b/files/application-icon-80x80-r6-r1-c7-s1.png new file mode 100644 index 0000000000000000000000000000000000000000..fe415e111b2fc80aedcec19b7017816df9eea6c0 GIT binary patch literal 8292 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 literal 0 HcmV?d00001 diff --git a/files/ecommercial.png b/files/ecommercial.png new file mode 100644 index 0000000000000000000000000000000000000000..001d05b788ed9ab45fa54c3049b025c7bf2765c3 GIT binary patch literal 7403 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 P00000NkvXXu0mjfZyeg? diff --git a/files/icon-ecommercial.png b/files/icon-ecommercial.png index 2aacef732b555aeb7834012f1fb61e8241075d0a..039d1576387ba7154acd7856a12d794d226ba5fe 100644 GIT binary patch delta 6024 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 Date: Tue, 16 Aug 2011 00:42:03 +0200 Subject: [PATCH 0145/1741] cs/dependency-injection: finalizace --- cs/dependency-injection.texy | 220 +++++++++++++---------------------- 1 file changed, 82 insertions(+), 138 deletions(-) diff --git a/cs/dependency-injection.texy b/cs/dependency-injection.texy index 8464b6b003..0c45502806 100644 --- a/cs/dependency-injection.texy +++ b/cs/dependency-injection.texy @@ -39,7 +39,7 @@ $article->content = 'Every year millions of people in ...'; $article->save(); \-- -Metoda `save()` nám uloží článek do databázové tabulky `articles`. Implementovat ji za pomoci [Nette\Database |database] bude hračka, nebýt jedno zádrhelu: kde má objekt `Article` vzít připojení k databázi, tj. objekt Connection? +Metoda `save()` nám uloží článek do databázové tabulky `articles`. Implementovat ji za pomoci [Nette\Database |database] bude hračka, nebýt jedno zádrhelu: kde má `Article` vzít připojení k databázi, tj. objekt třídy Connection? Nejspíš bychom si poradili, můžeme jej uložit někde do globální proměnné `$GLOBALS['connection']`. Říkali vám, že používání globálních proměnných je špatné a že máte raději používat statické proměnné tříd? No měli pravdu, globální proměnné jsou zlo, jenže statické proměnné tříd jsou zcela totéž. To je jako říci: „Nejezte hamburgery, tloustne se po nich, dejte si raději cheeseburger.“ @@ -63,7 +63,7 @@ class Article $this->connection->table('articles')->insert(array( 'title' => $this->title, 'content' => $this->content, - ); + )); } } @@ -78,7 +78,7 @@ $article->content = ... $article->save(); \-- -Ptáte se, kde tento kód vezme `$connection`? DI dává jasnou odpověď: „ať se postará někdo jiný“. Databázové spojení zkrátka dodá ten, kdo volá uvedený kód. A tak dále, a tak dále. Jistě si říkáte, že přece nelze delegovat zodpovědnost do nekonečna. Že musí být nějaký počátek všehomíra. A máte pravdu. Úplně na začátku je *stvořitel*, který už nic nedeleguje a objekty tvoří. Říká se mu **systémový kontejner.** A je mu věnovaná [jedna celá kapitola |configuring]. +Ptáte se, kde tento kód vezme `$connection`? DI dává jasnou odpověď: „ať se postará někdo jiný“. Databázové spojení zkrátka dodá ten, kdo volá uvedený kód. A tak dále, a tak dále. Jistě si říkáte, že přece nelze delegovat zodpovědnost do nekonečna. Že musí být nějaký počátek všehomíra. A máte pravdu. Úplně na začátku je *stvořitel*, který už nic nedeleguje a objekty tvoří. Říká se mu **systémový kontejner.** A je mu věnovaná [samostatná kapitola |configuring]. Proč jsou globální proměnné zlo? @@ -107,18 +107,16 @@ Co s tím? Věc má řešení. Místo ručního vytváření objektů `Article` DI kontejner a služby --------------------- -Termínem DI kontejner označujeme právě onu továrničku. Přesněji řečeno, jde o objekt obsahující libovolné množství továrniček, každou pro jinou službu. Co jsou to služby? Obyčejné objekty, jako třeba zmíněný `Article`. Jen v souvislosti s DI kontejnery jim říkáme služby. Zřejmě to vymysleli konzultanti, kteří chtějí, aby DI vypadalo složitě a oni mohli konzultovat. +Termínem DI kontejner označujeme právě onu továrničku. Přesněji řečeno, jde o objekt obsahující libovolné množství továrniček, každou pro jinou službu. Co jsou to služby? Obyčejné objekty, jako třeba instance zmíněné `Article`. Jen v souvislosti s DI kontejnery jim říkáme služby. Zřejmě to vymysleli konzultanti, kteří chtějí, aby DI vypadalo složitě a oni mohli konzultovat. -Příkladem může být kontejner, který vytvoří `Article`, ale také jím požadované připojení k databázi: +Příkladem může být kontejner, který vytvoří objekt `Article`, ale také jím požadované připojení k databázi: /--php class Container { function createConnection() { - return new Nette\Database\Connection( - 'mysql:host=localhost', 'root', '***' - ); + return new Nette\Database\Connection('mysql:', 'root', '***'); } function createArticle() @@ -136,7 +134,7 @@ $container = new Container; $article = $container->createArticle(); \-- -Výhoda je zřejmá, nemusíme se starat o to, jak `Article` vyrobit, to je záležitostí továrničky. Nicméně řešení má dva problémy. Nejprve: přihlašovací údaje jsou natvrdo zadrátované do kódu, proto je vyčleníme: +Výhoda je zřejmá, nemusíme se starat o to, jak `Article` instancovat, to je záležitostí továrničky. Nicméně řešení má zatím dva nedostatky. Jednak jsou přihlašovací údaje natvrdo zadrátované do kódu, proto je vyčleníme do proměnné. Můžeme parametrem ovlivňovat i třídu, kterou továrnička vytváří: /--php class Container @@ -154,7 +152,7 @@ class Container function createArticle() { - $class = $this->params['article.class']; + $class = $this->params['articleClass']; return new $class($this->createConnection()); } @@ -162,15 +160,15 @@ class Container $container = new Container; $container->params = array( - 'dsn' => 'mysql:host=localhost' + 'dsn' => 'mysql:', 'user' => 'root', 'password' => '***', - 'article.class' => 'Article', + 'articleClass' => 'Article', ); $article = $container->createArticle(); \-- -Daleko větším problémem je, že vždy, když požádáme o vytvoření `Article`, vytvoří se i nové připojení k databázi. Tomu je třeba zabránit. Jednou vytvořenou službu `Connection` si proto uložíme do proměnné pro příští použití: +Závažnějším nedostatkem je, že vždy, když požádáme o vytvoření `Article`, vytvoří se i nové připojení k databázi. Tomu je třeba zabránit. Přidáme proto metodu `getConnection`, která bude uchovávat jednou vytvořenou službu pro příští použití: /--php class Container @@ -181,39 +179,46 @@ class Container function createConnection() { - if (isset($this->services['connection'])) { - return $this->services['connection']); - } - - return $this->services['connection'] = new Nette\Database\Connection( + return new Nette\Database\Connection( $this->params['dsn'], $this->params['user'], $this->params['password'] ); } - ... + function getConnection() + { + if (!isset($this->services['connection'])) { + $this->services['connection'] = $this->createConnection(); + } + return $this->services['connection']; + } + + function createArticle() + { + $class = $this->params['articleClass']; + return new $class($this->getConnection()); + } + } \-- -Vidíte, že DI kontejner není nic složitého. - -*TODO* +Jak vidíte, napsat DI kontejner není nic složitého. Za připomenutí stojí, že služby neví, že je vytváří nějaký kontejner, tím pádem je možné takto vytvářet jakýkoliv objekt v PHP. Nette\DI\Container ================== -Třída [Nette\DI\Container |api:] je pružná implementace DI kontejneru. Vlastní kontejnery můžeme vytvářet buď staticky, tj. poděděním této třídy, nebo dynamicky, kdy továrničky přidáme pomocí closures nebo callbacků. +Třída [Nette\DI\Container |api:] je pružná implementace DI univerzálního kontejneru. Automaticky zajišťuje, že instance služby se vytváří jen napoprvé a pak vrací stále týž objekt. -Jednotlivé services jsou sdílené, tj. vytváří se jen jednou. +Vlastní kontejnery můžeme vytvářet buď staticky, tj. poděděním této třídy, nebo dynamicky, kdy továrničky přidáme jako closury nebo callbacky. Statický kontejner ------------------ -Všimněte si, že kontejner nabízí pole `$params` pro uživatelské parametry a také "magické settery/gettery" jakožto zkratky pro `addService`, `getService`, `hasService` a `removeService`. +Názvy továrních funkcí dodržují jednotnou konvenci, jsou tvořeny předponou `createService` + názvem služby začínajícím velkým písmenem. Pokud nemají být dostupné zvenčí, lze jim viditelnost snížit na protected. Všimněte si, že kontejner už má pole `$params` pro uživatelské parametry. /--php class MyContainer extends Nette\DI\Container @@ -230,24 +235,30 @@ class MyContainer extends Nette\DI\Container protected function createServiceArticle() { - $class = $this->params['article.class']; - return new $class($this->getService('connection')); + $class = $this->params['articleClass']; + return new $class($this->connection); } } +\-- + +Službu získáme metodu `getService` nebo zkratkou: +/--php $container = new MyContainer; $container->params = array( - 'dsn' => 'mysql:host=localhost' + 'dsn' => 'mysql:', 'user' => 'root', 'password' => '***', - 'article.class' => 'Article', + 'articleClass' => 'Article', ); +$article = $container->getService('article'); +// nebo rovnou: $article = $container->article; \-- -Všechny služby v rámci kontejneru jsou trvalé, tj. při volání `getService()` (či získání přes proměnou) se nevytváří služba opakovaně, ale vrací se již dříve vytvořená. Jakékoliv jiné chování by bylo leda matoucí. V uvedeném příkladu by se ale hodilo, kdyby kontejner pokaždé vygeneroval nový objekt `Nette\Mail\Article`. Toho lze dosáhnout snadno: namísto služby `article` vytvoříme obyčejnou metodu `createArticle`: +Jak bylo řečeno, všechny služby v rámci kontejneru se vytváří jen jednou, nám by se ale spíš hodilo, kdyby kontejner pokaždé vygeneroval novou instanci `Article`. Toho lze dosáhnout snadno: namísto továrničky pro službu `article` vytvoříme obyčejnou metodu `createArticle`: /--php class MyContainer extends Nette\DI\Container @@ -264,38 +275,27 @@ class MyContainer extends Nette\DI\Container function createArticle() { - $class = $this->params['article.class']; - return new $class($this->getService('connection')); + $class = $this->params['articleClass']; + return new $class($this->connection); } } $container = new MyContainer; -$container->params = array( - 'dsn' => 'mysql:host=localhost' - 'user' => 'root', - 'password' => '***', - 'article.class' => 'Article', -); +$container->params = ... $article = $container->createArticle(); \-- -Z kódu `$xyz = $container->createXyz()` je zřejmé, že se vytváří pokaždé nový objekt. Jde tedy o konvenci na straně programátora. - -Kontejner je možné zmrazit a poté ho již nelze měnit: - -/--php -$container->freeze(); -$container->addService(...); // vyhodí výjimku -\-- +Z volání `$container->createArticle()` je zřejmé, že se vytváří pokaždé nový objekt. Jde tedy o konvenci na straně programátora. -Rozmrazíme jej vytvořením klonu, viz níže. Dynamický kontejner ------------------- +Skutečné výhody `Nette\DI\Container` se projeví v dynamickém přístupu, kdy továrničky (nebo rovnou služby) přidáváme pomocí metody `addService`: + /--php $container = new Nette\DI\Container; @@ -308,87 +308,32 @@ $container->addService('connection', function($container) { }); $container->addService('article', function($container) { - $class = $container->params['article.class']; + $class = $container->params['articleClass']; return new $class($container->connection); }); - -// nastavíme parametry -$container->params = array( - 'dsn' => 'mysql:host=localhost' - 'user' => 'root', - 'password' => '***', - 'article.class' => 'Article', -); - -// a nyní kontejner použijeme pro vytvoření objektu emailu: -$article = $container->article; // zkratka pro $container->getService('article') \-- -Pokud místo callbacku předáme řetězec s názvem třídy, vytvoří se objekt `ServiceBuilder`, jehož úkolem je později třídu instancovat. Metoda `addService` onen builder vrací. Pokud bychom tedy vytvořili builder s metodami jako `addArgument` nebo `addMethodCall`, bylo by možné uvedený příklad zapsat třeba takto: +Továrničky lze zapisovat jako PHP callback nebo closure. Všimněte si, že jako parametr je jim předáván samotný kontejner, mohou tak snadno přistupovat k parametrům a jiným službám. -/--php -$container->addService('connection', new AnotherBuilder('Nette\Database\Connection')) - ->addArgument('%dsn%') - ->addArgument('%user%') - ->addArgument('%password%'); +Pokud vytvoření služby spočívá v triviálním vytvoření instance, lze metodě `addService` jako druhý parametr předat rovnou název třídy. A pokud již objekt vytvořený máme, můžeme předat přímo ho. -$container->addService('article', new AnotherBuilder('%article.class%')) - ->addArgument('@mailer'); +Kromě metody `addService` máme k dispozici ještě `hasService` ověřující existenci služby a `removeService` sloužící k jejímu odstranění. Opět včetně zkratek jako `isset($container->article)` a `unset($container->article)`. -$container->params = array( - 'dsn' => 'mysql:host=localhost' - 'user' => 'root', - 'password' => '***', - 'article.class' => 'Article', -); -\-- - -/--comment -Zdůrazňujeme, že AnotherBuilder v Nette přímo není, jeho kód by vypadal cca takto: - - /--php -class AnotherBuilder extends Nette\DI\ServiceBuilder -{ - private $args = array(); - private $calls = array(); - public function addArgument($arg) - { - $this->args[] = $arg; - return $this; - } - - public function addMethodCall($method) - { - $this->calls[] = func_get_args(); - return $this; - } +Zmrazení +-------- - public function createService(Nette\DI\IContainer $container) - { - $class = $container->expand($this->class); - try { - $type = new Nette\Reflection\ClassType($class); - } catch (\ReflectionException $e) { - throw new Nette\InvalidStateException("Cannot instantiate service, class '$class' not found."); - } +Kontejner je možné zmrazit a poté ho již nelze měnit: - $expander = function(& $val) use ($container) { - $val = $val[0] === '@' ? $container->getService(substr($val, 1)) : $container->expand($val); - }; - $args = $this->args; - array_walk_recursive($args, $expander); - $service = $type->newInstanceArgs($args); - foreach ($this->calls as $call) { - array_walk_recursive($call, $expander); - call_user_func_array(array($service, array_shift($call)), $call); - } - return $service; - } +/--php +$container->freeze(); +$container->addService(...); // vyhodí výjimku +\-- +Rozmrazíme jej vytvořením klonu: -} - \-- +/--php +$dolly = clone $container; \-- @@ -401,7 +346,7 @@ Vytvářejte aliasy pro služby jen tehdy, je-li to skutečně nutné: $container->addService('alias', $container->getService('originalName')); \-- -Pochopitelně tímto způsobem můžeme kopírovat služby mezi jednotlivými kontejnery. +Tímto způsobem můžeme kopírovat služby mezi jednotlivými kontejnery. Pokud chceme zachovat lazy-loading, tj. kopírovat služby, které zatím nejsou vytvořené, uděláme to následovně: @@ -414,22 +359,24 @@ $container->addService('alias', function($container) { Nebo mezi dvěma kontejnery: /--php -$containerDest->addService('connection', function() use ($containerSrc) { +$containerDest->addService('connection', function() use ($containerSrc){ return $containerSrc->getService('connection'); }); \-- Kontejner je také možné klonovat. Klon obsahuje všechny služby jako vzor a pochopitelně lze do něj přidávat nové. -/--php -$dolly = clone $container; -\-- - Auto-wiring ----------- -Autowire je pokročilejší technika, umožňující při vytváření služby automaticky předávat do konstruktoru další služby dle typu. Vytvoříme si k tomu nový `ServiceBuilder`: +Autowire je pokročilejší technika, umožňující při vytváření služby automaticky předávat do konstruktoru další služby dle typu. Její implementace není přímo součástí frameworku, napíšeme si proto vlastní [Nette\DI\ServiceBuilder]. Jde o speciální továrnu na služby, kterou můžeme předat metodě `addService`: + +/--php +$container->addService('article', new AutowireServiceBuilder('Article')); +\-- + +Vytvoření služby `article` bude mít nyní na starost metoda `createService` builderu. Ukažme si tedy možnou implementaci: /--php class AutowireServiceBuilder extends Nette\DI\ServiceBuilder @@ -442,6 +389,7 @@ class AutowireServiceBuilder extends Nette\DI\ServiceBuilder } catch (\ReflectionException $e) { throw new Nette\InvalidStateException("Cannot instantiate service, class '$this->class' not found."); } + $args = array(); if ($type->hasMethod('__construct')) { foreach ($type->getMethod('__construct')->getParameters() as $param) { @@ -458,25 +406,20 @@ class AutowireServiceBuilder extends Nette\DI\ServiceBuilder } } - - -// přidáme službu, která se sestaví auto-wiringem -$cont->addService('article', new AutowireServiceBuilder('Article')); \-- - -Klíčem je metoda kontejneru `getServiceByType()`, která vrátí službu podle daného typu (třída, interface). Taková služba musí být v kontejneru právě jedna, jinak se vyhodí výjimka. +Klíčem je metoda kontejneru `getServiceByType`, která vrátí službu podle daného typu (třída, interface). Taková služba musí být v kontejneru právě jedna, jinak se vyhodí výjimka. Pokud přidáváme službu pomocí továrny, není její typ pochopitelně znám. Můžeme ho proto "napovědět" třetím parametrem metody `addService`: /--php -$cont->addService('connection', function($cont) { ... }, 'Nette\Database\Connection'); +$container->addService('article', function() { ... }, 'Article'); \-- -K ověření typu služby slouží metoda `checkServiceType`: +K ověření typu konkrétní služby slouží metoda `checkServiceType`: /--php -if (!$cont->checkServiceType('connection', 'Nette\Database\Connection')) { +if (!$container->checkServiceType('article', 'Article')) { ... } \-- @@ -485,26 +428,27 @@ if (!$cont->checkServiceType('connection', 'Nette\Database\Connection')) { Tagování -------- -Při uložení jakéhokoliv objektu můžeme u něj uvést doplňující metainformace, tzv. tagy: +Při uložení jakéhokoliv objektu můžeme u něj uvést doplňující metainformace, kterým říkáme tagy: /--php -$container->addService('connection', ..., array('tag1', 'tag2')); +$container->addService('name', ..., array('tag1', 'tag2')); \-- -A poté můžeme v kontejneru vyhledat všechny služby (resp. jejich jména), které mají daný tag: +A poté můžeme v kontejneru vyhledat všechny služby, které mají daný tag: /--php +// vrací pole názvů služeb, tj. řetězců $list = $container->getServiceNamesByTag('tag1') \-- Tag nemusí být je řetězec, ale může obsahovat další libovolné atributy: /--php -$container->addService('connection', ..., array( - 'tag1' => array('id' => 'mx', 'priority' => 12), +$container->addService('name', ..., array( + 'tag1' => array('priority' => 12), 'tag2' => array('...'), )); $list = $container->getServiceNamesByTag('tag1') -// vrací pole array('connection' => array('id' => 'mx', 'priority' => 12)) +// vrací pole array('name' => array('priority' => 12)) \-- From 96232f2c51dab43d5f113750568e86e5c66b602d Mon Sep 17 00:00:00 2001 From: smasty Date: Tue, 16 Aug 2011 12:45:30 +0200 Subject: [PATCH 0146/1741] en/atomicity: created --- en/atomicity.texy | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 en/atomicity.texy diff --git a/en/atomicity.texy b/en/atomicity.texy new file mode 100644 index 0000000000..b918066c2b --- /dev/null +++ b/en/atomicity.texy @@ -0,0 +1,58 @@ +Atomic Operations +***************** + +.[perex] +The Nette\Utils\SafeStram protocol for file manipulation guarantees atomicity and isolation of every file operation. + + +Why is it actually good? Let's start with a simple example, where we repeatedly write the same string to the file and then read it: + +/--php +$s = str_repeat('Long String', 10000); + +$counter = 1000; +while ($counter--) { + file_put_contents('soubor', $s); // write it + $readed = file_get_contents('soubor'); // read it + if ($s !== $readed) { // check it + echo 'Strings are different!'; + } +} +\-- + +It may seem that the `echo 'Strings are different!'` command can't ever get executed. The opposite is true. Try to run this script in +two browsers simultaneously. The error occurs almost immediately. + +It's because the code is not safe when performed repeatedly at the same time (ie, in multiple threads). And that is nothing unusual +on the Internet, where several people often connect to one website at the same time. Therefore, it's very important to ensure +that your application can handle multiple threads at once - that it's *thread-safe*, because native PHP functions are not. +Otherwise, you can expect data loss and strange errors occuring. + +How to ensure, that functions like file_get_contets or `fwrite` behave atomically? The SafeStream protocol offers a secure solution, +so we can atomically manipulate files through standard PHP functions. The protocol is available automatically when you +load Nette Framework. After that, you just need prefix the filename with `safe://`: + +/--php +$handle = fopen('safe://test.txt', 'x'); // prefix the filename with safe:// + +fwrite($handle, 'Nette Framework'); // meanwhile, data is written into a temporary file + +fclose($handle); // and only now the file is renamed to test.txt +\-- + +You can of course use all the familiar function, such as: + +/--php +file_put_contents('safe://test.txt', $content); + +$ini = parse_ini_file('safe://autoload.ini'); +\-- + +SafeStream guarantees: + +- **Atomicity**: The file is written either as a whole or not written at all. +- **Isolation**: No one can start to read a file that is not yet fully written. + +.[note] +If you write to an existing file in the '`a`' mode (append), SafeStream creates it's copy and only after successfully writing it +renames it to the original name. Write in this mode is therefore more resource-consuming than in other modes. From 1e7b2f703cfd89b0f4956b11117d8975324751ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Tvrd=C3=ADk?= Date: Tue, 16 Aug 2011 17:14:12 +0200 Subject: [PATCH 0147/1741] en/homepage: fixed forum icon --- en/homepage.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/homepage.texy b/en/homepage.texy index fd7047faa9..b9e0b1ef0d 100644 --- a/en/homepage.texy +++ b/en/homepage.texy @@ -17,7 +17,7 @@ Here you can find a lot of sources which can help you to learn Nette Framework a [* lamplight.png *] Additional Resources ----------------------- -- [Community Forum | http://forum.nette.org/en/] have a question? Ask on forum .[icon]{background-image:url(http://files.nette.l/1349/icon-forum.png)} +- [Community Forum | http://forum.nette.org/en/] have a question? Ask on forum .[icon]{background-image:url(icon-forum.png)} - [API references | http://api.nette.org/] overview of classes, methods and parameters - [Planette: Tutorials & Screencasts | pla:] - [Chat Room | http://www.speeqe.com/room/nette@conf.netlab.cz/] From 875d037ca11d684d378b334481f6d7c8faa4b6d6 Mon Sep 17 00:00:00 2001 From: Lopata Date: Thu, 18 Aug 2011 14:45:21 +0200 Subject: [PATCH 0148/1741] en/ajax: created --- en/ajax.texy | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 en/ajax.texy diff --git a/en/ajax.texy b/en/ajax.texy new file mode 100644 index 0000000000..381a8cbe26 --- /dev/null +++ b/en/ajax.texy @@ -0,0 +1,86 @@ +AJAX & snippets +*************** + +/--div .[perex] +Modern web applications nowadays run half on a server and half in a browser. AJAX is the vital unifying factor. What support does Nette Framework offer? +- sending fragments of a template (so called *snippets*) +- passing variables between PHP and JavaScript +- debugging of AJAX applications +\-- +An AJAX request can be detected using a method of a service [encapsulating a HTTP request | http-request-response#http-request] `$httpRequest->isAjax()` (detects based on the `X-Requested-With` HTTP header). There is also a shorthand method in presenter: `$this->isAjax()`. +An AJAX request is no different from a normal one – a presenter is called with a certain view and parameters. It is, too, up to the presenter how will it react: it can use its routines to either return a fragment of HTML code (a snippet), an XML document, a JSON object or a piece of Javascript code. +There is a pre-processed object called `payload` dedicated to sending data to the browser in JSON. +/--php + public function actionDelete($id) + { + if ($this->isAjax()) { + $this->payload->message = 'Success'; + } + ... + } +\-- +If we want to send HTML, we can either set a special template for AJAX requests: + +/--php + public function handleClick($param) + { + if ($this->isAjax()) { + $this->template->setFile('path/to/ajax.phtml'); + } + ... + } +\-- + However, there is a far more powerful tool of built-in AJAX support – snippets. Using them makes it possible to turn a regular application into an AJAX one unsing only a few lines of code. How it all works is demonstrated in the [Fifteen example | http://examples.nette.org/fifteen/] whose code is also accessible in the build or on [Github | http://github.com/nette/examples/tree/master/Fifteen]. +The way snippets work is that the whole page is transferred during the initial (i.e. non-AJAX) request and then with every other AJAX [subrequest |presenters#toc-handle-signal] (request of the same view of the same presenter) only the code of the changed parts is transferred in the earlier mentioned repository called `payload`. There are two mechanisms designated for this: invalidation and snippets rendering. + +Invalidation +------------ +Each descendant of class [Control |components] (which a Presenter is too) is able to remember whether there were any changes during a subrequest that require it to re-render. There is a triplet of methods to handle this: `invalidateControl()`, `validateControl()` and `isControlInvalid()`. An example: +/--php + public function handleLogin($user) + { + // The object has to re-render after the user has logged in + $this->invalidateControl(); + ... + } +\-- +Nette, however, offers an even slighter distinction than on the level of components. The listed methods can accept a name of a snippet as a parameter. Hence, it is possible to invalidate (that is to force to re-render) on the level of snippets (every object can keep any number of snippets). If the entire component is invalidated, then every snippet re-renders. A component is “invalid” even if any of its subcomponents is invalid as well. + +/--php +echo $this->isControlInvalid(); // -> FALSE + +$this->invalidateControl('header'); // invalidates the snippet named 'header' +echo $this->isControlInvalid('header'); // -> TRUE +echo $this->isControlInvalid('footer'); // -> FALSE +echo $this->isControlInvalid(); // -> TRUE, at least one snippet is invalid + +$this->invalidateControl(); // invalidates the whole component, every snippet +echo $this->isControlInvalid('footer'); // -> TRUE +\-- + +A component that receives a signal, is automatically invalidated. + +Thanks to invalidation of snippets we know exactly which parts of which elements will it be necessary to re-render. + +Macro `{snippet} … {/snippet}` .{toc: Macro snippet} +---------- + +Nette is based on the idea of **logical**, not **graphical** elements, i.e. a descendant of Control does not represent a rectangular area on a page, but a logical component that that can render even into various forms. (for instance a hypothetical component DataGrid can have a method for rendering the grid and another one for rendering the “paginator”, and so on). Each element can also be rendered multiple times on a single page; or conditionally, or every time with a different template, etc. +Therefore it is not possible to call some `render` method of every invalid object. The approach to the render must be the same as when the whole page is being rendered. + +Rendering of the page proceeds very similarly as in case of a regular request: the same templates are loaded, etc. The vital part is, however, to leave out the parts that are not supposed to reach the output and those that are shall be associated with an identifier and be sent to the user in a comprehensible format for a JavaScript handler. + +If there is a control or a snippet in the template, we have to wrap it using the `{snippet} ... {/snippet}` pair tag – it will make sure that the rendered snippet will be “cut out” and sent to the browser. It will also enclose it in a helper `
    ` tag (it is possible to use a different one). In the following example a snippet is named `header` and may as well represent a template of a control: +/--html +{snippet header} +

    Hello ....

    +{/snippet} +\-- + + +Debugging of AJAX applications +------------------------------ + +TODO + +{{themeicon: click.png}} From b8e0e8f6c9c276fba2d3461623a97f39d04b1aef Mon Sep 17 00:00:00 2001 From: Lopata Date: Thu, 18 Aug 2011 16:59:42 +0200 Subject: [PATCH 0149/1741] en/vulnerability-protection: Minor grammar corrections --- en/vulnerability-protection.texy | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/en/vulnerability-protection.texy b/en/vulnerability-protection.texy index 2684b97028..6ee3799dfa 100644 --- a/en/vulnerability-protection.texy +++ b/en/vulnerability-protection.texy @@ -3,21 +3,21 @@ Vulnerability protection .[perex] -Every now and then an major security hole is announced or even abused. For sure that's a little bit unpleasant. If you care about security of your web apps, Nette Framework is frankly the best choice for you. +Every now and then a major security flaw is announced or even abused. For sure that's a little bit unpleasant. If you care about security of your web apps, Nette Framework is frankly the best choice for you. Cross-Site Scripting (XSS) ========================== -Cross-Site Scripting is a site disruption method using unescaped input. An attacker may inject his own HTML or JavaScript code and change the look of the page or even gather sensitive information about users. Protection against XSS is simple: consistent and correct escaping of all strings and inputs. Traditionally, it would be enough if your coder would made just a one slightest error and forgot once, and the whole website could be compromised. +Cross-Site Scripting is a site disruption method using unescaped input. An attacker may inject his own HTML or JavaScript code and change the look of the page or even gather sensitive information about users. Protection against XSS is simple: consistent and correct escaping of all strings and inputs. Traditionally, it would be enough if your coder made just one slightest error and forgot once, and the whole website could be compromised. -An example of such an injection may be passing a canned ur, which inserts a "malicious" script. If an application does not escape inputs properly, such an request would possibly execute a script on client side. This may for example lead to stolen identity. +An example of such an injection may be slipping the user an altered URL, which inserts a "malicious" script. If an application does not escape its inputs properly, such a request would possibly execute a script on the client's side. This may for example lead to stolen identity. /-- http://example.com/?search= \-- -Nette Framework comes with a brand new technology [Context-Aware Escaping |templating#context-aware-escaping], which get rid of the Cross-Site Scripting risks forever. It escapes all inputs automatically based on given context, so it's impossible for coder to accidentally forget something. Take the following template as an example: +Nette Framework comes up with a brand new technology of [Context-Aware Escaping |templating#context-aware-escaping], which will get you rid of the Cross-Site Scripting risks forever. It escapes all inputs automatically based on given context, so it's impossible for a coder to accidentally forget something. Consider the following template as an example: /--html

    {$message}

    @@ -27,7 +27,7 @@ document.title = {$message}; \-- -Command `{$message}` prints a variable. Other frameworks do often force developers to explicitly declare escaping, and even what type of escaping based on the context. Yet in Nette Framework you need to declare nothing, it's all pretty clever, that is. Everything is automatic, consistent and just right. If we set the variable to `$message = 'Width 1/2"'`, framework will generate this HTML code: +The `{$message}` command prints a variable. Other frameworks do often force developers to explicitly declare escaping, and even what type of escaping based on the context. Yet in Nette Framework you don't need to declare anything. Everything is automatic, consistent and just right. If we set the variable to `$message = 'Width 1/2"'`, the framework will generate this HTML code: /--html

    Width 1/2"

    @@ -41,7 +41,7 @@ document.title = "Width 1\/2\""; Cross-Site Request Forgery (CSRF) ================================= -Cross-Site Request Forgery is attacked based on forcing user to visit attackers own webpage, which does silently execute a request on a page the victim is currently logged in. It's for instance possible to edit or delete an article without the victim realizing it. Protection agains this attack is generating and verifying an authorization token. +Cross-Site Request Forgery is an attack based on forcing a user to visit the attacker's own webpage, which silently executes a request on a page the victim is currently logged in. It's for instance possible to edit or delete an article without the victim realizing it. Protection against this attack is generating and verifying an authorization token. Protecting a web form agains Cross-Site Request Forgery in Nette Frameworku is a matter of this oneliner: @@ -55,7 +55,7 @@ That's all it takes to protect a web form. It's strongly recommended to use this URL attack, control codes, invalid UTF-8 ======================================== -Different terms all related to attacker's effort to give your application a "malicious" input. The results may vary greatly, from broken XML outputs (ie. malfunctioned RSS stream) over getting sensitive information from database to getting user passwords. A protection against these attacks is consistent UTF-8 check on byte level. And frankly, you would not do that without a framework, right? +Different terms all related to attacker's effort to give your application a "malicious" input. The results may vary greatly, from broken XML outputs (i.e. malfunctioned RSS stream) to getting sensitive information from database to getting user passwords. A protection against these attacks is consistent UTF-8 check on byte level. And frankly, you would not do that without a framework, right? Nette Framework does this for you, automatically. You don't have to configure anything at all and your application will be safe. @@ -63,9 +63,9 @@ Nette Framework does this for you, automatically. You don't have to configure an Session hijacking, session stealing, session fixation ===================================================== -Session management involves a few types of attacks. Attacker may steal victim's session ID or forge one and thus gain access to a web application without the actual password. Then the attacker may do whatever the user could, without any trace. The protection lays on proper configuration of both PHP and the web server itself. +Session management involves a few types of attacks. The attacker may steal the victim's session ID or forge one and thus gain access to a web application without the actual password. Then the attacker may do whatever the user could, without any trace. The protection lies on proper configuration of both PHP and the web server itself. -Nette Framework configures PHP automatically. Developers thus do not have to think how to make session protected enough and can fully emerge what's key about the application. Requires enabled `ini_set()` function. +Nette Framework configures PHP automatically. Developers thus do not have to worry about how to make a session protected enough and can fully focus on what's key about the application. This requires the `ini_set()` function to be enabled. {{themeicon: icon-communication.png}} From 8d927e7fcd53769f4abc2a986c2d5e8562d3a327 Mon Sep 17 00:00:00 2001 From: MartyIX Date: Sun, 21 Aug 2011 16:47:01 +0200 Subject: [PATCH 0150/1741] cs/caching: typo --- cs/caching.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/caching.texy b/cs/caching.texy index 24a333153e..2bf696ba0a 100644 --- a/cs/caching.texy +++ b/cs/caching.texy @@ -82,7 +82,7 @@ V makru je možné uvést klíče, na které se bude cache vázat (zde proměnn {/cache} \-- -Všechny položky jsou volitelné, takže nemusíme uvádět ani expiraci, ani tagy, nakonec ani kliče. +Všechny položky jsou volitelné, takže nemusíme uvádět ani expiraci, ani tagy, nakonec ani klíče. Použití cache lze také podmínit pomocí `if` - obsah se pak bude cachovat pouze bude-li splněna podmínka: From 1978ba1d665fa5a9b3f8cd76450bcea80e997222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Tvrd=C3=ADk?= Date: Mon, 22 Aug 2011 14:38:39 +0200 Subject: [PATCH 0151/1741] en/default-macros: typo --- en/default-helpers.texy | 6 +++--- en/default-macros.texy | 2 +- en/getting-started.texy | 6 +++--- en/homepage.texy | 12 ++++++------ en/vulnerability-protection.texy | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/en/default-helpers.texy b/en/default-helpers.texy index 5f8c0079f7..2c020662a8 100644 --- a/en/default-helpers.texy +++ b/en/default-helpers.texy @@ -1,5 +1,5 @@ -Výchozí helpery šablon -********************** +Default Helpers +*************** .[perex] Helpers are functions which change or format the data to a form we want. This is summary of the default helpers which are normally available. @@ -13,7 +13,7 @@ All default helpers work with UTF-8 encoded strings. |--------------------------- | `truncate` `(length, append = '…') .[small]` | [shortens the length preserving whole words |#truncate] | `substr` `(offset [, length]) .[small]` | returns part of the string -| `trim` `(charset = mezery) .[small]` | strips whitespace or other characters from the beginning and end of the string +| `trim` `(charset = whitespace) .[small]` | strips whitespace or other characters from the beginning and end of the string | `striptags` | removes HTML tags | `strip` | [removes whitespace |#strip] | `webalize` `(charlist = '…', lower = TRUE) .[small]` | [returns string in cool URL form |#webalize] diff --git a/en/default-macros.texy b/en/default-macros.texy index 3032a3968f..9e8f0df391 100644 --- a/en/default-macros.texy +++ b/en/default-macros.texy @@ -1,4 +1,4 @@ -Default Latte macros +Default Latte Macros ************** .[perex] diff --git a/en/getting-started.texy b/en/getting-started.texy index 258a85c59b..b8f470a8f0 100644 --- a/en/getting-started.texy +++ b/en/getting-started.texy @@ -21,9 +21,9 @@ Why Nette Framework? -------------------- [* ecommercial.png .[noborder] >] -How's Nette Framework different from other frameworks? **Nette Framework is build to be the most useable and friendliest possible.** It's a framework which is not only easy to work with, but also a kind of fun. It gives you a comprehensible yet efficient syntax, offers a cutting edge debugger, lets you focus on the creative part of being a developer. Eliminates security hazards. With it you can create e-shops, wikis, blogs, CMS, and whatever you might possibly want to create. +How's Nette Framework different from other frameworks? **Nette Framework is build to be the most usable and friendliest possible.** It's a framework which is not only easy to work with, but also a kind of fun. It gives you a comprehensible yet efficient syntax, offers a cutting edge debugger, lets you focus on the creative part of being a developer. Eliminates security hazards. With it you can create e-shops, wikis, blogs, CMS, and whatever you might possibly want to create. -Nette Framework is [used by major companies |www:kdo-pouziva-nette-framework], such as T-Systems, GE Money, Mladá fronta, VLTAVA-LABE-PRESS, Internet Info, DHL, Logio, ESET, Actum, propels website of the president of the Czech republic Václav Klause. In the [poll |https://spreadsheets.google.com/viewanalytics?formkey=dEl1ZDJhbk1hWEFLbU43Skl0eDVDSnc6MQ#chart#4] held by Zdroják it was awarded The most popular and the most used framework in the Czech republic. +Nette Framework is [used by major companies |www:Who uses Nette Framework?], such as T-Systems, GE Money, Mladá fronta, VLTAVA-LABE-PRESS, Internet Info, DHL, Logio, ESET, Actum, propels website of the president of the Czech republic Václav Klause. In the [poll |https://spreadsheets.google.com/viewanalytics?formkey=dEl1ZDJhbk1hWEFLbU43Skl0eDVDSnc6MQ#chart#4] held by Zdroják it was awarded The most popular and the most used framework in the Czech republic. Learning Nette Framework will give you no shortage of interesting job offers. @@ -54,7 +54,7 @@ Want to get involved! --------------------- [* communication-80x80-r9-r1-c1-s1.png .[noborder] >] -We will be very glad if you contribute your share to the development. For starters, you may share a word, putting an [icon |www:graficke-podklady] on your web, or even [support the development |www:podporte-vyvoj] financially. Thank you ♥ +We will be very glad if you contribute your share to the development. For starters, you may share a word, putting an [icon |www:Logos and Graphics] on your web, or even [support the development |www:podporte-vyvoj] financially. Thank you ♥ You may as well share your knowledge: write an article, capture a screencast for [Planette |pla:homepage], or add an [extension |addons:homepage] of yours. Would be great if you'd like to join us [writing and translating documentation |writing]. You are the most welcome here. diff --git a/en/homepage.texy b/en/homepage.texy index b9e0b1ef0d..f189b39107 100644 --- a/en/homepage.texy +++ b/en/homepage.texy @@ -18,7 +18,7 @@ Here you can find a lot of sources which can help you to learn Nette Framework a ----------------------- - [Community Forum | http://forum.nette.org/en/] have a question? Ask on forum .[icon]{background-image:url(icon-forum.png)} -- [API references | http://api.nette.org/] overview of classes, methods and parameters +- [API Reference | http://api.nette.org/] overview of classes, methods and parameters - [Planette: Tutorials & Screencasts | pla:] - [Chat Room | http://www.speeqe.com/room/nette@conf.netlab.cz/] @@ -27,7 +27,7 @@ Here you can find a lot of sources which can help you to learn Nette Framework a ---------------- - [Features | www:hlavni-prednosti] -- [Vulnerability protection] +- [Vulnerability Protection] - [Troubleshooting] - [Glossary] - [Server Requirements | Requirements] @@ -52,7 +52,7 @@ Here you can find a lot of sources which can help you to learn Nette Framework a --------------------- - [Forms] -- [Templates | templating], [Latte macros | default macros] and [helpers | default helpers] +- [Templates | templating], [Latte Macros | default macros] and [Helpers | default helpers] - [MVC Application & Presenters | presenters] - [Micro-framework] - [Components and Controls | components] @@ -61,7 +61,7 @@ Here you can find a lot of sources which can help you to learn Nette Framework a - [Debugging and Error Handling | debugging] - [AJAX] - [Configuration | configuring] and [Dependency Injection] -- [PHP Language Enhancements] (Nette\Object, annotations & reflection) +- [PHP Language Enhancements]
    (`Nette\Object`, annotations & reflection) - [HTTP request & response] - [Database & ORM | database] - [Sessions] @@ -73,8 +73,8 @@ Here you can find a lot of sources which can help you to learn Nette Framework a - [Pagination] - [Auto-loading] - [Browsing files on disk | finder] -- [Atomic Operations‎ | atomicity] -- Utility for [strings], [arrays], [HTML elements], [URLs] +- [Atomic Operations | atomicity] +- Utilities for [strings], [arrays], [HTML elements] and [URLs] - Tools: [Code-Checker] diff --git a/en/vulnerability-protection.texy b/en/vulnerability-protection.texy index 6ee3799dfa..b3e967f9b4 100644 --- a/en/vulnerability-protection.texy +++ b/en/vulnerability-protection.texy @@ -1,4 +1,4 @@ -Vulnerability protection +Vulnerability Protection ************************ .[perex] From 5d9452b4b3cfc27d1ccc8ef38d10f86f95a5eb5c Mon Sep 17 00:00:00 2001 From: Bernard Williams Date: Mon, 22 Aug 2011 22:29:49 +0200 Subject: [PATCH 0152/1741] =?UTF-8?q?cs/routing:=20Chyb=C4=9Bla=20ukon?= =?UTF-8?q?=C4=8Dovac=C3=AD=20z=C3=A1vorka?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/routing.texy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cs/routing.texy b/cs/routing.texy index 0b32d9f786..c57ed4b20b 100644 --- a/cs/routing.texy +++ b/cs/routing.texy @@ -274,7 +274,7 @@ $route = new Route('//', array( ), 'action' => 'default', 'id' => NULL, -); +)); \-- @@ -295,7 +295,7 @@ $route = new Route('//', array( ), 'action' => 'default', 'id' => NULL, -); +)); \-- Kde `filterInFunc` a `filterOutFunc` jsou funkce či metody, jenž převádí mezi parametrem v URL a tvarem, který se předává do presenteru. Každá z nich zajišťuje převod opačným směrem. From 48ea07526688c059e87d70e9058bea4ee55d8042 Mon Sep 17 00:00:00 2001 From: duke Date: Wed, 24 Aug 2011 15:50:18 +0200 Subject: [PATCH 0153/1741] en/http-request-response: response, not request --- en/http-request-response.texy | 2 +- files/icon-communication.png | Bin 6671 -> 6791 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/en/http-request-response.texy b/en/http-request-response.texy index 4d0b56977b..25e88df318 100644 --- a/en/http-request-response.texy +++ b/en/http-request-response.texy @@ -138,7 +138,7 @@ $container->addService('httpRequest', $requestFactory->createHttpRequest()); HTTP response ============ -Actual HTTP request - instance of [api:Nette\Http\Response] - is available as `httpResponse` service in [system DI Container | configuring]: +Actual HTTP response - instance of [api:Nette\Http\Response] - is available as `httpResponse` service in [system DI Container | configuring]: /--php // $container is a system container diff --git a/files/icon-communication.png b/files/icon-communication.png index b023375c6b741a975cb1393f586c4e87003925c1..152c9b5131552ca7242b40a154fe3fadb6b02373 100644 GIT binary patch delta 4113 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 P00000NkvXXu0mjfZyeg? delta 3992 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 Date: Wed, 24 Aug 2011 18:50:41 +0200 Subject: [PATCH 0154/1741] en/finder: minor updates --- en/finder.texy | 11 +++++------ en/templating.texy | 16 ++++++++-------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/en/finder.texy b/en/finder.texy index 139fd61b9c..23fd49d1b8 100644 --- a/en/finder.texy +++ b/en/finder.texy @@ -5,7 +5,7 @@ File Search: Finder Class [api:Nette\Utils\Finder] makes browsing the directory structure really easy. -All examples assume created class alias: +All examples assume the following class alias is defined: /--php use Nette\Utils\Finder; @@ -15,7 +15,7 @@ use Nette\Utils\Finder; Searching for Files ------------------- -How to find all `*.txt` files in `$dir` directory omitting subdirectories? +How to find all `*.txt` files in `$dir` directory without recursing subdirectories? /--php foreach (Finder::findFiles('*.txt')->in($dir) as $key => $file) { @@ -101,14 +101,13 @@ Depth of search can be limited using the `limitDepth()` method. Searching for directories ---------------- -In addition to files, it is possible to search for directories using `Finder::findDirectories('subdir*')`, or to search for files and directories: `Finder::find('file.txt')`. -In that case, the mask applies to files, not directories. +In addition to files, it is possible to search for directories using `Finder::findDirectories('subdir*')`, or to search for files and directories: `Finder::find('file.txt')`. In such case, the mask applies only to files, not directories. Filtering ---------- -You can also filter results. For example, according to size. This way we will go through files with sizes between 100B and 200B: +You can also filter results. For example by size. This way we will traverse the files of size between 100B and 200B: /--php @@ -127,7 +126,7 @@ foreach (Finder::findFiles('*.php')->date('>', '- 2 weeks') } \-- -Here we go through PHP files with number of lines greater than 1000. As a filter we use a custom callback: +Here we traverse PHP files with number of lines greater than 1000. As a filter we use a custom callback: /--php $finder = Finder::findFiles('*.php')->filter(function($file) { diff --git a/en/templating.texy b/en/templating.texy index 3b6a0aac28..a5070d639f 100644 --- a/en/templating.texy +++ b/en/templating.texy @@ -68,7 +68,7 @@ With n:macros you can do much more interesting tricks as you will see in a momen The most important is that Latte **escapes variables by default**. [Escaping |glossary#toc-escaping] is needed when printing a variable because we have to convert all the characters which have a special meaning in HTML to other sequences. In case we forget it can lead to a serious security hole called [Cross Site Scripting (XSS) |vulnerability-protection#toc-cross-site-scripting-xss]. -Because of different escaping functions that are needed in different documents and different parts of a page, Latte features a unique technology of [#Context-Aware Escaping] which recognizes the part in which the macro is placed and **it chooses the right escaping mode.** You don't have to worry that your coder forgets about it causing you goose bumps because of a security hole. Which is great! +Because of different escaping functions that are needed in different documents and different parts of a page, Latte features a unique technology of [#Context-Aware Escaping] which recognizes the context in which the macro is placed and **chooses the right escaping mode.** You don't have to worry that your coder forgets about it causing you goose bumps because of a security hole. Which is great! .[note] If the `$item` variable stores an HTML code and you want to print it without any alternation you just put the exclamation mark right after the opening brace: `{!$item}`. Forgetting the exclamation mark will not cause any security flaws by following „less code, more security“ principle. @@ -109,7 +109,7 @@ Prints:

    Nette Framework

    \-- -By using `inner-` prefix we can alter the behavior so that the macro applies to the body of the element: +By using `inner-` prefix we can alter the behavior so that the macro applies only to the body of the element: /--html
    @@ -177,7 +177,7 @@ See the summary of [standard helpers | default helpers] and how to [make user-de Performance -------- -Latte is fast. It compiles the templates to native PHP code and stores them in cache on the disk. So they are as fast as they would have been written in pure PHP. +Latte is fast. It compiles the templates to native PHP code and stores them in cache on the disk. So they are as fast as if they would have been written in pure PHP. The template is automatically recompiled each time we change the source file. While developing you just need to edit the templates in Latte and changes are visible in your browser instantly. @@ -194,7 +194,7 @@ If you are using an IDE with code stepping you can go through the generated PHP Usability ------------ -Latte syntax wasn't invented by engineers but came up from webdesigner's practical requests. We were looking for the friendliest syntax you can write the most problematic constructions comfortably with. You will be surprised how much Latte can be handful. +Latte syntax wasn't invented by engineers but came up from webdesigner's practical requests. We were looking for the friendliest syntax with which you can write even the most problematic constructions comfortably enough. You will be surprised how much of help Latte can be. You can find macros for advanced [layout |default-macros#toc-template-extending] managing, for **template inheritance**, nested blocks and so on. Syntax comes from PHP itself so you don't have to learn anything new and you can leverage your know-how. @@ -207,7 +207,7 @@ Although the [Cross Site Scripting (XSS) |vulnerability-protection#toc-cross-sit If the coder omits the escaping a security hole is made. That's why template engines implement automated escaping. The problem is that the web page has different contexts and each has different rules for escaping printed data. A security hole then shows up if the wrong escaping functions are used. -But Latte is sophisticated. It features unique technology of *Context-Aware Escaping* which recognizes the part in which the macro is placed and it chooses the right escaping mode. What does that mean? +But Latte is sophisticated. It features unique technology of *Context-Aware Escaping* which recognizes the context in which the macro is placed and chooses the right escaping mode. What does that mean? Latte doesn't need any manual work. **All is done automatically, consistently and correctly.** You don't have to worry about security holes. @@ -242,7 +242,7 @@ Sticklers will enjoy the look of the HTML output which Latte generates. All tags User-defined macros ------------- -Latte provides API for making your own macros. It isn't very difficult. Macros are added in sets (a set can consist of a single macro). +Latte provides API for making your own macros. It isn't difficult at all. Macros are added in sets (a set can consist of a single macro). /--php $latte = new Nette\Latte\Engine; @@ -258,7 +258,7 @@ $set->addMacro( ); \-- -If we omit the last parameter of `addMacro()` method we denote the macro is not paired. +If we omit the last parameter of `addMacro()` method, we denote the macro is not paired. PHP code in the second and third parameter can contain tags: @@ -355,7 +355,7 @@ $template->lastName = 'Doe'; $template->render(); // renders the template \-- -We need to register the helpers if we want to use them in the template. [Default helpers |default helpers] are register like this: +We need to register the helpers if we want to use them in the template. [Default helpers |default helpers] are registered like this: /--php $template->registerHelperLoader('Nette\Templating\DefaultHelpers::loader'); From 3e5a74e7850196c6d8077cfa6dc00641f8db3a7d Mon Sep 17 00:00:00 2001 From: smasty Date: Thu, 25 Aug 2011 14:40:57 +0200 Subject: [PATCH 0155/1741] en/caching: created --- en/caching.texy | 296 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 296 insertions(+) create mode 100644 en/caching.texy diff --git a/en/caching.texy b/en/caching.texy new file mode 100644 index 0000000000..0fe7cd18ef --- /dev/null +++ b/en/caching.texy @@ -0,0 +1,296 @@ +Caching +******* + +/--div .[perex] +Cache accelerates your application by storing data - once hardly retrieved - for future use. We will show you: + +- How to use the cache +- How to change the cache storage +- How to properly invalidate the cache +\-- + +Nette Framework offers a very intuitive API for cache manipulation. After all, you wouldn't expect anything else, right? ;-) +Before we show you the first example, we need to think about place where to store data physically. We can use a database, //Memcached// server, +or the most available storage - hard drive: + +/--php +// the `temp` directory will be the storage +$storage = new Nette\Caching\Storages\FileStorage('temp'); +\-- + +The [api:Nette\Caching\Storages\FileStorage] storage is very well optimized for performance and in the first place, +it provides full [atomicity of operations|atomicity]. What does that mean? When we use cache we can be sure we are not reading a file that is not fully +written yet (by another thread) or that the file gets deleted "under our hands". Using the cache is therefore completely safe. + +For manipulation with cache, we use the [api:Nette\Caching\Cache]: + +/--php +use Nette\Caching\Cache; + +$cache = new Cache($storage); // $storage from the previous example +\-- + +Let's save the contents of the '`$data`' variable under the '`$key`' key: + +/--php +$cache->save($key, $data); +\-- + +This way, we can read from the cache: (if there is no such item in the cache, the `NULL` value is returned) + +/--php +$value = $cache->load($key); +if ($value === NULL) ... +\-- + +So we delete the item from the cache by saving `NULL`: + +/--php +$cache->save($key, NULL); +\-- + +.[note] +It's possible to save any structure to the cache, not only strings. The same applies for keys. + + +Web applications typically consist of a number of independent parts, and if they all cache data in the same storage (for example the same directory), +sooner or later there would be collisions in names. Nette Framework solves this by splitting the whole storage to sections +(in the `FileStorage` case using subdirectories). Each part of the application uses it's own section with unique name, therefore no collision can occur. +The name of the section can be passed as the second parameter to the `Cache` class constructor. (These sections are often refered to as //cache namespaces//.) + +/--php +$cache = new Cache($storage, 'htmlOutput'); +\-- + + +The cacheStorage Service +------------------------ + +We can use the [system DI container | configuring] so we do not have to create or pass the `$storage` object everywhere, +because the container provides a `cacheStorage` service that defaults to the `FileStorage` saving data to the directory specified by the `tempDir` parameter, +or the `TEMP_DIR` constant. + +/--php +// $container is the system DI container +$cache = new Cache($container->cacheStorage, 'htmlOutput'); +$cache->save($key, $data); +\-- + + +Caching in Templates +-------------------- + +Caching in templates is very easy, just wrap the part of the template with the `{cache} ... {/cache}`. The cache is automatically invalidated +when the source template is changed, including any templates included inside the `cache` macro. {cache} blocks can be nested, and when a nested block gets +invalidated (for example by a tag), the parent block is also invalidated. + +It's possible to define keys to which the cache will be binded (in this case, the `$id` variable) and set the expiration and +[tags for invalidation | #expiration-using-tags-and-priority]. + +/--html +{cache $id, expire => '+20 minutes', tags => [tag1, tag2]} + ... +{/cache} +\-- + +All parameters are option, so you do not have to specify expiration, tags or keys. + +The use of a cache can also use '`if`' condition - the contents will be cached only when the condition is met: + +/--html +{cache $id, if => !$form->isSubmitted()} + {$form} +{/cache} +\-- + +If we only retrieve the data from our //model// in the template (//on demand// principle, or //lazy//), the cache will be particularly effective. + + + +Caching Function Results +------------------------- + +Caching the result of a function or method call can be achieved using the `call()` method: + +/--php +$name = $cache->call('gethostbyaddr', $ip); +\-- + +The `gethostbyaddr($ip)` will therefore be called only once and next time, only the value from cache will be returned. Of course, for different `$ip`, +different results are cached. + +Output Caching +------------------ + +The output can be cached not only in templates: + +/--php +if ($block = $cache->start($key)) [ + + ... printing some data ... + + $block->end(); // save the output to the cache +} +\-- + +In case that the output is already present in the cache, the `start()` method prints it and return `NULL`. Otherwise, it starts to buffer the output and +returns the `$block` object using which we finally save the data to the cache. + + +Expiration and Invalidation +--------------------------- +Here come two problems of storing data in the cache. First, there is a possibility that the storage is completely filled and you cannot save more data inside. +And it may happen that some od the previously saved data will become invalid over time. Therefore, Nette Framework provides a mechanism, +how to limit the validity of data and how to delete them in a controlled way ("to invalidate them", using the framework's terminology). + +Data validity is set when saving the data using the third parameter of the `save()` method: + +/--php +$cache->save($key, $data, array( + Cache::EXPIRE => '+ 20 minutes', // accepts also seconds or a timestamp. +)); +\-- + +It's obvious from the code itself, that we saved the data for next 20 minutes. After this period, the cache will report that there is no record +under the '`$key`' key (ie, will return `NULL`). In fact, you can use any time value that is a valid value for PHP function [strToTime()|php:strtotime] or +the [DateTime|php:DateTime.construct] class. If we want to extend the validity period with each reading, it can be achieved this way: + +/--php +$cache->save($key, $data, array( + Cache::EXPIRE => '+ 20 minutes', + Cache::SLIDING => TRUE, +)); +\-- + +Very handy is also the ability to let the data expire when a particular file is changed or one of several files. +That can be used for stroring data resulting from parsing these files to the cache. For trouble-free functionality, it's recommended to use absolute paths. + +/--php +$cache->save($key, $data, array( + Cache::FILES => 'data.yaml', // an array of files can also be specified +)); +\-- + +The `Cache::FILES` criteria, of course, can be combined with the time expiration using `Cache::EXPIRE` etc. + +The cache can also depend on other cached items. That can be used when we save the whole HTML page in the cache and under different keys, some of its fragments. +As soon as a part changes, the whole page is invalidated. + +/--php +$cache->save('page', $html, array( + // will expire if frag1 or frag2 expires + Cache::ITEMS => array('frag1', 'frag2'), +)); +\-- + +Expiration can be controlled even by your own callbacks: + +/--php +function controlExpiration($val) +{ + return $val; +} + +$cache->save($key, $value, array( + Cache::CALLBACKS => array(array('controlExpiration', 1)), +)); +\-- + + +Expiration Using Tags and Priority +---------------------------------- + +Very useful invalidation tool are so called //tags//. We can assign a list of tags to each item. For example, suppose we have an HTML page with an article and +comments, which we want to cache. So we specify tags when saving to cache: + +/--php +$cache->save($articleId, $html, array( + Cache::TAGS => array("article/$articleId", "comments/$articleId"), +)); +\-- + +Now, let's move to the administration. Here we have a form for article editing. Together with saving the article to a database, we call the `clean()` command, +which will delete cached items by tag: + +/--php +$cache->clean(array( + Cache::TAGS => array("article/$articleId"), +)); +\-- + +And in the place for adding new comments (or editing them), don't forget to invalidate appropriate tag: + +/--php +$cache->clean(array( + Cache::TAGS => array("comments/$articleId"), +)); +\-- + +What we have achieved? That the HTML cache will invalidate automatically. Whenever someone changes the article with ID of 10, it will force the `article/10` +tag to invalidate and the tagged HTML page in cache is cleared. The same will happen when someone inserts a new comment below the article. + +Similar to tags, you can control expiration by priority: + +/--php +$cache->save($key, $value, array( + Cache::PRIORITY => 50, +)); + +// all cached items with priority less than or equal to 100 will be removed. +$cache->clean(array( + Cache::PRIORITY => 100, +)); +\-- + + + +Cache Storage +-------- +In addition to already mentioned `FileStorage`, Nette Framework also provides [MemcachedStorage|api:Nette\Caching\Storages\MemcachedStorage] which stores +data to the `Memcached` server, and also [MemoryStorage|api:Nette\Caching\Storages\MemoryStorage] for storing data in memory for the time of the request. +The special `DevNullStorage`, which does precisely nothing, can be used for testing, when we want to eliminate the influence of caching. + +Of course, it's possible to create your own storage. The only requirement is to implement the [IStorage|api:Nette\Caching\IStorage] interface. + + +@serializationVersion +--------------------- + +The cache can also store objects. But what if you change the look of the class and somewhere in the cache is the serialized its old look? +That could lead to creating incorrect object. How to avoid this? You just need to specify the `@serializationVersion` annotation for the class +containing some kind of "version" of the class: + +/--php +/** + * @serializationVersion 123 + */ +class Data +{ + ... +} +\-- + +When you save an object to the cache, Nette Framework remembers the value of this annotation. When the data look of the class changes, all you need +to do is to change the verson number in the annotation and Nette will automatically delete old cached objects. + + +Concurrent Caching +------------------ + +Deleting the cache is a common operation when uploading a new application version to the server. At that moment, however, the server gets pretty hard time, +because it has to build a complete new cache. Retrieving some data can be quite difficult, for example the [RobotLoader|auto-loading] cache building. +And moreover, if, say, 30 requests come in a short period, the resource consumption is even higher. + +The solution is to modify application behaviour so that data are created only by one thread and others are waiting. To do this, specify the value as a callback +or use an anonymous function: + +/--php +$result = $cache->save($key, function() { // or callback(...) + return buildData(); // difficult operation +}); +\-- + +Framework will ensure that the body of the function will be called only by one thread at once, and other threads will be waiting. +If the thread fails for some reason, another gets chance. + +{{toc: title}} From 598e8e7d3ad0ec7daf29134004c1a0ea5a90aeca Mon Sep 17 00:00:00 2001 From: _Martin_ Date: Fri, 26 Aug 2011 15:36:17 +0200 Subject: [PATCH 0156/1741] =?UTF-8?q?cs/presenters:=20Korektura=20(standar?= =?UTF-8?q?dn=C4=9B=20se=20vytv=C3=A1=C5=99=C3=AD=20relativn=C3=AD=20odkaz?= =?UTF-8?q?y,=20ne=20absolutn=C3=AD).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/presenters.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/presenters.texy b/cs/presenters.texy index 8d24c09413..8d4c342edb 100644 --- a/cs/presenters.texy +++ b/cs/presenters.texy @@ -311,7 +311,7 @@ Odkazy mohou také směřovat do jiných [modulů |#moduly]. Zde se rozlišuje, Speciálním případem je odkaz na sebe sama, kdy jako cíl uvedeme `this`. -Vygenerovaný odkaz má podobu absolutní cesty, pokud chceme vygenerovat absolutní odkaz včetně domény např. `http://example.com`, přidáme na začátek dvě lomítka `n:href="//show $productId"`. +Vygenerovaný odkaz má podobu relativní cesty, pokud chceme vygenerovat absolutní odkaz včetně domény např. `http://example.com`, přidáme na začátek dvě lomítka `n:href="//show $productId"`. Odkazovat můžeme na určitou část na stránce přes tzv. fragment za znakem křížky `#`: From 2132c5f9476e97b88da7173b70985f5f85637d92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Tvrd=C3=ADk?= Date: Fri, 26 Aug 2011 19:54:58 +0200 Subject: [PATCH 0157/1741] cs/presenters: micro fix --- cs/presenters.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/presenters.texy b/cs/presenters.texy index 8d4c342edb..e3a7e89b83 100644 --- a/cs/presenters.texy +++ b/cs/presenters.texy @@ -250,7 +250,7 @@ U složitějších aplikací, které presentery rozčleňují do modulů, funguj /--php namespace FrontModule; -class ProductPresenter extends Nette\Application\UI\Presenter +class ProductPresenter extends \Nette\Application\UI\Presenter { ... \-- From 5e1eea2f02afd43f828e8fed2e69dcbe091698a5 Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Sat, 27 Aug 2011 16:59:23 +0200 Subject: [PATCH 0158/1741] =?UTF-8?q?cs/database:=20p=C5=99eklad=20ref()?= =?UTF-8?q?=20a=20related()=20do=20=C4=8De=C5=A1tiny=20+=20p=C5=99=C3=ADkl?= =?UTF-8?q?ady?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/database.texy | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cs/database.texy b/cs/database.texy index 863aa484b8..202d99ddf7 100644 --- a/cs/database.texy +++ b/cs/database.texy @@ -145,11 +145,11 @@ Získávání dat: Práce s jedním řádkem: .[wide] -| `$data = $row[$column]` nebo `$row->$column` | Get data from column $column or from referenced table -| `$referencedRow = $row->ref($tableName)` | Get row from referenced table -| `$referencingTable = $row->related($tableName)` | Get result from referencing table -| `$referencingTable = $row->related($tableName)->through($column)` | Use non-default column (e.g. created_by) -| `(string) $row` | Get primary key value +| `$data = $row[$column]` nebo `$row->$column` | Vrátí hodnotu atributu $column nebo jednu řádku z tabulky rodiče. Např. `$book['title'] == $book->title` nebo `$book['author'] == $book->author == $book->ref('author')` +| `$rodic = $dite->ref($tableName)` | Vrátí jednu řádku z cizí tabulky (rodič). Např. `$book->ref('author')->name` +| `$tabulkaDeti = $rodic->related($tableName)` | Vrátí tabulku dětí již odfiltrovanou hodnotou primárního klíče rodiče. Použije se atribut tabulky dětí odvozený od názvu tabulky rodiče. Např. `$author->related('book')->count()` +| `$tabulkaDeti = $rodic->related($tableName) ->through($column)` | Použije konkrétní atribut tabulky dětí pro filtrování. Např. `$author->related('book') ->through('maintainer_id')->count()` +| `(string) $row` | Vrátí hodnotu primárního klíče From 361b05d9f50b6e898048744e4c9566e5ab2e3080 Mon Sep 17 00:00:00 2001 From: duke Date: Sat, 27 Aug 2011 20:26:11 +0200 Subject: [PATCH 0159/1741] en/atomicity: better translation --- en/atomicity.texy | 2 +- en/strings.texy | 38 +++++++++++++++++++------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/en/atomicity.texy b/en/atomicity.texy index b918066c2b..28f4424dd6 100644 --- a/en/atomicity.texy +++ b/en/atomicity.texy @@ -35,7 +35,7 @@ load Nette Framework. After that, you just need prefix the filename with `safe:/ /--php $handle = fopen('safe://test.txt', 'x'); // prefix the filename with safe:// -fwrite($handle, 'Nette Framework'); // meanwhile, data is written into a temporary file +fwrite($handle, 'Nette Framework'); // for now, the data is written into a temporary file fclose($handle); // and only now the file is renamed to test.txt \-- diff --git a/en/strings.texy b/en/strings.texy index 2aeaaafb01..e0e56f96b7 100644 --- a/en/strings.texy +++ b/en/strings.texy @@ -14,7 +14,7 @@ use Nette\Utils\Strings; lower($s) --------- -Converts all characters of UTF-8 encoding string to lower case. +Converts all characters of UTF-8 string to lower case. /--php echo Strings::lower('Hello world'); // hello world @@ -24,7 +24,7 @@ echo Strings::lower('Hello world'); // hello world upper($s) --------- -Converts all characters of UTF-8 encoding string to upper case. +Converts all characters of a UTF-8 string to upper case. /--php echo Strings::upper('Hello world'); // HELLO WORLD @@ -34,7 +34,7 @@ echo Strings::upper('Hello world'); // HELLO WORLD firstUpper($s) -------------- -Converts the first character of UTF-8 encoding string to upper case and leaves the other characters unchanged. +Converts the first character of a UTF-8 string to upper case and leaves the other characters unchanged. /--php echo Strings::firstUpper('hello world'); // Hello world @@ -44,7 +44,7 @@ echo Strings::firstUpper('hello world'); // Hello world capitalize($s) -------------- -Converts the first character of every word of UTF-8 encoding string to upper case and the others to lower case. +Converts the first character of every word of a UTF-8 string to upper case and the others to lower case. /--php echo Strings::capitalize('Hello world'); // Hello World @@ -60,13 +60,13 @@ Removes right-side spaces, control sequences and unifies line endings to `\n`. webalize($s, $charlist=NULL, $lower=TRUE) .{toc: webalize()} ------------------------------------------------------------ -Adjusts the string for usage in URL, i.e. removes all accents and replaces all remaining characters except English alphabet letters and numerals with hyphens. +Adjusts a UTF-8 string for usage in URL, i.e. removes all accents and replaces all remaining characters except English alphabet letters and numerals with hyphens. /--php echo Strings::webalize('žluťoučký kůň'); // zlutoucky-kun \-- -Other characters may be preserved as well, but they must be passed as a second argument. +Other characters may be preserved as well, but they must be passed as second argument. /--php echo Strings::webalize('10. image_id', '._'); // 10.-image_id @@ -82,7 +82,7 @@ echo Strings::webalize('Hello world', NULL, FALSE); // Hello-world toAscii($s) ----------- -Removes accents from UTF-8 encoded string. +Removes accents from a UTF-8 string. /--php echo Strings::toAscii('žluťoučký kůň'); // zlutoucky kun @@ -92,7 +92,7 @@ echo Strings::toAscii('žluťoučký kůň'); // zlutoucky kun trim($s, $charlist=NULL) .{toc: trim()} ---------------------------------------- -Removes all left and right side spaces (or the characters passed as second argument) from an UTF-8 encoded string. +Removes all left and right side spaces (or the characters passed as second argument) from a UTF-8 encoded string. /--php echo Strings::trim(' Hello '); // 'Hello' @@ -102,7 +102,7 @@ echo Strings::trim(' Hello '); // 'Hello' truncate($s, $maxLen, $append=`'…'`) .{toc: truncate()} --------------------------------------------------------- -Truncates UTF-8 encoded string to given maximal length, while trying not to split whole words. Only if the string is truncated, an ellipsis (or something else set with third argument) is appended to the string. +Truncates a UTF-8 string to given maximal length, while trying not to split whole words. Only if the string is truncated, an ellipsis (or something else set with third argument) is appended to the string. /--php $text = 'Hello, how are you today?'; @@ -128,7 +128,7 @@ echo Strings::indent('Nette', 2, '+'); // '++Nette' padLeft($s, $length, $pad=`' '`) .{toc: padLeft()} -------------------------------------------------- -Pads UTF-8 encoded string to given length by prepending `$pad` string to the beginning. +Pads a UTF-8 string to given length by prepending the `$pad` string to the beginning. /--php echo Strings::padLeft('Nette', 6); // ' Nette' @@ -140,7 +140,7 @@ echo Strings::padLeft(' Nette', 11, 'WOW'); // 'WOWWO Nette' padRight($s, $length, $pad=`' '`) .{toc: padRight()} --------------------------------------------------- -Pads UTF-8 encoded string to given length by prepending `$pad` string to the end. +Pads UTF-8 string to given length by appending the `$pad` string to the end. /--php echo Strings::padRight('Nette', 6); // 'Nette ' @@ -152,7 +152,7 @@ echo Strings::padRight('Nette is ', 16, 'great'); // 'Nette is greatgr' fixEncoding($s, $encoding=`'UTF-8'`) .{toc: fixEncoding()} ------------------------------------------------------ -Removes all invalid characters for given character set. +Removes all invalid characters for given character set from a string. /--php $correctStrings = Strings::fixEncoding($string); @@ -162,7 +162,7 @@ $correctStrings = Strings::fixEncoding($string); *bool* checkEncoding($s, $encoding=`'UTF-8'`) .{toc: checkEncoding()} ----------------------------------------------------------------- -Checks whether a string is in valid encoding. +Checks whether a string is valid for given encoding. /--php $isUtf8 = Strings::checkEncoding($string); @@ -172,7 +172,7 @@ $isUtf8 = Strings::checkEncoding($string); *int* length($s) ---------- -Returns a length of UTF-8 encoded string. +Returns a length of a UTF-8 string. /--php echo Strings::length('Nette'); // '5' @@ -206,7 +206,7 @@ Strings::endsWith($haystack, $needle); // TRUE *bool* compare($left, $right, $len=NULL) .{toc: compare()} --------------------------------------------------------- -Compares two UTF-8 encoded strings or their parts, without taking character case into account. If `$len` is greater then zero, the respective amount of characters in the beginning of a string is compared, if it's negative, the characters the strings' ends are compared. Unset `$len` or equal to zero compares whole strings. +Compares two UTF-8 strings or their parts, without taking character case into account. If `$len` is greater then zero, the respective amount of characters from the beginning of strings is compared, if it's negative, the respective amount of characters from the end is compared, if it's equal to zero, whole strings are compared. /--php echo Strings::compare('Nette', 'nette'); // TRUE @@ -218,7 +218,7 @@ echo Strings::compare('Nette', 'Latte', -2); // TRUE - two last characters match chr($code, $encoding=`'UTF-8'`) .{toc: chr()} ----------------------------------------- -Generates a character from given Unicode code and returns it in requested character set. +Generates a character from given Unicode code and returns it in requested encoding. /--php echo Strings::chr(0xA9); // creates '©' (copyright) in UTF-8 @@ -229,7 +229,7 @@ echo Strings::chr(0x2026, 'CP1250'); // elipsis in CP1250 random($length=10, $charlist=`'0-9a-z'`) .{toc: random()} --------------------------------------------------------- -Generates a random string of given length from characters passed in with second argument. Supports intervals, such as `0-9` or `A-Z`. +Generates a random string of given length from characters specified in second argument. Supports intervals, such as `0-9` or `A-Z`. /--php echo Strings::random(); // '6zq3a1nl8n' @@ -241,12 +241,12 @@ echo Strings::random(5, 'A-Z'); // 'HLKUR' Regular expressions ------------------- -*Strings* class contains a few methods for working with regular expressions. Unlike native php functions, it provides readable API and throws `Nette\RegexpException` if any regex compilation error is found. +*Strings* class contains a few methods for working with regular expressions. Unlike native php functions, it provides readable API and throws `Nette\RegexpException` if any regexp error occurs. *array* split($subject, $pattern, $flags=NULL) .{toc: split()} -------------------------------------------------------------- -Splits string into array by the regular expression. Argument `$flag` takes same arguments as [php:preg_split], but `PREG_SPLIT_DELIM_CAPTURE` is set by default. +Splits a string into array by the regular expression. Argument `$flag` takes same arguments as [php:preg_split], but `PREG_SPLIT_DELIM_CAPTURE` is set by default. /--php $res = Strings::split('One, two,three', '~,\s*~'); From bd1092654ba100ac49efb9a3644a433f9e192a16 Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Sat, 27 Aug 2011 22:37:18 +0200 Subject: [PATCH 0160/1741] =?UTF-8?q?cs/homepage:=20p=C5=99idal=20jsem=20s?= =?UTF-8?q?lovo=20=20lad=C4=9Bn=C3=AD=20,=20aby=20bylo=20na=20t=C3=A9to=20?= =?UTF-8?q?str=C3=A1ce=20dohledateln=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/homepage.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/homepage.texy b/cs/homepage.texy index bb3a76133e..0d4a47d5d3 100644 --- a/cs/homepage.texy +++ b/cs/homepage.texy @@ -62,7 +62,7 @@ Zde najdete celou řadu zdrojů, které vám pomohou naučit se Nette Framework - [Komponenty a ovládací prvky | components] - [Routování URL | routing] - [Přihlašování & oprávnění uživatelů | security] -- [Debugování a zpracování chyb | debugging] +- [Debugování a zpracování chyb | debugging] (ladění) - [AJAX] - [Konfigurace prostředí | configuring] a [Dependency Injection] - [Rozšíření PHP | PHP Language Enhancements] (Nette\Object, anotace, reflexe) From 239dd09bf8f31b29d84cc2ee0b92096161b1b37a Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Sun, 28 Aug 2011 18:51:02 +0200 Subject: [PATCH 0161/1741] =?UTF-8?q?cs/writing:=20odkazy=20na=20Stav=20p?= =?UTF-8?q?=C5=99ekladu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/writing.texy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cs/writing.texy b/cs/writing.texy index 8160cded0c..41f3fabb87 100644 --- a/cs/writing.texy +++ b/cs/writing.texy @@ -27,6 +27,7 @@ Cení se schopnost věc vysvětlit. Než začnete psát, pokuste se téma vysvě 9) Perex je stručnou upoutávkou k tématu, nepleťte si ho s prvním odstavcem 10) Kód se snažte formátovat tak, aby se nezobrazovaly posuvníky 11) Zdrojová podoba stránky by měla být přehledná, nešetřete volnými řádky mezi odstavci, titulky, kódem apod. +12) Když jste hotovi, zavítejte na "Stav překladu dokumentace":[http://dev.nette.org/cs/stav-prekladu] a případně změňte stav `Přeložený` na `Přeložený - neaktuální`. Jak vytvořit překlad? @@ -36,5 +37,6 @@ Jak vytvořit překlad? Překlad by měl používat jednoduchou slovní zásobu, protože je určen nejen pro rodilé mluvčí, ale pro kohokoliv. +Než se pustíte do díla, zapište se na "Stavu překladu dokumentace":[http://dev.nette.org/cs/stav-prekladu], ať se s někým omylem nepřekrýváte nebo ať zbytečně nepřekládáte, co ještě nemá finální podobu. {{themeicon: icon-art-and-painting.png}} From 6956132c50e03db8e98f7c1d6eaff5801fa1a8a2 Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Sun, 28 Aug 2011 19:12:08 +0200 Subject: [PATCH 0162/1741] =?UTF-8?q?cs/ajax:=20JsonResponse=20pro=20absol?= =?UTF-8?q?utn=C3=AD=20kontrolu=20nad=20odeslan=C3=BDm=20JSONem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/ajax.texy | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cs/ajax.texy b/cs/ajax.texy index 36b5a44678..4f299cf0a4 100644 --- a/cs/ajax.texy +++ b/cs/ajax.texy @@ -25,6 +25,12 @@ Pro odesílání dat prohlížeči ve formátu JSON lze využít předpřipraven } \-- +Pokud potřebujete plnou kontrolu nad odeslaným JSONem, použijte v presenteru JsonResponse. Tím ihned ukončíte činnost presenteru a obejdete se i bez šablony: + +/--php + $this->sendResponse(new JsonResponse(array('klic' => 'hodnota', ...))); +\-- + Když chceme odeslat HTML, můžeme jednak zvolit speciální šablonu pro AJAX: /--php From a4b56209f729e127792a0fb24e1cffcae3ea7208 Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Sun, 28 Aug 2011 19:18:06 +0200 Subject: [PATCH 0163/1741] en/ajax: JsonResponse + small corrections --- en/ajax.texy | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/en/ajax.texy b/en/ajax.texy index 381a8cbe26..60b0883df8 100644 --- a/en/ajax.texy +++ b/en/ajax.texy @@ -2,10 +2,10 @@ AJAX & snippets *************** /--div .[perex] -Modern web applications nowadays run half on a server and half in a browser. AJAX is the vital unifying factor. What support does Nette Framework offer? -- sending fragments of a template (so called *snippets*) +Modern web applications nowadays run half on a server and half in a browser. AJAX is the vital uniting factor. What support does Nette Framework offer? +- sending template fragments (so called *snippets*) - passing variables between PHP and JavaScript -- debugging of AJAX applications +- AJAX applications debugging \-- An AJAX request can be detected using a method of a service [encapsulating a HTTP request | http-request-response#http-request] `$httpRequest->isAjax()` (detects based on the `X-Requested-With` HTTP header). There is also a shorthand method in presenter: `$this->isAjax()`. An AJAX request is no different from a normal one – a presenter is called with a certain view and parameters. It is, too, up to the presenter how will it react: it can use its routines to either return a fragment of HTML code (a snippet), an XML document, a JSON object or a piece of Javascript code. @@ -19,6 +19,13 @@ There is a pre-processed object called `payload` dedicated to sending data to th ... } \-- + +For a full control over your JSON output use JsonResponse in your presenter. It terminates presenter immediately and you'll do without a template: + +/--php + $this->sendResponse(new JsonResponse(array('key' => 'value', ...))); +\-- + If we want to send HTML, we can either set a special template for AJAX requests: /--php From c05520ab7a512ecefad20b0842d6ed2fe22681d9 Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Sun, 28 Aug 2011 19:27:51 +0200 Subject: [PATCH 0164/1741] =?UTF-8?q?cs/dependency-injection:=20opraven?= =?UTF-8?q?=C3=AD=20odkazu=20do=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/dependency-injection.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/dependency-injection.texy b/cs/dependency-injection.texy index 0c45502806..2778622b17 100644 --- a/cs/dependency-injection.texy +++ b/cs/dependency-injection.texy @@ -370,7 +370,7 @@ Kontejner je také možné klonovat. Klon obsahuje všechny služby jako vzor a Auto-wiring ----------- -Autowire je pokročilejší technika, umožňující při vytváření služby automaticky předávat do konstruktoru další služby dle typu. Její implementace není přímo součástí frameworku, napíšeme si proto vlastní [Nette\DI\ServiceBuilder]. Jde o speciální továrnu na služby, kterou můžeme předat metodě `addService`: +Autowire je pokročilejší technika, umožňující při vytváření služby automaticky předávat do konstruktoru další služby dle typu. Její implementace není přímo součástí frameworku, napíšeme si proto vlastní [api:Nette\DI\ServiceBuilder]. Jde o speciální továrnu na služby, kterou můžeme předat metodě `addService`: /--php $container->addService('article', new AutowireServiceBuilder('Article')); From b0c66d4054b88a2efa6f1c5d3d1035486c8ab4d4 Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Sun, 28 Aug 2011 23:03:23 +0200 Subject: [PATCH 0165/1741] =?UTF-8?q?cs/forms:=20definov=C3=A1n=C3=AD=20fo?= =?UTF-8?q?rmul=C3=A1=C5=99e=20v=20samostatn=C3=A9=20t=C5=99=C3=ADd=C4=9B?= =?UTF-8?q?=20kv=C5=AFli=20pou=C5=BEit=C3=AD=20na=20v=C3=ADc=20m=C3=ADstec?= =?UTF-8?q?h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/forms.texy | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/cs/forms.texy b/cs/forms.texy index 82ba8c3ff1..2b56be2565 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -465,6 +465,36 @@ Když se formulář odešle tlačítkem *enter*, za odesílací tlačítko se po Handlery událostí `onSuccess` a `onClick` se volají **pouze v případě, že je odeslání validní**. Uvnitř obslužných metod tedy nemusíme validitu ověřovat. Formulář má ještě událost `onSubmit`, která se volá vždy nezávisle na validitě. +Pokud potřebujete jeden formulář použít ve více presenterech, máte dvě možnosti: +1) vložit do hierarchie presenterů jejich společného předka a továrničku definovat tam +2) nebo definovat formulář v samostatné třídě a v jednotlivých továrničkách ji pouze instanciovat. + +Vhodné umístění pro takovou třídu je apps/forms/SignInForm.php +/--php +use Nette\Application\AppForm, \Nette\Forms\Form; + +class SignInForm extends AppForm { + + public function __construct(Nette\IComponentContainer $parent = NULL, $name = NULL) { + parent::__construct($parent, $name); + + $this->addText('name', 'Jméno:'); + // ... + $this->addSubmit('login', 'Přihlásit se'); + } +} +\-- + +V továrničce presenteru ji pak použijeme takto: +/--php + protected function createComponentSignInForm($name) { + $form = new SignInForm($this, $name); + $form['login']->onClick[] = callback($this, 'signInFormSubmitted'); + + return $form; + } +\-- + From d6e7857464b0163a28da89beef351b67e74bc7e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Tvrd=C3=ADk?= Date: Mon, 29 Aug 2011 00:31:12 +0200 Subject: [PATCH 0166/1741] cs/forms: opravy, typo --- cs/forms.texy | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/cs/forms.texy b/cs/forms.texy index 2b56be2565..1b751d28d1 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -465,19 +465,24 @@ Když se formulář odešle tlačítkem *enter*, za odesílací tlačítko se po Handlery událostí `onSuccess` a `onClick` se volají **pouze v případě, že je odeslání validní**. Uvnitř obslužných metod tedy nemusíme validitu ověřovat. Formulář má ještě událost `onSubmit`, která se volá vždy nezávisle na validitě. + +Použití stejného formuláře ve více presenterech +----------------------------------------------- + Pokud potřebujete jeden formulář použít ve více presenterech, máte dvě možnosti: 1) vložit do hierarchie presenterů jejich společného předka a továrničku definovat tam 2) nebo definovat formulář v samostatné třídě a v jednotlivých továrničkách ji pouze instanciovat. -Vhodné umístění pro takovou třídu je apps/forms/SignInForm.php +Vhodné umístění pro takovou třídu je `app/forms/SignInForm.php` /--php -use Nette\Application\AppForm, \Nette\Forms\Form; +use Nette\Application\UI, + Nette\ComponentModel\IContainer; -class SignInForm extends AppForm { - - public function __construct(Nette\IComponentContainer $parent = NULL, $name = NULL) { +class SignInForm extends UI\Form +{ + public function __construct(IContainer $parent = NULL, $name = NULL) + { parent::__construct($parent, $name); - $this->addText('name', 'Jméno:'); // ... $this->addSubmit('login', 'Přihlásit se'); @@ -487,10 +492,10 @@ class SignInForm extends AppForm { V továrničce presenteru ji pak použijeme takto: /--php - protected function createComponentSignInForm($name) { + protected function createComponentSignInForm($name) + { $form = new SignInForm($this, $name); - $form['login']->onClick[] = callback($this, 'signInFormSubmitted'); - + $form->onSuccess[] = callback($this, 'signInFormSubmitted'); return $form; } \-- From 473a2f40d29015dfd49578d72f63ef0fd31b1f06 Mon Sep 17 00:00:00 2001 From: Semik Date: Mon, 29 Aug 2011 18:03:38 +0200 Subject: [PATCH 0167/1741] cs/forms: typing error --- cs/forms.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/forms.texy b/cs/forms.texy index 1b751d28d1..2b5b940f7b 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -471,7 +471,7 @@ Použití stejného formuláře ve více presenterech Pokud potřebujete jeden formulář použít ve více presenterech, máte dvě možnosti: 1) vložit do hierarchie presenterů jejich společného předka a továrničku definovat tam -2) nebo definovat formulář v samostatné třídě a v jednotlivých továrničkách ji pouze instanciovat. +2) nebo definovat formulář v samostatné třídě a v jednotlivých továrničkách vytvářet jeho instance. Vhodné umístění pro takovou třídu je `app/forms/SignInForm.php` /--php From bc7a7dcea32f97ced519b70e23567920b5c739ef Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Tue, 30 Aug 2011 18:54:55 +0200 Subject: [PATCH 0168/1741] =?UTF-8?q?cs/mailing:=20jin=C3=BD=20zp=C5=AFsob?= =?UTF-8?q?=20pou=C5=BEit=C3=AD=20maileru?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/mailing.texy | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cs/mailing.texy b/cs/mailing.texy index 2aeacd147c..76306676c5 100644 --- a/cs/mailing.texy +++ b/cs/mailing.texy @@ -109,6 +109,16 @@ $mailer = new Nette\Mail\SmtpMailer(array( $mailer->send($mail); \-- +Alternativně můžete SmtpMailer předat přímo instanci Message: + +/--php +$mail = new Message; +// ... konfigurace zprávy +$mail->setMailer($mailer); +$mail->send(); +\-- + + Můžeme si také vytvořit vlastní mailer, jde o objekt implementující rozhraní [Nette\Mail\IMailer |api:]. From 7d706cf78448c53c9b3e492db4111a6974a50ec8 Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Tue, 30 Aug 2011 19:00:32 +0200 Subject: [PATCH 0169/1741] =?UTF-8?q?cs/mailing:=20p=C5=99=C3=ADklad=20pou?= =?UTF-8?q?=C5=BEit=C3=AD=20prom=C4=9Bnn=C3=BDch=20v=20=C5=A1ablon=C4=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/mailing.texy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cs/mailing.texy b/cs/mailing.texy index 76306676c5..965fd655fe 100644 --- a/cs/mailing.texy +++ b/cs/mailing.texy @@ -57,6 +57,7 @@ Skutečná síla se projeví při zkombinování se šablonovacím systémem Lat /--php $template = new Nette\Templating\FileTemplate('email.phtml'); $template->registerFilter(new Nette\Latte\Engine); +$template->cisloObjednavky = 123; $mail = new Message; $mail->setFrom('Franta ') @@ -84,7 +85,7 @@ Soubor `email.phtml`:

    Dobrý den,

    -

    Vaše objednávka byla přijata.

    +

    Vaše objednávka číslo {$cisloObjednavky} byla přijata.

    \-- From d853f173ed66aa58dfc7389f61a0b226eb600da0 Mon Sep 17 00:00:00 2001 From: Mikulas Dite Date: Tue, 30 Aug 2011 19:41:23 +0200 Subject: [PATCH 0170/1741] =?UTF-8?q?cs/mailing:=20variable=20=C4=8D=C3=AD?= =?UTF-8?q?sloObjedn=C3=A1vky=3F=20rad=C5=A1i=20norm=C3=A1ln=C4=9B=20order?= =?UTF-8?q?Id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/mailing.texy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cs/mailing.texy b/cs/mailing.texy index 965fd655fe..83177a16d6 100644 --- a/cs/mailing.texy +++ b/cs/mailing.texy @@ -57,7 +57,7 @@ Skutečná síla se projeví při zkombinování se šablonovacím systémem Lat /--php $template = new Nette\Templating\FileTemplate('email.phtml'); $template->registerFilter(new Nette\Latte\Engine); -$template->cisloObjednavky = 123; +$template->orderId = 123; $mail = new Message; $mail->setFrom('Franta ') @@ -85,7 +85,7 @@ Soubor `email.phtml`:

    Dobrý den,

    -

    Vaše objednávka číslo {$cisloObjednavky} byla přijata.

    +

    Vaše objednávka číslo {$orderId} byla přijata.

    \-- From c77fcd8cfa9cf4fc63ea62ab203986d101aa5423 Mon Sep 17 00:00:00 2001 From: redhead Date: Tue, 30 Aug 2011 21:13:32 +0200 Subject: [PATCH 0171/1741] en/default-macros: typo --- en/default-macros.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/default-macros.texy b/en/default-macros.texy index 9e8f0df391..1a8bfcb6d4 100644 --- a/en/default-macros.texy +++ b/en/default-macros.texy @@ -371,7 +371,7 @@ By using the n:macro notation we can disable Latte for a JavaScript block only: \-- -Latte can easily be used in JavaScript, you just have to avoid the notation above by writing a space after the opening brace `{ var: 123}` or by using quotes around the identifier `{'var': 123}`. +Latte mode can easily be used in JavaScript, you just have to avoid the notation above by writing a space after the opening brace `{ var: 123}` or by using quotes around the identifier `{'var': 123}`. From a682aaf6863aa4355a4c4d66b912d667518eb15a Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Tue, 30 Aug 2011 22:15:41 +0200 Subject: [PATCH 0172/1741] =?UTF-8?q?cs/default-macros:=20/syntax=20nefung?= =?UTF-8?q?uje=20p=C5=99i=20syntax=20off?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/default-macros.texy | 1 + 1 file changed, 1 insertion(+) diff --git a/cs/default-macros.texy b/cs/default-macros.texy index 3f11dd17eb..af089f9c80 100644 --- a/cs/default-macros.texy +++ b/cs/default-macros.texy @@ -372,6 +372,7 @@ S využitím n:maker lze vypnout Latte třeba jen jednomu bloku JavaScriptu: Latte je pohodlně použitelné i v JavaScriptu, jen se stačí vyhnout konstrukci uvedené v předchozím příkladu. Buď zápisem mezery za otevírací složenou závorku `{ var: 123}` nebo použitím uvozovek kolem identifikátoru `{'var': 123}`. +Pokud Latte vypnete pomocí `{syntax off}` (tj. makrem syntax, nikoliv n:makrem), mějte na paměti, že ho již zpátky nemůžete zapnout pomocí `{/syntax}`. Žádné složené závorky se nezpracovávají, tudíž ani tag pro ukončení výjimky v syntaxi. n:class From 5904caf90fa97a0bf47bae8ea4dd2b3caff61f10 Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Wed, 31 Aug 2011 10:49:32 +0200 Subject: [PATCH 0173/1741] =?UTF-8?q?cs/routing:=20p=C5=99eklep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/routing.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/routing.texy b/cs/routing.texy index c57ed4b20b..51c9ebff02 100644 --- a/cs/routing.texy +++ b/cs/routing.texy @@ -227,7 +227,7 @@ Jednosměrné routy se používají zejména pro zachování funkčnosti starýc // staré URL /product-info?id=123 $router[] = new Route('product-info', 'Product:detail', Route::ONE_WAY); // nové URL /product/123 -$router[] = new Route('produkt/', 'Product:detail'); +$router[] = new Route('product/', 'Product:detail'); \-- Navíc dojde k automatickému přesměrování na nový tvar URL, takže vám tyto stránky vyhledávače nezaindexují dvakrát (viz [#SEO a kanonizace]). From f5ae07b74988f5f637ffff8d1a5bdfff246a900c Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Wed, 31 Aug 2011 10:52:08 +0200 Subject: [PATCH 0174/1741] en/routing: typo --- en/routing.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/routing.texy b/en/routing.texy index ae20ef42e0..8bd476cac0 100644 --- a/en/routing.texy +++ b/en/routing.texy @@ -224,7 +224,7 @@ One way routes are usually used to preserve old URLs functionality, when an appl // old URL /product-info?id=123 $router[] = new Route('product-info', 'Product:detail', Route::ONE_WAY); // new URL /product/123 -$router[] = new Route('produkt/', 'Product:detail'); +$router[] = new Route('product/', 'Product:detail'); \-- Additionally the user is redirected to new URL, so search engines won't index your pages twice (see [#SEO a kanonizace]). From a890650d822a69316edd242203b191025c396421 Mon Sep 17 00:00:00 2001 From: smasty Date: Wed, 31 Aug 2011 11:07:55 +0200 Subject: [PATCH 0175/1741] en/mailing: update to reflect czech rev #4 --- en/mailing.texy | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/en/mailing.texy b/en/mailing.texy index 1b78b61a18..d6ba0e155a 100644 --- a/en/mailing.texy +++ b/en/mailing.texy @@ -59,6 +59,7 @@ The real power comes in combination with [Latte templating system | templating]: /--php $template = new Nette\Templating\FileTemplate('email.latte'); $template->registerFilter(new Nette\Latte\Engine); +$template->orderId = 123; $mail = new Message; $mail->setFrom('John ') @@ -86,7 +87,7 @@ File `email.latte`:

    Hello,

    -

    Your order has been accepted.

    +

    Your order number {$orderId} has been accepted.

    \-- @@ -111,6 +112,15 @@ $mailer = new Nette\Mail\SmtpMailer(array( $mailer->send($mail); \-- +Alternatively, you can pass the mailer directly to the `Message` instance: + +/--php +$mail = new Message; +// message configuration... +$mail->setMailer($mailer); +$mail->send(); +\-- + You can also create your own mailer - it's a class implementing [api:Nette\Mail\IMailer] interface. From 396a90bd19ff797ed9e826b6344905d699bf820a Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Wed, 31 Aug 2011 11:31:34 +0200 Subject: [PATCH 0176/1741] =?UTF-8?q?cs/forms:=20zpracov=C3=A1n=C3=AD=20od?= =?UTF-8?q?eslan=C3=A9ho=20formul=C3=A1=C5=99e=20p=C5=99=C3=ADmo=20v=20jeh?= =?UTF-8?q?o=20t=C5=99=C3=ADd=C4=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/forms.texy | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/cs/forms.texy b/cs/forms.texy index 2b5b940f7b..dc16fe8330 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -471,7 +471,7 @@ Použití stejného formuláře ve více presenterech Pokud potřebujete jeden formulář použít ve více presenterech, máte dvě možnosti: 1) vložit do hierarchie presenterů jejich společného předka a továrničku definovat tam -2) nebo definovat formulář v samostatné třídě a v jednotlivých továrničkách vytvářet jeho instance. +2) nebo definovat formulář v samostatné třídě jako komponentu a v jednotlivých továrničkách vytvářet jeho instance. Vhodné umístění pro takovou třídu je `app/forms/SignInForm.php` /--php @@ -490,16 +490,54 @@ class SignInForm extends UI\Form } \-- -V továrničce presenteru ji pak použijeme takto: +V továrničce každého presenteru, který náš formulář zobrazuje, ji pak použijeme takto: /--php protected function createComponentSignInForm($name) { $form = new SignInForm($this, $name); + $form['login']->caption = 'Pokračovat'; // můžeme také formulář pozměnit + $form->onSuccess[] = callback($this, 'signInFormSubmitted'); return $form; } + + protected function signInFormSubmitted(Form $form) + { + $values = $form->getValues(); + // ... + } \-- +Odeslaný formulář ale můžeme také odchytávat na jediném místě. Do třídy formuláře doplníme zpětné volání např. pro onSuccess a definici jeho zpracování: +/--php +class SignInForm extends UI\Form +{ + public function __construct(IContainer $parent = NULL, $name = NULL) + { + parent::__construct($parent, $name); + $this->addText('name', 'Jméno:'); + // ... + $this->addSubmit('login', 'Přihlásit se'); + + $this->onSuccess[] = callback($this, 'onSuccess'); + } + + protected function onSuccess(Form $form) + { + $values = $form->getValues(); + // ... + } +} +\-- + + +V presenteru nám pak zůstane jen továrnička: +/--php + protected function createComponentSignInForm($name) + { + return new SignInForm($this, $name); + } +\-- From 8f8c105a98badde91e1f3d8ee0bee5d72cca1f2a Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Wed, 31 Aug 2011 12:06:46 +0200 Subject: [PATCH 0177/1741] =?UTF-8?q?cs/forms:=20setAction()=20v=20tov?= =?UTF-8?q?=C3=A1rni=C4=8Dce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/forms.texy | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cs/forms.texy b/cs/forms.texy index dc16fe8330..a95680afc4 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -540,6 +540,23 @@ V presenteru nám pak zůstane jen továrnička: \-- +Může se vám i stát, že potřebujete odeslaný formulář vždy zpracovávat v jednom konkrétním presenteru a výsledek zobrazit pomocí jeho akce ("hlavní presenter"). Ten samý formulář budete zobrazovat i v jiném presenteru ("vedlejší presenter"), ale odesílat ho chcete do hlavního presenteru. + +Jako v předchozích případech potřebujete továrničku v každém z presenterů, tentokrát se však budou lišit. V hlavním presenteru zůstává továrnička, zpětné volání i metoda stejná jako [v prvním příkladu | doc:cs/forms#toc-pouziti-stejneho-formulare-ve-vice-presenterech] této kapitoly. + +Vedlejší presenter pak bude obsahovat pouze továrničku a v ní `setAction()`: +/--php + protected function createComponentSignInForm($name) + { + $form = new SignInForm($this, $name); + + $url = $this->link('Main:myAction', array(Presenter::SIGNAL_KEY => $name.self::NAME_SEPARATOR.'submit')); + $form->setAction($url); + + return $form; + } +\-- + Výchozí hodnoty =============== From 381765b3a751d80ae3bcdeb7b7f29bb429bb4ef2 Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Wed, 31 Aug 2011 12:36:46 +0200 Subject: [PATCH 0178/1741] =?UTF-8?q?cs/forms:=20varov=C3=A1n=C3=AD,=20?= =?UTF-8?q?=C5=BEe=20makro=20form=20automaticky=20nevrac=C3=AD=20skrytou?= =?UTF-8?q?=20prom=C4=9Bnnou=20=20do=20=20p=C5=99i=20metod=C4=9B=20get?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/forms.texy | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cs/forms.texy b/cs/forms.texy index a95680afc4..d482fa0717 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -747,6 +747,18 @@ Dokonce je možné jen "oživit" prvky napsané čistě v HTML pomocí makra `n: \-- +Pokud používáte makro `{form ...}` pro vykreslování formuláře odesílaného metodou GET, je potřeba ještě ručně přidat jedno skryté políčko: +/--html +{form signForm} +... + {var $signalElement = Html::el('input', array( + 'type' => 'hidden', + 'name' => Presenter::SIGNAL_KEY, + 'value' => 'signForm'.Presenter::NAME_SEPARATOR.'submit' + ))} + {$signalElement} +{/form} +\-- Seskupování prvků From a651f0f3b6d9fa94fc99c875850f02b92d7941aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Wed, 31 Aug 2011 13:45:34 +0200 Subject: [PATCH 0179/1741] =?UTF-8?q?cs/forms:=20Vytv=C3=A1=C5=99en=C3=AD?= =?UTF-8?q?=20odkazu=20na=20sign=C3=A1l=20jin=C3=A9ho=20presenteru=20je=20?= =?UTF-8?q?ne=C4=8Dist=C3=A1=20praktika?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/forms.texy | 35 ++--------------------------------- 1 file changed, 2 insertions(+), 33 deletions(-) diff --git a/cs/forms.texy b/cs/forms.texy index d482fa0717..8c9adf1ba3 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -494,7 +494,7 @@ V továrničce každého presenteru, který náš formulář zobrazuje, ji pak p /--php protected function createComponentSignInForm($name) { - $form = new SignInForm($this, $name); + $form = new SignInForm(); $form['login']->caption = 'Pokračovat'; // můžeme také formulář pozměnit $form->onSuccess[] = callback($this, 'signInFormSubmitted'); @@ -535,25 +535,7 @@ V presenteru nám pak zůstane jen továrnička: /--php protected function createComponentSignInForm($name) { - return new SignInForm($this, $name); - } -\-- - - -Může se vám i stát, že potřebujete odeslaný formulář vždy zpracovávat v jednom konkrétním presenteru a výsledek zobrazit pomocí jeho akce ("hlavní presenter"). Ten samý formulář budete zobrazovat i v jiném presenteru ("vedlejší presenter"), ale odesílat ho chcete do hlavního presenteru. - -Jako v předchozích případech potřebujete továrničku v každém z presenterů, tentokrát se však budou lišit. V hlavním presenteru zůstává továrnička, zpětné volání i metoda stejná jako [v prvním příkladu | doc:cs/forms#toc-pouziti-stejneho-formulare-ve-vice-presenterech] této kapitoly. - -Vedlejší presenter pak bude obsahovat pouze továrničku a v ní `setAction()`: -/--php - protected function createComponentSignInForm($name) - { - $form = new SignInForm($this, $name); - - $url = $this->link('Main:myAction', array(Presenter::SIGNAL_KEY => $name.self::NAME_SEPARATOR.'submit')); - $form->setAction($url); - - return $form; + return new SignInForm(); } \-- @@ -747,19 +729,6 @@ Dokonce je možné jen "oživit" prvky napsané čistě v HTML pomocí makra `n: \-- -Pokud používáte makro `{form ...}` pro vykreslování formuláře odesílaného metodou GET, je potřeba ještě ručně přidat jedno skryté políčko: -/--html -{form signForm} -... - {var $signalElement = Html::el('input', array( - 'type' => 'hidden', - 'name' => Presenter::SIGNAL_KEY, - 'value' => 'signForm'.Presenter::NAME_SEPARATOR.'submit' - ))} - {$signalElement} -{/form} -\-- - Seskupování prvků ----------------- From 7c546d6ebdd0989e5dda5e95979678a631ad26c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Wed, 31 Aug 2011 13:46:33 +0200 Subject: [PATCH 0180/1741] =?UTF-8?q?cs/forms:=20zbyte=C4=8Dn=C3=A9=20opak?= =?UTF-8?q?ov=C3=A1n=C3=AD,=20u=C5=BE=20jednou=20uk=C3=A1zan=C3=A9=20metod?= =?UTF-8?q?y?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/forms.texy | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cs/forms.texy b/cs/forms.texy index 8c9adf1ba3..6560110cc4 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -500,12 +500,6 @@ V továrničce každého presenteru, který náš formulář zobrazuje, ji pak p $form->onSuccess[] = callback($this, 'signInFormSubmitted'); return $form; } - - protected function signInFormSubmitted(Form $form) - { - $values = $form->getValues(); - // ... - } \-- Odeslaný formulář ale můžeme také odchytávat na jediném místě. Do třídy formuláře doplníme zpětné volání např. pro onSuccess a definici jeho zpracování: From db58d24183e1be464e754e713304801e258bcdbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Wed, 31 Aug 2011 13:51:09 +0200 Subject: [PATCH 0181/1741] =?UTF-8?q?cs/forms:=20Opraveno=20rozbit=C3=AD?= =?UTF-8?q?=20funk=C4=8Dnosti=20callbak=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/forms.texy | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cs/forms.texy b/cs/forms.texy index 6560110cc4..7d4a05aefa 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -513,13 +513,12 @@ class SignInForm extends UI\Form // ... $this->addSubmit('login', 'Přihlásit se'); - $this->onSuccess[] = callback($this, 'onSuccess'); + $this->onSuccess[] = callback($this, 'submitted'); } - protected function onSuccess(Form $form) + public function submitted() { - $values = $form->getValues(); - // ... + // volá se po odeslání formuláře } } \-- From 7fe144e185485080fa89e622fb3cb5b1a61ece63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Wed, 31 Aug 2011 14:02:56 +0200 Subject: [PATCH 0182/1741] =?UTF-8?q?cs/forms:=20P=C5=99=C3=ADklad=20se=20?= =?UTF-8?q?zpracov=C3=A1n=C3=ADm=20formul=C3=A1=C5=99e=20p=C5=99eps=C3=A1n?= =?UTF-8?q?=20na=20tip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/forms.texy | 31 ++----------------------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/cs/forms.texy b/cs/forms.texy index 7d4a05aefa..bbb1f734c2 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -502,35 +502,8 @@ V továrničce každého presenteru, který náš formulář zobrazuje, ji pak p } \-- -Odeslaný formulář ale můžeme také odchytávat na jediném místě. Do třídy formuláře doplníme zpětné volání např. pro onSuccess a definici jeho zpracování: -/--php -class SignInForm extends UI\Form -{ - public function __construct(IContainer $parent = NULL, $name = NULL) - { - parent::__construct($parent, $name); - $this->addText('name', 'Jméno:'); - // ... - $this->addSubmit('login', 'Přihlásit se'); - - $this->onSuccess[] = callback($this, 'submitted'); - } - - public function submitted() - { - // volá se po odeslání formuláře - } -} -\-- - - -V presenteru nám pak zůstane jen továrnička: -/--php - protected function createComponentSignInForm($name) - { - return new SignInForm(); - } -\-- +.[tip] +Odeslaný formulář ale můžeme také zpracovávat na jediném místě. Do definice formuláře přesuneme volání událostí i s metodou `signInFormSubmitted` a přejmenujeme ji například na `submitted`. Výchozí hodnoty From cdf64f963f6ab914079b2b3cf12274d74378c13f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Wed, 31 Aug 2011 14:16:11 +0200 Subject: [PATCH 0183/1741] =?UTF-8?q?cs/forms:=20viditelnost=20metody=20vo?= =?UTF-8?q?lan=C3=A9=20callbackem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/forms.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/forms.texy b/cs/forms.texy index bbb1f734c2..6c2f7fcd6c 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -447,7 +447,7 @@ protected function createComponentSignInForm() return $form; } -function signInFormSubmitted($form) +public function signInFormSubmitted($form) { // volá se po odeslání formuláře } From 3b047a1198d10a4642178ec81f57ecad07b90010 Mon Sep 17 00:00:00 2001 From: "petr.pavel" Date: Wed, 31 Aug 2011 15:24:58 +0200 Subject: [PATCH 0184/1741] =?UTF-8?q?cs/writing:=20pokyn=20ps=C3=A1t=20n?= =?UTF-8?q?=C3=A1zvy=20prom=C4=9Bnn=C3=BDch=20anglicky?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/writing.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/writing.texy b/cs/writing.texy index 41f3fabb87..2d822a5413 100644 --- a/cs/writing.texy +++ b/cs/writing.texy @@ -18,7 +18,7 @@ Cení se schopnost věc vysvětlit. Než začnete psát, pokuste se téma vysvě 1) Naučte se [wiki:syntax], kterou si můžete vyzkoušet na [pískovišti | wiki:sandbox], kde nemůžete způsobit žádnou škodu -2) Dodržujte [Coding Standard] +2) Dodržujte [Coding Standard], názvy proměnných pište anglicky 3) Všechno pište pro verzi Nette Framework 2.0 a PHP 5.3 (s výjimkou dokumentace pro 0.9) 4) O odlišnostech verzí 5.2 a 5.3 v samotném frameworku (namespace se nepočítají) píšeme jako varování (`.[warning]`) 6) Názvy tříd včetně jmenných prostorů uvádějte při první zmínce, pak už bez namespace From 4c70564b2f6aa004a3419b113e2ef4f2447681d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Wed, 31 Aug 2011 16:22:53 +0200 Subject: [PATCH 0185/1741] =?UTF-8?q?cs/writing:=20dopln=C4=9Bn=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/writing.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/writing.texy b/cs/writing.texy index 2d822a5413..f057dfe751 100644 --- a/cs/writing.texy +++ b/cs/writing.texy @@ -18,7 +18,7 @@ Cení se schopnost věc vysvětlit. Než začnete psát, pokuste se téma vysvě 1) Naučte se [wiki:syntax], kterou si můžete vyzkoušet na [pískovišti | wiki:sandbox], kde nemůžete způsobit žádnou škodu -2) Dodržujte [Coding Standard], názvy proměnných pište anglicky +2) Dodržujte [Coding Standard], názvy proměnných, tříd a metod pište anglicky 3) Všechno pište pro verzi Nette Framework 2.0 a PHP 5.3 (s výjimkou dokumentace pro 0.9) 4) O odlišnostech verzí 5.2 a 5.3 v samotném frameworku (namespace se nepočítají) píšeme jako varování (`.[warning]`) 6) Názvy tříd včetně jmenných prostorů uvádějte při první zmínce, pak už bez namespace From 8b34b0186b0dfa1b46c96253e0344109b8eb6318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Thu, 1 Sep 2011 07:36:03 +0200 Subject: [PATCH 0186/1741] =?UTF-8?q?cs/writing:=20angli=C4=8Dtina=20jako?= =?UTF-8?q?=20samostatn=C3=BD=20bod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/writing.texy | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cs/writing.texy b/cs/writing.texy index f057dfe751..61d16e3fe1 100644 --- a/cs/writing.texy +++ b/cs/writing.texy @@ -18,9 +18,10 @@ Cení se schopnost věc vysvětlit. Než začnete psát, pokuste se téma vysvě 1) Naučte se [wiki:syntax], kterou si můžete vyzkoušet na [pískovišti | wiki:sandbox], kde nemůžete způsobit žádnou škodu -2) Dodržujte [Coding Standard], názvy proměnných, tříd a metod pište anglicky -3) Všechno pište pro verzi Nette Framework 2.0 a PHP 5.3 (s výjimkou dokumentace pro 0.9) -4) O odlišnostech verzí 5.2 a 5.3 v samotném frameworku (namespace se nepočítají) píšeme jako varování (`.[warning]`) +2) Dodržujte [Coding Standard] +3) Názvy proměnných, tříd a metod pište anglicky +4) Všechno pište pro verzi Nette Framework 2.0 a PHP 5.3 (s výjimkou dokumentace pro 0.9) +5) O odlišnostech verzí 5.2 a 5.3 v samotném frameworku (namespace se nepočítají) píšeme jako varování (`.[warning]`) 6) Názvy tříd včetně jmenných prostorů uvádějte při první zmínce, pak už bez namespace 7) Šetřete zvýrazňovači všeho druhu, od tučného písma po rámečky `.[note]` 8) V textu dokumentace spíše „mykáme“ a jsme zdvořilí From 0e7de0b899c655f746eb2bd4370f891853a945ea Mon Sep 17 00:00:00 2001 From: duke Date: Fri, 2 Sep 2011 23:34:38 +0200 Subject: [PATCH 0187/1741] cs/security: typo --- cs/security.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/security.texy b/cs/security.texy index a1f06212eb..3c20c58bd1 100644 --- a/cs/security.texy +++ b/cs/security.texy @@ -212,7 +212,7 @@ Autorizátor Autorizátor je ten, kdo umí rozhodnout, zda má uživatel oprávnění provést určitou akci. Jde o objekt implementující rozhraní [api:Nette\Security\IAuthorizator] s jedinou metodu `isAllowed()`, jejímž úkolem je rozhodnout, zda má daná *role* povolení provést určitou *operaci* s určitým *zdrojem*. - **role** je vlastnost uživatele - např. moderátor, redaktor, návštěvník, zaregistrovaný uživatel, správce... -- **zdroj** (*resource*) se nějaký logický prvek webu - článek, stránka, uživatel, položka v menu, anketa, presenter, ... +- **zdroj** (*resource*) je nějaký logický prvek webu - článek, stránka, uživatel, položka v menu, anketa, presenter, ... - **operace** (*privilege*) je nějaká konkrétní činnost, kterou uživatel může či nemůže se zdrojem dělat - například smazat, upravit, vytvořit, hlasovat, ... Rámcová podoba implementace vypadá takto: From 0d023b9b2eb321064648faffdcd21e2c10d5cf2b Mon Sep 17 00:00:00 2001 From: duke Date: Sat, 3 Sep 2011 00:49:11 +0200 Subject: [PATCH 0188/1741] en/security: fixes and improvements --- en/security.texy | 90 ++++++++++++++++++++++++------------------------ 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/en/security.texy b/en/security.texy index 785c08377b..c4374250a5 100644 --- a/en/security.texy +++ b/en/security.texy @@ -12,15 +12,15 @@ Little to none web applications need no mechanism for user login or checking use \-- -Before we fully emerge this topic, we should note that all examples do use `user` service, which is an [api:Nette\Http\User] object. The service itself can be get from [system container |configuring] using `$user = $container->user` or `$user = $this->getUser()` inside a presenter. +Before we fully emerge this topic, we should note that all examples do use `user` service, which is a [api:Nette\Http\User] object. The service itself can be acquired from [system container |configuring] using `$user = $container->user` or `$user = $this->getUser()` from a presenter. Authentication ============== -Authentication means **user login**, the process during which we check whether the user is who he claims he is. It's usually proved with simple username and password combination. +Authentication means **user login**, ie. the process during which user's identity is verified. User usually identifies himself using username and password. -Loging user in with username and password: +Logging user in with username and password: /--php $user->login($username, $password); @@ -43,7 +43,7 @@ Simple, right? .[note] Logging in requires users to have cookies enabled - other methods are not safe! -Besides loging user out with the `logout()` method, it can be done automatically based on specified time interval or closing the browser window. For this configuration we have to call `setExpiration()` during the login process. As an argument, it takes an relative time in seconds, UNIX timestamp, or textual interpretation of time. The second argument sets whether user should be logged out when browser is closed. +Besides logging the user out with the `logout()` method, it can be done automatically based on specified time interval or closing the browser window. For this configuration we have to call `setExpiration()` during the login process. As an argument, it takes a relative time in seconds, UNIX timestamp, or textual representation of time. The second argument specifies whether the user should be logged out when the browser is closed. /--php // login expires after 30 minutes of inactivity or after closing browser @@ -57,11 +57,11 @@ $user->setExpiration(0, TRUE); \-- .[note] -Expiration must be set to equal or lower value, than [sessions]' expiration is set to. +Expiration must be set to value equal or lower than the expiration of [sessions]. -The reason of last logout is returned by `$user->getLogoutReason()`, which yells one of these constants: `User::INACTIVITY` if time expired, `User::BROWSER_CLOSED` when user has closed the browser or `User::MANUAL` when we called the `logout()` method. +The reason of last logout can be obtained by method `$user->getLogoutReason()`, which returns one of these constants: `User::INACTIVITY` if time expired, `User::BROWSER_CLOSED` when user has closed the browser or `User::MANUAL` when the `logout()` method was called. -To make the example above working, we in fact have to create an object that verifies user's name and password. It's called **authenticator**. It's trivial implementation is class [api:Nette\Security\SimpleAuthenticator], which takes an hash map of usernames as indexes and passwords as values: +To make the example above work, we in fact have to create an object that verifies user's name and password. It's called **authenticator**. Its trivial implementation is the class [api:Nette\Security\SimpleAuthenticator], which in its constructor accepts an associative array: /--php $authenticator = new Nette\Security\SimpleAuthenticator(array( @@ -71,7 +71,7 @@ $authenticator = new Nette\Security\SimpleAuthenticator(array( $user->setAuthenticator($authenticator); \-- -If login createntials are not valid, authenticator throws an [api:Nette\Security\AuthenticationException]: +If the login credentials are not valid, authenticator throws an [api:Nette\Security\AuthenticationException]: /--php try { @@ -102,7 +102,7 @@ common: Custom authenticator -------------------- -We will create a custom authenticator that will check validity of login credentials against a database table. Every authenticator must be and implementation of [api:Nette\Security\IAuthenticator], with is't only method `authenticate()`. It's only purpose is to return an [identity | #identity] or to throw an `Nette\Security\AuthenticationException`. Framework defines a few error codes, which can be used to determine the reason login was not successful, such as self-explaining `IAuthenticator::IDENTITY_NOT_FOUND` or `IAuthenticator::INVALID_CREDENTIAL`. +We will create a custom authenticator that will check validity of login credentials against a database table. Every authenticator must be an implementation of [api:Nette\Security\IAuthenticator], with its only method `authenticate()`. Its only purpose is to return an [identity | #identity] or to throw an `Nette\Security\AuthenticationException`. Framework defines few error codes, that can be used to determine the reason login was not successful, such as self-explaining `IAuthenticator::IDENTITY_NOT_FOUND` or `IAuthenticator::INVALID_CREDENTIAL`. /--php use Nette\Security as NS; @@ -135,7 +135,7 @@ class MyAuthenticator extends Nette\Object implements NS\IAuthenticator } \-- -Class `MyAuthenticator` communicates with database using [Nette\Database |database] layer and works with table `users`, where it grabs `username` and md5 hash of `password` in the appropriate columns. If the password check is successful, it returnrs new identity with user ID and role, which we will mention [later | #roles]; +Class `MyAuthenticator` communicates with the database using [Nette\Database |database] layer and works with table `users`, where it grabs `username` and md5 hash of `password` in the appropriate columns. If the password check is successful, it returns new identity with user ID and role, which we will mention [later | #roles]; This authenticator would be configured in the `config.neon` file like this: @@ -158,16 +158,16 @@ Identity Identity presents a set of user information, as returned by autheticator. It's an object implementing [api:Nette\Security\IIdentity] interface, with default implementation [api:Nette\Security\Identity]. Class has methods `getId()`, that returns users ID (for example primary key for the respective database row), and `getRoles()`, which returns an array of all roles user is in. User data can be access as if they were identity properties. -Identity is not erased when user is logged out. So, if identity exists, it by itself does not grant that user is also logged in. If we would explicitly delete the identity for some reason, we can logout user with `$user->logout(TRUE)`. +Identity is not erased when the user is logged out. So, if identity exists, it by itself does not grant that the user is also logged in. If we would like to explicitly delete the identity for some reason, we logout the user by calling `$user->logout(TRUE)`. -Service `user` of class [api:Nette\Http\User] keeps identity in session and uses it to all authorizations. +Service `user` of class [api:Nette\Http\User] keeps the identity in session and uses it to all authorizations. Identity can be access with `getIdentity` upon `$user`: /--php if ($user->isLoggedIn()) { - echo 'Logged in user: ', $user->getIdentity()->getId(); + echo 'User logged in: ', $user->getIdentity()->getId(); } else { - echo 'User logged out'; + echo 'User is not logged in'; } \-- @@ -176,11 +176,11 @@ if ($user->isLoggedIn()) { Authorization ============= -Authorization detects whether an user has enough privilege to do some action, for example opening a file or deleting an article. Authorization assumes that user has been successfully authenticated (logged in). +Authorization detects whether the user has enough privilege to do some action, for example opening a file or deleting an article. Authorization assumes that the user has been successfully authenticated (logged in). -Nette Framework authorization may be based on what groups does user belong to or which roles user has got. We will start at the very beginning. +Nette Framework authorization may be based on what groups the user belongs to or on which roles were assigned to the user. We will start from the very beginning. -Simple web sites with few administrator, where all users have same privileges, may use only already mentioned `isLoggedIn()` method. Simply put, if user is logged in, he has permission to all actions, and vice versa. +For simple web sites with administration, where all users share same privileges, it is sufficient to use already mentioned `isLoggedIn()` method. Simply put, if the user is logged in, he has permissions to all actions, and vice versa. /--php if ($user->isLoggedIn()) { // is user logged in? @@ -192,25 +192,25 @@ if ($user->isLoggedIn()) { // is user logged in? Roles ----- -The purpose of roles is to offer a more precise privilege control while not depending on a user name. As soon as user logs in, we give his identity one or more roles. Roles itself may be a simple strings, such as `admin`, `member`, `guest`, etc. They are set via a second argument of `Identity` constructor, either a string or an array. +The purpose of roles is to offer a more precise privilege control while remaining independent on the user name. As soon as user logs in, he is assigned one or more roles. Roles themselves may be simple strings, such as `admin`, `member`, `guest`, etc. They are specified in the second argument of `Identity` constructor, either as a string or an array. -This time we will use `isInRole()` to check if user is allowed to take some action: +This time we will use the `isInRole()` method to check if the user is allowed to perform some action: /--php -if ($user->isInRole('admin')) { // is user an admin? +if ($user->isInRole('admin')) { // is the admin role assigned to the user? deleteItem(); // if so, he may delete an item } \-- -As you already know, logging user out does not erase his identity. So the method `getIdentity()` still returns an `Identity` object, with all roles as before the logout. Nette Framework does profess an "less code, more security" principle, which leads to not forcing coders to write `if ($user->isLoggedIn() && $user->isInRole('admin'))` everwhere and that's why `isInRole()` method does work with **efective roles*. If user is logged out, his identity is explicitly returned as `guest`, ignoring any identity that might be present. +As you already know, logging user out does not erase his identity. Therefore the `getIdentity()` method still returns an `Identity` object, with all the assigned roles regardless on logout. Nette Framework adheres to the "less code, more security" principle, which is why it doesn't want to force coders to write `if ($user->isLoggedIn() && $user->isInRole('admin'))` everywhere and therefore the `isInRole()` method works with **efective roles**. If the user is logged in, roles assigned to identity are used, if he is logged out, an automatic special role `guest` is used instead. Authorizator ------------ -Authorizator decides, whether user has permission to take some action. It's an implementation of [api:Nette\Security\IAuthorizator] interface with only one method `isAllowed()`, which either allows an an action if given *role* is allowed to do certain *operation* with specific *resource*, or denies it. +Authorizator decides, whether the user has permission to take some action. It's an implementation of [api:Nette\Security\IAuthorizator] interface with only one method `isAllowed()`. Purpose of this method is to determine, whether given role has the permission to perform certain *operation* with specific *resource*. -- **role** is an user attribute - for example moderator, editor, visitor, registered user, administrator, ... -- **resource** is an logical unit - article, page, user, menu item, poll, presenter, ... +- **role** is a user attribute - for example moderator, editor, visitor, registered user, administrator, ... +- **resource** is a logical unit of the application - article, page, user, menu item, poll, presenter, ... - **privilege** is a specific activity, which user may or may not do with *resource* - view, edit, delete, vote, ... @@ -229,10 +229,10 @@ class MyAuthorizator extends Nette\Object } \-- -And an usage example: +And an example of use: /--php -// registeres authorizator +// registers the authorizator $user->setAuthorizator(new MyAuthorizator); if ($user->isAllowed('file')) { // is user allowed to do everything with resource 'file'? @@ -245,24 +245,24 @@ if ($user->isAllowed('file', 'delete')) { // is user allowed to delete a resourc \-- .[note] -Do not confuse two different methods `isAllowed`: one belongs to authorizator and the other one to the `User` class, where first argument is not `$role`. +Do not confuse two different methods `isAllowed`: one belongs to the authorizator and the other one to the `User` class, where first argument is not `$role`. -Because user may have many roles, the permission is granted if at least one roles is allowed. Both arguments are optional and defaults to *everything*. +Because user may have many roles, he is granted the permission only if at least one of roles has the permission. Both arguments are optional and their default value is *everything*. Permission ACL -------------- -Nette Framework has a complete authorizator, class [api:Nette\Security\Permission] which offers a light weight and flexible ACL((Access Control List)) layer for permission and access control. All permissions are set for roles, resources and specific privileges. Roles and resources may be linked to hierarchies, as shown in the following snippet: +Nette Framework has a complete authorizator, class [api:Nette\Security\Permission] which offers a light weight and flexible ACL((Access Control List)) layer for permission and access control. When we work with this class, we define roles, resources and individual privileges. Roles and resources may form hierarchies, as shown in the following example: -- `guest`: logged out visitor, allowrd read and browser public part of the web, that is articles, comments and vote in poll +- `guest`: visitor that is not logged in, allowed to read and browse public part of the web, ie. articles, comments, and to vote in a poll -- `registered`: loggin in user, which may as well post comments +- `registered`: logged in user, which may on top of that post comments -- `administrator`: may write and manage articles, comments and polls +- `administrator`: may write and administer articles, comments and polls -We have defined certain roles (`guest`, `registered` and `administrator`) and metioned resources (`article`, `comments`, `poll`), which users may access or take actions on (`view`, `vote`, `add`, `edit`). +So we have defined certain roles (`guest`, `registered` and `administrator`) and metioned resources (`article`, `comments`, `poll`), which the users may access or take actions on (`view`, `vote`, `add`, `edit`). -We create an instance of Presmission and define user roles. As roles may inherit each other, we may for example specify that `administrator` may do the same as an ordinary visitor (an of course more). +We create an instance of Presmission and define the user roles. As roles may inherit each other, we may for example specify that `administrator` may do the same as an ordinary visitor (and of course more). /--php $acl = new Nette\Security\Permission; @@ -273,16 +273,16 @@ $acl->addRole('registered', 'guest'); // registered inherits from guest $acl->addRole('administrator', 'registered'); // and administrator inherits from registered \-- -Trivial, isn't it? This ensures all properties are set from parent role to it's children. +Trivial, isn't it? This ensures all the properties of the parents will be inheritted by their children. -Do note method `getRoleParents()`, which returns an array of all parent roles, and method `roleIntheritsFrom()`, which check whether on role extends the other. Their usage: +Do note the method `getRoleParents()`, which returns an array of all parent roles, and the method `roleIntheritsFrom()`, which checks whether a role extends another. Their usage: /--php $acl->roleInheritsFrom('administrator', 'guest'); // TRUE $acl->getRoleParents('administrator'); // array('guest', 'registered') \-- -It's right time to define proper resources which users may acccess: +Now is the right time to define the set of resources that the users may acccess: /--php $acl->addResource('article'); @@ -290,11 +290,11 @@ $acl->addResource('comments'); $acl->addResource('poll'); \-- -Also resources may use inheritance. The API offeres similar methods, only the names are slightly different: `resourceInheritsFrom()`, `removeResource()`. +Also resources may use inheritance. The API offers similar methods, only the names are slightly different: `resourceInheritsFrom()`, `removeResource()`. -And now to the most important part. Roles and resources alone would do us no good, we have to create rules defining who can do what with whatever: +And now the most important part. Roles and resources alone would do us no good, we have to create rules defining who can do what with whatever: -TODO: chybí příklad deny() +TODO: missing example for deny() /--php // everything is denied now @@ -309,7 +309,7 @@ $acl->allow('registered', 'comments', 'add'); $acl->allow('administrator', Permission::ALL, array('view', 'edit', 'add')); \-- -With set of rules, we may ask authorization simple questions: +Now when we have created the set of rules, we may simply ask the authorization queries: /--php // can guest view articles? @@ -343,9 +343,9 @@ $acl->addRole('supervisor'); $acl->allow('supervisor'); // all privileges for all resources for supervisor \-- -Whenever during the application runtime we may remove roles `removeRoll()`, resources `removeResource()` or rules `removeAllow()` or `removeDeny()`. +Whenever during the application runtime we may remove roles with `removeRolle()`, resources with `removeResource()` or rules with `removeAllow()` or `removeDeny()`. -Roles may inherith form one or more other roles. What happens, if one ancestor has a certain action allowed and the other one denied? Then the *role weight* comes into play - the last role in the array of roles to inherit has the greatest weight, first one the lowest: +Roles may inherit form one or more other roles. But what happens, if one ancestor has certain action allowed and the other one has it denied? Then the *role weight* comes into play - the last role in the array of roles to inherit has the greatest weight, first one the lowest: /--php $acl = new Permission(); @@ -370,7 +370,7 @@ $acl->isAllowed('mary', 'backend'); // TRUE Multiple applications in one scope ================================== -Multiple applications may work on the same server, session, etc., each with separated authentication logic. It's enough to set a unique namespace for each: +Multiple applications may work on the same server, session, etc., each with separated authentication logic. We just have to set a unique namespace for each: /--php $user->setNamespace('forum'); @@ -380,6 +380,6 @@ $user->setNamespace('forum'); Events: onLoggedIn, onLoggedOut =============================== -`user` service offers events: `onLoggedIn` and `onLoggedOut`, useful for logging authorization activities on the website. `onLoggedIn` event is called only when user has logged in successfully and the other one `onLoggedOut` when user is logged out. +`user` service offers events: `onLoggedIn` and `onLoggedOut`, useful for logging authorization activities on the website. `onLoggedIn` event is called only when the user has logged in successfully and the other one `onLoggedOut` when the user has logged out. {{themeicon: icon-key.png}} From ae2193dc67add4700765af3fb480da41ccecbd63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Brejla?= Date: Sun, 4 Sep 2011 15:00:37 +0200 Subject: [PATCH 0189/1741] en/writing: Image added --- en/writing.texy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/en/writing.texy b/en/writing.texy index 9e0156d62a..8238f31d3f 100644 --- a/en/writing.texy +++ b/en/writing.texy @@ -40,4 +40,6 @@ English documentation homepage is [ready | doc:homepage], it is needed to add co The translation should use simple vocabulary, because it is designed not only for native speakers, but for anyone. -{{themeicon: art-and-painting-80x80-r7-r1-c2-s1.png}} +{{themeicon: icon-art-and-painting.png}} + +[* icon-art-and-painting.png *] From 7e07f96ba5b29d66d478e0326fa7fa0f4061b3f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Brejla?= Date: Sun, 4 Sep 2011 15:56:13 +0200 Subject: [PATCH 0190/1741] en/writing: Translation --- en/writing.texy | 50 ++++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/en/writing.texy b/en/writing.texy index 8238f31d3f..a641039adf 100644 --- a/en/writing.texy +++ b/en/writing.texy @@ -1,45 +1,43 @@ Writing documentation ********************* -.[note] -This page is translated by Google - .[perex] -It will be great, if you participate in making or translating documentation. How? +It will be great, if you will participate in making or translating the documentation. And how? -For editing documents you must have permission to ask you [here in the forum | http://forum.nette.org/cs/5791-chci-ziskat-pravo-editovat-dokumentaci]. If you are not sure about anything, write to the [section Documentation | http://forum.nette.org/cs/f32-dokumentace]. +You must have a permission to edit the documentation, you can ask for it [on the forum |http://forum.nette.org/en/914-i-would-like-to-have-a-permission-to-edit-the-documentation]. If are are not sure with something, just write to the [Documentation section |http://forum.nette.org/en/f35-documentation]. -How do I write? ---------------- +How to write? +------------- +Documentation is primarily intended for people who are just learning the topic. Be aware of that for the whole writing. Text should be written from simple things to complicated things. There's no need to say every detail immediate in the introduction (and especially not using agressive `.[note]` notes), we don't want to glut our reader. -The documentation is intended primarily for people who are only familiar with the topic. Be aware all the time writing. The text must be designed to lead readers from simple to complex. In the introduction, there is no need to say about the topic all the details (and certainly not through aggressive `. [Note]` notes), do not want to overwhelm readers. +Simplicity is appreciated. Whatever you write, reduce it by half. And if you are done with that, reduce it by half again. -They appreciate the brevity. Whatever you write, truncate at the half. When you succeed, then shorten it by half again. +Explainability is appreciated. Before you start to write, try to explain that topic to your colleague (or dog) and then start to write it. -They appreciate the ability to explain the matter. Before you start writing, try to explain the theme of your colleague (or dog) and then just let the work. +1) Learn how to use [wiki:syntax], you can try it in the [sandbox | wiki:sandbox], where you can make no harm +2) Follow [Coding Standard] +3) Use English names of variables, classes and methods +4) Write everything for version of the Nette Framework 2.0 and PHP 5.3 (with the exception for 0.9 documentation) +5) We are using warnings (`.[warning]`) when writing about differences in versions of 5.2 and 5.3 in framework itself (except namespaces) +6) Class names with their namespaces use just in the first mention, then use class names without namespaces +7) Take care of all highlighters, from bold font to `.[note]` frames +8) We use "we" in the text of documentation, and we are polite +9) Perex is a simple trailer of the topic, it's not a first paragraph +10) Try to format your code to don't use scrollbars +11) Layout of the page should be well-arranged, use empty rows between paragraphs, titles, sources, etc. +12) When you are done, visit "Documentation translation status":[http://dev.nette.org/cs/stav-prekladu] and change status from `Translated` to `Translated - not acctual`. -1) Learn to [wiki: syntax], which you can try to [sandbox | wiki: sandbox] where you can not cause any harm -2) Keep [Coding Standard] -3) All write for version Nette Framework 2.0 and PHP 5.3 (with the exception of documentation for 0.9) -4) The differences versions 5.2 and 5.3 in the actual framework (namespace are not counted), we write as a warning (`. [Warning]`) -6) The names, including namespaces, classes give the first mention, then no namespace -7) Save highlighter all kinds, from the bold frames `. [Note]` -8) In the text file rather "myka" and we are polite -9) Perex is a brief teaser on, do not confuse it with the first paragraph -10) try to format the code so that the sliders do not show -11) Source form of the site should be transparent, generous free line between paragraphs, titles, code, etc. +How to make a translation? +-------------------------- -How to create a translation? ----------------------------- +Home page of English documentation is [prepared |doc:en:homepage], you just have to fill in a content. It's now displayed as a translation using Google Translator, so don't be confused. The simplest way is to copy the source code from a Czech page and use it as a base of your English page. You can use Google Translator to pre-translate that source code, but don't forget to change changes in wiki syntax, which were made by translation process.řeložit Google Translatorem, jen je potom potřeba upravit změny, které udělá ve wiki syntaxi. -English documentation homepage is [ready | doc:homepage], it is needed to add content. It is at this point shows the translated through Google Translator, so do not confuse it. Probably the easiest way is to copy the source of Czech site and use it as a basis for the English site. The source code you can leave the pre-Google Translator to translate, but it is then necessary to modify the changes that will make the wiki syntax. +Translation should use simple vocabulary, because it's intended not only for native speakers, but for everyone. -The translation should use simple vocabulary, because it is designed not only for native speakers, but for anyone. +Before you start, write yourself to "Documentation translation status":[http://dev.nette.org/cs/stav-prekladu], to avoid translating something what is already in translation process, or something what is not in a final phase. {{themeicon: icon-art-and-painting.png}} - -[* icon-art-and-painting.png *] From 646b388f8a0e44a239e6a78b97e2c21d76f25201 Mon Sep 17 00:00:00 2001 From: MartyIX Date: Sun, 4 Sep 2011 16:00:47 +0200 Subject: [PATCH 0191/1741] =?UTF-8?q?cs/forms:=20P=C5=99id=C3=A1no=20vyps?= =?UTF-8?q?=C3=A1n=C3=AD=20chyb=20do=20manu=C3=A1ln=C3=ADho=20vykreslov?= =?UTF-8?q?=C3=A1n=C3=AD=20v=20Latte=20(http://forum.nette.org/en/895-how-?= =?UTF-8?q?to-render-form-errors-via-latte#p3801)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/forms.texy | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cs/forms.texy b/cs/forms.texy index 6c2f7fcd6c..747b13a012 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -662,6 +662,12 @@ Když do vykreslování zapojíme ještě [Latte |default-macros#toc-formulare], /--html {form signForm} + + +
      +
    • {$error}
    • +
    + From a45b149a538ba2b28f67eb4cde1fe28cf4a8be48 Mon Sep 17 00:00:00 2001 From: "vojtech.dobes" Date: Sun, 4 Sep 2011 22:07:54 +0200 Subject: [PATCH 0192/1741] =?UTF-8?q?cs/default-macros:=20CSS=20t=C5=99?= =?UTF-8?q?=C3=ADda=20vyzna=C4=8Dena=20jako=20k=C3=B3d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/default-macros.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/default-macros.texy b/cs/default-macros.texy index af089f9c80..9c7b1f8f21 100644 --- a/cs/default-macros.texy +++ b/cs/default-macros.texy @@ -391,7 +391,7 @@ Díky makru `n:class` tohle zapíšeme neskutečně snadno: \-- -Anebo potřebujete označit aktivní menu třídou current? +Anebo potřebujete označit aktivní menu třídou `current`? /--html \-- From 4fbfa51e874dc34fca5a59168857d512c060bbfd Mon Sep 17 00:00:00 2001 From: duke Date: Tue, 6 Sep 2011 09:45:06 +0200 Subject: [PATCH 0193/1741] en/php-language-enhancements: fixes and improvements --- en/php-language-enhancements.texy | 44 +++++++++++++++---------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/en/php-language-enhancements.texy b/en/php-language-enhancements.texy index 1a17b8c55d..6745ef25cf 100644 --- a/en/php-language-enhancements.texy +++ b/en/php-language-enhancements.texy @@ -48,11 +48,11 @@ class Circle extends Nette\Object ... \-- -Whereas the former code executed succesfully (although it contained an error), the latter did not: +Whereas the former code executed successfully (although it contained an error), the latter did not: [* debugger-circle.png *] -Class `Nette\Object` made `Circle` more strict and threw an exception when you tried to access an undeclared property. And `Nette\Diagnostics\Debugger` displayed error message about it. Line of code with fatal typo is now highlited and error message has meaningful description: *Cannot write to an undeclared property Circle::$raduis*. Programmer now can fix the mistake he could have missed and would have a real trouble debugging it later. +Class `Nette\Object` made `Circle` more strict and threw an exception when you tried to access an undeclared property. And `Nette\Diagnostics\Debugger` displayed error message about it. Line of code with fatal typo is now highlighted and error message has meaningful description: *Cannot write to an undeclared property Circle::$raduis*. Programmer can now fix the mistake he might have otherwise missed and which could be a real pain to find later. One of many remarkable abilities of `Nette\Object` is throwing exceptions when accessing undeclared members. @@ -69,16 +69,16 @@ But it has much more to offer! Properties, getters a setters ============================= -In modern Object oriented languages *property* describes members of class, which look like variables but are represented by methods. When reading or assigning values to those "variables", methods are called instead (so-called getters and setters). Now you have access to those variables under your control, which can render itself really useful. You can easily validate inputs or generate data only when you need them. +In modern object oriented languages *property* describes members of class, which look like variables but are represented by methods. When reading or assigning values to those "variables", methods are called instead (so-called getters and setters). It is really useful feature, which allows us to control the access to these variables. Using this we can validate inputs or postpone the computation of values of these variables to the time when it is actually accessed. -Being a descendant of `Nette\Object` gives that class ability to imitate properties. Only thing you need to do is keep with these simple conventions: +Any class that is a descendant of `Nette\Object` acquires the ability to imitate properties. Only thing you need to do is to keep simple convention: -- Getter and setter have to be a *public* method. +- Getter and setter have to be *public* methods. - Getter's name is `getXyz()` or `isXyz()`, setter's is `setXyz()` -- Getter and setter are optional, you can have *read-only* or *write-only* properties +- Getter and setter are optional, so it is possible to have *read-only* or *write-only* properties - Names of properties are case-sensitive (first letter being an exception) -We will make use of properties in class Circle to be sure variable `$radius` has only non-negative numbers: +We will make use of properties in the class Circle to make sure variable `$radius` contains only non-negative numbers: /--php class Circle extends Nette\Object @@ -92,7 +92,7 @@ class Circle extends Nette\Object public function setRadius($radius) { - // sanitising value before saving it + // sanitizing value before saving it $this->radius = max(0.0, (float) $radius); } @@ -109,17 +109,17 @@ class Circle extends Nette\Object } $circle = new Circle; -// classic way with calling methods +// the classic way using method calls $circle->setRadius(10); // sets circle's radius echo $circle->getArea(); // gets circle's area -// alternative way with the usage of properties +// the alternative way using properties $circle->radius = 10; // calls setRadius() echo $circle->area; // calls getArea() echo $circle->visible; // calls $circle->isVisible() \-- -Properties are mostly a syntactic sugar to beautify code and make programmer's life easier. You do not have to use them, if you do not want to. +Properties are mostly a syntactic sugar to beautify the code and make programmer's life easier. You do not have to use them, if you don't want to. Events ======== @@ -143,7 +143,7 @@ class Circle extends Nette\Object $circle = new Circle; -// adding event handler +// adding an event handler $circle->onChange[] = function($circle, $oldValue, $newValue) { echo 'there was a change!'; }; @@ -151,12 +151,12 @@ $circle->onChange[] = function($circle, $oldValue, $newValue) { $circle->setRadius(10); \-- -There is another syntactic sugaar in `setRadius`'s code. Instead of iteration on `$onChange` array and calling each method one by one with unreliable (does not report if callback has any errors) function [php:call_user_func] you just have to write simple `onChange(...)` and given parameters will be handed over to handlers. +There is another syntactic sugar in `setRadius`'s code. Instead of iteration on `$onChange` array and calling each method one by one with unreliable (does not report if callback has any errors) function [php:call_user_func], you just have to write simple `onChange(...)` and given parameters will be handed over to the handlers. Extension methods ================== -Do you ever have to add new method to an existing object or class at runtime? **Extension methods** is just what you need. +Do you need to add a new method to an existing object or class at runtime? **Extension methods** is just what you need. /--php // declaration of future method Circle::getCircumference() @@ -170,7 +170,7 @@ echo $circle->getCircumference(); // ≈ 62.8 \-- -Extensions methods can also take parameters. They don't break encapsulation, because they only have access to public members of class. You can also connect them with interfaces, therefore every class implementing that interface will have that method available. +Extensions methods can also take parameters. They don't break encapsulation, because they only have access to the public members of the class. You can also connect them with interfaces, therefore every class implementing that interface will have that method available. Reflection @@ -182,7 +182,7 @@ If you need to find every information about any class, reflection is the right t /--php $circle = new Circle; echo $circle->getReflection()->hasMethod('getArea'); // does method 'test' exist? -echo $circle->getReflection()->getName(); // returns class' name ('Circle') +echo $circle->getReflection()->getName(); // returns the name of the class ('Circle') \-- Even in this case we can make use of [property |#Properties, getters and setters] conventions and change the last line to: @@ -192,7 +192,7 @@ echo $circle->reflection->name; // returns 'Circle' \-- -Reflection can obtained without direct relation with `Nette\Object`: +Reflection can be obtained without using `Nette\Object`: /--php // getting PDO class reflection @@ -206,7 +206,7 @@ $methodReflection = new Nette\Reflection\Method('PDO', 'query'); Annotations ======= -Reflection has really a lot to do with annotations. They are written into phpDoc comments (two opening asterisks are mandatory!) and start with `@`. You can annotate classes, variables and methods: +Reflection has really a lot to do with annotations. The annotations are written into phpDoc comments (two opening asterisks are mandatory!) and start with `@`. You can annotate classes, variables and methods: /--php /** @@ -224,14 +224,14 @@ class FooClass } \-- -In code there are these annotations: +In the code there are these annotations: - `@author John Doe` - string, contains text value `'John Doe'` - `@Persistent` - boolean, its presence means `TRUE` - `@User(loggedIn, role=Admin)` - contains associative `array('loggedIn', 'role' => 'Admin')` -If class has an annotation can be checked via `hasAnnotation()` method: +The existence of a class annotation can be checked via `hasAnnotation()` method: /--php @@ -250,7 +250,7 @@ $fooReflection->getMethod('bar')->getAnnotation('User'); \-- .[caution] -Previous definitions are rewritten with newer ones, sou you will always get the last one. +Previous definitions are overwritten with the latter ones, sou you will always get the last one. All annotations can be obtained with `getAnnotations()`: @@ -280,7 +280,7 @@ $callback = callback('Helpers::myCallbackMethod'); What are the advantages? - it is obvious it is a callback -- checks if it is a valid callback +- checks whether the callback is valid - unifies behavior of older PHP versions (< 5.2.3) which do not support string definitions 'Foo::bar' Callback can be easily invoked because variable `$callback` stores instance of [api:Nette\Callback] From 025dde553a3a86ed12a52553145781ee2278703c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Tvrd=C3=ADk?= Date: Tue, 6 Sep 2011 10:13:24 +0200 Subject: [PATCH 0194/1741] en/default-macros: minor fix --- en/default-macros.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/default-macros.texy b/en/default-macros.texy index 1a8bfcb6d4..7a56feac4d 100644 --- a/en/default-macros.texy +++ b/en/default-macros.texy @@ -394,7 +394,7 @@ Or do you need to mark the current menu link with 'current' class? /--html ---/ +\-- Amazing, huh? From 85607d798da9ce89e287d6e39544b7c1f96eb92b Mon Sep 17 00:00:00 2001 From: duke Date: Thu, 8 Sep 2011 13:34:30 +0200 Subject: [PATCH 0195/1741] en/images: assigned -> intended --- en/images.texy | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/en/images.texy b/en/images.texy index 3d02c8a4bd..efe35655ae 100644 --- a/en/images.texy +++ b/en/images.texy @@ -2,12 +2,12 @@ Image Manipulation ****************** /--div .[perex] -The class [Nette\Image |api:] is assigned for basic image manipulation. It simplifies the basic operations, like image resize or rename. +The class [Nette\Image |api:] is intended for basic image manipulation. It simplifies the basic operations, like image resizing, sharpening or sending the image to the browser. \-- -If you want to manipulate with images (like diminishion or sharpening of images) in PHP you must write an unreadable and unintelligible code. And it would not be Nette Framework to come up with a better API :-) +If you want to manipulate with images (like scaling or sharpening of images) in PHP you must write an unreadable and unintelligible code. And it wouldn't be Nette Framework if it didn't come with a better API :-) -Initially we will load the image from a file: +We can start with loading of the image from a file: /--php use Nette\Image; @@ -15,7 +15,7 @@ use Nette\Image; $image = Image::fromFile('nette.jpg'); \-- -or we can create new blank image, with size 100x200: +or we can create new blank image, with size of 100x200: /--php $image = Image::fromBlank(100, 200); @@ -27,10 +27,10 @@ Optionally we can set the background color (default is black): $image = Image::fromBlank(100, 200, Image::rgb(125, 0, 0)); \-- -And we will write it's size: +And we will write its size: /--php -echo „Image size is: $image->width × $image->height"; +echo "Image size is: $image->width × $image->height"; \-- @@ -39,13 +39,13 @@ echo „Image size is: $image->width × $image->height"; Image resize --------------- -We will diminish the image proportionally in a way they will not exceed 50x30 pixels: +We will scale down the image proportionally so it won't exceed 50x30 pixels: /--php $image->resize(50, 30); \-- -It's possible to set only one dimension and the second one will be calculate: +It's possible to set only one dimension and the second one will be calculated: /--php $image->resize(50, NULL); @@ -59,7 +59,7 @@ Any dimension can be also set in percentage: $image->resize('75%', 30); // 75% × 30px \-- -In the mentioned examples the image is only diminished. Possible enlargement will be allowed by the directive `Image::ENLARGE`: +In the mentioned examples the image is only scaled down. Possible enlargement will be allowed by using the directive `Image::ENLARGE`: /--php $image->resize(50, 30, Image::ENLARGE); @@ -77,14 +77,14 @@ Both directives can be combined: $image->resize(50, 30, Image::ENLARGE | Image::STRETCH); \-- -If we write one or both of the dimensions as a negative number the image will be flipped (horizntaly or verticaly): +If we write one or both of the dimensions as a negative number the image will be flipped (horizontally or vertically): /--php -$flipped = $image->resize(NULL, '-100%'); // flip vertical +$flipped = $image->resize(NULL, '-100%'); // flip vertically -$flipped = $image->resize('-100%', '-100%'); // rotate 180° +$flipped = $image->resize('-100%', '-100%'); // rotate by 180° -$flipped = $image->resize(-125, 50); // resize & flip horizontal +$flipped = $image->resize(-125, 50); // resize & flip horizontally \-- @@ -104,17 +104,17 @@ $image->crop($left, $top, $width, $height); \-- -The reduced image can be inserted into an another one (so-called watermark). +The reduced image can be inserted into another one (so-called watermark). /--php $blank = Image::fromBlank(320, 240, Image::rgb(52, 132, 210)); $blank->place($image, 0, 0); // place into a position 0px, 0px -// coordinates can be set also in percantage +// coordinates can be set also in percentage $blank->place($image, '80%', '75%', 25); // transparency is 25 % \-- -Nette\Utils\Image simplyfies calling of all graphic functions from the GD expansion, for example [php:imagefilledrectangle], but with the usage of more understandable object approach. +Nette\Utils\Image simplifies calling of all graphic functions from the GD extension, for example [php:imagefilledrectangle], but with the usage of more understandable object approach. /--php $white = Image::rgb(255, 255, 255); @@ -144,7 +144,7 @@ Alternatively the image could be saved into a variable: $binary = (string) $image; \-- -or you can send it directly to the browser with the setting of the applicative header `Content-Type`: +or you can send it directly to the browser with the setting of the according header `Content-Type`: /--php // send it like image/jpeg @@ -155,7 +155,7 @@ $image->send(Image::PNG); \-- -Such API si really pleasure to be used! +Such API is really pleasure to use, isn't it? {{toc: title}} From 703478a36f5723983e6212fd783f34e73c4dbfd7 Mon Sep 17 00:00:00 2001 From: Pajka Date: Fri, 9 Sep 2011 22:06:24 +0200 Subject: [PATCH 0196/1741] en/requirements: created --- en/requirements.texy | 48 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 en/requirements.texy diff --git a/en/requirements.texy b/en/requirements.texy new file mode 100644 index 0000000000..24517669d9 --- /dev/null +++ b/en/requirements.texy @@ -0,0 +1,48 @@ +Nette Framework Requirements +**************************** + +.[perex] +You will need **PHP version 5.2.0 or higher** to run Nette Framework. Also, your server will have to comply with required configuration of PHP. + +Requirements Checker +==================== + +Requirements Checker is bundled with Nette Framwork, so by downloading framework you will also get Requirements Checker tool, which checks server configuration and tells you, whether you can use this framework or not. + +First, download and extract Nette Framework. Copy `checker.php` and `assets` directory from `tools/Requirements-Checker` to your webserver. Afterwards just run the script from your browser by typing url to checker.php script (in example http://example.com/checker/checker.php). Now you will find if your server meets minimal requirements. + +Green message with "Congratulations!" is self explaining tells if you can use Nette right away! + + +[* requirements-checker.gif *] *** *Requirements Checker's final verdict* .<> + +|------------------- +| Requirement | Description +|------------------- +| PHP version | You can use either 5.2 or 5.3, but 5.3 is highly recommended. +| .htaccess file protection | Checks if you can dissable access to protected folders +| .htaccess mod_rewrite | Checks if you can use mod_rewrite for [routing |routing] +| Function ini_set() | This function is required for security purposes +| Function error_reporting() | This function is required for security purposes +| Function flock() | Needed by [cache |caching] +| Register_globals | Dangerous configuration directive which needs to be turned off +| Zend.ze1_compatibility_mode | PHP 4 compability, must be turned off +| Session auto-start | Has to be turned off for security reasons +| Reflection extension | PHP extension required by framework +| SPL extension | PHP extension required by framework +| PCRE extension | PHP extension required by framework +| ICONV extension | PHP extension required by framework +| PHP tokenizer | PHP extension required by framework +| PDO extension | PHP extension required by [Nette\Database |database] +| Multibyte String extension | PHP extension required by functions `Strings::lower()` & `upper()` +| Multibyte String function overloading | Dangerous PHP configuration directive, has to be turned off +| Memcache extension | PHP extension for [caching |caching] +| GD extension | PHP extension required by [Nette\Image |images] +| Bundled GD extension | PHP extension required by methods `Nette\Image::filter()` & `rotate()` +| Fileinfo extension or mime_content_type() | Functions used for MIME-type detection of uploaded files + + +.[caution] +You should delete Requirements Checker after using it, because it prints information about PHP configuration. + +{{themeicon: icon-setting.png}} From 93e3dee445bfee4b538bf4e08c66269294c29c53 Mon Sep 17 00:00:00 2001 From: duke Date: Sat, 10 Sep 2011 09:35:04 +0200 Subject: [PATCH 0197/1741] en/vulnerability-protection: fixes and improvements --- en/vulnerability-protection.texy | 8 ++++---- files/icon-communication.png | Bin 6791 -> 6671 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/en/vulnerability-protection.texy b/en/vulnerability-protection.texy index b3e967f9b4..dbb6ff3e3a 100644 --- a/en/vulnerability-protection.texy +++ b/en/vulnerability-protection.texy @@ -3,7 +3,7 @@ Vulnerability Protection .[perex] -Every now and then a major security flaw is announced or even abused. For sure that's a little bit unpleasant. If you care about security of your web apps, Nette Framework is frankly the best choice for you. +Every now and then a major security flaw is announced or even abused. For sure that's a little bit unpleasant. If you care about security of your web applications, Nette Framework is frankly the best choice for you. Cross-Site Scripting (XSS) @@ -43,13 +43,13 @@ Cross-Site Request Forgery (CSRF) Cross-Site Request Forgery is an attack based on forcing a user to visit the attacker's own webpage, which silently executes a request on a page the victim is currently logged in. It's for instance possible to edit or delete an article without the victim realizing it. Protection against this attack is generating and verifying an authorization token. -Protecting a web form agains Cross-Site Request Forgery in Nette Frameworku is a matter of this oneliner: +Protecting a web form against Cross-Site Request Forgery in Nette Framework is a matter of this oneliner: /--php $form->addProtection(); \-- -That's all it takes to protect a web form. It's strongly recommended to use this verification on login form and in administration. +That's all it takes to protect a web form. It's strongly recommended to apply this protection to the forms in administrative part of your application. URL attack, control codes, invalid UTF-8 @@ -65,7 +65,7 @@ Session hijacking, session stealing, session fixation Session management involves a few types of attacks. The attacker may steal the victim's session ID or forge one and thus gain access to a web application without the actual password. Then the attacker may do whatever the user could, without any trace. The protection lies on proper configuration of both PHP and the web server itself. -Nette Framework configures PHP automatically. Developers thus do not have to worry about how to make a session protected enough and can fully focus on what's key about the application. This requires the `ini_set()` function to be enabled. +Nette Framework configures PHP automatically. Developers thus do not have to worry about how to make a session protected enough and can fully focus on the key parts of the application. This requires the `ini_set()` function to be enabled. {{themeicon: icon-communication.png}} diff --git a/files/icon-communication.png b/files/icon-communication.png index 152c9b5131552ca7242b40a154fe3fadb6b02373..b023375c6b741a975cb1393f586c4e87003925c1 100644 GIT binary patch delta 3992 zcmV;J4`=X)HIFnQiBL{Q4GJ0x0000DNk~Le000120000{2nGNE0H={Uaj_wv3V%9D zL_t(|+U1>pj2!1#$3M?Ivp;U{&iBLih1gE)G)~$ylr-m%l+q$W+mKKxq^U%dmR1NP zNCbq^loSalp-oX-Ayo~E8u$ZB)haY8q(CHol}a>%Rv?-*A*~fVQAzBxW5;*v`?0@f z=6(2MX7^@iXLo1!_Rc={l~y}D^MB6H?B{*n@AEwGy!W0w|HAheq)6*sVmrcZk@i{= zKcVBC#P^C^0Zd1)cLAOtUbH=nV2$KiY&_3XXYQnE#*<%>1O5$I1l;KT>%b)NZH6eS z@egfpnTpHSmLhNs@DAW$^nQ)Pm{?F0RRxKDMC{iI1|`6^KB|IMkCc{rOMlc*u?B9L zLlt-dcnNqK_)p;bKy9;r>}JE=3)}(R1l($27FEP5HUg(8#bNor0MD*rt;N&TF~Qt`aD!m(4516a z|3#MlHQ=9tr3)2q5qKZ)UVq>Yt2!nYtSXA7SSXUq=O`2kOq5Evxg5Ei8|#J|vqo)~ z7zx4ozK>#2Y^Vj!SoU1OFBK`3N)!u499K})=oJF={m|+pU4Mro$m>?=+ZwN} z9c9d&z%hoLnT$1rl9O=+7ZD-vOtc!oViC>ZlEZbzz?D!k)Kc}A@pP4%zl0U0~Sx&Gd* zSh4s)gTPb?EYw-;@P9%YgDqmnIVEy3j*&b$8KdA#p=zT>hJu--zz!zeeFR#k7M!E% zpCQottcZy~^IhN};IB6m?wf(f6|S|`qSi7wwS$RLiOIkQ6gAddjQ27GnYaNnlzEmcKC**P=Ij;TqE0c#b{^IHIokrv4AFf|GY zlA&Dkcno5*GYk?FA+4yPd5OUKRP5`(8MI+>Op&6Qp=hRXObN9X!BCW0#`3#q*i|aQ z34E>33g(IQfPXRxcc7c3j)I$aII!mGX=#cC3<^0bXb`cjaBk~Ln9QsN3&fI-O^^kYD0D=%9b9+F$?n}xV>OZA zM{;91uYV;F1h{M)c!)^=9-3(dC0=XZ^v^o;zzigK>xGXdyAsrTG z_V6oN$0{Ip8)@#KC6;TCBx0BhEmanJ!EArJ&|i&z%=IkUm6xtGNz;@noWpclU^q(jbb&E1YCt$N*Z zb=$-YBa?;f`kO^#HTAj@j{<-AWMQMuEFE@dh<8zs=k`y3(;Zfps6e~+6x#}Nw~6KE z%|zzPzE-gWV0)*(X(0Q7PSe;_hX$>|n|}))?o$0&=E~LJEOW&}6x~U3#ziey4LTx* z?)sYrbRUOy9>*4}23Yk7RH^!_{o#K3rCT$9`M5hpJqWmJ`kma!2RXR&XP78Wp#k_- z32Y-A1CWhH1s9S-v+Cmo9$o;`rD-mkcn4R{+>Vj{v4A_3+dY`6yYTADfAI1%Pk+-0 zV9(TkuD|q74(|SG_V1n#CBs5s!P1Drwk!#QbU4b+y3MB_n`gPcZD4IcpwRGP-}C|A zy6+dbe&3z!+HpCj7S2(vuZA-v`$h{x+@zsE!GVGU<;nv8`r>E!rz4-C9>AOC4srGF zcd=*3bzC*~PV)Ie>rs3V@$qdVvwyY5Ve1G7ZWJZ39@YjZp)u5bc=M$MZlJAVZ(pLr|$ zXAUtvc7T1;^BkBv6n=ly^8(+a=GWJaN(|U=VoIjDVx#U}M)KsHaJvZ9{8dhrpXZgu zXIq2azJ;+|fdjMG)9}~0cF%2iL5*GG2iZMw5Y+(RHn{SVw{^%vDL=zn15~RW*A8M9 zU33dvG5h0qL4^am-cG@pWPj(x8`wF11^cG2#myC4AeC^IX1!id8BT5QT{fIXooUXE zyV-8nU@&5Eom_`yy|VaU030tr*B;BpV6~6$LL-1b`nmt6(pYQ+}p9gAiL zd!FGA>4>8H^@4iGSZ~&GkzQTD*LAHGtXL!?VV7+N7wzADGoL(Ef0OK*yIn1}Ta3J! zt=W==3tw}GhuazFY9iqnWh1sbG%GfHD7HOiK?i~|Iv1=z1hNo&%p-@c zvanT_+BM+F8j5X8S%2s;sJ^KVEt>U{HAmZ?4lQ-CT)PDR!#S_?;m0UTvvLv3f($Ps z8&!k>WnrMJ=Pn3Yu$s}K$d=* z%G9jA0A!)vvu#S;{gE%niJu0=|zDF06B& z9olAQX6<^tw0~3%qXgw%OE$0W4s&lJJZ>!y5H7&B^%;++l=1I_KReC(gGlY-TY=s8nj4JGYGEI8{Y&9^`!Y(yQ8&u9HW-tkSTcmV1ED zZ@uNVFJ{s1H)Lc|;02b~PM^kc9DpBVz@-V@Pu_B>ZGXq3FI~n$1ULieM^*Jbgi8u; z5nSyPW{u!EnFyXAaAIKr$2cf@haj0}EFPM_K0W=t`^r~4K=*FYe zG#V_NJk_+=JAfy%0u|O5p6fZb&;*?U^80m*0Bd64W|YNs9Lg)poPB)}H|I7j_Q^qj z4m@y^gntZh@|f2N816BuR*WqSBN4_JtbZ!69$%o*Xf*Zp5#VF-sNm3{d5jF# zfFtW*fBM2+7GCl>b<~T`r+pL3*GHKuFIQ^(#cwRIT3sFL{N`Bfnb%)uWn~p7mqXx$ zz`KDXNH`2WKYs|<*M#!0sK^-~VX1VuAJCnB0KC}04pZS;S?D&-V_*&V1 zd_#~2oEsKes!}eOSt^&C3wl=PF1h6JnbW5a&(F`-FowJ%BLTW8vXHfW_@UY2*p#`y zwrqdb+QA_&S8Dv_y(d_ytn{!_5DB~gQh&KjxqJ?cA?G;E&CNZ2>eQ*b-~JOfEp7I1 zmGkx8xBd3i*pFQ4-tX1y{hlXdSuJw8QsWE1l?Hcxpe68?vrCJttgPU=E`_nN>eS@q zKOQ@F>{oBS<>tk$8nKWKp3_{;$8`BjpJTy|KVKTV_NR)!k}JsX*H-LIzh`vIm4A8& zx4P06iWy@F0-x8AS|K&EdwHPIr5@w_K_7S06dfa%BY(!7+wft-+bIXK6I* z6bc1OrSV#$QGev{;fEf2;_efC=}Q+J$>$l=b!t7 zhd=kZC%^g4f3Fh$cax?SYRpoD*#7uFjn(T0I(aO)(06hn@HUXiZBjrw34h2YQP-p# za}uA^Ud=jnpnS_cJ3hSUD)(cJI+KAH-t$Ve&cnZaj8|X#0RogtB~W|p``A^L%S^qYbh zOzi_ZtuZtOct7cAjonEfjZKpWlVZ_nl3;r5PuA(yc+GQbz{+hOo%&#YSN*jG>SS_ivI!wrH$dI?rF{0`IiBL{Q4GJ0x0000DNk~Le0001F0000@2nGNE08l}}s<9!T3V*Um zL_t(|+U=ZsY+KiT$3MSwNs5$YOO{4YswhJv4i?du7YgWsBDaN!L6aDTyDX?OL{E zS)?w>d(Urw+)Ih1?&U)wWn1pCkAHX{=N=yZzUTXUoX3?1|6w~~KqSb>^0A22omY>m zNeC{AR6h-ZAeivjAmSima7dt7L=qTr5OFX#w}E^f^c?VMOJx>nzMzAYFnyd|_%R97 zS9kr)7U9c}mpHSf!+Lf3Q-eRt*Q=*>WdPNcWg^Q_SAptsnFNrjj)c@~o;iS@8?JBXbKkZ~rhU zGr-QxKac0TsQP{<%t%NdXMYx6Cgp5mqonm>NZR6036k}!%eMZTxn=vWvsj)%v80?q z6pLcpt}y9jI9Gg?lrz9aO6vhgTGdVg*@|`9)_)T>ZTnT+$}Gk5IWoy@c;aH!$Ex49 zM|HmV21(P;MoVTrz)-c>ioeL#%mjP4evndSjzw>l7fwF`2o>vsDu1fBWi}+4b5D>k z88%`vJp}_hrPyr6E;5q2p50r13D=wFg8LRPp8iW50iP1SmQb-vYAY@qli*S%*ReNc z=Coy7fyaT@fk(pg4F$+pzzofLzRPg>dTtngKd!&POyPB2J@>a5Nr5V!b@8l=+U5)q z92UxFaU|7ILq=zngMWY0&)BqG4#-yKmr(9Q*^BZ=C{vdU6w?zhuv3a=J#`sM@8pKz zyC~ZN=ZnXfn*A4&PJh_r9X#K~^UKhLAtHuF?>vqqSJj|>Z~7ekLO)|~#ySmq8_u&p z4j8-I0U1+tO3{p`E}K(Xb`JdlWv{@6;xunv{CAR02E}6W$bTfa;rni&vd~B{5W)2> zVq|UpM-`OO3)+k+wRt3D%DRG*=(d^yGM+6ll6fa%gLhK#3e1=DoV@sazznrvTw<}d zLWMHMI!mglE`-ET@e3Gny3)YWS;fry=$5wY%K%fr1dzX)7%~Pr1)A~fB0C1(#rA<) z@YH3lbevQ3&wrD2GAp{E;^X@zd|Rp?xkC{FPhCX1N8;;dEeF3iNOsC^mnEQN){`lw zJIv52Rn1gORaa!I7GEp)T5h-po~rEAcU|d#+*M_UZ(ZIoa0~s(5iCCWOFy7cK7UKXq$0bW0HTVuB|N_r4(ls| zqIluZes9v~tm4erPFPZ9%5%W}D;1Faiar+@@Dd}Lo5&=FvFdaB(vK)q&LQH2#(L#H zi{fMPw1Tgd>h*#}p@(1qTzA28@XLdYo{u%~&!ZfRxp%mipsd!Y?*|S8_*!Ob-)_>$ z&4A@>;eQoe??OwjNC1&QWmPA-fIkH8>A{drAMiK8QQ*4(qZfjavlzwY0Q*8Um5sQ6 z7?=c(TnT_Ifnn8WBt1bYF@WN8t}so>&b95Ls)Dr@L?rOC@OJ<^bk#qn{>i18%s>%* zF1(xrCJ@}@c?;1VR|12JvJ>S{DExH+MLL|qt$zW-vMqBXA}J7M-aSRx77(1ag_kgC zMlv^I)#6!qX?|F$XhmvNsnfR_b%8|=4g}Xo0pQ!q5$&3f}N}0Lh39R}ZfU(SwY5=%AJ{6jCvl4)1 zAb%tph=wxBM4F5lW+1thvkR}(GIuY+*ysh#H`7~qOYJz&f+=4I9#~J6wO>Ope0;W~ zvq5MlJ{JqQFrYJZrfLM=mN;L0J3=DTW)005s4AqKH0k6J3Db{n%e4jWSLGoq@pvF$ zWU1pH(0Hc&E^r-iU_AhNNR@}H(e+UJI)A`oMVT+0#;RSliyGLFQcpdqitn;envII~ z4_M_Pu@*Gm*|Z)=VhObasK$XZ8LGB5fzrzDJ%sWw3Raa(eOp6jSS}XMqE-==PW}0Y zEIrMl27?pz-KDd`rZpL>wzLMwP({%Ml%4=`NL43QgScQ*dI*a}#p6<82DLUa`hUJ! z^2H35Z+~*0Gn-AzPGifKdQ5l#WiqDxnm|d!gAveDMCeZspklGsa%o{cG~T@p-g=p= zf$TZ|_L*JIelyBozMPZmO?Db1)#C?#IVNeOO#901nF4ovcE_BV&d4 zwDnsAyt2h4%?ePIrl33v+zq&^RexEBmZ*r3?(YNju)d|ZPz;RUn(W2Zn?-3 z#Vu&iBP<&#iG|af!J?X9d3ccV zxBXsVo(CpS79$LOwwa+fz<nXtEwMSRjeN_KG16?-}#ouFF!cI_zBxXP=XF0p}sEAuy~^C_8wNt*VV$cnD2bk z=kCw;_YM?gLY2h`mS(hJMN4fQ@_;IbuLV^VmEV2b=L4VVXZ)mHZ-1Lox6G(9Qa^xl z_*#v|f9|-?2RwTfE>GEBYk;&$FN`@n^DUR$ zfCMqKWhsCbz}B3Dt$+Ss2F{Y!;QMcBsQOs58N(wQKNN6HC(|b^oG4S+YA|Y+6@M5= zn{W&kSvCqrq}FPW05?Qb{eP{da5pk2vAcfq!}0TW`7MTLK0C+MI};cQ19xeN;%l$V ziU@x!CW;4mxScumjS9-Qqb?r3KEZ!{Zl1;A7&{`u)QziN$A32#+K(tOp2F~>c56PO zs*@YarU>7uGuA^we%SErAI~%0YgXB+~L_r7I23R)7Lw__{ROJ8Yj1$zyuP!QlwMvZ3IwqBJ8t1p~tFZ2os zs9Aa&!;HF--+$F8!y_nrP+pFq-&)dXgp+iCv9&|6!}dG5Ve_PsKt=uM7Zz}b4AbL1 z1VdYZA@#%XtNr0q8Vm(Ybs3Z|8N;JdGjh41wQt_ZZ5F=&=mPHMpspSQ(Habio)cM1 zPt0rlM9gZ_fLDP;Dj4)z3dD9ffgrm8%JiLX_p&)Mt`swXFW_1epwP>$5*yGjQfX9MyScH3;J=_glo$tE(5^xLf(oGKE|KdVz zuYNi-g1t^tz=~Hzi4m-8X|l+_88Z&k#=^O78PAX@+BHyen}p~7Y=P;WPAwni*U1x` zkLo1WwSUbP-yRBAokW8n?X6<$<~G+nkX0qutvQPF&}DkzU5u(~vcRF)hMu;V(QSrQ z(=0Hd@x#k)C#yuQn@V05Fc54xc9C3Hn9(ah0NilOa!sJ9FQf`Sx~WcKzg)HZU2Ja& zcyH6Th{l4UXe=0lbY-!1cR*PqQ+8gm-2Tx)j(;91a&mA<8XxJ2Pt{`myY+%0^$wUZ ziL7ojXyW?YQh2^a{hA4?aI(t!RedhOPANZ7B`060tP4|iUR3&u76zSO>7tgaGGk0f z^G%>@*qNKSZ~Rop5B+svoRhCqIQipBPnoiF!E)=tL0){i$cX{zJ{TS?S0Y-k&h<$H zFMpvcUgxxCW~@nN9UM3Tz>{<1oP4!{Dx8XEjSK8lZQ84vfTE;|76zPk2Se&Ngr=cs z$7;!p-D8R6z1*gzEj81OYqBA~IecR2_=%s4lY6bqsn=qGIiOZM24&YJpI`jU5YHSg zLjT%XGJVF!mP0{kE5~99v~&xWPf83kc7KnBBHrmBzkP1~jQU5n2jG0;%q~v760jz> z5}X4qn6koj-toZ93RWS1tP;Lg5!A+l@+sg;)suJKo#78|%XPh7`qgc`@x!|9*wJrtXs)If34eyq z^Huc*Fp+g&M*_KjX4TqsUDDU4c9DOrME(u0>cy=9MT8Mxc64`=9TN#Y@w2&}wWk4; zMnL`tcz;VUAdkSF9ZtaQ9SP)jX4cfMb>B++*sEFcuX~)Hs-Vip(eR}(!u{F3$)`ql z_ZEmcP#z1_*GfR92$t%MG-Jk|9e)mtC6EVZy4I%4wzv5!FK0PDE)OA|a&j^>IU@45Afg*@N5)Kftu)=9_`5e{{FPJcx7U^*85 z%6clze!x(l=Ktxqz4_knE*3+1X+wRrb?KD=h&1_>m~&|mx-`kP!fyp!91zkV$m)4; z9KjF)hWa`EmH(~W`lmH7X=3n;OA64L#gMl&J;E zX##5P4>wJ~&^UoM;voW?Gk=`<)H9`h-+ZlNsGrBL-Qlh=*PV#(YKuvo0Ad<+cCDak z=(V-iqClt$xey775O+8ZcX(HNCt5R%DuZ_yC2X8xYgVo@LWrO{kx$hs{JOA!2 zFA1a~>Y$;HDogzckZRk|*s<+uy{twsI$=Yj&>KNAF}V>8(@@@N0DmXZ&{1qSgjg#$ zuSPi4WB+|)&ir3}c;IQN*goILsgHfH_*>sQ?mIQT+K&O1@E$c~XaGhVgl`)h61x_+ zx0$+%V@adRF%8$E0Bd9b4J?Ucg+%D=D78{6NE;r{)s!7*5H3xCurW-qF`zV6The7? z-i|GaV^k;QHO9yjGiHt(WrRD;wv95h0HLLE?`B}wuA3_nZmelj*rrL_B}Pxj2_w!c zYIFo>^LW*s)#Z%TB}Q1L$u-)z*Lg4)4OmocVOucor$Z-eZ1)xYI-UOqQ0m(9U-?2n P00000NkvXXu0mjfZyeg? From e03eadabbb29fa96ba9969adefd1ac648d80d227 Mon Sep 17 00:00:00 2001 From: duke Date: Mon, 12 Sep 2011 20:25:16 +0200 Subject: [PATCH 0198/1741] en/templating: fixes and improvements --- en/templating.texy | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/en/templating.texy b/en/templating.texy index a5070d639f..3d4151dfac 100644 --- a/en/templating.texy +++ b/en/templating.texy @@ -13,7 +13,7 @@ Templates are a tremendous feature of Nette Framework which eases your work and \-- -Although PHP is originally a templating language it doesn't suit to write the templates. Lets have a look at how to print an array `$items` as a list in PHP: +Although PHP is originally a templating language it isn't suited for writing templates. Let's have a look at an example of PHP template that prints an array `$items` as a list: /--html @@ -54,7 +54,7 @@ Macros You can find detailed description of all the default macros on the [extra page |default macros]. Furthermore, you can make your own [#user-defined macros]. -Each pair macro, such as `{if} … {/if}`, that holds upon one HTML element can be written in [n:macro |#n-macros] notation. So, it is possible to write the `{foreach}` macro in the same manner: +Each pair macro, such as `{if} … {/if}`, operating upon single HTML element can be written in [n:macro |#n-macros] notation. So, it is possible to write the `{foreach}` macro in the same manner: /--html
    {label name /}
    + + + + + + + + + + + {foreach $tasks as $task} + + + + + + + + {/foreach} + +
     SeznamÚkolPřiřazeno 
    {$task->created|date:'j. n. Y'}{$task->tasklist->title}{$task->text}{$task->user->name}hotovo
    +{/snippet} +\--- + +Poté jen upravíme signál `markDone` tak, aby při AJAXových požadavcích neprováděl přesměrování, ale nechal zaslat opravenou +tabulku: + +/---php +public function handleMarkDone($taskId) +{ + $this->model->getTasks()->where(array('id' => $taskId))->update(array('done' => 1)); + if (!$this->presenter->isAjax()) { + $this->presenter->redirect('this'); + } else { + $this->invalidateControl(); + } +} +\--- + +Metoda `isAjax()` třídy `Presenter` zjišťuje, zda se jedná o AJAXový požadavek. Metodou `invalidateControl()` pak necháme +celou komponentnu (a tedy všechny snippety v ní) zneplatnit a pak se pošlou klientovi. Pokud metodě uvedeme jako +parametr název snippetu, bude zneplatněn pouze uvedený snippet. + +A to je vše. Pokud máme správně zavedený dříve uvedený script a správně upravenou šablonu, bude nyní označování hotových +úkolů probíhat s využitím AJAXu. + + +Přidávání úkolů +*************** + +Nyní by bylo vhodné upravit `TaskPresenter` tak, aby i přidávání úkolů probíhalo s využitím AJAXu. Stačí jen formuláři +přidat třídu `ajax` a pokud chceme formulář nechat jednoduše po odeslání vymazat, obalíme jej také do snippetu: + +/---html +{var $title = $taskList->title} + +{block content} + +

    {$taskList->title}

    + +{snippet form} +
    + Přidat úkol + + {form taskForm class => ajax} +
    + {control $form errors} + + {label text /} {input text size => 30, autofocus => true} {label userId /} {input userId} {input create} +
    + {/form} +
    +{/snippet} + +{control taskList} + +{/block} +\--- + +V metodě, která zpracovává odeslaný formulář, provedeme podobnou úpravu, jako u signálu v komponentě `TaskList`: + +/---php +public function taskFormSubmitted(Form $form) +{ + $this->model->getTasks()->insert(array( + 'text' => $form->values->text, + 'user_id' => $form->values->userId, + 'created' => new DateTime(), + 'tasklist_id' => $this->taskList->id + )); + $this->flashMessage('Úkol přidán.', 'success'); + if (!$this->isAjax()) { + $this->redirect('this'); + } else { + $form->setValues(array(), TRUE); + $this->invalidateControl('form'); + $this['taskList']->invalidateControl(); + } +} +\--- + +Tentokrát však invalidujeme konkrétní snippet (`form`) a celou komponentu `taskList`. Také vymazáváme odeslané hodnoty +ve formuláři pomocí volání `setValues`. Prvním parametrem této metody je seznam hodnot, zde prázdné pole, druhý +říká, že chceme u neuvedených prvků hodnoty vymazat. Pokud bychom tento parametr neuvedli, Nette by jen +přepisovalo hodnoty prvků, které jsme uvedli v poli. + +To je opět vše. Nyní by i přidivání úkolů mělo fungovat s využitím AJAXu. Pokud to zkusíme, zjistíme, že by možná +bylo vhodnější nemazat hodnoty v celém formuláři, ale ponechat v selectu hodnotu vybraného uživatele. To zajistíme +jednoduchým upravením volání `$form->setValues()`: + +/---php +$form->setValues(array('userId' => $form->values->userId), TRUE); +\--- + + +Flash zprávičky +*************** + +Všechny komponenty se sice aktualizují, ale nezobrazují se nám flash zprávičky. Řešení je opět velmi jednoduché: +stačí flash zprávičky obalit do snippetu a ten ve vhodný okamžik invalidovat. + +`@layout.latte`: + +/---html +{snippet flashMessages} +
    {$flash->message}
    +{/snippet} +\--- + +Invalidaci můžeme provést v metodě `beforeRender()` v `BasePresenter`u: + +/---php +public function beforeRender() +{ + $this->template->taskLists = $this->model->getTaskLists()->order('title ASC'); + if ($this->isAjax()) { + $this->invalidateControl('flashMessages'); + } +} +\--- + +Opět hotovo. + + +Závěr +***** + +Jak vidíte, je práce s AJAXem v Nette opravdu velmi snadná. Jedním chytrým skriptem a několika málo změnami v kódu jsme +převedli klíčové prvky naší aplikace do AJAXu. From 2c653475de5c5e9222ab89ea03c09b3a26f19e45 Mon Sep 17 00:00:00 2001 From: Panda Date: Fri, 23 Dec 2011 11:00:24 +0100 Subject: [PATCH 0252/1741] cs/book/database: created --- cs/book/database.texy | 238 ++++++++++++++++++++++++++++++++++++++++++ files/03-schema.png | Bin 0 -> 5599 bytes 2 files changed, 238 insertions(+) create mode 100644 cs/book/database.texy create mode 100644 files/03-schema.png diff --git a/cs/book/database.texy b/cs/book/database.texy new file mode 100644 index 0000000000..d0e70f7906 --- /dev/null +++ b/cs/book/database.texy @@ -0,0 +1,238 @@ +Vytvoření databáze a modelu +########################### + +.[perex] +První část aplikace, kterou budeme vytvářet, je struktura databáze pro uložení dat a pak model, který s nimi bude pracovat. +Díky Nette\Database bude vytvoření modelu opravdu rychlé a práce s ním velmi snadná. + +-------- + + +Nejběžnější používanou databází je MySQL. Budeme proto předpokládat použití právě této databáze, nicméně +vytvořené SQL skripty by měly s drobnými změnami fungovat pod většinou standardních databází. + +Databázová struktura +******************** + +Nejprve se musíme zamyslet, co vše budeme v aplikaci potřebovat. Základem bude tabulka s jednotlivými úkoly. Vedle ní +vytvoříme tabulku uživatelů a pak jednoduchou tabulku seznamů úkolů. + +K jednotlivým úkolům (tabulka `task`) tedy budeme ukládat následující informace: + +- `id`: unikátní ID úkolu. Sloupeček typu `INT` a bude primárním klíčem s `AUTO_INCREMENT`. +- `text`: popis úkolu. Na uložení budeme potřebovat sloupeček typu `VARCHAR(100)`. V případě potřeby můžeme samozřejmě délku zvolit podle našich potřeb. +- `created`: čas, kdy byl úkol vytvořen. Sloupec bude typu `DATETIME`. +- `done`: značka (flag), zda byl úkol splněn. Můžeme využít typ `BOOLEAN`, který je synonynmem pro `TINYINT(1)`. +- `user_id`: ID uživatele, ke kterému je úkol přiřazen. Sloupec typu `INT`. +- `tasklist_id`: ID seznamu úkolů, do kterého je úkol zařazen. Sloupec typu `INT`. + +Předpokládáme, že z tabulky budeme nejčastěji vybírat úkoly z jediného seznamu ukolů, filtrovat je podle toho, +zda jsou splněné či nesplněné a řadit podle data jejich přidání. Vytoříme tedy navíc jeden index nad sloupci +`tasklist_id`, `done`, `created`. + +.[note] +Povšimněte si názvu sloupečků, které se odkazují na jiné tabulky. Jsou vždy ve formátu `_id`. Na základě +pojmenování pak Nette\Database dokáže obě tabulky spojit. Jedná se o konvenci, kterou Nette\Database přejímá +od knihovny NotORM. + +Již zmíněná tabulka uživatelů bude mít následující strukturu: + +- `id`: unikátní ID uživatele. Opět `INT` a primární klíč s `AUTO_INCREMENT`. +- `username`: uživatelské jméno. `VARCHAR(20)`. Uživatelské jménu musí být navíc unikátní, takže nad sloupcem vytvoříme unikátní klíč. +- `password`: heslo uživatele. Pro uložení hesla použijeme některou z již existujících hashovacích funkcí. Podle délky hashe zvolíme velikost sloupce. My použiejeme SHA512, její použití je velmi jednoduché. Její délka je 512 bitů, takže 64 bajtů. V databázi jej uložíme hexadecimálně, takže dostáváme výslednou délku 128 znaků. Použijeme `CHAR(128)`. +- `name`: skutečné jméno uživatele, které budeme zobrazovat v aplikaci. `VARCHAR(30)`. + +.[note] +Proč nepoužívat na uložemí hesla staré známé MD5? Samozřejmě ji použít můžete, nicméně jedná se o poměrně slabý hash, +na který jsou běžně dostupné "rainbow tabulky":[http://en.wikipedia.org/wiki/Rainbow_table]. Navíc i na běžném dnešním +hardwaru je možné otestovat metodou hrubé síly miliardy kombinací za sekundu. + +Poslední zmíněnou tabulkou je tabulka `tasklist`. Bude mít jen dva sloupečky: + +- `id`: unikátní ID. `INT`, primární klíč s `AUTO_INCREMENT`. +- `title`: nadpis seznamu. `VARCHAR(50)`. + +.[tip] +Pro vytvoření těchto tabulek můžete použít svůj oblíbený nástroj na správu databáze, případně kostra aplikace +obsahuje rozbalený "Adminer":[http://adminer.org/], který je psaný v PHP. Naleznete jej v podložce složce `www/adminer`, +kterou stačí otevřít v prohlížeči. + +SQL kód pro vytvoření popsaných tabulek je následující: + +/---code sql +CREATE TABLE `task` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `text` varchar(100) NOT NULL, + `created` datetime NOT NULL, + `done` tinyint(1) unsigned NOT NULL DEFAULT 0, + `user_id` int(10) unsigned NOT NULL, + `tasklist_id` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `order` (`tasklist_id`,`done`,`created`) +); + + +CREATE TABLE `tasklist` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `title` varchar(50) NOT NULL, + PRIMARY KEY (`id`) +); + + +CREATE TABLE `user` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `username` varchar(20) NOT NULL, + `password` char(128) NOT NULL, + `name` varchar(30) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `username` (`username`) +); +\--- + +Můžete si také stáhnout celý skript pro MySQL: [quickstart.mysql.sql |http://files.nette.org/2647/quickstart.mysql.sql]. Také si stáhněte ukázková data +pro MySQL: [data.mysql.sql|http://files.nette.org/2647/data.mysql.sql]. To je z hlediska struktury databáze vše. Nyní se pustíme do psaní +samotného modelu. + +Struktura databáze vypadá následovně: + +[* 03-schema.png *] + + +Model +***** + +Naše kostra aplikace již obsahuje připravenou třídu modelu. Nic nám nebrání ji zneužít a přiohnout k obrazu svému. + +Nachází se ve složce `app/models/Model.php`. Její kod vypadá takto: + +.[note] +Kód obsahuje české komentáře, nelekejte se. U tříd ze sandboxu, které budeme modifikovat, jsem komentáře přeložil a případně +trošku doplnil. + +/---php +/** + * Základní třída modelu. + */ +class Model extends Nette\Object +{ + /** @var Nette\Database\Connection */ + public $database; + + + /** + * @param Nette\Database\Connection $database + */ + public function __construct(Nette\Database\Connection $database) + { + $this->database = $database; + } + + + + /** @return Authenticator */ + public function createAuthenticatorService() + { + return new Authenticator($this->database->table('user')); + } + +} +\--- + +Třída toho zatím moc neumí. Při vytvoření dostane připojení k databázi ve formě objektu typu `Nette\Database\Connection`. +Její prozatím jediná metoda vytváří instalci `Authenticator`u, která slouží k ověření identity uživatele. K té se +vrátíme později, až budeme dělat přihlašování uživatelů. + +Základním kamenem našeho modelu bude právě onen magický objekt `Nette\Database\Connection`. Ten obsahuje metodu `table`, +která nám umožní pohodlně provádět dotazy nad tabulkou. Pokud chceme do modelu přidat informaci o tabulce +`task`, jen si přidáme metodu: + +/---php +/** + * Získá tabulku úkolů. + * @return Nette\Database\Table\Selection + */ +public function getTasks() +{ + return $this->database->table('task'); +} +\--- + +Metoda vrací objekt typu `Nette\Database\Table\Selection`. Právě to je objekt, který nám umožní pohodlně provádět +velmi efektivní dotazy. Více si o něm povíme později, až se dostaneme k použití v praxi, nedočkavci mohou nahlédnout +do kuchařky na téma "Databáze & ORM":[http://doc.nette.org/cs/database]. + +Zbývá doplnit metody pro další tabulky: + +/---php +/** + * Získá tabulku se seznamy úkolů. + * @return Nette\Database\Table\Selection + */ +public function getTaskLists() +{ + return $this->database->table('tasklist'); +} + +/** + * Získá tabulku uživatelů. + * @return Nette\Database\Table\Selection + */ +public function getUsers() +{ + return $this->database->table('users'); +} +\--- + +A to je pro náš model vše. Jednoduché, že? + + +Nastavení připojení k databázi +****************************** + +Zbývá nám ještě poslední krok, a tím je nastavení připojení k databázi. To provedeme v souboru `config.neon`. +Prozatím nepotřebujeme přesně znát jeho strukturu, zajímá nás jen následující sekce: + +/--- +services: + database: + class: Nette\Database\Connection + arguments: ['mysql:host=localhost;dbname=test', 'user', 'password'] + + model: + class: Model + arguments: [@database] + + authenticator: + factory: [@model, createAuthenticatorService] +\--- + +Tato sekce definuje takzvané služby. Jedná se o objekty, které jsou vytvářeny pouze jednou při jejich prvním použití a +jsou společné pro celou aplikaci. Jsou zde uvedeny služby pro všechny třídy, o které jsme v této části zavadili. + +Služba `database` je samotné připojení k databázi. Jedná se o třídu `Nette\Database\Connection` (uvedeno jako `class`). Při vytváření +dostane jako argumenty pole z políčka `arguments`, v našem případě se jedná o PDO připojovací řetězec, uživatelské jméno +a heslo. Řádku tedy upravíme podle našeho nastavení například takto: + +/--- + arguments: ['mysql:host=localhost;dbname=quickstart', 'quickstart', '******'] +\--- + +.[note] +Pro dokumentaci připojovacího řetězce (DSN) konzultujte dokumentaci k "PDO driverům":[http://www.php.net/manual/en/pdo.drivers.php]. +Každý driver má trochu odlišný připojovací řětezec, podívejte se například na +"PDO připojení k MySQL":[http://www.php.net/manual/en/ref.pdo-mysql.connection.php]. + +Služba `model` vytváří námi upravovanou třidu `Model`. `arguments: [@database]` říká, že třída dostane službu `database` +(resp. objekt, který slubžu reprezentuje) jako parametr konstruktoru. + +Poslední službou je `authenticator`. Jeho definice obsahuje jen řádku + +/--- +factory: [@model, createAuthenticatorService]` +\--- + +O vytvoření služby se tak stará metoda `createAuthenticatorService` ze služby `model` (= objekt `Model`), kterou jsme již +zmínili. + +A to je prozatím vše. Úspěšně jsme vytvořili strukturu databáze a jednoduchý model, který budeme v dále v aplikaci používat. +Využijeme jej hned příště, budeme totiž psát náš první presenter. diff --git a/files/03-schema.png b/files/03-schema.png new file mode 100644 index 0000000000000000000000000000000000000000..4915e7a0100a42820c32b74c5a544789a3607d62 GIT binary patch literal 5599 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%0Ah|E9<|ls2&c-t?=VU&esxI&DUG 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 Date: Fri, 23 Dec 2011 11:10:50 +0100 Subject: [PATCH 0253/1741] =?UTF-8?q?cs/book:=20Nov=C3=BD=20QS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/book.texy | 103 +++++++++++++++++---------------------------------- 1 file changed, 34 insertions(+), 69 deletions(-) diff --git a/cs/book.texy b/cs/book.texy index dd3c10ae82..8785940061 100644 --- a/cs/book.texy +++ b/cs/book.texy @@ -1,4 +1,38 @@ Vytvořte si první aplikaci! +########################### + +.[perex] +Tento praktický návod Vás provede tvorbou Vaší první aplikace v Nette Framework. Během **pár minut** vytvoříme **funkční a bezpečnou** aplikaci a ukážeme si některé výhody Nette, například **šablonovací systém**, **plnou podporu AJAXu** nebo **formuláře**. + +-------- + +.[note] +Nový Quick Start je momentálně ve stádiu vývoje. Proto, prosím, omluvte případné chyby, překlepy a nedodělky. Díky! + +Námi vytvářená aplikace bude jednoduchý úkolníček. Nejprve si vytvoříme jednoduchý seznam úkolů a postupně budeme +aplikaci rozšiřovat - možnost úkoly organizovat do několika seznamů, přihlašování uživatelů, plánování úkolů a jejich +přiřazování jednotlivým uživatelům. Aplikaci pak také přidáme podporu AJAXu. + +.[note] +Tutoriál je psán pro PHP 5.3. Ověřte, zda si stahujete správnou verzi Nette. + + +**Začínáme!** + +.[navig] +1. [Začínáme|quickstart/start] +2. [Vytvoření databáze a modelu|quickstart/database] +3. [Vytvoření presenteru|quickstart/presenter] +4. [Formuláře|quickstart/forms] +5. [Komponenty|quickstart/components] +6. [Přihlašování uživatelů|quickstart/authentication] +7. [AJAX|quickstart/ajax] +8. URL a routování (v přípravě) +9. Nasazení aplikace a její bezpečnost (v přípravě) + + +/--comment +Vytvořte si první aplikaci! *************************** .[perex] @@ -15,75 +49,6 @@ Omlouváme se, tato stránka je ještě v přípravě. Ale netřeba zoufat, mám 9. [doc-0.9:quickstart/Stránkování a routování] -/--comment - -.[perex] -Tento praktický návod Vás provede tvorbou Vaší první aplikace v Nette Framework. Během **pár minut** vytvoříme **funkční a bezpečnou aplikaci** a ukážeme si některé výhody Nette, například **šablonovací systém**, **plnou podporu AJAXu** nebo **formuláře**. - ------ - -Aplikace, kterou si vytvoříme, bude kostrou osobního organizéru. Nejprve vytvoříme jednoduchý seznam úkolů a postupně aplikaci obohatíme o práci s databází, přidávání úkolů a AJAX. Nakonec aplikaci ještě obohatíme o jednoduchý adresář a ukážeme, jak je rozšiřování naší aplikace snadné. - -1. [Začínáme |quickstart/lets-start] - - - ------ - -Osnova ------- - -0. Intro - - stručný úvod do Nette (perex) - - představení aplikace - - ukázka Requirements-Checkeru? -1. Začátek - - stažení Nette a instalace sandboxu - - představení adresářů presenters, templates - - představení souboru bootstrap.php - - Debugger::enable() - představení laděnky - - načtení konfigurace - představení config.ini (později .neon) - - zmínění RobotLoaderu a jeho výhod - - router - stručné nastínění propojení, prozatím zůstaneme u výchozích rout -2. Síla šablon - - představení HomepagePresenteru, zmínění BasePresenteru a dědičnosti - - data v presenteru - prozatím pole úkolů - - HomepagePresenter:default - renderDefault + šablona - výpis dat, ukázka context-aware escaping - - vytvoření TodoPresenteru - - TodoPresenter:details - renderDetails + šablona, prolinkování - - ukázka layoutu, bloků, troška teorie kolem jejich dědičnosti - - stručný nástin architektury MVP, VP již bylo použito, předehra pro M -3. Model a databáze - - jednoduchý model, jediná třída, prozatítm jen výběr dat, data budou zase v poli - - úprava HomepagePresenteru, aby model využíval - - návrh databáze - jediná tabulka - - nakopírování dibi, opět zmínka o RobotLoaderu - - příprava konfigurace v config.ini (sqlite databáze) - - úprava modelu, aby pracoval s databází -4. Formuláře snadno a rychle - - jednoduchý formulář pro přidání úkolu - - createComponent - - vložení do šablony - - onSubmit, vkládání do databáze (včetně úpravy modelu) - - nástin signálů - signál "mark task completed" -5. AJAX - Nette není připraveno. -6. URL a routování - - návrat do bootstrap.php, přidání routy na výpis a ukázka změny URL - - zmínění kanonizace a na co si dávat pozor - - Routing Debugger -7. Rozšíření aplikace o adresář - - návrh databáze - - nový model - - nový výpis na úvodce - - nový presenter - - nový formulář -8. Gratulace, nasměrování dál - - nasazení aplikace na ostrý server - - bezpečnostní tipy a triky - - výzva komunitě o pokračování tutoriálu, nápady na rozšíření! - - - Davidovy poznámky ----------------- From 52f1ae65ee77aae1a25edec836392f61ec6ba0d7 Mon Sep 17 00:00:00 2001 From: Darkry Date: Fri, 23 Dec 2011 11:47:21 +0100 Subject: [PATCH 0254/1741] =?UTF-8?q?cs/book/presenter:=20P=C5=99eklep=20-?= =?UTF-8?q?=20oprava?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/book/presenter.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/book/presenter.texy b/cs/book/presenter.texy index 347d3629fb..1af1063165 100644 --- a/cs/book/presenter.texy +++ b/cs/book/presenter.texy @@ -431,7 +431,7 @@ Pro tento view poté musíme vytvořit šablonu `notFound.latte` ve složce `app

    Litujeme, ale Vámi požadovaný seznam úkolů nebyl nalezen.

    \--- -Makrem `{status 404}` nastavujeme HTTP status na 404: Nenalezeno. Povšimněte si, že v šabloně chybí ukončovací makero +Makrem `{status 404}` nastavujeme HTTP status na 404: Nenalezeno. Povšimněte si, že v šabloně chybí ukončovací makro pro `{block content}` - u posledního bloku v šabloně můžeme uzavírací část vynechat. Pokud zkusíme opět přistoupit na neexistující ID, bude situace o poznání lepší: From 4c15d0dee001f5c797b0ab37b5b4998cc9fe405c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:04:32 +0100 Subject: [PATCH 0255/1741] =?UTF-8?q?cs/book/start:=20=C5=99=C3=A1dek=20na?= =?UTF-8?q?v=C3=ADc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/book/start.texy | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cs/book/start.texy b/cs/book/start.texy index 8342bedb9e..49b75011c4 100644 --- a/cs/book/start.texy +++ b/cs/book/start.texy @@ -48,9 +48,7 @@ Podívejme se nyní podívat na jednotlivé složky: - `libs` složí k umístění knihoven třetích stran, které bude naše aplikace využívat. Jednou (a prozatím jedinou) takovou knihovnou bude právě Nette Framework. Při použití již připravené kostry z distribuce je Nette Framework již připraven k použití. - Do adresáře `log`, jak již název napovídá, se ukládají informace o běhu aplikace, například chybová hlášení. Nette toto ukládání chybových hlášení používá ve výchouím nastavení pouze v produkčním prostředí, takže nás tato složka nebude zatím zajímat. - Adresář `temp` slouží na dočasné soubory, převážně cache a data sezení. -- Do složky `tests` budeme ukládat unit testy naší aplikace. Protože je to naše první aplikace, nebudeme se psaním testů -zatím zatěžovat, nicméně je výhodné testy psát. Proto bude psaní testů v prostředí Nette popsáno v jednom z navazujících -návodů. +- Do složky `tests` budeme ukládat unit testy naší aplikace. Protože je to naše první aplikace, nebudeme se psaním testů zatím zatěžovat, nicméně je výhodné testy psát. Proto bude psaní testů v prostředí Nette popsáno v jednom z navazujících návodů. - Složka `www` by měla být jediná složka, která je veřejně přístupná z webu. Právě do ní by měl v produkčním prostředí ukazovat `document_root` webového serveru. Budeme do ní ukládat obrázky, JavaScripty, CSS a další data, na která se budeme odkazovat z aplikace. .[note] From d078887c361ba041894bb6ae59bac2c3b5981537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:10:51 +0100 Subject: [PATCH 0256/1741] =?UTF-8?q?cs/book/start:=20nezmi=C5=88ujeme=20(?= =?UTF-8?q?x)HTML?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/book/start.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/book/start.texy b/cs/book/start.texy index 49b75011c4..63d8d6f9e8 100644 --- a/cs/book/start.texy +++ b/cs/book/start.texy @@ -108,7 +108,7 @@ Adresář `templates` =================== V této složce jsou šablony naší aplikace. Každý presenter (kromě `BasePresenter`) zde má vlastní složku se šablonami. -Jednotlivé šablony pak představují "pohledy" presenteru a jsou kombinací (X)HTML a šablonovacího jazyka Latte. +Jednotlivé šablony pak představují "pohledy" presenteru a jsou kombinací HTML a šablonovacího jazyka Latte. `bootstrap.php` From 5dc502690431c5de7d509c7c164e623b0637c5a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:15:13 +0100 Subject: [PATCH 0257/1741] =?UTF-8?q?cs/book/start:=20=20produk=C4=8Dn?= =?UTF-8?q?=C3=AD=20re=C5=BEim=20=20je=20p=C5=99esn=C4=9Bj=C5=A1=C3=AD=20n?= =?UTF-8?q?e=C5=BE=20=20produkce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/book/start.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/book/start.texy b/cs/book/start.texy index 63d8d6f9e8..73146662a2 100644 --- a/cs/book/start.texy +++ b/cs/book/start.texy @@ -194,7 +194,7 @@ Debugger::$strictMode = TRUE; Debugger::enable(); \--- Povolí "laděnku":[cs/debugging]. Ta nám usnadní práci při hledání chyb, a to jak při vývoji, tak na produkčním serveru. -Nastavení `Debugger::$logDirectory` totiž určuje adresář, do kterého se na produkci budou ukládat chybová hlášení. +Nastavení `Debugger::$logDirectory` totiž určuje adresář, do kterého se v produkčním režimu budou ukládat chybová hlášení. /---php $configurator = new Nette\Config\Configurator; From 9ddb84dbc06ef433a2c09d42b13d70d89258c9df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:17:01 +0100 Subject: [PATCH 0258/1741] cs/book/start: odkaz na autoloading --- cs/book/start.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/book/start.texy b/cs/book/start.texy index 73146662a2..12efca6cf4 100644 --- a/cs/book/start.texy +++ b/cs/book/start.texy @@ -211,7 +211,7 @@ $container = $configurator->createContainer(); Načte konfigurační soubor `config.neon`. Tento soubor obsahuje nastavení naší aplikace, hlavně připojení k databázi. Také si povšimněte volání `$configurator->createRobotLoader()`. `RobotLoader` je služba Nette, která indexuje -soubory v zadaných složkách a stará se o automatické načítání tříd v případě jejich potřeby. Protože +soubory v zadaných složkách a stará se o [automatické načítání tříd | cs/auto-loading] v případě jejich potřeby. Protože jedna ze zadaných složek je naše složka `app`, budou se nám veškeré třídy načítat automaticky bez nutnosti jejich `require`ování. /---php From 159635f6a859f39525f065317d020d9a6c05eb91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:18:12 +0100 Subject: [PATCH 0259/1741] =?UTF-8?q?cs/book/start:=20odkaz=20na=20routov?= =?UTF-8?q?=C3=A1n=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/book/start.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/book/start.texy b/cs/book/start.texy index 12efca6cf4..af4ccc844b 100644 --- a/cs/book/start.texy +++ b/cs/book/start.texy @@ -229,7 +229,7 @@ $router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY); $router[] = new Route('/[/]', 'Homepage:default'); \--- -Nastaví routování. Jedná se o mechanismus, který se stará o správný překlad URL adresy na vnitřní požadavek aplikace a opačně. +Nastaví [routování | cs/routing]. Jedná se o mechanismus, který se stará o správný překlad URL adresy na vnitřní požadavek aplikace a opačně. To nám umožní používat hezké URL adresy a kdykoliv je bez jediné změny ve zbytku aplikace upravit. Routování si podrobněji představíme v jedné posledních kapitol, prozatím si vystačíme s těmito routami, které jsou dostatečné pro většinu aplikací. From 055c8fbd4061e652ea2933ede4dc10acd4f0b13b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:19:18 +0100 Subject: [PATCH 0260/1741] cs/book/start: odkaz na presentery --- cs/book/start.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/book/start.texy b/cs/book/start.texy index af4ccc844b..4260a5acbc 100644 --- a/cs/book/start.texy +++ b/cs/book/start.texy @@ -240,7 +240,7 @@ $application->errorPresenter = 'Error'; $application->run(); \--- -Nastaví jméno presenteru, který se bude vykonávat v případě chyby a konečně spustí aplikaci. Volání `$application->run()` +Nastaví jméno [presenteru | cs/presenters], který se bude vykonávat v případě chyby a konečně spustí aplikaci. Volání `$application->run()` zajistí vytvoření presenteru a vyřízení požadavku od klienta. Nyní, vyzbrojeni základními znalostmi, se můžeme pustit do samotného programování naší aplikace. From 917eafada9183c0396677b49d2b67c42f4ceb15c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:20:57 +0100 Subject: [PATCH 0261/1741] =?UTF-8?q?cs/book/start:=20odstran=C4=9Bn=20kom?= =?UTF-8?q?pletn=C3=AD=20k=C3=B3d=20boostrapu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/book/start.texy | 53 ---------------------------------------------- 1 file changed, 53 deletions(-) diff --git a/cs/book/start.texy b/cs/book/start.texy index 4260a5acbc..4d9f04facd 100644 --- a/cs/book/start.texy +++ b/cs/book/start.texy @@ -118,59 +118,6 @@ Přímo v této složce si povšimněte souborů `bootstrap.php` a `config.neon` aplikace. Stará se o správné načtení Nette, načtení konfigurace z `config.neon`, nastavení routování a nakonec samotné spuštění aplikace. Pojďme si je oba nyní ve stručnosti představit. -Soubor `bootstrap.php` vypadá následovně: - -/---php -setTempDirectory(__DIR__ . '/../temp'); - -// Enable RobotLoader - this will load all classes automatically -$configurator->createRobotLoader() - ->addDirectory(APP_DIR) - ->addDirectory(LIBS_DIR) - ->register(); - -// Create Dependency Injection container from config.neon file -$configurator->addConfig(__DIR__ . '/config.neon'); -$container = $configurator->createContainer(); - -// Opens already started session -if ($container->session->exists()) { - $container->session->start(); -} - -// Setup router -$router = $container->router; -$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY); -$router[] = new Route('/[/]', 'Homepage:default'); - - -// Configure and run the application! -$application = $container->application; -//$application->catchExceptions = TRUE; -$application->errorPresenter = 'Error'; -$application->run(); -\--- Na začátku je pouze výchozí hlavička souboru a `use` direktivy, které nám říkají, že se chceme na třídy `Nette\Diagnostics\Debugger` a `Nette\Application\Routers\Route` odkazovat pouze krátkými jmény. From 6f04758d5451650b269d2dd206987cb69d9ccda4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:27:13 +0100 Subject: [PATCH 0262/1741] cs/book/database: typo --- cs/book/database.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/book/database.texy b/cs/book/database.texy index d0e70f7906..e3bfa02aa9 100644 --- a/cs/book/database.texy +++ b/cs/book/database.texy @@ -139,7 +139,7 @@ class Model extends Nette\Object \--- Třída toho zatím moc neumí. Při vytvoření dostane připojení k databázi ve formě objektu typu `Nette\Database\Connection`. -Její prozatím jediná metoda vytváří instalci `Authenticator`u, která slouží k ověření identity uživatele. K té se +Její prozatím jediná metoda vytváří instanci `Authenticator`u, která slouží k ověření identity uživatele. K té se vrátíme později, až budeme dělat přihlašování uživatelů. Základním kamenem našeho modelu bude právě onen magický objekt `Nette\Database\Connection`. Ten obsahuje metodu `table`, From f8f5e1d1b8d786bdc80fb1b68306e9af55806667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:34:58 +0100 Subject: [PATCH 0263/1741] cs/book/database: odkazy na DI --- cs/book/database.texy | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cs/book/database.texy b/cs/book/database.texy index e3bfa02aa9..1ad2ad4ddb 100644 --- a/cs/book/database.texy +++ b/cs/book/database.texy @@ -209,6 +209,9 @@ services: Tato sekce definuje takzvané služby. Jedná se o objekty, které jsou vytvářeny pouze jednou při jejich prvním použití a jsou společné pro celou aplikaci. Jsou zde uvedeny služby pro všechny třídy, o které jsme v této části zavadili. +.[tip] +Pokud chcete vědět proč právě služby a jak se s nimi pracuje, můžete si přečíst článek [Dependency Injection | cs/dependency-injection] zde v dokumentaci a "seriál na serveru Zdroják":http://zdrojak.root.cz/serialy/jak-na-dependency-injection/. Detaily o konfiguračním souboru pak naleznete v článku [Konfigurace prostředí | cs/configuring]. + Služba `database` je samotné připojení k databázi. Jedná se o třídu `Nette\Database\Connection` (uvedeno jako `class`). Při vytváření dostane jako argumenty pole z políčka `arguments`, v našem případě se jedná o PDO připojovací řetězec, uživatelské jméno a heslo. Řádku tedy upravíme podle našeho nastavení například takto: From 34234f73fcce70c84bf0be116c9dcd6649f0a210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:36:47 +0100 Subject: [PATCH 0264/1741] cs/book/presenter: odkaz na presenters --- cs/book/presenter.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/book/presenter.texy b/cs/book/presenter.texy index 1af1063165..e96f9c83d1 100644 --- a/cs/book/presenter.texy +++ b/cs/book/presenter.texy @@ -8,7 +8,7 @@ jak psát v šablonovacím jazyce Latte a jak využívat model, který jsme již -------- -Na začátek se bohužel nevyhneme troše teorie. Nette využívá architekturu MVP, Model-View-Presenter. Základními kameny +Na začátek se bohužel nevyhneme troše teorie. Nette využívá architekturu MVP, [Model-View-Presenter | cs/presenters]. Základními kameny této architektury jsou: - **Model** - datová a funkční vrstva aplikace, která se stará o ukládání dat a aplikační logiku. Jakoukoliv událost uživatele (přihlášení, zobrazení či změna dat, vložení zboží do košíku) představuje akci modelu. Ten má pevně dané rozhraní, pomocí kterého s ním ostatní části aplikace komunikují, a sám o svém okolí nic neví. From 3eec46e90828027a6c15098e1b4c6716f8ff5bcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:47:33 +0100 Subject: [PATCH 0265/1741] =?UTF-8?q?cs/book/presenter:=20private=20$taskL?= =?UTF-8?q?ist;=20k=C3=B3d=20je=20jasn=C4=9Bj=C5=A1=C3=AD=20ne=C5=BE=20tex?= =?UTF-8?q?t?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/book/presenter.texy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cs/book/presenter.texy b/cs/book/presenter.texy index e96f9c83d1..86604415ed 100644 --- a/cs/book/presenter.texy +++ b/cs/book/presenter.texy @@ -251,6 +251,8 @@ dostane presenter jako ID v adrese. Vytvoříme si privátní atribut `$taskList záznam o seznamu úkolů: /---php +private $taskList; + public function actionDefault($id) { $this->taskList = $this->model->getTaskLists()->find($id)->fetch(); From fa8eabd2831f77888435118a749360ed65dd75a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:51:38 +0100 Subject: [PATCH 0266/1741] cs/book/presenter: parametry akce a render --- cs/book/presenter.texy | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cs/book/presenter.texy b/cs/book/presenter.texy index 86604415ed..f02737a464 100644 --- a/cs/book/presenter.texy +++ b/cs/book/presenter.texy @@ -246,9 +246,7 @@ abstract class BasePresenter extends Nette\Application\UI\Presenter } \--- -Nyní zpět do `TaskPresenter`u. V něm budeme chtít zobrazit jeden konkrétní seznam úkolů. Seznam, který chceme zobrazit, -dostane presenter jako ID v adrese. Vytvoříme si privátní atribut `$taskList`, do kterého uložíme v metodě `actionDefault` -záznam o seznamu úkolů: +Nyní zpět do `TaskPresenter`u. V něm budeme chtít zobrazit jeden konkrétní seznam úkolů. Seznam, který chceme zobrazit, dostane presenter jako ID v adrese. Vytvoříme si privátní atribut `$taskList`, do kterého uložíme v metodě `actionDefault` záznam o seznamu úkolů: /---php private $taskList; @@ -259,9 +257,7 @@ public function actionDefault($id) } \--- -Parametr `$id` bude obsahovat ID, které bude zadáno v databázi. O jeho naplnění se Nette postará za nás. Více o tomto -mechanismu se dozvíme v sekci o routování, prozatím se spokojíme s pro programátora nejlepším závěrem "funguje to a -nemusíme se o to starat". +Parametr `$id` bude obsahovat identifikátor, který bude hledán v databázi. Nette si samo zkontroluje `action()` a `render()` metody a pokud mají nějaké argumenty, které přišly adresou, tak je předá podle jména. Více o tomto mechanismu se dozvíme v [sekci o presenterech | cs/presenters#toc-zpracovani-akce-presenteru], prozatím se spokojíme s, pro programátora nejlepším závěrem, "funguje to a nemusíme se o to starat". Získaný záznam spolu se seznamem úkolů předáme šabloně v metodě `renderDefault()`: From 6e7cc02a9c203ab255bcf5da562844a22b2c29d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Proch=C3=A1zka?= Date: Fri, 23 Dec 2011 13:55:44 +0100 Subject: [PATCH 0267/1741] =?UTF-8?q?cs/book/presenter:=20konce=20=C5=99?= =?UTF-8?q?=C3=A1dk=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/book/presenter.texy | 181 ++++++++++++----------------------------- 1 file changed, 50 insertions(+), 131 deletions(-) diff --git a/cs/book/presenter.texy b/cs/book/presenter.texy index f02737a464..781dc5cde5 100644 --- a/cs/book/presenter.texy +++ b/cs/book/presenter.texy @@ -8,28 +8,23 @@ jak psát v šablonovacím jazyce Latte a jak využívat model, který jsme již -------- -Na začátek se bohužel nevyhneme troše teorie. Nette využívá architekturu MVP, [Model-View-Presenter | cs/presenters]. Základními kameny -této architektury jsou: +Na začátek se bohužel nevyhneme troše teorie. Nette využívá architekturu MVP, [Model-View-Presenter | cs/presenters]. Základními kameny této architektury jsou: -- **Model** - datová a funkční vrstva aplikace, která se stará o ukládání dat a aplikační logiku. Jakoukoliv událost uživatele (přihlášení, zobrazení či změna dat, vložení zboží do košíku) představuje akci modelu. Ten má pevně dané rozhraní, pomocí kterého s ním ostatní části aplikace komunikují, a sám o svém okolí nic neví. +- **Model** - datová a funkční vrstva aplikace, která se stará o ukládání dat a aplikační logiku. +Jakoukoliv událost uživatele (přihlášení, zobrazení či změna dat, vložení zboží do košíku) představuje akci modelu. Ten má pevně dané rozhraní, pomocí kterého s ním ostatní části aplikace komunikují, a sám o svém okolí nic neví. - **View**, nebo také "pohled" - stará se o samotné vykreslení výsledku požadavku uživatele. V Nette tuto část představují šablony. - **Presenter** - obě předchozí vrstvy spojuje dohromady. Nejprve na základě požadavku od uživatele vyvolá příslušnou aplikační logiku (např. zmíněné přidání zboží do košíku či zobrazení dat) a pak požádá view o vykreslení výsledku. .[note] -Architektura MVP je podobná architektuře MVC((Model-View-Controller)). Obě architektury se liší hlavně v úloze jejich -centrálního kamene, tedy Presenter × Controller. Presenter hraje čistě roli prostředníka, který jen volá model a -výsledky předává view, kdežto Controller má navíc na starosti i některé události uživatelského rozhraní. +Architektura MVP je podobná architektuře MVC((Model-View-Controller)). Obě architektury se liší hlavně v úloze jejich centrálního kamene, tedy Presenter × Controller. Presenter hraje čistě roli prostředníka, který jen volá model a výsledky předává view, kdežto Controller má navíc na starosti i některé události uživatelského rozhraní. -Model již máme díky `Nette\Database` připravený. Zbývá nám tedy presenter a view. V Nette má každý presenter vlastní -sadu views, takže budeme obojí psát souběžně. +Model již máme díky `Nette\Database` připravený. Zbývá nám tedy presenter a view. V Nette má každý presenter vlastní sadu views, takže budeme obojí psát souběžně. `HomepagePresenter` ******************* -Jak již bylo řečeno, presenter je třída, která spolupracuje s modelem a výsledná data předává view. Nejprve upravíme -`HomepagePresenter`. Ten bude zajišťovat zobrazení úvodní stránky aplikace. V kostře aplikace vypadá kód této třídy -následovně: +Jak již bylo řečeno, presenter je třída, která spolupracuje s modelem a výsledná data předává view. Nejprve upravíme `HomepagePresenter`. Ten bude zajišťovat zobrazení úvodní stránky aplikace. V kostře aplikace vypadá kód této třídy následovně: /---php class HomepagePresenter extends BasePresenter @@ -43,34 +38,22 @@ class HomepagePresenter extends BasePresenter } \--- -Má tedy jednu jedinou metodu: `renderDefault()`. Ta se stará o předání dat view, který se bude jmenovat `default`. -Šablonu tohoto view naleznete ve složce `templates/Homepage/`, konkrétně se jedná o soubor `default.latte`. Při běhu -aplikace se nejprve vykonají požadované akce v presenteru, až pak se podle toho vykresluje šablona. Posloupnost -těchto kroků zachycuje následující obrázek: +Má tedy jednu jedinou metodu: `renderDefault()`. Ta se stará o předání dat view, který se bude jmenovat `default`. Šablonu tohoto view naleznete ve složce `templates/Homepage/`, konkrétně se jedná o soubor `default.latte`. Při běhu aplikace se nejprve vykonají požadované akce v presenteru, až pak se podle toho vykresluje šablona. Posloupnost těchto kroků zachycuje následující obrázek: .<> [* lifecycle2.gif *] -V diagramu si povšimněte metody `action()`. V souvislosti s ní si musíme zavést nový pojem, a to "akce presenteru". -Nejlepší bude tento pojem vysvětlit na příkladu: akcí presenteru může být například "zobrazení produktu". Interně jí nazveme -`show`. Pokud chceme ale produkt zobrazit, může dojít k několika stavům: produkt je na skladě a můžeme jej objednat, -produkt mohl být stažen z prodeje, vybraný produkt již nemusí existovat... Právě pro tyto jednotlivé stavy pak vytvoříme -vlastní view, můžeme je tedy chápat jako konkrétní realizace zobrazení dané akce. +V diagramu si povšimněte metody `action()`. V souvislosti s ní si musíme zavést nový pojem, a to "akce presenteru". Nejlepší bude tento pojem vysvětlit na příkladu: akcí presenteru může být například "zobrazení produktu". Interně jí nazveme `show`. Pokud chceme ale produkt zobrazit, může dojít k několika stavům: produkt je na skladě a můžeme jej objednat, produkt mohl být stažen z prodeje, vybraný produkt již nemusí existovat... Právě pro tyto jednotlivé stavy pak vytvoříme vlastní view, můžeme je tedy chápat jako konkrétní realizace zobrazení dané akce. -Ve většině případů bude platit, že co akce, to view, proto pokud se o nic nestaráme, vykonává se akce a view se stejným -jménem. V našem `HomepagePresenter`u by se tedy před metodou `renderDefault()` volala metoda `actionDefault()`, pokud -by existovala. Během ní se však můžeme rozhodnout view změnit voláním metody `setView($view)`, například `$this->setView('error')`. -Pak by po vykonání metody `actionDefault()` nedošlo k volání metody `renderDefault()`, ale `renderError()`. Také by se +Ve většině případů bude platit, že co akce, to view, proto pokud se o nic nestaráme, vykonává se akce a view se stejným jménem. V našem `HomepagePresenter`u by se tedy před metodou `renderDefault()` volala metoda `actionDefault()`, pokud by existovala. Během ní se však můžeme rozhodnout view změnit voláním metody `setView($view)`, například `$this->setView('error')`. Pak by po vykonání metody `actionDefault()` nedošlo k volání metody `renderDefault()`, ale `renderError()`. Také by se vykreslovala šablona `error.latte`. -Nyní ale zpět k psaní kódu. Pokud chceme v šabloně nějaká data zobrazit, musíme presenter nějakým způsobem spojit -s modelem. Model máme zaregistrovaný jako službu, takže se k němu i k jeho tabulkám můžeme pohodlně dostat. +Nyní ale zpět k psaní kódu. Pokud chceme v šabloně nějaká data zobrazit, musíme presenter nějakým způsobem spojit s modelem. Model máme zaregistrovaný jako službu, takže se k němu i k jeho tabulkám můžeme pohodlně dostat. Spojení s modelem ================= -Pro pohodlnější přístup si připravíme v presenteru atribut `$model`. Do něj pak v metodě `startup()` přiřadíme instanci -modelu pomocí metody `getService($service)`: +Pro pohodlnější přístup si připravíme v presenteru atribut `$model`. Do něj pak v metodě `startup()` přiřadíme instanci modelu pomocí metody `getService($service)`: /---php /** @var Model */ @@ -83,18 +66,12 @@ public function startup() } \--- -Metoda `startup()` se volá vždy na začátku vyřizování požadavku presenterem. Svým způsobem přejímá činnost konstruktoru. -Povšimněte si také volání `parent::startup()`. Často bude inicializační fáze společná pro několik presenterů, typicky -v administraci webu, kde budeme na začátku chtít ověřit, zda je uživatel přihlášen a případně načíst i informace -o aktuálně přihlášeném uživateli. Proto musíme volat vždy i metodu `startup()` rodičů. Nette toto volání kontroluje -a upozorní, pokud na něj zapomeneme. Jinak by to mohlo vést k obtížně odhalitelným chybám a bezpečnostním slabinám. +Metoda `startup()` se volá vždy na začátku vyřizování požadavku presenterem. Svým způsobem přejímá činnost konstruktoru. Povšimněte si také volání `parent::startup()`. Často bude inicializační fáze společná pro několik presenterů, typicky v administraci webu, kde budeme na začátku chtít ověřit, zda je uživatel přihlášen a případně načíst i informace o aktuálně přihlášeném uživateli. Proto musíme volat vždy i metodu `startup()` rodičů. Nette toto volání kontroluje a upozorní, pokud na něj zapomeneme. Jinak by to mohlo vést k obtížně odhalitelným chybám a bezpečnostním slabinám. .[note] -Vyhněte se přepisování konstruktoru presenteru. Vytváření presenteru zajišťuje Nette, proto by jeho přepsání -vedlo k těžce odhalitelným chybám. Veškerá inicializace by měla proto proběhnout v metodě `startup()`. +Vyhněte se přepisování konstruktoru presenteru. Vytváření presenteru zajišťuje Nette, proto by jeho přepsání vedlo k těžce odhalitelným chybám. Veškerá inicializace by měla proto proběhnout v metodě `startup()`. -Nyní již můžeme model v presenteru použít. Vybereme tedy z tabulky `task` data a vložíme je do šablony. Budeme chtít -zobrazit všechny nesplněné úkoly a seřadit vzestupně je podle času vytvoření: +Nyní již můžeme model v presenteru použít. Vybereme tedy z tabulky `task` data a vložíme je do šablony. Budeme chtít zobrazit všechny nesplněné úkoly a seřadit vzestupně je podle času vytvoření: /---php public function renderDefault() @@ -104,15 +81,9 @@ public function renderDefault() } \--- -`Nette\Database` poskytuje pro dotazování do databáze takzvané "fluent interface". Dotaz postupně skládáme zřetězením -volání funkcí, které budou reprezentovat jednotlivé části dotazu. Podporovány jsou téměř všechny aspekty jazyka SQL. -Tato abstrakce je poměrně užitečná - pokud později vyměníme SQL databázi za jiné úložiště, stačí pouze implementovat -objekty se stejným rozhraním a funkčnost zůstane stejná. Toto rozhraní ukážeme později na složitějších dotazech. +`Nette\Database` poskytuje pro dotazování do databáze takzvané "fluent interface". Dotaz postupně skládáme zřetězením volání funkcí, které budou reprezentovat jednotlivé části dotazu. Podporovány jsou téměř všechny aspekty jazyka SQL. Tato abstrakce je poměrně užitečná - pokud později vyměníme SQL databázi za jiné úložiště, stačí pouze implementovat objekty se stejným rozhraním a funkčnost zůstane stejná. Toto rozhraní ukážeme později na složitějších dotazech. -Voláním `where()` nad objektem tabulky definujeme podmínku, podle které chceme záznamy vybírat. Můžeme jí předat asociativní -pole ve formátu `sloupec` -> `hodnota`, případně rovnou kus SQL dotazu s parametry pokud nám prosté vybírání podle -rovnosti nestačí, nebo chceme použít složitější podmínky. Podobně voláním `order()` zajistíme setřídění dat vzestupně -podle sloupce `created`. +Voláním `where()` nad objektem tabulky definujeme podmínku, podle které chceme záznamy vybírat. Můžeme jí předat asociativní pole ve formátu `sloupec` -> `hodnota`, případně rovnou kus SQL dotazu s parametry pokud nám prosté vybírání podle rovnosti nestačí, nebo chceme použít složitější podmínky. Podobně voláním `order()` zajistíme setřídění dat vzestupně podle sloupce `created`. .[note] Zvídavé čtenáře opět odkazuji do dokumentace na téma "Databáze & ORM":[http://doc.nette.org/cs/database]. @@ -120,8 +91,7 @@ Zvídavé čtenáře opět odkazuji do dokumentace na téma "Databáze & ORM":[h Šablona ======= -V šabloně `default.latte` máme nyní k dispozici proměnnou `$list`. Pojďme ji tedy využít. V šabloně je -nyní uvítací stránka, tu můžeme bez obav smazat a nahradit jí vlastním kódem: +V šabloně `default.latte` máme nyní k dispozici proměnnou `$list`. Pojďme ji tedy využít. V šabloně je nyní uvítací stránka, tu můžeme bez obav smazat a nahradit jí vlastním kódem: /---html {block content} @@ -150,54 +120,38 @@ nyní uvítací stránka, tu můžeme bez obav smazat a nahradit jí vlastním k {/block} \--- -Ve vypisování šablony nám pomáhají takzvaná makra. Ta jsou uvedena ve složených závorkách a zastávají funkci různých -jazykových konstrukcí. Šablony můžeme psát i bez nich, ale proč bychom to dělali, že? +Ve vypisování šablony nám pomáhají takzvaná makra. Ta jsou uvedena ve složených závorkách a zastávají funkci různých jazykových konstrukcí. Šablony můžeme psát i bez nich, ale proč bychom to dělali, že? .[note] Seznam všech maker je samozřejmě v dokumentaci: "Výchozí Latte makra":[http://doc.nette.org/cs/default-macros]. -`{block content}` a `{/block}` definuje obsahový blok. Nette používá takzvanou dědičnost šablon. Hlavní šablona definuje -bloky, které pak zděděné šablony mohou (a některé musí) přepsat. Pokud není uvedeno jinak, tak šablona view dědí od -šablony `@layout.latte`, kterou naleznete přímo ve složce `app/templates`. V ní se nachází řádek: +`{block content}` a `{/block}` definuje obsahový blok. Nette používá takzvanou dědičnost šablon. Hlavní šablona definuje bloky, které pak zděděné šablony mohou (a některé musí) přepsat. Pokud není uvedeno jinak, tak šablona view dědí od šablony `@layout.latte`, kterou naleznete přímo ve složce `app/templates`. V ní se nachází řádek: /---html {include #content} \--- -Ten říká, že místo něj se má vložit blok s názvem `content`. Protože blok jinde definován není, je nutné tento blok -definovat ve zděděné šabloně. Hned pod hlavičkou je uveden `{block head}{/block}`. Takový blok je možno přepsat, -ale není to nutné. Pokud přepsán nebude, použije se místo něj výchozí obsah (zde prázdný řetězec). +Ten říká, že místo něj se má vložit blok s názvem `content`. Protože blok jinde definován není, je nutné tento blok definovat ve zděděné šabloně. Hned pod hlavičkou je uveden `{block head}{/block}`. Takový blok je možno přepsat, ale není to nutné. Pokud přepsán nebude, použije se místo něj výchozí obsah (zde prázdný řetězec). -Dále máme v bloku klasickou tabulku. Ta obsahuje `` a `` tak, jak jsme zvyklí. Uvnitř `` je makro -`{foreach}`. To se chová jako klasický `foreach` v PHP. Prochází proměnnou `$list` a položky ukládá do proměnné -`$task`. V ní máme od databázové vrstvy jednotlivé sloupce. Všimněte si, že při výpisu se nemusíme starat o escapování -pomocí `htmlspecialchars()`. Nette se o escapování postará samo. Dokonce escapování provádí v závislosti na kontextu - -v bloku JavaScriptu bude používat `json_encode()`, v HTML `htmlspecialchars()`... +Dále máme v bloku klasickou tabulku. Ta obsahuje `` a `` tak, jak jsme zvyklí. Uvnitř `` je makro `{foreach}`. To se chová jako klasický `foreach` v PHP. Prochází proměnnou `$list` a položky ukládá do proměnné `$task`. V ní máme od databázové vrstvy jednotlivé sloupce. Všimněte si, že při výpisu se nemusíme starat o escapování pomocí `htmlspecialchars()`. Nette se o escapování postará samo. Dokonce escapování provádí v závislosti na kontextu - v bloku JavaScriptu bude používat `json_encode()`, v HTML `htmlspecialchars()`... -Další zajímavostí je konstrukce `$task->user->name`. Jak již bylo řešeno v předchozí kapitole o databázi, sloupec `user_id` -považuje databázová vrstva za odkaz na tabulku `user`. Díky tomu se pak můžeme takto odkázat na tabulku `user`. +Další zajímavostí je konstrukce `$task->user->name`. Jak již bylo řešeno v předchozí kapitole o databázi, sloupec `user_id` považuje databázová vrstva za odkaz na tabulku `user`. Díky tomu se pak můžeme takto odkázat na tabulku `user`. Nyní si již můžeme výsledek zobrazit: [* 04-list-table.png *] -Povšimněte si panelu vpravo dole. Tento panel Nette zapíná jen ve vývojovém prostředí a zobrazují se na něm ladící informace. -Po připojení k databázi nám v panelu přibyla nový položka - položené dotazy. Najetím na ní se nám zobrazí seznam všech -dotazů, které byly pro vygenerování stránky použity. Dotaz si můžeme ihned nechat "vysvětlit" (explain). +Povšimněte si panelu vpravo dole. Tento panel Nette zapíná jen ve vývojovém prostředí a zobrazují se na něm ladící informace. Po připojení k databázi nám v panelu přibyla nový položka - položené dotazy. Najetím na ní se nám zobrazí seznam všech dotazů, které byly pro vygenerování stránky použity. Dotaz si můžeme ihned nechat "vysvětlit" (explain). [* 04-debug-panel-sql.png *] -Vraťme se ale ještě na moment k výpisu úkolů. Datum je zde uvedeno v poměrně nepěkném formátu. Drobnou úpravou to -však v mžiku napravíme. Výpis upravíme takto: +Vraťme se ale ještě na moment k výpisu úkolů. Datum je zde uvedeno v poměrně nepěkném formátu. Drobnou úpravou to však v mžiku napravíme. Výpis upravíme takto: /---html {$task->created|date:'j. n. Y'} \--- -Tím zajistíme, že před výpisem proměnné se na ní aplikuje tzv. helper. Helpery jsou malé funkce, které nám pomáhají -jednoduše formátovat výpisy v šabloně. Helper `date` vypíše zadané datum v nějakém přívětivějším formátu. Tento -formát je mu zadán jako parametr za dvojtečkou. Specifikátor může být stejný, jako v případě funkce `date()`, případně -`strftime()`. +Tím zajistíme, že před výpisem proměnné se na ní aplikuje tzv. helper. Helpery jsou malé funkce, které nám pomáhají jednoduše formátovat výpisy v šabloně. Helper `date` vypíše zadané datum v nějakém přívětivějším formátu. Tento formát je mu zadán jako parametr za dvojtečkou. Specifikátor může být stejný, jako v případě funkce `date()`, případně `strftime()`. .[note] Přehled všech helperů, které jsou k dispozici, je k nahlédnutí v dokumentaci v kapitole "Helpery":[http://doc.nette.org/cs/default-helpers]. @@ -207,8 +161,7 @@ Nyní se ale vrhneme na další presenter. `TaskPresenter` *************** -Tato třída již v kostře není. Musíme si jí tedy vytvořit. Ve složce `app/presenters` vytvořte nový soubor -`TaskPresenter.php`. Umístíme do ní prozatím prázdnou třídu, která bude dědit z `BasePresenter`u: +Tato třída již v kostře není. Musíme si jí tedy vytvořit. Ve složce `app/presenters` vytvořte nový soubor `TaskPresenter.php`. Umístíme do ní prozatím prázdnou třídu, která bude dědit z `BasePresenter`u: /---php /** @@ -220,13 +173,9 @@ class TaskPresenter extends BasePresenter } \--- -`BasePresenter` je abstraktní společný předek všech presenterů v aplikaci. Můžeme v něm například provádět inicializaci, -načítat data, která mají být společná pro všechny presentery a další zajímavé věci. My budeme jistě chtít mít přístup -k modelu aplikace i bez toho, abychom musel do každého nově vytvořeného presenteru psát stejnou metodu startup. +`BasePresenter` je abstraktní společný předek všech presenterů v aplikaci. Můžeme v něm například provádět inicializaci, načítat data, která mají být společná pro všechny presentery a další zajímavé věci. My budeme jistě chtít mít přístup k modelu aplikace i bez toho, abychom musel do každého nově vytvořeného presenteru psát stejnou metodu startup. -Proto si nyní odskočíme do `HomepagePresenter`u a přesuneme z něj atribut `$model` a metodu `startup` do `BasePresenter`u. -Navíc nesmíme zapomenout změnit přístupový modifikátor z `private` na `protected`, abychom k němu mohli přistupovat -ze zděděných tříd. +Proto si nyní odskočíme do `HomepagePresenter`u a přesuneme z něj atribut `$model` a metodu `startup` do `BasePresenter`u. Navíc nesmíme zapomenout změnit přístupový modifikátor z `private` na `protected`, abychom k němu mohli přistupovat ze zděděných tříd. .[note] Pokud si nejste jistí, co přesně klíčové slovíčko `protected` znamená, je načase se začíst do dokumentace PHP: @@ -257,7 +206,7 @@ public function actionDefault($id) } \--- -Parametr `$id` bude obsahovat identifikátor, který bude hledán v databázi. Nette si samo zkontroluje `action()` a `render()` metody a pokud mají nějaké argumenty, které přišly adresou, tak je předá podle jména. Více o tomto mechanismu se dozvíme v [sekci o presenterech | cs/presenters#toc-zpracovani-akce-presenteru], prozatím se spokojíme s, pro programátora nejlepším závěrem, "funguje to a nemusíme se o to starat". +Parametr `$id` bude obsahovat identifikátor, který bude hledán v databázi. Nette si samo zkontroluje `action()` a `render()` metody a pokud mají nějaké argumenty, které přišly adresou, tak je předá podle jména. Více o tomto mechanismu se dozvíme v [sekci o presenterech | cs/presenters#toc-zpracovani-akce-presenteru], prozatím se spokojíme s, pro programátora nejlepším závěrem, "funguje to a nemusíme se o to starat". Získaný záznam spolu se seznamem úkolů předáme šabloně v metodě `renderDefault()`: @@ -274,12 +223,10 @@ Metoda `renderDefault` by měla mít stejné parametry, jako action, i když je Šablona ======= -K view nám zbývá napsat jen šablonu. Ve složce `templates` vytvoříme podložku `Task` a do ní šablonu `default.latte`. -Bude velmi podobná té předchozí: +K view nám zbývá napsat jen šablonu. Ve složce `templates` vytvoříme podložku `Task` a do ní šablonu `default.latte`. Bude velmi podobná té předchozí: .[note] -Při vytváření šablon záleží na velikost písmen. Složka s názvem presenteru by měla začínat velkým písmenem, soubor se šablonou -malým. Při vývoji na Windows to nepoznáme, ale pokud aplikaci přeneseme na linuxový server, způsobí to řadu chyb. +Při vytváření šablon záleží na velikost písmen. Složka s názvem presenteru by měla začínat velkým písmenem, soubor se šablonou malým. Při vývoji na Windows to nepoznáme, ale pokud aplikaci přeneseme na linuxový server, způsobí to řadu chyb. /---html {block content} @@ -308,15 +255,13 @@ malým. Při vývoji na Windows to nepoznáme, ale pokud aplikaci přeneseme na {/block} \--- -Nyní už bude vše fungovat! Počkat... ale jak se k nově vytvořené stránce dostat? Možná by bylo dobré si ještě vytvořit -menu s výpisem všech seznamů úkolů.... +Nyní už bude vše fungovat! Počkat... ale jak se k nově vytvořené stránce dostat? Možná by bylo dobré si ještě vytvořit menu s výpisem všech seznamů úkolů.... Navigace ======== -Menu bude společné pro všechny části aplikace. Žhavý kandidát na umístění do `BasePresenter`u! Budeme jej muset vykreslit -na každé stránce, takže použijeme metodu `beforeRender()`, která se provede vždy, nezávisle na view, které má být vykreslováno. +Menu bude společné pro všechny části aplikace. Žhavý kandidát na umístění do `BasePresenter`u! Budeme jej muset vykreslit na každé stránce, takže použijeme metodu `beforeRender()`, která se provede vždy, nezávisle na view, které má být vykreslováno. /---php public function beforeRender() @@ -325,8 +270,7 @@ public function beforeRender() } \--- -Ještě musíme zajistit, aby se menu zobrazilo na každé stránce. Protože každá šablona view dědí od šablony `@layout.latte`, -umístíme vykreslení právě do ní. Připravíme si rovnou základ pro nějaké rozumné rozvržení. Do tagu body přidáme následující +Ještě musíme zajistit, aby se menu zobrazilo na každé stránce. Protože každá šablona view dědí od šablony `@layout.latte`, umístíme vykreslení právě do ní. Připravíme si rovnou základ pro nějaké rozumné rozvržení. Do tagu body přidáme následující kód: /---html @@ -357,10 +301,7 @@ kód:
    \--- -Atribut `n:foreach` je druhý způsob, jak iterovat polem. Tento zápis je ekvivalentní, jako kdyby byl `foreach` umístěn -kolem HTML tagu, ve kterém je uveden. Podobně funguje většina maker, která řídí tok programu: `if`, `for`, `while`... -Pokud před makro napíšeme prefix `inner-`, bude se chovat, jako kdyby bylo napsáno uvnitř HTML tagu. Uvedený zápis -bychom tedy mohli poupravit takto: +Atribut `n:foreach` je druhý způsob, jak iterovat polem. Tento zápis je ekvivalentní, jako kdyby byl `foreach` umístěn kolem HTML tagu, ve kterém je uveden. Podobně funguje většina maker, která řídí tok programu: `if`, `for`, `while`... Pokud před makro napíšeme prefix `inner-`, bude se chovat, jako kdyby bylo napsáno uvnitř HTML tagu. Uvedený zápis bychom tedy mohli poupravit takto: /---html
  • 4~3uE4oZ8| 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 literal 0 HcmV?d00001 diff --git a/files/form-en.png b/files/form-en.png new file mode 100644 index 0000000000000000000000000000000000000000..8a42cc792a712054eb1d9c44865fbbe95e4daa25 GIT binary patch literal 6486 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 literal 0 HcmV?d00001 diff --git a/files/form-example-en.php b/files/form-example-en.php new file mode 100644 index 0000000000..d9eb515752 --- /dev/null +++ b/files/form-example-en.php @@ -0,0 +1,48 @@ +addText('name', 'Name:') + ->setRequired('Please fill your name.'); + +$form->addText('age', 'Age:') + ->setType('number') + ->addRule(Form::INTEGER, 'Your age must be an integer.') + ->addRule(Form::RANGE, 'You must be older %d years and be under %d.', array(18, 120)); + +$form->addPassword('password', 'Password:') + ->setRequired('Pick a password') + ->addRule(Form::MIN_LENGTH, 'Your password has to be at least %d long', 3); + +$form->addPassword('passwordVerify', 'Password again:') + ->setRequired('Fill your password again to check for typo') + ->addRule(Form::EQUAL, 'Password missmatch', $form['password']); + +$form->addSubmit('send', 'Register'); + +$form->setDefaults(array( + 'name' => 'John Doe', + 'age' => 33, +)); + + + +if ($form->isSubmitted() && $form->isValid()) { + echo 'Form was submitted and passed validation'; + + $values = $form->getValues(); + dump($values); +} + +echo $form; + +?> + + + diff --git a/files/form-html5-en.png b/files/form-html5-en.png new file mode 100644 index 0000000000000000000000000000000000000000..d2acba0d3f895964c8e9dfa0443e0c0fcfb2ef18 GIT binary patch literal 8018 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 UmCDR2xc~qF07*qoM6N<$f~YSL2mk;8 literal 0 HcmV?d00001 diff --git a/files/radiolist-en.png b/files/radiolist-en.png new file mode 100644 index 0000000000000000000000000000000000000000..124bd526d430b9e868c497a7b2f326614e62f9d3 GIT binary patch literal 5249 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 Hu0mjfp8XSA literal 0 HcmV?d00001 diff --git a/files/selectbox-en.png b/files/selectbox-en.png new file mode 100644 index 0000000000000000000000000000000000000000..68b55109e14b776919b4a71abd6b7fc67e2a9796 GIT binary patch literal 12952 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 literal 0 HcmV?d00001 From d511489b499a7804a5e0e2b0c974bae2b7e228c4 Mon Sep 17 00:00:00 2001 From: MartyIX Date: Thu, 11 Aug 2011 11:11:26 +0200 Subject: [PATCH 0107/1741] en/forms: secure before is not correct imo --- en/forms.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/forms.texy b/en/forms.texy index 467dc26799..3c84d294e0 100644 --- a/en/forms.texy +++ b/en/forms.texy @@ -684,7 +684,7 @@ $form->addSelect('country', 'Country:', $countries); Cross-Site Request Forgery (CSRF) protection ============================================ -Nette Framework secures your applications before [Cross-Site Request Forgery |vulnerability-protection#toc-cross-site-request-forgery-csrf] (CSRF) attacks. An attacker lures a victim on a webpage, which quietly performs a request to server the victim is logged into. The server would not recognize whether the user send the request willingly. +Nette Framework protects your applications against [Cross-Site Request Forgery |vulnerability-protection#toc-cross-site-request-forgery-csrf] (CSRF) attacks. An attacker lures a victim on a webpage, which quietly performs a request to server the victim is logged into. The server would not recognize whether the user send the request willingly. The protection is pretty simple: From fe8073244ec77e1525d118000b5eef426a2e9794 Mon Sep 17 00:00:00 2001 From: voda Date: Thu, 11 Aug 2011 13:25:30 +0200 Subject: [PATCH 0108/1741] =?UTF-8?q?cs/troubleshooting:=20zm=C4=9Bna=20me?= =?UTF-8?q?tody?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/troubleshooting.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/troubleshooting.texy b/cs/troubleshooting.texy index 8bf3c4b92c..d0d3e5381e 100644 --- a/cs/troubleshooting.texy +++ b/cs/troubleshooting.texy @@ -57,7 +57,7 @@ Nette Framework nechce být knihovnou, tj. širokým souborem tříd poskytujíc Šablona z řetězce ----------------- -Pokud potřebujete použít šablonu (zvláště pak Latte) uloženou v podobě řetězce (vráceném například z databáze), tak jej předejte do metody [api:Nette\Templating\Template::render()]. +Pokud potřebujete použít šablonu (zvláště pak Latte) uloženou v podobě řetězce (vráceném například z databáze), tak jej nastavte metodou [api:Nette\Templating\Template::setSource()]. Jak povolit mod_rewrite? From e63cebe391b1cce4c4fbb8c3c0b77af0b39cb5be Mon Sep 17 00:00:00 2001 From: David Grudl Date: Thu, 11 Aug 2011 15:50:31 +0200 Subject: [PATCH 0109/1741] cs/homepage: new chat --- cs/homepage.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cs/homepage.texy b/cs/homepage.texy index 2115e481f9..bb3a76133e 100644 --- a/cs/homepage.texy +++ b/cs/homepage.texy @@ -21,7 +21,7 @@ Zde najdete celou řadu zdrojů, které vám pomohou naučit se Nette Framework - [Fórum | http://forum.nette.org/cs/] máte otázku? zeptejte se na fóru .[icon]{background-image:url(icon-forum.png)} - [API reference | http://api.nette.org/] přehled tříd, metod a parametrů - [Planette: návody & screencasty | pla:homepage] -- [Chatovací místnost | http://live.jabbim.cz/chat/nette@conf.netlab.cz] +- [Chatovací místnost | http://www.speeqe.com/room/nette@conf.netlab.cz/] - [Dokumentace verze 0.9 | doc-0.9:homepage] From 01d00a572821e5cf8e0b4837e7614fdb84cf66be Mon Sep 17 00:00:00 2001 From: David Grudl Date: Thu, 11 Aug 2011 15:59:20 +0200 Subject: [PATCH 0110/1741] en/homepage: new chat, removed faq --- en/homepage.texy | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/en/homepage.texy b/en/homepage.texy index d0c90b895a..fd7047faa9 100644 --- a/en/homepage.texy +++ b/en/homepage.texy @@ -20,7 +20,7 @@ Here you can find a lot of sources which can help you to learn Nette Framework a - [Community Forum | http://forum.nette.org/en/] have a question? Ask on forum .[icon]{background-image:url(http://files.nette.l/1349/icon-forum.png)} - [API references | http://api.nette.org/] overview of classes, methods and parameters - [Planette: Tutorials & Screencasts | pla:] -- [Chat Room | http://live.jabbim.cz/chat/nette@conf.netlab.cz] +- [Chat Room | http://www.speeqe.com/room/nette@conf.netlab.cz/] [* question.png *] General Info @@ -29,7 +29,6 @@ Here you can find a lot of sources which can help you to learn Nette Framework a - [Features | www:hlavni-prednosti] - [Vulnerability protection] - [Troubleshooting] -- [FAQ: Frequently Asked Questions | faq] - [Glossary] - [Server Requirements | Requirements] - [License] From dcc0938b1836ec74b91608dc2b3804caf596552b Mon Sep 17 00:00:00 2001 From: Mikulas Dite Date: Thu, 11 Aug 2011 17:35:35 +0200 Subject: [PATCH 0111/1741] en/strings: created --- en/strings.texy | 308 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100644 en/strings.texy diff --git a/en/strings.texy b/en/strings.texy new file mode 100644 index 0000000000..8fc3ffd9b1 --- /dev/null +++ b/en/strings.texy @@ -0,0 +1,308 @@ +String processing - Nette\Utils\Strings +*************************************** + +.[perex] +[Nette\Utils\Strings |api:] is a static class, which contains many functions useful functions for working with UTF-8 encoded strings. + +All examples expect the following *using* to be set: + +/--php +use Nette\Utils\Strings; +\-- + + +lower($s) +--------- + +Converts all characters of UTF-8 encoding string to lower case. + +/--php +echo Strings::lower('Hello world'); // hello world +\-- + + +upper($s) +--------- + +Converts all characters of UTF-8 encoding string to upper case. + +/--php +echo Strings::upper('Hello world'); // HELLO WORLD +\-- + + +firstUpper($s) +-------------- + +Converts the first character of UTF-8 encoding string to upper case and leaves other unchanged. + +/--php +echo Strings::firstUpper('hello world'); // Hello world +\-- + + +capitalize($s) +-------------- + +Converts the first character of every word of UTF-8 encoding string to upper case and othres to lower case. + +/--php +echo Strings::capitalize('Hello world'); // Hello World +\-- + + +normalize($s) .{toc: normalize()} +--------------------------------- + +Removes right-side whitspace, control sequences and unifies line endings to `\n`. + + +webalize($s, $charlist=NULL, $lower=TRUE) .{toc: webalize()} +------------------------------------------------------------ + +Adjusts the string for usage in URL, ie. removes all accents and replaces all remaining characters besides english alphabet and numerals with hyphen. + +/--php +echo Strings::webalize('žluťoučký kůň'); // zlutoucky-kun +\-- + +Other characters may be preserved as well, but they must be passed as a second argument. + +/--php +echo Strings::webalize('10. image_id', '._'); // 10.-image_id +\-- + +The third argument may suppress converting the string to lower case. + +/--php +echo Strings::webalize('Hello world', NULL, FALSE); // Hello-world +\-- + + +toAscii($s) +----------- + +Removes accents from UTF-8 encoded string. + +/--php +echo Strings::toAscii('žluťoučký kůň'); // zlutoucky kun +\-- + + +trim($s, $charlist=NULL) .{toc: trim()} +---------------------------------------- + +Removes all left and right side whitespace or any other characters passed in second argument from an UTF-8 encoded string. + +/--php +echo Strings::trim(' Hello '); // 'Hello' +\-- + + +truncate($s, $maxLen, $append=`'…'`) .{toc: truncate()} +--------------------------------------------------------- + +Truncates UTF-8 encoded string to given maximal length, while trying not to split whole words. Only if the string is truncated, an ellipsis (or something else set with third argument) is appended to the string. + +/--php +$text = 'Hello, how are you today?'; +echo Strings::truncate($text, 5); // 'Hell…' +echo Strings::truncate($text, 20); // 'Hello, how are you…' +echo Strings::truncate($text, 30); // 'Hello, how are you today?' +echo Strings::truncate($text, 20, '~'); // 'Hello, how are you~' +\-- + + + +indent($s, $level=1, $indentationChar=`'\t'`) .{toc: indent()} +--------------------------------------------------------------- + +Indents a multiline text from the left. Second argument sets how many indentation chars should be used, while the indent itself is the third argument (*tab* by default). + +/--php +echo Strings::indent('Nette'); // ' Nette' +echo Strings::indent('Nette', 2, '+'); // '++Nette' +\-- + + +padLeft($s, $length, $pad=`' '`) .{toc: padLeft()} +-------------------------------------------------- + +Pads UTF-8 encoded string to given length by prepending `$pad` string to the beginning. + +/--php +echo Strings::padLeft('Nette', 6); // ' Nette' +echo Strings::padLeft('Nette', 8, '+'); // '+++Nette' +echo Strings::padLeft(' Nette', 11, 'WOW'); // 'WOWWO Nette' +\-- + + +padRight($s, $length, $pad=`' '`) .{toc: padRight()} +--------------------------------------------------- + +Pads UTF-8 encoded string to given length by prepending `$pad` string to the end. + +/--php +echo Strings::padRight('Nette', 6); // 'Nette ' +echo Strings::padRight('Nette', 8, '+'); // 'Nette+++' +echo Strings::padRight('Nette is ', 16, 'great'); // 'Nette is greatgr' +\-- + + +fixEncoding($s, $encoding=`'UTF-8'`) .{toc: fixEncoding()} +------------------------------------------------------ + +Removes all invalid characters for given character set. + +/--php +$correctStrings = Strings::fixEncoding($string); +\-- + + +*bool* checkEncoding($s, $encoding=`'UTF-8'`) .{toc: checkEncoding()} +----------------------------------------------------------------- + +Checks whether a string is in valid encoding. + +/--php +$isUtf8 = Strings::checkEncoding($string); +\-- + + +*int* length($s) +---------- + +Returns a length of UTF-8 encoded string. + +/--php +echo Strings::length('Nette'); // '5' +echo Strings::length('červená'); // '7' +\-- + + +*bool* startsWith($haystack, $needle) .{toc: startsWith()} +---------------------------------------------------------- + +Returns `TRUE` if `$haystack` string begins with `$needle`. + +/--php +$haystack = 'Begins'; +$needle = 'Be'; +Strings::startsWith($haystack, $needle); // TRUE +\-- + +*bool* endsWith($haystack, $needle) .{toc: endsWith()} +------------------------------------------------------ + +Returns `TRUE` if `$haystack` string end with `$needle`. + +/--php +$haystack = 'Ends'; +$needle = 'ds'; +Strings::endsWith($haystack, $needle); // TRUE +\-- + + +*bool* compare($left, $right, $len=NULL) .{toc: compare()} +--------------------------------------------------------- + +Compares two UTF-8 encoded strings or their parts, without taking character case into account. If `$len` is greater then zero, the respective amount of characters in the beginning of a string is compared, if it's negative, the characters the strings' ends are compared. Unset `$len` or equal to zero compares whole strings. + +/--php +echo Strings::compare('Nette', 'nette'); // TRUE +echo Strings::compare('Nette', 'next', 2); // TRUE - two first characters match +echo Strings::compare('Nette', 'Latte', -2); // TRUE - two last characters match +\-- + + +chr($code, $encoding=`'UTF-8'`) .{toc: chr()} +----------------------------------------- + +Generates a character from given Unicode code and returns it in requested character set. + +/--php +echo Strings::chr(0xA9); // creates '©' (copyright) in UTF-8 +echo Strings::chr(0x2026, 'CP1250'); // elipsis in CP1250 +\-- + + +random($length=10, $charlist=`'0-9a-z'`) .{toc: random()} +--------------------------------------------------------- + +Generates a random string of given length from characters passed in with second argument. Supports intervals, such as `0-9` or `A-Z`. + +/--php +echo Strings::random(); // '6zq3a1nl8n' +echo Strings::random(5, 'A-Z'); // 'HLKUR' +\-- + + + +Regular expressions +------------------- + +*Strings* class contains a few methods for working with regular expressions. Unlike native php functions, it provides readable API and throws `Nette\RegexpException` if any regex compilation error is found. + +*array* split($subject, $pattern, $flags=NULL) .{toc: split()} +-------------------------------------------------------------- + +Splits string into array by the regular expression. Argument `$flag` takes same arguments as [php:preg_split], but `PREG_SPLIT_DELIM_CAPTURE` is set by default. + +/--php +$res = Strings::split('One, two,three', '~,\s*~'); +// array('One', 'two', 'three') +$res = Strings::split('One, two,three', '~(,)\s*~'); +// array('One', ',', 'two', ',', 'three') +\-- + + +*array* match($subject, $pattern, $flags=NULL, $offset=0) .{toc: match()} +------------------------------------------------------------------------- + +Checks if given string matches a regex pattern and returns an array with first found match and each subpattern. Argument `$flag` takes same arguments as function [php:preg_match]. + +/--php +list($res) = Strings::match('One, two,three', '~[a-z]+~i'); // 'One' +list($res) = Strings::match('One, two,three', '~\d+~'); // NULL +\-- + + +*array* matchAll($subject, $pattern, $flags=NULL, $offset=0) .{toc: matchAll()} +------------------------------------------------------------------------------- + +Finds all occurrences matching regular expression pattern and returns a two-dimensional array. Argument `$flag` takes same arguments as function [php:preg_match_all], but `PREG_SET_ORDER` is set by default. + +/--php +$res = Strings::matchAll('One, two,tree', '~[a-z]+~i'); +/* +array( + 0 => array('One'), + 1 => array('two'), + 2 => array('three'), +) +*/ + +$res = Strings::matchAll('One, two,three', '~\d+~'); // array() +\-- + + +replace($subject, $pattern, $replacement=NULL, $limit=-1) .{toc: replace()} +----------------------------------------------------------------------------- + +Replaces all occurrences matching regular expression, passed in as second argument. Though it might as well be a hash-map in `pattern => replacement` format. The third argument is a replacement string or a callback and the fourth limits the count of replacements. + +/--php +echo Strings::replace('One, two,three', '~[a-z]+~i', '*'); +// '*, *,*' + +echo Strings::replace('One, two,three', array( + '~[a-z]+~i' => '*', + '~\s+~' => '+', +)); +// '*,+*,*' + +echo Strings::replace('One, two,three', '~[a-z]+~i', function ($m) { + return strrev($m[0]); +}); +// 'enO, owt,eerht' +\-- From 6b8c0cc28fec0ddad88a84e856dda25d5d041c1d Mon Sep 17 00:00:00 2001 From: Majkl578 Date: Thu, 11 Aug 2011 19:08:32 +0200 Subject: [PATCH 0112/1741] en/code-checker: created --- en/code-checker.texy | 35 ++++++++++++++++++++++++ en/urls.texy | 65 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 en/code-checker.texy create mode 100644 en/urls.texy diff --git a/en/code-checker.texy b/en/code-checker.texy new file mode 100644 index 0000000000..b66fc5b9b8 --- /dev/null +++ b/en/code-checker.texy @@ -0,0 +1,35 @@ +Code Checker +************ + +.[perex] +The tool called Code-Checker checks and possibly repairs some of the formal errors in your source code. + +/-- +Usage: php code-checker.php [options] + +Options: + -d folder to scan (optional) + -f fixes files + -l convert newline characters +\-- + +Without paramters, it checks the current working directory in a read-only mode, +with `-f` parameter it fixes files. Before you get to know him, be sure to backup your files first. + +You can create `code.bat` file for easier execution of Code-Checker under Windows: + +/-- +php.exe path_to\Nette_tools\Code-Checker\code-checker.php %* +\-- + +What Code-Checker does? +======================= + +- removes [BOM |glossary#bom] +- checks validity of Latte templates +- checks for [control characters |glossary#control characters] +- checks whether the file is encoded in UTF-8 +- controls misspelled `/* @annotations */` (second asterisk missing) +- removes PHP ending tags `?>` in PHP files +- removes trailing whitespace and unnecessary blank lines from the end of a file +- normalizes line endings to system-default (with the `-l` parameter) diff --git a/en/urls.texy b/en/urls.texy new file mode 100644 index 0000000000..e85b3bbc3a --- /dev/null +++ b/en/urls.texy @@ -0,0 +1,65 @@ +Working with URLs - Nette\Http\Url +**************************** + +.[perex] +Class [Nette\Http\Url |api:] encapsulates any URLs according to RFC 3986 +and allows easy manipulation of their parts. + + +The following scheme covers individual parts of URL: + +/-- +scheme user password host port basePath relativeUri + | | | | | | | + /--\ /--\ /------\ /-------\ /--\/--\/----------------------------\ + http://john:x0y17575@nette.org:8042/en/manual.php?name=param#fragment + \__________________________/\____________/^\________/^\______/ + | | | | + authority path query fragment +\-- + +Usage is then very intuitive: + +/--php +use Nette\Http\Url; + +$url = new Url('http://nette.org/en/documentation?action=history#footer'); + +echo $url->absoluteUrl; // or directly echo $url; returns full URL +echo $url->scheme; // http +echo $url->authority; // nette.org +echo $url->hostUri; // http://nette.org +echo $url->path; // /en/documentation +echo $url->query; // action=history +echo $url->fragment; // footer +\-- + +In addition to `http` URL scheme, it's possible to use others, for example `https`, `file` or `ftp`. + +Parts of an URL can of course be changed. + +/--php +$url = new Url('http://nette.org/en/documentation?action=history#footer'); +$url->path = '/'; +$url->appendQuery('page=1'); +echo $url; // http://nette.org/?action=history&page=1#footer +\-- + +The [canonicalize() | api:Nette\Http\Url::canonicalize()] method converts URL to its canonical form. + + +Nette\Http\UrlScript +------------------- + +Class [UrlScript | api:Nette\Http\UrlScript] is a descendant of `Url`. It indicates which part +of URL is a path to currently running script. It is used inside [Nette\Http\Request | HTTP request & response] class. + +/-- +http://nette.org/admin/script.php/pathinfo/?name=param#fragment + \_______________/\________/ + | | + scriptPath pathInfo +\-- + + +{{toc:yes}} From 97576c88712276ffae1b87b92220fcac6658a117 Mon Sep 17 00:00:00 2001 From: MartyIX Date: Thu, 11 Aug 2011 19:11:50 +0200 Subject: [PATCH 0113/1741] en/code-checker: Fixes --- en/code-checker.texy | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/en/code-checker.texy b/en/code-checker.texy index b66fc5b9b8..0008ecf368 100644 --- a/en/code-checker.texy +++ b/en/code-checker.texy @@ -13,10 +13,10 @@ Options: -l convert newline characters \-- -Without paramters, it checks the current working directory in a read-only mode, -with `-f` parameter it fixes files. Before you get to know him, be sure to backup your files first. +Without parameters, it checks the current working directory in a read-only mode, +with `-f` parameter it fixes files. Before you get to know the tool, be sure to backup your files first. -You can create `code.bat` file for easier execution of Code-Checker under Windows: +You can create a batch file, e.g. `code.bat`, for easier execution of Code-Checker under Windows: /-- php.exe path_to\Nette_tools\Code-Checker\code-checker.php %* From 79061c1e471fba7920aab6dd40632c57f8de3ffe Mon Sep 17 00:00:00 2001 From: MartyIX Date: Thu, 11 Aug 2011 19:29:31 +0200 Subject: [PATCH 0114/1741] en/strings: Whitespace is more general than space and a few fixes --- en/strings.texy | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/en/strings.texy b/en/strings.texy index 8fc3ffd9b1..2aeaaafb01 100644 --- a/en/strings.texy +++ b/en/strings.texy @@ -2,7 +2,7 @@ String processing - Nette\Utils\Strings *************************************** .[perex] -[Nette\Utils\Strings |api:] is a static class, which contains many functions useful functions for working with UTF-8 encoded strings. +[Nette\Utils\Strings |api:] is a static class, which contains many useful functions for working with UTF-8 encoded strings. All examples expect the following *using* to be set: @@ -34,7 +34,7 @@ echo Strings::upper('Hello world'); // HELLO WORLD firstUpper($s) -------------- -Converts the first character of UTF-8 encoding string to upper case and leaves other unchanged. +Converts the first character of UTF-8 encoding string to upper case and leaves the other characters unchanged. /--php echo Strings::firstUpper('hello world'); // Hello world @@ -44,7 +44,7 @@ echo Strings::firstUpper('hello world'); // Hello world capitalize($s) -------------- -Converts the first character of every word of UTF-8 encoding string to upper case and othres to lower case. +Converts the first character of every word of UTF-8 encoding string to upper case and the others to lower case. /--php echo Strings::capitalize('Hello world'); // Hello World @@ -54,13 +54,13 @@ echo Strings::capitalize('Hello world'); // Hello World normalize($s) .{toc: normalize()} --------------------------------- -Removes right-side whitspace, control sequences and unifies line endings to `\n`. +Removes right-side spaces, control sequences and unifies line endings to `\n`. webalize($s, $charlist=NULL, $lower=TRUE) .{toc: webalize()} ------------------------------------------------------------ -Adjusts the string for usage in URL, ie. removes all accents and replaces all remaining characters besides english alphabet and numerals with hyphen. +Adjusts the string for usage in URL, i.e. removes all accents and replaces all remaining characters except English alphabet letters and numerals with hyphens. /--php echo Strings::webalize('žluťoučký kůň'); // zlutoucky-kun @@ -92,7 +92,7 @@ echo Strings::toAscii('žluťoučký kůň'); // zlutoucky kun trim($s, $charlist=NULL) .{toc: trim()} ---------------------------------------- -Removes all left and right side whitespace or any other characters passed in second argument from an UTF-8 encoded string. +Removes all left and right side spaces (or the characters passed as second argument) from an UTF-8 encoded string. /--php echo Strings::trim(' Hello '); // 'Hello' From b416da617575ed4e2448cc59f4efcb3a53d71377 Mon Sep 17 00:00:00 2001 From: MartyIX Date: Thu, 11 Aug 2011 20:19:45 +0200 Subject: [PATCH 0115/1741] en/urls: of -> with --- en/urls.texy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/en/urls.texy b/en/urls.texy index e85b3bbc3a..e8f3ffb1fa 100644 --- a/en/urls.texy +++ b/en/urls.texy @@ -3,7 +3,7 @@ Working with URLs - Nette\Http\Url .[perex] Class [Nette\Http\Url |api:] encapsulates any URLs according to RFC 3986 -and allows easy manipulation of their parts. +and allows easy manipulation with their parts. The following scheme covers individual parts of URL: From fcc384bb0df916f51fea5d426e2a42d1df767f15 Mon Sep 17 00:00:00 2001 From: Majkl578 Date: Thu, 11 Aug 2011 21:43:16 +0200 Subject: [PATCH 0116/1741] en/http-request-response: created --- en/http-request-response.texy | 238 ++++++++++++++++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 en/http-request-response.texy diff --git a/en/http-request-response.texy b/en/http-request-response.texy new file mode 100644 index 0000000000..f8ece2924f --- /dev/null +++ b/en/http-request-response.texy @@ -0,0 +1,238 @@ +HTTP request & response +*********************** + +.[perex] +HTTP request and response are encapsulated in [api:Nette\Http\Request] and [Response|api:Nette\Http\Response] objects which offer comfortable API and also act as +sanitization filter. + + +HTTP Request +============== + +Nette Framework cleans out data sent by user from control and invalid characters. It also removes any //magic_quotes//. +Actual HTTP request - instance of [api:Nette\Http\Request] - is available as `httpRequest` service in [system DI Container | configuring]: + +/--php +// $container is a system container +$httpRequest = $container->getService('httpRequest'); + +// shortcut: +$httpRequest = $container->httpRequest; +\-- + +The URL of the request is available as [api:Nette\Http\UrlScript] instance: + +/--php +$url = $httpRequest->getUrl(); +echo $url; // e.g. http://nette.org/en/documentation?action=edit +echo $url->host; // nette.org +\-- + +Determine current HTTP method: + +/--php +echo $httpRequest->getMethod(); // GET, POST, HEAD, PUT + +if ($httpRequest->isMethod('GET')) ... +\-- + +Is the connection encrypted (HTTPS)? + +/--php +echo $httpRequest->isSecured() ? 'yes' : 'no'; +\-- + +Is this an AJAX request? + +/--php +echo $httpRequest->isAjax() ? 'yes' : 'no'; +\-- + +What is the user's IP address? + +/--php +echo $httpRequest->getRemoteAddress(); // user's IP address +echo $httpRequest->getRemoteHost(); // and its DNS translation +\-- + +What URL the user came from? Returned as [Nette\Http\Url |urls] object. + +/--php +echo $httpRequest->getReferer()->host; +\-- + +Request parameters: + +/--php +$get = $httpRequest->getQuery(); // array of all URL parameters +$id = $httpRequest->getQuery('id'); // returns GET parameter 'id' (or NULL) + +$post = $httpRequest->getPost(); // array of all POST parameters +$id = $httpRequest->getPost('id'); // returns POST parameter 'id' (or NULL) + +$cookies = $httpRequest->getCookies(); // array of all cookies +$sessId = $httpRequest->getCookie('sess_id'); // returns the cookie (or NULL) +\-- + +Uploaded files are encapsulated into [api:Nette\Http\FileUpload] objects: + +/--php +$files = $httpRequest->getFiles(); // array of all uploaded files + +$file = $httpRequest->getFile('avatar'); // returns one file +echo $file->getName(); // name of the file sent by user +echo $file->getSanitizedName(); // the name without dangerous characters +\-- + +HTTP headers are also accessible: + +/--php +// returns associative array of HTTP headers +$headers = $httpRequest->getHeaders(); + +// returns concrete header (case-insensitive) +$userAgent = $httpRequest->getHeader('User-Agent'); +\-- + +A useful method is `detectLanguage()`. You can pass it an array with languages supported by application and it returns the one preferred by browser. +It is not magic, the method just uses the `Accept-Language` header. + +/--php +// Header sent by browser: Accept-Language: cs,en-us;q=0.8,en;q=0.5,sl;q=0.3 + +$langs = array('hu', 'pl', 'en'); // languages supported in application + +echo $httpRequest->detectLanguage($langs); // en +\-- + + +RequestFactory and URL filtering +------------------ + +Object holding current HTTP request is created by [api:Nette\Http\RequstFactory]. Its behavior can bemodified. +It's possible to clean up URLs from characters that can get into them because of poorly implemented comment systems on various other websites by using filters: + +/--php +$requestFactory = new Nette\Http\RequestFactory; + +// remove spaces from path +$requestFactory->addUrlFilter('%20', '', PHP_URL_PATH); + +// remove dot, comma or right parenthesis form the end of the URL +$requestFactory->addUrlFilter('[.,)]$'); + +// clean the path from duplicated slashes (default filter) +$requestFactory->addUrlFilter('/{2,}', '/', PHP_URL_PATH); +\-- + +And then we let the factory generate a new `httpRequest` and we store it in a system container: + +/--php +// $container is a system container +$container->addService('httpRequest', $requestFactory->createHttpRequest()); +\-- + + + + +HTTP response +============ + +Actual HTTP request - instance of [api:Nette\Http\Response] - is available as `httpResponse` service in [system DI Container | configuring]: + +/--php +// $container is a system container +$httpResponse = $container->getService('httpResponse'); + +// shortcut: +$httpResponse = $container->httpResponse; +\-- + +Whether it is still possible to send headers or change the status code tells the `isSent()` method. If it returns TRUE, +it won't be possible to send another header or change the status code. + +In that case, any attempt to send header or change code invokes `Nette\InvalidStateException`. .[caution] + + [Response status code | http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10] can be sent and retrieved this way: + +/--php +$httpResponse->setCode(Nette\Http\Response::S404_NOT_FOUND); + +echo $httpResponse->getCode(); // 404 +\-- + +For better source code readability it is recommended to use predefined constants instead of actual numbers: + +/-- +IHttpResponse::S200_OK +IHttpResponse::S204_NO_CONTENT +IHttpResponse::S300_MULTIPLE_CHOICES +IHttpResponse::S301_MOVED_PERMANENTLY +IHttpResponse::S302_FOUND +IHttpResponse::S303_SEE_OTHER +IHttpResponse::S303_POST_GET +IHttpResponse::S304_NOT_MODIFIED +IHttpResponse::S307_TEMPORARY_REDIRECT +IHttpResponse::S400_BAD_REQUEST +IHttpResponse::S401_UNAUTHORIZED +IHttpResponse::S403_FORBIDDEN +IHttpResponse::S404_NOT_FOUND +IHttpResponse::S410_GONE +IHttpResponse::S500_INTERNAL_SERVER_ERROR +IHttpResponse::S501_NOT_IMPLEMENTED +IHttpResponse::S503_SERVICE_UNAVAILABLE +\-- + +Method `setContentType($type, $charset=NULL)` changes `Content-Type` response header: + +/--php +$httpResponse->setContentType('text/plain', 'UTF-8'); +\--- + +Redirection to another URL is done by `redirect($url, $code=302)` method. Do not forget to terminate the script afterwards! + +/--php +$httpResponse->redirect('http://example.com'); +exit; +\--- + + +To set the document expiration date, we can use `setExpiration()` method. The parameter is either text data, number of seconds or a timestamp: + +/--php +// browser cache expires in one hour +$httpResponse->setExpiration('+ 1 hours'); +\--- + +Now we send the HTTP response header: + +/--php +$httpResponse->setHeader('Pragma', 'no-cache'); + +// or if we want to send the same header more times with different values +$httpResponse->addHeader('Pragma', 'no-cache'); +\--- + +Sent headers are also available: + +/--php +// returns associative array of headers +$headers = $httpResponse->getHeaders(); + +// returns concrete header (case-insensitive) +$pragma = $httpResponse->getHeader('Pragma'); +\-- + +There are two methods for cookie manipulation: `setCookie()` and `deleteCookie()`. +/--php +// setCookie($name, $value, $time, [$path, [$domain, [$secure, [$httpOnly]]]]) +$httpResponse->setCookie('lang', 'en', '+ 100 days'); // send cookie + +// deleteCookie($name, [$path, [$domain, [$secure]]]) +$httpResponse->deleteCookie('lang'); // delete cookie +\--- + +These two methods can take more parameters: `$path` (subdirectory where the cookie will be available), +`$domain` and `$secure`. Their detailed description can be found in PHP manual for [php:setcookie] function. + +{{themeicon: icon-communication.png}} From 24e1b8612c937b08a51687a118f88900b221e0d4 Mon Sep 17 00:00:00 2001 From: Semik Date: Fri, 12 Aug 2011 00:38:48 +0200 Subject: [PATCH 0117/1741] en/forms: added implementing interface --- cs/forms.texy | 2 +- en/forms.texy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cs/forms.texy b/cs/forms.texy index c3e66daabb..82ba8c3ff1 100644 --- a/cs/forms.texy +++ b/cs/forms.texy @@ -710,7 +710,7 @@ Pokud programujete vícejazyčnou aplikaci, budete nejspíš potřebovat stejný /--php -class MyTranslator extends Nette\Object +class MyTranslator extends Nette\Object implements Nette\Localization\ITranslator { /** * Translates the given string. diff --git a/en/forms.texy b/en/forms.texy index 3c84d294e0..2a6fd668ba 100644 --- a/en/forms.texy +++ b/en/forms.texy @@ -703,7 +703,7 @@ Multilingual Forms If you are creating a multilingual application, you will need to render the very same form in many language mutations. Nette Framework forms have built-in support for translation. You simply set a *translator* the form, which is an object implementing [api:Nette\Localization\ITranslator] interface, having only one method `translate()`. /--php -class MyTranslator extends Nette\Object +class MyTranslator extends Nette\Object implements Nette\Localization\ITranslator { /** * Translates the given string. From bcbbf6aca86ad7c12a7109beadc9367141abd2d3 Mon Sep 17 00:00:00 2001 From: Mikulas Dite Date: Fri, 12 Aug 2011 09:04:07 +0200 Subject: [PATCH 0118/1741] en/arrays: created --- en/arrays.texy | 130 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 en/arrays.texy diff --git a/en/arrays.texy b/en/arrays.texy new file mode 100644 index 0000000000..cbce4c4e78 --- /dev/null +++ b/en/arrays.texy @@ -0,0 +1,130 @@ +Array processing - Nette\Utils\Arrays +************************************* + +.[perex] +[Nette\Utils\Arrays |api:] is a static class, which contains a handful of handy array functions. + +All examples expect the following using to be set: + +/--php +use Nette\Utils\Arrays; +\-- + + +get($array, $key, $default=NULL) .{toc: get()} +-------------------------------------------- + +Returns `$array[$key]` item. If it does not exist, `Nette\InvalidArgumentException` is thrown, unless a default return value is set as third argument. + +/--php +// if $array['foo'] does not exist, throws an exception +$value = Arrays::get($array, 'foo'); + +// if $array['foo'] does not exist, returns 'bar' +$value = Arrays::get($array, 'foo', 'bar'); +\-- + +Argument `$key` may as well be an array. + +/--php +$array = array('color' => array('favorite' => 'red'), 5); + +$value = Arrays::get($array, array('color', 'favorite')); +// returns 'red' +\-- + + + +getRef(&$array, $key) .{toc: getRef()} +------------------------------------ + +Gets reference to given `$array[$key]`. If the index does not exist, new one is created with `NULL`. + +/--php +$valueRef = & Arrays::getRef($array, 'foo'); +// returns $array['foo'] reference +\-- + +Works with multidimensional arrays as well as [get() | #get()]. + +/--php +$value = & Arrays::get($array, array('color', 'favorite')); +// returns $array['color']['favorite'] reference +\-- + + +grep($array, $pattern, $flags=NULL) .{toc: grep()} +------------------------------------------------ + +Returns only those array items, which matches a regular expression `$pattern`. Regex compilation or runtime error throw `Nette\RegexpException`. + +/--php +$filteredArray = Arrays::grep($array, '~^\d+$~'); +// returns only numerical items +\-- + +Value `PREG_GREP_INVERT` may be set as `$flags`, which inverts the selection. + + +searchKey($array, $key) .{toc: searchKey()} +----------------------------------------- + +Returns zero-indexed position of given array key. Returns `FALSE` if key is not found. + +/--php +$array = array('first' => 10, 'second' => 20); +$position = Arrays::searchKey($array, 'first'); // returns 0 +\-- + + + +insertAfter(&$array, $key, $inserted) .{toc: insertAfter()} +--------------------------------------------------------- + +Appends array `$inserted` after item with `$key` index. If such a `$key` does not exist, the array is inserted at the end. + +/--php +$array = array('first' => 10, 'second' => 20); +Arrays::insertAfter($array, 'first', array('hello' => 'world')); +// $array = array('first' => 10, 'hello' => 'world', 'second' => 20); +\-- + + +insertBefore(&$array, $key, $inserted) .{toc: insertBefore()} +----------------------------------------------------------- + +Prepends content of `$inserted` array into `$array` before item with `$key` index. If such a `$key` does not exist, the array is inserted at the beginning. + +/--php +$array = array('first' => 10, 'second' => 20); +Arrays::insertBefore($array, 'first', array('hello' => 'world')); +// $array = array('hello' => 'world', 'first' => 10, 'second' => 20); +\-- + + +mergeTree($array1, $array2) .{toc: mergeTree()} +------------------------------------------- + +Merges two arrays recursively. Useful for combining tree structures. It behaves as the `+` operator applied to arrays, ie. it adds to keys/values of the second array to the the first one. In case of collision, values of first array are used. + +/--php +$array1 = array('color' => array('favorite' => 'red'), 5); +$array2 = array(10, 'color' => array('favorite' => 'green', 'blue')); + +$array = Arrays::mergeTree($array1, $array2); +// $array = array('color' => array('favorite' => 'red', 'blue'), 5); +\-- + +Values from second array are always appended to the first. Though the disappearance of value `10` might be confusing, it's fine - both `5` of the first array and the `10` do have same key `0`. + + +renameKey(&$array, $oldKey, $newKey) .{toc: renameKey()} +------------------------------------------------------ + +Renames a key. + +/--php +$array = array('first' => 10, 'second' => 20); +Arrays::renameKey($array, 'first', 'renamed'); +// $array = array('renamed' => 10, 'second' => 20); +\-- From 14737e55bd7e443e2baa0b820a96087aace95ee5 Mon Sep 17 00:00:00 2001 From: smasty Date: Fri, 12 Aug 2011 11:17:42 +0200 Subject: [PATCH 0119/1741] cs/urls: Nette\Http\Uri -> Nette\Http\Url --- cs/urls.texy | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cs/urls.texy b/cs/urls.texy index 4f161d4eed..13f92117a9 100644 --- a/cs/urls.texy +++ b/cs/urls.texy @@ -24,13 +24,13 @@ use Nette\Http\Url; $uri = new Url('http://nette.org/cs/dokumentace?action=history#footer'); -echo $uri->absoluteUri; // nebo přímo echo $uri; vrací celou vstupní URL -echo $uri->scheme; // http -echo $uri->authority; // nette.org -echo $uri->hostUri; // http://nette.org -echo $uri->path; // /cs/dokumentace -echo $uri->query; // action=history -echo $uri->fragment; // footer +echo $url->absoluteUrl; // nebo přímo echo $url; vrací celou vstupní URL +echo $url->scheme; // http +echo $url->authority; // nette.org +echo $url->hostUri; // http://nette.org +echo $url->path; // /cs/dokumentace +echo $url->query; // action=history +echo $url->fragment; // footer \-- Kromě URL schématu `http` je možné používat i další, například `https`, `file` nebo `ftp`. @@ -38,10 +38,10 @@ Kromě URL schématu `http` je možné používat i další, například `https` Části URL lze pochopitelně i měnit. /--php -$uri = new Uri('http://nette.org/cs/dokumentace?action=history#footer'); -$uri->path = '/'; -$uri->appendQuery('page=1'); -echo $uri; // http://nette.org/?action=history&page=1#footer +$url = new Url('http://nette.org/cs/dokumentace?action=history#footer'); +$url->path = '/'; +$url->appendQuery('page=1'); +echo $url; // http://nette.org/?action=history&page=1#footer \-- Metoda `canonicalize()` převede URL na kanonickou formu. From 536fc48344b321e548ed95ba2b37ffc6f74cc0f4 Mon Sep 17 00:00:00 2001 From: smasty Date: Fri, 12 Aug 2011 11:19:21 +0200 Subject: [PATCH 0120/1741] cs/http-request-response: reflect new namespaces (Nette\Web\Url) --- cs/http-request-response.texy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cs/http-request-response.texy b/cs/http-request-response.texy index e9899ec3d6..3c8c1300a5 100644 --- a/cs/http-request-response.texy +++ b/cs/http-request-response.texy @@ -19,7 +19,7 @@ $httpRequest = $container->getService('httpRequest'); $httpRequest = $container->httpRequest; \-- -URL požadavku získáme jako objekt `Nette\Web\UrlScript`: +URL požadavku získáme jako objekt [api:Nette\Http\UrlScript]: /--php $uri = $httpRequest->getUrl(); @@ -54,7 +54,7 @@ echo $httpRequest->getRemoteAddress(); // IP adresa uživatele echo $httpRequest->getRemoteHost(); // a její DNS překlad \-- -Z jaké URL uživatel přišel? Vrací se jako objekt [Nette\Web\Url |urls] +Z jaké URL uživatel přišel? Vrací se jako objekt [Nette\Http\Url |urls] /--php echo $httpRequest->getReferer()->host; From 9b7ac0617e298352dc90ef7866785ecc9ab92a45 Mon Sep 17 00:00:00 2001 From: Mikulas Dite Date: Fri, 12 Aug 2011 11:21:39 +0200 Subject: [PATCH 0121/1741] en/html-elements: created --- en/html-elements.texy | 182 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 en/html-elements.texy diff --git a/en/html-elements.texy b/en/html-elements.texy new file mode 100644 index 0000000000..ed4fbb7c9c --- /dev/null +++ b/en/html-elements.texy @@ -0,0 +1,182 @@ +HTML elements +************* + +.[perex] +[Nette\Utils\Html |api:] class helps with HTML generation. + +All examples expect the following using to be set: + +/--php +use Nette\Utils\Html; +\-- + +/--php +$el = Html::el('img'); // creates element +$el->src = 'image.jpg'; // sets src attribute +echo $el; // prints + +echo $el->getName(); // returns 'img', element's name +echo $el->isEmpty(); // returns TRUE, as is in fact empty +\-- + +Change or read HTML attributes is possible over object properties. Setting the value to `NULL` or removing it with `unset()` function removes the attribute. + +/--php +echo $el->src; // prints 'image.jpg' +unset($el->src); // or $el->src = NULL; - removes src attribute +\-- + +The very same output can be achived by calling chained methods (fluent interfaces): + +/--php +// photo +echo Html::el('img')->src('image.jpg')->alt('photo'); +\-- + +Attributes may be set in bulk, even when creating the element: + +/--php +$el = Html::el('input type=text class="red important"'); + +$el = Html::el('input', array( + 'type' => 'text', + 'class' => array('red', 'important'), +)); + +$el->addAttributes(array( // bulk attributes set + 'value' => $val, + 'required' => TRUE, +)); +\-- + +An automatic [Cross Site Scriptingu (XSS) |vulnerability-protection#toc-cross-site-scripting-xss] protection is an important feature: + +/--php +echo Html::el('input')->value(''); +// +\-- + +An attributes' value may not be only a string, but might as well be a boolean or an array. + +/--php +$checkbox = Html::el('input')->type('checkbox'); +$checkbox->checked = TRUE; // +$checkbox->checked = FALSE; // + +// with arrays +$el->class[] = $active ? 'active' : NULL; // attribute equal to NULL is ignored +$el->class[] = 'top'; +// alternatively $el->class['top'] = TRUE; or $el->class('top', TRUE); + +$el->style['color'] = 'green'; // or $el->style('color', 'green'); +$el->style['display'] = 'block'; + +echo $el; +// +\-- + +Metod `href()` helps chaining URL: + +/--php +echo Html::el('a')->href('index.php', array( + 'id' => 10, + 'lang' => 'en', +)); +// +\-- + + +HTML5 supports so called *data attributes* for user-set data: + +/---html + +\--- + +Such values are usually used in JavaScript. They do work in all browsers. + +Class Html has a direct support for these attributes: + +/--php +$el = Html::el('img'); +$el->data['max-size'] = '500x300'; +// nebo +$el->data('max-size', '500x300'); +\-- + + +Elements' content +----------------- + +Textual content may be set with `setText()` or `setHtml()` or while creating an element: + +/--php +echo Html::el('a')->href('#')->setText('link
    '); +// link<br> + +echo Html::el('a')->href('#')->setHtml('link
    '); +// link
    + +echo Html::el('strong', 'Nette'); +// Nette or equal output with setText() +\-- + +Getting textual content of element is done with `getText()` or `getHtml()`. + +More Html element may be nested under each other: + +/--php +$el = Html::el('div'); + +// inserts new element into