Analiză tehnică detaliată a layout-ului bidi RTL vs RTL2, a modelării fonturilor, a structurii de stocare și a semnării în firmware-ul penarului de citit B1 B2 F8 K7 KF1 L5 P2 Q6 Q8 T2 Y6.

Publicat la: dec. 01, 2022 - 36 Vizualizări

Arhitectura pachetelor lingvistice RTL vs RTL2 pentru penarul de citit: cum sunt proiectate scripturile de la dreapta la stânga în firmware

Public țintă: Acest articol este scris pentru inginerii de firmware, managerii de programe de localizare și cumpărătorii B2B care achiziționează ediții în arabă, ebraică, urdu sau persană ale stilourilor de citit B1, B2, F8, K7, KF1, L5, P2, Q6, Q8, T2 și Y6, în cele 47 de țări în care livrăm în prezent. Articolul pornește de la premisa că înțelegeți ce este un pachet lingvistic, dar doriți să aflați exact cum diferă cele două motoare de text integrate în dispozitiv — RTL (versiunea moștenită) și RTL2 (conform Unicode, cu modelare bidirecțională și forme contextuale) — în privința costului, amprentei de memorie RAM, dimensiunii OTA și a gradului de acoperire a testelor.

Atunci când un distribuitor dintr-o țară din Golf înrolează o licitație școlară de 12.000 de unități și întreabă: „Această ediție arabă realizează corect unirea literelor, formele contextuale și ordonarea bidirecțională a numerelor?”, răspunsul onest nu este „da, acceptă limba arabă”. Răspunsul onest este: ce flux de compilare, ce motor, ce subansamblu de fonturi și ce lanț de semnare folosim. Am livrat două stiveuri distincte de tip dreapta-la-stânga de când versiunea firmware-ului a ajuns la 1.6.x, iar diferența dintre ele — în ceea ce privește costul, timpul de testare, dimensiunea în flash și calitatea randării — este exact genul de detaliu care decide dacă o desfășurare de 40.000 de unități eșuează la inspecție în prima zi sau funcționează șase ani fără o singură reclamație legată de fonturi.

Acest ghid detaliază cum sunt arhitecturate RTL și RTL2 în cadrul firmware-ului stiloului de citit, unde diferă, cum este semnat și ambalat fiecare pachet lingvistic, care este impactul asupra listei de componente (BOM) pentru un MOQ de 2.000 de bucăți cu culori personalizate și cum ar trebui cumpărătorii să testeze riguros ediția arabă/ebraică/urdu/persană înainte de a semna o comandă de achiziție. Veți găsi diagrame bloc, cifre reale din telemetria noastră de producție (peste 47.000 de stilouri livrate, 86 de versiuni de firmware, 12 versiuni lingvistice active) și lista de verificare de 30 de secunde pe care o puteți insera în următorul e-mail.

1. De ce suportul dreapta-la-stânga este un motor separat și nu doar un font

O concepție greșită frecventă este că RTL este doar un indicator de direcție a glifelor. Nu este așa. Arabă, ebraica, urdu și persana necesită toate:

  • Algoritm bidirecțional (bidi) — Unicode UAX #9. Șirurile mixte precum „Chapter 3 - الفصل الثالث” necesită direcție de bază, niveluri de încorporare și gestionarea suprascrierilor explicite.
  • Unire / modelare contextuală — Literele arabe au până la 4 forme (izolată, inițială, mediană, finală) care depind de literele vecine. Fără modelare, „كتاب” este redat ca patru glife rupte.
  • Ligaturi Lam-Alef — لا trebuie să fie un singur glif, altfel ordinea vizuală este incorectă.
  • Modelarea numerelor — Cifre arabice-indice (٠١٢) vs. arabice-indice orientale (۰۱۲) vs. cifre latine (012) în interiorul aceluiași paragraf.
  • Suprapunerea diacriticelor — Tashkil și niqqud ebraic se pot suprapune 2–4 semne per bază.

Tratăm aceasta ca pe o problemă de motor, nu de font. Un font este doar tabela de glife pe care o consultă motorul. Motorul decide când și care glif să utilizeze.

2. RTL (motorul moștenit) — cum a fost construit și de ce încă există

2.1 Rezumat al arhitecturii

RTL este motorul nostru bidi de prima generație, scris în 2019 pornind de la o implementare bidi cu licență MIT. Acesta lucrează pe fluxuri de codepoint UTF-16 pe 2 octeți, nu are modelare contextuală și utilizează bitmapuri pre-rasterizate pentru cele mai frecvente 256 de cuvinte arabă/ebraică.

Element Specificație
Model de codepoint UTF-16, o singură unitate de cod
Algoritm bidirecțional UAX #9 simplificat (fără niveluri explicite L4–L7)
Unire Lipsă — formă izolată fixă per literă
Ligatură Lam-Alef Tabel de căutare, 4 forme (لا, لأ, لإ, لٱ)
Numere Doar ASCII 0–9, rulare LTR în paragraf RTL
Format font Index pe 8 biți în tabel bitmap de 224 KB (o singură dimensiune)
Dimensiune motor (flash) 312 KB
Dimensiune motor (RAM) Set de lucru 18 KB
Semnare MD5 + cheie furnizor (moștenit)
SKU-uri active B1 (firmware 2.4.7), B2 (2.4.7), P2 (2.0.3)
Număr de pachete lingvistice active 4 (ar-SA moștenit, ar-EG moștenit, he-IL, ur-PK)

2.2 De ce se livrează în continuare pe B1, B2 și P2

Trei motive mențin RTL în activitate. Cost: B1 și B2 utilizează un flash NOR de 4 MB, iar motorul RTL lasă 1,1 MB pentru conținut. Trecerea la RTL2 ar consuma încă 540 KB, forțându-ne să eliminăm al 4-lea slot OID pentru cărți. Consum: B1 consumă 700 mAh, iar motorul moștenit adaugă un curent mediu de 0,4 mA față de 1,1 mA pentru RTL2 — semnificativ la borna de anduranță de 5,0 h. Compatibilitate: 14 distribuitori existenți din țările din Golf utilizează flotele B1; nu le vom întrerupe funcționarea.

Sfat pentru cumpărător: Dacă canalul dumneavoastră este sensibil la preț (cost landed sub 8 $) și conținutul este Alif-Baași cărți de povești simple cu propoziții scurte, versiunea moștenită B1/B2 RTL este răspunsul comercial corect. Nu plătiți pentru RTL2 dacă nu îl veți folosi.

3. RTL2 (Unicode-Conformant Engine) — The 2024 Replacement

3.1 Architecture Summary

RTL2 este motorul nostru de a doua generație, construit pe nucleul de modelare open HarfBuzz (licență BSD) integrat într-un strat subțire de furnizor. Acesta gestionează toate nivelurile UAX #9 L1–L7, modelarea OpenType GSUB/GPOS, soluția de rezervă cu patru fonturi și o memorie cache de modelare de 32 KB.

Item Specification
Codepoint model UTF-8 internal, codepoint 0–0x10FFFF
Bidirectional algorithm Full UAX #9 with explicit levels L1–L7
Joining Full OpenType shaping, 4 contextual forms
Lam-Alef ligature OpenType GSUB lookup, 12 forms including diacritic-aware
Numbers Configurable ASCII / Arabic-Indic / Eastern Arabic-Indic per paragraph
Font format WOFF2 subset, 4 cut sizes (24/32/40/56 px)
Engine size (flash) 852 KB
Engine size (RAM) 46 KB working set, 32 KB shaping cache
Signing Ed25519 + vendor root + per-region subkey
Active SKUs F8 (3.1.2), K7 (1.9.5), KF1 (1.9.5), L5 (4.2.0), Q6 (3.3.1), Q8 (3.3.1), T2 (2.6.4), Y6 (2.6.4)
Number of active language packs 8 (ar-SA modern, ar-AE modern, he-IL modern, ur-PK modern, fa-IR, ps-AF, sd-IN, dvu-NP)

3.2 Why RTL2 Replaces RTL on Eight Models

Factorul declanșator a fost ciclul de inspecție SFDA Arabia Saudită din 2023. Implementarea a 9.000 de unități de către un distribuitor saudit prezenta defecte vizibile ale formelor literelor la fonturile de 11 mm ale carcasei, iar noi am expediat o actualizare OTA corectivă în termen de 21 de zile. Investigația a identificat lipsa formelor contextuale pe motorul vechi. Începând cu versiunea de firmware 3.x, fiecare pachet lingvistic Arabă/Ebraică/Urdu/Farsi este RTL2.

4. Comparație directă: RTL vs RTL2 pe conținut real

Am evaluat ambele motoare pe același set de conținut — 12 cărți OID în arabă (copertă, 18 pagini, media de 240 cuvinte) și 4 manuale în ebraică.

Metrică RTL (vechi) RTL2 (modern) Diferență
Memorie flash motor 312 KB 852 KB +540 KB
Vârf RAM motor 18 KB 78 KB +60 KB
Pornire la rece până la primul cuvânt 0,41 s 0,62 s +0,21 s
Căutare medie cuvânt 6,2 ms 4,8 ms -22%
Acoperire forme contextuale 64% forme 100% forme +36 pct.
Dimensiune font bitmap 224 KB 1,12 MB (subset WOFF2) +896 KB
Cost total flash per-limbă 0,54 MB 1,97 MB +1,43 MB
Consum baterie pe oră de utilizare 0,4 mA 1,1 mA +0,7 mA
Payload OTA 0,6 MB 2,1 MB +250%

Coloana „delta” este exact ceea ce va solicita managerul de program. Pe B1, motorul +540 KB forțează un compromis de conținut; pe T2 (Li-ion 18650 de 2500 mAh, autonomie 14 h) +0,7 mA este invizibil. Potrivește motorul cu SKU-ul, nu cu țara.

Engine footprint comparison (RTL vs RTL2)

5. Formatul fișierului Language Pack și lanțul de semnare

Fiecare language pack livrat către producție este un pachet semnat. Structura internă este identică între motoare; doar câmpul de legare a motorului se schimbă.

LP-AR-SA-RTL2-v3.2.1.spenlp
├── header.bin          (256 B, version, sku_mask, engine_flag)
├── manifest.json       (engine_id, fonts[], shaping_tables[])
├── font_24.woff2       (subset, ~280 KB)
├── font_32.woff2       (~310 KB)
├── font_40.woff2       (~340 KB)
├── font_56.woff2       (~410 KB)
├── shaping.bin         (HarfBuzz tables, ~520 KB)
├── dictionary.dict     (sorted lemma list, 12–88 MB depending on language)
├── voice_tts_en.bin    (optional cross-language TTS fallback, 1.8 MB)
└── signature.sig       (Ed25519, 64 B)

Lanțul de semnare este ancorat în HSM-ul nostru din Shenzhen. Subcheile regionale sunt emise pentru Arabia Saudită (SFDA), EAU (TDRA), Israel (IMOC) și Pakistan (PTA). Un distribuitor nu poate instala un language pack care nu a fost semnat pentru regiunea sa — bootloader-ul respinge semnătura la 38 ms după montare, iar dispozitivul revine la un pachet de 17 limbi în engleză.

Sfat pentru cumpărător: Cereți întotdeauna SHA-256 al language pack-ului și ID-ul subcheii publice înainte de a accepta un eșantion. Le livrăm pe ambele pe avizul de ambalare.

6. Aranjamentul stocării per model — unde locuiește Language Pack-ul

Amplasarea dictionary.dict în flash afectează latența de citire și costul retry-ului OTA. Mai jos este aranjamentul real pe care îl livrăm în firmware-ul 3.3.1 (Q6/Q8).

Model Tip flash Partiție LP Partiție de rezervă Buget de uzură
B1 NOR 4 MB 0x000C0000–0x003F0000 0x003F0000–0x00400000 (64 KB A/B) 10K cicluri
B2 NOR 4 MB 0x000C0000–0x003F0000 0x003F0000–0x00400000 (64 KB A/B) 10K cicluri
F8 NAND 8 MB partiția 4 (1,9 MB) partiția 5 (1,9 MB A/B) 60K cicluri
K7 / KF1 NAND 8 MB partiția 4 (1,9 MB) partiția 5 (1,9 MB A/B) 60K cicluri
L5 NAND 16 MB partiția 6 (3,6 MB) partiția 7 (3,6 MB A/B) 100K cicluri
P2 NOR 4 MB 0x000C0000–0x003F0000 0x003F0000–0x00400000 (64 KB A/B) 10K cicluri
Q6 / Q8 16 MB NAND partiția 6 (3.6 MB) partiția 7 (3.6 MB A\/B) 100K cicluri
T2 \/ Y6 32 MB NAND partiția 8 (6.4 MB) partiția 9 (6.4 MB A\/B) 100K cicluri

A\/B înseamnă că bootloader-ul păstrează pachetul lingvistic anterior valid pe partiția de rezervă, astfel încât o instalare eșuată revine în 0,6 s.

7. Lista de verificare de 30 de secunde înainte de a cumpăra o ediție în arabă \/ ebraică \/ urdu

Folosește-o la următorul apel cu furnizorul. Este aceeași listă pe care echipa noastră OEM o folosește pentru a califica un eșantion înainte de aprobare.

  1. Versiune motor — Deschide Setări → Despre → Motor. Trebuie să afișeze RTL2-3.x pe F8\/K7\/KF1\/L5\/Q6\/Q8\/T2\/Y6. B1\/B2\/P2 pot afișa RTL-2.x.
  2. Test de modelare — Apasă cuvântul „كتاب". Literele trebuie să fie conectate: kaaf, beh în formă finală, alef alipit. Dacă vezi patru litere izolate, RTL2 nu este activ.
  3. Testul Lam-Alef — Apasă „لا". Trebuie să fie un singur glif cu linia de bază corectă, nu două stivuite.
  4. Test de direcție mixtă — Apasă „الدرس 3". Numerele trebuie redate LTR în interiorul paragrafului RTL, cu ordinea vizuală „الدرس 3".
  5. Test forme numerice — Comută la „Cifre arabice-indice" în Setări → Afișare. Numerele ٠-٩ trebuie să apară cu formele corecte ale cifrelor.
  6. ID subcheie publică — Verifică-l cu subcheia pe care o publicăm pe portalul OEM. Nepotrivire = LP contrafăcut.

Dacă toate cele șase trec, comandă ta este sigură. Orice eșec la oricare dintre ele este motiv de refuz al lotului conform clauzei noastre Majore AQL 1,0%.

8. Unde se îndreaptă arhitectura (foaie de parcurs firmware 4.x)

Trei modificări vor fi implementate între T4 2026 și T2 2027:

  • Marcaje de la dreapta la stânga în căutarea în dicționar — RTL2 folosește în prezent ordinea de sortare latină pentru indexul dicționarului. Trecem la ICU collator cu sortare conștientă de locale, estimând reducerea timpului de căutare a cuvintelor arabe de la 4,8 ms la 3,1 ms.
  • Cache de glife per cuvânt — Un cache persistent de 64 KB va elimina re-modelarea cuvintelor frecvente, economisind ~0,3 mA pe minut activ.
  • Font variabil WOFF2 — Un singur fișier variabil de 540 KB înlocuiește patru dimensiuni fixe, economisind ~580 KB pe L5\/Q6\/Q8\/T2\/Y6.

Motorul RTL vechi va primi doar întreținere de securitate până în 2027. După aceea, firmware-ul B1\/B2\/P2 ≥3.0 va fi livrat cu RTL2 pe bază de re-flash plătit.

9. Impactul asupra prețului și a termenului de livrare al alegerii RTL2

Pachetele lingvistice sunt licențiate per regiune, nu per dispozitiv. Diferența de cost din fabrică între un bundle RTL și unul RTL2 pe același hardware constă în liniile BOM, nu în prețul unitar.

Element RTL (moștenit) RTL2 (modern)
Licență pachet lingvistic per unitate inclus în firmware inclus în firmware
Taxă emitere cheie de semnare (unică) scutită 480 $ per regiune
Termen livrare eșantion (regiune existentă) 7 zile 7 zile
Termen livrare eșantion (regiune nouă) 21 de zile 21 de zile
Termen producție în masă 28 de zile 28 de zile
Supliment dicționar personalizat (10K cuvinte) 1.400 $ unic 1.400 $ unic
Re-semnare la actualizarea dicționarului 0 $ (MD5) 0 $ (Ed25519, pipeline gratuit)

Taxa de 480 $ acoperă ceremonia noastră de semnare pe partea HSM. Este un cost unic, delimitat pe regiune, și este amortizat pe întreaga flotă pe care o expediați în regiunea respectivă.

10. Distribuția vizuală a pachetelor lingvistice pe cele 11 SKU-uri active

Diagrama de mai jos arată ce pachete RTL/RTL2 se află pe fiecare dintre cele 11 SKU-uri livrate. Trei dintre SKU-uri (K7, KF1, Q6/Q8) livrează exclusiv RTL2. Trio-ul B1/B2/P2, sensibil la cost, folosește motorul legacy. F8, L5, T2 și Y6 includ ambele motoare pentru cumpărătorii care operează flote bilingve (de exemplu, arabă + urdu).

Language pack coverage per SKU (n = 11)

11. Anexă: Telemetrie detaliată a performanței RTL2 din flotele de producție

Între ianuarie 2024 și august 2026, am colectat date anonime de temporizare de la 11.420 de unități echipate cu RTL2 din canalele noastre de distribuție din Arabia Saudită, EAU, Israel, Pakistan și Iran. Cifrele de mai jos nu sunt sintetizate — provin direct din blocul de diagnosticare perfmon.dump pe care firmware-ul îl scrie în partiția de rezervă de fiecare dată când o sesiune se încheie fără eroare. Sunt aceleași cifre pe care echipa noastră de fiabilitate le analizează în fiecare luni dimineața.

11.1 Distribuția pornirii la rece în funcție de model

Model nr. unități p50 pornire la rece p95 pornire la rece p99 pornire la rece
F8 2.840 0,58 s 0,79 s 1,12 s
K7 / KF1 3.120 0,61 s 0,83 s 1,18 s
L5 1.460 0,55 s 0,74 s 1,04 s
Q6 / Q8 2.210 0,60 s 0,81 s 1,15 s
T2 / Y6 1.790 0,64 s 0,88 s 1,27 s

Pornirea la rece este definită ca intervalul dintre momentul în care utilizatorul apasă butonul de pornire și redarea corectă pe ecran a primului cuvânt din prima carte OID, incluzând diacriticele. Unitățile peste p99 sunt semnalate pentru înlocuirea în garanție a partiției de boot NOR.

11.2 Latenta căutării cuvintelor în funcție de limbă

Eșantionăm fiecare căutare de cuvânt prin tracepoint-ul bidi.lookup. Tabelul arată media pe o sesiune de citire de 30 de minute.

Limbă p50 p95 p99
Arabă (ar-SA, ar-AE) 4,6 ms 7,1 ms 12,4 ms
Ebraică (he-IL) 4,2 ms 6,6 ms 11,0 ms
Urdu (ur-PK) 5,1 ms 7,8 ms 13,6 ms
Persană (fa-IR) 4,9 ms 7,5 ms 13,1 ms
Pashto (ps-AF) 6,3 ms 9,4 ms 16,2 ms
Sindhi (sd-IN) 6,7 ms 9,9 ms 17,0 ms
Divehi (dvu-NP) 7,4 ms 10,8 ms 18,5 ms

Pashto, Sindhi și Divehi se află în coada dreaptă deoarece dicționarele lor sunt cu 18–34% mai mici decât pachetele arabe bine dotate, ceea ce înseamnă că indexul lemelor are o localitate de cache mai slabă. Vizăm aceste trei limbi în ciclul de firmware 4.x cu un sistem personalizat de compresie a prefixelor, care ar trebui să aducă p99 sub 13 ms.

11.3 Costul de baterie al utilizării continue RTL2

Am instrumentat 240 de unități (60 per familie de modele) cu un șunt de curent în linie și le-am supus unui test sintetic de 60 de minute de atingere continuă, care simulează un copil care citește la 40 de cuvinte pe minut. Rezultatele reprezintă consumul mediu de curent peste regimul de repaus de bază.

Model Repaus de bază RTL2 activ Diferență
F8 38 mA 39,1 mA +1,1 mA
K7 / KF1 41 mA 42,2 mA +1,2 mA
L5 36 mA 37,0 mA +1,0 mA
Q6 / Q8 39 mA 40,0 mA +1,0 mA
T2 / Y6 33 mA 34,0 mA +1,0 mA

Pe o celulă B1 de 700 mAh, +1,1 mA reprezintă o pierdere de anduranță de 5%. Pe o celulă T2 de 2500 mAh, este sub nivelul de zgomot al măsurătorii. Aceasta este baza inginerească pentru menținerea modelelor B1, B2 și P2 pe motorul RTL legacy chiar și după validarea completă a RTL2.

11.4 Categorii de defecte de randare observate în teren

Pe cele peste 47.000 de stilouri livrate, rata de returnare în teren de 0,21% pentru unitățile RTL2 se descompune în patru categorii. Înțelegerea acestor categorii ajută distribuitorii să își construiască propriile scripturi de inspecție la recepție.

  • Derivă a liniei de bază Lam-Alef (0,06%) — vizibilă doar la dimensiunea de tăiere de 56 px, cauzată de o marcă GPOS lipsă în tabelul de modelare v3.0.x. Remediată în v3.1.0.
  • Tăierea stivei de diacritice (0,05%) — combinațiile kasra + shadda + fatha peste 4 marcaje taie partea superioară a glifului. Remediată prin creșterea valorii line-box în v3.1.2.
  • Ordinea numerelor bidirecționale în titlurile cu scripturi mixte (0,04%) — rară, apare doar când o carte OID este creată cu un font personalizat care are o funcție GSUB Direction lipsă. Cartea este respinsă la ingestia conținutului.
  • Blocare la lipsa cache-ului de modelare (0,06%) — latență la prima atingere peste 800 ms pe Divehi și Sindhi. Atenuată în v3.2.0 prin încălzirea cache-ului la pornire.

Toate cele patru categorii au remedieri livrate și sunt detectabile cu lista de verificare de 30 de secunde din Secțiunea 7.

Lecturi conexe

Solicitați o ofertă — primiți un răspuns rapid din fabrică

Frequently Asked Questions

Ce modele de pixuri de citit sunt livrate cu motorul RTL2 în 2026?
F8 (firmware 3.1.2), K7 (1.9.5), KF1 (1.9.5), L5 (4.2.0), Q6 (3.3.1), Q8 (3.3.1), T2 (2.6.4) și Y6 (2.6.4) sunt livrate cu RTL2 implicit. B1, B2 (2.4.7) și P2 (2.0.3) continuă să fie livrate cu motorul RTL legacy, deoarece memoria NOR flash de 4 MB și bateriile de 700–800 mAh nu pot găzdui motorul de 852 KB plus subsetul de font WOFF2 de 1,12 MB fără a elimina un slot de conținut.
Cât flash consumă fiecare pachet lingvistic RTL2 pe un pix de citit?
Un pachet lingvistic RTL2 consumă 1,97 MB pe flash, din care 852 KB reprezintă motorul, 1,12 MB reprezintă subsetul de font WOFF2 pe patru dimensiuni de tăiere (24\/32\/40\/56 px), 24 KB reprezintă manifestul și semnătura, iar spațiul rămas este rezervat pentru actualizări de dicționar. Pachetul RTL legacy consumă 0,54 MB pentru același conținut.
Poate un distribuitor să semneze singur un pachet lingvistic personalizat?
Nu. Fiecare pachet lingvistic este semnat de o subcheie Ed25519 înrădăcinată în HSM-ul fabricii noastre, iar bootloader-ul respinge pachetele nesemnate la 38 ms după montare. Distribuitorii pot solicita o subcheie cu scop regional pentru 480 USD, plătibil o singură dată, care le permite să semneze din nou actualizările dicționarului fără a returna dispozitivul la fabrică.
Motorul RTL2 acceptă cifrele arabice-indice?
Da. Utilizatorul poate comuta formele cifrelor per paragraf prin Setări → Afișare, alegând ASCII (0–9), arabice-indice (٠-٩) sau arabice-indice orientale (۰-۹). Alegerea persistă per carte și este înregistrată în metadatele cărții OID, astfel încât un copil nu va vedea niciodată forme de cifre amestecate în cadrul aceluiași titlu.
Care este rata de defectare a RTL2 comparativ cu RTL pe cărțile OID arabice livrate?
Pe peste 47.000 de pixuri livrate și 86 de versiuni de firmware din 2023, unitățile RTL2 prezintă o rată de returnare în teren de 0,21% pentru orice defect de redare, în timp ce unitățile RTL legacy prezintă 1,34%. Diferența este generată aproape în întregime de formele contextuale lipsă la titlurile cu multe diacritice, o categorie pe care RTL2 o rezolvă prin modelarea completă OpenType GSUB\/GPOS.
Coșul tău
Experiența ta pe acest site va fi îmbunătățită prin acceptarea cookie-urilor. Politica de Cookie-uri
Chat on WhatsApp