Faceți căutări pe acest blog

luni, 25 iunie 2012

Htop- monitorizare sistem CLI

 Putem monitoriza parametrii de funcționare ai sistemului atât în interfața grafică (Superkaramba, conky, gkrellm), cât și în linia de comandă, folosind diverse utilitare, în funcție de ce anume vrem să aflăm (uptime, free -m,mpstat/ parte a sysstat, who, finger, hddtemp, sensors, și multe altele). Majoritatea distribuțiilor GNU/ Linux au implicit top, utilitar de monitorizare mai complex, dar care are anumite limităr, de aceea a fost creat htop, utilitar similar top, dar mai aspectuos, mai intuitiv, afișează toate procesele, și cu mai multe facilități, scroll vertical și orizontal, putem folosi mouse-ul pentru scroll și selectare, putem omorî sau schimba prioritatea unui proces mult mai simplu, nu trebuie să știm PID-ul acestuia, interfața este mult mai intuitivă și complexă, bara de meniuri de jos e foarte utilă, are funcție căutare, kill, nice, e ușor personalizabil.

 INSTALARE
 Îl instalați fie din administratorul de pachete grafic (MCC, Synaptic, Apper, Ubuntu Software Center, etc), fie  cu managerul de pachete CLI (urpmi, pacman, apt-get, equo, etc).

 INTERPRETARE DATE AFIȘATE
 Sunt convins că totul este clar pentru oricine, fereastra este practic împărțită în trei secțiuni, 2 panouri în partea de sus și panoul principal unde sunt afișate procesele ce rulează în acel moment, plus bara de meniuri de jos.

 Acesta e aspectul implicit al ferestrei htop:
- în primul panou sunt afișate consumurile procesorului, memoriei RAM și swap;
- în al doilea panou de sus apar numărul de procese, încărcarea medie pe ultimele 1, 5 și 15 minute, perioada de funcționare;
- în panoul principal de jos sunt afișate toate procesele într-un fel de grafic, aranjate pe ultima coloană după modul de filtrare, iar pe celelalte coloane informații despre procese: PID, utilizator, prioritate, consum CPU și RAM, timp;
- în fine, avem bara de meniuri de jos, apăsând F1 intrăm în meniul Help (ajutor, informații utile), cu F2 accesăm meniul Settings (setări, personalizări), F3 e pentru Search (căutare proces după nume), etc.

 Putem schimba  metoda de sortare implicită (cea după consum CPU%) cu ajutorul hotkeys:
- M (Shift+m)   = sortare supă consum RAM%
- T (Shift+t)      = sortare după timp
- P (Shift+p)     = sortare după consum CPU%
- t                     = afișează procesele arborescent/ tree
- u                    = afișează procesele userului selectat

 Sau putem alege metoda de sortare apăsând F6 și navigând cu tastele săgeți printre numele coloanelor, alegând-o pe cea dorită (nume, PID, etc) și confirmând cu Enter sau anulând cu Escape..

 PERSONALIZARE
 Htop poate fi personalizat, e simplu să punem în panourile de sus alte controale, putem seta ca procesele să apară cu altă culoare, putem schimba culoarea (tema) global, putem scoate sau adăuga alte coloane, și multe altele.
 Setările se fac în meniul Settings, apăsând tasta F2 sau tasta S  (Shift+s mai exact). Apare fereastra următoare:
 În categoria Setup avem Meters (ceas, memorie, cpu, etc), Display option, Colors (tema htop, alegem una, Enter sau Space bifează și salvează), și Columns (putem scoate sau adăuga alte coloane în htop).
  Hai să vedem concret câteva customizări, vom schimba tema/ culoarea și vom adăuga câteva informații. Navigarea se face cu săgețile sus-jos pe coloane și stânga - dreapta pe linii sau cu mouse-ul!

1- Schimb culoare temă:
F2 - în coloana Setup navigăm la Colors- ne mutăm cu săgeată dreapta la Colors (a doua coloană)- alegem o temă (MC să zicem)- o selectăm cu Enter- ieșim cu F10.
2- Adăugare informații:
F2- Meters- navigăm la Available meters- alegem Clock- îl adăugăm în panoul stînga- sus cu F5 sau dreapta- sus cu F6 (priviți bara de jos, aveți mereu indicate variantele posibile!). La fel adăugăm hostname și CPU average (media consumului pe procesor, nu pe fiecare nucleu în parte) în stânga sau dreapta, după preferință.
 Putem muta mai sus sau mai jos unul din aceste indicatoare din coloana unde sunt date componentele panourilor cu săgețile sus- jos.
3- Administrare procese
 Kill (F9)- Putem înch ide un proces apăsănd F9 și confirmând cu Enter sau anulând cu Escape. ATENȚIE: htop nu e doar interactiv, e și dinamic, datele sunt actualizate periodic, e posibil să se schimbe procesul! Pentru ca actualizarea datelor să se facă la un interval mai mare de timp puteți porni htop cu comanda:
htop -d timp-în-zecimi-de-secundă
htop -d 50     = actualizare la 5 secunde
 Nice  (F8 pentru scădere prioritate, F7 creștere prioritate)- Selectăm un proces- apăsăm F7 sau F8- la fiecare apăsare prioritate crește/ scade cu 1. Prioritatea maximă e -20, cea minimă 19. În practică putem scădea prioritatea până la 19, dar de crescut doar până la -10, și asta pentru procesele userului nostru.
 Search (căutare- F3) - Apăsăm F3- scriem numele procesului (firefox, mocp, dolphin, etc) în câmpul de căutare apărut jos.

 O modalitate foarte comodă de a rula htop este în interiorul unui terminal drop- down, gen yakuake, terminal ce stă permanent în fundal, o apăsare pe tasta F12 arată/ ascunde terminalul indiferent de desktopul/ ecranul curent, sau chiar într-un terminal embed, încorporat în desktop: http://stressat.blogspot.ro/2011/07/cool-desktop-embed-konsole.html.
  Iată cum arată htop în yakuake:



sâmbătă, 23 iunie 2012

Manipulare fișiere text în linia de comandă

 Cum tocmai am scris câte ceva despre nano, poate-ar fi indicat să pomenesc puțin alte modalități simple de a lucra cu fișiere text.

1- Creare fișiere text
touch nume_fișier      = nume_fișier trebuie înlocuit cu numele real, iar dacă destinația e diferită de directorul curent atunci cu calea către el, de exemplu cu ~/Desktop/utile.txt (extensia .txt este pur informativă, nu este neapărat necesară)

touch test     = va crea în directorul curent un fișier numit test
touch Documents/diverse/test1   = va crea fișierul test1 în directorul Documents, subdirectorul diverse;
 Oarecum similar putem crea fișiere ca rezultat al unor comenzi, direcționând outputul către nou creatul fișier:
cat fișier1> fișier-nou
man touch > manual-touch
echo > nume-dorit-fișier   ( > nume-fișier )
echo "așa putem crea un fișier" > fișier_test    (în primele două cazuri, fișierul va conține outputul comenzii respective, a treia comandă va genera un fișier gol, fără conținut, iar în ultimul exemplu va conține chiar textul dintre ghilimele)

2- Ștergere fișiere
rm nume_fișier
rm ~/Documents/diverse/utile    = va șterge fișierul utile din directorul /home/user/Documents/diverse; dacă ne aflăm în directorul /home/user putem sări peste ~ sau /home/user!
 Bănuiesc că nu e necesar să amintesc de comenzi banale pentru mutare fișiere (mv fișier destinație) sau copiere (cp fișier destinație)...

3- Afișare conținut fișier
cat fișier
cat ~/Desktop/test/test1           = va afișa în terminal conținutul fișierului test1 din /home/user/Desktop/test
cat -n Desktop/test/test1        = va afișa în terminal liniile numerotate
cat Desktop/test/test1 | head  = va afișa doar primele 10 linii din fișier
cat Desktop/test/test1 | tail  = va afișa doar ultimele 10 linii ale fișierului
tac Desktop/test/test1     = va afișa conținutul începând cu ultimele linii, exact inversul lui cat (deci de la sfârșit către început)


4- Modificare/ Suprascriere fișier
echo "text-de-adăugat" > cale-fișier
echo "text-de-adăugat" >> cale-fișier
 Observați diferența dintre cele două comenzi anterioare? Este vorba de numărul scrierii simbolului >, o dată în prima comandă (ceea ce înseamnă că fișierul va fi suprascris, textul conținut va fi COMPLET înlocuit de acel text, ATENȚIE!), și de două ori în a doua comandă (ceea ce înseamnă că textul din comandă va fi adăugat la finalul fișierului!).
echo "testare suprascriere" >> Desktop/test/test1   = va adăuga la finalul fișierului textul dintre ghilimele.

sed -i '1i text de introdus în fișier' nume-fișier                     = va introduce în prima linie a fișierului textul dorit
sed -i '3i așa se procedează' test                                              = adăugăm textul dorit în linia a treia a fișierului țintă (1i= prima linie, 2i= a doua line, etc)


sed 's/tipar1/tipar2/' fișier1 > fișier2        = va înlocui tipar1 cu tipar2 în fișierul dat (fișier1) și va salva modificările în fișier2
sed 's/cal/bou/' test >test-mod                    = va înlocui în fișierul test cuvântul cal cu bou, iar textul/ conținutul modificat va fi salvat în aceeași locație sub numele test-mod; trebuie să știți că cuvintele ce conțin tiparul ”cal” (sau orice alt string de căutare dat) vor suferi aceleași modificări ale compoziției!

Pentru a vedea cum se pot înlocui DOAR potrivirile exacte, adică DOAR cuvintele dorite, nu și cele ce conțin tiparul de căutare vedeți comenzile în următoarele două imagini, nu știu prea bine de ce dar comenzile nu apar corect afișate în text...




sed 's/cal/bou/g' test >test-mod                     = prima comandă caută și înlocuiește doar primul termen găsit pe o linie de text, pentru a înlocui toți termenii găsiți pe linii adăugăm g ca în prezenta comandă, similar 3 va înlocui pe fiecare linie al treilea termen găsit (sed 's/cal/bou/3' test >test-mod), 6 al șaselea termen, etc.
 În cazul în care doriți ca fișierul inițial să fie modificat (și nu să rămână neschimbat, modificările fiind salvate în alt fișier) pasăm sed opțiunea -i (--in-place) și doar fișierul sursă:
sed -i 's/cal/bou/g' test                               = va înlocui cal cu bou DIRECT în fișierul test, inclusiv cuvintele ce conțin tiparul (calculator, acalmie, etc)

 Înlocuire multiplă termeni: comenzile în screenshotul următor:

 Ok, în exemplele anterioare cunoșteam numele fișierului în care făceam modificări, ce facem dacă nu știm numele și locația fișierelor ce conțin textul pe care-l dorim înlocuit? Căutăm fișierele:
find . -type f -exec sed -i s/text-inițial/text-final/g {} +
find . -type f -exec sed -i s/Necunoscut/Anonim/g {} +


5- Căutare fișier și conținut fișiere
 Sarcini realizate cu ajutorul find sau locate și grep (dați clic pe aceste linkuri pentru a citi materialele cu pricina).

6- Comparare fișiere după conținut
cmp fișier1 fișier2
diff fișier1 fișier2
cmp Desktop/test/test Desktop/test/test1     = cmp verifică diferențele după caractere, nu după linii, de aceea nu este foarte relevant, ne ajută mai mult să vedem dacă cele două fișiere sunt identice
comm Desktop/test/test Desktop/test/test1  = compară fișierele linie cu linie și afișează liniile comune și cele individuale, specifice unui singur fișier
diff Desktop/test/test Desktop/test/test1       = arată diferențele dintre fișiere
diff3 fișier1 fișier2 fișier 3                                   = afișează diferențele dintre trei fișiere

 Un material interesant pe aceeași temă, mult mai cuprinzător în anumite aspecte, găsiți aici: http://linuxfans.ro/viewtopic.php?f=31&t=96!
 Merită citite toate postările de acolo, îmi place la nebunie comanda cu vremea, am făcut-o deja funcție bash:
 wget -qO - http://www.meteoromania.ro/index.php?id=58 | sed -n '/FiltersEnabled/,/applyCssFilter/ p' | sed 's/;/ /g;s/&/ /g;s/>/ /g;s/"//g;s/C

Nano: editor text CLI

Pe lângă aplicațiile grafice pentru editarea și modificarea fișierelor text (kwrite, kate, gedit, etc) există și unele pentru linia de comandă: nano, pico, joe, mcedit, vi/ vim, emacs, etc., utilitare foarte convenabile și folositoare.
 Aceste editoare text CLI pot fi utilizate atât în interiorul interfeței grafice (în consolă/ terminal), dar mai ales în afara interfeței grafice, în terminalul tty.
 Poate cel mai simplu și ușor de folosit din aceste utilitare este nano, dar asta nu înseamnă că nu este și bine dotat și capabil.

 INSTALARE
În funcție de distribuția folosită, este posibil să aveți deja instalat nano, cum e cazul cu Arch Linux, sau trebuie instalat folosind package managerul distribuției.

 UTILIZARE
 Comanda implicită de lansare nano este:
nano opțiuni fișier      (nano +15,12 -t .bashrc de exemplu, unde +15,12 reprezintă una din opțiunile disponibile, cea referitoare la numărul de linii și coloane unde va fi postat direct cursorul, -t este opțiunea pentru salvarea implicită, directă, automată, fără confirmare a modificărilor la închiderea nano, iar .bashrc este fișierul țintă, cel editat)
 Înainte să vedem câteva opțiuni utile trebuie spus faptul că nano poate nu numai edita fișiere text ci le poate și crea. Dacă pasăm comenzii nano un nume de fișier inexistent, în fereasta nano deschisă nu va apărea text scris, va fi un fișier gol, iar dacă la închidere alegem să salvăm modificările (chiar dacă nu scriem/ modificăm nimic în acel fișier, salvarea modificărilor reprezintă acceptarea creării acestuia!), acest fișier va fi creat.
 Putem insera în acel fișier conținutul altui fișier text (total sau parțial)apăsând Ctrl+r și salvând, și nu neapărat doar cu fișiere goale! De exemplu avem personalizat afișajul consolei pentru contul de utilizator și dorim să personalizăm și contul de root:
- edităm ca root fișierul de configurare /root/.bashrc;
- includem în acesta .bashrc cu Ctrl+r;
- păstrăm liniile ce ne interesează, le ștergem pe celelalte;
- salvăm modificarea fișierului /root/.bashrc;
- la următoarea logare ca root vom avea promptul, mesajul de întâmpinare, aliasurile și funcțiile din ~/.bashrc disponibile pentru contul de root.



 După cum puteți observa fereastra nano cuprinde un mic ”manual” implicit, căteva informații utile:
1- versiunea nano;
2- numele fișierului editat;
3- bara de ”unelte”, aici avem date scurtăturile valabile. ^ reprezintă tasta Ctrl, M reprezintă tasta Alt, deci ^G este combinația Ctrl+G, așa intrăm în meniul Help, ^X este Ctrl+X, combinație pentru închiderea nano.
 Combinația pentru salvarea modificărilor în text este Ctrl+O (sau tasta funcțională F3) și confirmare cu Enter, alternativ putem folosi la pornirea nano opțiunea -t (nerecomandat) sau chiar Ctrl+X (sau tasta funcțională F2) pentru ieșire, iar nano ne va întreba dacă salvăm modificările, apăsăm y pentru confirmare, n pentru anularea modificărilor și păstrarea fișierului editat în forma inițială iar ^C (Ctrl+c) anulează închiderea nano.

 Rețineți faptul că puteți edita cu nano orice fișier text, dar pentru a modifica acel fișier trebuie să aveți permisiunile necesare, deci pentru a lucra cu fișiere din afara /home/user sau folosiți contul de root sau căpătați permisiuni temporare cu sudo.

 Opțiuni utile:
-t       = salvează automat modificările;
+x,y   = la deschiderea fișierului cursorul va fi poziționat la rândul și coloana indicate, x= numărul liniei, y= numărul coloanei; nano +7,20 cale_către_fișier va deshide fișierul, cursorul fiind poziționat pe linia 7, coloana 20 în loc linia 1, coloana 1, cum e implicit;
-B     = face backup fișierului modificat, exact cum fac kwrite, kate, gedit, lângă fișierul respectiv apare un fișier cu vechiul conținut, numit fișier~ (de exemplu modificând .bashrc va apărea și .bashrc~;
-C     = dacă avem activată opțiunea de backup, putem alege locația, directorul unde salvăm fișierul respectiv. Să spunem că avem creat un director special unde salvăm așa ceva, Documents/backups, în acest caz comanda va fi:
nano -B -C Documents/backups .bashrc
 La final, în directorul Documents/backups va fi salvat vechiul fișier sub numele !home!user.bashrc~, unde user va fi înlocuit de numele corect al utilizatorului, iar .bashrc de numele corect al fișierului modificat. După cum cred c-ați înțeles, numele fișierului de backup e format de fapt din locația acestuia (! înlocuiește de fapt /)și numele exact, plus simbolul ~, simbol care ne arată că e vorba de un backup. Deci modificarea cu sudo nano -B -C Desktop/diverse /etc/rc.conf va salva fișierul original în directorul Desktop/diverse sub numele !etc!rc.conf~; Dacă nu am pasat nano opțiunea de backup, putem face oricum backup apăsând combinația de taste Alt+B în interiorul ferestrei nano cu fișierul editat, iar fișierul de backup va fi salvat în aceeași locație, sub același nume plus ~;
-D     = afișează informațiile nu în culori inversate, ci cu caractere bold.
 Toate opțiunile sunt disponibile dând comanda man nano în terminal.

 Mod folosire pe scurt:
1- nano fișier  = edităm un fișier;
2- navigăm cu tastele săgeți în direcția dorită; deasemeni putem apăsa Alt și + sau Alt și -; în terminalul din interfața grafică putem naviga și cu scroll mouse;
 Putem merge direct într-o poziție dată cu Alt+G și tastăm linia și coloana unde dorim să ajungem (numerele liniei și coloanei vor fi despărțite de virgulă: 8,12 reprezintă linia 8, coloana 12, DAR dacă linia respectivă nu conține atâtea coloane cursorul va fi poziționat la începutul liniei, pe coloana 1 pentru linii goale, fără text, sau la finalul liniei pentru liniile cu text, dar care nu au atâtea coloane);
 Navigăm inainte și înapoi câte un cuvânt cu Ctrl+ Spațiu (tasta Space) și Alt+ Spațiu;
 Sărim la începutul liniei cu Ctrl+a și la finalul acesteia cu Ctrl+e;
 Sărim la finalul fișierului cu Alt+ /, sau la început cu Alt+ \;
 Navigăm cu dimensiunea afișată a ferestrei înainte și înapoi cu Ctrl+v și Ctrl+ y;
 Căutăm un termen cu Ctrl+w: în partea de jos a ferestrei va apărea bara de search, tastăm stringul de căutare, apăsăm Enter, cursorul va ”sări” la acesta;
 Înlocuim un termen folosind Alt+ r, va apărea bara de jos unde scriem termenul ce va fi înlocuit - Enter, bara se va schimba cu una unde scriem termenul ce-l va înlocui pe cel inițial.
 Aflăm numărul de cuvinte, linii și caractere din fișier folosind Alt+d;



 IMPORTANT: în funcție de comanda dată, bara de unelte de jos va fi actualizată cu noi opțiuni/ shortcuturi, dacă ați greșit ceva, nu e o tragedie, puteți anula, modifica, etc, citiți ce scrie în acel ”meniu”!
3- închidem nano:
 a- Ctrl+O și apoi Enter pentru salvarea modificărilor;
 b- Ctrl+X și y sau n la chestionarea nano pentru salvarea sau anularea modificărilor operate în fișierul editat.

 Actualizare: îmi cer scuze, am folosit atât notații precum Ctrl+X cât și Ctrl+ x, prima variantă deoarece așa e afișată în fereastra nano, a doua variantă din obișnuință și dorința de corectitudine, eu de obicei folosesc majuscule (de exemplu X în loc de x) pentru a indica Shift+literă (Shift+x = X...). În TOATE combinațiile de taste de mai sus, indiferent de modul de notare e vorba DOAR de Ctrl sau Alt și tasta specificată, fără Shift, e mai simplu!!!
 Totuși trebuie să rețineți că comenzile în fereastra nano pot fi date și cu majuscule și cu minuscule, de exemplu confirmarea modificărilor se va face și la apăsarea y și la apăsarea Y (Shift+ y)...


 Rulare nano în tty/ fbterm/ screen:




 Pentru cei ce vor să știe câte ceva și despre alte editoare CLI, citiți vă rog un material despre vim aici: http://blog.vnrxland.eu/2011/11/invata-vim-progresiv-pasul-i-ghid-de.html, plus celelalte 3 părți!

miercuri, 20 iunie 2012

Grep: căutare text în fișiere

 Am văzut cum putem căuta fișiere în Kde și CLI (http://stressat.blogspot.ro/2011/12/unde-esti-ma.html), ați observat că folosind kfind putem căuta și după conținutul acestor fișiere, hai să vedem cum putem căuta fișiere după conținutul acestora, cuvinte, propoziții, text în linia de comandă. Pentru aceasta folosim utilitarul Grep.
 Explicații detaliate, precum și toate opțiunile sunt date de comanda man grep, grep --help va arăta mai concis modul de utilizare al opțiunilor, acum vom vedea pe scurt modul de utilizare.
 Sintaxa generală grep este:
grep opțiuni tipar-căutare cale-către-fișier

 După cum veți observa din pagina de manual, există câteva denumiri puțin diferite, grep, egrep, fgrep, zgrep, toate sunt de fapt ipostaze ale grep, reprezintă de fapt comanda grep cu opțiuni specifice: egrep= grep -E (extended grep, căutare extinsă, poate folosi caractere speciale), fgrep= grep -F (fast grep, căutare rapidă, după un tipar fix, exact), zgrep= grep -Z (căutare în fișierele arhivate, lucrează nativ cu .zip).
 Până acum am aflat deja câteva opțiuni (-E, -F, -Z), alte opțiuni utile sunt:
-i (--ignore-case)         = ignoră diferența între minuscule și majuscule, atât pentru tiparul de căutare, cât și pentru numele fișierului
-r (-R sau --recursive) =căutare recursivă, în toate fișierele și toate directoarele; alternativ punem director/* la cale, de exemplu ~/* reprezintă toate fișierele din directorul ~
-w (--word-regexp)       = căutare după cuvinte exacte (cal de exemplu, nu va afișa și calendar, calculator, portocală, etc)
-c (--count)                     = va afișa de câte ori apare tiparul de căutare
-n (--line-number)         = va afișa numerele liniilor ce conțin tiparul de căutare
-v (--invert-match)        = va afișa invers, adică liniile ce NU conțin tiparul
-l (L minuscul)                 = în loc să afișeze liniile ce conțin tiparul de căutare, va afișa numele fișierului ce conține acel text

 Exemple concrete:
grep cal cuvinte              = va căuta cuvântul cal în fișierul cuvinte
grep cal Desktop/*        = caută tiparul de căutare (cal) în toate fișierele din directorul Desktop
grep -in cal Desktop/*   = va include la rezultate cuvintele indiferent că sunt scrise cu majuscule sau minuscule și va arăta numărul liniilor din fișierele ce conțin tiparul


grep -Eiw "cal|dor" cuvinte = va căuta 2 sau mai multe cuvinte în fișierul dat, termenii trebuie puși între ghilimele și separați de |
egrep -iwn "anonim|dumnezeu|wilde" Desktop/*  = egrep e similar cu grep -E, vă amintiți?, comanda va căuta 3 termeni în toate fișierele directorului Desktop, fiind indicat și numărul liniiilor
egrep -l "cal|dor|anonim|dumnezeu|wilde|acasă" Desktop/*   = va afișa numele fișierelor ce conțin termenii de căutare

grep -in "adevărul este rareori pur" Poante  = putem căuta popoziții întregi
zgrep -i "tot ce e bun" Poante.zip  =putem căuta direct în arhive .zip
zgrep --color -i "tot ce e bun" Poante.zip  = după cum ați observat, comanda precedentă nu avea marcat stringul găsit cu o altă culoare, opțiunea --color va face aceasta. Faptul că-n imagini vedeți marcate expresiile găsite cu roșu se datorează unor aliasuri din .bashrc, cel cu zgrep fiind comentat special pentru a vedea diferența:
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
alias zgrep='zgrep --color=auto'


duminică, 17 iunie 2012

Aniversare

 Sâmbătă 18 iunie 2011- luni 18 iunie 2012, un an de la ”nașterea” acestui blog. Cam fără intenție, băiatul meu avea o temă la școală... :D
1 autor- 8 cititori fideli- 64 materiale- 16.000 accesări. Cifre.
Mulțumesc vizitatorilor! Beau o bere. Zic io c-o merit!
Back to top