Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Base de données relationnelle | |
|
+5Nardo26 papydall sergeauze Jicehel Klaus 9 participants | |
Auteur | Message |
---|
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Base de données relationnelle Ven 9 Nov 2012 - 11:27 | |
| Challenge pour un fou (pas forcément pour Klaus, mais pour si quelqu'un a envie de s'arracher les cheveux): Faire une représentation graphique des données et de relations ... Ça peut paraitre simple au début, mais ça devient un véritable casse tête quand les relations augmentent... Si quelqu'un a du temps et aime les casse-têtes, c'est un beau challenge ... véritablement complexe. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Ven 9 Nov 2012 - 11:54 | |
| Et encore plus fou: faire un éditeur graphique pour dessiner les liens, puis générer la structure à partir de cela !
Et tu vas rire: cela existe ! C'est ce qu'utilise l'excellent logiciel WinDev de PC-Soft pour décrire sa base de données et générer automatiquement, non seulement la structure et les fichiers, mais également un programme basique gérant le base de données !
Mais la création d'un tel outil est évidemment hors de portée pour une seule personne. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Base de données relationnelle Ven 9 Nov 2012 - 12:51 | |
| C'est clair que ce n'est pas évident à faire... Sur des gros projets cela reste néanmoins indispensable (et obligatoire) de passer par de tels outils pour modéliser les bdd (méthode Merise par ex)... PS: j'en parle car je suis en plein dedans en ce moment... | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Base de données relationnelle Ven 9 Nov 2012 - 13:30 | |
| En tout cas Nardo si tu te sens capable de coder ça, fais toi plaisir, mais c'est encore plus complexe que les arbres ... (tu avais fais déjà fort à l'époque pour tracer les arbres) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Ven 9 Nov 2012 - 17:28 | |
| Il y a une nouvelle version. Cette version gère la notion des "ensembles".
Un ensemble est une collection non ordonnée d'éléments. Dans une BDR, un ensemble est une entité, ainsi que tous les éléments. N'importe quelle entité peut être élément de n'importe quelle autre, et n'importe quelle entité peut être un ensemble et contenir d'autres entités comme élément.
Un ensemble peut avoir pour élément une entité qui est elle-même un ensemble qui contient une entité qui est elle-même un ensemble etc. Il n'y a pas de limitations à ce niveau.
Il y a bien sûr un problème de récursivité. C'est pourquoi le programme bloque l'insertion d'un élément en lui-même, ainsi que l'insertion dans un élément de lui-même. Mais il est déraisonnable de pousser les tests plus loin. C'est à l'utilisateur d'assurer la cohérence logique de la structure.
Un nouveau volet *.ele est créé pour gérer cette structure. Les fichiers mis à jour sont: - BDR.dll - BDR_SUB.bas - demo_BDR_SUB.bas - tous les test.* y compris le nouveau test.ele La nouvelle version de test.* est identique à la précédente, mais contient une entité supplémentaire: "mammifère", qui est un ensemble contenant "souris" et "loup" comme éléments. Et le programme demo_BDR_SUB.bas montre cela en listant le contenu de mammifère.
Ce qui va suivre maintenant: - adaptation de certaines fonctions pour délivrer leur résultat dans un ensemble (comms DBRfindrelation) - création des opérations sur les ensembles (union, intersection, ...)
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Base de données relationnelle Ven 9 Nov 2012 - 17:45 | |
| Je dois pouvoir me servir de ça pour gérer de la connaissance
Par exemple en créant des sociétés: A, B, C En créant des site pour chaque société (Site 1 de la société A, site 2 .. , pareil pour les société B et C) En créant par exemple des logiciels (L1, L2, L3, ...) Après, je devrais pouvoir créer une connaissance (C1) qui serait membre du logiciel L1 et des société A et C sauf pour le Site 1 de la société A ? | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Base de données relationnelle Ven 9 Nov 2012 - 17:48 | |
| Je sens la migraine qui monte... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Ven 9 Nov 2012 - 19:31 | |
| @Jicehel: - Citation :
- Par exemple en créant des sociétés: A, B, C
En créant des site pour chaque société (Site 1 de la société A, site 2 .. , pareil pour les société B et C) En créant par exemple des logiciels (L1, L2, L3, ...) Après, je devrais pouvoir créer une connaissance (C1) qui serait membre du logiciel L1 et des société A et C sauf pour le Site 1 de la société A ? Est-ce que ça signifie, en notation symbolique: - Citation :
A --Site AS1 ----logiciel L1 ----logiciel L2 --Site AS2 ----logiciel L2 B --Site BS1 ----Logiciel L2 --Site BS2 C --Site CS1 ----logiciel L1 --Site CS2 ----logiciel L1 ----logiciel L2
L1->C1->AS1 L1->C1->CS1 L1->C1->CS2
L2->c2->AS1 L2->C2->BS1 L2->c2->CS2
En notation "macro", on créerait les entités ainsi: - Citation :
add,A,Dupont add,AS1,Bordeaux add,AS2,Biaritz add,B,Megaflex add,BS1,Tours add,BS2,Loches add,C,ElectroGenie add,CS1,Nancy add,CS2,Metz
add,L1,Facturation add,L2,Comptabilité
add C1,UtilisationDeFacturation add,C2,UtilisationDeDomptabilité
Toujours en notatioin "macro", on créerait la structure ainsi: - Citation :
str,L1,C1,AS1 str,L1,C1,CS1 str,L1,C1,CS2
str,L2,C2,AS1 str,L2,C2,BS1 str,L2,C2,CS2
Et, toujours en notation macro, quelques interrogations: - Citation :
Sur quels sites est déployé la comptabilité: fdr,C2,L2,?
Est-ce que le site BS2 utilise la facturation ? fdr,L1,C1,BS2
On peut aussi utiliser les ensembles pour regrouper les sites utilisant un logiciel. Ainsi, L1 et L2 deviendraient des ensembles ayant comme élément les sites utilisant ces logiciels: - Citation :
création de la structure: ste,AS1,L1 ste,CS1,L1 ste,CSE,L1
ste,AS1,L2 ste,BS1,L2 ste,CS2,L3
Sur quels sites est déployé la comptabilité: lis,L1
Est-ce que le site BS2 utilise la facturation ? fde,BS2,L2
Et ce n'est qu'une ébauche faite rapidement, et avec les commandes macro. L'utilisation des procédures BDR_SUB permet plus de souplesse et de fonctionnalités, et le système est actuellement en pleine évolution. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Base de données relationnelle Ven 9 Nov 2012 - 19:52 | |
| Absolument Klaus. C'est très pratique. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Ven 9 Nov 2012 - 22:36 | |
| Nouvelle version:
Ajout de la procédure BDRfindrelationset(A,R,B,set).
Cette procédure est identique à BDRfindrelation, mais le résultat n'est pas envoyé dans un mémo dont on spécifie le numéro à la procédure BDR_SUB (ou le handle à la fonction de la DLL), mais le résultat sera déposé comme éléments d'un ensemble. Cet ensemble est une entité dont le nom est spécifié et 4ème paramètre. Dès lors, on pourra utiliser ces informations dans des procédures ultérieures.
modules modifiés: DBR.dll, DBR, SUB.bas et lisez-moi.txt.
On peur l'utiliser par la fonction macro fds. Exemple: add,prédateur fds,souris,,,prédateur lis,prédateur montre que chat et rapace sont éléments de l'ensemble prédateur. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Sam 10 Nov 2012 - 1:16 | |
| Nouvelle version.
Ajout des procédure - BDRsetunion(set1,set2,union) - BDRsetintersection(set1,set2,intersection) ce qui correspond aux fonctions dll: - res% = dll_call3("BDRsetunion",adr(set1$),adr(set2$),adr(union$)) - res% = dll_call3("BDRsetintersection",adr(set1$),adr(set2$),adr(intersection$))
Ces fonctions font ce que dit leur nom: elles réalisent les opérations union et intersection sur deux ensembles et placent le résultat sous forme d'éléments à l'ensemble union$ ou intersection$.
BDR.dll, BDR_SUB.bas et lisez-moi.txt ont été mis à jour.
D'autres fonctionnalités suivront. Je me mets un peu sur la doc, à nouveau. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Sam 10 Nov 2012 - 15:18 | |
| La doc BDR.chm a bien avancée. En ligne sur MyDrive. Elle sera bientôt complète. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Sam 10 Nov 2012 - 21:47 | |
| La doc DBR.chm est complète. Ce qui a changé aussi (correction d'un bug mineur avec BDRmacro): - lisez-moi.txt - BDR.dll - BDR_SUB.bas - et bien sûr BDR.chm
Je fais une petite pause sur les fonctionnalités pour produire un autre exemple d'application, plus complexe. | |
| | | sergeauze
Nombre de messages : 391 Age : 72 Localisation : Hautes Alpes France Date d'inscription : 09/01/2010
| Sujet: Re: Base de données relationnelle Sam 10 Nov 2012 - 23:08 | |
| Merci Klaus pour ton travail J'avoue que je peine a suivre mais je m'accroche! Je vais tout relire depuis le debut et surtout la doc | |
| | | sergeauze
Nombre de messages : 391 Age : 72 Localisation : Hautes Alpes France Date d'inscription : 09/01/2010
| Sujet: Re: Base de données relationnelle Dim 11 Nov 2012 - 16:50 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Dim 11 Nov 2012 - 18:32 | |
| Non, Pas du tout. C'est un tutoriel orienté bases de données classiques, interrogeables par SQL. Ce n'est pas su tout le cas de BDR qui est une base de données RELATIONNELLE.
La différence essentielle, c'est que dans les bases traditionnelles, les liens sont basées sur le CONTENU de certains champs, donc sur les DONNEES. Or, dans mon cas, les données sont NEUTRES, et même OPTIONNELLES ! Toute la structure, tous les liens sont EXTERNES aux données. On peut librement remplacer, même supprimer les données, et la structure reste pourtant valide ! Ce n'est pas le cas des bases dont parle ce tuto.
Il est tout de même intérressant pour voir, par opposition, les différences entre les deux systèmes. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Base de données relationnelle Dim 11 Nov 2012 - 20:08 | |
| Klaus à raison: le tuto en question ne t'apportera pas d'aide par rapport à ce qu'il a mis en place... - Klaus a écrit:
- Non, Pas du tout. C'est un tutoriel orienté bases de données classiques, interrogeables par SQL. Ce n'est pas du tout le cas de BDR qui est une base de données RELATIONNELLE.
Petite rectification : les bases de données classiques (interrogeables via SQL) sont également relationnelles... puisqu'on établi des relations entre les différentes tables qui compose la base. (cf clés étrangère, jointure, etc...) c'est d'ailleurs tout l'intérêt de la chose... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Dim 11 Nov 2012 - 20:55 | |
| Certes. Mais comme je l'ai dit, ces relations sont basées sur les données. Dans ma base, les relations son indépendantes de la structure, et c'est là la différence fondamentale.
Bien sûr, l'objectif n'est pas le même, non plus. Une base de données "normale", commerciale, peut être utilisée pas des dizaines, voire des milliers d'utilisateurs simultanés. C'est même une des raisons d'être essentielles. Ce n'est pas le cas de ma réalisation très modeste qui est explicitement limité à un usage par un seul utilisateur à la fois.
Et puis, BDR est utilisable très facilement à partir de Panoramic, ce qui n'est absolument pas le cas des bases de données classiques. On peut déjà regarder l'exemple d'une gestion de contacts à l'aide de BDR - cela donné déjà une idée de l'utilisation en tant que fichier à accès par clé (le nom étant la clé). Je suis en train de réaliser une petite facturation, cas type d'une application de gestion utilisant des bases de données, et je pense qu'un sera surpris de la simplicité de l'utilisation de BDR, abstraction faite' du contexte environnant pour créer le visuel, la gestion d'écran, le contrôle des données saisies etc. Mais des commentaires intensifs montreront l'essentiel. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Lun 12 Nov 2012 - 1:34 | |
| J'ai mis en ligne une première version d'un programme de facturation avec BDR. C'est logiquement dans le dossier BDR\facturation avec BDR sur MyDrive.
Ce dossier contient tout ce qui est spécifique au programme de facturation. Il n'y a plus qu'à ajouter DBR_SUB.bas, et on peut exécuter le programme.
Il démarre avec un affichage de 4 onglets.
Le premier est un onglet de synthèse donnant la liste des clients, le total de leur chiffre d'affaires et le total de l'en-cours (montants non encore réglés). Dans cet onglet, on peut créer un nouveau client, ou cliquer sur le client de démo pré-enregistré.
Dans les deux cas, on sera envoyé automatiquement vers le deuxième volet: clients. En création, il faut renseigner les zones. Ayant sélectionné un client existant, on peut modifier les zones. Dans tous les cas, le bouton "Valider" écrit le contenu des zones sur disque. Dans cet onglet, on peut aussi saisir un nom dans le champ "nom" et cliquer sue le bouton "Chercher".
Le bouton "Créer facture" permet de créer une facture pour ce client. Le 3ème onglet sera activé et on peut y saisir une date (obligatoire) et 1 à 2 lignes de facture (eh oui, c'est juste une démo !). Le bouton "Valider" vérifie la saisie et crée une entête de facture et 1 à 2 lignes de détail si tout est valide.
Dans de deuxième volet, on peut aussi utiliser le bouton "Saisir règlement" pour activer le 4ème volet. Il affiche automatiquement toutes les factures pour le client sélectionné, avec date, numéro de facture, total de facture et encours de facture. Il faut alors sélectionner une facture en cliquant dans n'importe laquelle des 4 listes, puis saisir le montant à régler (peut être partiel), puis utiliser "Valider" pour mémoriser le règlement. Le programme refuse un règlement qui dépasse le montant de l'encours. En validation, l'encours de la facture sélectionné ET l'encours général du client sera ajusté. Le résultat sera immédiatement visible en retournant dans le premier ou de deuxième volet.
Bon, je ne prétends pas avoir fait une merveille de facturation. Ce n'était pas le but d'une petite appli écrite en moins de 3 jours. Ce qu'il faut observer, c'est l'utilisation des procédures BDRxxx et DelimitedTextxxx, avec l'utilisation des variables générées par ces procédures. Toute la puissance est là.
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Mar 13 Nov 2012 - 11:35 | |
| Nouvelle version.
- correction de quelques bugs mineurs - ajout de 4 fonctions permettant d'influer sur le fonctionnement global d'une BDR: 1. autoriser ou interdire l'existence d'entités portant le même nom (interdir par défaut) 2. autoriser ou iinterdire les références circulaires dans les ensembles (interdit par défaut)
BDR_SUB.bas et BDR.chm sont mis à jour.
Pour ceux qui veulent voir ce que ça donne avec un nombre d'entités importants: il y a un sous-dossier "communes" avec deux versions différentes d'un programme qui va gérer 2x36000 entités. Moins de 2 minutes au tout premier démarrage pour créer la BDR pour demo_communes.bas, et entre 50 et 60 minutes pour demo_communes_bis.bas. Les démarrages suivants sont quasi immédiats. Et les recherches sont instantanées.
Pour gagner du temps au démarrage, je place les deux bases générées dans le dossier, avec les sources. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Mar 13 Nov 2012 - 18:44 | |
| Nouvelle version.
Il y a maintenant deux nouvelles fonctions qui permettent de forcer la recherche d'un nom sur "nom exact" (par défaut) ou sur nom partiel. BDR.dll, BDR_SUB.bas et BDR.chm sont adaptés.
J'ai adapté demo_communes_bis.bas à cette fonctionnalité. Ceci permet de rentrer le début d'un nom de ville, et on obtiendra la première ville (dans l'ordre alpabétique) dont le débute avec le critère saisi. On peut ensuite adapter le nom à rechercher, et recommencer.
Dans tous les cas de figures, la cherche est ultra-rapide.
On peut considérer cette application comme on projet avec un fichier avec un accès par 2 clés: le code postal et le nom de la ville. On peut utiliser indifféremment l'un ou l'autre pour accéder le fichier. Imaginez une gestion de votre cave à vin, votre collection de disques, de MP3, de vidéos... Ce type d'accès par 1, 2 ou plusieurs clés est la base même de tout type d'application de gestion. Et comme vous pouvez constater, ceci est ultra-rapide.
C'est dans ce contexte que je pense à Pan59 et son programme de traduction, qui passe forcément par un ou plusieurs dictionnaires, assez volumineux, qui sont à accéder en fonction d'une clé en forme de texte. Avec BDR, l'accès serait vraiment très rapide - recherche par dichotomie réalisée en Delphi, et non écrite par moi, mais faisant partie intégrante du composant Delphi utilisé, donc parfaitement optimisé. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Mer 14 Nov 2012 - 10:12 | |
| J'ai modifié demo_communes_bis.bas.
Il y a maintenant une zone de saisie en haut de l'écran. Dans cette zone, on saisit indifféremment le code postal ou le nom de la commune. L'affichage des possibilités de fait au fur et à mesure de la saisie. Un clic dans la liste en bas sélectionne cette commune et affiche ses informations.
Il n'y a donc plus la saisie dans les zones spécifiques au code postal et au nom de commune, et les bontons "Chercher" ont disparu. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Base de données relationnelle Jeu 15 Nov 2012 - 22:51 | |
| J'ai ajouté deux fonctions qui permettent de "filtrer" les éléments d'un ensemble en comparant leur nom à une chaîne de caractères servant de filtre. Seuls les noms correspondant au filtre seront retenus. Le résultat pourra être visualisé dans un mémo ou déposé comme éléments d'un nouvel ensemble. BDR_SUB.bas et BDR.chm sont mis à jour. J'ai utilisé cette fonction dans demo_communes_bis.bas. Il y a de nouvelles zones en haut à droite: la première permet de saisir un code postal, la seconde est pour le filtre. Puis, il y a un bouton "Filtrer". Le programme recherche alors toutes les communes du même code postal, filtre leur nom par le filtre indiqué, et affiche le résultat dans le mémo en bas. Pour connaître les possibilités pour le filtre, consultez la doc pour les fonctions BDRfilterelementnamestomemo ou BDRfilterelementnamesstoset. Juste quelques exemples: * (identique à critère vide) ==> tout nom sera accepté *-* ==> uniquement les noms composés avec trait d'union St.* ==> tout nom commençant pas St. [ABC]*ville ==> tout nom commençant par A, B ou C et terminant par ville etc. Il y a pas mal d'autres possibilités. EDIT DBR.dll contient une nouvelle fonction indépendante de BDR qui donne accès à ces filtrages, à n'importe quel programme Panoramic. C'est la fonction FilterString. On l'appelle de la manière suivante avec la procédure BDR_SUB: - Code:
-
FilterString(chaine$,filtre$) if FilterString=1 message "correspond" else message "ne correspond pas" end_if avec un appel DLL direct: - Code:
-
res% = dll_call2("FilterString",adr(chaine$),adr(filtre$)) if res%=1 message "correspond" else message "ne correspond pas" end_if | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Base de données relationnelle Ven 16 Nov 2012 - 0:30 | |
| Bravo Klaus, vraiment puissant Bien joué | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Base de données relationnelle Ven 16 Nov 2012 - 6:18 | |
| J'arrive toujours pas à lancer le programme de Klaus... Tu as modifié quelque chose Jicehel pour le faire tourner ?C'est bon, ça fonctionne ! Avant je récupérai le répertoire commune dans lequel je rajoutai BDR_SUB.bas et BDR.dll -> Cela ne fonctionne pas Pour que cela marche : - J'ai récupéré la TOTALITE du répertoire BDR (sur le webdav) que j'ai mis à la racine de mon disque - J'ai modifié : ligne 8 : DLL_ON '..\BDR.dll" (car la dll ne se trouve pas dans le répertoire communes) J'ai fait de même pour l'include ligne 133 : #INCLUDE "..\BDR_SUB.bas" J'ai toujours pas pigé pourquoi la manip précédente ne veux pas marcher... peut être à cause des noms longs ? Sinon, une fois que l'on a réussi à le lancer, le programme marche bien Quelques remarque (juste dans le cadre des communes) : Il faudrait filtrer les articles, les accents et les tirets. - Par exemple, si je tape : "La chapelle en vercors", le programme ne trouve pas la commune à cause de "La" et également à cause de l'absence de tiret. (jette un coup d'oeil à ma fonction StripAccent$() , c'est l'ensemble des caractères folkloriques que l'on rencontre dans la base ) Je comprend pas le fonctionnement de la liste: Si je tape dans "a chercher" St-André-de-sangonis, en dessous j'ai Jonquières,etc... pourquoi ? | |
| | | Contenu sponsorisé
| Sujet: Re: Base de données relationnelle | |
| |
| | | | Base de données relationnelle | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |