Skip to content
Snippets Groups Projects
Commit 6b39c2fd authored by Edoardo Basilico (EDU-GE)'s avatar Edoardo Basilico (EDU-GE)
Browse files

Ajout de la leçon 3 avec son corrigé. Une fois validé, créer la leçon en...

Ajout de la leçon 3 avec son corrigé. Une fois validé, créer la leçon en enlevant les réponses pour les élèves.
parent 60782d11
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags:
# Leçon n°3: Gestion simplifiée d'un cinéma
%% Cell type:markdown id: tags:
**Cliquez sur la cellule ci-dessous et appuyer sur Ctrl+Enter** pour afficher la base de données.
%% Cell type:markdown id: tags:
# Modélisation d'une base de données de projections de films
## Introduction
Nous allons modéliser une base de données qui gère les projections de films dans des salles de cinéma.
## 1. Description du modèle
La base de données doit gérer :
- **Les films** avec un numéro unique, un titre et une durée.
- **Les projections** qui ont un numéro unique et un tarif.
- **Les créneaux horaires** définis par une date et une heure de début.
- **Les salles** identifiées par un numéro et une capacité.
Ces entités sont liées entre elles par différentes **associations** :
- **Un film peut être projeté plusieurs fois** (relation `CONCERNE`).
- **Une projection a lieu à un seul créneau horaire**, mais un créneau peut ne pas contenir de projection (relation `AVOIR_LIEU_PENDANT`).
- **Une projection a lieu dans une seule salle**, mais une salle peut accueillir plusieurs projections (relation `AVOIR_LIEU_DANS`).
%% Cell type:markdown id: tags:
![copie d'écran](https://githepia.hesge.ch/info_sismondi/activites-2in-do/-/raw/main/Notebooks/img/BD_cours_n3_cinema_association_entite.png)
%% Cell type:markdown id: tags:
## 2. Explication des associations
#### 1. CONCERNE (1,1 PROJECTION <--> 0,N FILM)
- Chaque **projection** est associée à **un seul film**.
- Un **film** peut être projeté plusieurs fois ou ne pas l'être du tout.
#### 2. AVOIR_LIEU_PENDANT (0,N CRÉNEAU_HORAIRE <--> 1,1 PROJECTION)
- Chaque **projection** a lieu à **un unique créneau horaire**.
- Un **créneau horaire** peut ne contenir aucune projection ou en contenir plusieurs.
#### 3. AVOIR_LIEU_DANS (1,1 PROJECTION <--> 0,N SALLE)
- Chaque **projection** a lieu dans **une seule salle**.
- Une **salle** peut accueillir plusieurs projections ou être vide.
%% Cell type:markdown id: tags:
En partant du modèle entité-association, on peut créer le modèle relationnel qui va nous permettre de créer la base de donnée.
%% Cell type:markdown id: tags:
![copie d'écran](https://githepia.hesge.ch/info_sismondi/activites-2in-do/-/raw/main/Notebooks/img/BD_cours_n3_cinema_schema_relationnel.png)
%% Cell type:markdown id: tags:
## 🔑 Rappel sur les clés primaires et clés étrangères
Dans une base de données relationnelle, les **clés primaires** et **clés étrangères** permettent d'établir des liens entre les tables.
### 📌 **Clé primaire**
Une **clé primaire** est un attribut (ou un ensemble d’attributs) qui identifie **de manière unique** chaque ligne d’une table.
- Elle ne peut pas contenir de valeurs NULL.
- Elle doit être unique pour chaque ligne.
**Exemple :** Dans la table `FILM`, `Num_film` est une clé primaire car chaque film possède un identifiant unique. Elle est représentée par souligné dans le schéma.
```sql
CREATE TABLE FILM (
Num_film INTEGER NOT NULL PRIMARY KEY,
Titre VARCHAR(255),
Duree INTEGER
);
```
### 📌 **Clé étrangère**
Une **clé étrangère** est un attribut qui établit une relation entre deux tables en faisant référence à la clé primaire d’une autre table. Elle est représenté par un # dans le schéma.
- Elle garantit l'intégrité des données : une clé étrangère ne peut contenir que des valeurs existantes dans la table référencée.
**Exemple :** Dans la table `PROJECTION`, `Num_film` est une clé étrangère qui fait référence à `Num_film` dans `FILM`.
```sql
CREATE TABLE PROJECTION (
Num_projection INTEGER NOT NULL PRIMARY KEY,
Tarif DECIMAL(10,2),
Num_creneau INTEGER NOT NULL,
Num_film INTEGER NOT NULL,
Num_salle INTEGER NOT NULL,
FOREIGN KEY (Num_salle) REFERENCES SALLE (Num_salle),
FOREIGN KEY (Num_film) REFERENCES FILM (Num_film),
FOREIGN KEY (Num_creneau) REFERENCES CRENEAU_HORAIRE (Num_creneau)
);
```
---
%% Cell type:markdown id: tags:
Le code suivant, permet de créer et insérer des données dans les différentes tables modélisées.
%% Cell type:code id: tags:
``` sql
-- Création des tables
CREATE TABLE CRENEAU_HORAIRE (
Num_creneau INTEGER NOT NULL PRIMARY KEY,
Date DATE,
Heure_de_debut TIME
);
CREATE TABLE FILM (
Num_film INTEGER NOT NULL PRIMARY KEY,
Titre VARCHAR(255),
Duree INTEGER
);
CREATE TABLE SALLE (
Num_salle INTEGER NOT NULL PRIMARY KEY,
Capacite INTEGER
);
CREATE TABLE PROJECTION (
Num_projection INTEGER NOT NULL PRIMARY KEY,
Tarif DECIMAL(10,2),
Num_creneau INTEGER NOT NULL,
Num_film INTEGER NOT NULL,
Num_salle INTEGER NOT NULL,
FOREIGN KEY (Num_salle) REFERENCES SALLE (Num_salle),
FOREIGN KEY (Num_film) REFERENCES FILM (Num_film),
FOREIGN KEY (Num_creneau) REFERENCES CRENEAU_HORAIRE (Num_creneau)
);
-- Insérer des valeurs dans CRENEAU_HORAIRE
INSERT INTO CRENEAU_HORAIRE (Num_creneau, Date, Heure_de_debut) VALUES
(1, '2025-02-10', '14:00'),
(2, '2025-02-10', '16:30'),
(3, '2025-02-10', '19:00'),
(4, '2025-02-11', '14:00'),
(5, '2025-02-11', '16:30'),
(6, '2025-02-12', '14:00'),
(7, '2025-02-12', '16:30'),
(8, '2025-02-12', '19:00');
-- Insérer des valeurs dans FILM
INSERT INTO FILM (Num_film, Titre, Duree) VALUES
(1, 'Inception', 148),
(2, 'Interstellar', 169),
(3, 'Avatar', 162),
(4, 'Titanic', 195),
(5, 'Joker', 122),
(6, 'The Dark Knight', 152),
(7, 'Pulp Fiction', 154),
(8, 'Forrest Gump', 142),
(9, 'The Matrix', 136),
(10, 'Gladiator', 155);
-- Insérer des valeurs dans SALLE
INSERT INTO SALLE (Num_salle, Capacite) VALUES
(1, 150),
(2, 200),
(3, 100),
(4, 180),
(5, 250),
(6, 300),
(7, 220),
(8, 130);
-- Insérer des valeurs dans PROJECTION
INSERT INTO PROJECTION (Num_projection, Tarif, Num_creneau, Num_film, Num_salle) VALUES
(1, 12.50, 1, 1, 1),
(2, 10.00, 2, 2, 2),
(3, 9.50, 3, 3, 3),
(4, 13.00, 4, 4, 4),
(5, 11.00, 5, 5, 5),
(6, 14.00, 6, 6, 6),
(7, 9.00, 7, 7, 7),
(8, 12.00, 8, 8, 8),
(9, 13.50, 1, 9, 3),
(10, 11.50, 2, 10, 4),
(11, 10.00, 3, 1, 5),
(12, 15.00, 4, 2, 6),
(13, 12.50, 5, 3, 7),
(14, 13.00, 6, 4, 8),
(15, 11.00, 7, 5, 1),
(16, 9.50, 8, 6, 2);
```
%% Cell type:markdown id: tags:
Exécuter les requêtes suivantes pour
**Cliquez sur la cellule ci-dessous et appuyer sur Ctrl+Enter** pour exécuter la requête SQL qui affiche le contenu de la table.
%% Cell type:code id: tags:
``` sql
SELECT * FROM FILM
```
%% Cell type:code id: tags:
``` sql
SELECT * FROM PROJECTION
```
%% Cell type:code id: tags:
``` sql
SELECT * FROM SALLE
```
%% Cell type:code id: tags:
``` sql
SELECT * FROM CRENEAU_HORAIRE
```
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Exercice 1 </h3>
Petite révision SQL (voir leçon précédente).
Écrire les requêtes SQL permettant d'extraire de cette base de données les informations qui suivent. Aidez-vous du Cheat sheet SQL remis en classe.
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
A) Affiche uniquement les titres et la durée des films.
%% Cell type:code id: tags:
``` sql
SELECT Titre, Duree FROM FILM;
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
B) Affiche les films dont la durée est supérieure à 120 minutes.
%% Cell type:code id: tags:
``` sql
SELECT * FROM FILM WHERE Duree > 120;
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
C) Affiche les films dont le titre contient la lettre "a".
%% Cell type:code id: tags:
``` sql
SELECT * FROM FILM WHERE Titre LIKE '%a%';
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
D) Affiche toutes les projections avec leur numéro et leur tarif.
%% Cell type:code id: tags:
``` sql
SELECT Num_projection, Tarif FROM PROJECTION;
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
E) Affiche toutes les projections qui ont lieu après 18h00.
%% Cell type:code id: tags:
``` sql
SELECT * FROM PROJECTION WHERE Tarif < 10;
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
F) Affiche les projections qui auront lieu le 10 février 2025.
%% Cell type:code id: tags:
``` sql
SELECT * FROM CRENEAU_HORAIRE WHERE Heure_de_debut > '18:00';
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
G) Affiche les projections qui auront lieu le 10 février 2025.
%% Cell type:code id: tags:
``` sql
SELECT * FROM CRENEAU_HORAIRE WHERE Date = '2025-02-10';
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
H) Affiche les salles qui ont une capacité de plus de 150 places.
%% Cell type:code id: tags:
``` sql
SELECT * FROM SALLE WHERE Capacite > 150;
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
I) Affiche les films triés par ordre décroissant de durée.
%% Cell type:code id: tags:
``` sql
SELECT * FROM FILM ORDER BY Duree DESC;
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
J) Affiche le nombre total de films dans la base de données.
%% Cell type:code id: tags:
``` sql
SELECT COUNT(*) AS Nombre_de_films FROM FILM;
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
K) Affiche la durée moyenne des films.
%% Cell type:code id: tags:
``` sql
SELECT AVG(Duree) AS Duree_moyenne FROM FILM;
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
L) Affiche le film le plus long avec son titre et sa durée.
%% Cell type:code id: tags:
``` sql
SELECT Titre, Duree FROM FILM ORDER BY Duree DESC LIMIT 1;
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
M) Affiche le tarif le plus élevé et le plus bas parmi toutes les projections.
%% Cell type:code id: tags:
``` sql
SELECT MAX(Tarif) AS Tarif_max, MIN(Tarif) AS Tarif_min FROM PROJECTION;
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
N) Affiche la capacité totale de toutes les salles. (i.e. Somme de toutes les places).
%% Cell type:code id: tags:
``` sql
SELECT SUM(Capacite) AS Capacite_totale FROM SALLE;
```
%% Cell type:markdown id: tags:
<h3 style="color:teal;background-color:azure;" > <i class="fa fa-pencil" aria-hidden="true"> </i> &nbsp; Expression conditionnelle avec un CASE </h3>
Comment afficher les salles avec une catégorie de capacité ?
- "Petite salle" si la capacité est inférieure à 100,
- "Moyenne salle" si elle est entre 100 et 200,
- "Grande salle" si elle est supérieure à 200.
==> En utilisant une expression conditionnelle CASE. Exécuter la requête suivante:
%% Cell type:code id: tags:
``` sql
SELECT Num_salle, Capacite,
CASE
WHEN Capacite < 100 THEN 'Petite salle'
WHEN Capacite BETWEEN 100 AND 200 THEN 'Moyenne salle'
ELSE 'Grande salle'
END AS Categorie
FROM SALLE;
```
%% Cell type:markdown id: tags:
📝 **Écris la requête SQL selon l'énoncé suivant:**
En t'inspirant de l'exemple ci-dessus, affiche les projections avec une classification du tarif:
- "Tarif réduit" si le prix est inférieur à 10 CHF.
- "Tarif standard" si le prix est entre 10€ et 12 CHF.
- "Tarif premium" si le prix est supérieur à 12 CHF.
%% Cell type:code id: tags:
``` sql
SELECT Num_projection, Tarif,
CASE
WHEN Tarif < 10 THEN 'Tarif réduit'
WHEN Tarif BETWEEN 10 AND 12 THEN 'Tarif standard'
ELSE 'Tarif premium'
END AS Categorie_tarif
FROM PROJECTION;
```
%% Cell type:markdown id: tags:
## ❓ Comment trouver des informations qui se trouvent dans plusieurs tables ?
Lorsqu'on construit une base de données relationnelle, les informations sont souvent réparties dans plusieurs tables pour éviter les redondances et améliorer l'organisation des données.
Mais comment peut-on récupérer des données qui sont liées entre plusieurs tables ? C'est là qu'intervient le `INNER JOIN` !
---
## 📖 Introduction au INNER JOIN
Le `INNER JOIN` permet de combiner des lignes de deux tables lorsque les valeurs d'une colonne correspondent dans les deux tables.
Seules les lignes ayant une correspondance dans **les deux tables** sont retournées.
### 📌 Syntaxe Générale :
```sql
SELECT colonne1, colonne2, ...
FROM Table1
INNER JOIN Table2
ON Table1.colonne_commune = Table2.colonne_commune;
```
---
%% Cell type:markdown id: tags:
## 🔎 Exemple 1 : Lister les projections avec leurs films associés
Nous avons deux tables :
- **`FILM`** (`Num_film`, `Titre`, `Durée`)
- **`PROJECTION`** (`Num_projection`, `Tarif`, `Num_film` → clé étrangère)
📌 **Énoncé :**
Affiche toutes les projections avec les titres et le tarif des films correspondants.
%% Cell type:code id: tags:
``` sql
SELECT PROJECTION.Num_projection, FILM.Titre, PROJECTION.Tarif
FROM PROJECTION
INNER JOIN FILM ON PROJECTION.Num_film = FILM.Num_film;
```
%% Cell type:markdown id: tags:
## 🔎 Exemple 2 : Lister les projections avec leurs créneaux horaires
Nous avons deux tables :
- **`PROJECTION`** (`Num_projection`, ``)
- **`CRENEAU_HORAIRE`** (`Num_creneau`, `Date_projection`, `Heure_de_debut`)
📌 **Énoncé :**
Affiche la liste des projections avec leur date et leur heure de début.
%% Cell type:code id: tags:
``` sql
SELECT PROJECTION.Num_projection, CRENEAU_HORAIRE.Date, CRENEAU_HORAIRE.Heure_de_debut
FROM PROJECTION
INNER JOIN CRENEAU_HORAIRE ON PROJECTION.Num_creneau = CRENEAU_HORAIRE.Num_creneau;
```
%% Cell type:markdown id: tags:
## ✍️ Exercices d’application
%% Cell type:markdown id: tags:
### 📌 Exercice 1 : Lister les projections avec les salles associées
Affiche toutes les projections avec **leurs salles associées** et **leurs capacités**.
💡 **Tables :**
- `PROJECTION` (`Num_projection`, `Tarif`, `Num_salle`)
- `SALLE` (`Num_salle`, `Capacite`)
📝 **Écris la requête SQL :**
%% Cell type:code id: tags:
``` sql
SELECT PROJECTION.Num_projection, CRENEAU_HORAIRE.Date, CRENEAU_HORAIRE.Heure_de_debut
FROM PROJECTION
INNER JOIN CRENEAU_HORAIRE ON PROJECTION.Num_creneau = CRENEAU_HORAIRE.Num_creneau;
```
%% Cell type:markdown id: tags:
### 📌 Exercice 2 : Trouver les films projetés après 18h00
Affiche tous les films qui ont une projection **après 18h00**, avec leur titre et leur heure de début.
💡 **Tables :**
- `FILM` (`Num_film`, `Titre`)
- `PROJECTION` (`Num_projection`, `Num_film`, `Num_creneau`)
- `CRENEAU_HORAIRE` (`Num_creneau`, `Heure_de_debut`)
📝 **Écris la requête SQL :**
%% Cell type:code id: tags:
``` sql
SELECT FILM.Titre, CRENEAU_HORAIRE.Heure_de_debut
FROM FILM
INNER JOIN PROJECTION ON FILM.Num_film = PROJECTION.Num_film
INNER JOIN CRENEAU_HORAIRE ON PROJECTION.Num_creneau = CRENEAU_HORAIRE.Num_creneau
WHERE CRENEAU_HORAIRE.Heure_de_debut > '18:00:00';
```
%% Cell type:markdown id: tags:
### 📌 Exercice 3 : Afficher le nombre de projections par film
Affiche le **titre des films** et **le nombre total de projections** pour chaque film.
💡 **Tables :**
- `FILM` (`Num_film`, `Titre`)
- `PROJECTION` (`Num_projection`, `Num_film`)
📝 **Écris la requête SQL :**
%% Cell type:code id: tags:
``` sql
SELECT FILM.Titre, COUNT(PROJECTION.Num_projection) AS Nombre_de_projections
FROM FILM
INNER JOIN PROJECTION ON FILM.Num_film = PROJECTION.Num_film
GROUP BY FILM.Titre;
```
https://notebook.basthon.fr/?extensions=linenumbers&extensions=sequenced&kernel=sql&ipynb=eJztXFtvG8mV_isVGgklhqRIyvLY9CWgqbbMGYpyKHqSwXBAlZolsdbNbrovijyDAYI8BBggyWIziwUCJEj2aUeLfdjHfV7-k_kDm5-Qc05V9ZW6RJZmtEAEAia7bqe--s6lqk77i5ItHCcotT_9ojQXIZ_ykJfaX3xZpeeT8N1ClNqlOfffTL1fuKVqKfAi38Zn91hfLP_Dc5n7v_-92WY7Iggl_ArkfOHII7k8E2xajlxmS3d5NuelL6t_7wiVSteRbyPxOQsinzmcYYPIEdBlbSoCqBcwETK-WETvhE-VuqHv_NhyQ-FXKmwBHTF-dCTtmaD2hzwAoeDjuSCTCOrXEOoe2_WmyzNHBpzmi3MUhZ7x-8L3_knYWIl-HklnHozdsXvvHuu5oe9NIyocuwOcCHccrDjXnYPAK_t9G0l2vPzGF8yBX6uGYFNOvwIWQJ9KFL0GdabHb9bZtghsXy7UHCIa9xtHjN1-ESb4IkMY9cwHqdpjt8YqlT48puEAZ34ibJCWudEc6njwFVetio9CGYKosEg4mWnkQ3f1pIOU-NANTs1zw2JPqj0LuS-PUq1t6M0VPDplM8_n0hfYCaB3JF0JfXOFIKxsLMBMRL6a2fLsMApTfSmooL2cCjdU9DV9xNLoXmy-4LYMl2d1RLML9bAJ_IZuUH5HNYaHOHVaAuxoKo-OEEIgZwCjcuCvLbmZvIb1tUuosoWIQrb8T-yBQILe2cKJAgkzAOA9iW3WfOEoEh509wZdaziwDtbrpqM0ARkHqUTEln_B-QQicmL0DHiVSpXNOQCHKmvKSAzsiQPcMDfhSj9L7bQQnY_3esNJv2e9nryyBtudwegScYipCClKJNQipOTQT5QU3LYjIR0HBEiASPN_tSAgxT5JcQ1V_8GntreQaMaWZ7bP3c_WZmG4CNobG8cynImF5PWZCI5F3Z5tSPfImwQymHvuVG5wkOlEwkLXWtKtTb2N2obPf7EB83I3Bl4oDj3vTbAh58cbz7cnNowXTNzNCWipmPNJihkTYpaoL9zj9evYqnusVWfWKRhkW1sr4F6aeWgNlD0wDGJrzWqTvRrufWh1R729AXtSqz1jjeqAvej1d9dxObszjlpZqSTwAxvB_uuu0fQD0yoVwzWkdKVCVACCVyrq9xVIzrzI0M8pq5pgq0KPdFfLDjMsEo-tocTd4fKrgdV5PXm5N-z0hpaaS3Z-F8woURqaijZGRcVJJlYsi1UoVh8e2VFWG2CSwk0qxBAkc9zMzBE5ff4y7Xf6fevyWZHu4bxy2qcng830kyvqH8xCrdAJ2NDreFbLRTsZcjChiUMytrWWYm0V3IQSCvFG1y7i6sYIuMIhh3LCmYvudSF8kCZU5t80K7i664j9PVmJAIIa-Cc13_ewEn_987_-CxtCIAWoUayF7tVBj7bw5Zx8K3o_9Wh5FsI0KQiheGbbWPFC3JASzoF4wCHHl-sXLUcYP073TcyjVRNICYA35IcOOaAAOewaH4v9YpGINQYm9PVvGMaPaFL0UJXK2FXEtrOPyXSBgnPgh4S4gK0Bl-E3jCDm0C2bfvvLP5jCYJ14ZeIE7A6mPOeupKhMGQno01bK58hjV3WACJGUpGEWOjZX-7a8ez3hDqnX4HW_n9SmKEypmDZFFOCmB6L5VyrWqYAgXLA2yEGrA0ynodkBGvGDKjsYRPMJmuEDPXnBMqBAkBP3rAISLwiW30xx6HjunII1lKSuJMSufLEA7QqgBroBDHyAaCgc9E42B02NPaNwdOweHBwEbx2IooZWZ2SxUed53yJHw9bGLoM_IyfrDUbWjjVkg70R4QK2r7fbGX7CPrI-qaq6Iwo2P-4Muy87w7XW1ta6LtiGsE-YHsbu-mMaeBVXUvzL0SVTUmAMUkLzU6EZByOKolMBYariKNr6IwhwED1ASsWENnlM3OJkVsHwhkfYiWLPaqhNrHpvBciaP8ccJgDGFFypxCbHPhpW0qZYY9sJFVITjokakxR5gQ0NU8WpDNByC739iAmXzFCF_pfQM3FoF5A0LRkCD2gWoEy1JYEU8c9jXMqPpniXctFXYR9uT9i21YWC_lqzUW0Z-mFfNkiGgUG-o-olNE-Vq2D4nAov9oZWb2eA8rC1uPY6G1ovrKEFod2-CgzShec1RUEyLZVCxkXntdNzzDQFmDMRWKZiRhVrtdo1nFcfIyswS0EkT4B_Ve0yUl4efkg3UJvXDNe1ogTZnZlWUrMPX3lMUAr9KAjFtNSGLyInJYqTlrAGgRhIksTfaoQcAws4IcZp4sDfpSTcxr1u8rcN3dPzl7jvnUzxg8Zq1Nu1FPTnGt6rm11ldOGvYHeV1U3kXjmkJqUZczXHC4N21RZcXNx3Xqv_Xp1WGp3AWVDtS9anmkFS_Z1bR838_DrXVvDrqfdNKTfqNeul9c-4DFK_XA9jtzfYt4YjhGDvwu6rRPZqjtrrwML-a2t_7ML2iJVbjdZWrdGqNRtl-NW83240yji9tVax8EF7UxduFgsfxS3vpwubuW63ioVJtw_Sha1cyw-KhUnLh8VCJdDl-OLSZkHNLnZV6W9VKWsOvh74UjoghCGb9x_GyPXwfBXsn-NwH4sePIpx65yAhVQPWzFeMASExzY-fbQVA_Wh90ZQzVYrxmc0E7Cu_hv2kSuPZyGWbrVigF5FzoK9kLYRaet-DM8Lz_cxRtiJ5guSVrV6pPvc5RCnnWLB5gMqAB1m5R2HT2FH6ZEUYLUuh5M0LItnXumqsXHKotncahgAW42GAaypvwJMzYcNg01L1wVINnUFmH-r1TDzbW42riBtYv-yIqftYtYmVpXNq7KMpiVkSdmdzNxa9S0AtKk-ZprNRr0BT1vqY2b8iKpuqk88902qel99DAzNJj3dUh-DSPM-PX2gPgacR_TwA_WJYWrR04fqYxgBg2lpHxkRkA4w2pYSF38pIZrNeBqb1EJJ0cRKW0bklhGjuRlDsUUNlCDNZIIPqIGSpJnM8ANqoIBrPjAYPaT6LVxoiCfEqbAjOhO0vcgNS203cpxqyYvCBWxKS-1PP7vGicvp8gw6FWrD74u3EWwv8TRcBVN4cI07TBW138BdjEjG4_FwbP-nfQrj9U0N7l3UPiPCKM7sDS4JwmBWtu8BM68WlO1bfdAAVmEvhnu7ZBOvA_ENipDo5PcsCNmz71mGnOO_JfY_mW2yIHzniKdjkMfx_HYouPP4kNtvjn0YZVpTT_nn4Bsfj0vsGXsiYQfKgwBaHHHYd9YWsN-UDpSB2eS1mZxOhQuFOONxCepvyGfsR-5hsHjMYNfr2xJ2p014PNt8hlr1SuDxPu5dT2SAMSnqwtqJJ1Ej6XIVd_iwdcYTF7FO--flV7Yv9alXorLYUJ-W0QFqWZyGvjpDAHXCM7Ti8Rz2gCeS_lxdBpAWou7DYHXWkVPxee0EFXsase5M8JAFMwFKjmP5Yi7pKIPwuNbB6V___PWfWKVC8wkKFiEQDkzfKS_PXA8PD4xRauO5zNjtrLOOthfqCGqOh4R0EogBDRkj6FJdOZJrpNvKW7Ei6RAqMSiPb4m27wXb2H2eAOcYVJASabgwkgqiBYQVkm5Ml38Bv9Zgc-mC8b4dDFOWmP3sJWwwNJzPcOQ7CmX3fCiFvvlGRyaFAtdR9w_jEh-XviMM1ea83_vIYuUf8h-W7yiQ2wmQeLenTVP6colSDDC0TV_G02-VFXAbcK4MjfPe-o4ial2KqMm2oMtADm7mmwC2ILNG4_1Ou86LagwhCcMnEFTfUeBeZHU6jxiP_Bg0UPJmgx2B7wYz6TPcod8kdvnTDwVg7ijvGSs3H-JZwB2Fc-eOw0knpk8z5z13FMmXWSR1bleSM5XKS6IMHSeizK_mVgO-c_t9T7FXbBI0hPFZ7DMc7I6i11vlqkNf0lU095nnT31KCwM_IQO6m5vGCWs3CBz55r3htjVkzz_RIc62td-9o7B9mIaNud78EK8hvZA7uXTDqyRXXge27t7rwWitAmLsswENj7ZPDXzXI-2PUuDFofXceydc9-o7kqvB1Pl4Z02f4AJQ9G1iRrrrMPUzHKOrEkfbL2h5rEK_wEvlkgb8JjVz9e5tlZJCIL3bG7HmHQVyNwMkxcUxksszR5xAG4qa1SPQVzR9c3lOhHgj4O52fr5GMR8Rk75N5vy0ynZ7g2KBdP-fhNeDjGonjpdMI1nBFKbKVdfZmqyLOtv35vN8DeWg128E8f3Xu2vJDQRga35MtHCJA78tcL_zg7WFLwI6PrMxry7OOIsT07udfSs5dOviCoCDT94MSOIp3QKDKcyQ8XypDtDiFf4J3brAJl4f3VE7EDOQWSbgEYp0jzJHKI1GVbXd1aY51ViYpB6VLwR1UVdbcZMdn7vT1S1yJzXQhs4Jnz59xiyXweI6KtkIpyXOxQoxwlzhVSf05j6gfRMEXXFTphNK4I9WKv6FfxBkDpIY8wkhM8Jn5fQKlC9o89wa_cyCB9iyM9hGgHQPmXXIdmH1QZByGvWk3IJOSLFCQQyBXeOt69T7ngeA-yxLN1hIX8e2TlnoNCx9gxMF1dQVzIrjF5V_BUoqj-J08kj5mbYiqdrdg2eeRjLUSoGZzvI0pw9KHVj35Yt6uiWmkE25Py02NVrx7a_-C_Wi2Sq0XeCJdDQvNk3UQ51jUsubInLx6vQyKicnIJqEGdBW8FiVJyQmDsM00q0NcKs4nIHnfBJPaCE1lW_fAd-7x77909fM2OIQ_MKJvsMuXkkIXY7Mxd1GkoCus7XIKvc9P3gblZVpC2AddSrmVdKSM2PSWzyBHhAWBrPSpUkYK4xNN5t4gZPco8JIUNdWtxB8jolkHt7QO2XPP-Zu_OpYKhuNTPYuvvdia0gw4bIGtfACiCicz18jaAovHBWxYd0y6oED7Ad4JF7InqgzacEOeoMBhLkf7vUGB-wHOg1PmQx6UQzMzr9l3lZjlMNo2hDsuV5SCXiwYZOuMAnbx656GS2dC-vQmimDE-cu0Bt1GCK49C9mdiwA0Xj51UttcScA3T6-waAK9Dj8nXF5SQe4JOa9h1wflYqC0hcQlvnJisT5wfvv3JCfCrYDJhbWAgOpdpJMqi2ClrlZNd9aVVav17VSjXCkJqZiGLDUo9bY3dNfm3XdcIIsQOmf6jr5gvfNm1RJ_79jJhe3ydqsLwPD4ZVn7-bcxLzlQ9n_6uXFE_UGYrKw-n02lXaL76olCblVdkB7LvyyTfu4g3VdO5X-G7dJRKGWaKWyucHf_vr3hbzgdRRNJ3Yvv9JOkbzh1S4aMteIZjMV79kznApvZqeUTL2edyyIYV1vU1PVRisNdoZfaic7yHdOm-ynql_z-xYNfYZorSsRrfhu5xW4djl7YqLlToOT-jrpibgJrjHXPnv6fnA5y_DaDydL3Fl9oWVeUKUf-TdUb5lZORjqKqcy_zQ764sZlz9mL5LPJMw-LYyTKr3NsOOPv_2___nnOB0jUG_3LOJ3JK9lTLWXSOV4XMbyZMtp3pkMrmac0HehihSamzeptAaZrWhA7_QhT3__71A60joDtRkqQ1prLre4NOjBum5KOx7TShVBPbPxitXjgo0LiPEPit80xfNkRJM70gF2cvthXrkNMre_GQ4Gqerpm6ZUEn2lkm6NL28nli0-sF1p2i7iJEUNK2OG9SuyNt0ybddN-7wDKJr_c2z97ZM57e6vxFOT5B0zNHXtvjfIunng5Ipg4Db4PXb1_eCFU4hvsG_zEruoEpugEp3k_M9cbeX-1w68GVTwpA7WKxXF6zgaTOxu4YYs-x9cpF_XxJbflQp8T9Slq7tzLXPuSi-F1A2yeme49_oVXuIkgl2RY59VM1i8Eb4rnGAhbPw1lcHC4e8mLp_T5H_ah04d2HpE_BgfwJ4QHuhS_KHRCz3POeQ-PBzx4wCfuofq3KHUvp_8wIsQD2q1vvwbYeeKTQ
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment