diff --git a/soneta-form-xml/SKILL.md b/soneta-form-xml/SKILL.md
new file mode 100644
index 0000000..f783f30
--- /dev/null
+++ b/soneta-form-xml/SKILL.md
@@ -0,0 +1,734 @@
+---
+name: soneta-form-xml
+description: Tworzenie plików form.xml opisujących formularze, zakładki i widoki UI dla platformy enova365/Soneta Enterprise. Używaj gdy użytkownik prosi o utworzenie zakładki formularza (pageform.xml), widoku listy (viewform.xml), formularza (form.xml), lookupu (lookupform.xml), lub gdy pyta o strukturę i składnię plików form.xml dla enova365.
+---
+
+# Soneta Form XML - Formularze UI
+
+Skill do tworzenia plików XML definiujących interfejs użytkownika w systemie enova365/Soneta Enterprise.
+
+## Typy plików formularzy
+
+| Typ pliku | Wzorzec nazwy | Przeznaczenie |
+|-----------|---------------|---------------|
+| **pageform.xml** | `{DataType}.{PageName}.pageform.xml` | Zakładka formularza edycji obiektu |
+| **viewform.xml** | `{NazwaWidoku}.viewform.xml` | Widok listy zarejestrowanej jako folder (listy główne) |
+| **gridform.xml** | `{IdentyfikatorListy}.gridform.xml` | Indywidualne ustawienia listy na formularzu |
+| **lookupform.xml** | `{NazwaPodpowiedzi}.lookupform.xml` | Lista wyboru (lookup) |
+| **form.xml** | `{Nazwa}.form.xml` | Współdzielony fragment UI (include) |
+
+### Format nazwy pageform.xml
+
+Nazwa pliku składa się z 4 części rozdzielonych kropkami:
+
+```
+{DataType}.{PageName}.pageform.xml
+```
+
+- **DataType** - typ danych, dla którego definiowana jest zakładka (np. `Towar`, `Kontrahent`, `DokumentHandlowy`)
+- **PageName** - nazwa zakładki (np. `Ogolne`, `Dodatkowe`, `Adresy`)
+- **pageform.xml** - stały sufiks
+
+**Przykłady:**
+- `Towar.Ogolne.pageform.xml`
+- `Towar.Dodatkowe.pageform.xml`
+- `Kontrahent.Adresy.pageform.xml`
+- `DokumentHandlowy.Pozycje.pageform.xml`
+
+### Format nazwy viewform.xml
+
+Nazwa pliku składa się z 3 części rozdzielonych kropkami:
+
+```
+{NazwaWidoku}.viewform.xml
+```
+
+**Przykłady:**
+- `Towary.viewform.xml`
+- `Kontrahenci.viewform.xml`
+- `DokumentyHandlowe.viewform.xml`
+
+### Format nazwy gridform.xml
+
+Nazwa pliku składa się z 3 części rozdzielonych kropkami:
+
+```
+{IdentyfikatorListy}.gridform.xml
+```
+
+**Przykłady:**
+- `PozycjeDokumentu.gridform.xml`
+- `RachunkiBankowe.gridform.xml`
+
+### Format nazwy lookupform.xml
+
+Nazwa pliku składa się z 3 części rozdzielonych kropkami:
+
+```
+{NazwaPodpowiedzi}.lookupform.xml
+```
+
+**Przykłady:**
+- `Towary.lookupform.xml`
+- `Kontrahenci.lookupform.xml`
+
+## Hierarchia elementów XML
+
+Elementy XML dzielą się na trzy grupy dziedziczące po `uiElement`:
+
+1. **Elementy proste** - Field, Label, Command, Gap, Html, GroupBy, Axis
+2. **Kontenery elementów** - Group, Stack, Row, Flow, Bar, Dashboard, Include, Page (dziedziczą po `ContainerElement`)
+3. **Kolekcje** - Grid, Cards, Scheduler, Chart, Diagram, Pivot (dziedziczą po `CollectionElement`)
+
+## Struktura dokumentu
+
+Każdy plik formularza zaczyna się od deklaracji XML i elementu głównego `DataForm`:
+
+```xml
+
+
+
+
+```
+
+### Atrybuty DataForm
+
+| Atrybut | Opis |
+|---------|------|
+| `Priority` | Kolejność zakładek (domyślnie 100, niższa = wcześniej) |
+| `RightName` | Opcjonalny. Nazwa uprawnienia do zakładki (tylko gdy inna niż standardowa) |
+| `Contexts` | Warunki licencyjne, np. `"Licence.HAN \| Licence.FA"` (nie bindowane) |
+| `ViewType` | Typ widoku: `None`, `Dialog`, `Form`, `Folder` |
+| `Mode` | Tryb: `None`, `Form`, `Folder`, `Wizard`, `Modal`, `Popup`, `Frame` |
+| `DataType` | Opcjonalny. Pełne określenie typu danych (wymagany tylko gdy nazwa pliku nie określa jednoznacznie typu), np. `"Soneta.Handel.DokumentHandlowy,Soneta.Handel"` |
+
+## Wspólne atrybuty elementów
+
+Następujące atrybuty mogą być użyte w **dowolnym** elemencie form.xml:
+
+| Atrybut | Opis |
+|---------|------|
+| `Name` | Identyfikator elementu, który można wykorzystać w kodzie C# |
+| `Class` | Klasy stylów (lista wartości oddzielonych spacją) |
+| `DataContext` | Zmienia kontekst danych dla elementu i wszystkich jego elementów podrzędnych |
+| `Visibility` | Warunek widoczności (bindowalne z logiką biznesową) |
+| `Renderable` | Czy element ma być dostępny. Wyrażenie liczone **raz** przy logowaniu operatora - optymalne dla warunków zależnych od środowiska, licencji i innych parametrów niezmiennych w trakcie sesji |
+
+### Atrybut CaptionHtml
+
+Atrybut `CaptionHtml` występuje w elementach: `Label`, `Field`, `Group`, `Page`, `Command` i innych.
+
+Może zawierać:
+- Tekst etykiety (w formacie HTML)
+- Wyrażenia bindowane w klamrach: `{wyrażenie}` - wartość tekstowa jest automatycznie kodowana do HTML
+- Wyrażenia zwracające kod HTML: `{WłaściwośćHtml}` - nazwa musi mieć sufiks `Html`, wtedy wartość nie jest kodowana
+- Podwójne klamry dla literalnych znaków: `{{` → `{`, `}}` → `}`
+
+**Specjalne przypadki w `Field`:**
+- Brak atrybutu → automatyczna etykieta wyliczana na podstawie danych
+- `CaptionHtml=" "` (spacja) → pusta etykieta (miejsce na etykietę zostaje zachowane)
+- `CaptionHtml=""` (pusty) → brak etykiety (pole bez miejsca na etykietę)
+
+**Alternatywa:** Zamiast `CaptionHtml` można użyć `CaptionMarkdown` dla etykiet w formacie Markdown.
+
+## Elementy kontenerowe
+
+### Page - Zakładka
+
+Główny kontener dla zawartości zakładki:
+
+```xml
+
+
+
+```
+
+| Atrybut | Opis |
+|---------|------|
+| `Name` | Opcjonalny. Unikalny identyfikator zakładki |
+| `CaptionHtml` | Tytuł zakładki. Może zawierać `/` do grupowania zakładek (np. `"Dokumenty/Faktury"`) |
+| `DataContext` | Źródło danych. `{DataSource}` oznacza obiekt edytowany na zakładce, ale można wskazać inne dane |
+| `Visibility` | Wyrażenie warunkowe widoczności (bindowalne) |
+| `Renderable` | Czy zakładka ma być dostępna. Wyrażenie liczone raz przy logowaniu - optymalne dla warunków zależnych od środowiska, licencji itp. |
+| `Key` | Skrót klawiaturowy wywołujący zakładkę formularza |
+| `GroupIcon` | Ikona grupy zakładek |
+
+### Zasada budowania zakładki formularza
+
+Zakładka składa się z elementów ``. Każda grupa może zawierać:
+
+1. **Listę pól w kolumnie** - pola ułożone pionowo jedno pod drugim
+2. **Układ wielokolumnowy** - `` zawierający kilka `` z polami
+3. **Listę elementów podrzędnych** - np. Grid, ewentualnie poprzedzony polami filtrującymi
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### Group - Grupa pól
+
+Wizualna ramka grupująca powiązane pola:
+
+```xml
+
+
+
+
+```
+
+| Atrybut | Opis |
+|---------|------|
+| `CaptionHtml` | Tytuł grupy |
+| `LabelWidth` | Opcjonalny. Szerokość etykiet dla wszystkich pól w kontenerze |
+| `Visibility` | Warunek widoczności (bindowalne z logiką biznesową) |
+| `Renderable` | Czy grupa ma być dostępna (liczone raz przy logowaniu) |
+
+### Stack - Układ pionowy
+
+Układa elementy jeden pod drugim:
+
+```xml
+
+
+
+
+```
+
+### Row - Układ poziomy
+
+Układa elementy obok siebie w wierszu:
+
+```xml
+
+
+
+
+```
+
+**Pole na całą szerokość:** użyj `Width="*"`
+
+**Pola dosunięte do prawej:** umieść `` na początku:
+
+```xml
+
+
+
+
+
+```
+
+### Flow - Układ płynny
+
+Elementy umieszczane są od lewej do prawej. Gdy nie mieszczą się na formularzu, przenoszone są do nowego wiersza:
+
+```xml
+
+
+
+
+
+```
+
+## Elementy pól i kontrolek
+
+### Field - Pole edycyjne
+
+Podstawowy element do wyświetlania i edycji danych. Jest generowany **dynamicznie** - w zależności od typu właściwości wyświetla odpowiednią kontrolkę (int → pole numeryczne, bool → checkbox, double → pole z kalkulatorem, typ Sonety → lookup z listą wyboru).
+
+Minimalny `` powinien zawierać:
+- `EditValue` - **wymagany**, binding do właściwości
+- `CaptionHtml` - etykieta pola
+- `Width` - szerokość pola
+
+```xml
+
+```
+
+| Atrybut | Opis |
+|---------|------|
+| `EditValue` | **Wymagany**. Binding do właściwości: `{Właściwość}` lub `{new Extender.Właściwość}` |
+| `CaptionHtml` | Etykieta pola (patrz sekcja "Atrybut CaptionHtml") |
+| `Width` | Szerokość pola w znakach lub px (`*` = wypełnij) |
+| `OuterWidth` | Całkowita szerokość z etykietą (do wyrównywania w pionie) |
+| `LabelWidth` | Szerokość etykiety |
+| `Height` | Wysokość w wierszach lub px (dla pól wieloliniowych) |
+| `IsReadOnly` | Warunek tylko do odczytu (bindowalne z logiką biznesową). Logika biznesowa ma wyższy priorytet |
+| `Visibility` | Warunek widoczności (bindowalne z logiką biznesową): `true`/`false`/`Visible`/`Hidden`/`Collapsed` |
+| `Renderable` | Czy pole ma być dostępne (liczone raz przy logowaniu) |
+| `Format` | Formatowanie wartości w standardzie .NET `string.Format`. Pole `{0}` to wartość edytowana |
+| `Footer` | Agregacja w stopce **tylko na listach**: `Sum`, `Count`, `Average`, `Min`, `Max` |
+| `CheckedValue` | Wartość dla **RadioButton** |
+| `Class` | Klasy stylów (patrz sekcja Class) |
+| `DataContext` | Zmienia kontekst danych dla tego pola i elementów podrzędnych |
+
+#### RadioButton
+
+Aby utworzyć RadioButton, dodaj parametr `CheckedValue`:
+
+```xml
+
+
+
+```
+
+Pola z tym samym `EditValue` i różnymi `CheckedValue` tworzą grupę RadioButton.
+
+### Label - Etykieta
+
+Tekst bez możliwości edycji:
+
+```xml
+
+```
+
+### Gap - Odstęp
+
+Wypełniacz przestrzeni. Użyteczny do dosunięcia elementów do prawej strony (gdy `` jest na początku wiersza).
+
+```xml
+
+
+
+
+```
+
+**Uwaga:** `` jako ostatni element w wierszu nie jest potrzebny - nic nie zmienia.
+
+### Command - Przycisk/Polecenie
+
+```xml
+
+```
+
+| Atrybut | Opis |
+|---------|------|
+| `MethodName` | Nazwa metody do wywołania (szukana w klasie z kontekstu formularza) |
+| `MoreMethodName` | Dodatkowa metoda (dla przycisków dzielonych - wersja przeglądowa) |
+| `Key` | Skrót klawiszowy |
+| `CommandStyle` | Styl: `Default`, `Important`, `Red`, `Green`, `Blue` |
+| `Icon` | Nazwa ikony (nie działa w enova365 desktop) |
+| `Class` | Klasy stylów |
+| `DataContext` | Zmienia kontekst danych (np. `{new MojExtender}` - patrz sekcja Bindowanie danych) |
+| `Renderable` | Czy przycisk ma być dostępny (liczone raz przy logowaniu) |
+
+### Include - Dołączenie fragmentu
+
+Wstawia zawartość innego pliku form.xml lub dynamicznie generowany element UI:
+
+```xml
+
+
+
+
+
+
+
+
+```
+
+| Atrybut | Opis |
+|---------|------|
+| `Source` | Nazwa pliku form.xml **lub** wyrażenie bindujące zwracające element DOM (`UIElement`) z kodu. Wyrażenie bindujące jest wywoływane po każdej zmianie danych, co pozwala budować dynamiczne formularze |
+| `DataContext` | Opcjonalny. Kontekst danych dla dołączanego fragmentu |
+| `Path` | Opcjonalny. Określa element pliku form.xml, który zostanie wstawiony (gdy Source jest nazwą pliku) |
+| `Suffix` | Opcjonalny. Napis dodawany do każdej nazwy (`Name`) elementów dołączonych przez Include |
+
+## Kolekcje i listy
+
+### Grid / List - Tabela danych
+
+```xml
+
+
+
+
+
+
+```
+
+| Atrybut | Opis | Default |
+|---------|------|---------|
+| `EditValue` | Źródło danych kolekcji | - |
+| `SelectedValue` | Binding do zaznaczonych wierszy - typ `DataType[]` (tablica) | - |
+| `FocusedValue` | Binding do podświetlonego wiersza - typ `DataType` (obiekt) | - |
+| `IsToolbarVisible` | Pokazuj pasek narzędzi | `false` |
+| `IsFilterRowVisible` | Pokazuj wiersz filtrujący | `false` |
+| `IsHeaderVisible` | Widoczność nagłówków z tytułami kolumn | `true` |
+| `EditInPlace` | Edycja bezpośrednio w komórkach | `false` |
+| `NewInPlace` | Dodawanie przez kliknięcie pustego wiersza | `false` |
+| `AlwaysAddNewRow` | Nowy wiersz od razu dodawany (Esc nie usuwa) | `false` |
+| `PreventNewRowOnFocus` | Zapobiegaj nowemu wierszowi przy fokusie | `false` |
+| `KeepsSequence` | Czy po edycji in-place zachować kolejność wierszy (`true`) czy ponownie sortować (`false`) | `false` |
+| `OpenMethodName` | Metoda wywoływana po Enter/double-click (domyślnie otwarcie formularza) | - |
+| `IsSmartOpen` | Kolumna ze strzałką do otwarcia formularza | - |
+| `NewButton` | Stan przycisku Nowy: `Auto`, `None`, `Visible` | auto |
+| `EditButton` | Stan przycisku Otwórz | auto |
+| `UpdateButton` | Stan przycisku Aktualizuj | auto |
+| `RemoveButton` | Stan przycisku Usuń | auto |
+| `SearchButton` | Stan przycisku Szukaj | auto |
+| `MoreButton` | Przycisk więcej: `None`, `Visible`, `Actions` | auto |
+| `OrderBy` | Domyślne sortowanie (np. `"Kolumna desc"`) | - |
+| `Filter` | Filtr danych | - |
+| `ResourceName` | Nazwa pliku grid.xml z indywidualnymi ustawieniami | - |
+| `SumType` | Typ sum: `None`, `Selected`, `All`, `Groups`, `GroupsNewLine` | `None` |
+| `ActionsMode` | Czy workery przypięte do listy mają być w menu Czynności formularza: `FormAndControl`, `Control`, `Form` | - |
+
+#### Atrybuty dla drzewa (Tree)
+
+| Atrybut | Opis | Default |
+|---------|------|---------|
+| `TreeNodesValue` | Binding do węzłów | - |
+| `TreeHasNodesValue` | Binding sprawdzający czy ma węzły | - |
+| `TreeParentValue` | Binding do rodzica | - |
+| `TreeExpandingLevel` | Poziom rozwinięcia: `Collapsed`, `ExpandRoot`, `ExpandRootFix`, `ExpandAll` | `Collapsed` |
+
+### GroupBy - Grupowanie w Grid
+
+```xml
+
+
+
+
+```
+
+## Elementy specjalne
+
+### Chart - Wykres
+
+```xml
+
+
+
+
+
+
+```
+
+Typy wykresów: `Line`, `Bar`, `Pie`, `Donut`, `Spider`, `Polar`, `Area`, `Pyramid`, `Funnel`, `Bubble`, `Scatter`
+
+### Scheduler - Kalendarz
+
+```xml
+
+
+
+
+
+```
+
+### Gantt / GanttDiagram - Harmonogram
+
+```xml
+
+
+
+
+
+```
+
+### Html / Markdown - Treść formatowana
+
+```xml
+
+
+```
+
+### Indicator - Wskaźnik
+
+```xml
+
+```
+
+### Dashboard - Panel kafelkowy
+
+```xml
+
+
+
+
+
+```
+
+## Bindowanie danych
+
+Każdy element form.xml znajduje się w odpowiednim kontekście powiązanego obiektu C#. Powiązany typ danych zależy od typu danych dla którego zdefiniowany jest pageform.xml.
+
+### Powiązanie typu z formularzem
+
+Powiązanie z typem w elemencie root odbywa się przez:
+
+1. **Przez nazwę pliku pageform.xml** - pierwszy człon nazwy pliku (DataType) określa typ obiektu. Np. dla pliku `Towar.Ogolne.pageform.xml` kontekstem jest klasa `Towar`.
+
+2. **Przez atrybut DataType w DataForm** - jawne określenie typu:
+ ```xml
+
+ ```
+
+3. **Przez rejestrację FolderViewAttribute** - wiążącą folder programu z obiektem biznesowym i formularzem prezentującym ten folder.
+
+### Zmiana kontekstu danych
+
+- **DataContext** - zmienia kontekst **aktualnego elementu i wszystkich elementów podrzędnych**:
+ ```xml
+
+
+
+
+ ```
+
+- **EditValue** - zmienia kontekst **tylko elementów podrzędnych** (bez aktualnego kontenera):
+ ```xml
+
+
+
+
+ ```
+
+### Składnia wyrażeń w klamrach
+
+W wyrażeniach `{...}` można odwoływać się do:
+
+| Składnia | Opis |
+|----------|------|
+| `{Właściwość}` | Publiczna właściwość obiektu w kontekście |
+| `{Metoda()}` | Wartość zwracana przez publiczną metodę. Parametry metody są uzupełniane automatycznie na podstawie aktualnego kontekstu UI (`Soneta.Business.Context`) |
+| `{Obiekt.Właściwość}` | Właściwość zagnieżdżona |
+| `{Context.TypDanych.Pole}` | Wartość z aktualnego kontekstu UI (`Soneta.Business.Context`) |
+| `{Features.NazwaCechy}` | Cechy powiązane z obiektem biznesowym `Row` |
+| `{Workers.NazwaWorkera.Pole}` | Właściwość workera powiązanego z obiektem (`WorkerAttribute`) |
+| `{new NazwaExtender.Pole}` | Właściwość extendera (worker niepowiązany z konkretnymi danymi) |
+| `{Tablica[indeks]}` | Element tablicy pod wskazanym indeksem |
+| `{.}` | Aktualna wartość w kontekście elementu |
+
+### Wyrażenia porównań
+
+| Składnia | Opis |
+|----------|------|
+| `{Pole=wartość}` | Porównanie równości |
+| `{Pole!=wartość}` | Porównanie nierówności |
+| `{!PoleLogiczne}` | Negacja wartości logicznej |
+| `{?warunek}` | Warunek oparty o klasę `RowCondition` |
+
+### Przykłady bindingów
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### Wyrażenia warunkowe (RowCondition)
+
+```xml
+Visibility="{?State=Added}"
+Visibility="{?!State=Added}"
+Visibility="{?Typ=Towar or Typ=Usługa}"
+Visibility="{?Aktywny and Widoczny}"
+```
+
+## Atrybut Class - Style i zachowania
+
+Atrybut `Class` może zawierać wiele wartości oddzielonych spacją:
+
+```xml
+
+```
+
+### Style etykiet
+- `BoldLabel` - pogrubiona etykieta
+- `CenterLabel` - wycentrowana
+- `RightLabel` - wyrównana do prawej
+- `MultilineLabel` - wieloliniowa
+- `NoColonLabel` - bez dwukropka
+- `WarningLabel` - ostrzeżenie
+- `InfoLabel` - informacja
+- `TipLabel` - podpowiedź
+
+### Style czcionek
+- `LargeFont` - duża czcionka
+- `BoldFont` - pogrubiona
+- `GreenFont` - zielona
+- `RedFont` - czerwona
+- `WarningFont` - ostrzegawcza
+- `FixedWidthFont` - stała szerokość
+
+### Wyrównanie
+- `LeftAlign`, `RightAlign`, `TextRight`
+
+### Typy edytorów
+- `PasswordEdit` - hasło
+- `ColorEdit` - wybór koloru
+- `RichEdit` - edytor HTML
+- `ImageEdit` - obraz
+- `FileEdit` - wybór pliku
+- `FolderEdit` - wybór folderu
+- `PathPropertyEdit` - ścieżka
+- `HyperlinkEdit` - hiperłącze
+- `EmailEdit` - email
+- `PhoneEdit` - telefon
+- `RatingEdit` - ocena gwiazdkowa
+- `ProgressEdit` - pasek postępu
+- `IconEdit` - ikona
+- `CheckButtonEdit` - checkbox jako przycisk
+- `XmlEdit` - edytor XML
+- `DataTextEdit` - tekst danych
+
+### Zachowania
+- `Collapsable` - zwijalna grupa
+- `Expandable` - rozwijalna
+- `Expanded` - domyślnie rozwinięta
+- `Hidden` - ukryty
+- `FirstResponder` - pole z fokusem zaraz po otwarciu formularza
+- `Scrollable` - przewijalna
+- `ImageCircle` - okrągły obraz
+- `Tree` - drzewo
+
+### Układy i pozycjonowanie
+- `GroupItem` - element umieszczony na wysokości nagłówka `` (zwykle po prawej stronie), służy do sterowania zawartością pozostałych elementów grupy
+- `Reverse` - układa elementy w odwrotnej kolejności (od prawej do lewej lub od dołu do góry)
+- `SmartOpen` - kolumna w `Grid` wyróżniona do szybkiego otwierania formularza (ze strzałką)
+
+### Przyciski
+- `MainCommand` - główny przycisk
+- `SplitCommand` - przycisk z menu
+- `CommandNoText` - tylko ikona
+- `CommandIcoText` - ikona i tekst
+- `WorkerCommand` - przycisk workera
+- `WizardCommand` - przycisk kreatora
+- `PrintButton` - przycisk drukowania
+
+## Appearance - Warunkowe formatowanie
+
+```xml
+
+
+
+
+```
+
+## Przykłady
+
+### Prosta zakładka (pageform.xml)
+
+Plik: `MojObiekt.Ogolne.pageform.xml`
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### Współdzielony fragment (form.xml)
+
+Plik: `Adres.form.xml`
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+## Referencje
+
+- Pełna specyfikacja elementów: [references/ELEMENTS.md](references/ELEMENTS.md)
+- Schemat XSD: [references/Form.xsd](references/Form.xsd)
diff --git a/soneta-form-xml/assets/Adres.form.xml b/soneta-form-xml/assets/Adres.form.xml
new file mode 100644
index 0000000..96bcde2
--- /dev/null
+++ b/soneta-form-xml/assets/Adres.form.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soneta-form-xml/assets/Kontrahent.WarunkiHandlowe.pageform.xml b/soneta-form-xml/assets/Kontrahent.WarunkiHandlowe.pageform.xml
new file mode 100644
index 0000000..5d2db11
--- /dev/null
+++ b/soneta-form-xml/assets/Kontrahent.WarunkiHandlowe.pageform.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soneta-form-xml/assets/MojObiekt.Ogolne.pageform.xml b/soneta-form-xml/assets/MojObiekt.Ogolne.pageform.xml
new file mode 100644
index 0000000..ab46827
--- /dev/null
+++ b/soneta-form-xml/assets/MojObiekt.Ogolne.pageform.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soneta-form-xml/references/ELEMENTS.md b/soneta-form-xml/references/ELEMENTS.md
new file mode 100644
index 0000000..810aee5
--- /dev/null
+++ b/soneta-form-xml/references/ELEMENTS.md
@@ -0,0 +1,864 @@
+# Pełna specyfikacja elementów Form XML
+
+Kompletna lista elementów XML dostępnych w plikach form.xml platformy enova365.
+
+## Spis treści
+
+1. [Elementy kontenerowe](#elementy-kontenerowe)
+2. [Elementy pól](#elementy-pól)
+3. [Elementy kolekcji](#elementy-kolekcji)
+4. [Elementy wykresów i wizualizacji](#elementy-wykresów-i-wizualizacji)
+5. [Elementy specjalne](#elementy-specjalne)
+6. [Typy wyliczeniowe (Enum)](#typy-wyliczeniowe)
+7. [Wspólne atrybuty (uiElement)](#wspólne-atrybuty)
+
+---
+
+## Elementy kontenerowe
+
+### Stack
+Układ pionowy - elementy jeden pod drugim.
+
+```xml
+
+
+
+```
+
+Dziedziczy atrybuty z `containerElement`.
+
+### Row
+Układ poziomy - elementy obok siebie.
+
+```xml
+
+
+
+```
+
+### Flow
+Układ płynny z automatycznym zawijaniem.
+
+```xml
+
+
+
+```
+
+| Atrybut | Typ | Opis |
+|---------|-----|------|
+| `Align` | boolean | Wyrównanie elementów |
+| `Arrange` | enum | `Horizontally` lub `Vertically` |
+
+### Group
+Wizualna ramka grupująca elementy.
+
+```xml
+
+
+
+```
+
+### Page
+Zakładka formularza.
+
+```xml
+
+
+
+```
+
+| Atrybut | Typ | Opis |
+|---------|-----|------|
+| `Name` | string | Unikalny identyfikator |
+| `CaptionHtml` | string | Tytuł zakładki |
+| `Key` | string | Klucz zakładki |
+| `MultiDataSource` | string | Wielokrotne źródło danych |
+| `GroupIcon` | string | Ikona grupy |
+| `DefaultVisible` | boolean | Domyślna widoczność |
+| `FirstAction` | string | Pierwsza akcja |
+
+### Bar
+Pasek narzędzi.
+
+```xml
+
+
+
+```
+
+### Dashboard
+Panel kafelkowy/kokpit.
+
+```xml
+
+
+
+
+
+```
+
+| Atrybut | Typ | Wartości |
+|---------|-----|----------|
+| `ArrangeMode` | enum | `Default`, `Canvas`, `Size`, `Visibility` |
+
+### Include
+Dołączenie zewnętrznego fragmentu lub dynamicznie generowanego elementu UI.
+
+```xml
+
+
+
+
+
+
+
+
+```
+
+| Atrybut | Wymagany | Opis |
+|---------|----------|------|
+| `Source` | **Tak** | Nazwa pliku form.xml **lub** wyrażenie bindujące zwracające element DOM (`UIElement`). Wyrażenie jest wywoływane po każdej zmianie danych - umożliwia dynamiczne formularze |
+| `DataContext` | Nie | Kontekst danych dla dołączanego fragmentu |
+| `Path` | Nie | Określa element pliku form.xml do wstawienia (gdy Source jest nazwą pliku) |
+| `Suffix` | Nie | Napis dodawany do każdej nazwy (`Name`) elementów dołączonych przez Include |
+
+---
+
+## Elementy pól
+
+### Field
+Podstawowe pole edycyjne.
+
+```xml
+
+```
+
+| Atrybut | Typ | Opis |
+|---------|-----|------|
+| `Format` | string | Format wyświetlania (np. `N2`, `d`, `C`) |
+| `CheckedValue` | string | Wartość dla RadioButton |
+| `Footer` | enum | Agregacja w stopce |
+| `Aggregate` | enum | Typ agregacji |
+| `Important` | boolean | Oznaczenie jako ważne |
+
+### Label
+Etykieta tekstowa (tylko do odczytu).
+
+```xml
+
+```
+
+### Gap
+Odstęp/wypełniacz.
+
+```xml
+
+```
+
+### Splitter
+Rozdzielacz paneli.
+
+```xml
+
+```
+
+### Data
+Element danych (niewidoczny).
+
+```xml
+
+```
+
+---
+
+## Elementy poleceń
+
+### Command
+Przycisk/polecenie.
+
+```xml
+
+
+
+
+
+
+
+```
+
+| Atrybut | Typ | Wartości/Opis |
+|---------|-----|---------------|
+| `CommandStyle` | enum | `Default`, `Important`, `Red`, `Green`, `Blue` |
+| `Key` | string | Skrót klawiszowy |
+
+---
+
+## Elementy kolekcji
+
+### Grid / List
+Tabela danych.
+
+```xml
+
+
+
+
+
+
+
+```
+
+#### Atrybuty przyciski (enumCollectionButtonState)
+- `Auto` - automatycznie
+- `None` - ukryty
+- `Visible` - widoczny
+
+#### TreeExpandingLevel
+- `Collapsed` - zwinięte
+- `ExpandRoot` - rozwiń korzeń
+- `ExpandRootFix` - rozwiń korzeń (stałe)
+- `ExpandAll` - rozwiń wszystko
+
+#### SumType (enumCollectionSumType)
+- `None` - brak
+- `Selected` - zaznaczone
+- `All` - wszystkie
+- `Groups` - grupy
+- `GroupsNewLine` - grupy w nowej linii
+
+#### ActionsMode
+- `FormAndControl` - formularz i kontrolka
+- `Control` - tylko kontrolka
+- `Form` - tylko formularz
+
+### Cards
+Widok kart (kafelków). Dziedziczy z Grid, ale **nie obsługuje**: układu kolumnowego, nagłówka, sortowania przez kliknięcie, edit-in-place, struktury drzewiastej.
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+Elementy `Field` domyślnie układają się jeden pod drugim. Można grupować je za pomocą `Row` i `Stack`.
+
+**Układ szeroki:** Dodanie `Width="*"` do najbardziej zewnętrznego kontenera rozciąga element na całą szerokość (elementy listy jeden pod drugim).
+
+#### Pasek narzędziowy Cards
+- Umiejscowiony powyżej listy z prawej strony
+- Posiada tylko przyciski Dodaj i Usuń (brak Otwórz)
+- Ikony zaznaczania, otwierania i menu widoczne po najechaniu myszą na kafelek
+
+#### Atrybuty kontrolujące ikony:
+- `Class="DisableSelection"` - wyłącza ikonę zaznaczania
+- `IsSmartOpen="true"` - włącza przycisk otwierania formularza
+- `MoreButton="Visible"` - włącza przycisk "więcej" z dodatkowymi akcjami
+
+### CardTemplate
+Szablon karty (dziedziczy z Stack).
+
+---
+
+## Elementy wykresów i wizualizacji
+
+### Chart
+Wykres. Element służący do prezentacji danych w postaci wykresów.
+
+```xml
+
+
+
+
+
+```
+
+| Atrybut | Typ | Opis |
+|---------|-----|------|
+| `Type` | enum | Typ wykresu (patrz poniżej) |
+| `ChartColor` | enum | Kolor wykresu: `None` (wielokolorowy), `Green`, `Blue`, `Grey`, `Red`, `Orange`, `Yellow` |
+| `IsLegendVisible` | boolean | Widoczność legendy |
+| `LabelFormat` | string | Format etykiety. Zmienne: `{value}`, `{percent}`, `{label}` |
+| `XAxisTitle` | string | Podpis osi X |
+| `YAxisTitle` | string | Podpis osi Y |
+| `XAxisLabelFormat` | string | Format wartości na osi X (zmienne: `{value}`, `{label}`) |
+| `YAxisLabelFormat` | string | Format wartości na osi Y |
+| `IsDateNavigatorVisible` | boolean | Nawigator daty dla WeekByDays/MonthByDays |
+| `OpenMethodName` | string | Metoda wywoływana po kliknięciu na wykres |
+| `FocusedValue` | string | Property do którego zostanie podstawiony wiersz po kliknięciu |
+| `FocusedColumnValue` | string | Property z nazwą kolumny po kliknięciu (dla wielu Field) |
+
+#### Typy wykresów (enumChartType)
+- `Line` - liniowy (zmiany wartości między kategoriami)
+- `Bar` - słupkowy/kolumnowy (porównanie kategorii)
+- `Area` - warstwowy (suma serii i udział każdej)
+- `Pie` - kołowy (proporcje części całości)
+- `Donut` - pierścieniowy (jak kołowy, ale z dziurą)
+- `Spider` - radarowy (porównanie wielu zmiennych)
+- `Polar` - radarowy z wypełnieniem
+- `Pyramid` - piramida (kategorie od największej do najmniejszej)
+- `Funnel` - lejek (malejące proporcje)
+- `Bubble` - bąbelkowy (3 wymiary: X, Y, rozmiar)
+- `Scatter` - punktowy (zbiór punktów X/Y)
+
+#### Axis - Oś wykresu
+
+```xml
+
+```
+
+| Atrybut | Opis |
+|---------|------|
+| `Direction` | Kierunek dla Pivot: `X` (kolumny), `Y` (wiersze) |
+| `Dimension` | Sposób grupowania miar |
+| `Grouping` | Czy grupować dane (tworzy tabelę przestawną) |
+| `FirstDayOfWeek` | Pierwszy dzień tygodnia |
+
+#### Dimension (PivotDimension)
+- `Enum` - wartości dyskretne, tekstowe (Bar, Pie, Donut)
+- `AZ` - grupowanie po pierwszej literze
+- `WeekByDays` - zawężenie do tygodnia + przyciski Następny/Poprzedni
+- `MonthByDays` - zawężenie do miesiąca + przyciski Następny/Poprzedni
+- `ByNumbers` - miara liczbowa, proporcjonalne rozmieszczenie
+- `ByDays` - daty bez grupowania, wszystkie dni z zakresu
+- `ByWeeks` - grupowanie wg tygodni
+- `ByMonths` - grupowanie wg miesięcy
+- `ByYears` - grupowanie wg lat
+
+#### Field w Chart - seria danych
+
+```xml
+
+```
+
+| Atrybut | Wartości |
+|---------|----------|
+| `Aggregate` | `None`, `Sum`, `Count`, `Average`, `Min`, `Max` |
+
+#### Zasady tworzenia różnych typów wykresów
+
+**Line/Area (liniowy/warstwowy):**
+- 1 Axis + wiele Field → wiele serii danych
+- 2 Axis (jeden z `Grouping="true"`) + 1 Field → serie wg grupowania
+
+**Bar (słupkowy):**
+- 1 Axis + 1 Field → wykres zwykły
+- 1 Axis + wiele Field → wykres skumulowany (stacked)
+- 2 Axis + 1 Field → wykres grupowany (slide)
+- 2 Axis + wiele Field → stacked-slide
+
+**Pie/Donut (kołowy/pierścieniowy):**
+- Zawsze 1 Axis + 1 Field
+
+**Scatter (punktowy):**
+- 1 Axis + 2 Field (pierwszy Field = X, drugi Field = Y)
+
+**Bubble (bąbelkowy):**
+- 1 Axis + 3 Field (X, Y, rozmiar bąbelka)
+
+### Scheduler
+Kalendarz/harmonogram.
+
+```xml
+
+
+
+```
+
+**UWAGA:** Niepoprawne wiązanie danych skutkuje błędem krytycznym (brak wyświetlenia pageform'a lub brak możliwości logowania).
+
+| Atrybut | Typ | Opis |
+|---------|-----|------|
+| `View` | enum | Domyślny widok kalendarza |
+| `AllowViewChanging` | boolean | Czy operator może zmieniać widok (domyślnie tak) |
+| `SelectedInterval` | string | Okres zaznaczony przez użytkownika |
+| `VisibleInterval` | string | Okres widoczny |
+| `WorkInterval` | string | Roboczy czas dnia (domyślnie `"9:00..18:00"`). Można podać bezpośrednio lub bindować do `Soneta.Types.Interval` |
+| `Resources` | string | Zasoby |
+| `SelectedResource` | string | Wybrany zasób |
+| `HideDateField` | boolean | Ukryj pole daty |
+
+#### Widoki Scheduler (enumSchedulerViews)
+- `Daily` - widok jednego dnia
+- `WorkWeek` - widok tygodnia roboczego
+- `Weekly` - widok tygodniowy
+- `Monthly` - widok miesięczny
+- `HoursTimeLine` - widok godzinowy na osi poziomej
+- `DaysTimeLine` - widok dzienny na osi poziomej
+- `SimpleMonthly` - uproszczony widok miesięczny
+
+### Gantt
+Wykres Gantta.
+
+```xml
+
+
+
+
+
+```
+
+#### GanttViews
+- `HourMinute`, `DayHour`, `WeekDay`, `MonthDay`
+
+#### GanttViewMode
+- `Standard`, `ResourceView`
+
+### GanttDiagram
+Diagram Gantta z dodatkowymi opcjami.
+
+```xml
+
+```
+
+### Diagram
+Diagram ogólny.
+
+```xml
+
+```
+
+### CustomDiagram
+Diagram niestandardowy.
+
+### TreeDiagram
+Diagram drzewa.
+
+```xml
+
+```
+
+#### TreeDiagramLayoutType
+- `OrganizationalChart` - schemat organizacyjny
+- `ComplexHierarchicalTree` - złożone drzewo hierarchiczne
+
+### KanbanDiagram
+Tablica Kanban.
+
+```xml
+
+```
+
+### Pivot
+Tabela przestawna.
+
+```xml
+
+
+
+
+```
+
+### PivotGrid
+Siatka przestawna.
+
+---
+
+## Elementy specjalne
+
+### Indicator
+Wskaźnik liczbowy.
+
+```xml
+
+```
+
+### PercentIndicator
+Wskaźnik procentowy.
+
+```xml
+
+```
+
+### CircularIndicator
+Wskaźnik kołowy.
+
+```xml
+
+```
+
+#### UIAlignment
+- `None`, `Left`, `Right`, `Bottom`
+
+### RangeSlider
+Suwak zakresu.
+
+```xml
+
+```
+
+### TimelineClock
+Oś czasu z zegarem.
+
+```xml
+
+```
+
+### DateNavigator
+Navigator dat.
+
+```xml
+
+```
+
+### Chips
+Etykiety/tagi.
+
+```xml
+
+```
+
+#### ChipsColorPalette
+- `None`, `Black`, `White`
+- `GrayPastel`, `GreenPastel`, `OrangePastel`, `RedPastel`
+
+### Html
+Treść HTML.
+
+```xml
+
+```
+
+### Markdown
+Treść Markdown.
+
+```xml
+
+```
+
+### ThreadComments
+Komentarze wątkowe.
+
+```xml
+
+```
+
+### UserControl
+Kontrolka użytkownika.
+
+```xml
+
+
+
+```
+
+### Template
+Szablon warunkowy.
+
+```xml
+
+
+
+```
+
+---
+
+## Typy wyliczeniowe
+
+### enumAggregationType (Footer/Aggregate)
+- `Auto` - automatycznie
+- `None` - brak
+- `Sum` - suma
+- `Count` - liczba
+- `Average` - średnia
+- `Min` - minimum
+- `Max` - maksimum
+- `Concat` - konkatenacja
+- `UniqueConcat` - unikalna konkatenacja
+- `Same` - ta sama wartość
+
+### enumDataFormView (ViewType)
+- `None`, `Dialog`, `Form`, `Folder`
+
+### enumDataFormMode (Mode)
+- `None`, `Form`, `Folder`, `Wizard`, `Modal`, `Popup`, `Frame`
+
+### enumLayoutMode
+- `Default`, `Canvas`, `Size`, `Visibility`
+
+### enumMoreButtonState
+- `None`, `Visible`, `Actions`
+
+---
+
+## Wspólne atrybuty (uiElement)
+
+Wszystkie elementy UI dziedziczą następujące atrybuty z `uiElement`:
+
+| Atrybut | Typ | Opis |
+|---------|-----|------|
+| `Name` | string | Identyfikator elementu (musi być unikalny na poziomie strony). Automatycznie generowany jeśli nie podano. |
+| `DataContext` | string (bindowalne) | Kontekst danych. `{DataSource}` = otwarty obiekt. Można wskazać podrzędną właściwość. |
+| `EditValue` | string (bindowalne) | Binding do wartości |
+| `CaptionHtml` | string (bindowalne) | Etykieta kontrolki (tekst lub `{Właściwość}`) |
+| `CaptionMarkdown` | string | Etykieta Markdown |
+| `DescriptionHtml` | string | Dodatkowy opis |
+| `LangContext` | string | Kontekst językowy |
+| `Icon` | string | Ikona |
+| `Class` | string | Klasy stylów (lista wartości oddzielonych spacją) |
+| `Width` | string | Szerokość w znakach lub px (np. `"50px"`). `"*"` = dopasuj do dostępnej przestrzeni |
+| `Height` | string | Wysokość w wierszach lub px. `"*"` = dopasuj automatycznie |
+| `OuterWidth` | string | Całkowita szerokość z etykietą (do wyrównywania kontrolek) |
+| `OuterHeight` | string | Całkowita wysokość (może dodawać puste miejsce pod kontrolką) |
+| `LabelWidth` | string | Szerokość etykiety |
+| `LabelHeight` | string | Wysokość etykiety |
+| `Column` | integer | Kolumna (w siatce) |
+| `Row` | integer | Wiersz (w siatce) |
+| `Visibility` | string (bindowalne) | Widoczność: `Visible`, `Hidden`, `Collapsed`, `true`, `false` |
+| `LayoutMode` | enum | Tryb układu: `Default`, `Canvas`, `Size`, `Visibility` |
+| `IsReadOnly` | string (bindowalne) | Tylko do odczytu (`true`/`false`). **Uwaga:** tryb z logiki biznesowej ma wyższy priorytet |
+| `Tag` | string | Dodatkowa wartość do wykorzystania w skryptach |
+| `TagInfo` | string | Informacja tagu |
+| `Priority` | integer | Priorytet |
+| `RenderMethodName` | string | Metoda renderowania |
+| `Renderable` | string | Czy renderowalne |
+| `RenderKey` | string | Klucz renderowania |
+
+### Appearance (formatowanie warunkowe)
+
+```xml
+
+
+
+```
+
+| Atrybut | Typ | Opis |
+|---------|-----|------|
+| `Condition` | string | Warunek (wyrażenie) |
+| `BackColor` | string | Kolor tła |
+| `ForeColor` | string | Kolor tekstu |
+| `FontBold` | boolean | Pogrubienie |
+| `FontItalic` | boolean | Kursywa |
+
+---
+
+## Wartości Class (enumSingleClass)
+
+### Zachowania kontenerów
+- `Collapsable` - zwijalna
+- `Expandable` - rozwijalna
+- `Expanded` - rozwinięta
+- `Dialog` - okno dialogowe
+- `NoSave` - bez zapisu
+- `MainPage` - strona główna
+- `Menu` - menu
+- `Panel`, `PanelItem`, `PanelWinItem`
+- `NoLayout` - bez układu
+- `RemoveEmpty` - usuń puste
+- `GroupItem` - element grupy
+- `Reverse` - odwrócony
+- `MainGroup`, `MenuGroup`
+- `NoClose` - bez zamykania
+- `CascadeMenu`, `CascadeMenuGroup`, `CascadeSubmenuGroup`
+- `FilterGroup` - grupa filtrów
+- `Scrollable` - przewijalna
+
+### Style przycisków
+- `PrintButton` - drukowanie
+- `MainCommand` - główne polecenie
+- `SplitCommand` - polecenie dzielone
+- `CommandNoText` - bez tekstu
+- `CommandIcoText` - ikona i tekst
+- `WorkerCommand` - polecenie workera
+- `WizardCommand` - polecenie kreatora
+- `SchedulerCommand` - polecenie harmonogramu
+- `FormNavigationCommand` - nawigacja formularza
+
+### Style pól
+- `PasswordEdit`, `PathPropertyEdit`, `PropertyGridEdit`
+- `CheckButtonEdit`, `ColorEdit`, `HistoryEdit`
+- `RichEdit`, `AspxEdit`, `FolderEdit`, `FileEdit`
+- `SaveFileEdit`, `ImageEdit`, `XmlEdit`
+- `AlgorithmEdit`, `DataTextEdit`, `ConditionEdit`
+- `RatingEdit`, `SignatureEdit`, `OneTimePasswordEdit`
+- `HyperlinkEdit`, `EmailEdit`, `PhoneEdit`
+- `SkypeEdit`, `GpsEdit`, `IconEdit`
+- `ProgressEdit`, `TrafficLightEdit`
+
+### Style etykiet
+- `NoColonLabel` - bez dwukropka
+- `BoldLabel` - pogrubiona
+- `CenterLabel` - wyśrodkowana
+- `RightLabel` - wyrównana w prawo
+- `WarningLabel` - ostrzeżenie
+- `MultilineLabel` - wieloliniowa
+- `InfoLabel` - informacja
+- `TipLabel` - podpowiedź
+- `SchedulerLabel` - etykieta harmonogramu
+
+### Style czcionek
+- `LargeFont` - duża
+- `GreenFont` - zielona
+- `RedFont` - czerwona
+- `FixedWidthFont` - stała szerokość
+- `BoldFont` - pogrubiona
+- `WarningFont` - ostrzegawcza
+
+### Wyrównanie
+- `RightAlign` - do prawej
+- `LeftAlign` - do lewej
+- `TextRight` - tekst do prawej
+
+### Inne
+- `Information`, `Question` - typy komunikatów
+- `DataBar`, `PreviewLine`, `Header`
+- `FirstResponder` - pierwszy fokus
+- `SmartOpen` - inteligentne otwieranie
+- `Tight`, `Special`, `Important`
+- `LateCalculate` - późne obliczanie
+- `AllowDragging`, `AllowEditing`
+- `DisableSelection` - wyłącz zaznaczanie
+- `HorizontalSplitter` - poziomy rozdzielacz
+- `Info`, `Tree`
+- `ImageCircle` - okrągły obraz
+- `DashboardItem`, `LocatorItem`
+- `SmallSize`, `NormalSize`, `LargeSize`
+- `AutoUpdate` - automatyczna aktualizacja
+- `ArrowsSelectNext` - strzałki wybierają następny
+- `Hidden` - ukryty
+- `NonClickable` - nieklikowalny
+- `LabelTop`, `LebelLeft` - pozycja etykiety
+- `FilesDropTarget` - cel upuszczania plików
+- `Rss` - kanał RSS
+- `PreventOrderBy` - zapobiegaj sortowaniu
diff --git a/soneta-form-xml/references/Form.xsd b/soneta-form-xml/references/Form.xsd
new file mode 100644
index 0000000..faaa4f6
--- /dev/null
+++ b/soneta-form-xml/references/Form.xsd
@@ -0,0 +1,1060 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file