diff --git a/AlgoApprofondie/INFAL24-AlgorithmiqueApprofondie.pdf b/AlgoApprofondie/INFAL24-AlgorithmiqueApprofondie.pdf new file mode 100644 index 0000000..3308e92 Binary files /dev/null and b/AlgoApprofondie/INFAL24-AlgorithmiqueApprofondie.pdf differ diff --git a/AlgoApprofondie/cours/Makefile b/AlgoApprofondie/cours/Makefile new file mode 100644 index 0000000..8b94f17 --- /dev/null +++ b/AlgoApprofondie/cours/Makefile @@ -0,0 +1,216 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Algorithmique.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Algorithmique.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Algorithmique" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Algorithmique" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/AlgoApprofondie/cours/_static/cesi.jpg b/AlgoApprofondie/cours/_static/cesi.jpg new file mode 100644 index 0000000..dafbe55 Binary files /dev/null and b/AlgoApprofondie/cours/_static/cesi.jpg differ diff --git a/AlgoApprofondie/cours/algo.txt b/AlgoApprofondie/cours/algo.txt new file mode 100644 index 0000000..c2f8ed7 --- /dev/null +++ b/AlgoApprofondie/cours/algo.txt @@ -0,0 +1,291 @@ +Algorithmique +============= + +Al-Kharezmi, auteur du traité "Kitab al jabr w'al-muqabala", est l'inventeur +des manipulations algébriques (algèbre = **al jabr**). +C'est Léonard de Pise, dit Fibonacci, qui emprunta le nom du célèbre +mathématicien arabe du 9ème siècle, mais l'algèbre existe +depuis bien plus longtemps (Depuis Babylone, puis ensuite l'Egypte ancienne). + +.. glossary:: + + + algorithme + + terme désignant une suite d'opérations constituant un schéma de calcul + ou de résolution d'un problème. C'est un processus systématique de + résolution d'un problème permettant de décrire précisément des étapes. + C'est une suite finie d'instructions permettant de donner la réponse à un + problème. + +L'algorithmique est l'étude et la production de règles et de techniques +qui sont impliquées dans la définition d'algorithmes. + +Implémentation d'un algorithme +------------------------------ + +.. glossary:: + + implémentation + + Adaptation de la méthodologie de calculabilité au calcul effectif + sur une machine abstraite ou via un langage formel. + +Il n’y a pas de parcours à sens unique de l’algorithme vers l’implantation. +La quête d’une implantation efficace nous amène souvent à effectuer +un retour vers les algorithmes eux-mêmes, et à en modifier des points +essentiels. L’aspect théorique de réflexion sur les algorithmes, +et l’aspect pratique de l'implémentation sont donc en symbiose. + +Un existant émerge de la décomposition structurale d'un +domaine de base. Le fait essentiel, c'est la genèse des genres de l'existant les +uns à partir des autres. + +L'essence d'une forme (un algorithme) se réalise au sein d'une matière qu'elle créée +(un langage). L'origine d'une matière fait naître les formes (concepts) +que sa structure dessine. + +- Notion structurale de non-contradiction +- Notion extensive de "réalisation dans un champ donné" + +Deux aspects réciproques : l'essence d'une forme se réalise au sein d'une +matière qu'elle crée, l'essence d'une matière faisant naître les formes que sa +structure dessine. + +Abandonner l'idée trop simpliste de domaines concrets et d'opérations abstraites +qui posséderaient en eux-mêmes comme une nature de matière et une nature de +forme ; cette conception tendrait, en effet, à stabiliser les existants +mathématiques dans certains rôles immuables et ignorerait le fait que les +existants abstraits qui naissent de la structure d'un domaine plus concret +peuvent à leur tour servir de domaine de base pour la genèse d'autres existants. + +L'algorithme comme généralisation de la calculabilité +------------------------------------------------------ + +L'importance croissante de l'informatique comme outil scientifique +impose d'élaborer un nouveau mode de description des méthodes de calcul (appelées algorithmes) +susceptible de satisfaire à la fois le critère de sécurité (maîtrise du résultat) et la possibilité +d'implémenter les calculs sur un ordinateur. + +Exemple d'algorithme +--------------------- + +.. raw:: latex + + \begin{algorithm} + \caption{L'alorithme de Bellman-Kalaba} + \begin{algorithmic}[1] + \Procedure {BellmanKalaba}{$G$, $u$, $l$, $p$} + \ForAll {$v \in V(G)$} + \State $l(v) \leftarrow \infty$ + \EndFor + \State $l(u) \leftarrow 0$ + \Repeat + \For {$i \leftarrow 1, n$} + \State $min \leftarrow l(v_i)$ + \For {$j \leftarrow 1, n$} + \If {$min > e(v_i, v_j) + l(v_j)$} + \State $min \leftarrow e(v_i, v_j) + l(v_j)$ + \State $p(i) \leftarrow v_j$ + \EndIf + \EndFor + \State $l(i) \leftarrow min$ + \EndFor + \State $changed \leftarrow l \not= l’$ + \State $l \leftarrow l$ + \Until{$\neg changed$} + \EndProcedure + \Statex + \Procedure {FindPathBK}{$v$, $u$, $p$} + \If {$v = u$} + \State \textbf{Write} $v$ + \Else + \State $w \leftarrow v$ + \While {$w \not= u$} + \State \textbf{Write} $w$ + \State $w \leftarrow p(w)$ + \EndWhile + \EndIf + \EndProcedure + \end{algorithmic} + \end{algorithm} + +Exemple d'algorithme avec son implémentation +--------------------------------------------- + +Soit l'algorithme de factorielle suivant, + +.. raw:: latex + + \begin{algorithm} + \caption{Algorithme de la factorielle d'un nombre}\label{factorielle} + \begin{algorithmic}[1] + \Function{factorielle}{$n$}\Comment{La fonction récursive factorielle} + \BState \emph{parametre} : $n$ entier + \If{$n = 1$} + \BState \emph{Sortie} : 1 + \Else + \BState \emph{Sortie} : $n * \Call{factorielle}{n-1}$ \Comment{On appelle la fonction dans l'algorithme lui-même} + \EndIf + \EndFunction + \end{algorithmic} + \end{algorithm} + +et son implémentation en python : + +.. literalinclude:: code/factorielle.py + :language: python + +En voici une autre implémentation (en OCaml) : + +.. literalinclude:: code/factorielle.ml + :language: ocaml + +On remarque que le **pseudocode** est très proche de +la syntaxe du python : + +.. function:: factorielle(n:int) + +:: + + if n=1 + return 1 + else + return n * factorielle(n-1) + end if + +Qualité d'un algorithme +----------------------- + +- correction d'un algorithme +- complétude d'un algorithme + +Sémantique + + Étude du sens, de la signification d'un langage + Définir la sémantique d’un langage formel consiste à lui donner une + signification mathématique. + +Sémantique opérationnelle + + on définit la sémantique par sa mise en œuvre sur + une machine abstraite. + +Sémantique dénotationnelle + + on associe à chaque construction syntaxique un + objet mathématique + +Sémantique axiomatique + + chaque construction est décrite par la manière dont + elle transforme des propriétés ou des prédicats. + +Proposition + + une proposition est un énoncé qui est soit vrai, soit faux + +**exemple** : ``2 + 3 = 5``. Proposition vraie. + +Prédicats + + Une proposition dont la valeur de vérité dépend de la valeur d’une ou plusieurs variables + +**Exemple** : ``n est pair`` : vrai pour n = 4 mais faux pour n = 9 + + +Axiome + + une proposition qui est supposée vraie + +Un ensemble d’axiomes est consistant s’il n’existe pas de proposition +dont on peut démontrer qu’elle est à la fois vraie et fausse. + +Un ensemble d’axiomes est complet si, pour toute proposition, il est +possible de démontrer qu’elle est vraie ou fausse. + +Théorème d’incomplétude de Gödel (1931) : tout ensemble +consistant d’axiomes pour l’arithmétique sur les entiers est +nécessairement incomplet. + +**Les concepts de base en algorithmique sont les axiomes** + +inférence + + règles d’inférence, règles permettant de combiner des axiomes et des + propositions vraies pour établir de nouvelles propositions vraies. + +Démonstration + + vérification d’une proposition par une séquence de déductions logiques + à partir d’un ensemble d’axiomes. + +Lorsque le champ donné (le domaine) ne contient qu'un nombre fini d'individus, +on peut définir un choix de valeur des variables permettant de vérifier la +proposition obtenue par la *conjonction* de tous les axiomes du système proposé. +On dit alors que ce choix *réalise* un système d'axiomes. + + +Il ne s'agit plus de savoir si la définition entraîne l'existence, mais de +chercher si la structure d'un système d'axiomes (*règles*) peut donner naissance +à un champ d'individus qui soutiennent entre eux les relations définies pas les +axiomes. + +Concret et abstrait +-------------------- + +Il est possible qu'un même genre d'existant joue dans un schéma de genèse le +rôle d'abstrait par rapport à un concret de base, et soit au contraire dans une +autre genèse le concret de base d'un nouvel abstrait. + +Une pareille présentation des choses implique un tel renversement par rapport +aux habitudes de pensée classiques, qu'il faut encore insister sur le sens +nouveau que reçoivent ici les expressions de "concret" et "d'abstrait". + +Les systèmes d'axiomes sont souvent conçus comme des structures purement +formelles, abstraites. Ces structures sont si profondément engagées dans la +genèse de leurs réalisations, qu'il valait mieux désigner par ces termes les +structures de base. + +Un système d'axiome *peut* devenir le concret de base. + +Ceci permet d'exprimer non seulement l'engagement du concret dans la genèse de +l'abstrait, mais encore les relations d'imitation qui peuvent exister entre la +structure de cet abstrait et celle du concret de base. + +Dans certains cas, la genèse de l'abstrait à partir d'un concret de base +s'affirme jusqu'à réaliser une imitation de structure entre ces genres +d'existants qui naissent l'un de l'autre. + +**C'est pourquoi on représente souvent un algorithme en pseudo-code**, +c'est-à-dire en fait dans le mode de représentation (issu du langage préféré de la +personne qui l'exprime) dominant chez la personne qui exprime un algorithme. + +Comment rendre un algorithme lisible +------------------------------------ + +- Le bon algorithme utilise des identifiants explicites. +- Le bon algorithme est structuré. +- Le bon algorithme est indenté. + +Complexité d'un algorithme +-------------------------- + +On peut approximer la complexité des algorithmes. +C'est utile pour pouvoir comparer des algorithmes. + +complexité + + estimer la complexité d'un algorithme, c'est estimer le nombre de calculs qu'il utilise. + +Si f est la fonction caractérisant exactement le coût d’un algorithme et n +la taille des données, on s’intéresse à la façon dont augment f(n) lorsque n augmente +on va montrer que f(n) n'augmente pas plus vite qu’une autre fonction +g(n). Du point de vue mathématique, on dit que la fonction f est dominée +asymptotiquement par la fonction g ce qui se note f = O(g) + +- Complexité temporelle : c’est le nombre d’op«erations effectuées par + une machine qui exécute l’algorithme. + +- Complexité spatiale : c’est le nombre de positions mémoire utilisées par + une machine qui exécute l’algorithme. diff --git a/AlgoApprofondie/cours/annexes/agile.txt b/AlgoApprofondie/cours/annexes/agile.txt new file mode 100644 index 0000000..5884c11 --- /dev/null +++ b/AlgoApprofondie/cours/annexes/agile.txt @@ -0,0 +1,83 @@ +La planification agile +======================== + +Le mode itératif +----------------- + +- livrer des versions successives et utilisables qui convergent vers + la version finale + +- ne pas perdre d'énergie à maintenir des specs détaillées non nécessaires + +- de nouvelles orientations fonctionnelles sont possibles, même tard + +- les specs détaillées sont écrites "juste à temps" + + +La planification agile +----------------------- + +- chaque livraison est un projet qui est planifié en tant que tel +- utiliser l'expérience acquise pour affiner les estimations +- préservation de l'écologie du projet au quotidien (code, tests...) + +La confiance, feedback +----------------------- + +- livraisons régulières +- progrès visibles par tous (pas d'effet tunnel) +- pilotage du projet par choix du contenu des livraisons +- investissement du Product Owner +- chercher la collaboration plutôt que la confrontation + +L'agilité +---------- + +- le projet n'est pas joué d'avance +- cultiver la souplesse +- révolution douce +- sortir de la confrontation, jouer le "nous collectif" + mettre tout le monde sur le mme pont et amener tout le monde à bon port + +Les outils agiles +------------------ + +- planification par itérations de 4 semaines +- entrepot de source partagé +- intégration continue +- tests automatisés +- pair programming sur points cruciaux +- sprints +- extranet : + + - hitoires utilisateurs + - test cases + - gestion du backolog et des tickets + - suivi de l'avancement + - documentation + +Le product owner +----------------- + +idéalement, + +- connaissance du métier à informatiser +- fibre projet +- dispo à 100% + +Les tests +--------- + +- automatiser +- viser l'exhaustivité +- tester une cible mouvante +- migrer les tests d'une release à l'autre + +Questions importantes en environnement agile +---------------------------------------------- + +- quelle durée d'itération ? +- comment découper en itérations ? +- que faire lorsque le product owner se retrouve sur le chemin critique ? +- la planification est faite en mode "juste à temps" et "juste assez" +- on ne s'échine plus à blâmer, au contraire on cherche à gagner ensemble diff --git a/AlgoApprofondie/cours/annexes/exercices.txt b/AlgoApprofondie/cours/annexes/exercices.txt new file mode 100644 index 0000000..1597a02 --- /dev/null +++ b/AlgoApprofondie/cours/annexes/exercices.txt @@ -0,0 +1,19 @@ +Exercices complémentaires +-------------------------- + ++ **Manipulation de chaînes de caractères**: + (création, accès à un caractère, concaténation), listes (création, ajout + d’un élément, suppression d’un élément, accès à un élément, extraction d’une partie de liste), tableaux à une ou plusieurs dimensions. + + + traitement des chaines de caractères + + s.replace() + + s1 + s2 + + un exemple de regexp simple + ++ **Fichiers** : + notion de chemin d’accès, lecture et écriture de données numériques ou de type chaîne de caractères depuis ou vers un fichier. + On encourage l’utilisation de fichiers en tant que supports de données ou de résultats avant divers traitements, par exemple graphiques. + ++ **Piles** + Algorithmes de manipulation : fonctions 'push' et 'pop'. On utilise des listes + (ou tableaux à 1 dimension) pour leur implantation. diff --git a/AlgoApprofondie/cours/annexes/index.txt b/AlgoApprofondie/cours/annexes/index.txt new file mode 100644 index 0000000..dc5acf1 --- /dev/null +++ b/AlgoApprofondie/cours/annexes/index.txt @@ -0,0 +1,10 @@ +Annexes +========= + +.. toctree:: + :maxdepth: 2 + + exercices + surete + agile + scrum diff --git a/AlgoApprofondie/cours/annexes/scrum.txt b/AlgoApprofondie/cours/annexes/scrum.txt new file mode 100644 index 0000000..3777780 --- /dev/null +++ b/AlgoApprofondie/cours/annexes/scrum.txt @@ -0,0 +1,176 @@ +scrum +===== + +.. glossary:: + + scrum + + Scrum est une méthode agile pour la gestion de projets + Le terme Scrum est emprunté au rugby et signifie mêlée. + Ce processus s'articule en effet autour d'une équipe soudée, + qui cherche à atteindre un but, comme c'est le cas en rugby + pour avancer avec le ballon pendant une mêlée. + + +Scrum définit trois rôles principaux : + +- le responsable de produit -- Product Manager, +- le faciliteur -- ScrumMaster +- le développeur + +et bien sûr, l'équipe (auto-gérée). + +Des intervenants peuvent s'intégrer également au projet +de façon plus ponctuelle. + +responsable de produit + + Le responsable de produit (Product Manager) est le représentant des + clients et utilisateurs. + C'est lui qui définit l'ordre dans lequel les fonctionnalités + seront développées et qui prend les décisions importantes + concernant l'orientation du projet. + +Le terme responsable n'est d'ailleurs pas à prendre au sens hiérarchique +du terme, mais dans le sens de l'orientation. + +équipe, développement + + outes les décisions sont prises ensemble et personne ne donne d'ordre + à l'équipe sur sa façon de procéder + +facilitateur + + est chargé de protéger l'équipe de tous les éléments perturbateurs + +planification +-------------- + +Scrum utilise une planification à trois niveaux : + +- release/projet +- sprint +- quotidien -- ScrumMeeting + +quotidien + + Au quotidien, une réunion, le ScrumMeeting (pas plus de 15 min) + permet à l'équipe et au ScrumMaster de faire un point d'avancement sur + les tâches et sur les difficultés rencontrées. + répondre à trois questions : + * Qu'est-ce que j'ai fait hier ? + * Qu'est-ce que je compte faire aujourd'hui ? + * Quelles difficultés est-ce que je rencontre ? + +sprint + + Scrum est un processus itératif : les itérations sont appelées des sprints + et durent en théorie 30 jours calendaires. + En pratique, les itérations durent généralement entre 2 et 4 semaines. + Chaque sprint possède un but et on lui associe une liste d'items + de fonctionnalités à réaliser. + Ces items sont décomposés par l'équipe en tâches élémentaires + de quelques heures, les items de fonctionnalités de sprint. + + Pendant un sprint, les items de fonctionnalités de sprint à réaliser + ne peuvent pas être changés. + Les changements éventuels seront éventuellement réalisés + dans les sprints suivants. + +releases + + pour améliorer la lisibilité du projet, + on regroupe généralement des itérations en releases. + En effet, comme chaque sprint doit aboutir à la livraison + d'un produit partiel, une release permet de marquer la livraison + d'une version aboutie, susceptible d'être mise en exploitation + +gestion des besoins +------------------- + +tâches (backlog de sprint) +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Lorsqu'on démarre un sprint, on choisit quels items des fonctionnalités +seront réalisés dans ce sprint. + +L'équipe décompose ensuite chaque item en liste de tâches élémentaires +(techniques ou non), chaque tâche étant estimée en heures +et ne devant pas durer plus de 2 jours. +On constitue ainsi le backlog de sprint. + +Les items de backlog de produit sont les fonctionnalités qui deviendront +les items du baclog d'un sprint. +Ces fonctionnalités sont estimées en points relatifs, sans unité. + +planning poker + + façon ludique et efficace de produire des estimations + sur la complexité des fonctionnalités à développer + + pour évaluer les scénarios utilisateurs (user stories) + du carnet de produit (product backlog). + +à la fin d'un sprint : + +- revue de sprint +- rétrospective de sprint + +comprendre ce qui n'a pas bien marché dans le sprint, +les erreurs commises et de prendre des décisions pour s'améliorer + +mise en oeuvre +-------------- + +Scrum peut être mis en pratique avec trois fois rien : deux listes suffisent. +La liste des items du backlog de produit et la liste des items du backlog +de sprint. La saisie et la mise à jour des données est simplement +un peu moins agréable. + +glossaire +--------- + +Directeur de produit (Product Owner) (responsable produit) + + personne responsable de produire et maintenir à jour le backlog de produit. + C'est lui qui en détermine les priorités et qui prend les décisions + concernant l'orientation du projet. + +ScrumMaster (facilitateur) + + membre de l'équipe dont l'objectif principal est de la protéger + des perturbation extérieures. + Il est complètement transparent pour la communication entre l'équipe + et les clients et n'a aucun pouvoir hiérarchique sur l'équipe. + C'est en revanche un facilitateur pour les problèmes non techniques + de l'équipe. + +Backlog de produit (Product Backlog) (fonctionnalités) + + liste des fonctionnalités qui devront être réalisées par le logiciel. + +Backlog de sprint (Sprint Backlog) (tâches) + + liste des tâches à accomplir pendant un sprint. + Elles correspondent à la réalisation des items de backlog + du produit affectés au sprint. + +Mêlée quotidienne (Daily Scrum) (quotidien) + + réunion quotidienne de 15 minutes qui a pour but de faire le point + sur ce qui a été fait depuis la dernière mêlée, + ce qui est prévu de faire jusqu'à la prochaine + et quelles sont les embûches rencontrées durant le travail. + +Sprint (sprint) + + nom d'une itération dans Scrum. + Cette itération dure 30 jours calendaires en théorie, + mais en pratique on utilise plutôt entre 2 et 4 semaines. + Pendant une itération, l'équipe doit développer une liste d'items + du backlog de produit qui a été définie au début de ce sprint. + +Graphique d'avancement (Burndown Chart) (avancement) + + graphique qui montre la tendance du reste à faire total de jour en jour + (pour les sprints) ou de sprint en sprint (pour les releases). diff --git a/AlgoApprofondie/cours/annexes/surete.txt b/AlgoApprofondie/cours/annexes/surete.txt new file mode 100644 index 0000000..44da9b7 --- /dev/null +++ b/AlgoApprofondie/cours/annexes/surete.txt @@ -0,0 +1,93 @@ +Outils de sureté d'un programme +-------------------------------------- + +La preuve de programme +~~~~~~~~~~~~~~~~~~~~~~ + +Le niveau maximum de sûreté d'exécution d'un programme est la preuve. Qu'est-ce que la preuve +formelle d'un programme ? Selon la définition de Wikipédia, ce sont "des techniques permettant de +raisonner rigoureusement, à l'aide de logique mathématique, sur des programmes informatiques ou +du matériel électroniques, afin de démontrer leur validité par rapport à une certaine +spécification." Bref c'est un raisonnement logique sur un programmme qui permet d'être sûr que le +programme est valide et ne va pas planter. + +La preuve de programme est très peu utilisée dans l'industrie, car très coûteuse et très +difficile à mettre en place. Elle quand même utilisée, mais dans des secteurs où le risque doit +absolument être évacué et où il n'y a aucun droit à l'erreur. Par exemple, le secteur médical +(informatique en bloc opératoire), militaire (peu d'informations nous parviennent dans ce +domaine), l'aviation civile (le logiciel Astrée pour Airbus), la fusée Ariane (depuis le bug qui +avait fait crasher Ariane 5 ces questions sont prises très au sérieux), et le milieu bancaire +(surtout le domaine des décisions boursières : un programme chargé de lancer des décisions +d'achat ou de vente à la bourse qui comporte un bug peut en quelque centièmes de secondes faire +perdre des millions, voire des milliards d'euros à une banque. Le programme ne doit tout simplement pas +bugger). + +Le model checking +~~~~~~~~~~~~~~~~~~ + +Le model checking, l'analyse statique et l'interprétation abstraite procèdent d'une méthodologie +moins lourde de validation des programmes. Ces méthodes analysent exhaustivement l'évolution du +système lors de ses exécutions possibles et permetent de dire si globalement, dans un contexte +donné, le programme va fonctionner correctement. Encore très lourdes, ces techniques ne sont +utilisées que dans un contexte industriel de haute sécurité. + +Les tests d'acceptation +~~~~~~~~~~~~~~~~~~~~~~~ + +Il y a plusieurs types de tests + +- unitaires +- fonctionnels +- acceptation + +Très utilisés dans l'industrie, les tests unitaires et fonctionnels ne testent que certaines +parties du programme et permettent de dire que le programme va marcher grosso-modo à peu près. +Beaucoup moins coûteux à installer, ce sont des éléments cléfs des méthodes agiles. + +Les Outils de linting (validation) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- vérifications syntaxiques +- vérification sémantiques +- vérification sur les imports inutiles ou mal formés (imports croisés + +Exemple en python : pylint + + +La dette technique +~~~~~~~~~~~~~~~~~~ + +Au bout d'un moment le code devient du code spaghetti et les techniques sont obsolètes. +Les tests permettent de solder la dette technique plus facilement. + +**avoir le courage de payer une dette technique, et affronter une dette technique +sinon il peut y avoir un coût à payer qui sera pohibitoire.** + +On solde la dette technique parce que à un moment ça va devenir beaucoup trop +cher à payer. + +Les méthodologies agiles +~~~~~~~~~~~~~~~~~~~~~~~~ + +La manière dont le code est produit importe énormément. Par exemple, une +méthodologie ou le **refactoring** (réécriture de code) est permis et même conseillé +a plus de chance de produire du code organisé. + +Les méthodologies agiles produisent en général du code mieux organisé. Ce sont les +méthodes de travail les plus en vogue aujourd'hui, elles mettent l'accent sur : + +- Du logiciel fonctionnel plutôt que de la documentation exhaustive +- La réponse au changement plutôt que le suivi d'un plan +- Le logiciel fonctionnel est la principale mesure d'avancement +- Une attention continue à l'excellence technique et à une bonne + conception améliore l'agilité +- La simplicité est essentielle (il est facile de faire, il est + difficile de faire simple) + +Le principe de base de la méthodologie Scrum par exemple est de focaliser l'équipe de façon +itérative sur un ensemble de fonctionnalités à réaliser, dans des itérations de durée fixe de une +à quatre semaines, appelées **sprints**. Chaque sprint possède un but à atteindre, défini par le +responsable de produit, à partir duquel sont choisies les fonctionnalités à implémenter dans ce +sprint. Un sprint aboutit toujours sur la livraison d'un produit partiel fonctionnel. Pendant ce +temps, le facilitateur a la charge de réduire au maximum les perturbations extérieures et de +résoudre les problèmes non techniques de l'équipe. diff --git a/AlgoApprofondie/cours/apercu.txt b/AlgoApprofondie/cours/apercu.txt new file mode 100644 index 0000000..ea09668 --- /dev/null +++ b/AlgoApprofondie/cours/apercu.txt @@ -0,0 +1,79 @@ +Aperçu des algorithmes fondamentaux +=================================== + +Les algorithmes sont partout. Absolument partout aujourd'hui. +Il n'est pas un domaine de nos activités qui ne soit liés à tel ou tel algorithme. + +En mathématiques +----------------- + +- l'algèbre (étude des structures de données) +- l'arithmétique modulaire (théorie des nombres) +- la géométrie (affine, algébrique, invariants topologiques...) +- les diagrammes (diagrammes de Venn...) +- les colorisation d'une carte +- comportements stochastiques + +En informatique +---------------- + +- les algorithmes sur la manipulation des structures de données + Exemple : les algorithmes de tri, de recherche dans un arbre... +- les parcours de graphes (chemins le plus court, voyageur de commerce...) +- la cryptologie (code gray) +- les stratégies de jeux + +Tirés du monde réel +-------------------- + +- les jeux (casse-tête, dominos, échiquiers...) +- énigmes, logique et paradoxes +- problèmes de raisonnements. Il n'existe pas beaucoup de méthodes + ou de moyens simples pour traiter et résoudre les énoncés de logique de raisonnement. +- La "marche de l'ivrogne" : processus de progression discrète (pas à pas) + dont l'étape suivante est lié à l'état présent et pas du tout à la mémoire du passé proche. + Il revêt seulement un caractère de type probabilité (stochastique) dit markovien. +- algorithmes de colonies de fourmis (chemins optimal pour arriver à la nourriture) + +Le voyageur de commerce +~~~~~~~~~~~~~~~~~~~~~~~~ + +Le problème du voyageur de commerce, consiste en la recherche d’un trajet minimal permettant à un +voyageur de visiter n villes. En règle générale on cherche à minimiser le temps de parcours total ou la +distance totale parcourue. + +Il suffit de construire tous les chemins possibles et de calculer leurs longueurs. +Avec ``n`` villes il y a ``(n-1)!/2`` chemins possibles. +Avec 36 villes on trouve : 5166573983193072464833325668761600000000, +si le nombre de villes augmente, ça devient vite rédibitoire. + +Résolution par + +- algorithme de parcours de graphes +- algorithme glouton +- algorithmes génétiques + +Les algorithmes génétiques s’appuient sur un principe de sélection des individus d’une population qui présen- +tent des caractéristiques se rapprochant au mieux de ce que l’on recherche; cette population évoluant par +ailleurs selon des critères d’évolution génétique à choisir. Dans le contexte du problème du voyageur de +commerce, un individu est une tournée, un chemin et une population un ensemble de tournées. Il s’agit +maintenant de dé...nir un critère de sélection ainsi que des règles d’évolution de la population. + +- approches métaheuristiques (exemples: colonies de fourmis) + +Exemple de résolution + +.. raw:: latex + + \begin{algorithm} + \caption{Algorithme du voyageur de commerce}\label{commerce} + \begin{algorithmic}[1] + + \BState \emph{Données} : $L$ \Comment{Liste des villes à parcourir avec les distances entre les villes} + \BState \emph{Données} : $L'$ \Comment{Liste du parcours des villes à effectuer} + \State \emph{début} + \BState ... + \State \emph{fin} + + \end{algorithmic} + \end{algorithm} diff --git a/AlgoApprofondie/cours/cesar.py b/AlgoApprofondie/cours/cesar.py new file mode 100644 index 0000000..c3d25ac --- /dev/null +++ b/AlgoApprofondie/cours/cesar.py @@ -0,0 +1,61 @@ +# coding: utf-8 +minuscules = 'abcdefghijklmnopqrstuvwxyz' +majuscules = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + +def rotation(chaine, x): + """ + Effectue une rotation de x caractères vers la droite: + >>> rotation('abcde', 2) + 'cdeab' + """ + return chaine[x:] + chaine[:x] + +def index(c, chaine): + """ + Trouve l'index de c dans la chaine: + >>> index('n', 'bonjour') + 2 + """ + for i in range(len(chaine)): + if (c == chaine[i]): + return i + return -1 + +def chiffre_minuscules(chaine, x): + """ + Chiffre une chaîne composée de minuscules + >>> chiffre_minuscules('bonjour', 3) + 'erqmrxu' + """ + r = rotation(minuscules, x) + resultat = '' + for lettre in chaine: + resultat = resultat + r[index(lettre, minuscules)] + return resultat + +def chiffre(chaine, x): + """ + Chiffre une chaîne quelconque + >>> chiffre('Bonjour les amis!', 3) + 'Erqmrxu ohv dplv!' + """ + r_min = rotation(minuscules, x) + r_maj = rotation(majuscules, x) + resultat = '' + for lettre in chaine: + if lettre in minuscules: + resultat = resultat + r_min[index(lettre, minuscules)] + elif lettre in majuscules: + resultat = resultat + r_maj[index(lettre, majuscules)] + else: + resultat = resultat + lettre + return resultat + +############################################################################# +# Programme principal +############################################################################# +print(chiffre_minuscules('bonjour', 3)) +print(chiffre('Bonjour les amis!', 3)) +print(chiffre('Erqmrxu ohv dplv!', 23)) +print(chiffre('Eudyr, yrxv dyhc ilql fhw hahuflfh!', 23)) + diff --git a/AlgoApprofondie/cours/code/factorielle.ml b/AlgoApprofondie/cours/code/factorielle.ml new file mode 100644 index 0000000..5065a2c --- /dev/null +++ b/AlgoApprofondie/cours/code/factorielle.ml @@ -0,0 +1,17 @@ +let rec fact = function + |1 -> 1 + | n -> n * fact (n-1) ;; + +let print_fact n = + Printf.printf "factorielle %i = %i\n" n (fact n) + +let main () = + begin + print_fact 5 ; + print_newline () ; + exit 0 ; + end + +let _ = main () + + diff --git a/AlgoApprofondie/cours/code/factorielle.py b/AlgoApprofondie/cours/code/factorielle.py new file mode 100644 index 0000000..734719f --- /dev/null +++ b/AlgoApprofondie/cours/code/factorielle.py @@ -0,0 +1,12 @@ +def factorielle(n): + if (n > 1): + r = n*factorielle(n-1) + else: + r = 1 + return r + +def print_fact(n): + print "factorielle {} = {}\n".format(5, factorielle(5)) + +if __name__ == '__main__': + print_fact(5) diff --git a/AlgoApprofondie/cours/conf.py b/AlgoApprofondie/cours/conf.py new file mode 100644 index 0000000..3005e97 --- /dev/null +++ b/AlgoApprofondie/cours/conf.py @@ -0,0 +1,370 @@ +# -*- coding: utf-8 -*- +# +# Algorithmique documentation build configuration file, created by +# sphinx-quickstart on Thu Mar 16 16:07:00 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.pngmath', 'sphinx.ext.ifconfig', +] + +# ajout des cours avec solution des exercices ou non +def setup(app): + app.add_config_value('correction', False, 'env') + app.add_config_value('exercice', False, 'env') + +exercice = False +correction = False + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = '.txt' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Algorithmique Approfondie' +copyright = u'2017, Gwen' +author = u'Gwen' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'1' +# The full version, including alpha/beta/rc tags. +release = u'1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'fr' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +today_fmt = '%d/%m/%Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +default_role = 'literal' + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +html_show_sphinx = False + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +html_show_copyright = False + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' +#html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Algorithmiquedoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +'papersize': 'a4paper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +'preamble': """\usepackage{amsmath} +\usepackage{algorithm} +\usepackage[noend]{algpseudocode} +\makeatletter +\def\BState{\State\hskip-\ALG@thistlm} +\makeatother + +""" + +# Latex figure (float) alignment +#'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'AlgorithmiqueApprofondie.tex', u'Cours d\'algorithmique approfondie', + u'INFAL24', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +latex_logo = '_static/cesi.jpg' + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = False + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'algorithmique', u'Algorithmique Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'Algorithmique', u'Algorithmique Documentation', + author, 'Algorithmique', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + + +# -- Options for Epub output ---------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project +epub_author = author +epub_publisher = author +epub_copyright = copyright + +# The basename for the epub file. It defaults to the project name. +#epub_basename = project + +# The HTML theme for the epub output. Since the default themes are not +# optimized for small screen space, using the same theme for HTML and epub +# output is usually not wise. This defaults to 'epub', a theme designed to save +# visual space. +#epub_theme = 'epub' + +# The language of the text. It defaults to the language option +# or 'en' if the language is not set. +#epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +#epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +#epub_identifier = '' + +# A unique identification for the text. +#epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +#epub_cover = () + +# A sequence of (type, uri, title) tuples for the guide element of content.opf. +#epub_guide = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_pre_files = [] + +# HTML files that should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_post_files = [] + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# The depth of the table of contents in toc.ncx. +#epub_tocdepth = 3 + +# Allow duplicate toc entries. +#epub_tocdup = True + +# Choose between 'default' and 'includehidden'. +#epub_tocscope = 'default' + +# Fix unsupported image types using the Pillow. +#epub_fix_images = False + +# Scale large images. +#epub_max_image_width = 0 + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#epub_show_urls = 'inline' + +# If false, no index is generated. +#epub_use_index = True diff --git a/AlgoApprofondie/cours/control.txt b/AlgoApprofondie/cours/control.txt new file mode 100644 index 0000000..7770490 --- /dev/null +++ b/AlgoApprofondie/cours/control.txt @@ -0,0 +1,294 @@ +Les structures de contrôle +========================== + +L'instruction de saut +---------------------- + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de saut conditionnel}\label{saut} + \begin{algorithmic}[1] + \Procedure{Euclide}{} \Comment{c'est l'algorithme d'Euclide} + \State $\textit{stringlen} \gets \text{length of }\textit{string}$ + \State $i \gets \textit{patlen}$ + \BState \emph{top}: + \If {$i > \textit{stringlen}$} \Return false + \EndIf + \State $j \gets \textit{patlen}$ + \BState \emph{loop}: \Comment{C'est le label (l'étiquette)} \label{etiquette} + \If {$\textit{string}(i) = \textit{path}(j)$} + \State $j \gets j-1$. + \State $i \gets i-1$. + \State \textbf{goto} \emph{loop}. \label{goto} + \State \textbf{close}; + \EndIf + \State $i \gets + i+\max(\textit{delta}_1(\textit{string}(i)),\textit{delta}_2(j))$. + \State \textbf{goto} \emph{top}. \Comment{C'est l'instruction de saut} + \EndProcedure + \end{algorithmic} + \end{algorithm} + + +.. raw:: latex + + Ligne \ref{etiquette}, le bloc `loop` est aussi un label (une étiquette), + c'est-à-dire une marque posée qu'il est possible de retrouver dans le programme. \\ + +.. raw:: latex + + Ligne \ref{goto}, l'instruction \texttt{goto} (aller à ) est le saut vers le label. \\ + +Description générique d'une instruction de saut:: + + Instruction 1 + Saut Label1 + Instruction 2 + ... + Label1: + Instruction n + +.. important:: les sauts conditionnels sont à éviter, même s'ils sont implémentés + dans le langage cible, car c'est le meilleur moyen d'aboutir à + du **code spaghetti**. + +L'instruction de branchement conditionnel +------------------------------------------ + +On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple d'instruction de test} + \begin{algorithmic}[1] + \BState \emph{entrée}: $quality\gets 0$ \Comment{C'est cette valeur qui sera testée} + \BState \emph{locale}: $a\gets ""$ + \BState \emph{sortie}: $a$ \Comment{La sortie est la valeur de $a$} + \BState \emph{corps}: + \If{$quality\ge 9$} + \State $a\gets perfect$ + \ElsIf{$quality\ge 7$} + \State $a\gets good$ + \ElsIf{$quality\ge 5$} + \State $a\gets medium$ + \ElsIf{$quality\ge 3$} + \State $a\gets bad$ + \Else + \State $a\gets unusable$ + \EndIf + \end{algorithmic} + \end{algorithm} + + + +.. ifconfig:: exercice + + **Exercice** : Compacter l'algorithme suivant en une seule condition de test:: + + Si il fait trop chaud Alors + Si il ne pleut pas Alors + Ouvrir la fenêtre + Sinon + Fermer la fenêtre + Finsi + Sinon + Fermer la fenêtre + Finsi + +.. ifconfig:: correction + + **Correction** : + + :: + + Si il fait trop chaud ET il ne pleut pas Alors + Ouvrir la fenêtre + Sinon + Fermer la fenêtre + Finsi + + +L'instruction switch +-------------------- + +L'instruction switch permet de faire plusieurs tests de valeurs sur le contenu d'une même variable. +Ce branchement conditionnel simplifie beaucoup le test de plusieurs valeurs d'une variable. + +Les instructions d'itérations (boucles) +--------------------------------------- + +.. important:: Toutes les boucles concernent le paradigme de programmation impératif + et ne sont pas valides dans le paradigme de programmation fonctionnel + (puisque l'ordre d'évaluation importe) + +- arrêt conditionnel (break) +- passage d'un pas (continue) + +Répéter ... jusqu'à +~~~~~~~~~~~~~~~~~~~ + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de répéter ... jusqu'à} + \begin{algorithmic}[1] + \BState \emph{locales}: $i \gets 1$ \Comment{déclaration et initialisation de i} + \Repeat \Comment{c'est le label de début du répéter} + \State $i \gets \textit{i+1}$ + \Until{i == 100} \Comment{condition de fin de la boucle} + \end{algorithmic} + \end{algorithm} + +La boucle **pour** (for) +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de boucle for} + \begin{algorithmic}[1] + \BState \emph{locales}: $sum\gets 0$ + \For{$i\gets 1, n$} + \State $sum\gets sum+i$ + \EndFor + \end{algorithmic} + \end{algorithm} + + + + + +.. ifconfig:: exercice + + **Exercice** : Ecrire un algorithme qui demande successivement 20 nombres à l’utilisateur, + et qui lui dise ensuite quel était le plus grand parmi ces 20 nombres + +.. ifconfig:: correction + + **Correction** : + :: + + Variables N, i, PG en Entier + Debut + PG <- 0 + Pour i <- 1 à 20 + Ecrire "Entrez un nombre : " + Lire N + Si i = 1 ou N > PG Alors + PG <- N + FinSi + Ecrire "Le nombre le plus grand était : ", PG + Fin + + +.. attention:: ne jamais manipuler le compteur dans une boucle + +:: + + Variable Truc en Entier + Début + Pour Truc <- 1 à 15 + Truc <- Truc * 2 + Ecrire "Passage numéro : ", Truc + Truc Suivant + Fin + +La boucle tant que (while) +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de boucle while} + \begin{algorithmic}[1] + \BState \emph{locales}: $sum\gets 0$ + \State $i\gets 1$ + \While{$i\le n$} + \State $sum\gets sum+i$ + \State $i\gets i+1$ + \EndWhile + \end{algorithmic} + \end{algorithm} + +.. ifconfig:: exercice + + **Exercice** : Ecrire un algorithme de validation d'une entrée utilisateur + + :: + + "Voulez vous un café ? (O/N)" + +.. ifconfig:: correction + + **Correction** : deux solutions possibles, une + + :: + + Variable Rep en Caractère + Début + Rep <- "" + Ecrire "Voulez vous un café ? (O/N)" + TantQue Rep <> "O" et Rep <> "N" + Lire Rep + Si Rep <> "O" et Rep <> "N" Alors + Ecrire "Saisie Erronée, Recommencez" + FinSi + FinTantQue + Fin + + :: + + Variable Rep en Caractère + Début + Ecrire "Voulez vous un café ? (O/N)" + Lire Rep + TantQue Rep <> "O" et Rep <> "N" + Ecrire "Vous devez répondre par O ou N. Recommencez" + Lire Rep + FinTantQue + Ecrire "Saisie acceptée" + Fin + +.. ifconfig:: exercice + + **Exercice** : "C'est plus, C'est moins", c'est-à-dire Ecrire un algorithme qui demande à l’utilisateur + un nombre compris entre a et b jusqu’à ce que la réponse convienne. + +.. ifconfig:: correction + + **Correction** : + + :: + + Variable N en Entier + Debut + N <- 0 + Ecrire "Entrez un nombre entre 10 et 20" + TantQue N < 10 ou N > 20 + Lire N + Si N < 10 Alors + Ecrire "Plus grand !" + SinonSi N > 20 Alors + Ecrire "Plus petit !" + FinSi + FinTantQue + Fin + +Et les autres boucles : répéter... jusqu'à, etc... + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de boucle répéter} + + \begin{algorithmic}[1] + \State $sum\gets 0$ + \State $i\gets 1$ + \Repeat + \State $sum\gets sum+i$ + \State $i\gets i+1$ + \Until{$i>n$} + \end{algorithmic} + \end{algorithm} diff --git a/AlgoApprofondie/cours/donnees.txt b/AlgoApprofondie/cours/donnees.txt new file mode 100644 index 0000000..990629e --- /dev/null +++ b/AlgoApprofondie/cours/donnees.txt @@ -0,0 +1,577 @@ +Les structures de données +=========================== + +.. glossary:: + + ATD + + Abstract Data Type, structure de données abstraites. + La représentation des données est forcément un choix. + Il est impossible de rendre compte globalement d'un élément du réel, + il faut en faire une interprétation abstraite. + +**Exemple**: + +- Un être humain peut être représenté par les données présentes dans sa + carte d'identité. Mais un être humain n'est pas sa carte d'identité. +- Un être humain peut être représenté par les données présentes dans ses préférences + de surf sur internet. Mais un être humain **n'est pas** l'ensemble de ses logs de surf sur le net. + +Les séquences +------------- + +Les types séquences (listes) + +.. code-block:: ocaml + + # 4::1::5::8::1::[];; + - : int list = [4 ;1 ;5 ;8 ;1] + + +Un ensemble de valeurs portant le même nom de variable et repérées par un nombre, s’appelle un tableau, ou encore une liste, ou une variable indicée. +Le nombre qui, au sein d’un tableau, sert à repérer chaque valeur s’appelle l’indice. +Chaque fois que l’on doit désigner un élément du tableau, on fait figurer le nom du tableau, suivi de l’indice de l’élément. + +**manipulation** : + +- `insert()` +- `append()` +- `remove()` +- `find()` +- `print()` +- ... + +.. code-block:: python + + zoo = ['bear', 'lion', 'panda', 'zebra'] + print(zoo) + + # But these list elements are not + biggerZoo = ['bear', 'lion', 'panda', 'zebra', ['chimpanzees', 'gorillas', 'orangutans', 'gibbons']] + print(biggerZoo) + +- Lists Versus Tuples : types mutables, immutables +- Lists Versus Sets : non ordonné, collection simple + +- Recherche dans une liste, recherche du maximum dans une liste +- Recherche d’un mot dans une chaîne de caractères. + +Algorithme de la longueur d'une liste +-------------------------------------- + +.. code-block:: ocaml + + # let rec longueur l = + match l with + [] -> 0 + | ::s -> 1 + (longueur s);; + +Cette fonction est prédéfinie en Ocaml : `List.length` + +.. ifconfig:: exercice + + **Exercice** : écrire un algorithme qui déclare et + remplisse un tableau de 7 valeurs numériques en les mettant toutes à zéro. + +.. ifconfig:: correction + + **Correction** : + :: + + Tableau Truc(6) en Numérique + Variable i en Numérique + Debut + Pour i <- 0 à 6 + Truc(i) <- 0 + i Suivant + Fin + + exemple d'implémentation en python + + .. code-block: python + + >>> liste = [] + >>> for i in range(6): + ... liste.append(i) + ... + >>> liste + [0, 1, 2, 3, 4, 5] + >>> + + +.. ifconfig:: exercice + + **Exercice** : Calcul du premier élément maximal dans une liste, + proposer une implémentation en python qui renvoie le maximum et + la position du max dans la liste. + +.. ifconfig:: correction + + **Correction** : + + .. code-block: python + + def max_list(L) : + k = len(L) + max, x = L[0], 0 + i = 1 + while i < k : + if max < L[i]: + max = L[i] + x = i + i = i + 1 + return max, x + + couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + + Exemple de généricité : ce code fonctionne avec une chaîne de caractères. + + .. code-block: python + + couple = max_list(’totovaaumarche’) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + +.. glossary:: + + Matrice + + Tableaux de dimension multiple, c'est un tableau de tableau + +.. ifconfig:: exercice + + **Exercice** : Écrivez un algorithme remplissant un tableau de 6 sur 13, avec des zéros. + +.. ifconfig:: correction + + **Correction** : + + implémentation en python + + .. code-block:: python + + >>> matrice = [] + >>> for i in range(12): + ... matrice.append([0 for i in range(5)]) + ... + >>> from pprint import pprint + >>> pprint(matrice) + [[0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0]] + >>> + +Algorithmes de tri +------------------ + +On désigne par "tri" l'opération consistant à ordonner un ensemble d'éléments en fonction de clés sur lesquelles est définie une relation d'ordre. + +Les algorithmes de tri ont une grande importance pratique. +Ils sont fondamentaux dans certains domaines (exemples : map-reduce en database non relationnelle). + +L'étude du tri est également intéressante en elle-même, c'est un des domaines de l'algorithmique très étudié et connu. + +Tri par insertion +~~~~~~~~~~~~~~~~~~ + +Cet algorithme de tri suit de manière naturelle la structure récursive des +listes. Soit l une liste à trier : + +- si l est vide alors elle est déjà triée +- sinon, l est de la forme x::s et on trie récursivement la suite s et on obtient une liste triée s’ + on insert x au bon endroit dans s’ et on obtient une liste triée + +Description de l'algorithme + +- la fonction inserer permet d’insérer un élément x dans une liste l +- si la liste l est triée alors x est inséré au bon endroit + +.. code-block:: ocaml + + # let rec inserer x l = + match l with + [] -> [x] + | y::s -> if x<=y then x::l else y::(inserer x s);; + val inserer : ’a -> ’a list -> ’a list + # inserer 5 [3 ;7 ;10];; + - : int list = [3 ; 5 ; 7 ; 10] + +Tri rapide +~~~~~~~~~~~~ + +soit une liste l à trier : + +- si l est vide alors elle est triée +- sinon, choisir un élément p de la liste (le premier par exemple) + nommé le **pivot** +- partager l en deux listes g et d contenant les autres éléments de l + qui sont plus petits (resp. plus grands) que la valeur du pivot p +- trier récursivement g et d, on obtient deux listes g’ et d’ triées + +.. code-block:: ocaml + :caption: fonction de partage d'une liste + + #let rec partage p l = + match l with + [] -> ([] , []) + |x::s -> let g,d = partage p s in + if x<=p then (x::g , d) else (g , x::d) ;; + val partage : ’a -> ’a list -> ’a list * ’a list = + # partage 5 [1 ;9 ;7 ;3 ;2 ;4];; + - : int list * int list = ([1 ; 3 ; 2 ; 4], [9 ; 7]) + +.. code-block:: ocaml + :caption: algorithme de tri rapide + + # let rec tri rapide l = + match l with + [] -> [] + | p::s -> let g , d = partage p s in + (tri rapide g)@[p]@(tri rapide d) ;; + val tri rapide : ’a list -> ’a list = + # tri rapide [5 ; 1 ; 9 ; 7 ; 3 ; 2 ; 4];; + - : int list = [1 ; 2 ; 3 ; 4 ; 5 ; 7 ; 9] + + +Définition d'un itérateur +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: python + + >>> l = range(10) + >>> for i in l: + ... print l[i] + ... + 0 + ... + 8 + 9 + >>> l.__iter__() + + + +Les listes chaînées +~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: ocaml + + typedef struct list{ + int elt ; + struct list* suivant ; + } ; + + +**Outils de manipulation** : + +- `next()` +- `pointer()` +- `insert(l, a)` +- `remove(a, n)` + + +Les piles +---------- + +**manipulation** + +- `insert()` : insérer un élément à la fin de la pile +- `dequeue()` : (remove and return) : retirer un élément du haut de la pile +- FIFO : "first in first out" + + +Traduction d'une structure de données dans une autre +----------------------------------------------------- + +.. code-block:: python + + >>> listOfStrings = ['One', 'Two', 'Three'] + >>> strOfStrings = ' '.join(listOfStrings) + >>> print(strOfStrings) + One Two Three + >>> + >>> # List Of Integers to a String + ... listOfNumbers = [1, 2, 3] + >>> strOfNumbers = ''.join(str(n) for n in listOfNumbers) + >>> print(strOfNumbers) + 123 + >>> + +.. code-block:: python + + >>> l = [('host1', '10.1.2.3', '6E:FF:56:A2:AF:18'), ('host3', '10.1.2.5', '6E:FF:56:A2:AF:19')] + >>> result = [] + >>> for hostname, ip, macaddress in l: + ... result.append(dict(hostname=hostname, ip=ip, macaddress=macaddress)) + ... + >>> result + [{'hostname': 'host1', 'ip': '10.1.2.3', 'macaddress': '6E:FF:56:A2:AF:18'}, + {'hostname': 'host3', 'ip': '10.1.2.5', 'macaddress': '6E:FF:56:A2:AF:19'}] + >>> + + +.. ifconfig:: exercice + + **Exercice** : Proposer un algorithme de traduction de cette structure de donnée + + .. code-block:: python + + [ + { + 'address': '192.168.0.0', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True }, + { 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False }, + ], + }, + { + 'address': '192.168.0.0', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.12', 'high': '192.168.0.45', 'only_unknown': True }, + { 'low': '192.168.0.8', 'high': '192.168.0.35', 'only_unknown': False }, + ], + }, + { + 'address': '192.168.0.1', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True }, + { 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False }, + ], + }, + + ] + + En cette structure de données : + + .. code-block:: python + + [ + { + address: '192.168.0.0', + mask: '255.255.255.0', + dynamicRanges: [ + { low: '192.168.0.5', high: '192.168.0.12', only_unknown: true }, + { low: '192.168.0.50', high: '192.168.0.55', only_unknown: false },j + ], [ + { low: '192.168.0.12', high: '192.168.0.45', only_unknown: true }, + { low: '192.168.0.8', high: '192.168.0.35', only_unknown: false }, + ], + }, + { + 'address': '192.168.0.1', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True }, + { 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False }, + ], + }, + ] + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: python + + >>> from pprint import pprint + pprint(l) + [{'address': '192.168.0.0', + 'dynamicRanges': [{'high': '192.168.0.12', + 'low': '192.168.0.5', + 'only_unknown': True}, + {'high': '192.168.0.55', + 'low': '192.168.0.50', + 'only_unknown': False}], + 'mask': '255.255.255.0'}, + {'address': '192.168.0.0', + 'dynamicRanges': [{'high': '192.168.0.45', + 'low': '192.168.0.12', + 'only_unknown': True}, + {'high': '192.168.0.35', + 'low': '192.168.0.8', + 'only_unknown': False}], + 'mask': '255.255.255.0'}] + >>> newdata = [] + >>> for i in l: + ... if i['address'] not in [j['address'] for j in newdata]: + ... newdata.append(i) + ... else: + ... for k in newdata: + ... if k['address'] == i['address']: + ... k['dynamicRanges'].extend(i['dynamicRanges']) + ... + >>> pprint(newdata) + [{'address': '192.168.0.0', + 'dynamicRanges': [{'high': '192.168.0.12', + 'low': '192.168.0.5', + 'only_unknown': True}, + {'high': '192.168.0.55', + 'low': '192.168.0.50', + 'only_unknown': False}, + {'high': '192.168.0.45', + 'low': '192.168.0.12', + 'only_unknown': True}, + {'high': '192.168.0.35', + 'low': '192.168.0.8', + 'only_unknown': False}], + 'mask': '255.255.255.0'}, + {'address': '192.168.10.0', + 'dynamicRanges': [{'high': '192.168.0.12', + 'low': '192.168.0.5', + 'only_unknown': True}, + {'high': '192.168.0.55', + 'low': '192.168.0.50', + 'only_unknown': False}], + 'mask': '255.255.255.0'}] + >>> + +.. ifconfig:: exercice + + **Exercice** : Proposer un algorithme qui permette de récupérer la liste + des adresses IP disponibles + + .. code-block:: python + + { + "local": { + "leases": [ + { + "mac": "02:00:c0:a8:00:66", + "name": "pcxubuntu", + "address": "192.168.0.200" + }, + { + "mac": "02:00:c0:a8:00:67", + "name": "pcxubuntu", + "address": "192.168.0.201" + }, + { + "mac": "02:00:c0:a8:00:68", + "name": "pcxubuntu", + "address": "192.168.0.202" + } + ] + } + } + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: python + + >>> l = { + ... "local": { + ... "leases": [ + ... { + ... "mac": "02:00:c0:a8:00:66", + ... "name": "pcxubuntu", + ... "address": "192.168.0.200" + ... }, + ... { + ... "mac": "02:00:c0:a8:00:67", + ... "name": "pcxubuntu", + ... "address": "192.168.0.201" + ... }, + ... { + ... "mac": "02:00:c0:a8:00:68", + ... "name": "pcxubuntu", + ... "address": "192.168.0.202" + ... } + ... ] + ... } + ... } + >>> leases = l["local"]["leases"] + >>> from pprint import pprint + >>> pprint(leases) + [{'address': '192.168.0.200', 'mac': '02:00:c0:a8:00:66', 'name': 'pcxubuntu'}, + {'address': '192.168.0.201', 'mac': '02:00:c0:a8:00:67', 'name': 'pcxubuntu'}, + {'address': '192.168.0.202', 'mac': '02:00:c0:a8:00:68', 'name': 'pcxubuntu'}] + >>> addresses = [lease['address'] for lease in leases] + >>> addresses + ['192.168.0.200', '192.168.0.201', '192.168.0.202'] + >>> + + + +Structures de données complexes +------------------------------- + +Les types produits nommés +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +On les appelle enregistrements, dictionnaires ou tables de hachage. + +:: + + algorithme monAlgorithme + // déclaration d'un enregistrement + enregistrement Personne + chaine nom; + chaine prenom; + entier age; + réel taille; + finenregistrement + ... + Personne[50] t; + début + // Initialisation + t[0].nom <- "Duchmol"; + t[0].prenom <- "Robert"; + t[0].age <- 24; + t[0].taille <- 1.80; + ... + fin + +.. code-block:: ocaml + + # type adresse = { rue : string ; ville : string ; cp : int};; + # type fiche = { + nom : string ; + prenom : string ; + adresse : adresse ; + date naissance : int * int * int ; + tel fixe : string ; + portable : string + };; + # let v1 = { a = 1 ; b = false ; c = 'r'};; + + + + +- les sommes (constructeurs) + +.. code-block:: ocaml + + # type couleur = Pique | Coeur | Carreau | Trefle;; + # let v = (Pique , Coeur);; + val v : couleur * couleur = (Pique , Coeur) + +.. code-block:: ocaml + + type nombre = + Ent of int | Reel of float | Cplx of float × float + Ent, Reel, Cplx sont les constructeurs du type. + +Autres structures de données complexes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- arbres +- graphes +- dates + +- le parcours de graphes +- les calculs de dates diff --git a/AlgoApprofondie/cours/fonctions.txt b/AlgoApprofondie/cours/fonctions.txt new file mode 100644 index 0000000..330cbca --- /dev/null +++ b/AlgoApprofondie/cours/fonctions.txt @@ -0,0 +1,588 @@ +Les fonctions et les procédures +================================ + +Préliminaire : rappel de théorie de cybernétique +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Théorie de l'information (Claude Shannon, 1949), (ou théorie de la communication) + +Canal de transmission:: + + entrée -> récepteur -> émetteur -> sortie + +.. glossary:: + + cybernétique + + étude des fonctions de réflexes conditionnés du cerveau humain + utilisation au mieux en PNL ("programmation neuro-linguistique") + ou en analyse transactionnelle, ou au pire en ingérinerie sociale. + +La matérialité physique est considérée comme le hardware, le génétique (le +réseau neuronal) étant assimilé au network hardware. + +Les objets mentaux (fonctionnements psychologiques et épigénétiques du +cerveaux) est assimilé au logiciel, au software. + +IFTTT ("if this then that") : la causalité mondaine est ramenée à un ordre de +comportement affecté à un assimilé-machine. + +L'humain est ramené à une machine. +C'est articulation entre "déclencheur contextuel" et "action en réponse de" +n'est pas une "black box" mais un "feedback" qui, pour l'humain, +loin d'être ramené à une entrée/sortie, constitue un **feedback** +utile pour la connaissance de soi. + +A la place, la communication est ramenée à une **boucle de rétroaction** +(comme dans un prompt) entre un système comportemental et son environnement. +La représentation sujet/objet (la perspective traditionnelle) est remplacée +par le clivage intérieur/extérieur. Behaviorisme, procédural. + +L'humain est donc ramené à + +- un ordonnanceur +- un comportement intrinsèque (boîte noire) + +- un stimuli pavlovien (déclencheur, trigger) est considéré comme un paramètre +d'entrée +- une instruction comportementale est considérée comme une action de + traitement +- le résultat est observé. + +Cette articulation entre "déclencheur contextuel" et "action en réponse" +est très exactement une forclusion de la profondeur monadique (Leibniz) de +l'humain à la black box informationnelle (et cybernétique). + +Pour quoi faire ? Pour pirater. Pour manipuler. +Le piratage consiste à + +- isoler les constantes (les procédures répétitives, les algorithmes) +- les observer (collecter les données) + +afin de + +- les réécrire (influence toxique, pishing - hammeçonnage) +- les détruire (attaque en règle) + + +Description d'une procédure +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +En programmation impérative, un programme est une suite d’instructions qui font +évoluer l’état mémoire, le résultat est dans l’état final de la mémoire. + +- une procédure peut prendre des paramètres +- elle modifie l'état courant du système + +- Déclaration des paramètes +- Déclaration du corps +- Appel de la procédure + +.. raw:: latex + + \begin{algorithm} + \caption{Procédure de permutation de deux entiers}\label{permutation} + \begin{algorithmic}[1] + \Procedure{permuter}{$a,b$}{} + \BState \emph{parametres}: + \State $a: \textit{int}$ + \State $b: \textit{int}$ + \BState \emph{locales}: + \State $z: \textit{int}$ \Comment{Une variable intermédiaire est nécessaire} + \BState \emph{corps}: + \State $z \gets a$ + \State $a \gets b$ + \State $b \gets z$ + \EndProcedure + \State \Call{permuter}{10, 12} \Comment{appel de la procédure} + \end{algorithmic} + \end{algorithm} + +effet de bord + + toute modification de la mémoire ou modification d'un support externe + +instruction + + commande ou phrase en mesure de modifier l'état du programme ou de la machine hôte + (allocation mémoire, support externe, disque, écran...) + +Une procédure ne renvoie pas de valeur, mais provoque un 'effet de bord' (écriture dans une globale, dans un flux sortant etc.). + +Une procédure permet de créer une instruction nouvelle qui deviendra une primitive pour le programmeur. +Cela permet de structurer le texte source du programme et améliorer sa +lisibilité. Cela permet aussi d'appeler plusieurs fois, et à plusieurs endroit +dans le code, cette primitive. + +Appel d'une procédure +~~~~~~~~~~~~~~~~~~~~~ + +(ex: pseudo-pascal) + +**déclaration de procédure** + +.. raw:: latex + + \begin{algorithm} + \caption{Procédure de permutation de deux entiers}\label{appelpermutation} + \begin{algorithmic}[1] + \Procedure{permuter}{$a,b$}{} + \BState \emph{parametres}: + \State $a: \textit{int}$ \Comment{paramètres formels de la procédure} + \State $b: \textit{int}$ + \BState \emph{locales}: + \State $z: \textit{int}$ \Comment{les variables locales de la procédure} + \BState \emph{corps}: + \State ... \Comment{Le corps de la procedure} + \EndProcedure + \State \Call{permuter}{10, 12} \Comment{l'appel de la procédure} + \end{algorithmic} + \end{algorithm} + + +- les variables x1,...,xn sont appelées *paramètres formels* de p +- les variables v1,...,vm sont appelées *les variables locales* de p + +les valeurs effectivement passées en paramètres, ici `10, 12` +sont appelées **paramètres effectifs** de p + +signature + + C'est l'ensemble paramètre formel + resultat de l'appel + +fermeture + + L'ensemble procédure + variables locales + signature + parametres effectifs + est appelé une **fermeture**. C'est la procédure + son contexte qui permet + de l'instancier dans un programme. + +Environnement + + Contexte d’évaluation d'une expression ou d'une fonction + +Portée + + La portée d'un identifiant (une variable) est sa condition d'utilisation dans un contexte donné + (utilisation locale uniquement, ou bien globale, ou bien locale et globale) + La portée d’une liaison est la portion du code dans laquelle cette + liaison est valide (i.e. où un identifiant est lié à une expression). + +.. ifconfig:: exercice + + **Exercice** : Que donne ce code ? + + .. code-block:: ocaml + + # let x = 42 in + let y = x - 1 in x - y ;; + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: ocaml + + - : int = 1 + + +.. code-block:: ocaml + + let a = 3 (* première liaison pour l'identifiant a *) + let b = 5 and c = 6 + let somme = a + b + c + val somme : int = 14 + let a = 45 (* deuxième liaison pour l'identifiant a *) + somme + val a : int = 45 + +.. ifconfig:: exercice + + **Exercice** : Que donne ce code ? + + .. code-block:: ocaml + + let a = 3 and b = 4 and c = 8 ;; + let somme = a + b + c ;; + val somme : int = ??? + let a = 44 + let b = 5 + let c = 1 + somme + - : int = ??? + +.. ifconfig:: correction + + .. code-block:: ocaml + + let a = 3 and b = 4 and c = 8 ;; + - : int = 15 + let somme = a + b + c ;; + val somme : int = 15 + let a = 44 + let b = 5 + let c = 1 + somme + - : int = 15 + + Même code en python + + .. code-block:: python + + >>> a = 1 + >>> b = 2 + >>> c = 3 + >>> somme = a + b + c + >>> somme + 6 + >>> a = 56 + >>> b = 5678 + >>> c = 56789 + >>> somme + 6 + >>> + +Portée locale dans une expression + +.. code-block:: ocaml + + # let a = 2 and b = 3 and c = 4 in + let somme = a+b+c in + somme + - : int = 9 + # somme ;; + Error: Unbound value somme + # a ;; + Error: Unbound value a + +.. important:: + + L’ordre d’évaluation dans un let ... in ... est bien déterminé, + sans grande importance dans un cadre purement fonctionnel, mais important + en cas d’effets de bord + + +Exemple de variable globale modifiée localement (**attention, mauvaise pratique** !) : + +.. code-block:: python + + >>> a = 5 + >>> def print_a(): + ... print("La variable a = {0}.".format(a)) + ... + >>> print_a() + La variable a = 5. + >>> a = 8 + >>> print_a() + La variable a = 8. + >>> + + + +niveau + + Le niveau d’une déclaration (de variable ou de procédure) est le nombre + de procédures sous lesquelles elle est déclarée. Le programme principal + a le niveau 0. + +.. code-block:: python + :linenos: + + def _get_config(name): + # return config value + if not isfile(CONFIG_FILE): + raise Exception("Fichier de configuration non existant") + from ConfigParser import ConfigParser + cfg = ConfigParser(allow_no_value=True) + cfg.read(CONFIG_FILE) + + if name == "SUBNETS": + return eval(cfg.get('eole', 'subnets')) + elif name == "LEASES_FILE": + DHCP_PATH = cfg.get('eole', 'container_path_dhcp') + return join('/', DHCP_PATH, 'var/lib/dhcp/dhcpd.leases') + def get_routes(*args, **kwargs): + """ + Send list of reserved IP + return list of tuple (id, machine name, IP, MAC Adress) + """ + cfg = creole_loader(load_extra=True, rw=False, owner=MODNAME, + mandatory_permissive=False) + return zip(cfg.dhcp.dhcp.id_dhcp.id_dhcp, cfg.dhcp.dhcp.id_dhcp.hostname, + cfg.dhcp.dhcp.id_dhcp.ip, cfg.dhcp.dhcp.id_dhcp.macaddress) + +On voit que l'objet `cfg` ligne 6 et 7 a le même nom que l'objet `cfg` ligne 19. +C'est autorisé et les espaces de nommages sont différents. + + +Description d'une fonction +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Une fonction renvoie une valeur et ne modifie pas l'état courant du programme +en cours d'exécution ni ne réalise d'effets de bord. Elle renvoie +**toujours** quelque chose (même la valeur ``None`` qui n'est pas rien) + +- une procédure peut prendre des paramètres +- elle modifie l'état courant du système + +- Déclaration des paramètes +- Déclaration du corps +- Appel de la fonction + +En programmation fonctionnelle, programme est un ensemble de définitions de fonctions, +un résultat est l'application d’une fonction à une structure de données effective. + +- composant de base : la fonction +- opération de base : l’application + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de fonction}\label{fonction} + \begin{algorithmic}[1] + \Function{permuter}{$a,b$}{} \Comment{définition de la fonction} + \BState \emph{parametres}: \Comment{déclaration (noms, types) des paramètres formels} + \State $a: \textit{int}$ + \State $b: \textit{int}$ + \BState \emph{locales}: \Comment{déclaration (noms, types) des valeurs locales} + \State $z: \textit{int}$ + \BState \emph{corps}: + \State $z \gets a$ + \State $a \gets b$ + \State $b \gets z$ + \BState \emph{return}: \Comment{La valeur, le résulat renvoyé par la fonction} + \EndFunction + \State \Call{permuter}{10, 12} \Comment{appel de la fonction} + \BState \emph{result}: + \State (12, 10) \Comment{Le résultat effectif de la fonction après appel} + \end{algorithmic} + \end{algorithm} + +.. ifconfig:: exercice + + **Exercice** : factoriser le code suivant + :: + + Ecrire "Etes-vous marié ?" + Rep1 <- "" + TantQue Rep1 <> "Oui" et Rep1 <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Rep1 + FinTantQue + ... + Ecrire "Avez-vous des enfants ?" + Rep2 <- "" + TantQue Rep2 <> "Oui" et Rep2 <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Rep2 + FinTantQue + +.. ifconfig:: correction + + **Correction** : + + :: + + Fonction RepOuiNon() en caractère + Truc <- "" + TantQue Truc <> "Oui" et Truc <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Truc + FinTantQue + Renvoyer Truc + Fin + + Ecrire "Etes-vous marié ?" + Rep1 <- RepOuiNon() + ... + Ecrire "Avez-vous des enfants ?" + Rep2 <- RepOuiNon() + + +Définition mathématique +~~~~~~~~~~~~~~~~~~~~~~~~~ + +fonction + + Une fonction f d’un ensemble E vers un ensemble F est une + correspondance qui associe à chaque élément de E au plus + un élément de F. + +- E est appelé le domaine de définition +- F est appelé codomaine +- la **signature** de la fonction : `E → F (int -> int = )` + + +Exemple de signature d'une fonction + +:: + + Fonction RepOuiNon(Msg en Caractère) en Caractère + Ecrire Msg + Truc <- "" + TantQue Truc <> "Oui" et Truc <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Truc + FinTantQue + Renvoyer Truc + Fin Fonction + + ... + Rep1 <- RepOuiNon("Etes-vous marié ?") + ... + Rep2 <- RepOuiNon("Avez-vous des enfants ?") + ... + + +curryfication + + évaluation de l'application d'une fonction + +- évaluter `(f x y)` +- peut donner une **valeur fonctionnelle** +- évaluation de la valeur fonctionnelle sur une valeur des types de base + +:: + + let g = function n -> (function p -> p + 1) n;; + +Typage d'une fonction +~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: ocaml + + # let f x y z = if x > 0 then y + x else z - x;; + val f : int -> int -> int -> int = + +c’est en fait une fonction à un argument qui retourne une fonction:: + +.. code-block:: ocaml + + val f : int -> (int -> (int -> int)) = + +application de f à trois valeurs + +.. code-block:: ocaml + + # f 1 2 3;; + - : int = 3 + +en programmation fonctionnelle, +les fonctions sont des valeurs comme les autres + + +.. code-block:: ocaml + + # fun x -> x * x;; + - : int -> int = + +Récursivité +~~~~~~~~~~~~ + +.. code-block:: ocaml + + let rec fact n = + if n=0 then 1 else n * fact (n-1) + + +équivalent impératif utilisant une boucle + +.. code-block:: c + + int fact(int n){ + int f = 1 ; + int i = n ; + while (i>0){ + f = f * i; + i-- ; + } ; + return f ; + } + +Définitions par cas +~~~~~~~~~~~~~~~~~~~ + +.. code-block:: ocaml + + let rec fact n = + match n with + 0 -> 1 + | -> n * fact (n-1) + +**exemple** : la fonction puissance + +.. code-block:: ocaml + + let rec puissance x n = match n with + 0 -> 1 + | -> x * puissance x (n-1) + + + +.. ifconfig:: exercice + + **Portée locale dans une fonction** + Quelles sera la valeur de la variable `a` ? + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... a = 2 + ... return a + 1 + ... + >>> a = myfunc() + a + + +.. ifconfig:: correction + + Correction: + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... a = 2 + ... return a + 1 + ... + >>> a = myfunc() + a + >>> a + 4 + >>> + + +.. ifconfig:: exercice + + **Exercice** : Portée locale dans une fonction avec variable globale + Quelles sera la valeur de la variable `a` ? + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... global a + ... a = 2 + ... return a + 1 + ... + >>> a = myfunc() + 3 + >>> + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... global a + ... a = 2 + ... return a + 1 + ... + >>> myfunc() + 3 + >>> a + 2 + >>> a = myfunc() + 3 + >>> a + 6 + >>> diff --git a/AlgoApprofondie/cours/fondement.txt b/AlgoApprofondie/cours/fondement.txt new file mode 100644 index 0000000..874365c --- /dev/null +++ b/AlgoApprofondie/cours/fondement.txt @@ -0,0 +1,198 @@ +Présentation de l'art de programmer +==================================== + +Qu'est-ce que la programmation ? +-------------------------------- + +programmation + + Description d’un calcul (traitement) dans + un langage compréhensible par la machine + (langage de programmation) + +Le processus d'abstraction +-------------------------- + +Débuter en programmation n'est pas une chose aisée. Aujourd'hui, la tendance est au +"bas niveau". Souvent, on se jette dans le grand bain : + +- soit en s'approchant au maximum de la machine (admin système et réseau, noyau + linux, langage C) + +- soit en faisant du dev web côté backend, ce qui ramène à une administration réseau + de bas niveau (microservices, monde nodeJS/javascript, etc...) + +Soit on suit un cursus scolaire traditionnel qui commence souvent par une +explication du fonctionnement d'une machine abstraite de bas niveau, puis en +allant de plus en plus haut, mais étant sous-entendu qu'il faut rester connecté au +bas niveau (comprendre comment ça se passe derrière la scène). + +Dans ces deux cas, il est sous-entendu qu'on apprend plus de choses et plus rapidement en mettant +les mains dans le cambouis, ce qui est vrai bien sûr. Mais cela sous-entend qu'un développeur doit +rester le nez dans le guidon. Qu'il doit être un expert de son domaine en accumulant des technologies +sans aucun recul. Bien sûr il se doit d'être un expert du système dans lequel il évolue +(connaissance du système d'exploitation, binding avec le C, du ramasse miette (garbage +collector), interaction avec les différentes librairies, gestion et optimisation de la mémoire, +architecture par microservices, threads...) mais il doit aussi être capable de prendre du recul. + +L'approche algorithmique (algorithmique de pseudo code, algorithmique algébrique et modulaire) +est un véritable moyen pour le programmeur de prendre du recul : elle commence par se placer du +côté de l'esprit humain et de ses capacités de compréhension et d'abstraction, elle autorise une +pensée rationnelle sur l'art de programmer et permet au programmeur d'effectuer les bons choix, +en connaissance de sa discipline. + +Le lien est fait ensuite avec le plus bas niveau grâce une implémentation effective +des langages à partir des paradigmes de rationalisation de la penseée (modules, +objects, généricité, polymorphisme paramétrique...) et d'un outil de communication +avec la machine qu'on appelle compilateur (dont la description est en dehors de +l'objectif de ce cours). + +La tendance générale de l'évolution des langages est de se libérer de ces +contraintes de bas niveau, un peu comme en sciences physiques où les lois physiques +dépendent de l'échelle d'en dessous (du niveau microscopique/quantique) mais qu'à +l'échelle du dessus, on n'a pas affaire à des effets de bas niveau (pas d'effets +quantiques à un niveau macroscopique en général). Ce processus d'évolution est vrai +aussi dans le monde de la technique informatique lui-même (modèle OSI, comment est +construite une trame IP, indépendances de chaque couche (transport, payload) entre +elles). Même la tendance système est à la virtualisation qui accentue encore la +tendance à s'affranchir du bas niveau (le niveau système), le séparer nettement du +haut niveau (le niveau applicatif). + +Il apparaît régulièrement de nouveaux langages. Comment s'orienter ? Quel(s) +langage(s) choisir pour un projet de développement ? Au delà de leurs disparités, la +conception et la genèse de chacun d'eux procèdent d'une motivation partagée : la +volonté d'abstraire. + +- **s'abstraire de la machine** : un langage de programmation permet de + négliger l'aspect *mécanique* de l'ordinateur. On oublie le modèle du + microprocesseur, jusqu'au système d'exploitation sur lequel sera exécuté + le programme. + +- **abstraire les erreurs** : Il s'agit ici de garantir la sûreté d'exécution; un + programme ne doit pas se terminer brutalement ou devenir incohérent en cas d'erreur. + Un des moyens pour y parvenir est le typage des programmes et la mise + en oeuvre d'un mécanisme d'exceptions. + +- **abstraire le mode opératoire** : Il s'agit de choisir une représentation, un + paradigme d'implémentation qui est indépendant du domaine considéré (paradigme + objet, modulaire, générique, composants...) + +- **abstraire les composants** : Les langages de programmation donnent la + possibilité de découper une application en différents composants logiciels, plus ou + moins indépendants et autonomes. La modularité permet une structuration de plus haut + niveau de l'ensemble d'une application complexe. Les langages à objets constituent + une autre approche de la réutilisabilité permettant la réalisation très rapide de + prototypes. + +Description des niveaux d'abstraction par rapport à la machine +--------------------------------------------------------------- + +Les langages de haut niveau simplifient le travail du +programmeur là où les langages de bas niveau permettent de produire un code +plus efficace. + +- **niveau 0** : le langage machine. Illisible, c'est une suite d'optcode. + impossible de coder dans ce langage. + +- **niveau 1** : langage d'assemblage. Il reste très dépendant de la machine + et aujourd'hui il est rare d'en faire, sauf si on code un bootloader par exemple, + la gestion de l'accès à la mémoire est en réel (le mode protégé n'apparaît que après). + Il faut gérer les ressources,le langage est très optimisé mais presque impossible + à maintenir et rendre générique. Aujourd'hui plus personne ne code en assembleur. + +- **niveau 2** : langages dits de **bas niveau** : (exemple : le C, le C++) + indépendance par rapport à la machine, grande structuration mais très verbeux + +- **niveau 3** : langages dits de **haut niveau** : le raisonnement dans ces + langages ne dépent plus de la machine, et ils implémentent des paradigmes de + programmation indépendant de l'état de la mémoire de l'ordinateur, + ils sont indépendant même du système d'exploitation. + +Qu'est-ce qu'une machine ? +--------------------------- + +Une machine, ce truc apparemment si complexe, est en fait +un assemblage de bric et de brac. + +L'assemblage des connecteurs permet de simuler un additionneur, +en prenant en compte les propriétés de **reste euclidien** +de l'addition. + +La structure électronique est composée de : + +- un ordonnanceur. +- le stockage d'un **état**. +- une pile d'instruction + +.. glossary:: + + adressage + + Dès lors qu'on dispose de ces bases électronique au dessus du processeur, + un langage d'assemblage est possible, c'est le langage de calcul sur les registres. + + registre + + machines ont un espace mémoire et un espace de calcul (registres) + +Un ordinateur, c'est très très stupide, mais ça permet de disposer de : + +- une mémoire très grande et ordonnée, +- une capacité à effectuer inlassablement des tâches répétitives +- une grande rapidité de calcul + +Apprendre à programmer, c'est-à-dire être capable de +contrôler la machine. + +.. important:: Apprendre à programmer, c'est-à-dire apprendre à penser de manière structurée, + pour pouvoir accessoirement ensuite communiquer avec une machine. + +Compilateur +----------- + +Schématiquement, un compilateur est un programme qui traduit un +programme d’un langage source vers un langage cible, en signalant +d’éventuelles erreurs. + +Quand on parle de compilation, on pense typiquement à la traduction d’un +langage de haut niveau (C, Java, Caml, ...) vers le langage machine d’un +processeur (Intel Pentium, PowerPC, ...) + +- xml (libre office, word) -> postscript (imprimante) +- postcript -> image +- syntaxe wiki -> html (Wikipédia...) + +compilation graphique + + passer une description, ça donne un dessin genre ocaml Quilt < mon_dessin.txt + passer par une api qui permet de causer avec une interface + +**transpiler** : transformation d'un langage de haut niveau vers un autre +langage de haut niveau. + +- cofee script, typescript -> javascript +- (babel) javascript -> javascript ES 6 +- python -> javascript + +Un compilateur traduit un programme P en un programme Q tel que +pour toute entrée x , la sortie de `Q(x)` soit la même que celle de `P(x)` + +Un interprète est un programme qui, étant donné un programme `P` et une +entrée x , calcule la sortie s de `P(x)` + +Le compilateur fait un travail complexe une seule fois, pour produire un +code fonctionnant pour n’importe quelle entrée +L’interprète effectue un travail plus simple, mais le refait sur chaque entrée +Autre différence : le code compilé est généralement bien plus efficace que +le code interprété + +Typiquement, le travail d’un compilateur se compose d’une phase d’analyse + +- reconnaît le programme à traduire et sa signification +- signale les erreurs et peut donc échouer (erreurs de syntaxe, de portée, de typage, etc.) + +Puis d’une phase de synthèse + +- production du langage cible +- utilise de nombreux langages intermédiaires +- n’échoue pas diff --git a/AlgoApprofondie/cours/index.txt b/AlgoApprofondie/cours/index.txt new file mode 100644 index 0000000..aa2ef7d --- /dev/null +++ b/AlgoApprofondie/cours/index.txt @@ -0,0 +1,19 @@ +Introduction à l'algorithmique +================================ + +.. toctree:: + :maxdepth: 2 + + presentation + fondement + langage + algo + programme + fonctions + control + donnees + apercu + modularite + modules + tp + annexes/index diff --git a/AlgoApprofondie/cours/langage.txt b/AlgoApprofondie/cours/langage.txt new file mode 100644 index 0000000..67f858d --- /dev/null +++ b/AlgoApprofondie/cours/langage.txt @@ -0,0 +1,336 @@ +Les langages de programmation +============================= + +langage + + Un langage de + programmation + doit permettre d'écrire des + programmes de bonne qualité + +Un programme doit être : + +- correct +- robuste +- lisible, bien documenté +- facile à modifier, extensible + +Un langage de programmation doit permettre : + +- la programmation structurée +- la structuration avec les types +- proposer un mécanisme d’exceptions +- présenter des caractères de généricité, de polymorphisme et de surcharge + +.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes, + Elles sont une nécessité + +Approche historique et chronologique +------------------------------------- + +- Lambda calcul (1930) +- machines de Turing (1936) +- début des langages vers les années 1950 (A0, Fortran(impératif), + Lisp(impératif et fonctionnel), Cobol) +- années 60 : Simula (classes), CPL (compilation séparée) +- années 70 : C (référence du langage impératif de bas niveau), Pascal + (procédures), Smalltalk (programmation orientée objects), Prolog + (programmation logique), Scheme (programmation fonctionnelle pure), Modula, + C++, Ada, Turbo Pascal, Common Lisp, Eiffel (programmation par contrats) +- années 80 : ML, CAML (langages fonctionnels) +- années 90 : Perl, Python, Ruby (languages de scripting multi-paradigmes) + Haskell (fonctionnel pur), Lua, Delphi, Java (orienté objet, machine + virtuelle), PHP (impératif, dédié au web), Erlang (fonctionnel+ + programmation concurrente), javascript (orienté web, objets par + prototypage), OCaml (multi-paradigme, fortement typé, orienté sécurité, + programmation générique, fonctionnelle et objets, modulaire et fonctorielle) +- 2009 : go (google, compilé, typage statique, objets par prototypage, + prgrammation concurrente), Rust (fondation mozilla, multiparadigme, programmation concurrente) + +Les langages actuellement les plus utilisés dans le monde de l'entreprise sont : + +- javascript/NodeJS (70% du code dans le dépôt github) mais victime de son + succès (chaos complet des librairies) +- le go est de plus en plus utilisé, c'est **le** langage qui monte + actuellement +- Python, Ruby, lua, autres langages de scripting (de plus en plus utilisés) +- PHP, Java (stagnants) +- C, C++ (de moins en moins utilisés) + +Approche par typologie des langages +----------------------------------- + +- **A0 (1954)** : possibilité de découpage de programmes en + sous-programmes ; + +- **ALGOL (1958)** : concept de bloc de code (pas forcément nommé) et d'imbrication + de blocs de code ; + +- **C (1971)** : syntaxe claire et simple, programme fortement structuré ; + +- **C (1980)** : le **code objet**, qui consiste à essayer de faire fonctionner + un seul jeu d'instructions sur des machines différentes. Avant, le code + d'assemblage dépendait du processeur, donc il n'y avait pas un seul et unique + jeu d'instructions ; + +- **1980** : déploiement et succès des langages à objets ; + +- **1983** : turbo pascal (Borland) qui fut le tournant du C, + propose un IDE (Environnement de Développement Intégré). + aujourd'hui le turbo pascal a pratiquement disparu mais pas totalement, + il est soutenu par une communauté open source autour de **Lazarus** ; + +- **depuis les années 90** : deux grands groupes de langages. Les langages à + objets, et les langages fonctionnels. Les deux mondes s'interpénètrent (les + avancées actuelles du web, les microservices (Erlang, Haskell), + viennent du monde fonctionnel, le NoSQL, etc). + Les grandes avancées architecturales (système d'exploitation, linux, etc...) + viennent du monde de l'impératif. + + +Approches par modèles de programmation +-------------------------------------- + +- **le mécanisme d'exceptions** : il est possible de rompre l'exécution normale d'un + programme à un endroit et de la reprendre à un autre endroit du programme prévu à + cet effet. Ce mécanisme permet de gérer les situations exceptionnelles. + +- **le paradigme impératif** : les entrées-sorties, les modifications physiques de + valeurs et les structures de contrôle itératives sont possibles. + +- **le paradigme fonctionnel** : manipule les fonctions comme étant des valeurs du + langage. Celles-ci peuvent être utilisées en tant que paramètres d'autres fonctions + ou être retournées comme résultat d'un appel de fonction. + +- **le paradigme objet** : La représentation du programme colle à la réalité en + reproduisant des entités relativement proches des objets réel. Attention, le piège + est de croire qu'il s'agit *du* paradigme universel puisqu'il reproduit en miroir le + réel. **C'est en fait un processus d'abstraction comme un autre**. + +Sûreté du langage, typage +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Tri par ordre de sûreté croissant : + +0. typage très faible (presque inexistant aujourd'hui) : 42 == "42" == 42.0... +1. typage dynamique faible : (javascript) (possibilité de changer le prototype + d'un objet pendant l'éxécution du programme, c'est la fête on peut faire + n'importe quoi) +2. typage dynamique fort inféré par le comportement (behavior, duck typing) + (python, ruby, PHP) Le contenu de la variable détermine le choix du typage + `var = 0 -> type int` +3. typage statique déclaré fort (Java) + `int var = 0 ;` (pas mal mais super lourd, pas **agile** du tout) +4. langages à types statiques muni d'un moteur d'inférence de types (Ocaml) + sûreté d'exécution, agilité, sécurité. + + +La syntaxe, la lisibilité +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Importance de la lisibilité (notamment par rapport aux méthodes agiles). + +- courte (python) +- verbeuse (C) +- l'importance des mots clef du langage +- délimiteur de phrase, de blocs (parenthèses, accolades, tabulations, blocs...) + +Langages compilés ou interprétés ? +----------------------------------- + +.. glossary:: + + langage compilé + + une première passe est faite, des validations son effectuées **avant** + la génération du code objet, cette phase est faite par le compilateur. + + compilateur + + programme qui transforme un langage de haut niveau en un langage de base + niveau + + - phase d’analyse syntaxique (source -> syntaxe abstraite) + - phase de synthèse (syntaxe abstraite -> code objet) + + + scripting (langage de scripting) + + langage interprèté + + générique (langage) + + Langage à usage générique, qui peut être utilisé dans n'importe quel + domaine (par opposition au DSL) + + domain specific + + Domain Specific Language, langage destiné à être utilisé dans un + domaine prédéfini. + + paradigmes + + représentation d'une vision particulière à partir d'un modèle théorique + + impératif + + l'algorithme ressemble à une recette de cuisine, + c'est-à-dire à une succession d'instructions à exécuter + les unes à la suite des autres + + fonctionnel + + l'algorithme ne dépend plus de l'ordre d'exécution d'instructions + pas de mélange entre les données et les traitements + + objets (programmation) + + le monde est découpé en catégories + qui permettent de créer des objets + + **développement par composants** + + les objets sont organisés entre eux par composants suivant des designs patterns, + (patrons de conception) + + garbage collector (ramasse miettes) + + la gestion automatique de la mémoire apparaît en 1989 + + machine virtuelle + + portabilité du code (mais diminution en optimisation et performances) + + JIT (just in time compiler) + + code objet, programmes fonctionnant autour de machines virtuelles + + +- **le typage statique** : la vérification de la compatibilité entre les types des + paramètres formels et des paramètres d'appel est effectuée au moment de la + compilation du programme. Dès lors, il n'est pas nécessaire de faire ces + vérifications durant l'exécution du programme ce qui accroît son efficacité. En + outre, la vérification de type permet d'éliminer la plupart des erreurs introduites + par maladresse ou étourderie et contribue à la sûreté de l'exécution. + +- **le typage dynamique** : la vérification de la compatibilité entre les types des + paramètres formels et des paramètres d'appel est effectuée au moment de l'exécution + ou de l'appel à certaines parties de codes du programme. + +- **le polymorphisme paramétrique** : une fonction ou un objet qui n'explore pas la + totalité de la structure d'un de ses arguments accepte que celui-ci ait un type non + entièrement déterminé. Ce paramètre est alors dit polymorphe. Cette particularité + permet de développer un code générique utilisable pour des structures de données + différentes tant que la représentation exacte de cette structure n'a pas besoin + d'être connue par le code en question. L'algorithme de typage est à même de faire + cette distinction. + +- **l'inférence de types** : le programmeur n'a besoin de donner aucune information + de type à l'intérieur de son programme. Le langage se charge seul de déduire du code + le type le plus général des expressions et des déclarations qui y figurent. Cette + inférence est effectuée conjointement à la vérification, lors de la compilation du + programme. + +Les grands paradigmes de programmation +--------------------------------------- + +Le paradigme des objets +~~~~~~~~~~~~~~~~~~~~~~~ + +- 1962 (SIMULA) : premières notions de classes ; + +Pui, une dizaine d'années plus tard : + +- C++ : intégration des classes pour le C ; +- turbo pascal : intégration des classes pour le pascal ; + +Tous les langages actuels ont intégré des traits objets mais de manière très +différentes : + +- perl (1987) +- python (1991) +- Ruby (1993) + +- L'implémentation des objets en python est très proche des notions initiales de + classes issues du Smaltalk et présente une tentative très intéressante + d'unification des objets et des types depuis python 2.2 ; + +- Java (1995) : très grosse réussite industrielle en surfant sur la vague de la + programmation objet, et des machines virtuelles, mais en fait et avec le recul, + doté d'un support objet lourd et alambiqué. + Le monde Java est lourd, avec des outils consommant beaucoup de mémoire et + qui ne satisfont pas à la règle du KISS (Keep It Simple, Stupid) ; + + +Il n'y a pas **une** POO (Programmation Objet), il y a des POO. +Les implémentations objets dans les langages sont riches et variées : + +- objets obligatoirement construits pas des classes (Java, C++, ...) +- objets sans définition de classes (javascript, Ocaml, go, rust) +- langages à attributs (python) +- langages ou le type des objets est défini par leur classe (python, ruby) +- langages ou le type des objets est différent du type de leur classe (Ocaml) +- objets sans classes mais construits par des prototypes (javascript) +- construction d'objets possibles objets sans classe du tout (Ocaml) +- encapsulation des attributs des objets (Java, Ocaml, C++, PHP) +- pas d'encapsulation des attributs (python, ruby, javascript...) + +Le paradigme impératif +~~~~~~~~~~~~~~~~~~~~~~ + +Un programme est une suite d'états de la mémoire de l'ordinateur, +c'est la suite logique des machines de Turing. +La plupart des programmeur aujourd'hui raisonnent suivant ce paradigme, +et ont une très faible visibilité par rapport aux autres paradigmes existants. +Seuls les programmeurs cultivés sont aujourd'hui capable de raisonner +suivant différents paradigmes, ce sont des programmeurs chevronnés et +cultivés. + +Le paradigme fonctionnel +~~~~~~~~~~~~~~~~~~~~~~~~ + +La notion de fonction que possède sous une forme ou une autre la plupart des +langages est empruntée aux mathématiques et non à l'électronique. D'une manière +générale, les langages substituent des modèles formels aux conceptions purement +calculatoires. Ils y gagnent en expressivité. Certains langages fondent leur +paradigme de programmation sur l'abstraction entrée-traitement-sortie, donc sur le +**mathème fonctionnel** et pas sur la boite noire électronique. La fonction +mathématique apporte un niveau opératoire dans le traitement de l'information. + + +Approche par fonctionnalités +---------------------------- + +Plusieurs domaines de l'informatique on proposé/imposé des méthodologies, +des manières de faire. Ces modèles de programmation on fortement influencé +en retour les langages. On reconnaît aujourd'hui : + +- Le modèle client-serveur +- Le modèle de programmation concurrente (exécution de processus légers, threads) : +- Le modèle de développement d'une application de bureau (MVC, ergonomie d'interface) +- Le modèle de développement web (communiquer sur le réseau Internet, API + REST, microservices...) +- Le modèle de programmation système et réseau +- le modèle **Dev Ops** et les méthodes de développement virtualisés +- les langages présentant des **fonctionnalités agiles** + +Conclusion +----------- + +Les langages de haut niveau sont caractérisés par +des concepts tels que : + +- déclaration de valeurs, types, expressions, portée +- expressions, variables, instructions, structures de contrôle +- fonctions, procédures, fermetures +- encapsulation, modules, objets + +=========== ============ +Paradigmes Concepts +=========== ============ +impératif variables, procédures, modules +objets classes, méthodes, héritage, surcharge +fonctionnel fonctions, fermetures, modules +logique prédicats, modules +concurrent tâche/processus, communication +=========== ============ diff --git a/AlgoApprofondie/cours/modularite.txt b/AlgoApprofondie/cours/modularite.txt new file mode 100644 index 0000000..276d12d --- /dev/null +++ b/AlgoApprofondie/cours/modularite.txt @@ -0,0 +1,200 @@ +La programmation structurée +============================= + +Un langage de programmation doit permettre la programmation structurée. + +.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes, + Elles sont une nécessité + +Structuration d'un programme +----------------------------- + +La réalisation d'applications importantes oblige le programmeur ou l'équipe de +développement à se poser des questions d'organisation et de structuration. +Aujourd'hui, on dispose de deux grands modèles d'organisation dont les avantages et les +particularités sont distincts. + +L'écriture des vrais programmes consiste à les structurer pour les présenter +comme un assemblage de briques qui s'emboîtent naturellement. +Ce problème se révèle fondamental dès que la taille des programmes devient conséquente. +Si on ne prend pas garde au bon découpage des programmes en modules indépendants, +on se retrouve rapidement débordé par un grand nombre de variables, +et il devient quasiment impossible de réaliser un programme correct. + +La programmation raisonnée +--------------------------- + +Un **programme** est le codage d'un algorithme dans un langage de programmation. +La programmation consiste à modéliser un problème du monde réel sous une forme +symbolique (pour faire résoudre ce problème par un ordinateur). + +Certains problèmes sont **indécidables** ou **ouverts**. +On utilise un langage de programmation pour décrire la **solution** du programme. +La sémantique du programme est le sens de chacune des constructions du langage. +**Comment passer de l'énoncé d'un problème à un programme de bonne qualité ?** + +spécifier + + décrire de manière complète et rigoureuse le problème à résoudre + +modéliser + + proposer une représentation du réel qui soit accessible au calcul + algorithmique + +transcrire + + La transcription du modèle algorithmique se fait dans un langage + de programmation cible adapté au problème + +valider + + La validation du programme est une étape qui permet de s'assurer plus ou + moins fortement que le programme produit les résultats attendus. + La validation va de la série de tests unitaires (validation faible) + à la preuve de programme (validation mathématique forte). + +Conception descendante +----------------------- + +Une vision **centripète** : du général au particulier. + +Il s'agit d'une méthode de résolution d'un problème. On le découpe en tâches +de plus en plus fines, de plus en plus détaillées, qui aboutiront au programme final. + +On met des *trous* dans les algorithmes de plus haut niveau, +c'est-à-dire des phrases en langage naturel. + +.. ifconfig: exercice + + **Exercice** : **Calculer la date du lendemain** + +.. ifconfig: correction + + - l'algorithme de plus bas niveau + + :: + + lendemain jour = + si jour [est le dernier jour du mois] alors + resultat = [calculer le 1er janvier de l'année suivante] + sinon + resultat = lendemain_dansl'année jour + + - les algorithmes de plus bas niveau + + :: + + lendemain_dans_l'année jour = + si jour [est le dernier jour du mois] alors + resultat = [calculer le premier jour du mois suivant] + sinon + resultat = jour suivant jour + + :: + + jour_suivant jour = + jour + 1 + + et ainsi de suite jusqu'à ce que toutes les phrases soient calculables. + +Algorithme vague +-------------------- + +L'algorithme vague, c'est quand on pense l'algorithme en se plaçant du côté de +l'implémentation en premier. On a le nez dans le guidon, la vue d'ensemble est +difficile. + +Voici, tiré du monde réel, un exemple d'algorithme vague +("ce que doit faire une fonction"), placé dans un bout de code +(souvent la **docstring** d'une fonction). + +.. code-block:: python + + def upsert_route(*args, **kwargs): + """ + Create or modify an existant DHCP route + param tuple (id or null, machine name, IP, MAC Adress) + return True or False with error message + """ + # si id présent alors modification sinon ajout + # récupère la liste des réservations en cours + # y cherche la variable sur la base de l'ID + # modifie les valeurs + # applique la nouvelle conf DHCP + + return True + +Voici un autre bout de code avec l'algorithme en commentaire, +et l'implémentation effective de l'algorithme + +.. code-block:: python + + def del_route(*args, **kwargs): + """ + Delete an existant DHCP route + param tuple (id, machine name, IP, MAC Adress) + return True or False with error message + """ + # récupère la liste des réservations en cours + # y cherche la variable sur l'id donné en paramètre + # supprime l'entrée avec vérification que les données fournies + # sont bien dans l'enregistrement à supprimer + # applique la nouvelle conf DHCP + route_to_del = (1, "host2","10.1.2.4","6E:FF:56:A2:AF:17") + routes = get_routes() + if route_to_del in routes: + c = creole_loader(load_extra=True, rw=True) + c_id = c.dhcp.dhcp.id_dhcp.id_dhcp.index(route_to_del[0]) + if c.dhcp.dhcp.id_dhcp.macaddress[c_id]==route_to_del[2] + and c.dhcp.dhcp.id_dhcp.ip[c_id]==route_to_del[1]: + c.dhcp.dhcp.id_dhcp.id_dhcp.pop(c_id) + config_save_values(c, MODNAME) + return True + return False + +Les deux grands paradigmes +--------------------------- + +La modularité +~~~~~~~~~~~~~~ + +Les données et les traitements sont regroupés au sein d'une même entité à deux +facettes : d'un côté le code proprement dit, de l'autre son interface. La +communication entre modules s'effectue via leur interface. La description d'un +type peut être masquée en n'apparaissant pas dans l'interface du module. Ces +types de données abstraits facilitent les modifications d'implantation à +l'intérieur d'un module sans affecter les autres modules qui s'en servent. De +plus, les modules peuvent être paramétrés par d'autres modules augmentant +ainsi leur réutilisabilité. + +Le paradigme objet +~~~~~~~~~~~~~~~~~~ + +Les descriptions des traitements et des données sont regroupées dans des +entités appelées **classes**; un objet est une instance (valeur) d'une classe. +La communication entre objets est réalisée par envoi de message, l'objet +receveur détermine à l'exécution (liaison retardée) le traitement +correspondant au message. En cela, la programmation objet est dirigée par +les données. La structuration d'un programme provient des relations entre +classes, en particulier l'héritage permet de définir une classe par extension +d'une autre. + +En programmation objet, un **programme** est une collection d’objets qui communiquent +entre eux par **message**, le **résultat** est un message envoyé à un objet particulier + +Comparaison entre les deux paradigmes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Il y a dualité entre ces deux modèles. + +- On ne peut pas augmenter les composants d'un type dans un module (pas + d'extensibilité des données), mais on peut ajouter de nouveaux traitements + (extensibilité des traitements) sur ces données. + +- En objet, on peut ajouter des sous-classes à une classe (extensibilité des + données) pour traiter des nouveaux cas, mais on ne peut pas ajouter de nouveaux + traitements visibles de la classe ancêtre (pas d'extensibilité des traitements). + +**La combinaison des deux paradigmes offre de nouvelles extensibilités pour les +traitements et les données.** diff --git a/AlgoApprofondie/cours/modules.txt b/AlgoApprofondie/cours/modules.txt new file mode 100644 index 0000000..5df4b5e --- /dev/null +++ b/AlgoApprofondie/cours/modules.txt @@ -0,0 +1,313 @@ +La programmation modulaire +=========================== + +Il s'agit de décomposer un grand programme en +morceaux (**modules**) connectés entre eux par des **interfaces** bien +définies. + +Ces modules doivent être aussi indépendants que possible. + +module + + ensemble de ressources liées sémantiquement + +interface + + mode d’emploi du module, avec en plus un principe de masquage + des informations (partie publique, partie secrète) + + +Signatures, type abstrait et langage de modules : la programmation modulaire +permet d'aller très loin dans la programmation structurée. + + +Définir des fonctions dans un fichier séparé +-------------------------------------------- + +Les fonctions peuvent être définies dans un fichier et le programme dans un +autre fichier séparé. Dans ce cas, pour pouvoir être exécuté directement avec +la commande python `nomfichierprogramme.py`, le fichier du programme doit +importer d’abord les fonctions du fichier dans lequel les fonctions sont +définies. + +1. Fichier de fonctions +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: python + + # Fichier foncmaxliste.py + # Recherche le premier élément maximal dans une liste ou + #dans une chaine de caractères + def max_list(L) : + k = len(L) + max, x = L[0], 0 + i = 1 + while i < k : + if max < L[i]: + max = L[i] + x = i + i = i + 1 + return max, x + +2. Fichier de programme +~~~~~~~~~~~~~~~~~~~~~~~~ + +Pour utilser les fonctions définies dans d’autres fichiers, le fichier de +programme doit commencer par les instructions qui importent ces fichiers de +fonctions ou directement les fonctions de ces fichiers. Dans la syntaxe +ci-dessous, on importe une ou toutes les fonctions du fichier `foncmaxlist.py`. + +.. code-block:: python + + # Fichier progmaxlist.py + from foncmaxliste import max_list + # ou plus simple: + # from foncmaxliste import * + print max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + print max_list(’totovaaumarche’) + couple = max_list(’totovaaumarche’) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + +Au lieu d’importer les fonctions, on peut importer le fichier qui définit les +fonctions avec la syntaxe qui suit. Dans ce cas, le fichier de programme sera +changé comme suit : + +.. code-block:: python + + # Fichier prog2maxlist + import foncmaxliste + print foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + # la syntaxe indiquant le chemin d’acces a la fonction max_list utiliser ‘‘.’’ + couple = foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + print foncmaxliste.max_list(’totovaaumarche’) + couple = foncmaxliste.max_list(’totovaaumarche’) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + +L’exécution directe du premier fichier de programme:: + + python prog max list.py + +L’exécution directe du seconde fichier de programme:: + + python prog2 max list.py + +Définition de l'implémentation d'un module +------------------------------------------- + +Tout fichier qui contient au moins une définition d’une fonction ou d’une +variable est appelé un module (une bibliothèque). Le nom du module est le nom +du fichier enlevé le suffixe `.py`. Ainsi, un fichier de programme qui contient +au moins une définition d’une fonction ou un fichier qui ne contient que des +définition de fonctions sont des modules. On peut importer un module ou des +fonctions ou variables d’un module dans un programme, comme nous avons vu dans +les exemples ci-dessus. + +.. important:: on peut importer un module, ou bien lancer un module en tant que + programme executable + +.. code-block:: python + + if __name__ == '__main__': + main() + +Pour faciliter la programmation, Python définit un certain nombre de **modules internes**, +appelés les builtins (la librairie standard). + +Par exemple : + +– Lors de l’ouverture d’une session interactive, on est dans un module interne nommé + main . Toutes les variables définies par affectation au niveau de ce module sont valides + globalement dans la session. + +– D’autres modules internes sont string, math, random + +Dans une session de travail sous l’interpréteur Python, la première importation d’un mo- +dule qui, à part des fonctions qu’elle définit, contient des instruction de programme fait +exécuter ces instructions. Dans la même session, les importations suivantes ne font pas +exécuter ces instructions. Pour les exécuter, on utilise la fonction reload(nomdumodule) +(sans sufffixe .py). + +Exemples d'interface +-------------------- + +:: + + type: son type + arguments + arg1 : description de l'argument 1 + arg2 : description de l'argument 2 + préconditions: + arg1 > 10 + postconditions: + result < 19 + raises: TypeError, AssertionError, SystemError... + test: tests nominaux pour chaque cas spécifié + +- L'interface racine carrée + +:: + + racine: + type: float -> float + arguments x: float, flottant dont on veut calculer la racine + pré: x >= 0 + test: racine 25.0 -> 5.0 ; racine (-25) -> raises TypeError + +- L'interface `lendemain` + +Il faut définir auparavant un type spécifique appelé `date` + +:: + + lendemain: le lendemain est la date qui désigne + le jour suivant de la date passée en argument + type: date -> date + arguments : + d: date + description: la date dont on veut calculer le lendemain + +Le langages des modules +------------------------- + +.. code-block:: ocaml + + module type PILE = (* signature (interface) du module *) + sig + type ’a t + val create : unit -> ’a t + val push : ’a -> ’a t -> unit + val pop : ’a t -> ’a + end + + (* implémentation du module *) + module Pile : PILE = (* le module est restreint + par la signature PILE *) + struct + type ’a t = ’a list ref + let create () = ref [] + let push x p = p := x::!p + let pop p = match !p with [...] + let rec print p = match p with [...] + end + +- `struct .. end` introduit une collection de définitions, valeurs, types ou modules. + C'est une **structure**. + +- `module Nom = struct .. end` permet de donner un nom à cette structure et + c'est ça un module. C'est une structure nommée. + +- `sig ... end` introduit une signature de module : une interface pour un module. + +On restreint souvent une structure par une signature pour "cacher" certaines +définitions. Une signature de module fournit une **interface** entre l'extérieur +et l'intérieur d'un module. + +En dehors du module, on accède à ses composants grâce à la notation pointée + +.. code-block:: ocaml + + let p = Pile.create() + Pile.push 45 p + +Les foncteurs +-------------- + +Si un langage possède un langage de modules, on peut aller plus loin : on peut +considérer un module comme étant une expression de base du langage. + +- La signature d'un module peut être considérée comme le type du module +- La structure du module peut être considéré comme sa valeur + +Quel est l'intérêt ? On peut alors définir des **foncteurs**. + +foncteur + + "fonction" d'une structure vers une autre structure. + On peut ainsi paramétrer un module par un autre module. + +.. code-block:: ocaml + + module Nom (M1 :S1 ) (M2 :S2 ) (M3 :S3 ) ... = + struct + ... + end + +On applique un foncteur à des paramètres modules, pour +obtenir un nouveau module : + +.. code-block:: ocaml + + module M = F (Titi) (Toto) + + +Contrainte de type par signature +------------------------------------ + +:: + + module M = + struct + type t = int * int * int ;; + let make d m y = d, m, y ;; + end ;; + + let d = M.make 8 5 8 ;; + + module type S = + sig + type t ;; + val make : int -> int -> int -> t ;; + end ;; + + module MS = (M:S) ;; + + MS.make 5 1 2 ;; + +Type et signature +------------------ + +:: + + # module type A = sig + val a: int -> int + end ;; + module type A = sig val a : int -> int end + # module B = struct + let a x = x + 1 ;; + end;; + module B : sig val a : int -> int end + # module C = (B:A) ;; + module C : A + + # C.a 2 ;; + - : int = 3 + # + +Module auquel on impose une signature +----------------------------------------- + + +:: + + module type DATE = sig + type t + val make: int -> t + val get_year: t -> int + val get_month: t -> int + end ;; + + module MR = struct + type t = int * int + let make x y = (x, y) + let get_month (x, y) = x + let get_year (x, y) = y + end ;; + + module date = (MR:DATE) ;; diff --git a/AlgoApprofondie/cours/presentation.txt b/AlgoApprofondie/cours/presentation.txt new file mode 100644 index 0000000..6263f9e --- /dev/null +++ b/AlgoApprofondie/cours/presentation.txt @@ -0,0 +1,72 @@ +Avant propos +============ + +Introduction +~~~~~~~~~~~~ + +| "**Que nul n'entre ici s'il n'est géomètre**" +| Maxime apposée au porche d'entrée de l'École de Platon + + +- L'accent est mis sur l'approche **algorithmique scientifique**, dite algorithmique + algébrique. L'algorithmique est un sous-domaine de l'algèbre et des + approches modulaires (arithmétique modulaire...) + +- Le point de vue mathématique étant assez exigeant, **aucun formalisme fort** de + l'algorithmique mathématique ne sera présenté. Aucun symbole mathématique donc, et + seulement du pseudo-code. + L'approche mathématique forte utilisant le formalisme mathématique de + l'algorithmique algébrique est en général enseignée en France uniquement aux cours + des grandes écoles. + +- L'algorithmique présentée ici est donc délibérément pseudo-scientifique mais en revanche + ouverte au **multi-paradigme**. En général l'évocation d'un algorithme en pseudo code est toujours + réducteur car limité au style de programmation le plus à la mode actuellement, c'est-à-dire le + **style impératif**. Nous présenterons un éventail des plus grands paradigmes de programmation + existants. Nous nous limiterons à la **programmation impérative, fonctionnelle, modulaire, + générique et objet**. Nous envisagerons les structures de données et les structures de contrôle + spécifiques à chacun des styles évoqués. + +- Et parce qu'un honnête programmeur doit avoir une vue d'ensemble de **l'état de son art**, + nous évoquerons un panorama des différents langages existants -- historiques et contemporains -- + en les comparants les uns aux autres. + +- Durant tout le cours, nous souhaitons proposer une pédagogie par l'exemple, et nous + limiterons l'exposé à deux langages d'implémentation des algorithmes : le **Python** pour la programmation + impérative modulaire et objet, et le **OCaml**, car nous évoquerons aussi certains points + de programmation fonctionnelle et modulaire, polymorphe et teintée de généricité. + +Intérêt +------- + + +| "**Il ne suffit pas d'avoir les mains propres, il faut avoir l'esprit pur.**" +| Thalès de Milet ; Sentences - VIe s. av. J.-C. + +L'algorithmique en tant que rapport à la vérité et à la pensée juste et vraie, +en tant qu'art de découper un problème complexe en tâches élémentaires, +en tant qu'énoncés de compréhension et de sémantique, +est la seule chose vraiment profonde dans l'informatique. Le reste n'est que 0 ou 1. +Cette notion d'algorithme est profondément enracinée dans le désir humain de +transmettre des méthodes pour comprendre des problématiques, +qu'il s'agisse de processus scientifiques ou mathématiques, de secrets, +de philosophie ou de divination au sens des anciens Grecs. +De règles linguistiques, aussi, chez les Romains. + +Objectifs de ce cours +~~~~~~~~~~~~~~~~~~~~~ + +Il s'agit de : + +- maîtriser et concevoir un algorithme de base, +- choisir une représentation appropriée des données, +- décomposer en sous-problèmes et affinements successifs, +- savoir organiser son code en fonctions et en modules. + +Le développement raisonné d’algorithmes et leur implantation +permet d'acquérir les qualités suivantes : + ++ Analyser et modéliser un problème, spécifier, ++ Exprimer une problématique, une solution ou un algorithme, ++ Traduire un algorithme dans un langage de programmation, ++ Concevoir une réponse à un problème précisément posé. diff --git a/AlgoApprofondie/cours/programme.txt b/AlgoApprofondie/cours/programme.txt new file mode 100644 index 0000000..6133cf1 --- /dev/null +++ b/AlgoApprofondie/cours/programme.txt @@ -0,0 +1,476 @@ +Définition d'un programme +========================== + +Qu'est-ce qu'un programme ? +---------------------------- + +- Un **programme** est une suite de **phrases** ; +- Une **phrase** est une **déclaration** ou une **expression** (*statement* en anglais) ; + +Production d'un programme : + +1. on écrit le code source du programme ; +2. on demande au compilateur de le traduire en code machine : c'est la compilation du programme ; +3. on demande à la machine d'effectuer le code machine : c'est l'exécution du programme. + +.. important:: + + L'introduction à la compilation et les différentes phases de la compilation + d'un programme sont des sujets qui ne seront pas traités dans ce cours. + +Dans un programme de base, il y a deux fichiers : + +1. un fichier contenant le code : c'est le source du programme. +2. un fichier contenant le code machine : c'est l'exécutable. + +Que peut faire un programme lorsqu'il est exécuté ? +Le programme doit communiquer. S'il reste isolé, il ne pourra pas +produire quoi que ce soit. Voici les trois moyens de communication qu'a un +programme : + +1. communiquer avec l'utilisateur, +2. communiquer avec des fichiers, +3. communiquer avec d'autres programmes. + +Les expressions +---------------- + +expression + + Une expression est une valeur caculée du langage, une opération arithmétique + qui retourne une valeur (entier, texte, valeur logique...). + C'est donc une suite sémantiquement correcte de **valeurs de base** et **d'opérateurs** + +Par exemple, la ligne suivante est une expression effectuant une addition:: + + 5 + 6 + +Expressions à partir de types de base +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Autres exemples d'expressions : + +- 5 est une expression de type int +- 4.5 est une expression de type float +- 'c' est une expression de type char +- true est une expression de type bool +- print ('c') est une expression de type None +- raw_input est une expression de type string + +Les expressions se complexifient avec la complexification des données et des traitements, +mais le principe de l'expressivité d'un langage reste le même. + + +.. ifconfig:: exercice + + **Exercice** : + Le parenthésage et les opérateurs booléens:: + + Variables A, B, C, D, E en Booléen + Variable X en Entier + Début + Lire X + A <- X > 12 + B <- X > 2 + C <- X < 6 + D <- (A ET B) OU C + E <- A ET (B OU C) + Ecrire D, E + Fin + + **Que valent D et E si X = 3 ?** + + +.. ifconfig:: correction + + **Correction** : D sera VRAI alors que E sera FAUX + + + + +Les déclarations +----------------- + +Un autre exemple d'expression : + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple d'expression} + \begin{algorithmic}[1] + \BState \emph{sortie}: $l$ \Comment{C'est l'expression calculée renvoyée} + \ForAll {$v \in V(G)$} + \State $l(v) \leftarrow \infty$ + \EndFor + \State $l(u) \leftarrow 0$ + \Repeat + \For {$i \leftarrow 1, n$} + \State $min \leftarrow l(v_i)$ + \For {$j \leftarrow 1, n$} + \If {$min > e(v_i, v_j) + l(v_j)$} + \State $min \leftarrow e(v_i, v_j) + l(v_j)$ + \State $p(i) \leftarrow v_j$ + \EndIf + \EndFor + \State $l(i) \leftarrow min$ + \EndFor + \State $changed \leftarrow l \not= l’$ + \State $l \leftarrow l$ + \Until{$\neg changed$} + \end{algorithmic} + \end{algorithm} + +Exemple de déclarations : + +- `a = 1` +- `b = 'c'` + +.. important:: Le signe égal est utilisé de deux manières + + - lors d'une déclaration d'une expression + - lorsque deux expressions sont équivalentes + + Suivant les langages, il y a deux symboles différents, ou alors + ils sont identiques. + +Il s'agit de **renseigner** une valeur dans une expression nommée + +- en javascript : + +.. code-block:: javascript + + var b = "blabla" ; + +- en python : + +.. code-block:: python + + b = "blabla" + +- en java : + +.. code-block:: java + + String b = "A"; + +- en OCaml : + +.. code-block:: ocaml + + let a = 1 + +Grâce au mécanisme d'inférence de type dans OCaml, le mot-clef **let** +signifie ici véritablement l'instanciation d'une valeur au sens +mathématique du terme : soit `a` l'entier tel que a soit égal à 1... + +En OCaml comme dans tous les langages fonctionnels, tout ce que nous avons l'habitude +d'appeler des "variables" à propos des affectations, sont en fait des **constantes** +au sens du paradigme impératif de la programmation. + +.. important:: + + Par voie de conséquence, le symbole ``=`` est utilisé à la fois pour la définition des objets et pour le test d'égalité. + Pour les autres langages, on utilise `==` ou bien `===` (javascript) car + le `=` est sémantiquement déjà utilisé... + +Toutes ces notation, apparemment anodines, correspondent donc à des paradigmes de programmation + +Lorsqu'on ne déclare pas les types des symboles déclarés, c'est que soit + +- le typage est faible +- le typage est dynamique (calcul du type en fonction du contenu de la + variable) +- le typage est statique et fort mais ça ne se voit pas + (var le système les calcule automatiquement par inférence de type) + +Assigner, allouer, affecter une chose à quelqu'un ou à une autre chose. + +Exemples dans la langue française : + +- Le traitement que le budget **alloue** à ces fonctionnaires. +- Un système d'exploitation multitâche alloue le travail du processeur aux processus en attente, pour un bref laps de temps, à leur tour. + +.. glossary:: + + affectation + + Une affectation, aussi appelée assignation par anglicisme, est une structure qui permet d'attribuer une valeur à une variable. + + Il s'agit d'une structure particulièrement courante en programmation impérative, et dispose souvent pour cette raison d'une notation courte et infixée, + comme ``x = expr`` ou ``x := expr`` ou encore `x <- expr`. + Dans certains langages, le symbole est considéré comme un opérateur d'affectation, + et la structure entière peut alors être utilisée comme une expression. + D'autres langages considèrent une affectation comme une instruction et ne permettent pas cet usage. + +Voir aussi : + +- Les déclarations de types primitifs et conversions de type +- Les types de base:: + + Octets (8 bits) byte + Entiers courts (16 bits) short + Entiers (32 bits) int + Entiers longs (64 bits) long + Réels (32 bits) float + Réels longs (64 bits) double + Caractères (16 bits) char + Booléens boolean + +- Déclarations par lots:: + + x1 = e1, x2 = e2, ... xn = en; + +Exercices : algorithmes sur les affectations + +.. ifconfig:: exercice + + **Exercice** : Calculs d'affectation:: + + Variables A, B, C en Entier + Début + A <- 3 + B <- 10 + C <- A + B + B <- A + B + A <- C + Fin + +.. ifconfig:: correction + + **Correction**:: + + Après La valeur des variables est : + A <- 5 A = 5 B = ? + B <- 2 A = 5 B = 2 + A <- B A = 2 B = 2 + B <- A A = 2 B = 2 + +.. ifconfig:: exercice + + **Exercice** : Calculs d'affectation + Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ? + :: + + Variables A, B en Entier + Début + A <- 5 + B <- 2 + A <- B + B <- A + Fin + +.. ifconfig:: correction + + **Correction**:: + + Après La valeur des variables est : + A <- 5 A = 5 B = ? + B <- 2 A = 5 B = 2 + A <- B A = 2 B = 2 + B <- A A = 2 B = 2 + +.. ifconfig:: exercice + + **Exercice** : écrire un algorithme permettant d’échanger les valeurs + de deux variables A et B, et ce quel que soit leur contenu préalable. + +.. ifconfig:: correction + + **Correction**:: + + Début + A <- n + B <- p + C <- A + A <- B + B <- C + Fin + + Il faut passer par une variable dite temporaire (la variable C) + + +.. ifconfig:: exercice + + **Exercice** : + Que produit l’algorithme suivant ? + + :: + + Variables A, B, C de type entier + Début + A <- 423 + B <- 12 + C <- A + B + Fin + +.. ifconfig:: correction + + **Correction** : dans un prompt python + + .. code-block:: python + + >>> a = 423 + >>> b = 12 + >>> c = a + b + >>> c + 435 + +.. ifconfig:: exercice + + **Exercice** : + Que produit l’algorithme suivant ? + + :: + + Variables A, B, C de type texte + Début + A <- "423" + B <- "12" + C <- A + B + Fin + +.. ifconfig:: correction + + **Correction** : dans un prompt python + + .. code-block:: python + + >>> a = '423' + >>> b = '12' + >>> c = a + b + >>> c + '42312' + +Interaction avec l'utilisateur +------------------------------ + +Il est possible de communiquer de la manière suivante avec un programme : + +- lire et écrire sur l'entrée/sortie standard +- lire et écrire dans un fichier +- afficher (du texte, un nombre...) +- lire (du texte, un nombre...) +- interagir avec les prompts + + +.. code-block:: ocaml + + let x = read_int () in + let signe = + if x >= 0 + then " positif " + else " négatif " in + print_string signe + + +.. ifconfig:: exercice + + **Exercice** : écrire un algorithme qui demande le prénom d'une personne + et renvoie "bonjour, je m'appelle " + +.. ifconfig:: correction + + **Correction** : (implémentation en python) + + .. code-block:: python + + # coding: utf-8 + prenom = raw_input("quel est ton prénom ? \n") + print("bonjour, je m'appelle " + prenom.capitalize()) + + +La REPL (boucle d'interaction) +------------------------------- + +.. glossary:: + + REPL + + Read Eval Print Loop : outil principal de communication avec un programme + ou avec un système. Exemples : la console python, le prompt OCaml. + + interface + + outil de communication avec un programme. + + - interface texte + - interface graphique + +**Exemples de REPL** + +Le prompt python:: + + Python 2.7.12 (default, Nov 19 2016, 06:48:10) + [GCC 5.4.0 20160609] on linux2 + Type "help", "copyright", "credits" or "license" for more information. + >>> + >>> dir() + ['__builtins__', '__doc__', '__name__', readline', 'rlcompleter'] + >>> + +Le prompt ipython:: + + Python 2.7.12 (default, Nov 19 2016, 06:48:10) + Type "copyright", "credits" or "license" for more information. + + IPython 2.4.1 -- An enhanced Interactive Python. + ? -> Introduction and overview of IPython's features. + %quickref -> Quick reference. + help -> Python's own help system. + object? -> Details about 'object', use 'object??' for extra details. + + In [1]: + +Le prompt OCaml (utop):: + + Type #utop_help for help about using utop. + + ─( 09:21:24 )─< command 0 >── + utop # + # let x = 1 in x + 2;; + - : int = 3 + # let y = 1 + 2;; + val y : int = 3 + # y * y;; + - : int = 9 +Construire une boucle d'interaction avec l'utilisateur en python:: + + #!/usr/bin/env python3 + error = True + while error: + try: + entier = int(input('donnez un entier : ')) + error = False + except: + print('une valeur entiere est attendue') + print(entier) + +Lire et écrire dans un fichier +------------------------------ + +Les descripteurs de fichiers (file handle) + +Exemple en python + +.. code-block:: python + + >>> fh = file("test.txt", "w") + >>> fh.write("un contenu exemple") + >>> fh.close() + >>> + +.. code-block:: python + + >>> fh.read() + 'un contenu exemple' + >>> fh.close() + >>> + +Linéarisation (serialisation) de données par exemple en json + +.. code-block:: python + + import json + data = dict(a='essai', b='essai2', c=range(3)) + with open('data.txt', 'w') as outfile: + json.dump(data, outfile) diff --git a/AlgoApprofondie/cours/tp.txt b/AlgoApprofondie/cours/tp.txt new file mode 100644 index 0000000..3d3ebd5 --- /dev/null +++ b/AlgoApprofondie/cours/tp.txt @@ -0,0 +1,101 @@ +Travaux Pratiques +================= + +.. ifconfig:: exercice + + **travaux pratiques :** + + Ecrire un algorithme qui renvoie le résultat d’une mini-calculatrice. Cette + méthode aura + comme paramètre deux nombres et une chaîne de caractère qui vaudra « + », « - + », « * », + « / ». + +.. ifconfig:: exercice + + **travaux pratiques :** + + + Ecrire un algorithme qui renvoie si deux mots (chaîne de caractères) passés en + paramètre + sont des anagrammes l’un de l’autre. (Lettres identiques mais dans un ordre + différent) + + +.. ifconfig:: exercice + + **travaux pratiques :** + + ascii art (ligne d'étoiles) + + Concevoir un algorithme qui, pour un caractère imprimable et un nombre n + donnés, imprime une barre + horizontale de n de ces caractères. + + ``****************`` + + 2. Modifier l’algorithme pour l’impression d’une barre double. + + :: + + **************** + **************** + + 3. Modifier l’algorithme pour l’impression d’une barre d’épaisseur quelconque + donnée. + 4. (optionnel) Transformer les algorithmes ci-dessus en fonctions. + 5. Écrire un programme Java implémentant la dernière version de l’algorithme + (épaisseur quelconque). + + 3.3 + Triangle de nombres + Concevoir un algorithme qui imprime pour n donné:: + + 1 + 1 2 + 1 2 3 + 1 2 3 4 + 1 2 3 4 5 + ........... + ............. + ............... + 1 2 3 4 5 6 ... n + +.. ifconfig:: exercice + + **travaux pratiques :** + + code de césar : faire un programme pour chiffrer et déchiffrer par décalage + + exemples : Effectue une rotation de x caractères vers la droite:: + + >>> print(chiffre('bonjour', 3)) + erqmrxu + >>> print(chiffre('Bonjour les amis!', 3)) + Erqmrxu ohv dplv! + >>> print(chiffre('Erqmrxu ohv dplv!', 23)) + Bonjour les amis! + +.. ifconfig:: exercice + + **travaux pratiques :** + + :: + + écrire “Entrer un numéro de mois” + mois <- lire + selon que mois est + cas 1 : écrire “janvier (31 jours)” + cas 2 : écrire “février (28 ou 29 jours)” + cas 3 : écrire “mars (31 jours)” + cas 4 : écrire “avril (30 jours)” + cas 5 : écrire “mai (31 jours)” + cas 6 : écrire “juin (30 jours)” + cas 7 : écrire “juillet (31 jours)” + cas 8 : écrire “août (31 jours)” + cas 9 : écrire “septembre (30 jours)” + cas 10 : écrire “octobre (31 jours)” + cas 11 : écrire “novembre (30 jours)” + cas 12 : écrire “décembre (31 jours)” + défaut : écrire “numéro invalide” + fselon diff --git a/AlgoApprofondie/diapos/Makefile b/AlgoApprofondie/diapos/Makefile new file mode 100644 index 0000000..fd60fc0 --- /dev/null +++ b/AlgoApprofondie/diapos/Makefile @@ -0,0 +1,47 @@ +RST = python tools/rst.py + +TEXDOCUMENTS = $(basename $(wildcard *.tex)) +RSTDOCUMENTS = $(basename $(wildcard *.txt)) + +SOURCES = $(addsuffix .tex,$(TEXDOCUMENTS)) +DVI = $(addsuffix .dvi,$(TEXDOCUMENTS)) +POSTSCRIPT = $(addsuffix .ps,$(TEXDOCUMENTS)) +POSTSCRIPT_GZ = $(addsuffix .ps.gz,$(TEXDOCUMENTS)) +PDF = $(addsuffix .pdf,$(TEXDOCUMENTS)) +RSTSOURCES = $(addsuffix .txt,$(RSTDOCUMENTS)) +HTML = $(TEXDOCUMENTS) $(addsuffix .html,$(RSTDOCUMENTS)) + +all: dvi ps ps.gz html +dvi: $(DVI) +ps: $(POSTSCRIPT) +ps.gz: $(POSTSCRIPT_GZ) +pdf: $(PDF) +html: $(HTML) + + +${DVI}: %.dvi: %.tex + latex $< + latex $< + +${POSTSCRIPT}: %.ps: %.dvi + dvips -o $@ $< + +${POSTSCRIPT_GZ}: %.ps.gz: %.ps + gzip -c $< > $@ + +${PDF}: %.pdf: %.tex + rm -f $*.out $*.log $*.aux + xelatex $< + rm -f $*.out $*.log $*.aux + +%: %.tex %.dvi + latex2html -local_icons $< + touch $@ + +%.html: %.txt + $(RST) $< > $@ + + +clean: + rm -f -- *~ *.log *.aux *.out *.nav *.snm *.toc ${DVI} ${POSTSCRIPT} ${POSTSCRIPT_GZ} ${PDF} + rm -fr ${HTML} diff --git a/AlgoApprofondie/diapos/beamer.tex b/AlgoApprofondie/diapos/beamer.tex new file mode 100644 index 0000000..62eb264 --- /dev/null +++ b/AlgoApprofondie/diapos/beamer.tex @@ -0,0 +1,268 @@ +\documentclass[ignorenonframetext]{beamer} +\usepackage{graphicx} +% Internal links only wors with second screen on the right +% \setbeameroption{show notes on second screen} +\usetheme{Madrid} +\usecolortheme{dolphin} + +% gets rid of bottom navigation bars +\setbeamertemplate{footline}[frame number]{} + +% gets rid of navigation symbols +\setbeamertemplate{navigation symbols}{} + +%\usetheme{Warsaw} +%\usepackage[french]{babel} +%\usepackage[utf8,utf8x]{inputenc} +%\usepackage[T1]{fontenc} + + +% Replace babel +\usepackage{polyglossia} +\setdefaultlanguage{french} + +%% Require XeTeX +\usepackage{xltxtra} +\usepackage{fontspec} +\usepackage{xunicode} + +\logo{ + \hspace{120pt} + \includegraphics[width=2cm]{img/cesi.jpg}~ + \hspace{113pt} + \includegraphics[width=1cm]{img/logo-cadoles.png}~ +} + + +%%\setbeamertemplate{background}{\includegraphics[width=128mm]{beamer-skel/img/banner01.png}} + +\title[]{Algorithmique} + +\subtitle{CESI alternance} +\subtitle{promotion GMSI B3} + +\author[Gwenaël Rémond]{} + +%\institute[E.O.L.E]{\includegraphics[width=2cm]{beamer-skel/img/logo-eole.png}} +\institute[Cadoles]{\includegraphics[width=2cm]{img/cesi.jpg}} + +%\date{{\small 8 avril 2013}} + +\subject{Talks} + +\AtBeginSection[] % Add a TOC with current section highlighted +{ + \begin{frame} + \frametitle{Plan} + \tableofcontents[currentsection] + \end{frame} +} + + +\usepackage{hyperref} +\usepackage{hyperxmp} +\hypersetup{% + colorlinks=true,linkcolor=blue,urlcolor=blue,pdfpagemode=UseNone, + pdftitle={EAD3}, + pdfsubject={Présentation technique d'EWT}, + pdfauthor={EOLE}, + pdfkeywords={EOLE, J-EOLE, distribution, GNU, Linux, Éducation, + nationale, Ubuntu}, + pdflang={fr-FR}, + pdfcopyright={Copyright © 2017 Équipe EOLE }, % Require XeTeX + pdflicenseurl={http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}, +} + +\parskip=0.8em + +\begin{document} + +\frame{\titlepage} + +\section{Introduction} +\begin{frame} +\frametitle{Objectifs} + +\texttt{ + "Il ne suffit pas d'avoir les mains propres, \\ + il faut aussi avoir l'esprit pur."\\ +} +\emph{Thalès ; VIe s. av. J.-C.} + +\begin{itemize} +\item<1-> maîtriser et concevoir un algorithme, +\item<2-> choisir une représentation appropriée des données, +\item<3-> décomposer en sous-problèmes et affinements successifs, +\item<4-> savoir organiser son code et faire des petits programmes en python. +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{L'art de programmer} +\texttt{GEEK SUBLIME (Vikram CHANDRA) +Une vision esthétique, littéraire, mathématique du codage} + +\begin{itemize} +\item<1-> Programmer, c'est abstraire, prendre du recul. +\item<2-> Abstraire, par rapport à quoi ? Par rapport à la machine +\item<3-> Les niveaux d'abstraction par rapport à la machine +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Les langages de programmation} +\begin{itemize} +\item Qu'est-ce qu'un langage de programmation ? +\item Les grands paradigmes de programmation (procédural, objet, fonctionnel, modulaire, générique \dots) +\item L'historique des langages. +\end{itemize} +\end{frame} + +\section{Algorithmique} +\begin{frame} +\frametitle{Les algorithmes} +\begin{itemize} +\item définition d'un algorithme +\item implémentation d'un algorithme +\item représentation d'un algorithme dans un langage cible +\end{itemize} +\end{frame} + +\section{Algorithmique pour la programmation} + +\begin{frame} +\frametitle{Qu'est-ce qu'un programme ?} +\begin{itemize} +\item <1-> Les expressions +\item <2-> Les déclarations +\item <3-> La REPL (Read Eval Print Loop) +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Approche générale des fonctions} +\begin{itemize} +\item Les procédures +\item La portée d'une variable +\item Les fonctions +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Les structures de contrôle} +\begin{itemize} +\item Le branchement conditionnel +\item L'itération +\item \dots +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Les structures de données} +\begin{itemize} +\item Les listes +\item Les dictionnaires +\item Les arbres, les graphes \dots +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{L'état de l'art de l'agorithmique} +\begin{itemize} +\item en mathématiques + \begin{itemize} + \item algorithmique algébrique, + \item arithmétique modulaire, + \item \dots + \end{itemize} +\item en informatique + \begin{itemize} + \item en informatique fondamentale + \item en langages de programmation + \item dans touts les domaines où l'informatique intervient\dots + \end{itemize} +\item en sciences physique, en biologie +\item en sciences sociales (réseaux sociaux, auto-organisation\dots) +\end{itemize} +\end{frame} + +\section{Programmation modulaire} +\begin{frame} +\frametitle{La programmation modulaire} +\begin{itemize} +\item La programmation raisonnée +\item Le paradigme modulaire vs le paradigme objet +\item exemple de programmation modulaire en python +\end{itemize} +\end{frame} + + + + +% Not present in TOC +\appendix + +\begin{frame}[label=thanks]{Remerciements} + + Je remercie la communauté du logiciel libre pour tous ces + merveilleux logiciels sans lesquels si peu de choses existeraient. + + Cette présentation a été réalisée grâce aux logiciels libres + suivants~: + + \begin{itemize} + \item Le système de composition \LaTeX{} + \href{https://fr.wikipedia.org/wiki/TeX_Live}{TeX Live} + \item L'éditeur de texte + \href{http://www.vim.org/}{Vim} + \item L'environnement graphique + \href{http://gnome.org/}{Gnome} + \item Le système d'exploitation + \href{https://debian.org/}{Debian} + \end{itemize} + + \begin{center} + % Do not mess with graphics + \hypersetup{hidelinks} + \begin{tabular}{cccccc} + \href{http://www.gnu.org}{\includegraphics[height=1.3cm]{graphics/gnu-head.pdf}} & + \href{http://www.kernel.org}{\includegraphics[height=1.2cm]{graphics/tux.pdf}} & + \href{http://www.debian.org/}{\includegraphics[height=1cm]{graphics/debian.eps}} & + \href{https://fr.wikipedia.org/wiki/TeX_Live}{\includegraphics[height=1cm]{graphics/texlive.pdf}} + \end{tabular} + \end{center} + +\end{frame} + +\begin{frame}[label=license]{Licence} + Cette présentation est mise à disposition sous licence\\ + \href{http://creativecommons.org/licenses/by-sa/4.0}% + {Creative Commons \textsc{by-sa 4.0}} + \begin{columns}[t] + \begin{column}{5.5cm} + \begin{itemize} + \item Attribution + \end{itemize} + \end{column} + \begin{column}{6.5cm} + \begin{itemize} + \item Partage dans les mêmes conditions + \end{itemize} + \end{column} + \end{columns} + Vous pouvez obtenir une copie de la licence + \begin{block}{par Internet} + \href{http://creativecommons.org/licenses/by-nc-sa/4.0}% + {\url{http://creativecommons.org/licenses/by-nc-sa/4.0}} + \end{block} + \begin{block}{par courrier postal} + \begin{quote} + Creative Commons\\ + 444 Castro Street, Suite 900 Mountain View,\\ + California, 94041, USA. + \end{quote} + \end{block} +\end{frame} + +\end{document} diff --git a/AlgoApprofondie/diapos/graphics/Logo-EOLE.eps b/AlgoApprofondie/diapos/graphics/Logo-EOLE.eps new file mode 100644 index 0000000..13f4889 --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/Logo-EOLE.eps @@ -0,0 +1,133 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.8 (http://cairographics.org) +%%CreationDate: Tue May 16 12:20:58 2017 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%BoundingBox: 0 -1 232 85 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 -1 232 85 +%%EndPageSetup +q 0 -1 232 86 rectclip q +0.290196 0.247059 0.454902 rg +133.668 16.757 m 133.668 16.757 133.25 1.257 148.941 1.257 c 176.328 1.257 + l 170.723 3.749 168.633 5.874 164.891 10.585 c 150.969 10.585 l 147.234 + 10.585 145.441 13.222 145.441 17.538 c 145.441 17.538 145.492 75.363 145.414 + 75.445 c 142.301 82.999 133.668 84.519 133.668 84.519 c 133.668 83.995 +133.676 39.347 133.668 16.757 c h +133.668 16.757 m f +41.039 38.73 m 41.207 38.808 41.25 38.921 41.457 39.109 c 41.5 40.347 41.375 + 41.511 41.164 42.823 c 40.625 46.238 40.664 49.726 41.207 53.07 c 41.125 + 53.214 l 41.043 53.366 40.914 53.405 40.914 53.405 c 40.664 53.48 40.414 + 53.554 40.121 53.515 c 35.613 53.366 31.141 52.577 26.758 51.265 c 24.457 + 50.702 22.16 50.14 19.863 49.577 c 17.984 49.015 16.688 48.152 15.812 46.913 + c 16.062 46.839 16.145 46.691 16.23 46.538 c 16.48 46.464 l 16.395 46.238 + l 15.98 45.863 15.812 45.409 15.895 44.886 c 15.977 44.738 16.105 44.698 + 16.188 44.55 c 16.523 44.327 16.859 44.101 17.062 43.909 c 17.234 43.988 + 17.234 43.988 17.355 43.952 c 17.523 44.027 17.816 44.062 18.023 44.249 + c 18.316 44.288 18.445 44.249 18.57 44.21 c 24.836 43.464 30.973 41.999 + 37.027 39.933 c 37.152 39.894 37.281 39.855 37.242 39.749 c 37.324 39.597 + 37.449 39.558 37.406 39.445 c 37.91 39.296 l 38.91 38.995 39.785 38.734 + 40.75 38.698 c 40.914 38.769 40.914 38.769 41.039 38.73 c 39.117 40.687 + m 38.117 40.988 l 39.078 40.948 l 39.16 40.796 39.117 40.687 39.117 40.687 + c f +49.855 72.859 m 49.855 72.859 54.316 79.749 63.262 84.269 c 13.684 84.269 + l 0.484 84.269 0.527 73.152 0.527 73.152 c 0.527 17.499 l 0.527 17.499 +0.117 1.984 15.809 1.984 c 64.07 1.984 l 58.465 4.472 54.559 8.597 50.816 + 13.308 c 50.816 13.308 15.844 13.296 15.891 13.308 c 11.449 13.308 12.086 + 17.542 12.086 17.542 c 12.156 69.034 l 12.156 73.109 15.902 72.859 15.902 + 72.859 c f +69.723 45.148 m 69.723 45.148 66.891 28.866 79.219 23.05 c 84.949 20.351 + 89.504 19.945 95.855 22.363 c 99.852 23.882 103.457 27.659 104.977 31.769 + c 106.496 35.878 105.191 40.874 101.199 44.757 c 99.793 38.538 98.297 33.53 + 92.91 30.741 c 89.711 29.116 86.457 29.386 83.211 30.995 c 79.961 32.605 + 77.473 36.48 76.484 40.363 c 76.484 40.363 74.473 47.585 82.195 59.417 +c 75.809 56.718 70.875 52.245 69.723 45.148 c h +69.723 45.148 m f +0.945098 0.792157 0.0745098 rg +110.621 8.773 m 117.836 13.503 123.312 20.792 125.211 30.261 c 125.238 +30.429 l 126.707 37.968 125.305 45.933 121.43 52.601 c 117.527 59.308 110.711 + 64.777 102.098 65.82 c 102.074 65.831 l 96.797 66.464 90.988 64.273 86.93 + 60.507 c 82.406 55.163 80.273 51.816 80.387 44.03 c 84.254 49.132 94.043 + 54.202 100.949 53.523 c 105.414 52.984 108.629 50.445 110.898 46.542 c +113.168 42.636 114.066 37.445 113.184 33.058 c 110.383 19.085 94.641 12.073 + 81.125 15.976 c 62.398 21.382 55.426 40.464 63.086 58.038 c 72.824 73.859 + 90.422 80.905 113.074 77.519 c 105.887 85.03 93.703 83.984 93.703 83.984 + c 82.363 84.874 61.398 78.519 53.613 63.808 c 42.234 42.316 52.059 11.566 + 78.055 4.062 c 89.188 0.847 101.344 2.695 110.621 8.777 c h +110.621 8.773 m f +0.290196 0.247059 0.454902 rg +194.387 67.495 m 185.594 67.495 178.215 64.179 172.285 57.597 c 166.355 + 51.011 164.41 42.503 164.41 32.046 c 164.41 20.98 166.184 15.999 171.609 + 9.894 c 180.992 -1.075 203.68 1.32 210.367 1.402 c 217.055 1.484 219.438 + 1.644 231.012 0.57 c 228.027 5.839 220.824 9.495 218.348 10.011 c 206.766 + 12.195 193.328 8.179 181.414 15.484 c 176.691 19.57 175.734 22.14 175.559 + 29.62 c 223.012 29.62 l 223.012 35.269 l 223.012 45.374 219.598 53.257 +214.785 58.945 c 208.164 64.816 201.25 67.409 194.387 67.495 c h +194.184 58.421 m 199.434 58.421 203.531 56.702 206.484 53.245 c 209.438 + 49.788 211.941 44.956 211.984 38.745 c 175.684 38.745 l 175.715 44.808 +177.715 49.339 181.262 52.972 c 184.805 56.601 189.109 58.421 194.184 58.421 + c h +194.184 58.421 m f +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/AlgoApprofondie/diapos/graphics/Logo-EOLE.svg b/AlgoApprofondie/diapos/graphics/Logo-EOLE.svg new file mode 100644 index 0000000..f55c0d7 --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/Logo-EOLE.svg @@ -0,0 +1,1277 @@ + + + +image/svg+xml       \ No newline at end of file diff --git a/AlgoApprofondie/diapos/graphics/Logo-EOLEienne.eps b/AlgoApprofondie/diapos/graphics/Logo-EOLEienne.eps new file mode 100644 index 0000000..72c3b78 --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/Logo-EOLEienne.eps @@ -0,0 +1,318 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.8 (http://cairographics.org) +%%CreationDate: Tue May 16 12:15:46 2017 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%BoundingBox: 0 -1 1660 851 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%BeginResource: font DejaVuSans-Bold +11 dict begin +/FontType 42 def +/FontName /DejaVuSans-Bold def +/PaintType 0 def +/FontMatrix [ 1 0 0 1 0 0 ] def +/FontBBox [ 0 0 0 0 ] def +/Encoding 256 array def +0 1 255 { Encoding exch /.notdef put } for +Encoding 32 /space put +/CharStrings 2 dict dup begin +/.notdef 0 def +/space 1 def +end readonly def +/sfnts [ +<000100000009008000030010637674203eb93108000000e8000002546670676d5b026bf00000 +033c000000ac676c7966e2f9cb840000009c0000004c686561640e24be09000003e800000036 +686865610eaf07730000042000000024686d74780796006600000444000000086c6f63610000 +00980000044c0000000c6d6178700647062d0000045800000020707265707c61a2e700000478 +000007a700020066fe96046605a400030007001fbc00040126000000060126b6010805890204 +002fc4d4ec310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f27206 +2900000001660133016600bc00e90000013d00a200fa031f00020002006601660002000200ac +015400ec00bc006201660181048501540166016d04a400020166007f04cd0000000201330062 +00710000002504a401bc00ba00e500660181018d0548055a0166016d000000000002000200f6 +05c301f0053902390058046d043d04b2048104b2016601750466048100b00466043902d1049c +047b04cf047b005801330166014c0166014c000200ac009a014a0123009a029a014401190144 +02cd00c100000166013f019a013b05cb05cb00d500d5015000ac00ac0077020a01c701f2012f +015801b2012300f600f6011f012f0135023501ee01e70133009800d10358050a009a008f0112 +009800bc00cd00e500e500f2007304000166008f05d5022b05d500c300e100d700e50000006a +01020000001d032d05d505d505f000a8006a00ec00e1010205d506140721046602f800ec0183 +02a602f80123010201020112011f031f005e03cd046004c7048900ec01bc00ba01020333031f +03420333035c0112011f05d5019a009a00e106660179046004600460047b000000ec02c302b8 +02cd00be00dd00d50000006a025c027b029a00dd01ae01ba01120000008501ae04600762041b +009a069a045800ee009a029a00d102cd019a015005cb05cb008b008b063100f6040600f0034c +016004a800c10000002505c101000121074a06120096014a078300a800000337007b00140000 +00c9010005c105c105c105c101000108061d00960427039e00ec0102027d0133009800d10358 +017900cd02390362009c009c009c009301b8009300b80073000014000326b707060504030201 +002c2010b002254964b040515820c859212d2cb002254964b040515820c859212d2c20100720 +b00050b00d7920b8ffff5058041b0559b0051cb0032508b0042523e120b00050b00d7920b8ff +ff5058041b0559b0051cb0032508e12d2c4b505820b80128454459212d2cb002254560442d2c +4b5358b00225b0022545445921212d2c45442d2cb00225b0022549b00525b005254960b02063 +68208a108a233a8a10653a2d0001000000025eb8b54203fc5f0f3cf5001f080000000000d3d9 +0a2000000000d3d90a20f772fcae0fcd096500010008000000010000000000010000076dfe1d +00001021f772f9320fcd00010000000000000000000000000000000204cd006602c900000000 +00000000004c0000004c000100000002034e002b0078000c0002001000400008000005ed0221 +0008000441840280012600fe000301250011000301240121003a0005012400fa000301230016 +000301220121003a0005012200fe00030121003a0003012000fa0003011f00bb0003011e0064 +0003011d00fe0003011c00190003011b001e0003011a00fe0003011900fe0003011800fe0003 +011700fe0003011600fe000301150114000e0005011500fe00030114000e0003011300fe0003 +011200fe0003010f010e007d0005010f00fe0003010e007d0003010d010c008c0005010d00fe +0003010d00c00004010c010b00590005010c008c0003010c00800004010b010a00260005010b +00590003010b00400004010a00260003010900fe0003010800fe00030107000c000301070080 +00040106b2972e054113010600fa0003010500fa0003010400fe0003010300190003010200fa +0003010100fa0003010040ff7d03ff3e03fefe03fcfb2c05fcfe03fb2c03fafe03f9f84705f9 +7d03f84703f7fa03f6fe03f5fe03f4fe03f3bb03f2fe03f1fe03f0fe03ef1e03eefe03edec0a +05edfe03ec0a03ec4004ebea0a05eb3203ea0a03e9fa03e8911605e8fe03e7fa03e6fa03e591 +1605e5fe03e4fe03e3fe03e2fe03e1fe03e0fe03dffe03defa03dddc1805dd6403dc1803dba0 +1e05db6403dad92505dafa03d92503d8d12505d8fa03d7d61405d71603d6d51005d61403d510 +03d4d30b05d42003d30b03d2d12505d2fa03d1911605d12503d0940c05d02303cfce1405cf26 +03cecd1205ce1403cd1203cc911605cc1d03cb1403cac9bb05cafe03c9c85d05c9bb03c98004 +c840ffc72505c85d03c84004c72503c6fe03c56403c4901005c4fe03c31c03c2fe03c1fe03c0 +bf3a05c0fa03bfad1b05bf3a03bebd1a05be3203bdbc1105bd1a03bcbb0f05bc1103bbba0c05 +bb0f03ba0c03b9911605b9fe03b8fe03b71503b61203b5fe03b4fe03b3fe03b21703b11903b0 +1603afad1b05affa03aead1b05aefa03ad911605ad1b03ac911605ac7d03abfe03aa2603a9fe +03a8fe03a7fe03a6fe03a50a03a4fe03a3a20e05a3fe03a20e03a24004a1a01e05a1fa03a091 +1605a01e039f9116059ffa039e940c059e1c039dfe039c9bbb059cfe039b9a5d059bbb039b80 +049a8f25059a5d039a400499fe0398972e0598fe03972e0396911605961e40ff0395940c0595 +2003940c0393911605934b039291160592fe03919010059116039010038f25038efe038dfe03 +8cfe038bfe038afe0389fe038887250588fe0387250386fe0385fe0384320383960382fe0381 +fe038019037f0a037efe037dfe037cfe037bfa037afa0379fe037776a60577fe0376a6037574 +1b0575fa03741b0373fa03727d0371fe03706f2c056f2c036efa036dfa036cfa036bfe036afe +0369fe0368630c0568320367fe0366320365640a0565fe03640a0364400463620a05630c0362 +0a0361601505619603600111056015035f0a035efe035dfe035c0111055cfe035b5a1b055bfe +035a0111055a1b0359fe0358fa0357fe035601110540ff56fe0355fe03541e03531403525119 +0552fa0351011105511903504f190550fa034f4e11054f19034e11034d1e034c4b14054c1503 +4b4a11054b14034a490e054a1103490e0348fa034746140547150346140345fa0344430e0544 +0f03430e034241250542fa0341011105412503403f0f0540fe033f3e0e053f0f033e0e033d3c +0d053d16033c0d033b64033afe0339140338fe0337130336351a0536250335341405351a0335 +c004340a0d0534140334800433320c05331403334004320c033130a60531fe033001110530a6 +032f0c032e13032d2c3a052dfa032c1525052c3a032b64032a640329fe032815032717110527 +1e03262003251e0324231105402b241e0323110322000d0522fa03210f032140042014031f0a +031e1e031d1c19051d25031c0f13051c19031cb801004091041b0d031a194b051a7d03190111 +05194b0318fe031711031615250516fa031501110515250314640313110312fe031101110511 +fe031064030f0e10050f13030fc0040e10030e80040d0111050dfa030c32030b0a0d050b1603 +0b80040a0d030a400409fe0308fe0307fe0306050a0506fe03050a0305400404fa0303640302 +01110502fe0301000d05011103000d0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b1d0000> +] def +/f-0-0 currentdict end definefont pop +%%EndResource +%%BeginResource: font DejaVuSans +11 dict begin +/FontType 42 def +/FontName /DejaVuSans def +/PaintType 0 def +/FontMatrix [ 1 0 0 1 0 0 ] def +/FontBBox [ 0 0 0 0 ] def +/Encoding 256 array def +0 1 255 { Encoding exch /.notdef put } for +Encoding 32 /space put +/CharStrings 2 dict dup begin +/.notdef 0 def +/space 1 def +end readonly def +/sfnts [ +<0001000000090080000300106376742000691d39000000e0000001fe6670676d7134766a0000 +02e0000000ab676c7966f9f1ddd70000009c00000044686561640d13be360000038c00000036 +686865610d9f076f000003c400000024686d747807580066000003e8000000086c6f63610000 +0088000003f00000000c6d617870046f0671000003fc00000020707265703b07f1000000041c +0000056800020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4d4ec +310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f2720629013500b8 +00cb00cb00c100aa009c01a600b800660000007100cb00a002b20085007500b800c301cb0189 +022d00cb00a600f000d300aa008700cb03aa0400014a003300cb000000d9050200f4015400b4 +009c01390114013907060400044e04b4045204b804e704cd0037047304cd04600473013303a2 +055605a60556053903c5021200c9001f00b801df007300ba03e9033303bc0444040e00df03cd +03aa00e503aa0404000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd009a +009a006f00cb00cd019e01d300f000ba018300d5009803040248009e01d500c100cb00f60083 +0354027f00000333026600d300c700a400cd008f009a0073040005d5010a00fe022b00a400b4 +009c00000062009c0000001d032d05d505d505d505f0007f007b005400a406b80614072301d3 +00b800cb00a601c301ec069300a000d3035c037103db0185042304a80448008f013901140139 +0360008f05d5019a0614072306660179046004600460047b009c00000277046001aa00e90460 +0762007b00c5007f027b000000b4025205cd006600bc00660077061000cd013b01850389008f +007b0000001d00cd074a042f009c009c0000077d006f0000006f0335006a006f007b00ae00b2 +002d0396008f027b00f600830354063705f6008f009c04e10266008f018d02f600cd03440029 +006604ee00730000140000960000b707060504030201002c2010b002254964b040515820c859 +212d2cb002254964b040515820c859212d2c20100720b00050b00d7920b8ffff5058041b0559 +b0051cb0032508b0042523e120b00050b00d7920b8ffff5058041b0559b0051cb0032508e12d +2c4b505820b0fd454459212d2cb002254560442d2c4b5358b00225b0022545445921212d2c45 +442d2cb00225b0022549b00525b005254960b0206368208a108a233a8a10653a2d0000010000 +00025eb862af5a3e5f0f3cf5001f080000000000d3d90a2c00000000d3d90a2cf7d6fc4c0e59 +09dc00000008000000010000000000010000076dfe1d00000efef7d6fa510e59000100000000 +00000000000000000000000204cd0066028b0000000000000000004400000044000100000002 +0354002b0068000c000200100099000800000415021600080004b8028040fffbfe03fa1403f9 +2503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603f02503ef8a4105effe03ee96 +03ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5e45305e59603e48a4105e453 +03e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603dcfe03db1203da7d03d9bb03 +d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe03d21b03d1fe03d0fe03cffe +03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c6851105c61c03c51603c4fe03c3fe +03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba1103b9862505b9fe03b8b7bb +05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004b52503b4fe03b39603b2fe03 +b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205ab2503aa1203a98a4105a9fa +03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03a16403a08a4105a096039ffe +039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a1003990a0398fe0397960d05 +97fe03960d03958a410595960394930e05942803930e0392fa039190bb0591fe03908f5d0590 +bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058cfe038b2e038a8625058a4103 +89880b05891403880b03878625058764038685110586250385110384fe038382110583fe0382 +110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c64037b5415057b25037afe0379fe +03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370fe036ffe036efe036c21036b +fe036a1142056a530369fe03687d036711420566fe0365fe0364fe0363fe0362fe03613a0360 +fa035e0c035dfe035bfe035afe0359580a0559fa03580a035716190557320356fe0355541505 +55420354150353011005531803521403514a130551fe03500b034ffe034e4d10054efe034d10 +034cfe034b4a13054bfe034a4910054a1303491d0d05491003480d0347fe0346960345960344 +fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e14033d3c0f053d12033c3b0d +053c40ff0f033b0d033afe0339fe033837140538fa033736100537140336350b05361003350b +03341e03330d0332310b0532fe03310b03302f0b05300d032f0b032e2d09052e10032d09032c +32032b2a25052b64032a2912052a25032912032827250528410327250326250b05260f03250b +0324fe0323fe03220f03210110052112032064031ffa031e1d0d051e64031d0d031c1142051c +fe031bfa031a42031911420519fe031864031716190517fe031601100516190315fe0314fe03 +13fe031211420512fe0311022d05114203107d030f64030efe030d0c16050dfe030c0110050c +16030bfe030a100309fe0308022d0508fe030714030664030401100504fe03401503022d0503 +fe0302011005022d0301100300fe0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b1d00> +] def +/f-1-0 currentdict end definefont pop +%%EndResource +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 -1 1660 851 +%%EndPageSetup +q 0 -1 1660 852 rectclip q +0 g +BT +115.200005 0 0 115.200005 1659.494566 0.0000456218 Tm +/f-0-0 1 Tf +( )Tj +ET +0.945098 0.792157 0.0745098 rg +158.102 787.356 m 160.379 829.535 l 190.289 799.809 l h +158.102 787.356 m f +21.06434 w +0 J +0 j +[] 0.0 d +4 M q 0.380357 -1 -0.775998 -0.295156 0 1266.965088 cm +471.528 27.38 m 435.436 6.755 l 471.344 -14.188 l h +471.528 27.38 m S Q +58.695 757.856 m 80.516 721.688 l 39.07 729.465 l h +58.695 757.856 m f +18.464385 w +q -1 0.699805 0.543047 0.775998 0 1266.965088 cm +-278.556 -404.865 m -310.193 -422.942 l -278.719 -441.304 l h +-278.556 -404.865 m S Q +10.25 623.512 m 41.414 613.496 l 14.113 596.141 l h +10.25 623.512 m f +17.112694 w +q -1 -0.121862 -0.110002 0.811158 0 1266.965088 cm +75.757 -781.871 m 46.436 -798.623 l 75.608 -815.637 l h +75.757 -781.871 m S Q +101.438 509.071 m 70.375 498.742 l 82.148 528.875 l h +101.438 509.071 m f +12.576204 w +q 1 0.937579 0.772771 -0.802194 0 1266.965088 cm +-330.318 558.711 m -351.867 546.4 l -330.429 533.894 l h +-330.318 558.711 m S Q +0.290196 0.247059 0.454902 rg +161.094 604.578 m 161.094 604.578 152.773 561.961 192.316 543.309 c 210.699 + 534.641 225.316 533.344 245.688 541.098 c 258.508 545.977 270.074 558.094 + 274.949 571.278 c 279.824 584.461 275.645 600.489 262.836 612.942 c 258.316 + 592.989 253.516 576.926 236.242 567.981 c 225.973 562.762 215.535 563.629 + 205.117 568.793 c 194.703 573.957 186.715 586.391 183.539 598.844 c 183.539 + 598.844 177.09 622.012 201.859 659.969 c 182.059 644.739 164.789 627.348 + 161.094 604.578 c h +161.094 604.578 m f +0.945098 0.792157 0.0745098 rg +293.059 497.508 m 316.207 512.684 333.766 536.067 339.859 566.434 c 339.953 + 566.977 l 344.664 591.156 340.164 616.715 327.734 638.102 c 315.219 659.625 + 293.348 677.164 265.715 680.52 c 265.637 680.531 l 248.703 682.571 230.078 + 675.531 217.055 663.453 c 202.543 646.313 195.703 635.578 196.059 610.594 + c 208.465 626.961 239.875 643.227 262.027 641.047 c 276.348 639.321 286.664 + 631.18 293.949 618.653 c 301.23 606.125 304.105 589.465 301.281 575.391 + c 292.289 530.563 241.789 508.082 198.43 520.598 c 138.359 537.934 116.312 + 599.153 133.5 657.778 c 160.254 711.746 268.816 729.453 286.945 734.754 + c 280.277 744.656 213.539 742.957 213.539 742.957 c 180.559 734.364 130.008 + 728.141 104.754 682.086 c 53.828 589.199 105.188 506.442 188.582 482.371 + c 224.301 472.059 263.293 477.992 293.055 497.504 c h +293.059 497.508 m f +0 g +BT +32.000001 0 0 32.000001 1361.895445 368.012451 Tm +/f-1-0 1 Tf +( )Tj +ET +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/AlgoApprofondie/diapos/graphics/Logo-EOLEienne.svg b/AlgoApprofondie/diapos/graphics/Logo-EOLEienne.svg new file mode 100644 index 0000000..7a2c713 --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/Logo-EOLEienne.svg @@ -0,0 +1,779 @@ + + + +image/svg+xml    \ No newline at end of file diff --git a/AlgoApprofondie/diapos/graphics/Logo-MENESR.jpg b/AlgoApprofondie/diapos/graphics/Logo-MENESR.jpg new file mode 100644 index 0000000..02d6870 Binary files /dev/null and b/AlgoApprofondie/diapos/graphics/Logo-MENESR.jpg differ diff --git a/AlgoApprofondie/diapos/graphics/Logo-PCLL.eps b/AlgoApprofondie/diapos/graphics/Logo-PCLL.eps new file mode 100644 index 0000000..f151afd --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/Logo-PCLL.eps @@ -0,0 +1,927 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.8 (http://cairographics.org) +%%CreationDate: Tue May 16 12:27:36 2017 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 3 +%%BoundingBox: 0 -1 300 165 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 -1 300 165 +%%EndPageSetup +q 0 -1 300 166 rectclip q +0.32549 0.286275 0.529412 rg +197.438 160.944 m 171.461 160.944 148.402 148.244 134.059 128.76 c 154.211 + 128.76 l 165.531 139.28 180.707 145.713 197.438 145.713 c 214.016 145.713 + 229.07 139.405 240.355 129.057 c 260.641 129.057 l 246.285 148.385 223.293 + 160.944 197.438 160.944 c h +132.855 37.463 m 147.086 17.01 170.703 3.549 197.438 3.549 c 223.234 3.549 + 246.145 16.073 260.508 35.323 c 240.219 35.323 l 228.949 25.041 213.953 + 18.772 197.438 18.772 c 179.809 18.772 163.918 25.92 152.438 37.463 c h +132.855 37.463 m f* +4.26191 w +2 J +0 j +[] 0.0 d +5 M q 1 0 0 -1 0 164.490509 cm +197.438 3.547 m 171.461 3.547 148.402 16.246 134.059 35.73 c 154.211 35.73 + l 165.531 25.211 180.707 18.777 197.438 18.777 c 214.016 18.777 229.07 +25.086 240.355 35.434 c 260.641 35.434 l 246.285 16.105 223.293 3.547 197.438 + 3.547 c h +132.855 127.027 m 147.086 147.48 170.703 160.941 197.438 160.941 c 223.234 + 160.941 246.145 148.418 260.508 129.168 c 240.219 129.168 l 228.949 139.449 + 213.953 145.719 197.438 145.719 c 179.809 145.719 163.918 138.57 152.438 + 127.027 c h +132.855 127.027 m S Q +q +0 164.491 300 -165 re W n +% Fallback Image: x=0 y=0 w=300 h=165 res=300ppi size=2580000 +[ 0.24 0 0 0.24 0 -0.629491 ] concat +/DeviceRGB setcolorspace +8 dict dup begin + /ImageType 1 def + /Width 1250 def + /Height 688 def + /Interpolate false def + /BitsPerComponent 8 def + /Decode [ 0 1 0 1 0 1 ] def + /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def + /ImageMatrix [ 1 0 0 -1 0 688 ] def +end +image +Gb"-V#C$t`_Z+TWTnl<<&Yt88b,Xs2W2ka,:g=(M65>*n8eDZ2(mhN?N"B_H["+5p+.A + <))6]`'+5R]f?:_V:#om[bNcc\tLR=!98HgXVBTBGt8j6i'dBCB!VHZ0u + LnW#DWd,0R#dci1=3U^ZdGoX-LFj.hBC\rto0E=uRLJqe*Nd:%%]!1bkYap\`u6@:BmK-Uc + 5g>UMEJ*k$.Wb'gn1*Bef>o]]:Gf<3sE'j1,Z"98E%!&0DO@_$gHB)L'Jd6!Aj>dd-Z_$Ql + d+#\((^Rd`c/[fRU`nI`_piL1([`;HJIf)B3o]8[)<\0UO[:\OWQsK50rk*LSHE-6H(]XO9 + !:U!!3I)DRYO1(c,'*K$Z_hXXmCRIJh`4t(:28U0V"0sgfaIn(XcMmBtP)dsQq(cBtn\H2 + -ejdIEsMkN,QH!<<*"5Y>p3hSflS@s5hHL[>Ke]mN)Ki3l?M/+8!@)GsdeGPc7$nF4f8>B` + KSSN1h\h?j5_!!(_jVI]&NHW"r`s,kM$opdIgQ1As^O41hr(fC25`[kI<^ACIfRIp,&e]/a + 3!!!!592!Ng4*5X76qkD[jh8;)k1N:RG:Uc1kEcj;q^`)F]/=2%HqJFjlE^Qm!!!#c/gi%@ + k`Kr0(@N15CNtoc;jI)4o!!?so'>tn[.0o?O'M\)ab5S"4;\%u!'n8<1F6O,FSrf0c%?8Fj + borfRLUph%NDc/FRI]^HVa4c?iU0,!&!GT;Y&uCZ%2qf'L1K:!!z$G*=?SD2;1:qmR5>? + \hkb/8-_Y@)?*Lf5KZ.nB9C#ljr*TE%PGHZe#)BHQ^=D85";1#r@Lhe^MUT1*Nrm_,-TXSQ + `:!!!"\5NV!0iXVLg$/3n@lZD57Lq$9qm6#N'i49#;:Zgg#WBQ4@!!!#/]GoJO2Qf2&k1B) + 4/]T=/42duEWO;d$OisIW*PRrY2cp(\!!$-aE`2IcLmUL,6Tc=`.;q-jT;?\jOi%AU=M&>* + NU,@D(]XO9J + ohRAcLRgDP:kZfrGDT8!!&\9okUP$(C]Lr3H^deULXE.,!3.KX1X&r@PAfc`s% + E.*j[@\0@-Bh4Tk`b!5KRecWln:gP13,3Dk(^+N3Dao:!="p6J>fY,d"9!<<*"YYf"Ep82s + ;#PAU)hCiD[R\;JBBQ:DLB.AT!&3^)l,t59S%`Vn??rFk`(ojnoFD@d + 4IL.[ot(Y5!!'f%V5It.MqmLOH^=4,6&^9n:J!!&s/Yup]fs#FoB6I/-dCB>[%e&oSSDs625qbC>)+#!Zp!8puDkuhe'mH + `SN](0/mL_HZ;5GtW>Lri36;Z0>o!!!#i^Vk1pB22aU1J\>)NL-RCXQ^ZV?+cm->mgW4!9? + qrNh#\[]%F?OTCTrc+YK#1NCWi+>]qm]U?ZqV!!!"\J&E?g45=J2o$ooI/tG<,6=P,Wo9E; + U!!'fH\N+r)2oP^B@tsR94X'VJ"*t,hgN"PmO0T)m!!$+E1F%6X6qm>M;j8s"$-AP0[e&"i + jaUfPjf!X3!rr<$c7V7CCJ!`MYM+q:^5OEbhrgV=:0\jSS$!(u!!#,X7XEY6d%0f-66)LJm + /rY-h49t%Xniq9!!!!YMp..H'bN00WN:KX:.Tq1kI)&@_fjI.!<<*r^sPpaEN4E:ApigtXm + 'PfWilj3!!%PEAS'sS>J."XgBl#hjb/_Bd\U6bb%5p?EcP/e-NF,H!(Y,RZYW`bTUXPDj\' + S[Ldl]4T"8LN+U\f_"TSNf^33oQahHZX<5/8WKG[DODSPRpMGnrbzb]bTjEQF44PV9QR+ZA + Cg5Kl<=n?hJ]#QOi)@#d%@0)H)`XF-F1#a('j,G.,I=nNL5!!!#'h2U`7;^XuAo'fSl\gE) + tP1GU_cBtmq,ro9(eHGpQ!3f49:>UkaR#[cuPV9$C+f<;\Q%+&2:2U+A!!!"#&[O"e].SZW + (XdsJ]B9!ne+^j-W4q*g!!!"&cCDI.CsYN1Me>A4_r)*YUl1,X1)Vcg_$D!!!"tOI;4oHcF(V:&'Mt+YJil%bt*S-DT],DpHSNd'2X86!'!!%QIn']/o_gN:L?N:a+>TtDA??A1V=nQnF!!!# + p;dQ&,q9n*dRuL:ZmNmOr:cbs#]6_G&m]$Bi!!%)24`f^lIHN"cmLhik1d_Jk4eHsnop#pc + !!)g\DJid*fZpp"7k7s.&jfhai\D--GAD(kT'E?p!!!"(f]eSkhS!PN?ec8\nkJuRS='q<6 + 1qVp!!!#%-RU9#FRE0N1d_O'4lX>a0I07qA5lq!!!!#W1/@amnV8/APV6SS+o++rH3Tp(Q) + +7k#64`(B4nLI[3?flm2)O^Y@%Y[q**e9'-=S<09?#1!WW5Y_3-G,)"Q]LjU5-V8:eq!^2k + oGqd0='!8M3W<1K;Q^[h%I+f#+86d'Ib=7&q7'a+L:J?qe\OZ)Kk--DRRKTH6VE?Ps],Loj + `!!!!I[O:pt0'rb*Y>,BI7&3JfJA$:B<*pFB!!&Z]G'<;t^ic6.e?;M:Ia7,V-U:ogihA8B + k/Q2H4Or%S!!!!Ye:khV"*t,$?]Gaca91JYB@b$0f2Z0,!<<,X+PSdrl-OI@nl7(]eu"/d# + nTV(UZ]/S;/rV>QN.!cYck.0S>d/GPqP<-+iId,,thLQ<*q]f!!$CCB2;n6U&,8[CJI2%Yp + t15s*!PSA^sjY!!!"dCua4Om@0)4^=ji#8bf6gX%-F/2Qr0AI2rIk!.[)8ZZE%'?_r.48I- + K&R6G>-:/7tWCFT;a!2Nl1SFTUNfuhp4KFhTb#4r8:FRb+N.k:T"!,QarhoX/\-R`>%&jhD + 2&XTnXqbO3*^&e97^cE7S?f?od[drod^7HU'&CVjVDW,"c`J"d%!!"Vp,<]hdn8RL484!Te + CI\67-oEkLobA8C!!#(*S[n<>fBLFZO+\)(J;DD)q8@'KYIac7!-kI@J"6$!oN/bE,_Q_a` + N,:(J\_XbG4>Q1]RM@J[9gurmm'!.UNXJr0.[C`dZMcd(@W*@07=))'1ta6KIJ + N)]-cV^+pmEmAbS3Rh"nCMA(pJ"+*fj`*^$AJeRj3DShl0!/..ma))cEf`jH%?KbS\#b2nlSX;nVqG%O5;V$kn9`?jr/NaKD=hn + kJR8`NkJ%M%mTrAQnr5\u?C#*=\pKa\T2EEX5h27#UQsK + 5p:0l/hbZ9/kg+G6?j2@Q+GATFQD"4[mP?*V8g>f4_SrM77eATHR/stGh(B=HNIaZ\#LCIL + ]I+:`W/a]$ena82Kd^U%N@6:6.*(rD<2)i!0/B]itZf7%:hmiBqlkpa2DscCqMXk7CS1m;8 + /kAX[<.21V!!)(I=0JFllT%o>HB1$Q\p7!knaiLNZa]:WMA)Q1_M9'0^\"nWj$sd7YMMKZq + M&F2(4OeG]^g\DS0:,hQuV5.MX&Y(!!"-K3HOJk-mm).Tp[1UD:ZH54G'EmglE9NpI[e!If/M0C++<.9Zu8-?h]T11PodL(F!8o + Wp"`IGUKHk**Q&"7Y!HV=1`*?&0Ye:H>/]\o^=48He_)Bb2>oo@qPhQ(OA\L5[&`OdhiU.uR(]CH[TYps(Ordb*4EJM + i>5(2@2//F.'0uW>(TuC-q-RuAN@tod%k"o"X!'igt<^^D&UjR#K%&S1-Oi)UaG!s;\BBQ9 + YGMqgC1U8sCO8\l]$ToAJT-]iG.,Uj8<<*"qOGUBlB]#Z/=(T<@\p'SU*k(\:[8b[h%:%5U + M`3t7DYgBXGibhX0bV6pMfWq6CFB/_:_8J@3c`jcjm+Xq)^"PE]=&gAc74p?Q'J[ac%5lO" + Xu[4M/Gf]Z@q\F!W[b&7T>t!IM'_(@RMGXRuRsq^&6B:9<(c'j>RD8(BO[_`,UXKJo4 + pd/S2_&0 + YOaH*@aD]ji#X7#OKb!N4q=@DRQ+n-VrL#NkKBfcF!!'fp_WG]6^>^>\Vfe2c'?@7H4F:*$ + W<)q;Z+.^a5;2SDV#IJ^m`ta`>?%45!!!"BZ#!"=o!K7DPI=hWRPo0YV$kmTT,5;V:7\mOc + 7boW#>\KFU+BWT?1iID!!$E4[4D"Aq[k2Iqds>iVld^[,t7Ju!GFKcG\sbdau2s`.=]O&gK + Ck'YNh;Q!!'ek4/1^s)t@\Up$'hDgt^g^2m0'X4sL'&/ghskS@Z/r(N`[MC$"<_F5'RBB*8 + 27J-fZqS772O4RJSt%LLjRH8@q]klB?[l-bQA1!BC90'*Z]o0WaXX$.O(!!&gb5+1Knl*#J + GIs5JN_eHqdV&1YaAEoVj+d + -N[\Q_m*kReT[&E2ci:?QhCFrcLViZ!!'h-,i;/iY"PGYePq*ZGFr#n&+[P!jBL"nNqMg$? + 25GA^o$;H;m0P(`m*!!!!9P+.[0bM\)s=&9&SS_Hnq>lKM'rDfHkJE(0OjXck8X^0E'b27 + ^Q0]H!&S'(s?!!'NZ^kn2rf1lK$SrNXL7P@P/:02l5!B%#b:(_CFjmU+hQmq&sWBU(W!!#' + GK^M[NC+`_c(]Oh=IFnQ#!<*M6-LB/E5l"$OJ7LpKi+$bS`#$d?@.25+H!63&d\U6bV2I93+* + .D^JH&5;bP\'S%-;9#Je0S2s2a;On.B$CTU_P-Y^,!W1`<.fc!(b-]A%8'W>V^s3<0&pIi_ + bV4![f$lDPh9\51c-.k.J/38f*XT1g0M.p2UO\0,>7TS<;$)?9b6DJ%ffjm/Xg+"pFiNGB' + )51G)jbK\:9'"Xk*(]71]m[5q\KBf3@!!!A5bo:,WYDDatHj>F5:.eQ8W.Fm)6K5Br"6M(_ + ;s4$o=E?b#T`tJs"]Rhd"`EU@f6$X)[s$:c$_O!mb[[n[`7q;?o.eDFi;#?L\`GIE!)VYN[ + FD?"-RiC1jl?+G$,(AIDkR5UOa-Nc)GkOa"cZ + +>=%^7mM`NhURG?[6B@^cd44"!*O=7pP;!!!2A[#(hX=MoNhIM([pnaW3sY>>7T3LOic2pY + I2>Gd?dV>:H"!.Y,Z?0"32/"_3WL[^?PC!J&(O/e!!))$7us0 + Ue"jcDb/"S&"n()adZN0iRju$<;ROA,H + `6X?>P1*DQ?D*t'S%Y"ZTNWEl2 + qCo!:lCbEJ^feN)[O4a\VFK\L]lq;tY\Fn6d]el+[X5W;JuETCSU-W#k%.WW3%7*2tkQ\p' + U;I"dc&,*ltZ=7&q7;uu4(bHlj)D=VM=rh>Nndc7AWia4+6%kI\\E-W5B?R(=X;80K\2sJa + S+R\`%eOL@);*1N3g,C+Kr6g^G,6!;5(K:D8J>AGB1!3QTq'Ot3B3i'lH2*)Km8SKr!D'ItrXs-[^8>X;\p7$4+jg8i^]n;(LFZ`RjF_Phm=/O48_ + "%ZJ2qd@`I6EKXRZ`l5)A+C`I'rd!!$,4c-!`Bf.d"C5BNN;iV[iK#8;WU:7k5Fd@%2;RZQ + W(q1:'r!&3\K_PO\87k7r^\9^US>EY,?V>=R$0]2P=W<7GM/&008HJ11nFo5pIl@TBC!*m< + h^5i%!?UpC+oZ:n>o(Y$\ODftKV=3>=jd-le:\RUH5nsA"kR/6@>kttMV;p6B7-NF.WXgE+T"V0#(]mOucf5hQZjT + ]Z3HEpapBfjfWW3%WNi7qmPcmkf2uS%,?+YD]oe?TBhM(RQ^ZuN2r1`8`q0ctal=1)"!1^o + [`+pAsN`3YOERFQ+cVI3Y<.,/U3/a7T)2%d@.).ULB_[0/!!!S9ZZ>p8$rXepERB^a&WrWT + X83Y7E%[QHfo,!2$OPNTCrklVHW;.Q!!&[Z=:Yi('hiF7aNR?o^-`&(zzzzzzzzzzzzzzzz + zzzzz!",`i-SDNWL`s2Qma,+e#7q'dPq+:f2]X6R-13I*>6"X'Vm^Ni$3-.2Li(hVl%nU,L + k=j:itmrPr2uMhbP%kuJ,fQLcpCBj#qZlacr+FA9*G:qE,r*V#Zr@#*!%190Pm + K#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4F<@5 + (P!!)H.cH]HR"oJT1iZ>I+RF"j*">*V#Zr@$UEr5Rtqr!);cC[>ii9b,fAK(*[MsAin(G8t&d/PDLWa.!&gGX!,4DNBEc + CI&3rV#!,5Q5o$qp8705tdIL/JUn);Ir0f"TTqb'bs`K<2ht8Uft0@#mgq3gYBf.)t,FJZr + G(mrUndM%g4KW*jen7cr-P?/QF.);uhFuU,,",fOO[*PH%W`*^>,/ITrVE3WiQc[:lNpTqt + '^>,k80W;loE181O2$!O?&BW1t3`sW=c/R#N + [7S,%5[VU&-[-?>AV)eodWjQN>181O2$!O?&BW1uncX^X"?G#=IV+ZZ%M7h+=t5c0V94IW$32\(0/)ehn`(2n&X+S/!TW_@**:kFu_'3Zjc\:fD8#JU01gS/C#lurZE]=X!X.L+e9AP6 + oYY.aR=il$[kDJiM";!dc)S[r'3ZlMTV]eaQ3mUE_#Z.\[_d_+[r1"_ + 2E'.Aq0RI8CM`Y-Vk5"cA4Z7M`?4dYMA@eT@)2p?C!]bK">//-ZrEI?;P=4F<@5(P!,r5SC + T4eR]=[h%djHFf7=OA7Ma\&NZ)u`fCS*_7;Z+WW4*FT%:uPi4X@SHt1M>!tS.%""8^LA;78 + &mP/JUn);Ir0f"TXnIi0J[nN>a\Jn)#cYo<)B2C2BV5M\`:kWH\@2fs>>We>`&D5O@Op2LY + FDRE-q7scr-P?/QF.);ugkD8m5u'>;n3=\T4Ojbbn1)p:ueZjn/9?cHFDCkKdd + OA9`BF4n(s6PUNeZlW0Fqcr-D;/_+%3<12*2T`crI-F?_PE!`OJC8"kfE6Xh/16_J&n[X.n + OH:$5*uR:lr&kRl&c["$U.$idpktI'1h`l>U8?"cQ3npOWA:0D!ek/^Y?nm\*?@:]hRjq[r:.JphU?`9bJOGd"j-* + t7Ri-9YHR^sX+!Z7gX"3l@^4!jq@6]/PG"aUMj>h+=t5c0V94IW$32\E\#"QQq<(cf.,*[^ + =gQt0isk$#[;tBO3B9*Cg-NcPV)eodWjQN>181O2$!O?&BW2!i&km5CG:Zn&Ug1HN#)d4a7 + "i,Jj^>Gp-UCD5(+iN5ZrAG>99ff8'`_KjrE?5jkF[6)WD^]+95W7]R>F#eGdLEt5teU$/Q + F.)<%(%*PmK#W!*k+]>H4oWs*c3M<%V+MPW_5&S"6*umFjE&I%8ig>3beHf@/0r*4@l*iX@ + F3k09C;aiX85MHOVl181O2$!O?&BW2!i'("FPKn''e?b.ghLlRL]gsD<:9'03Y_r[;+511hb7JGOP%jE)Bme[ri48/bSc#dm68c?[_Ut>Aq2tcWum0GiB%W + g01n!20S?=?+Y:%ge1e,KS5#H1M?FKgUC%T7Wn"GH1AiiT7?k9>.&+Ys8MmiRPYm=B[H>3b + :d5:I.r[]^86^.l1S9S_$;'H044_HD3ZYT;B5GNN>qcipoIW)`nDAZ3hq,G^'oO;FG^Z[u'p.n\l<=Y3+m/9((MPNc1n2Bkc + %n9mc?BpY=QZ%.89"b*Dkumk7kH\MGtr\T?q_q;mq]2/3u].<3^!rqPLk1M5GAoqfQ0Wi5h + -&J="R.TWX<_:QGDl-`mE?:H"#lU\B^RF"j*">*V#Zr@$E#nCXJ_FG\rUq;BUp@bqnD3m[Yn'\%*;GrZ\o.cA@d,06BN + KM!)\=_u8!sT/F#?:S]agY6-`A2f6lk`uQ_5Puh:s\LH<.N3d*=(7?1b=A)r-C/qZVe`:rMM'nl#%1P1+8u< + 0MDq_R4O$33(r2satCoKpb*3!/OY5C+E'E@gAs)$>jnn$0GAO9%D'!tW+cr'n[,rhcu:7aR + NGMV,gH#nV5M+6Ogk?#04@JR3JLRXd&\$rikXhb#i2('bAP^VSamkphhs8M#sPan,RPa%D% + N>e4p?Q*HYlKm31++bBr%[qe)OLAn7k4o + Q1TS&!L26]p^cl@bWJPm+kPq1G`7DCh\r9ma@qig:Jh?^3mJ7mFq9d[0O"JV>C#`fjd3glI + <@jor>PUWE!W2181O2$!O?&BW2!i&ff@uVb`qf]3H-];0SP[e5RZ"EL$(YVk8hjD!__d[A@ + JHAVjRCDjPtMkpMt`-7L5ejioaA[,8%BcaK-Sn35C2q=s!2*Up;/LS:QeKU)rkBW3b\V#l0 + ?E(inF5('m.>.n4RG1qRN/=+kh>FX+N[!6nC>5L<^qmFqd]Y([igY-e"h;$d$04&JLoONao + \ODDlG29S'g!EVE9UK5V=nV1:f,h-"&[YN*cr-P?/QF.);ugkDNbPJ`3d&kVW;#N'6[K@d+ + !6\-J\KO,7pEBRp1pWP7Z;<%r]^/=PP71ae,^Q9rpFE999"gd1B)qORh[P\Gh]ZDG']^ed8 + FOB98+"c<12*2!Pg!@VPP3A/a_2q@l6`3M2?4rG;m8&J)Z;4hLGS([VacVo%U$9RsObmM>t + QiNu'HUr5]I#et7,#WFE%?5*eXeS52BJ<0Z^qd*Sn![r0j&@EtB'rVH2f<2l%s?1-:GRgh0 + \g"E]EXh>C1fU"XAl?IPu1i:sRDV_nM5QAA*pQDh^V-^cWX\+j.#"O.0[F]eRHpU.d`5s.5 + mD=PbI=6NZeZ*3Ma(s;0XlKl,ZrEI?;P=4F<@5(P!,r5SBW9apD)8Ii?bUp`_a__lbr'`u* + Dp$E[VWK``JXO7JLUj9h5t\W`^[r[hL"]Sj83MNQ7=r=)fNAtA?)Ar*^4uH@=sBm<1uV^h* + FFL5(3:7[?It#]6LplG^]4;F_0r[\9:[eIL@,I=[@B6uVX@8^Y?j(aGl.-tA*kOY + ',MHtj?Z-#md@g'^A%Y]_u7NqoBWTpQ75a%G>.$K2)[ADaKP&Zp$.g-Q)-WCDJlV>&&#aNe + lr@AAg1EY9PCD%JsIl"=t0N^"FIW-8WtLc0$Xj\H61,E7M$m-fk6r-*MGfR$@i'NVnlO'fs + Bl3`uinR;`$Rg".J(EF)l;CpKDYej#pQ[eX'Tg8UJ6njiSI?K^ukVqJ4n'?PN#!n8PF_]mT + X]mYb\iV7(-h8p?GN#7i^PROG1*DADiKhhg(u/QF.)<%(%*PmK#W!*k+]>O(:kP7?Ao`n/i + :@=s5fL?eb_WD]Q&*&q?Vgt&T3BB2!_#4H89H:senJ%k@+rr);8>;^#7FL:HgY?\WdW\J@0 + oB&alhamG7pU=T#f3a#5HWYnPou)\#\u0Fu"q@ZF(\G+Nf6"bS4D<(a)tmG>/QF.)<%(%*P + mK#W!*k,H>,iupiWlk]^8"f8@M^Y%Gh>j]^]2%9#iisd[pbGJqtAP\\RW[?7YW\3V:M\K:O + BmD?@'_Jhg9P2dRAN8n%\nZg+f]E&e^r9ZJ0aW+gY@P\$rj?39$_sFm>4!dgHKidN2HL6Nq + X"99ff8'hZhNAO9#n!1.)&9?kT#M2mT;3HF12YIpSmjukbLmej:D',)%%n)Gl)TP^<"9h@q + (rS?%7O$/f#Sut/>\Lgg'G29?=cBp?(L0`ZJGH^_E[;+6t@9BQIq'<'O:Goi1XHm&'H?JUp + ^AdtE)l>".-1-%R(F`8Cg9k]SN,1:RW_@**:kFu_'3Zjc\-1WRqX1uam^^Z@9q0_9>8J%j( + ).JDj5\Uf;lBKbl\e*-4k'RjT+Y/r@FL]$AW#m]F6:]OH1sgi*j%N_6id[C:u+-Yc=NpP(Jb55OKfRl>3@rr"eE+V*0Wk/ToaPAO^$!qe + 4ZgV;t:L621!$X]r9#).1+S?Fb*q][tRI'e31EGm19<99ff8'hZhNAO9#n!12X%QMT!!+!! + =[^u4"fNutPg>-VPUjBmK)ltkKllTY$]`0NH$g,(@u]d>*&<`>>qkro9&(b)A"2;KqTdD;K&BM\7=.aLhT*U + 8?"cQ3npOWA:0D!ec8MdGE6+&L4YQ0X + 7J>G&r"Ws8D\g?dXY/O%M+>>0AmD,R0#&Xc_9>-q7scr-P?/QF.);ug + kDVRP&QV+T:==0H8_T(D-k^Nf:CbhR;EC5j,h9R.4"O'S/6`k^Sc1^t + rT1cqn%ooGu(%&.'r:A5ij3+p]p$:5!pKH;1n])`,k80WDJ24.MGu8!4 + W0fQ>5%/XD-/^L8HEWi60BieU9Vq?soZ$+==Nrh0VWES!TJ.oS`QB[;+7?hKnA1SRog-DlG + HG1$608[P7#glitj8AO9%D'!tW+cr'n[,rfs=SMtJYmZLoNTrYbfP*0pr&fr*s4c"qH2'aG + 8H`4f8$ig"^O5>&dAB>J+QW1kX++C0%GER.eQ>``M:7TZP60Qt+U]"O!ET>'\]E6ZYV94IW + $70Ab181NGJ4jkDQ>5KeQdO4.P$9[34iG$\pM(4J@S>5l8iV>"]]H1N6I!P,DFm[m_EYGQZ\(9D([;+66#;NK[k2k^hhT\VKCUp!:-8[PYHe3q]F6D7>^*tZ + ,dn`3Y*i+)Qju1Q4g!EW.6;*"FZrEI?;?=QZ3-e/6e>SN'oZEFLQ]mVCoD#;aWOeA!uiI!+[LJ,KE_l(fK?ks/TnjZ!SW0j-rD0K3SEOd3Ybhu9PCD%J + sIl"=t0N^"=J,eUIL6k/N'S1YI8`Sfs>>WN^%7+,i*H^>H1\aG1CG$DJj@^naSO+[6bXe7J + HD\@df=!5Ao6NVR4j/L^/mWSnm]3P*Z>FPZ>&$Z%9$sA%[E!R + lq<'Oi1MrVW;k^&1KU)rkBW3b\V#l0?E:T;E]_q?D\ts#`RPd!^4CcA>h2t.l0f%8PmG#%h + .8ls4<`YO&M.L4.PV-6FHU'MK[k1gmfW`uMrVl]_\hC\J4553QDG!P:55F7Qh+c,UIVH?CM/`mP>e;M(#?R(>.*Xl9:)_#goQf&B?hLQ)&=Z!AEhO=f"V41KpF + 2%=t5c0V94IW$32]pq-0ktT=Vd>'L)Nkj,Ap*K4A6&I_Bplg:CdOm2@OjVb`r9*UW0r^G`g + XHhQgR*Di\@]mpBF]*BM^.$r^)'h;$em7 + k7iSn:hAkN:41BrJb`BjH2sPN#?-sNK,Z!^-$Q'%qXs0d]=WtCT/1,?nNAbKjN3Spm[C)*c'gLo^OCTSG..+3\[f8^ + ^EPVn;FQl%I9c4]O$32=f99ff8'`_Kj9=.YA4?VD,?RU$^F-s(6\+]Fb'BO#kb*B;GcQ58tGe8.db*FVpI$"0qk? + Bg]k09A7**IBU[VacV]"2Lu)H!"^`pD6VQgkC>);N-IUOW=C@eTs,!uELj0Q#ONZ"(fa*BL + QOn(nKm2QTr]gASe[rR\g`-$Oa<-5tu-n%st,L(.jH6 + ocP>jb4LW0R`EXf;r+2M'HN*A&jTmqWO[afXnauePZQj-9,C6jiWjpdu1;cQ7&&A0qHImOjabKMZXuoN^1MWTe>XW\MHI9[8sLmj%N?3#BB82PP$WJ!-(BpOXDXDOq'6:/PqcTZ.5 + M+'j%g#M2E78&mP/JUn);Ir0f"TXnI=tTEN>JIIkrqYaEe.eo^W?QDmg[jUS)gQhQ*W>j-1 + H=r[%3'3BB#f@0@q0B4ECmKKc+7XO*jHEA5Y6f@;ekJh3Pan3k6,j:6:f*8DOcLMEB&ji52@Bm#PMC@")`MZ9>e. + 0=p?iFF>,m[SSF#M)BtoMtl-m].Qdd-]W_@**:kFu_'3Zjc\-,lLWBs?TcJZNkc2%U6)!@f + hI`fgU11b>R=0=CT:"&7hBWFTt92"mMp+BCIQmmB1&*"1U[?E+BY&rsYakiZh[CN+@(5q:` + hgRBV,U7(Br:mbcBW3b\V*YJlW_@**!8nJp[&)Up)]LIJ).G\T>/#Rql*4 + <12*2T`crI-F?_PE!aY.ak&B&pA7%o'2o>M%dquSUIK5:^#8_LT,51KcC?mQ4DVqpU&aW=^ + HXD+Y\2:R*ZcBk^AG(s-DJ(0D;*L(nc/CENsQIHZu=k$Dh%YRp8rk;HKqI?5Q"?b^WDZe7n + #kCV59S8!W1!`bn]jBp%<1W\8dc`I%d2=BO5(V+\cl+$+Kl,9oSKeElV_`JXs2*8%T1O4`Reldq&ELl[Tm8kN"STG\DS + AS!/5,`"SreQ(t,peUG+7un]+s5UM&f::pR_)H8e&8.H!fVVB4`$D+QUZ:@ncC[=nR[U7&C + (Ed,PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P + =4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G + :qE,r*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff + 8'hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.) + ;ucmu-V$gp#qZlacr+FA9*G:qE,r*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc< + 12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);I + r0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G:qE,r*V#Zr@#*!%1 + 90PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4 + F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G:q + E,r*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8' + hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);u + cmu-V$gp#qZlacr+FA9*G;3Fm7>NjQ'k%ZN/nhZrEI?;P=4F<@5(P!,t@E)&_nWqsGDA]TJ + GCUj=Wnm#IA]'3ZlMTV]eaQ3mUEa'u;qkg6$M/N%=p4EKYDl59W,03YALBW4g[Q7*V#Zr@$E/W1Du/mPo*U&V0@q==FVm8H/*!;8`P + PmK#W9$gII6;%I^(\5TgIm!SkUP0bb9URZj[V\r+5lc'o99ff8'hZhNAO9#n!*=1>r;"L#. + mL84hH$pmaiMOoe^FY/5$Fs[BW4g[Q7GV8cTeJ%.0/te;Ir0fKb + CalRF"h4_"h+aQ8WU6:f2cFMj>h+=t5c0V94IWMYo%h4oNa$6[SOn=gr9SA7VM2cY_FFM>q + nmjN6cTCt5ioN#FZpTPd3kp%;6If9,h4S+N + OP2>$N]mBA:%3%4lhnT2C"Ug>45H]>#^k7>qL:Xq+Bq3E,ruF=Q]]s24YTm>O9PCD%JsIl" + =t9)uoB4FqQnY4?]mBE;Tu4AI'e4=hcsb4i3B(j2:q]63Ir4)W]m0),g(ebYUe.Sa$,F8gW + A:0D64$hq9PCDEFaNiKC#?XQd@s'H/uSFo;5-J%Q7\l+U/^S$$G'06:6dJ>?K59B;PZj&E3 + KGAZ$Q*.0k84Fl-^k=3niG[")pJ.W_@**:kFu_'3Zkj='T"ckF[6A@QD-ZHgeYg""9j88kM + _Cg9n==C.LmOl.\p+9O,&Eh>$O#]6h+=t5c0V94IW$(P"\rB1hA9OHTlF6O.opK.OsQuD[r1$5g2@4".\Hnr<@5(P-p^Lk + #qZlE-S@#Hq\Mr'gV%sClCCCqo>;)'BUk:*M\hG1Lp4pChgG#imC*0L'i9LJ.MGu8Pb=kqK + U)ts&f)6`Z=HO*4/e1+?@#39:8>U]N/Z7G-cK:tmFnskg,(ArE)*c>RF"j*">*V#ZrFPs=g + M_N]=XQd61k[+2GEdmUVP!rc0aB$qZBX87j!/$_hJWogGCJsE)*c>RF"j*">*V#ZrFOBIt) + t87n23bfO@06K'HW3!TiM-GL$Ru\od0W4*K8!UU4"93RL`96;*"FZrEI?;W/6T6:0``Wk5l + iM%V,9qN8@3l`/fa'PP>!_08(-:o6pS?+Y:5H],71^cBe?AO9%D'!tW+cr/j#eui:o_sMh? + +nb?o(ccWtqXs/MT0Ag8RsSe`o^qdN7urQ-IDUXD?[r#sN>aYq2@+O$KlYA&/UQQ@8'7)I[ + t"F,#AfEd$90D:W_@**:kFu_'3ZlUgk?+PSppNMX8;)\r6PDeS2p2\N>omHEoP#oET>(;rU + 56Nq_tsX)IL4+fm^O;(pnGOf#*7R4(_^(<5:NA;Ir0fKbCalRF"jjbUaN&_hJV[pXAEXX8i + 1rmkS)]Fk,*qpNA3-d\M_&3s)o!=t8I#BW3b\V*YJlW_@**E+Un))FFW35TfX#5:OX!BEdaDY1ccO:cO,k)EX^Ah,.On'g_p + P5L1G^i3R_0*tm&ZSuY$JZXc>MCF:&M>bVqR!`,;1_=jN3U$euY8sCY"_!;Z["%VG3Nq()F + >ga,UND/ss@5-Z>te=]pLj+'uBlfl+Y(2IXIUWDf^PGEDU'qtBDM:/4hIX5!*6ZY.UAdn.3 + g`EBQ^djB'(mG>N\r:@I?kJTYc27IpCA7WWu`emi6p?^Jl6lJ:=r9_sIq=.H[C8@p"(d"[f#3M:[6H/oBE0F[Vjp4H + hZr\"q;4.f]LGJ*C$faTr#nbQ3npOWA:0D_Dto8HM,ZU+#VJE7u\F`HEoTM$"q155aoflIDpO.oo@@V(Q,h]SD + 8tGeqAacH'%(gpeNYT3]'PIH?_q*dF#`2`J4gPq+e1g2tQ+0uo=s\)71V3,p-)4T*fdW+rHhWt/Y#A4rk005@?Ua/mIq`qc:mHW,r9=]*)Zk(jG*e4+XO$EVgi4smo=0?X1Oae3OW_@ + **:kFu_'3ZlUP?OD0\`]P?^)X^Y<"H5<^3&V&=YgYjbl\1\L_[3 + t-]=8TSO[YQ7P&+>KA3nUirccUQ'Jb%nRAcWe6TZC1M4=HogG,\V-\V#04):>k0U#%+44lH + PURi`Z\%Ct?[_UtmbPM:-YA%a:trEqXa9XCn`Rk:j_k=(gJVlBGOA_j-Bjpg]4fTdpYL8Cg + +A2r1N_j-.p&lE^)DLWHLL4X^OO+R$16HS'.m>W]i4.GWW(1)mfWk#Mg('VoX(/PHa[kM^/ + d+s]2bk1WF*DhU9<34J_8W-YJ:(JABC!8D-+BkU=/J_A*3VU>Zepi=K>ISgKob!8sLn!jd0 + =lgU>AF\J[e.PmK#W9$gII6;*"Gb08'dnr6VRnhKo44ibaea:O8?Z(@(\%R'C(,JAHu[d&u + 9%ho]l<46UGR@-02e##hQ',0hN-oj;5q!d7n4uqgJFm@HgL"b[[4am2!M_DeXedgQ3If9+? + ;,NL36UQ6K]SD8tbRBCD.FPP8:RU+@3_rCS]mB?E0>/X;h(iQa9URY)jqiWuVb`ZZ>E4IN* + AA`a`9+UE]6a.M3"rCl]8d+GcC\LFQ9%Y[kigRJH + XQpmn1]7uDiWU;\DO`/ + H6E"(qC.q<[D)60dQC8:O]e=-^16-=Ka)HYB>b#s + Hsl=EJqJ[tHgEIc[U-+A\VGTL_]WrM1B"Bpeui:/1F:f&;Ir0fKbCalRF"jjKY4t1F;G609 + 9usNGF*,(HLtnHcNN)l1o%d5qrZu#fJY%f[a[XQ9''8q]k-W!@[BN!ZXIM6h,8/)'u7b!C0 + FeEZY%J+SRI?f-,RR;D4$:QQ?qoM1"1Uk?EID=KS0II?4@.H<2!pKRV(BM7pI@Q]tM[]hQU + G+N)(QX41fRscK7ke>Z$-*Jo#d"Q7lVE^b<[M&6C7.s'ieM>,k80WDJ24.MGu8S5!$bQBAr + VmaS5"lC$MP@^5Rie&U8*d+t-IBk#i1BC4MQmA+^[_D^1EehJbad&kXFcC-W6L;S"l)`MZI + s8MohQsm7/`Ki)[B'juq[a]a&p6k\K^q3UK>4pCE;qAZ$NbPIZX]i-nMpKY;2a@)q"4QGAI + J\2?'1bnpDqqk-kn>IelY6tN*,P!M,#5%+*dP]rajdCpe(U4WJsIl"=t5c0V94IW$>6\^gG + U;BK[#uFX.JRhHM6]>qJtd@/R,ZjiCe>Hg/MBV&$YMEh5:4VR;3>DIQUaVi# + ei=JGic`ue>V8RY8OO,oY*;R8 + 'q?647>-t5.Qi4"eXI!:CfcDs>o('*Z-qU,/b(Q&f-"s85Tr#WZN#=E@GEG_)>WLtmrnqYR + a,d^MEp.rS#7e+aDQ__lL$md/>ICetCoN,+rC1qod\YM9OkW8MC!iZ/]k@,W$SR;gCj]9`> + 3_qWQ`=&dB)8Cnnb(L@>BPlEfi!MA1M0`H]fX0Ce>cM!HVCD1P9pLsd&gM2HVE@8'e31mHM + +;Sq#gg'fP)7f-;Cf50M/"8b(Q&f-"s85Tr#WZ(g1XRqQ&t@4U_++ghn^C8u)5!1WQ7>Lm[5U$ + njH2rIe>Q6PC/s*Qr8(/\IB:!pO+U[%dn`3!P*0:%H?U3RFI*HT=__IK$Pk:tC05JlXB;a% + 316n^&\>fnB?89>1]E^^cTLem_hJW>aBcE$mG,7YVl+0["q=mep!niR@DM#0P=_LFb(Q&f- + "s85Tr#WZ<3KV6G>Vf?%:JQH,9rsqc'ej'6\PmaY#hg`kg?.A/R#MugU8+aFt?q1<3-1+Zt + N=26j\Ku<3BKZWlNTP[T"t3Z.f6AUQ<.bk*mM]LA:ZCc^H`WpYUI-Z=M(Q8X'#Ckp,dmY$/ + 5Jp$:3_+"]Y2"tT$E]X,:kB^c'gM + !R6>idA2-"r0eSV:ph`Dp/pn?n2iX^sV[^\ATG + PA+;X$T->`!P"o;^\V0`]R\H"G:d-j1p3J7RMiE_HSNpXnU;<>_55F9'ic6<)fA.O'\T[A/\1AKp\?_TngV/+5FJgDX89Z + KP#5n2LD`(!W:J]l]HabsYT7?k9SaX%FT5q`"DBF\#.MGu8Pb=kqKU)tCP+.qVA@Z:==7,@ + sf@SWqi_$:a]63F_k006KN?]4qU(81/DPHkCT:p-qmEq\amN<)R&QV&.7MJ!M5JOO;cTZ/1 + nUDGSp"@MA^MJ:1F^(kJ-Q=$q*"M")dh)2jp`tQJ%3+Sm.GbH,9&I:,o3m9-V>g,OdiX);E + S[>&qsHOu'@Uft2Vc_QgXW?+`Bho-L%=?Kc^m:(UL5Dr-hloV96VB7pYUHZ3&fZZqYg0GlO + G*Ke%0\f%,M6DWjDZ->JGplqqqEkAE6(d*cSc5k>'hf;c6N3qn6:IG0`>GS<69ZjK@k/![t + 3-g7Qu&Y[Bc-EohCuC>HJ/mZ_f(>`BXZNZL?`43el+D)d"Bph-4Ip76Ea1&b,6U8?"cQ3np + OWA:0D_Ps%hIG2bW-R0j'oh>DOb*=KR9:+5#F30Rk=05Y;AAF0D2]DJtg`qkBP*hVME0@** + <8k]J$^E2Ad[cjUZh*>(1\g:9T76W.GLORK_WOI^6rJuI+_oN7YGiFQqf<,u2EbFa*?@#1J*/oh7HLtn,d2FiT?uU"\[+*iNEcO3am& + 3!)_5\$-04)Ya;/8q@s*]EOWm4Nrqbq=h-1 + =-C$YL,#P$076T4k8.;5\9Tqt'^>,k80WGj=k[VX>sDE[U81TIAK^BP2iX?0jq68M_&DVMC + (6h00TFbfAA^V@Scc"a5-h)[g4/(3$UHd2?2k2k\Bq&NC9=I?o*c#'GhBDC;,hs&FjO>W)a + XC&`Vp/$GN(LFRgSaf9@6q$66cerkc*8FGq>e-U+2;=!'.pfl5dJ0*dIf$88bA6V94\T[kJ + ).^%ll0lUTfo(,n*b165`\gU:tRVYcL=;56Tp&# + 0$.L_iHsVq%H:b(Q&f-"s85Tr#W*)#:jq-oJ$&q-RUUC#ms-e##jGG3#%Ghf?gm7f'Z0t>oD;3Y"BH&mJe/cfih*!e[ + g8[^_Q]R<%gF0i7nk3bRmGG[np6ahjeK3]&B:m`LnJ>P[dFLH]M3]V)=t5c0V94IW$E#Xlc + 5bY/=2Tb%e-R`K(]Z#%)*OJ%4tR,ZrAG>99ff8'i&>oZt[+0Y%GqIWLi7%[;4AhGIG,-n$[*&f[s<^ + cdoOg>WYM*Kt]= + V]fB'PD?QBnD]O+hKMda5-UV#?qcq&eu1FRIr;[ZP\?G^+JC`fJ`P=&8_6D19^66F9^[cr- + P?/QF.)<&bU;:QRF4EB(SQcHb"SDj'X.ofsUJpn@EV@Z?hJSut/8\Lgg+qsCl##OKm8McBl + Uqtk.>=K5=LK1"=qV2?M#H^Eb?Sp3U!6bb?11"miX2W(*;`/##Z,>Xab8Tt_9[T)(stR9#_t!j/0-B*=6Fj + $(&]&T17;S.,>W]ab=VG402E;fY+\pKm9S8;^aqmBD>gY5qVSpU5"eJKGP+@,hEX&lKBoCR + .>o@Ua'GMPP)fi":rBqi9mCX:5:%3.?(HZ14E9s[>_c-4B_>e%$3YhHi?]WGDIDVB`--rE> + .aY/fD6US7/:pt1C,N%""+Peu^p:gllgt/]DeZ*E9XKcVg9$gII6;*"FZrEI?;W1TP:S4f% + [.sFVO&]!I5E'tLq8A+'17Pdnj+cu:G3$`,]&T17;K_GQo>rAP=>f%,j2Z:Lbk(#D)]?f$/ + bS&aks/$k1W,I)LgQ\q + AY1V$^5&<7)b1p?^JDK=q3[le6tJDVWm!\Ja#&?U*oaI/`s)2@lCJR]8N\p4HqcD;1rdj*, + `mGhDKQ;Wa^Mb(Q&f-"s85Tr#W*(qG!VjMtrY@cSRinlsMT[u?Hq5F^M-FUusUDng/>J/K4 + B\mN=6O,l4TP[.L.?='5kP=`Objr99l?@2&sm2n:d'U&>>-RW[??F+6q+mf,eJds'tL\^oBHhp2(OkXKa([B^@=U\&>5%` + $:-SHP^JIJA&s/5XhrN?j#b)n%JII_2_e5"@T9^ZMEY(qsij"XI7W4m'V*+labm<]]ZM3rF + RqMhKuAm\T9(H`_P9sD1r@Zr.]>$_@n=(hd?lt6`jP"KZd!r3UL*W>U7NsAkZU3EWSl;>_& + Zn#qQgY'J(c^<2icLGFAKM_SSXL:.9X'mFehDn5bu9D+\Y5ED&HDr4$]u2/:VPgJdB"0J%/ + --*(j]"R=dcJ,]8A^rORD>57-X;PZhqC'T`1W@TRjW(N*l4fCfLA?"(f-5S48+Pai_Vba94 + 'YAsX=K5H+/n0%*JFHHA-Vp_&Zn#qQgY'ULI[V@Fl/( + GF(Gbl8m"C4%qJG6"U="nT@p^6@H1=A->HiIZ$$A]pASgJdAu03>;]@;/5K9-$*;XDn'eW` + @7/ZOmc]_Oi[e8P)Lj*Aj4]Z@!sp.d#mUe07nue,]XU#WFhjnmp\pLk/GcW9W_7#(qL'c'$ + fUqtga;aYF>&=)$6efo@(7<1P(5!jGWaJY`E#^f'7sQ3p:mlAKd60M\F=.b+,ZVG3O,Ik0# + ?O)sF*7;YG49;PB]._u82PURj4k/E5p=kZa-;Q1$l$@IauX?lWf7R6b3Vdq#U.a+=;Wm[V1 + $YkeR=mF(j,DDVX0O]QP$S:TfWHt1qNfFm[YLS3(i?9?fe@0W*q!Pc_aN]q=NHcZJ99g/m. + c:@Zj(7Imq)1)?]=:Tq:)H?jcB2^lKF.oiSpgnop1.W + s./I/3>Ep0!]Z1t&ilfOrUn + e:n)(1T=+u4%apBU6Dul7S-a6QXC.t6`SN9^u;l0tG&fA$M0(h2>eh$W$Tg%'UnB5)eYZ.$ + uV1nc9l8RUJPM'TZ5Ok4%DdI/`Zd'6!*BSG?(2:(?\o-=bC'Rb0r5TMCp_E\cD.mVHUe-b\ + :AXV=GMbQ5r`l;5.L[k.:11&O$aHJ# + V8tfD/#CsDk:qFV+R#qm'H0;]bCCHg6=!_K%`Mc=mGkVl]'BZbimfj0==?7[FD<_[o,:)'G + Mgd2F_.b@RTQu(!)t0HX^HYKZ].PY#qr\\eMOP'e32Pp%;=4QVrC2apBU6Dul7S-a6QXC64 + RCR@+q8S1o?cE5$J'C=Pqd67XQ:q-3[\YJ5b"_QkpG/6-;!Bc0'[ZuGp8lIF)EZRh;mX]r: + &Q"gk)VKU="Q?r>q@GqY-*^4tMhVS&&nKYG4PI8n]kKZs!SsPe1K\G'-;P]+f!V>L#=7>Xl + If3GFnHOX)baC7m\oc&^1FI<@B&o:cISk6.WilIsPnR7LhuYH0:11':"DQGg)0M%&042FhT + 0@6GP.KX]Pq#epDhYbQg9tikD$6.SZaR6JB[K/VI7m4+JWE_O'OS.VM4F.te#6+giX82[m8Y`'5p@Ks*$$%M.o$jX;e-_6Y5;$R^2fIQKDSk5cS_=Q)D_3gT,5%g6'DR54"&p$7bkPRhnJalU^4/%)Ksh7Mm=LN#`Y9KGoD(8dpJH?!!,9s$B*Z#V_?/;\NKaKA*_,=jqQ@cq\T[ + !pKW`1G+Y>&?9GTkiD@IW3kdOJ3!Wr%_l0g_jV;&X]Y_?tfs7G/97j"_#qQg1!L>2_YZ,#!&4[rP7NI+mqssUHSiqG1'M2R + WL+mi>>\T2PgY5XGB3ad-Q7B5L'Sn@J\"&FpEK_Jor)'s9E_:\)H:f\c5*I?i(+ue9oB&Y^ + MoFA!pu."lk\-g$-l,ai<.BCIlC/B2o&T?7p6JMu,LgYsZ5NVG=9Vj5A;P9WW`QBAb^*ZrE + WSl;>_&Zn#qQgY/=SP7U5j_$0JbM+EH*^^L%!m3U]-L>042H&Dr6Fh3?TGpA^8C:2f>k,#" + t4a>On,a9e'/C,ht.`hnFNgVP[%T6>`W?j2Sa]N-at[7_sY(E,b<@7>pTjV-G./QBp%S>.8B$C'kOs7-UFjSJQ8eCms*>,Ba285n$_AQ/54=AbHqV/G/&R + :Yh=?+O!%OXpV>#3O'nMcrBpVG3h[U/\-YK36g'[jC;(%[H\od2R\7S$);Guu?]ij'"?ORO4R[/ + ?snm/hK8Q9PeNfG[R+oB+uD;2Lq[RU&n + ]1P$mtI5<#RG,$^-,,)`5gP\BS3-nUg(n?-'/\od0lET0BkT4M._Z:U6,TqS10VT;ndk007bkKaP6c.ojN)>?Vfg9hG33[A + -rb1Eh(4$#D\CY%jnOX$SaB]>>Hbk;*b$E[OA^3B%;W&d:468i]7FR@d>J\QL(ll#K8LD7J + ujr5Mf&fqjMLkn$0i'?bf]a"ub`;Z`QgU?qRq2*p.>0+a<]2ke&)*.)B"dUVcYZ/CA=K7n, + ;LsZ<*ZeX_7Ld@G=B`"CcX*YQXeA+;g=b0HhS#BeQ-!.ombPKVY$<.MR>c8IDVVa0_#eCfl + fQH](G&ZBZZ`;9IQi#GJE<1X6N6oY7un]c$HQnphVR,_,E + hIb3b!eUc^l.5AdnPK))uT.W;]t'=g?RMLA+*%af(]!-^fC"6EZR-[r8mh\_5]jeu`.8Fd] + $irqJi[@>&(,L9X]XZ=HO9cl'TF+Vd1jrd;bH*W>m0s7Y2cZ[MXE5[\Z/o!2iMZL86s##hE + p4ad%/^V>81D3FpUW:ATLCBk7bOEUFmicLoBEX@6gCTaJ/ + ,\$DdNusuSF(U=G/Q1HJS2G)JE"+@6Au1Y<:EJMbY-+pg*^.[4$O>*/:J]=(gUBtK33dJ`` + i4m5e?3)HEOWm)`/ru8A"&mV]=YZgcXm#^.WKHJSN:m+m`Y(6s":`_3P\PS"I9D)!)&Rj== + Q"QaJas,-B!2SbhU)7@o*N.48%pkn'Iaqa,V/Z2/;d>GMe8R3"[--3tR_#6D6`".TNKJZ!t + \"q=9C@Ck2Wk`;XNCiPUGF7>jd:1OoE%5Q:Ff]mB?T[r+p!K:GKns".*B6tUrKrV,3-4Vh\ + US.Sb!\T6fQC##R[Rt_@k8\c^m9N:T?oT7sfK*r;?04eG@;O_/t>E!g + Y;`YZ/CA=K7n,;Lp/SHhONDG>JDt^nsQ`t + Dc5#JLh98;QUgpA=Q,uG2.=K#$RPEShr/Uiu)N>mf0'q2@+K!i"oE]Y^5eZ)WE(-jKJ`^`X + 3o'G$cQ6"uKkkN\hP:M[7G_ZbLL(>@iCXt$u4$*ZP#P,pr5EKA<@).hr(DDWU!*[5>3+g"j]9MA-4"q?gO:]H'8R2O3/eSEa;;5 + o)Q*&qnfAV]pBdmrdtIer:V;9)3kYZ*W6V#i9b;WS%I$8f]ggUBVb^SV^(o?TOKr`n"Eo&n + >KqXeJ.q[Jjk*fV'qqY^/qfZp?\N/;,*)k!p+#G"Ir@Udf`9bja\S:oCOP!.L0F__.>qGjJ + XR&*5%QC@__VB^+>.^u&LLO]@&Q_fE_99uMU5Uq[-/Rk\InV7-#Eqo-4Z,]B^YZ*W6V#i9b + ;WS%I$FE5u:f+cImF32+Un^81$B2a7]Qis5V-d2[(+jjk_?FX8%@4",N>jgB0O\Zb(+rk53 + (p8.,Y[f&Gl%%]qrCURg:)"HZ;DgG*BSFDC85-)e5ndOZIIqg'0E7jq-1=GAZW`$ffX\o^MO-6cH@&ZDd":#0m))EUXhRokK7e5`g5A\uVf<8P>Wf7Fnh;-mcf&2W]Y$ANYR + $6X.0EGR\b!M+>qbKlOKS>*lj[ia"6U?2!nOL]$H$OZaAK:&Dod#$4IU;P_HVt\@E[5uLR^ + :KX4?YimIJVRDdSa$FdF$A&[\Lk@\Nk]Ie0eJ_baG7$G#N,*Wg26$aHQal.OVH"^]di?SA8 + $RV?mY>,\*NGV+N0u%O#`B[VacY)`P&R>EBa%rr0@7[`!55f.^aV&32tKV?0Cb$ZXAm#7`S + +ekGkb^'Y`$:S0gVc<3Hp`JYPML(.XbAQ5%]KiTMDSs5P^aN-r:-HVZd]6sGFe##k:o]_Rl + 9qORqp5_H;:h3W=b*FXVcThGcP%BVVC@[]MMmmW^?F+66-kH?(O":kOgiO,],.3=4g!O + R<'TB_C/kF&YeLhnHcJ>>,:4-dS;CPAr#k21VOG#qQg1!L>2_YZ.7taEWXP?2j]d0554qV* + [B&X]r8/Rl1ET#:idnnRr.4#F;4\;Q3^!g4BJ97*Y6GN4Z]K)aRN->Uc\h=0Gp:2b74^0d? + c)$kR&-o1@]fPhBOPt3FeudQ-?QTjl+gtb+q"XBSMi5cNJ,Un5%>u# + UDIHs.J,]B;kKagX<2uaEJ:KY$k1$A/LTq7D1UHrNl]Y3Ec'pYUP*4mBRN0e%oB+T(=&818 + X=;>Qo]ah;p$1*%mbK*H$F-)W]QpjQBt7j#)@8Q1[r.aUZd-kA&t7&Ng%1O_>oGkP["O:l. + TWWAY"Dbsfc&V5:#AVoO]0.:R145(!"iP:'.\LPI['OkdaoD>ZWuq2\F3j, + aqXHhZsh4I!/oj9&&?'3HaB!\@>H@&ZD(q"jjTfs>>6PUSbAoOu[Ka`lWjQZ8Of2fE"HUs5 + Af-SdQ.r-0u+4EKYD^V@P;Kl,YWp$]ZqDV)$30dBRuTgFG?(+`RnABCiOWtHKtQ;*+P@\57 + Wl!V!M<'Ga,FQ15q"Uc*uf[u9oH,kpc]63Gj^OL`;>?`I&VfV%H.JWnA=Q8B$n(bI[G4!ui + './f\Empm[M6-[NKpjl7P5gl=3TRps1M.'C,uQ48=]5(jq=u$nG`ZV!Y[PG*%MP[RfW\eB( + +hRhkWjN7e>Q6)NfI2D>Z"=Z;^%`Qp?^HY99t\=P0K-Veui:?AT.MEo?X4ep?gW/mbN6GUubKF]"qXp%":[Zc6(V'Y"Y?sNUn<$p!\Qojl,q!cV.p?fJ:n`%HA&,Z1unLj`hJ>LBp//<+)Q7=8d; + uhH?J>E;IF9sKu:11&O$aq;?6 + d/"I:MbYZ/CA=K7n,;?6cD!gX/ncm>nq3J"".0#1BH"I9ApckEW_!.Z\QV90)q'lX2>.OVH + "!.^YkV#gX=#qT(O@&\YaYZ*W6V#gYh"=t8fTM&[lEWSl;>_&Zn#qQekTI4-H!!$:+99g/m + .c:@ZWgpk&!<@G_f@RLD+@CkliE[Z.!/LiF.OVH"^]di?SA8#'z9H707SA8#'( + LX4_!_W[s!!!!QEF>bd!_W]%J>LBp//8-b!!'gQJYgKq//<+)Q7=8d;ucmu!!!Z;Q7=8d<5 + 8Z>Wgpk&!<<*"!)+A7Wgpk&!>f.CEWSl;z0QCL"EWSl;>_&Zn#qQek!!!#7`.=c-#qQg1!L + >2_YZ(T&!!!!4#F6heYZ/CA=K7n,;?6at!!#\4=K7n,;?7SAWH&&5"TSN&!&/D#WH&&5"^H + SSapBU6z^r1f#apBU6Dul7S-a6PMz'*jgQ-a6Rc"^%dp^et15!!!!m**B52^et1L@&\/J9* + G:q!!"]m@&\/J9*JRNV90)q'`\46!5QO(V90)q'lX2>.OVH"z!##U'.OVH"^]di?SA8#'z9 + H707SA8#'(LX4_!_W[s!!!!QEF>bd!_W]%J>LBp//8-b!!'gQJYgKq//<+)Q7=8d;ucmu!! + !Z;Q7=8d<58Z>Wgpk&!<<*"!)+A7Wgpk&!>f.CEWSl;z0QCL"EWSl;>_&Zn#qQek!!!#7`. + =c-#qQg1!L>2_YZ(T&!!!!4#F6heYZ/CA=K7n,;?6at!!#\4=K7n,;?7SAWH&&5"TSN&!&/ + D#WH&&5"^HSSapBU6!!$!8f@Tchl-kZQNl-S\Z`p[l>n0\nW2M+?:X?.I[n`JT[:@7;#7hm + :>nPF&YZ*W6V#i9b;WS%I$31'`&/#UrjiS;S(RMo:rjtmo2C2"^ba+!%^\sIBJNtsLio2"B + HK=&D0miW\mbPM,XBF#rbUi/?hR$u1mi$c6J>LBp//<+)Q7=8d;ufUXf\"h4B?o/agJ=4mA + a.X>QS2]@8kS)KP]Zj$r*3N5kKK>MCY#Qr)`G?UpPsGd9(M&bPAGid;G@:7&RE"lD:u4+;l + + @oU'V8<*B\RccC?oDp*E4h*.@_XrUf=fn*6,L9\om*) + am9#\g=ihk"\T$=#F6heYZ/CA=K7n,;?8I/gt^\<#Jaq`B%O4nk?TDJ#(rUPZY%)1C!`N(V + OqBo!L@K[>e>/2h5d:gEHcV>C^l[;N"7I>:11&O$aE_(F\dqWcV3]SiW8\8c#E^=9,\LNfS8JYf6]Ub + )2]Pq,NE/s]8EG3rE.o)%mjo<) + %FYgdc^PbgQlqNU6=b*MG9OWuCd_GYsTJYaQ:%4i5[1`'8/(*kRf:ggPe[XPq0I]Xh9M@!dEp8\oOJP6F.PO&j<(*p@V':`X!_^e,=B\m+O6NH3 + PB`G9`9Z$YF6Ch#gm=NkF*`1[o<)%FYgdc^Pbf!>:7OkWVdmc-N30ooJan;f,'j\L'gXYm= + DHFJq=EdfBESfYeZ)V:6UQ-cai_JS$\cpQ=gM`1Y#,4-WTc)o9-oouPq#de&($4N0,RoGV# + oZZ91AIk==So90!NhVbO+&nbEXUPeYDs3cTf0io7hI?iZK<=e]4&`B?rbenmo`T.SUmbC-# + &5;NnlnZ;3*FY?"Q0CtW%%DQu,(9*N[XO6RF'=-H1U1KW)4f$+;1BK=0LK + 'Pq-?R@X+4dKfaMHo^(8;8"^#M#@& + ^eS"F:09MWcq%"^#M#@&^eS"F:09MWcq%"^#M#@&^eS"F:09MWc + q%"^#M#@&^eS"F:09MWcq%4*N;>4 + IgW#'OkN\/mc1]cE8c?+\1?Ct:_M + +1$:F>8#Xf^u\3HJ6(>e+Fh(=IVOF&7%U/;t3dg_l_hSbf?2Z6*/rn_ + "aM1>7LCPVSr^MkcV-KVQg?d:d&%Tr&gU>?@meeC;//?QJ@&XF+\`hI>,9e>QpoS,NQ8s$K + UfL6h:n[q.4$A&jfU,)s7n<%(]=3"QhIXlrALTC"6A5csX]p"bJ-!i[00ascHq6eaKWQUK- + ?c:Q7[OO+G/oU`mFntkT0GPM2pKRjaJb8H3pC-P;Nc"r`:8QY68W&K^5rBbSiqE]GOCt[Dd + J`i<39>hN5f5;GThRc`j+%Gf[u`VGENH%/mXpBKB.\27uF7c`f1poOr+T3q)'j8JsK$i9DD + J6rqncd;iI"\+!4;(s+(7WQ7>m,q!W:baAK^$rE6I=&XcXuq[!Q8[r:/IE,b$oZY,OQj7(aM#/[SN>i?k3VI4o]]:g>:6m;ik/gNN;"27h"f&%nac8)[r:0dc'ug\B[3,.$Pk:4 + EcN@jfZB=)("[O&^etcX#*t,hRZ#HB2)$_'p?^I$MA0J=)PuJ\?[a/N*4:RTY@#$c4*GFk! + X5A7R1\FE6\Z"hF`i-(jpbf0A7S>M$!h2m-8f@M1_haq$`75RnQ,'fhO5@Y0n<`(. + >/Rl>7@2FY#QH[C*[EKr(XP5XU?5]jDDa,YB4hGpT-`3tJLR@BZrEa'c+9CZ.Q7Og7>$:7TtLH#ou=P@Hm2R5Sp99U[ePn(tb#5(+RT==U&s^etb4F4#uD + '($m<'Lg#4^]!l\UIUBp-o*2!B[itX6s/Ldq,MnBoiLkC7;YbrV%Tb4]6:=;D[b&kUIG]DD + &L/faT/VO\T0HPOXEqrfs><=,U>p]5s7ju(^qoqXAJDUP<]*F;d(KAaPrL8'4PU&qXfpA(i + XS=oTUe'W`5slCgg>EkDI(c^m;sl)107$k1RH.p&n8bEjaVU[%:']4Lu;8B#[%e]5^c'Vf' + f`f(c[YW5]82(C(jnDM+ip8)otefR,*PYd3/Q5U>Id@io4"Zo8B3HM'N9#Ld(Pu"AWV(Q)e + .'9ft5($2%Uji:=0bt<:(M@5f_ueu`/!lI8\2P.Gf%8h37UYZ+#oJYaQHk + +VrN4`]USTgFHt)B5K+W(h)EXS`E^&e5j=9T9D.@3V"0]V%ZL'$>BWpkZ^$e[*c@^qfg>lR + U_VCgVW0Q8%ch)O=!UEkQel'^su=_hZ33+otfG,37%?Hi*O(&j!(VV39#iAa%S&+MWcq%: + S(PS*R@]rG3pdTd9g>`D;2L!]>@OW>O&1dVfLtGXa%UL1he/H>r=/j/1aKJa2g'bWDb0AVj + ?>.3dpjH2>T`Gq'($k6suu$OuI=9J,fIK<+jace=8O?;SO%oJ"Y6!/#eX(a\@q0-]iiTe0s + 86_hXtHKi5]a&\SC7MBJ@GFtM8!gUhF`_J0Ji1,ZB\I + /,mMnqd.8R@+rifJ40P%hGo[Q75b0=gM]\4*DT!A4ZI_h7Igq7`;WB`JTU=)00>)GH/Tpm[jm69O=gR7@!<]2mR:9fA2f[iqhS"9B^Qr + *2B[M?\!62%'[FC<`8$_lOe60P8rDp%(2/_3:\4jGRjmqNVQe^nWq>W/DpkFQjP$+dGr#3AhgbYh + j(HJO'OKqS?naEOdY,:NG0#BWIMA"MQAXl`YZ(bQ>Vp2pAB;U^cTN-[=^,+&3HHN"/hUuKD + r/-0]65e'P`3"beREn+/;9ai+SHlm.p&mdGk#6oj_m][NupT`5+fsE;AUrjaOjVsnJqi>#; + 7a6F9dL2*Ze(2nP2hS`6_G[6maf[>ol=897?Ku(#u@&mFnu>o^pA[!nk8B%NQbeb0gP->K4 + Mo[+*a\=I(tf.TNLU@`=4k0>I(=HW!bie#-!NDr5GBA!='n7MA-kC'rjGo*m^taUO6b-.;c + 0qXNUdgUD)S>-s+aokJO0^O?!FYsK4!D;;Y+Xf^u^4aT_:kq;&8`'g>NLCYIRG7P&hMj.ja + KV'k&$k-ZoKVi>(QIi9FbLcmLkc%LY)Dl-Cd`?q>!sFK)s/`F]Oohn/nrH>jVG/!fCe,%+l + -cC3Q;T"qc$0L.#F:8226^$_d9O%lWFVZ"Y[Bb_JO/2-I>+$c+=$7_)`Ed4*_U:ocHbcFNZ + C3IV+i]l,eh:.JEFRoqh/26AZ&)Zl?)\hf6fn:DpJ^ + CM0OY$j.<71"mV2nWp&+XW_G0.5O^lLr-1$[5^3fTl`f(d(MA.3UN/39tr00l_WB^=MK9MK + 4FW)lQUYEG,1S`k+p"*Q0's^pkfed2SjCIlQnfkPeJ\N'dHoQ8,`;[2]fcp@62qcd[q=CR[ + jiWi]^tJVWksK<=>`r$`:;(`3:<&bcWUT#mQc.e'+4RK$5OEbX&n\FI$(8r7!$bMV + :sSS;!T:KSNE1C_7Op[ZM^k)[VT*dKk\WDL?3D:@WnYFT4[Q%a]^1SZ_RKrpS\!?.LcP5p" + $6Le;fbC?8Ne@mQ6[Q"s8G1 + AV\BB%MWcq%#_h=.*M1CkI,6^=BZpoHtlSJA(c?39YiP;Pmjft + -K,h)Gd-8.P,TjCWE*&#_G0.5Ob9Spkf/RC&JIH^//30N>,U;7N0e3HO&jH + WP#r7A5sB;Q'65Pq/3.L[kBAo2">24Zkj*N>U,BT07NJTpnLUQ7ATFkih5NjiRn=S0LN6QD + pdABrPufDSd>:GCF6:!;,R,9=X)+ldfYFeGfFDKg0_<^]E,Zjo?qId;*-h#bnkCb>Nb9I"[ + !5,'<(t7<89)%:n_&XfX1_&U/GC29I_hV;Ah.O4oW%[C(\5MF&ab,s+r5SUUP68ZQgb[V`l + 5Nu^T\$r:k9jQM^==POVR> + 6A7WMC+3]B!LAW,26^$_d9O%iWT;rbC*hAtIG5`Ug_/q_CZHN;C(XE& + aYmXV9YJbLYC%U>IPl"dS(A6\Z!]/u*+-U5[RjAd3A]RJcmP$S7f?4?'Usl;NiCgS,!XlL2Lf0&4ND5Q)k0Z_C: + 7;Qj?9,2.AR< + /(\I#qWQ5;IQJHmFoGE;jSA%cr + *)Wr(-cD/_cV9rVH9WDmDU-_GV]33G[1siPos$bXqcQcY/V:I4;RGl-aV+DqVFmE;LMS9dM + lV3h$f9LZI$^i%2o2c@D>I2,>IB!]*BW9)^0D_M3I'uCt%YkQ::/">l + Dr1i9;C0r*B?qXaY4MA\(2h'(Q:c;bC=T?+\Mes:q.J[[^O"D.;kg,8TL"2T7ujOW%[XK:; + A$SHQAQfRMhWc?0JJSl`nnCUj_osd# + Mu-.T`cX&["r59D.rLUqVVRNj<6>&mp_YbHVu$;C0pd%$\?hcCI$Egka?/Fl:&de.&D"TgO + Sjb&`f8J;"Q&*;&4J.XDV_nRm\n9b'.8G`<7XqR'.-D7:a^8;DV_lAg&A\m/6-_] + iSibF?+4tB/JE#q5_0!"4"CY,/=$'"Y1 + aHM'!>&N99"mhCso,9jFV1!Y.\`/3mrh_N@G2b(8r7!$b;V4K_jMHYbHV3kab?.OV9YPh:Ul*6A]dR3X=+dfe?WZ/;YQ$Jm,#E[\3e.dPn4iP>-D6q3Fs!Z + >^4u0Be2&,.h4+1:8uaBc^$4k0&2'+/=$(gW7n=W[k>#@W6`cq5cu+H)]P!0SICgAkV]SD" + OUI2A?!V0*M\o4'GMgB6cZl)[7A5O6(+WFE\k + c;EpqNZ&5RoXDRi*\EM\`_0[nfOcOALI<@&\0=V4R1"G':_S(sPsZA=Mp0.2 + IqOX!Ao:7WZVWi%DP<(*p@V':`XU*3/mGO?HYN&P\3aPTh+G3ssld]H`_bW`XbokNcB7.RS + ,e1?kG2Che-PdI$>71i0-?I.+,S3;4"\3cH32>PDug>pa8=KnIB0!o<>6BUFK(kJMUY*0iF + lD(B?Z4_&nBU27r`CXo/4?S9IFE_p^:nW?/9p!7IB[EDJT0CBS?#kIl,'j\L'gXYm%9_uhl + dr+IgqS>Gre?k#D_A\frr)_,p=W``G#=1qq!k,d_G&3Pa[$_\+`H5MdX!AY74bioq=<$`U+ + /*>g^pVb4\JKm+&g\S]T\i``!L>4G:6sRs2Jh"ggka?/[:-t-e.&D"Z"( + hQ7='<-P<6"m%?\76q3OkU*g7!`("$f)Wq="\NoQbV"F!D>lR)H\J@B + J(4/e>T;oC)PMSs/?QXbF:Gon5^MK*&@E$YHKUeaMj&R9<6=e/G8)GPLN(7]Y(%_p@u'.&L8n=Y:0LJoR*:)W9!7d4TgR=87o_@o=YEc_XoRKL\pW + MU#tmoaC"*(po&Rn[?*%'Q@&\rg"%u&obsb!c8gn#Y\8W=\7urtHM>R&9;`cN-NY8b@2Jq/ + =X3K-Fp$q(_e4*tDnA9u*Q9&j70]>Ki1hgEP^'J+?921+F&VCM[bu1H8T.[dA8sLmJhhpF7Gq>Y.iPL.sJ]=l2QAXl`YZ(bQ>dS(A^]4;FE#HFgn + r(^d\@T7L48\Bt1P$=cc-:r,SiqGoQS52j/PXJf8L%2[))Z/nKV"&i&PI7gF;/Vg:n^3FT# + 3H,>V%`9EYFg#F!gQ!R'[PZ>#anNBjdp'l_NC7^An1ZC*Q3Se8u + -$oB+!`J,hU!kgZSqn0SJY/o33Y"Bnp + ?GVO>b$,"q@J>l[$J\'?CR5/=d',)[68s<&/>pKG'/WS-)`mT + Ksb^JW`foadS(ALCYK(iJ"U4#5SQiW&G4!ui2r`r\74g8bNZ8ig?5 + -V8$!QVm;5:)WS2bLTCer$ELo!R/6r8[,K*Mof].X4^/[\EK6:N@J4?VE=`eL#$e3d"o9@Z + XBWR?Z/Y[@KS^F`ToK\DI6/2\RoTlAu-_AhdmZ(q4+)$0:="SEN)<2NE]C?4qnWJFj_919E + :79c&r'buue?U!F@lIDp_r*-'!e>6.NCY#S\[_oD^?c@m;hn=@aW]Us%eG]:=;qj%DkYVpb + -+%@56F`RKH1JUmnNuX2A-UR^F6:\\Zsle%4@rg$Z=qX[Wn%/CPu&X7Mj>kpNk4,\]tLC>) + 9l%cSND$2hN4.nR;qA(;hUo9O-VA%QFchUeu``K_I0@!?3?P + +.g(sdG+B-J\o]_RelIin"41--h7-YKe99i>IXfX0tVq%_CK;C#,>,mL=$[#\7%]ROXN5N\ + s+7%O^0AIeHhFMrW5=1`Q#n=3,kO3kKZ)/k+oFtHqPc-ldh'L<9;8f.8Ai',/:?m"uN.W,31"(L)*,G%P + GBQ'sRGNZC44_80R'Q7]8BY2hf@S2dcBM\[iGZW+G:lB*;]=DI0KT`[#e`q%'BPbf#H[V\\ + )$Sg=?]6:1'(BIX($m%ELUbPLd4'&j4lC+2_J>J.'mJd(]`JPD*mP/b.#n@GWC!`659'G*C + 2g'2pZY(Z[?DY)D"M/^>,2=D`e;RN@//?QJ@&XF+\S08d$1$3HVq.(!bNk7K^Y`n`\<5nI" + X9,re('Vd)0&-33Yd=+V37G$W`=tR]O--`jis8RN"q4:5tbdWkr7@`_=36m,NLD)6(InnN> + l=k7=Dm2=0>fJ*7bT:0L3.>HhZs-[rke&HXR-h*2$%lPesqMiu$N-ZDIQtn%XepjS%ieLJb + Fn$Fr<+]66oJZA"u)>\iC6(m^'C26^$_d9MpAe2ha;FAmb:T0Hti-QsY,>.&)r@hn!gkK]V + 3kZU5:^qbL'=dgQ$h7Hb3Y0m9I:l-aY8b^'6f4aZ5XhS!uSGOO.e+&N6.,q7=5o?TX"X"%,LeG8_!W + D,O(qGbu9#1Dd^rVEqG9aJODWPAE*S)X1=0k846q.7>e=ag2(:m-* + VTh7#;OTVbRu71:S'?Tr$Oc\uSeV?qH7_KT.'J>FH9%4i5[1`)u><@' + C>0:b7QQ@7;olIDpKQ+1el!Z@;ZKn]@!qN?CR)3+:Vh4+79:b(Vijq=O$5(ITc$FR.L0173I^lBS9FkG:hqMD^;UqF\jiX!VA5 + #WBgEJR24$1&!7ujC8G`Nn/+t"GBd9XJ6H2$a_j2[4a;Pf8LY,tp;Nd^pHhbr@EGse-*3\< + @4jJZ:lmdT2Qf<8OWG1#^3\">m7:3I5[`ejYVs+Xdb;l37Qe>ZBC8sRhQQMd.i1#rE1nF2P + 8<=ebb)cEo1p;I)+7J%L#.Y;=d)RWNGOTM;C;5d;7acjNM]=YCCI&%%\/1hbjc]F6?:h82K%:uW\>M:+-q,LdmF$tisXQO*^'5_+-RAggt\D:l\ZE-[VacBq!d5u?Tt[;UIPhlS#B5]9#a>V*NR\b<6 + WS1aD!<9GG9Va.RhIB,mDl;ap]ng8r/FbCtc7qgA>FMi5*9AUjXO4/`b-ZZkY))=Us4r4AR<=utFrqhH]+%k2c]IYr9Ml?XSqsUQQ(?+H,hnFN>l + IN:i=V<,2-qK?2-NG\4d;*-h#bnkCh,4RJhnO*^YbC'GcCI&+PEV1CpQ,?*GhgE)-ic>OccZhk`n)FhFj1fak>X3^f + '8ZcCaXea2c0<8`'Jp/N&6!gU<@q;*q*bjQl-$fle`;R\\A$;]u)[8@p\!"I=r/26^$_d9Q + `3If1+Q;VP(UZ*CS*k05DUW0#4JP"MWISMJr + cg6S3*ASGFcC[569E[fP0'T*\[/p[;,@Y--=#A8E^RX@rb?DOD_JH@2pSs6dp):>piG3RFD + ]e96^qsX:Jhj:nR9u0_k^H@qapYUHN50%p,_M&0M12,@HV6ZR`9A-U^7BQ3^+L"g5YCWMoL + utEZ925C@2=$8C4+@%j-OJNO5%SMFlf[FYoff'1F6Cg`mK38iZpq:L'M'Hik0/rJaV?fm`" + 3*,pI;C:']-NM7ns]m^YKSU>-pYP%Qen&'UTMjKnP*^GB\7^R:M+SBDf#Nl-cC`ld(OD[;/ + !QoLM`<7%nNl2&H`4+$Lt5G3@/A1Rk=5/4ATGo]X+tK.nW]W@.SfiRCe:1D;)F + 8lfR=Vn6KV:Kq+C(7ZA>!'K$boMWd"'#cTo_/&]B + E:i@S9TBa:T3ub_?OBW1)g_`JC>VG/)*\h,WZa97U#7jq&%"@a+"lo4JU*0J>OYT+MrbR6. + Po6f*7'D0<,)GBu@]>eC,UDI!V+X2ck0BMZA]b]B"rK::gl*+,*$$&\*'*TVfeXi`U*N+k/ + 68j>n0$oL\T>F,Um$n%5a7.jlK[Y,Ne3gmh9;9Cao>YQAe"QS%N[`'#)^n6#>GH_AM7E),g + tu?k-f$TWmpIf_al1j7073TNC9kM!\#^SduB=BHF/9)1`TJi@W + )>eG=/h;*MPlIBF;baLD)n`%M_:/5$&DEW+*&G_q^I/"hdnUQ,idLL8*7(8r7!!pUC' + '%(5[D@CHM-R9b67Yb3&m;(X1,S4h(Lm?rqsZh&)lL+]^#X77#?n_]mBA:qXs/%:7TtKGOI + crr3J\A#'K4\q=+j#C=R(S\8durD7XoXC27Us@Ddhh2fG/C"U.OfoGUg]JnQd@<)#&rrd=" + _o&IcOk?TD7!!!H191AIk==So90!J=JLlRMPZ=Sslkt7J9S>^Ko&WF%_,ldoF]`LhqoGUg] + JnQd@<;!bIodZ*Er;#sYmbN6ep?`LL4F6MT60HOa=l+(s=gOu+VL\dK!+;82;A$SHQAQfR$ + S5:@*#osH\Ra6j<ch=kV]SD"OUI^WTqm;B29;Zbagh>d@s'&Pq)IO2rCiTBj,9&XI503^q72Y!!'A8//? + QJ@&XF+\\M+nUI'YAd]?@]AnGWk04*_qlR)H\J@BJ-Mg2 + )#jU`JYO6_bY@:c>@E8*>fX7]8HXh!;$IH("$f)W + FrRs4Pj7'D0<,)G@_9*G:q!'i:j("$r-Wq//8-b!!!/j-be?k/nV5q?J + Omp#17i?5Bt6GnktB)Y6*99*]KWL0&^_-Lctl5"TSN&zTIR3$na)*n:Z,M3zzzzzzzzzzzz + zzzz!!'gALl.-Si,Ji2Q(X2s]T4!3z!!)5KFXp70CUY-hccCZQ"8tT4+#a0"z!73*u1%Ab/ + \o:_8D.UWcVZ;N&z!!!"t_lFUQ4Y6!2X.Qge7+M;>6ko\%z!*$dEqc3(@Vn(_%<<*"!z:^M + cjnB[nIgq?L)qT,,nVj-!WuTCG*q!!#sVr94Ggk=]jX9\Yu"AD + hkE!<<*"?n,u95/VerU=&V?>]TMs'A`s*!5KJ)+aM\jbM;PWgEG_'@*];=LCjLd!!"@gTtNCqO&\$-V$m";a!L4=MuWk< + &JG"edTBT=2]kb,i@GLe`mG!!"]eJj2[4m'20>\4+lO*P!=I+H6&W"9>CD_u"?W=Q+-H.m5HNT0C9\Vu + Qet!2+DnW]0[GMq0\_V^%L*"[L+5^[ea5Vkr0e2-S=grKqd=zXK5TOK_st%lQIM*X-^%W%0 + /HMJB&,#0eGW`oCh-c;ucmu!3d+O)*;T[>4,l;XbVjFp[#DE@2K!U+X&#VH.<5hpD+c[eDP + J3TCFrlz`:;o^:\XR+gda+\Lr5qhYqbd]O!aom/g8''ViT`PrKa11o]isI`Np)fO!ao-!!" + jtG1VZ-#;c4tpqJ]jqM4W*ScAcTGX(^=g35FKRu'=Lr:""K`tJFQ!!$1K0d19%hcL+[R1/B + Fq!e8ehM2dF+GEb7me*ql_YlBeO"=L[JG8R:!!!"L[L)R:*RGg"/LZf(*UJh.]YjW.!WYV" + +.p'onMp9TLMem$g,UVq.nTmD!!#8:[r4CLCmGE?\_Y)hkW%Eh'`^M^;c(D3>BfKo%Gdg]V + kpS(#4OgVzcjfkVl>J + pEJTX3R!;ucmu!3"&3*S7e3Gk@=d?'_$GI@p8="X$I%R#n[to*$WPHkE9(cCX[fI:9es%IM:(><\6JOqsXXe!!#:a6q51T*U:LijJ0o + r20ds+a7"9q@0!SKQd.bZf@>HLjfcjd)mqCY-D'rD"onW'5aK4SI;j\:jkRm@\r;o.h'V;@ + #mlI$%l+.]-TX;+e^>\tYBmlo@#l'%+$t5pA,lT0!+[8@gjFYh\CA]tZ**QQ"n=dt!9fgu% + t-nX=i^JMf5#\SY^bU(QM3ZL!!!!aQ=KAYbbV%DH?WP=o\^aB_8,q-"/%S^A)]GL4,r^^<6 + _[8GBk9CzA4;;=/RNmeqcHDHR5TMPYKnTQLDg0knDp:h(i*dPQaXW7g>OIKisYnf!._.D>[ + 5.AZ*)kP7/BZ^:.l+Bgdk&SO/`3$,!%2sPOf[iKW93mNSb?jO#QA*!!!#7PbFB\pcL!7SpE04`IH&+3M7f#b`k + 2gHKdzJFjZeaXc]gE??W@SIFqoo%^5A=K2RUFMu2;Dg/hGX!:q<0OC8NTAY.M!<<*"!5;2p + 6K7>\41L?RXoCUmf>=XjekmS6GLidKkgz1*n,,HL+HEm\?X1 + 'e>3]X-Oe5$]X.on,_I(T5QF2-19Ap*);&HH%.qdl/F19BB%:I,T*O$43Zg3bnn$R56+0i?nbhFo + 3c6=bi6ehIChPQIMoru'EA+5!!!SHod`hM\$tB]NlmfY1Nga->I460d)U+^B)r"Tj8Ho?k+lkLYHf\uEdP?EiA' + f-z!'ha?[p@rVTZYFABt;0-eVVZ"8DY]q!6X6co4cmP"'-380m3;"?!<<*"!'i.@K>D!D!U_0_A8n` + ;L\BP]NK*+L7K=QkM"#*P%Hi%[>0?df6In1=2]-e3&-)\1!!#WQOH;GGqG-J=.thG(n!/\% + hMdGFWr`_A()jU:ojY[RbILt>#`8MmI7["L;ucmu!9f4%kd\`a]5f!)+XquC!YZsFA,)pDV + u(RB`r0@4;Y&/pmI>0&][$rczKaA9JZ5KouqcF4tc/;nYp[#C*q)O3(W<'g7_s`$CRcVS9= + P@i25`jJhrnB:[17%[6!<<*"!2'ZB_4SbM4*)K`+_fE/X+U;(F2=ImGb6!!X7Q1!^mFkD0g + Ch8A]!Y*T-Ni2('"=7!;&t3a7)rYf5VmV+mIG(ElhM*j1[^LGb6*$/+W>[qh;@=YeH&&`b* + /DYg=fT-O9\P!!%Q7"T!n6(uW>\oS$fad=_]'m.S$b#1Ieu,ES"KGicg&C#c[A5P(#@ArO- + =8FU9KV[3>'!!%P3nFm;.eo*G?0c6'V`X[,OHLME1XT9m`)A7>2j2UTfCUg#%87i_o^aUr[ + N;&_Az?rZ!t$Q@f9-23N=,*5)R*OiRc#kSYhIBikOnDp:(_kI7#*6H,T]`/mTp](9o!6CVA + GniBauJl@8S9/=OcOrbM!R.KBGK!'gm0?O%)*NH\>ZQ9dYS2` + [LUrA&otklXV8KS7:u2kD[j^TXQs'(2YG+t=fA3;J'>];P]0!!!$!%ptr)R.XOUYo19)pU2 + Ror'GY#7"?XKDhGK9^4]W!fIj!rr<$!"]@/Wgiof=!qlKEo8j)VU5VQK>IGAYPZ?2 + UPIb7eOaRHC^:K,jF(V@zBE056Ih,o4IJegJQjKNHmr6&6gtRmW%e&usLa+&dn_^s^SQDGf + m^%fJM1d:E.5l&UiR,\Tm)E&oaN,4TB,M7)cp.0h8 + M>if#PqXVkC2,-MJ(5AS^Gi)][&>5zNBp$1A/rR:/;L0gmd9D=NSh$WlfG%*h^9`tnNPdEI + u+Gl^4,mWoBI!6VH;YXZ=#oJ3sGZb!!&)b)+Q8_G_#[I%T,=d\h1C\]D'BtgTOrg,UME3@& + ">NQf*#Tc.:,U-B3/UZEWA<1*C=EXlFD+AH2]1!!%$^UFGA+-b,6'&>Q):eac/8pDht0o=; + >;@KM!g4<4NZG^CEp;O;f$<'3/7SNZ=Y)b@k6CB2&HDe2!'jU*3H,of + 1THWTTA'C>b3f-+Xt2ko\Q-??_$a*S.lRVY^WY1]F*SFc2mtG!!)4&^\>Qo%E:.@#ZH%l>[fK + uKAG=rS"7kFhLFkFjepFrp]c6EX9j65NfN^V)g(i*b7dB.[r/pa_Z%o@$!W2X>D&>g&]TbK + \M<;X3:@Luz+A37])DuB%480=0U>>IGZl_$e0A!rk17o?MODI + #`T+N`bk[be + GmX)`Na!4%bT+^7m9I-:)^AT^4&WAPs%1\F71$An#T]9,U"=npO*q[!!!!Ab@*(AL_4SJ%3 + c(0Qqj_6(@Tt'=UU:t!rr<$!9f^^7m-=bPk!4fG6%u$A5)Ge9Ddkz!%;*coV>:GA_ + ]e:889j/&q['EIbg=I^%IQ_*>\\U!!!!Qn`ki.L]L9+a,gRY+=^sXaGkY__7]6Ez!'g\G@8 + ZWnn)QZq6kBJu4HB,j@UnDChdlfg!!!"LBTeMe41AJ'ZEW@QUdPas;'\:Um>i:!bPUE/z!+ + ^*!G"#U2:8VJHbPNT>LH"TS + N&!!%lg+.p("knNl3-6b[A0c8#IZ*IKEA^gIn`$F46;#gRr!!&ZSQS1JhgXUlPQkMasKJA+ + *3b#W;z!.Enno4c)*c.kg\#_F2Kbau*bpsWm4G>/&;!!!"l3q;`sS"7l-=n!Mb+p^&N_DuD + /7gJoS40BG0#2])Iz!+7oODnd:?HR8Ek."WR4\r7Kao^pOXhY0P@z^k'joaEc6YEZ^Df#_J + klIbqfb&M^reNW9%Z!!%Ng#".st4Z@^k0&\uN71^`&VbcJe-]WHB^*s*`zPMkPDs"W*MgrH + ?!Jn3P.Z$#Yb+3aUg#QXZ"g:R*W.-j$Hj8WGuR + J;+a,*2&-Or2FGEgK^qGR/hH@0cCT$Q1T+qB%Jdm3HHl=G7hL0@msI=*m'?[GK(Sa0D^mg/ + O\1dk\]KopmAN#,j%oaVpg)-=m;oUlJkrM3`^o]n.?8i<5tM%Vr/pcF^63/(nC^f>Af&QmO + ZmOVHM^(%GlRi'%]<+2k"Lg?T490YA94>Is(,,Uk]746J5N2AVq6j,P(pD9er"-,[Ek9B!8 + rEVh@Q/6D-cYQ<`0./?rlgnk0'Go2#mVG]t5qtHMjtB#;21)Rm';fj,).G)#sZ)j4r>]"ga + )=cao9oWenXdKbi"hde_5=ct=0q!#[2I(t_]*Cs)PNi7#*0;:4IpH0(lFrVajbV\]=5RB4* + (F32;)i7"m*&`+I"._`ZF/bFl'!5Ot`8e(4ErPeELP*NXnrP>)[5%k-#J7-Y]?[d"Ok2ghH6,AV%o)cJ1MisPk&#]esOpR8api7#!-i@L.W]4()XY-+AC-P-7Xr4 + \KZmhX7(&q"_c1^q(.FPEXMSY8h"!!'NaA27/3i,$^2B^cU;dR.beG#A49kpoLGPG-;>!!%6Tf<9=`6u+-/b7-X=9DXQ8Z>u]DeQk,I"Vh# + f;6R+0j3=FT6B0P06dPI(#.3CW?/Jre3V6GU!!#CNe;8)[cJBCcfTpVd^%QJlm&MY1cOU!U + GUS`seDWd>o:FYII.3GDcPFj]Er'<^k[O\p!$8_&JRhJtj0LNKK+Hq(I^aSuD5d?mgu.*uk + gKS5!/=9V?[pVH-_I!92Y]Nil.9sQ8#n.9H%[gN!+T%lT%LILZg>c%i5<)^`d;ku@oFsL9T)s>4CL + GX!.[;\fA"&apD:/KHFB"/&=].p<)_W:rMKVqn0b&fkC`Z#SpT1(ejr0`id"bn4unrL8;4e + $!kIPA!!)L)%1Wl>q4dQLIr#WZj@c8Q860X-ZJ?=+ + 5DHn;!<=7k[($!5\8'pN$2MEXIVDcG^0-?Febo3[NR7DP!!$Q8?b5[lW&XMCPdS>/!,9B;1 + HeoJ>'K"QGNeo=!!(#r6t2h_^tD05Z7>g&Y:lk7h@N=,4WFb.!5`Dbm>)NW:EH,EHomDk2K + _@cb2noFHjTiR,K.hG[s)]hCi4Dnn7CQBH6i,i5T.sj:N*2eH(t1:4S2nb!!)rJi8A!a;u= + `!Q'95L#2^GsLYA!_q9.[LFhAl`9)3-%cVdZCqWp;X+n:]Adb-hMf + k!!(fH<9h4OX[W\uV`e&lI'\q6@X$^TR_GR&]lj__!2EfnXn[I\B3okW/GPs5i@)%hn/KJQ + n`iahe5SC#o^mmPP5kT5+nklrCEI@Uo'D=Pi2_WTcPFg_\81tSSK2"0mi)6,i8I;)#+JAs7 + 9<#f[hmI3uN!!'eGqPj(QrDdKr]tS"Qhu#U@ma4ssfNapl&rBnSjg#VhqM14+)AFHB6jRYJ0;FA` + K)sr8tn1aZ\sER8IEoDB8Y.S5l*7Gh;'%HH3=3Jpn'(o>s#:bbj#pi4EDt3S"!]jIeCFMLK + eZQ\/kFW!rr>2[uRLp7r$AP?bQL8S + kPK%nCdKjU1q#"3"-n?aJq5!.hHX!Bq+9;HB@ngF1H7`uLm77__6=1<)!!"67It.%;`Qn=tkKC?c/ULu_k6;H6Of[=A3@26)I(ZS_^ + >VUUHX!DU'EA-k^@_'i``fMbg>B8K6g_LhJ$`TaZ.E4[A4Cp;#APd^k^e/!heK/H[YR`&*?!b5%@oG9lK#!Aei(pUge1Iebbg + Hn(VnE]oAo(jfY(9U&Xoh!!)f#;Q7JOf=P6?>\uOXmZ_OS'[3O7CjibY:`uAJXC7B"=)_6-(fN)$[?e.O + hIpos] + +Q +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/AlgoApprofondie/diapos/graphics/Logo-PCLL.svg b/AlgoApprofondie/diapos/graphics/Logo-PCLL.svg new file mode 100644 index 0000000..d42bd44 --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/Logo-PCLL.svg @@ -0,0 +1,585 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + +   + +       + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AlgoApprofondie/diapos/graphics/debian.eps b/AlgoApprofondie/diapos/graphics/debian.eps new file mode 100644 index 0000000..ff431ef --- /dev/null +++ b/AlgoApprofondie/diapos/graphics/debian.eps @@ -0,0 +1,318 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 262 316 372 461 +%................................ +%%Creator: GNU Ghostscript 510 (epswrite) +%%CreationDate: 1999/12/10 21:20:34 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%EndComments +%%BeginProlog +% This copyright applies to everything between here and the %%EndProlog: +% Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved. +%%BeginResource: procset GS_pswrite_ProcSet +/GS_pswrite_ProcSet 40 dict dup begin +/!{bind def}bind def/X{load def}! +/rg/setrgbcolor X/g/setgray X/w/setlinewidth X/J/setlinecap X +/j/setlinejoin X/M/setmiterlimit X/d/setdash X/i/setflat X +/m/moveto X/l/lineto X/c/curveto X/h/closepath X +/lx{0 rlineto}!/ly{0 exch rlineto}!/v{currentpoint 6 2 roll c}!/y{2 copy c}! +/re{4 -2 roll m exch dup lx exch ly neg lx h}! +/q/gsave X/Q/grestore X/f/fill X/f*/eofill X/S/stroke X/rf{re f}! +/Y{initclip clip newpath}!/Y*{initclip eoclip newpath}!/rY{re Y}! +/@/currentfile X/|{string readstring pop}! +/Ix{[1 0 0 1 9 -1 roll neg 9 -1 roll neg]exch}! +/It{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! +/Ic{Ix false 1 colorimage}! +/@85{@/ASCII85Decode filter}! +end def +%%EndResource +%%EndProlog +%%Page: 1 1 +%%BeginPageSetup +save GS_pswrite_ProcSet begin 0.1 0.1 scale +%%EndPageSetup +0.843137 0.027451 0.317647 rg +0 0 m +6120 0 l +6120 7920 l +0 7920 l +Y +3233.33 4125.86 m +3218.39 4125.66 3236.15 4118.18 3255.66 4115.17 c +3261.06 4119.39 3265.94 4123.63 3270.29 4127.77 c +3258.15 4124.8 3245.79 4124.73 3233.33 4125.86 c +f +3313.52 4145.85 m +3322.43 4158.14 3328.92 4171.58 3331.2 4185.48 c +3329.19 4175.58 3323.84 4167.03 3318.76 4157.99 c +3290.83 4140.4 3316.12 4168.43 3318.74 4179.1 c +3288.72 4141.27 3314.61 4156.42 3313.52 4145.85 c +f +3343.14 4222.89 m +3344.95 4249.8 3337.84 4241.28 3335.46 4231.03 c +3338.23 4229.57 3340.44 4212.05 3343.14 4222.89 c +f +3176.66 4590.68 m +3184.64 4589.26 3193.91 4588.16 3192.58 4586.25 c +3201.32 4588.18 3203.3 4589.92 3176.66 4590.68 c +f +3192.58 4586.25 m +3186.96 4585.08 l +3192.21 4585.56 l +3192.58 4586.25 l +f +3441.26 4212.69 m +3442.16 4188.53 3434.21 4176.79 3427.02 4156.03 c +3414.1 4149.6 l +3403.54 4129.06 3415.15 4136.56 3407.57 4120.23 c +3391.05 4105.56 3357.51 4074.34 3346.77 4071.48 c +3338.92 4071.65 3352.08 4080.74 3353.8 4084.29 c +3331.71 4069.13 3336.06 4061.53 3302.29 4052.3 c +3301.3 4054.51 l +3218 4015.31 3102.28 4092.98 3103.8 4198.94 c +3102.92 4192.22 3101.27 4193.9 3099.43 4191.2 c +3095.13 4245.71 3124.61 4300.46 3174.33 4322.85 c +3222.96 4346.91 3279.97 4337.05 3314.79 4304.56 c +3295.66 4329.62 3257.58 4356.19 3212.45 4353.73 c +3168.24 4353.01 3126.88 4324.92 3113.07 4294.41 c +3090.43 4280.16 3087.79 4239.45 3077.93 4231.99 c +3064.64 4134.39 3102.9 4092.24 3167.63 4042.63 c +3177.79 4035.77 3170.49 4034.72 3171.85 4029.5 c +3150.35 4039.56 3130.67 4054.76 3114.47 4073.37 c +3123.07 4060.8 3132.34 4048.58 3144.33 4038.98 c +3124.04 4045.83 3096.95 4088.11 3089.06 4089.83 c +3124.01 4027.25 3230.84 3980.08 3286.81 4003.49 c +3260.92 4002.53 3228.03 4002.96 3198.94 4013.71 c +3186.7 4020 3170.1 4033.01 3173.07 4035.44 c +3249.42 4006.93 3328.29 4013.86 3394.36 4066.81 c +3411.16 4079.91 3429.52 4102.18 3434.83 4102.48 c +3426.85 4090.46 3436.2 4096.7 3430.07 4086.09 c +3446.8 4113.1 3422.78 4097.09 3447.37 4132.73 c +3456.46 4120.23 l +3453.07 4142.67 3484.31 4169.89 3481.12 4205.35 c +3488.29 4216.19 3489.11 4193.67 3481.51 4168.73 c +3492.06 4196.4 3484.31 4200.85 3487 4223.69 c +3489.92 4216.01 3493.78 4207.86 3495.75 4199.75 c +3488.88 4226.5 3502.78 4244.78 3506.24 4260.33 c +3502.82 4261.83 3495.64 4248.51 3493.98 4280.09 c +3494.23 4293.81 3497.8 4287.28 3499.17 4290.66 c +3496.49 4292.21 3489.42 4302.73 3485.13 4322.9 c +3488.22 4327.65 3493.45 4310.61 3497.69 4309.92 c +3494.96 4325.95 3490.26 4338.18 3490.07 4350.49 c +3477.67 4376.39 3485.67 4347.03 3475.64 4361.61 c +3462.44 4402.75 3486.57 4371.16 3488.21 4389.84 c +3508.19 4360.89 3519.59 4315.99 3524.83 4297.4 c +3520.83 4320.07 3514.39 4342.04 3506.49 4363.29 c +3512.59 4360.72 3496.72 4409.92 3514.4 4377.34 c +3495.52 4446.79 3433.62 4511.69 3376.67 4542.13 c +3383.62 4535.76 3392.42 4527.76 3389.27 4526.5 c +3360.94 4543.35 3365.92 4544.68 3361.85 4551.8 c +3338.8 4561.19 3337.27 4551.03 3322 4551.78 c +3278.52 4574.86 3270.13 4572.4 3230.1 4586.85 c +3231.91 4578.33 l +3203.1 4587.93 3198.34 4574.71 3167.21 4578.31 c +3165.32 4579.78 3177.19 4583.67 3186.96 4585.08 c +3159.11 4581.4 3160.41 4590.58 3133.15 4584.07 c +3139.86 4588.78 3146.98 4591.91 3154.14 4595.91 c +3131.43 4594.53 3099.9 4582.69 3109.63 4593.47 c +3072.58 4576.93 3006.77 4553.72 2969.84 4519.09 c +2968.68 4526.85 l +2951.76 4506.54 2894.89 4466.19 2890.36 4439.86 c +2885.83 4438.81 l +2877.04 4423.9 2871.33 4407.01 2864.35 4391.68 c +2852.84 4372.05 2847.47 4384.12 2849.11 4381.04 c +2826.46 4335.12 2815.19 4296.54 2805.48 4264.88 c +2812.4 4254.53 2805.65 4202.56 2808.26 4160.97 c +2796.9 3955.53 2952.44 3756.07 3122.46 3710.04 c +3147.38 3701.11 3184.43 3701.44 3215.96 3700.55 c +3178.77 3711.19 3173.97 3706.17 3137.73 3718.81 c +3111.6 3731.13 3105.88 3745.18 3087.36 3761.25 c +3094.69 3748.3 l +3058.39 3761.15 3073.58 3764.2 3044.04 3773.55 c +3051.87 3783.77 l +3040.1 3784.67 3020.7 3803.59 3015.4 3814.1 c +3002.52 3813.59 l +2987.06 3832.66 2978.81 3846.43 2979.42 3857.09 c +2975.26 3849.67 l +2970.55 3857.75 2918.35 3921.25 2945.43 3906.47 c +2940.4 3911.05 2933.71 3913.94 2926.46 3927.13 c +2931.97 3933.42 l +2918.96 3950.19 2907.99 3971.68 2908.83 3978.84 c +2915.78 3969.46 2920.6 3967.7 2925.38 3966.09 c +2892.47 4047.73 2890.62 3970.58 2865.71 4049.19 c +2870.97 4049.61 l +2866.94 4055.72 2864.47 4062.31 2861.23 4068.8 c +2863.53 4091.65 l +2839.85 4119.01 2856.91 4208.1 2860.34 4256.95 c +2862.69 4276.81 2880.11 4297.96 2893.34 4331.13 c +2885.28 4332.51 l +2900.7 4359.39 2973.3 4440.5 3006.94 4436.34 c +3023.23 4456.8 3003.7 4436.42 3000.51 4441.56 c +3036.3 4478.59 3047.55 4467.72 3071.7 4474.39 c +3097.73 4489.84 3049.35 4468.35 3061.69 4480.28 c +3106.72 4491.77 3093.59 4506.42 3152.32 4512.25 c +3158.52 4508.73 3137.95 4506.81 3132.79 4502.24 c +3170.29 4520.6 3251.48 4516.41 3304.23 4492.06 c +3365.41 4463.45 3434.17 4378.92 3436.89 4299.39 c +3439.97 4298.56 l +3438.41 4266.94 3444.81 4230.37 3433.71 4196.79 c +3441.26 4212.69 l +f +3070.23 4105.36 m +3068.12 4094.89 l +3077.95 4081.54 3085.75 4067.08 3098.28 4056.68 c +3089.26 4074.27 3082.57 4081.54 3070.23 4105.36 c +f +3093.44 4106.26 m +3088.24 4112.02 3085.18 4118.94 3081.72 4125.82 c +3085.02 4113.71 3091.78 4103.3 3098.05 4092.7 c +3093.44 4106.26 l +f +3504.27 4195.56 m +3502.08 4190.04 l +3498.06 4161.46 3489.36 4133.18 3476.03 4106.95 c +3490.75 4134.62 3500.25 4164.89 3504.27 4195.56 c +f +3179.63 4597.85 m +3189.73 4601.54 3204.45 4599.88 3215.19 4602.31 c +3201.21 4601.14 3187.3 4600.44 3173.57 4598.69 c +3179.63 4597.85 l +f +2824.92 4409.23 m +2827.25 4387.69 2808.72 4379.32 2829.02 4393.54 c +2839.92 4418.08 2824.78 4400.31 2824.92 4409.23 c +f +2801.04 4309.49 m +2805.73 4323.86 2806.57 4332.48 2808.36 4340.81 c +2795.43 4324.27 2802.4 4320.74 2801.04 4309.49 c +f +0 g +2758.02 3347.25 m +2757.57 3346.78 2757.57 3272.19 2756.64 3252.72 c +2755.72 3236.97 2754.32 3203.15 2720.96 3203.15 c +2686.67 3203.15 2678.33 3242.54 2675.55 3259.67 c +2672.31 3278.67 2672.31 3294.43 2672.31 3301.37 c +2672.31 3323.61 2673.7 3385.72 2726.06 3385.72 c +2741.82 3385.72 2750.62 3381.07 2757.57 3377.38 c +2758.02 3347.25 l +h +2623.65 3292.56 m +2623.65 3161.9 2693.16 3161.9 2703.35 3161.9 c +2732.08 3161.9 2750.62 3177.66 2758.49 3204.98 c +2759.42 3163.75 l +2768.23 3164.22 2777.03 3165.14 2791.39 3165.14 c +2796.49 3165.14 2800.65 3165.14 2804.37 3164.67 c +2808.08 3164.67 2811.78 3164.22 2815.95 3163.75 c +2808.54 3178.57 2802.98 3211.93 2802.98 3284.24 c +2802.98 3354.67 2802.98 3473.75 2809 3509.9 c +2792.33 3502.01 2777.95 3496.91 2746.44 3494.14 c +2758.95 3480.7 2758.95 3473.75 2758.95 3412.6 c +2750.16 3415.37 2739.03 3418.61 2720.03 3418.61 c +2637.09 3418.61 2623.65 3346.33 2623.65 3292.56 c +f +2874.95 3316.21 m +2875.42 3354.67 2883.3 3388.97 2916.19 3388.97 c +2952.34 3388.97 2955.1 3349.12 2954.18 3316.21 c +2874.95 3316.21 l +h +3000.05 3311.56 m +3000.05 3365.78 2989.4 3419.08 2920.82 3419.08 c +2826.3 3419.08 2826.3 3314.35 2826.3 3292.11 c +2826.3 3198.05 2868.46 3160.98 2939.36 3160.98 c +2970.85 3160.98 2986.16 3165.6 2994.5 3167.93 c +2994.04 3184.61 2996.35 3195.27 2999.15 3209.63 c +2989.4 3203.59 2976.89 3195.72 2949.09 3195.72 c +2876.8 3195.72 2875.87 3261.54 2875.87 3284.24 c +2999.15 3284.24 l +3000.05 3311.56 l +f +3150.8 3291.64 m +3150.8 3248.55 3142.93 3190.62 3089.18 3190.62 c +3081.76 3190.62 3072.5 3192.03 3066.48 3193.42 c +3065.55 3210.1 3065.55 3238.83 3065.55 3272.19 c +3065.55 3312.05 3069.71 3332.87 3072.97 3343.09 c +3082.69 3375.98 3104.47 3376.44 3108.63 3376.44 c +3143.85 3376.44 3150.8 3327.77 3150.8 3291.64 c +h +3017.82 3241.13 m +3017.82 3206.84 3017.82 3187.38 3012.26 3172.56 c +3031.26 3165.14 3054.88 3160.98 3083.16 3160.98 c +3101.23 3160.98 3153.59 3160.98 3181.85 3218.89 c +3195.29 3245.76 3199.92 3281.91 3199.92 3309.26 c +3199.92 3325.94 3198.07 3362.54 3184.63 3385.72 c +3171.66 3407.48 3150.8 3418.61 3128.57 3418.61 c +3084.08 3418.61 3071.11 3381.54 3064.17 3362.54 c +3064.17 3386.17 3064.62 3468.65 3068.32 3510.82 c +3038.21 3496.91 3019.66 3494.61 2999.75 3492.75 c +3017.82 3485.35 3017.82 3454.75 3017.82 3355.12 c +3017.82 3241.13 l +f +3288.99 3163.75 m +3279.73 3165.14 3273.22 3166.07 3259.78 3166.07 c +3244.98 3166.07 3234.77 3165.14 3224.12 3163.75 c +3228.75 3172.56 3230.6 3176.74 3231.99 3206.84 c +3233.85 3248.09 3234.32 3358.38 3231.07 3381.54 c +3228.75 3399.16 3224.59 3401.93 3218.1 3406.56 c +3256.09 3410.27 3266.76 3413.05 3284.35 3421.39 c +3280.65 3401.02 3280.18 3390.8 3280.18 3359.77 c +3279.26 3199.88 3278.79 3182.75 3288.99 3163.75 c +f +3437.37 3294.9 m +3436.46 3265.7 3435.99 3245.31 3428.1 3229.1 c +3418.37 3208.24 3402.16 3202.23 3390.11 3202.23 c +3362.29 3202.23 3356.28 3225.39 3356.28 3248.09 c +3356.28 3291.64 3395.21 3294.9 3412.8 3294.9 c +3437.37 3294.9 l +h +3309.93 3237.89 m +3309.93 3208.69 3318.74 3179.51 3344.7 3166.99 c +3356.28 3161.9 3367.86 3161.9 3371.57 3161.9 c +3414.21 3161.9 3428.56 3193.42 3437.37 3212.87 c +3436.9 3192.48 3437.37 3179.98 3438.76 3163.75 c +3447.1 3164.22 3455.44 3165.14 3469.35 3165.14 c +3477.22 3165.14 3484.64 3164.22 3492.51 3163.75 c +3487.41 3171.62 3484.64 3176.27 3483.23 3194.34 c +3482.31 3211.93 3482.31 3229.55 3482.31 3254.1 c +3482.78 3348.63 l +3482.78 3383.87 3473.51 3418.61 3403.99 3418.61 c +3358.14 3418.61 3331.26 3404.71 3317.82 3397.75 c +3323.39 3387.56 3328.02 3378.77 3332.18 3358.83 c +3350.26 3374.59 3373.9 3382.93 3397.98 3382.93 c +3436.46 3382.93 3436.46 3357.44 3436.46 3321.31 c +3427.65 3321.76 3420.22 3322.68 3407.71 3322.68 c +3348.86 3322.68 3309.93 3300 3309.93 3237.89 c +f +3704.27 3209.63 m +3704.74 3193.87 3704.74 3177.19 3711.22 3163.75 c +3701.02 3164.67 3694.99 3166.07 3676.01 3166.07 c +3664.87 3166.07 3658.86 3165.14 3650.05 3163.75 c +3651.89 3169.77 3652.84 3172.09 3653.76 3179.98 c +3655.15 3190.62 3656.08 3226.31 3656.08 3238.83 c +3656.08 3288.87 l +3656.08 3310.65 3656.08 3342.17 3654.68 3353.28 c +3653.76 3361.15 3651.46 3382.46 3624.56 3382.46 c +3598.15 3382.46 3589.36 3363.01 3586.1 3347.25 c +3582.41 3331.03 3582.41 3313.42 3582.41 3244.84 c +3582.86 3185.53 3582.86 3179.98 3587.49 3163.75 c +3579.62 3164.67 3569.89 3165.6 3555.99 3165.6 c +3544.85 3165.6 3537.45 3165.14 3528.19 3163.75 c +3531.44 3171.17 3533.29 3174.88 3534.21 3200.82 c +3535.15 3226.31 3537 3351.43 3532.8 3381.07 c +3530.5 3399.16 3525.85 3403.32 3520.77 3407.95 c +3558.31 3409.8 3570.34 3415.84 3581.94 3421.85 c +3581.94 3372.73 l +3587.49 3387.11 3599.07 3419.08 3645.42 3419.08 c +3703.35 3419.08 3703.8 3376.91 3704.27 3349.12 c +3704.27 3209.63 l +f +0.843137 0.027451 0.317647 rg +3292.9 3486.97 m +3254.53 3448.61 l +3216.17 3486.97 l +3254.53 3525.33 l +3292.9 3486.97 l +f +end showpage restore +%%PageTrailer +%%Trailer +%%Pages: 1 diff --git a/AlgoApprofondie/diapos/img/cesi.jpg b/AlgoApprofondie/diapos/img/cesi.jpg new file mode 100644 index 0000000..dafbe55 Binary files /dev/null and b/AlgoApprofondie/diapos/img/cesi.jpg differ diff --git a/AlgoApprofondie/diapos/img/logo-cadoles.png b/AlgoApprofondie/diapos/img/logo-cadoles.png new file mode 100644 index 0000000..de8ddc0 Binary files /dev/null and b/AlgoApprofondie/diapos/img/logo-cadoles.png differ diff --git a/poo/INFAL26-ConceptsDemarcheObjet.pdf b/poo/INFAL26-ConceptsDemarcheObjet.pdf new file mode 100644 index 0000000..17f55bc Binary files /dev/null and b/poo/INFAL26-ConceptsDemarcheObjet.pdf differ diff --git a/poo/cours/Makefile b/poo/cours/Makefile new file mode 100644 index 0000000..8b94f17 --- /dev/null +++ b/poo/cours/Makefile @@ -0,0 +1,216 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Algorithmique.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Algorithmique.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Algorithmique" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Algorithmique" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/poo/cours/_static/cesi.jpg b/poo/cours/_static/cesi.jpg new file mode 100644 index 0000000..dafbe55 Binary files /dev/null and b/poo/cours/_static/cesi.jpg differ diff --git a/poo/cours/algo.txt b/poo/cours/algo.txt new file mode 100644 index 0000000..c2f8ed7 --- /dev/null +++ b/poo/cours/algo.txt @@ -0,0 +1,291 @@ +Algorithmique +============= + +Al-Kharezmi, auteur du traité "Kitab al jabr w'al-muqabala", est l'inventeur +des manipulations algébriques (algèbre = **al jabr**). +C'est Léonard de Pise, dit Fibonacci, qui emprunta le nom du célèbre +mathématicien arabe du 9ème siècle, mais l'algèbre existe +depuis bien plus longtemps (Depuis Babylone, puis ensuite l'Egypte ancienne). + +.. glossary:: + + + algorithme + + terme désignant une suite d'opérations constituant un schéma de calcul + ou de résolution d'un problème. C'est un processus systématique de + résolution d'un problème permettant de décrire précisément des étapes. + C'est une suite finie d'instructions permettant de donner la réponse à un + problème. + +L'algorithmique est l'étude et la production de règles et de techniques +qui sont impliquées dans la définition d'algorithmes. + +Implémentation d'un algorithme +------------------------------ + +.. glossary:: + + implémentation + + Adaptation de la méthodologie de calculabilité au calcul effectif + sur une machine abstraite ou via un langage formel. + +Il n’y a pas de parcours à sens unique de l’algorithme vers l’implantation. +La quête d’une implantation efficace nous amène souvent à effectuer +un retour vers les algorithmes eux-mêmes, et à en modifier des points +essentiels. L’aspect théorique de réflexion sur les algorithmes, +et l’aspect pratique de l'implémentation sont donc en symbiose. + +Un existant émerge de la décomposition structurale d'un +domaine de base. Le fait essentiel, c'est la genèse des genres de l'existant les +uns à partir des autres. + +L'essence d'une forme (un algorithme) se réalise au sein d'une matière qu'elle créée +(un langage). L'origine d'une matière fait naître les formes (concepts) +que sa structure dessine. + +- Notion structurale de non-contradiction +- Notion extensive de "réalisation dans un champ donné" + +Deux aspects réciproques : l'essence d'une forme se réalise au sein d'une +matière qu'elle crée, l'essence d'une matière faisant naître les formes que sa +structure dessine. + +Abandonner l'idée trop simpliste de domaines concrets et d'opérations abstraites +qui posséderaient en eux-mêmes comme une nature de matière et une nature de +forme ; cette conception tendrait, en effet, à stabiliser les existants +mathématiques dans certains rôles immuables et ignorerait le fait que les +existants abstraits qui naissent de la structure d'un domaine plus concret +peuvent à leur tour servir de domaine de base pour la genèse d'autres existants. + +L'algorithme comme généralisation de la calculabilité +------------------------------------------------------ + +L'importance croissante de l'informatique comme outil scientifique +impose d'élaborer un nouveau mode de description des méthodes de calcul (appelées algorithmes) +susceptible de satisfaire à la fois le critère de sécurité (maîtrise du résultat) et la possibilité +d'implémenter les calculs sur un ordinateur. + +Exemple d'algorithme +--------------------- + +.. raw:: latex + + \begin{algorithm} + \caption{L'alorithme de Bellman-Kalaba} + \begin{algorithmic}[1] + \Procedure {BellmanKalaba}{$G$, $u$, $l$, $p$} + \ForAll {$v \in V(G)$} + \State $l(v) \leftarrow \infty$ + \EndFor + \State $l(u) \leftarrow 0$ + \Repeat + \For {$i \leftarrow 1, n$} + \State $min \leftarrow l(v_i)$ + \For {$j \leftarrow 1, n$} + \If {$min > e(v_i, v_j) + l(v_j)$} + \State $min \leftarrow e(v_i, v_j) + l(v_j)$ + \State $p(i) \leftarrow v_j$ + \EndIf + \EndFor + \State $l(i) \leftarrow min$ + \EndFor + \State $changed \leftarrow l \not= l’$ + \State $l \leftarrow l$ + \Until{$\neg changed$} + \EndProcedure + \Statex + \Procedure {FindPathBK}{$v$, $u$, $p$} + \If {$v = u$} + \State \textbf{Write} $v$ + \Else + \State $w \leftarrow v$ + \While {$w \not= u$} + \State \textbf{Write} $w$ + \State $w \leftarrow p(w)$ + \EndWhile + \EndIf + \EndProcedure + \end{algorithmic} + \end{algorithm} + +Exemple d'algorithme avec son implémentation +--------------------------------------------- + +Soit l'algorithme de factorielle suivant, + +.. raw:: latex + + \begin{algorithm} + \caption{Algorithme de la factorielle d'un nombre}\label{factorielle} + \begin{algorithmic}[1] + \Function{factorielle}{$n$}\Comment{La fonction récursive factorielle} + \BState \emph{parametre} : $n$ entier + \If{$n = 1$} + \BState \emph{Sortie} : 1 + \Else + \BState \emph{Sortie} : $n * \Call{factorielle}{n-1}$ \Comment{On appelle la fonction dans l'algorithme lui-même} + \EndIf + \EndFunction + \end{algorithmic} + \end{algorithm} + +et son implémentation en python : + +.. literalinclude:: code/factorielle.py + :language: python + +En voici une autre implémentation (en OCaml) : + +.. literalinclude:: code/factorielle.ml + :language: ocaml + +On remarque que le **pseudocode** est très proche de +la syntaxe du python : + +.. function:: factorielle(n:int) + +:: + + if n=1 + return 1 + else + return n * factorielle(n-1) + end if + +Qualité d'un algorithme +----------------------- + +- correction d'un algorithme +- complétude d'un algorithme + +Sémantique + + Étude du sens, de la signification d'un langage + Définir la sémantique d’un langage formel consiste à lui donner une + signification mathématique. + +Sémantique opérationnelle + + on définit la sémantique par sa mise en œuvre sur + une machine abstraite. + +Sémantique dénotationnelle + + on associe à chaque construction syntaxique un + objet mathématique + +Sémantique axiomatique + + chaque construction est décrite par la manière dont + elle transforme des propriétés ou des prédicats. + +Proposition + + une proposition est un énoncé qui est soit vrai, soit faux + +**exemple** : ``2 + 3 = 5``. Proposition vraie. + +Prédicats + + Une proposition dont la valeur de vérité dépend de la valeur d’une ou plusieurs variables + +**Exemple** : ``n est pair`` : vrai pour n = 4 mais faux pour n = 9 + + +Axiome + + une proposition qui est supposée vraie + +Un ensemble d’axiomes est consistant s’il n’existe pas de proposition +dont on peut démontrer qu’elle est à la fois vraie et fausse. + +Un ensemble d’axiomes est complet si, pour toute proposition, il est +possible de démontrer qu’elle est vraie ou fausse. + +Théorème d’incomplétude de Gödel (1931) : tout ensemble +consistant d’axiomes pour l’arithmétique sur les entiers est +nécessairement incomplet. + +**Les concepts de base en algorithmique sont les axiomes** + +inférence + + règles d’inférence, règles permettant de combiner des axiomes et des + propositions vraies pour établir de nouvelles propositions vraies. + +Démonstration + + vérification d’une proposition par une séquence de déductions logiques + à partir d’un ensemble d’axiomes. + +Lorsque le champ donné (le domaine) ne contient qu'un nombre fini d'individus, +on peut définir un choix de valeur des variables permettant de vérifier la +proposition obtenue par la *conjonction* de tous les axiomes du système proposé. +On dit alors que ce choix *réalise* un système d'axiomes. + + +Il ne s'agit plus de savoir si la définition entraîne l'existence, mais de +chercher si la structure d'un système d'axiomes (*règles*) peut donner naissance +à un champ d'individus qui soutiennent entre eux les relations définies pas les +axiomes. + +Concret et abstrait +-------------------- + +Il est possible qu'un même genre d'existant joue dans un schéma de genèse le +rôle d'abstrait par rapport à un concret de base, et soit au contraire dans une +autre genèse le concret de base d'un nouvel abstrait. + +Une pareille présentation des choses implique un tel renversement par rapport +aux habitudes de pensée classiques, qu'il faut encore insister sur le sens +nouveau que reçoivent ici les expressions de "concret" et "d'abstrait". + +Les systèmes d'axiomes sont souvent conçus comme des structures purement +formelles, abstraites. Ces structures sont si profondément engagées dans la +genèse de leurs réalisations, qu'il valait mieux désigner par ces termes les +structures de base. + +Un système d'axiome *peut* devenir le concret de base. + +Ceci permet d'exprimer non seulement l'engagement du concret dans la genèse de +l'abstrait, mais encore les relations d'imitation qui peuvent exister entre la +structure de cet abstrait et celle du concret de base. + +Dans certains cas, la genèse de l'abstrait à partir d'un concret de base +s'affirme jusqu'à réaliser une imitation de structure entre ces genres +d'existants qui naissent l'un de l'autre. + +**C'est pourquoi on représente souvent un algorithme en pseudo-code**, +c'est-à-dire en fait dans le mode de représentation (issu du langage préféré de la +personne qui l'exprime) dominant chez la personne qui exprime un algorithme. + +Comment rendre un algorithme lisible +------------------------------------ + +- Le bon algorithme utilise des identifiants explicites. +- Le bon algorithme est structuré. +- Le bon algorithme est indenté. + +Complexité d'un algorithme +-------------------------- + +On peut approximer la complexité des algorithmes. +C'est utile pour pouvoir comparer des algorithmes. + +complexité + + estimer la complexité d'un algorithme, c'est estimer le nombre de calculs qu'il utilise. + +Si f est la fonction caractérisant exactement le coût d’un algorithme et n +la taille des données, on s’intéresse à la façon dont augment f(n) lorsque n augmente +on va montrer que f(n) n'augmente pas plus vite qu’une autre fonction +g(n). Du point de vue mathématique, on dit que la fonction f est dominée +asymptotiquement par la fonction g ce qui se note f = O(g) + +- Complexité temporelle : c’est le nombre d’op«erations effectuées par + une machine qui exécute l’algorithme. + +- Complexité spatiale : c’est le nombre de positions mémoire utilisées par + une machine qui exécute l’algorithme. diff --git a/poo/cours/annexes/agile.txt b/poo/cours/annexes/agile.txt new file mode 100644 index 0000000..5884c11 --- /dev/null +++ b/poo/cours/annexes/agile.txt @@ -0,0 +1,83 @@ +La planification agile +======================== + +Le mode itératif +----------------- + +- livrer des versions successives et utilisables qui convergent vers + la version finale + +- ne pas perdre d'énergie à maintenir des specs détaillées non nécessaires + +- de nouvelles orientations fonctionnelles sont possibles, même tard + +- les specs détaillées sont écrites "juste à temps" + + +La planification agile +----------------------- + +- chaque livraison est un projet qui est planifié en tant que tel +- utiliser l'expérience acquise pour affiner les estimations +- préservation de l'écologie du projet au quotidien (code, tests...) + +La confiance, feedback +----------------------- + +- livraisons régulières +- progrès visibles par tous (pas d'effet tunnel) +- pilotage du projet par choix du contenu des livraisons +- investissement du Product Owner +- chercher la collaboration plutôt que la confrontation + +L'agilité +---------- + +- le projet n'est pas joué d'avance +- cultiver la souplesse +- révolution douce +- sortir de la confrontation, jouer le "nous collectif" + mettre tout le monde sur le mme pont et amener tout le monde à bon port + +Les outils agiles +------------------ + +- planification par itérations de 4 semaines +- entrepot de source partagé +- intégration continue +- tests automatisés +- pair programming sur points cruciaux +- sprints +- extranet : + + - hitoires utilisateurs + - test cases + - gestion du backolog et des tickets + - suivi de l'avancement + - documentation + +Le product owner +----------------- + +idéalement, + +- connaissance du métier à informatiser +- fibre projet +- dispo à 100% + +Les tests +--------- + +- automatiser +- viser l'exhaustivité +- tester une cible mouvante +- migrer les tests d'une release à l'autre + +Questions importantes en environnement agile +---------------------------------------------- + +- quelle durée d'itération ? +- comment découper en itérations ? +- que faire lorsque le product owner se retrouve sur le chemin critique ? +- la planification est faite en mode "juste à temps" et "juste assez" +- on ne s'échine plus à blâmer, au contraire on cherche à gagner ensemble diff --git a/poo/cours/annexes/exercices.txt b/poo/cours/annexes/exercices.txt new file mode 100644 index 0000000..1597a02 --- /dev/null +++ b/poo/cours/annexes/exercices.txt @@ -0,0 +1,19 @@ +Exercices complémentaires +-------------------------- + ++ **Manipulation de chaînes de caractères**: + (création, accès à un caractère, concaténation), listes (création, ajout + d’un élément, suppression d’un élément, accès à un élément, extraction d’une partie de liste), tableaux à une ou plusieurs dimensions. + + + traitement des chaines de caractères + + s.replace() + + s1 + s2 + + un exemple de regexp simple + ++ **Fichiers** : + notion de chemin d’accès, lecture et écriture de données numériques ou de type chaîne de caractères depuis ou vers un fichier. + On encourage l’utilisation de fichiers en tant que supports de données ou de résultats avant divers traitements, par exemple graphiques. + ++ **Piles** + Algorithmes de manipulation : fonctions 'push' et 'pop'. On utilise des listes + (ou tableaux à 1 dimension) pour leur implantation. diff --git a/poo/cours/annexes/index.txt b/poo/cours/annexes/index.txt new file mode 100644 index 0000000..dc5acf1 --- /dev/null +++ b/poo/cours/annexes/index.txt @@ -0,0 +1,10 @@ +Annexes +========= + +.. toctree:: + :maxdepth: 2 + + exercices + surete + agile + scrum diff --git a/poo/cours/annexes/scrum.txt b/poo/cours/annexes/scrum.txt new file mode 100644 index 0000000..3777780 --- /dev/null +++ b/poo/cours/annexes/scrum.txt @@ -0,0 +1,176 @@ +scrum +===== + +.. glossary:: + + scrum + + Scrum est une méthode agile pour la gestion de projets + Le terme Scrum est emprunté au rugby et signifie mêlée. + Ce processus s'articule en effet autour d'une équipe soudée, + qui cherche à atteindre un but, comme c'est le cas en rugby + pour avancer avec le ballon pendant une mêlée. + + +Scrum définit trois rôles principaux : + +- le responsable de produit -- Product Manager, +- le faciliteur -- ScrumMaster +- le développeur + +et bien sûr, l'équipe (auto-gérée). + +Des intervenants peuvent s'intégrer également au projet +de façon plus ponctuelle. + +responsable de produit + + Le responsable de produit (Product Manager) est le représentant des + clients et utilisateurs. + C'est lui qui définit l'ordre dans lequel les fonctionnalités + seront développées et qui prend les décisions importantes + concernant l'orientation du projet. + +Le terme responsable n'est d'ailleurs pas à prendre au sens hiérarchique +du terme, mais dans le sens de l'orientation. + +équipe, développement + + outes les décisions sont prises ensemble et personne ne donne d'ordre + à l'équipe sur sa façon de procéder + +facilitateur + + est chargé de protéger l'équipe de tous les éléments perturbateurs + +planification +-------------- + +Scrum utilise une planification à trois niveaux : + +- release/projet +- sprint +- quotidien -- ScrumMeeting + +quotidien + + Au quotidien, une réunion, le ScrumMeeting (pas plus de 15 min) + permet à l'équipe et au ScrumMaster de faire un point d'avancement sur + les tâches et sur les difficultés rencontrées. + répondre à trois questions : + * Qu'est-ce que j'ai fait hier ? + * Qu'est-ce que je compte faire aujourd'hui ? + * Quelles difficultés est-ce que je rencontre ? + +sprint + + Scrum est un processus itératif : les itérations sont appelées des sprints + et durent en théorie 30 jours calendaires. + En pratique, les itérations durent généralement entre 2 et 4 semaines. + Chaque sprint possède un but et on lui associe une liste d'items + de fonctionnalités à réaliser. + Ces items sont décomposés par l'équipe en tâches élémentaires + de quelques heures, les items de fonctionnalités de sprint. + + Pendant un sprint, les items de fonctionnalités de sprint à réaliser + ne peuvent pas être changés. + Les changements éventuels seront éventuellement réalisés + dans les sprints suivants. + +releases + + pour améliorer la lisibilité du projet, + on regroupe généralement des itérations en releases. + En effet, comme chaque sprint doit aboutir à la livraison + d'un produit partiel, une release permet de marquer la livraison + d'une version aboutie, susceptible d'être mise en exploitation + +gestion des besoins +------------------- + +tâches (backlog de sprint) +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Lorsqu'on démarre un sprint, on choisit quels items des fonctionnalités +seront réalisés dans ce sprint. + +L'équipe décompose ensuite chaque item en liste de tâches élémentaires +(techniques ou non), chaque tâche étant estimée en heures +et ne devant pas durer plus de 2 jours. +On constitue ainsi le backlog de sprint. + +Les items de backlog de produit sont les fonctionnalités qui deviendront +les items du baclog d'un sprint. +Ces fonctionnalités sont estimées en points relatifs, sans unité. + +planning poker + + façon ludique et efficace de produire des estimations + sur la complexité des fonctionnalités à développer + + pour évaluer les scénarios utilisateurs (user stories) + du carnet de produit (product backlog). + +à la fin d'un sprint : + +- revue de sprint +- rétrospective de sprint + +comprendre ce qui n'a pas bien marché dans le sprint, +les erreurs commises et de prendre des décisions pour s'améliorer + +mise en oeuvre +-------------- + +Scrum peut être mis en pratique avec trois fois rien : deux listes suffisent. +La liste des items du backlog de produit et la liste des items du backlog +de sprint. La saisie et la mise à jour des données est simplement +un peu moins agréable. + +glossaire +--------- + +Directeur de produit (Product Owner) (responsable produit) + + personne responsable de produire et maintenir à jour le backlog de produit. + C'est lui qui en détermine les priorités et qui prend les décisions + concernant l'orientation du projet. + +ScrumMaster (facilitateur) + + membre de l'équipe dont l'objectif principal est de la protéger + des perturbation extérieures. + Il est complètement transparent pour la communication entre l'équipe + et les clients et n'a aucun pouvoir hiérarchique sur l'équipe. + C'est en revanche un facilitateur pour les problèmes non techniques + de l'équipe. + +Backlog de produit (Product Backlog) (fonctionnalités) + + liste des fonctionnalités qui devront être réalisées par le logiciel. + +Backlog de sprint (Sprint Backlog) (tâches) + + liste des tâches à accomplir pendant un sprint. + Elles correspondent à la réalisation des items de backlog + du produit affectés au sprint. + +Mêlée quotidienne (Daily Scrum) (quotidien) + + réunion quotidienne de 15 minutes qui a pour but de faire le point + sur ce qui a été fait depuis la dernière mêlée, + ce qui est prévu de faire jusqu'à la prochaine + et quelles sont les embûches rencontrées durant le travail. + +Sprint (sprint) + + nom d'une itération dans Scrum. + Cette itération dure 30 jours calendaires en théorie, + mais en pratique on utilise plutôt entre 2 et 4 semaines. + Pendant une itération, l'équipe doit développer une liste d'items + du backlog de produit qui a été définie au début de ce sprint. + +Graphique d'avancement (Burndown Chart) (avancement) + + graphique qui montre la tendance du reste à faire total de jour en jour + (pour les sprints) ou de sprint en sprint (pour les releases). diff --git a/poo/cours/annexes/surete.txt b/poo/cours/annexes/surete.txt new file mode 100644 index 0000000..44da9b7 --- /dev/null +++ b/poo/cours/annexes/surete.txt @@ -0,0 +1,93 @@ +Outils de sureté d'un programme +-------------------------------------- + +La preuve de programme +~~~~~~~~~~~~~~~~~~~~~~ + +Le niveau maximum de sûreté d'exécution d'un programme est la preuve. Qu'est-ce que la preuve +formelle d'un programme ? Selon la définition de Wikipédia, ce sont "des techniques permettant de +raisonner rigoureusement, à l'aide de logique mathématique, sur des programmes informatiques ou +du matériel électroniques, afin de démontrer leur validité par rapport à une certaine +spécification." Bref c'est un raisonnement logique sur un programmme qui permet d'être sûr que le +programme est valide et ne va pas planter. + +La preuve de programme est très peu utilisée dans l'industrie, car très coûteuse et très +difficile à mettre en place. Elle quand même utilisée, mais dans des secteurs où le risque doit +absolument être évacué et où il n'y a aucun droit à l'erreur. Par exemple, le secteur médical +(informatique en bloc opératoire), militaire (peu d'informations nous parviennent dans ce +domaine), l'aviation civile (le logiciel Astrée pour Airbus), la fusée Ariane (depuis le bug qui +avait fait crasher Ariane 5 ces questions sont prises très au sérieux), et le milieu bancaire +(surtout le domaine des décisions boursières : un programme chargé de lancer des décisions +d'achat ou de vente à la bourse qui comporte un bug peut en quelque centièmes de secondes faire +perdre des millions, voire des milliards d'euros à une banque. Le programme ne doit tout simplement pas +bugger). + +Le model checking +~~~~~~~~~~~~~~~~~~ + +Le model checking, l'analyse statique et l'interprétation abstraite procèdent d'une méthodologie +moins lourde de validation des programmes. Ces méthodes analysent exhaustivement l'évolution du +système lors de ses exécutions possibles et permetent de dire si globalement, dans un contexte +donné, le programme va fonctionner correctement. Encore très lourdes, ces techniques ne sont +utilisées que dans un contexte industriel de haute sécurité. + +Les tests d'acceptation +~~~~~~~~~~~~~~~~~~~~~~~ + +Il y a plusieurs types de tests + +- unitaires +- fonctionnels +- acceptation + +Très utilisés dans l'industrie, les tests unitaires et fonctionnels ne testent que certaines +parties du programme et permettent de dire que le programme va marcher grosso-modo à peu près. +Beaucoup moins coûteux à installer, ce sont des éléments cléfs des méthodes agiles. + +Les Outils de linting (validation) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- vérifications syntaxiques +- vérification sémantiques +- vérification sur les imports inutiles ou mal formés (imports croisés + +Exemple en python : pylint + + +La dette technique +~~~~~~~~~~~~~~~~~~ + +Au bout d'un moment le code devient du code spaghetti et les techniques sont obsolètes. +Les tests permettent de solder la dette technique plus facilement. + +**avoir le courage de payer une dette technique, et affronter une dette technique +sinon il peut y avoir un coût à payer qui sera pohibitoire.** + +On solde la dette technique parce que à un moment ça va devenir beaucoup trop +cher à payer. + +Les méthodologies agiles +~~~~~~~~~~~~~~~~~~~~~~~~ + +La manière dont le code est produit importe énormément. Par exemple, une +méthodologie ou le **refactoring** (réécriture de code) est permis et même conseillé +a plus de chance de produire du code organisé. + +Les méthodologies agiles produisent en général du code mieux organisé. Ce sont les +méthodes de travail les plus en vogue aujourd'hui, elles mettent l'accent sur : + +- Du logiciel fonctionnel plutôt que de la documentation exhaustive +- La réponse au changement plutôt que le suivi d'un plan +- Le logiciel fonctionnel est la principale mesure d'avancement +- Une attention continue à l'excellence technique et à une bonne + conception améliore l'agilité +- La simplicité est essentielle (il est facile de faire, il est + difficile de faire simple) + +Le principe de base de la méthodologie Scrum par exemple est de focaliser l'équipe de façon +itérative sur un ensemble de fonctionnalités à réaliser, dans des itérations de durée fixe de une +à quatre semaines, appelées **sprints**. Chaque sprint possède un but à atteindre, défini par le +responsable de produit, à partir duquel sont choisies les fonctionnalités à implémenter dans ce +sprint. Un sprint aboutit toujours sur la livraison d'un produit partiel fonctionnel. Pendant ce +temps, le facilitateur a la charge de réduire au maximum les perturbations extérieures et de +résoudre les problèmes non techniques de l'équipe. diff --git a/poo/cours/apercu.txt b/poo/cours/apercu.txt new file mode 100644 index 0000000..ea09668 --- /dev/null +++ b/poo/cours/apercu.txt @@ -0,0 +1,79 @@ +Aperçu des algorithmes fondamentaux +=================================== + +Les algorithmes sont partout. Absolument partout aujourd'hui. +Il n'est pas un domaine de nos activités qui ne soit liés à tel ou tel algorithme. + +En mathématiques +----------------- + +- l'algèbre (étude des structures de données) +- l'arithmétique modulaire (théorie des nombres) +- la géométrie (affine, algébrique, invariants topologiques...) +- les diagrammes (diagrammes de Venn...) +- les colorisation d'une carte +- comportements stochastiques + +En informatique +---------------- + +- les algorithmes sur la manipulation des structures de données + Exemple : les algorithmes de tri, de recherche dans un arbre... +- les parcours de graphes (chemins le plus court, voyageur de commerce...) +- la cryptologie (code gray) +- les stratégies de jeux + +Tirés du monde réel +-------------------- + +- les jeux (casse-tête, dominos, échiquiers...) +- énigmes, logique et paradoxes +- problèmes de raisonnements. Il n'existe pas beaucoup de méthodes + ou de moyens simples pour traiter et résoudre les énoncés de logique de raisonnement. +- La "marche de l'ivrogne" : processus de progression discrète (pas à pas) + dont l'étape suivante est lié à l'état présent et pas du tout à la mémoire du passé proche. + Il revêt seulement un caractère de type probabilité (stochastique) dit markovien. +- algorithmes de colonies de fourmis (chemins optimal pour arriver à la nourriture) + +Le voyageur de commerce +~~~~~~~~~~~~~~~~~~~~~~~~ + +Le problème du voyageur de commerce, consiste en la recherche d’un trajet minimal permettant à un +voyageur de visiter n villes. En règle générale on cherche à minimiser le temps de parcours total ou la +distance totale parcourue. + +Il suffit de construire tous les chemins possibles et de calculer leurs longueurs. +Avec ``n`` villes il y a ``(n-1)!/2`` chemins possibles. +Avec 36 villes on trouve : 5166573983193072464833325668761600000000, +si le nombre de villes augmente, ça devient vite rédibitoire. + +Résolution par + +- algorithme de parcours de graphes +- algorithme glouton +- algorithmes génétiques + +Les algorithmes génétiques s’appuient sur un principe de sélection des individus d’une population qui présen- +tent des caractéristiques se rapprochant au mieux de ce que l’on recherche; cette population évoluant par +ailleurs selon des critères d’évolution génétique à choisir. Dans le contexte du problème du voyageur de +commerce, un individu est une tournée, un chemin et une population un ensemble de tournées. Il s’agit +maintenant de dé...nir un critère de sélection ainsi que des règles d’évolution de la population. + +- approches métaheuristiques (exemples: colonies de fourmis) + +Exemple de résolution + +.. raw:: latex + + \begin{algorithm} + \caption{Algorithme du voyageur de commerce}\label{commerce} + \begin{algorithmic}[1] + + \BState \emph{Données} : $L$ \Comment{Liste des villes à parcourir avec les distances entre les villes} + \BState \emph{Données} : $L'$ \Comment{Liste du parcours des villes à effectuer} + \State \emph{début} + \BState ... + \State \emph{fin} + + \end{algorithmic} + \end{algorithm} diff --git a/poo/cours/cesar.py b/poo/cours/cesar.py new file mode 100644 index 0000000..c3d25ac --- /dev/null +++ b/poo/cours/cesar.py @@ -0,0 +1,61 @@ +# coding: utf-8 +minuscules = 'abcdefghijklmnopqrstuvwxyz' +majuscules = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + +def rotation(chaine, x): + """ + Effectue une rotation de x caractères vers la droite: + >>> rotation('abcde', 2) + 'cdeab' + """ + return chaine[x:] + chaine[:x] + +def index(c, chaine): + """ + Trouve l'index de c dans la chaine: + >>> index('n', 'bonjour') + 2 + """ + for i in range(len(chaine)): + if (c == chaine[i]): + return i + return -1 + +def chiffre_minuscules(chaine, x): + """ + Chiffre une chaîne composée de minuscules + >>> chiffre_minuscules('bonjour', 3) + 'erqmrxu' + """ + r = rotation(minuscules, x) + resultat = '' + for lettre in chaine: + resultat = resultat + r[index(lettre, minuscules)] + return resultat + +def chiffre(chaine, x): + """ + Chiffre une chaîne quelconque + >>> chiffre('Bonjour les amis!', 3) + 'Erqmrxu ohv dplv!' + """ + r_min = rotation(minuscules, x) + r_maj = rotation(majuscules, x) + resultat = '' + for lettre in chaine: + if lettre in minuscules: + resultat = resultat + r_min[index(lettre, minuscules)] + elif lettre in majuscules: + resultat = resultat + r_maj[index(lettre, majuscules)] + else: + resultat = resultat + lettre + return resultat + +############################################################################# +# Programme principal +############################################################################# +print(chiffre_minuscules('bonjour', 3)) +print(chiffre('Bonjour les amis!', 3)) +print(chiffre('Erqmrxu ohv dplv!', 23)) +print(chiffre('Eudyr, yrxv dyhc ilql fhw hahuflfh!', 23)) + diff --git a/poo/cours/code/factorielle.ml b/poo/cours/code/factorielle.ml new file mode 100644 index 0000000..5065a2c --- /dev/null +++ b/poo/cours/code/factorielle.ml @@ -0,0 +1,17 @@ +let rec fact = function + |1 -> 1 + | n -> n * fact (n-1) ;; + +let print_fact n = + Printf.printf "factorielle %i = %i\n" n (fact n) + +let main () = + begin + print_fact 5 ; + print_newline () ; + exit 0 ; + end + +let _ = main () + + diff --git a/poo/cours/code/factorielle.py b/poo/cours/code/factorielle.py new file mode 100644 index 0000000..734719f --- /dev/null +++ b/poo/cours/code/factorielle.py @@ -0,0 +1,12 @@ +def factorielle(n): + if (n > 1): + r = n*factorielle(n-1) + else: + r = 1 + return r + +def print_fact(n): + print "factorielle {} = {}\n".format(5, factorielle(5)) + +if __name__ == '__main__': + print_fact(5) diff --git a/poo/cours/conf.py b/poo/cours/conf.py new file mode 100644 index 0000000..3005e97 --- /dev/null +++ b/poo/cours/conf.py @@ -0,0 +1,370 @@ +# -*- coding: utf-8 -*- +# +# Algorithmique documentation build configuration file, created by +# sphinx-quickstart on Thu Mar 16 16:07:00 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.pngmath', 'sphinx.ext.ifconfig', +] + +# ajout des cours avec solution des exercices ou non +def setup(app): + app.add_config_value('correction', False, 'env') + app.add_config_value('exercice', False, 'env') + +exercice = False +correction = False + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = '.txt' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Algorithmique Approfondie' +copyright = u'2017, Gwen' +author = u'Gwen' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'1' +# The full version, including alpha/beta/rc tags. +release = u'1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'fr' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +today_fmt = '%d/%m/%Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +default_role = 'literal' + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +html_show_sphinx = False + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +html_show_copyright = False + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' +#html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +#html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +#html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Algorithmiquedoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +'papersize': 'a4paper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +'preamble': """\usepackage{amsmath} +\usepackage{algorithm} +\usepackage[noend]{algpseudocode} +\makeatletter +\def\BState{\State\hskip-\ALG@thistlm} +\makeatother + +""" + +# Latex figure (float) alignment +#'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'AlgorithmiqueApprofondie.tex', u'Cours d\'algorithmique approfondie', + u'INFAL24', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +latex_logo = '_static/cesi.jpg' + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = False + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'algorithmique', u'Algorithmique Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'Algorithmique', u'Algorithmique Documentation', + author, 'Algorithmique', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + + +# -- Options for Epub output ---------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project +epub_author = author +epub_publisher = author +epub_copyright = copyright + +# The basename for the epub file. It defaults to the project name. +#epub_basename = project + +# The HTML theme for the epub output. Since the default themes are not +# optimized for small screen space, using the same theme for HTML and epub +# output is usually not wise. This defaults to 'epub', a theme designed to save +# visual space. +#epub_theme = 'epub' + +# The language of the text. It defaults to the language option +# or 'en' if the language is not set. +#epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +#epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +#epub_identifier = '' + +# A unique identification for the text. +#epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +#epub_cover = () + +# A sequence of (type, uri, title) tuples for the guide element of content.opf. +#epub_guide = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_pre_files = [] + +# HTML files that should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +#epub_post_files = [] + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# The depth of the table of contents in toc.ncx. +#epub_tocdepth = 3 + +# Allow duplicate toc entries. +#epub_tocdup = True + +# Choose between 'default' and 'includehidden'. +#epub_tocscope = 'default' + +# Fix unsupported image types using the Pillow. +#epub_fix_images = False + +# Scale large images. +#epub_max_image_width = 0 + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#epub_show_urls = 'inline' + +# If false, no index is generated. +#epub_use_index = True diff --git a/poo/cours/control.txt b/poo/cours/control.txt new file mode 100644 index 0000000..7770490 --- /dev/null +++ b/poo/cours/control.txt @@ -0,0 +1,294 @@ +Les structures de contrôle +========================== + +L'instruction de saut +---------------------- + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de saut conditionnel}\label{saut} + \begin{algorithmic}[1] + \Procedure{Euclide}{} \Comment{c'est l'algorithme d'Euclide} + \State $\textit{stringlen} \gets \text{length of }\textit{string}$ + \State $i \gets \textit{patlen}$ + \BState \emph{top}: + \If {$i > \textit{stringlen}$} \Return false + \EndIf + \State $j \gets \textit{patlen}$ + \BState \emph{loop}: \Comment{C'est le label (l'étiquette)} \label{etiquette} + \If {$\textit{string}(i) = \textit{path}(j)$} + \State $j \gets j-1$. + \State $i \gets i-1$. + \State \textbf{goto} \emph{loop}. \label{goto} + \State \textbf{close}; + \EndIf + \State $i \gets + i+\max(\textit{delta}_1(\textit{string}(i)),\textit{delta}_2(j))$. + \State \textbf{goto} \emph{top}. \Comment{C'est l'instruction de saut} + \EndProcedure + \end{algorithmic} + \end{algorithm} + + +.. raw:: latex + + Ligne \ref{etiquette}, le bloc `loop` est aussi un label (une étiquette), + c'est-à-dire une marque posée qu'il est possible de retrouver dans le programme. \\ + +.. raw:: latex + + Ligne \ref{goto}, l'instruction \texttt{goto} (aller à ) est le saut vers le label. \\ + +Description générique d'une instruction de saut:: + + Instruction 1 + Saut Label1 + Instruction 2 + ... + Label1: + Instruction n + +.. important:: les sauts conditionnels sont à éviter, même s'ils sont implémentés + dans le langage cible, car c'est le meilleur moyen d'aboutir à + du **code spaghetti**. + +L'instruction de branchement conditionnel +------------------------------------------ + +On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple d'instruction de test} + \begin{algorithmic}[1] + \BState \emph{entrée}: $quality\gets 0$ \Comment{C'est cette valeur qui sera testée} + \BState \emph{locale}: $a\gets ""$ + \BState \emph{sortie}: $a$ \Comment{La sortie est la valeur de $a$} + \BState \emph{corps}: + \If{$quality\ge 9$} + \State $a\gets perfect$ + \ElsIf{$quality\ge 7$} + \State $a\gets good$ + \ElsIf{$quality\ge 5$} + \State $a\gets medium$ + \ElsIf{$quality\ge 3$} + \State $a\gets bad$ + \Else + \State $a\gets unusable$ + \EndIf + \end{algorithmic} + \end{algorithm} + + + +.. ifconfig:: exercice + + **Exercice** : Compacter l'algorithme suivant en une seule condition de test:: + + Si il fait trop chaud Alors + Si il ne pleut pas Alors + Ouvrir la fenêtre + Sinon + Fermer la fenêtre + Finsi + Sinon + Fermer la fenêtre + Finsi + +.. ifconfig:: correction + + **Correction** : + + :: + + Si il fait trop chaud ET il ne pleut pas Alors + Ouvrir la fenêtre + Sinon + Fermer la fenêtre + Finsi + + +L'instruction switch +-------------------- + +L'instruction switch permet de faire plusieurs tests de valeurs sur le contenu d'une même variable. +Ce branchement conditionnel simplifie beaucoup le test de plusieurs valeurs d'une variable. + +Les instructions d'itérations (boucles) +--------------------------------------- + +.. important:: Toutes les boucles concernent le paradigme de programmation impératif + et ne sont pas valides dans le paradigme de programmation fonctionnel + (puisque l'ordre d'évaluation importe) + +- arrêt conditionnel (break) +- passage d'un pas (continue) + +Répéter ... jusqu'à +~~~~~~~~~~~~~~~~~~~ + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de répéter ... jusqu'à} + \begin{algorithmic}[1] + \BState \emph{locales}: $i \gets 1$ \Comment{déclaration et initialisation de i} + \Repeat \Comment{c'est le label de début du répéter} + \State $i \gets \textit{i+1}$ + \Until{i == 100} \Comment{condition de fin de la boucle} + \end{algorithmic} + \end{algorithm} + +La boucle **pour** (for) +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de boucle for} + \begin{algorithmic}[1] + \BState \emph{locales}: $sum\gets 0$ + \For{$i\gets 1, n$} + \State $sum\gets sum+i$ + \EndFor + \end{algorithmic} + \end{algorithm} + + + + + +.. ifconfig:: exercice + + **Exercice** : Ecrire un algorithme qui demande successivement 20 nombres à l’utilisateur, + et qui lui dise ensuite quel était le plus grand parmi ces 20 nombres + +.. ifconfig:: correction + + **Correction** : + :: + + Variables N, i, PG en Entier + Debut + PG <- 0 + Pour i <- 1 à 20 + Ecrire "Entrez un nombre : " + Lire N + Si i = 1 ou N > PG Alors + PG <- N + FinSi + Ecrire "Le nombre le plus grand était : ", PG + Fin + + +.. attention:: ne jamais manipuler le compteur dans une boucle + +:: + + Variable Truc en Entier + Début + Pour Truc <- 1 à 15 + Truc <- Truc * 2 + Ecrire "Passage numéro : ", Truc + Truc Suivant + Fin + +La boucle tant que (while) +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de boucle while} + \begin{algorithmic}[1] + \BState \emph{locales}: $sum\gets 0$ + \State $i\gets 1$ + \While{$i\le n$} + \State $sum\gets sum+i$ + \State $i\gets i+1$ + \EndWhile + \end{algorithmic} + \end{algorithm} + +.. ifconfig:: exercice + + **Exercice** : Ecrire un algorithme de validation d'une entrée utilisateur + + :: + + "Voulez vous un café ? (O/N)" + +.. ifconfig:: correction + + **Correction** : deux solutions possibles, une + + :: + + Variable Rep en Caractère + Début + Rep <- "" + Ecrire "Voulez vous un café ? (O/N)" + TantQue Rep <> "O" et Rep <> "N" + Lire Rep + Si Rep <> "O" et Rep <> "N" Alors + Ecrire "Saisie Erronée, Recommencez" + FinSi + FinTantQue + Fin + + :: + + Variable Rep en Caractère + Début + Ecrire "Voulez vous un café ? (O/N)" + Lire Rep + TantQue Rep <> "O" et Rep <> "N" + Ecrire "Vous devez répondre par O ou N. Recommencez" + Lire Rep + FinTantQue + Ecrire "Saisie acceptée" + Fin + +.. ifconfig:: exercice + + **Exercice** : "C'est plus, C'est moins", c'est-à-dire Ecrire un algorithme qui demande à l’utilisateur + un nombre compris entre a et b jusqu’à ce que la réponse convienne. + +.. ifconfig:: correction + + **Correction** : + + :: + + Variable N en Entier + Debut + N <- 0 + Ecrire "Entrez un nombre entre 10 et 20" + TantQue N < 10 ou N > 20 + Lire N + Si N < 10 Alors + Ecrire "Plus grand !" + SinonSi N > 20 Alors + Ecrire "Plus petit !" + FinSi + FinTantQue + Fin + +Et les autres boucles : répéter... jusqu'à, etc... + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de boucle répéter} + + \begin{algorithmic}[1] + \State $sum\gets 0$ + \State $i\gets 1$ + \Repeat + \State $sum\gets sum+i$ + \State $i\gets i+1$ + \Until{$i>n$} + \end{algorithmic} + \end{algorithm} diff --git a/poo/cours/donnees.txt b/poo/cours/donnees.txt new file mode 100644 index 0000000..990629e --- /dev/null +++ b/poo/cours/donnees.txt @@ -0,0 +1,577 @@ +Les structures de données +=========================== + +.. glossary:: + + ATD + + Abstract Data Type, structure de données abstraites. + La représentation des données est forcément un choix. + Il est impossible de rendre compte globalement d'un élément du réel, + il faut en faire une interprétation abstraite. + +**Exemple**: + +- Un être humain peut être représenté par les données présentes dans sa + carte d'identité. Mais un être humain n'est pas sa carte d'identité. +- Un être humain peut être représenté par les données présentes dans ses préférences + de surf sur internet. Mais un être humain **n'est pas** l'ensemble de ses logs de surf sur le net. + +Les séquences +------------- + +Les types séquences (listes) + +.. code-block:: ocaml + + # 4::1::5::8::1::[];; + - : int list = [4 ;1 ;5 ;8 ;1] + + +Un ensemble de valeurs portant le même nom de variable et repérées par un nombre, s’appelle un tableau, ou encore une liste, ou une variable indicée. +Le nombre qui, au sein d’un tableau, sert à repérer chaque valeur s’appelle l’indice. +Chaque fois que l’on doit désigner un élément du tableau, on fait figurer le nom du tableau, suivi de l’indice de l’élément. + +**manipulation** : + +- `insert()` +- `append()` +- `remove()` +- `find()` +- `print()` +- ... + +.. code-block:: python + + zoo = ['bear', 'lion', 'panda', 'zebra'] + print(zoo) + + # But these list elements are not + biggerZoo = ['bear', 'lion', 'panda', 'zebra', ['chimpanzees', 'gorillas', 'orangutans', 'gibbons']] + print(biggerZoo) + +- Lists Versus Tuples : types mutables, immutables +- Lists Versus Sets : non ordonné, collection simple + +- Recherche dans une liste, recherche du maximum dans une liste +- Recherche d’un mot dans une chaîne de caractères. + +Algorithme de la longueur d'une liste +-------------------------------------- + +.. code-block:: ocaml + + # let rec longueur l = + match l with + [] -> 0 + | ::s -> 1 + (longueur s);; + +Cette fonction est prédéfinie en Ocaml : `List.length` + +.. ifconfig:: exercice + + **Exercice** : écrire un algorithme qui déclare et + remplisse un tableau de 7 valeurs numériques en les mettant toutes à zéro. + +.. ifconfig:: correction + + **Correction** : + :: + + Tableau Truc(6) en Numérique + Variable i en Numérique + Debut + Pour i <- 0 à 6 + Truc(i) <- 0 + i Suivant + Fin + + exemple d'implémentation en python + + .. code-block: python + + >>> liste = [] + >>> for i in range(6): + ... liste.append(i) + ... + >>> liste + [0, 1, 2, 3, 4, 5] + >>> + + +.. ifconfig:: exercice + + **Exercice** : Calcul du premier élément maximal dans une liste, + proposer une implémentation en python qui renvoie le maximum et + la position du max dans la liste. + +.. ifconfig:: correction + + **Correction** : + + .. code-block: python + + def max_list(L) : + k = len(L) + max, x = L[0], 0 + i = 1 + while i < k : + if max < L[i]: + max = L[i] + x = i + i = i + 1 + return max, x + + couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + + Exemple de généricité : ce code fonctionne avec une chaîne de caractères. + + .. code-block: python + + couple = max_list(’totovaaumarche’) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + +.. glossary:: + + Matrice + + Tableaux de dimension multiple, c'est un tableau de tableau + +.. ifconfig:: exercice + + **Exercice** : Écrivez un algorithme remplissant un tableau de 6 sur 13, avec des zéros. + +.. ifconfig:: correction + + **Correction** : + + implémentation en python + + .. code-block:: python + + >>> matrice = [] + >>> for i in range(12): + ... matrice.append([0 for i in range(5)]) + ... + >>> from pprint import pprint + >>> pprint(matrice) + [[0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0]] + >>> + +Algorithmes de tri +------------------ + +On désigne par "tri" l'opération consistant à ordonner un ensemble d'éléments en fonction de clés sur lesquelles est définie une relation d'ordre. + +Les algorithmes de tri ont une grande importance pratique. +Ils sont fondamentaux dans certains domaines (exemples : map-reduce en database non relationnelle). + +L'étude du tri est également intéressante en elle-même, c'est un des domaines de l'algorithmique très étudié et connu. + +Tri par insertion +~~~~~~~~~~~~~~~~~~ + +Cet algorithme de tri suit de manière naturelle la structure récursive des +listes. Soit l une liste à trier : + +- si l est vide alors elle est déjà triée +- sinon, l est de la forme x::s et on trie récursivement la suite s et on obtient une liste triée s’ + on insert x au bon endroit dans s’ et on obtient une liste triée + +Description de l'algorithme + +- la fonction inserer permet d’insérer un élément x dans une liste l +- si la liste l est triée alors x est inséré au bon endroit + +.. code-block:: ocaml + + # let rec inserer x l = + match l with + [] -> [x] + | y::s -> if x<=y then x::l else y::(inserer x s);; + val inserer : ’a -> ’a list -> ’a list + # inserer 5 [3 ;7 ;10];; + - : int list = [3 ; 5 ; 7 ; 10] + +Tri rapide +~~~~~~~~~~~~ + +soit une liste l à trier : + +- si l est vide alors elle est triée +- sinon, choisir un élément p de la liste (le premier par exemple) + nommé le **pivot** +- partager l en deux listes g et d contenant les autres éléments de l + qui sont plus petits (resp. plus grands) que la valeur du pivot p +- trier récursivement g et d, on obtient deux listes g’ et d’ triées + +.. code-block:: ocaml + :caption: fonction de partage d'une liste + + #let rec partage p l = + match l with + [] -> ([] , []) + |x::s -> let g,d = partage p s in + if x<=p then (x::g , d) else (g , x::d) ;; + val partage : ’a -> ’a list -> ’a list * ’a list = + # partage 5 [1 ;9 ;7 ;3 ;2 ;4];; + - : int list * int list = ([1 ; 3 ; 2 ; 4], [9 ; 7]) + +.. code-block:: ocaml + :caption: algorithme de tri rapide + + # let rec tri rapide l = + match l with + [] -> [] + | p::s -> let g , d = partage p s in + (tri rapide g)@[p]@(tri rapide d) ;; + val tri rapide : ’a list -> ’a list = + # tri rapide [5 ; 1 ; 9 ; 7 ; 3 ; 2 ; 4];; + - : int list = [1 ; 2 ; 3 ; 4 ; 5 ; 7 ; 9] + + +Définition d'un itérateur +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: python + + >>> l = range(10) + >>> for i in l: + ... print l[i] + ... + 0 + ... + 8 + 9 + >>> l.__iter__() + + + +Les listes chaînées +~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: ocaml + + typedef struct list{ + int elt ; + struct list* suivant ; + } ; + + +**Outils de manipulation** : + +- `next()` +- `pointer()` +- `insert(l, a)` +- `remove(a, n)` + + +Les piles +---------- + +**manipulation** + +- `insert()` : insérer un élément à la fin de la pile +- `dequeue()` : (remove and return) : retirer un élément du haut de la pile +- FIFO : "first in first out" + + +Traduction d'une structure de données dans une autre +----------------------------------------------------- + +.. code-block:: python + + >>> listOfStrings = ['One', 'Two', 'Three'] + >>> strOfStrings = ' '.join(listOfStrings) + >>> print(strOfStrings) + One Two Three + >>> + >>> # List Of Integers to a String + ... listOfNumbers = [1, 2, 3] + >>> strOfNumbers = ''.join(str(n) for n in listOfNumbers) + >>> print(strOfNumbers) + 123 + >>> + +.. code-block:: python + + >>> l = [('host1', '10.1.2.3', '6E:FF:56:A2:AF:18'), ('host3', '10.1.2.5', '6E:FF:56:A2:AF:19')] + >>> result = [] + >>> for hostname, ip, macaddress in l: + ... result.append(dict(hostname=hostname, ip=ip, macaddress=macaddress)) + ... + >>> result + [{'hostname': 'host1', 'ip': '10.1.2.3', 'macaddress': '6E:FF:56:A2:AF:18'}, + {'hostname': 'host3', 'ip': '10.1.2.5', 'macaddress': '6E:FF:56:A2:AF:19'}] + >>> + + +.. ifconfig:: exercice + + **Exercice** : Proposer un algorithme de traduction de cette structure de donnée + + .. code-block:: python + + [ + { + 'address': '192.168.0.0', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True }, + { 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False }, + ], + }, + { + 'address': '192.168.0.0', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.12', 'high': '192.168.0.45', 'only_unknown': True }, + { 'low': '192.168.0.8', 'high': '192.168.0.35', 'only_unknown': False }, + ], + }, + { + 'address': '192.168.0.1', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True }, + { 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False }, + ], + }, + + ] + + En cette structure de données : + + .. code-block:: python + + [ + { + address: '192.168.0.0', + mask: '255.255.255.0', + dynamicRanges: [ + { low: '192.168.0.5', high: '192.168.0.12', only_unknown: true }, + { low: '192.168.0.50', high: '192.168.0.55', only_unknown: false },j + ], [ + { low: '192.168.0.12', high: '192.168.0.45', only_unknown: true }, + { low: '192.168.0.8', high: '192.168.0.35', only_unknown: false }, + ], + }, + { + 'address': '192.168.0.1', + 'mask': '255.255.255.0', + 'dynamicRanges': [ + { 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True }, + { 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False }, + ], + }, + ] + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: python + + >>> from pprint import pprint + pprint(l) + [{'address': '192.168.0.0', + 'dynamicRanges': [{'high': '192.168.0.12', + 'low': '192.168.0.5', + 'only_unknown': True}, + {'high': '192.168.0.55', + 'low': '192.168.0.50', + 'only_unknown': False}], + 'mask': '255.255.255.0'}, + {'address': '192.168.0.0', + 'dynamicRanges': [{'high': '192.168.0.45', + 'low': '192.168.0.12', + 'only_unknown': True}, + {'high': '192.168.0.35', + 'low': '192.168.0.8', + 'only_unknown': False}], + 'mask': '255.255.255.0'}] + >>> newdata = [] + >>> for i in l: + ... if i['address'] not in [j['address'] for j in newdata]: + ... newdata.append(i) + ... else: + ... for k in newdata: + ... if k['address'] == i['address']: + ... k['dynamicRanges'].extend(i['dynamicRanges']) + ... + >>> pprint(newdata) + [{'address': '192.168.0.0', + 'dynamicRanges': [{'high': '192.168.0.12', + 'low': '192.168.0.5', + 'only_unknown': True}, + {'high': '192.168.0.55', + 'low': '192.168.0.50', + 'only_unknown': False}, + {'high': '192.168.0.45', + 'low': '192.168.0.12', + 'only_unknown': True}, + {'high': '192.168.0.35', + 'low': '192.168.0.8', + 'only_unknown': False}], + 'mask': '255.255.255.0'}, + {'address': '192.168.10.0', + 'dynamicRanges': [{'high': '192.168.0.12', + 'low': '192.168.0.5', + 'only_unknown': True}, + {'high': '192.168.0.55', + 'low': '192.168.0.50', + 'only_unknown': False}], + 'mask': '255.255.255.0'}] + >>> + +.. ifconfig:: exercice + + **Exercice** : Proposer un algorithme qui permette de récupérer la liste + des adresses IP disponibles + + .. code-block:: python + + { + "local": { + "leases": [ + { + "mac": "02:00:c0:a8:00:66", + "name": "pcxubuntu", + "address": "192.168.0.200" + }, + { + "mac": "02:00:c0:a8:00:67", + "name": "pcxubuntu", + "address": "192.168.0.201" + }, + { + "mac": "02:00:c0:a8:00:68", + "name": "pcxubuntu", + "address": "192.168.0.202" + } + ] + } + } + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: python + + >>> l = { + ... "local": { + ... "leases": [ + ... { + ... "mac": "02:00:c0:a8:00:66", + ... "name": "pcxubuntu", + ... "address": "192.168.0.200" + ... }, + ... { + ... "mac": "02:00:c0:a8:00:67", + ... "name": "pcxubuntu", + ... "address": "192.168.0.201" + ... }, + ... { + ... "mac": "02:00:c0:a8:00:68", + ... "name": "pcxubuntu", + ... "address": "192.168.0.202" + ... } + ... ] + ... } + ... } + >>> leases = l["local"]["leases"] + >>> from pprint import pprint + >>> pprint(leases) + [{'address': '192.168.0.200', 'mac': '02:00:c0:a8:00:66', 'name': 'pcxubuntu'}, + {'address': '192.168.0.201', 'mac': '02:00:c0:a8:00:67', 'name': 'pcxubuntu'}, + {'address': '192.168.0.202', 'mac': '02:00:c0:a8:00:68', 'name': 'pcxubuntu'}] + >>> addresses = [lease['address'] for lease in leases] + >>> addresses + ['192.168.0.200', '192.168.0.201', '192.168.0.202'] + >>> + + + +Structures de données complexes +------------------------------- + +Les types produits nommés +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +On les appelle enregistrements, dictionnaires ou tables de hachage. + +:: + + algorithme monAlgorithme + // déclaration d'un enregistrement + enregistrement Personne + chaine nom; + chaine prenom; + entier age; + réel taille; + finenregistrement + ... + Personne[50] t; + début + // Initialisation + t[0].nom <- "Duchmol"; + t[0].prenom <- "Robert"; + t[0].age <- 24; + t[0].taille <- 1.80; + ... + fin + +.. code-block:: ocaml + + # type adresse = { rue : string ; ville : string ; cp : int};; + # type fiche = { + nom : string ; + prenom : string ; + adresse : adresse ; + date naissance : int * int * int ; + tel fixe : string ; + portable : string + };; + # let v1 = { a = 1 ; b = false ; c = 'r'};; + + + + +- les sommes (constructeurs) + +.. code-block:: ocaml + + # type couleur = Pique | Coeur | Carreau | Trefle;; + # let v = (Pique , Coeur);; + val v : couleur * couleur = (Pique , Coeur) + +.. code-block:: ocaml + + type nombre = + Ent of int | Reel of float | Cplx of float × float + Ent, Reel, Cplx sont les constructeurs du type. + +Autres structures de données complexes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- arbres +- graphes +- dates + +- le parcours de graphes +- les calculs de dates diff --git a/poo/cours/fonctions.txt b/poo/cours/fonctions.txt new file mode 100644 index 0000000..330cbca --- /dev/null +++ b/poo/cours/fonctions.txt @@ -0,0 +1,588 @@ +Les fonctions et les procédures +================================ + +Préliminaire : rappel de théorie de cybernétique +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Théorie de l'information (Claude Shannon, 1949), (ou théorie de la communication) + +Canal de transmission:: + + entrée -> récepteur -> émetteur -> sortie + +.. glossary:: + + cybernétique + + étude des fonctions de réflexes conditionnés du cerveau humain + utilisation au mieux en PNL ("programmation neuro-linguistique") + ou en analyse transactionnelle, ou au pire en ingérinerie sociale. + +La matérialité physique est considérée comme le hardware, le génétique (le +réseau neuronal) étant assimilé au network hardware. + +Les objets mentaux (fonctionnements psychologiques et épigénétiques du +cerveaux) est assimilé au logiciel, au software. + +IFTTT ("if this then that") : la causalité mondaine est ramenée à un ordre de +comportement affecté à un assimilé-machine. + +L'humain est ramené à une machine. +C'est articulation entre "déclencheur contextuel" et "action en réponse de" +n'est pas une "black box" mais un "feedback" qui, pour l'humain, +loin d'être ramené à une entrée/sortie, constitue un **feedback** +utile pour la connaissance de soi. + +A la place, la communication est ramenée à une **boucle de rétroaction** +(comme dans un prompt) entre un système comportemental et son environnement. +La représentation sujet/objet (la perspective traditionnelle) est remplacée +par le clivage intérieur/extérieur. Behaviorisme, procédural. + +L'humain est donc ramené à + +- un ordonnanceur +- un comportement intrinsèque (boîte noire) + +- un stimuli pavlovien (déclencheur, trigger) est considéré comme un paramètre +d'entrée +- une instruction comportementale est considérée comme une action de + traitement +- le résultat est observé. + +Cette articulation entre "déclencheur contextuel" et "action en réponse" +est très exactement une forclusion de la profondeur monadique (Leibniz) de +l'humain à la black box informationnelle (et cybernétique). + +Pour quoi faire ? Pour pirater. Pour manipuler. +Le piratage consiste à + +- isoler les constantes (les procédures répétitives, les algorithmes) +- les observer (collecter les données) + +afin de + +- les réécrire (influence toxique, pishing - hammeçonnage) +- les détruire (attaque en règle) + + +Description d'une procédure +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +En programmation impérative, un programme est une suite d’instructions qui font +évoluer l’état mémoire, le résultat est dans l’état final de la mémoire. + +- une procédure peut prendre des paramètres +- elle modifie l'état courant du système + +- Déclaration des paramètes +- Déclaration du corps +- Appel de la procédure + +.. raw:: latex + + \begin{algorithm} + \caption{Procédure de permutation de deux entiers}\label{permutation} + \begin{algorithmic}[1] + \Procedure{permuter}{$a,b$}{} + \BState \emph{parametres}: + \State $a: \textit{int}$ + \State $b: \textit{int}$ + \BState \emph{locales}: + \State $z: \textit{int}$ \Comment{Une variable intermédiaire est nécessaire} + \BState \emph{corps}: + \State $z \gets a$ + \State $a \gets b$ + \State $b \gets z$ + \EndProcedure + \State \Call{permuter}{10, 12} \Comment{appel de la procédure} + \end{algorithmic} + \end{algorithm} + +effet de bord + + toute modification de la mémoire ou modification d'un support externe + +instruction + + commande ou phrase en mesure de modifier l'état du programme ou de la machine hôte + (allocation mémoire, support externe, disque, écran...) + +Une procédure ne renvoie pas de valeur, mais provoque un 'effet de bord' (écriture dans une globale, dans un flux sortant etc.). + +Une procédure permet de créer une instruction nouvelle qui deviendra une primitive pour le programmeur. +Cela permet de structurer le texte source du programme et améliorer sa +lisibilité. Cela permet aussi d'appeler plusieurs fois, et à plusieurs endroit +dans le code, cette primitive. + +Appel d'une procédure +~~~~~~~~~~~~~~~~~~~~~ + +(ex: pseudo-pascal) + +**déclaration de procédure** + +.. raw:: latex + + \begin{algorithm} + \caption{Procédure de permutation de deux entiers}\label{appelpermutation} + \begin{algorithmic}[1] + \Procedure{permuter}{$a,b$}{} + \BState \emph{parametres}: + \State $a: \textit{int}$ \Comment{paramètres formels de la procédure} + \State $b: \textit{int}$ + \BState \emph{locales}: + \State $z: \textit{int}$ \Comment{les variables locales de la procédure} + \BState \emph{corps}: + \State ... \Comment{Le corps de la procedure} + \EndProcedure + \State \Call{permuter}{10, 12} \Comment{l'appel de la procédure} + \end{algorithmic} + \end{algorithm} + + +- les variables x1,...,xn sont appelées *paramètres formels* de p +- les variables v1,...,vm sont appelées *les variables locales* de p + +les valeurs effectivement passées en paramètres, ici `10, 12` +sont appelées **paramètres effectifs** de p + +signature + + C'est l'ensemble paramètre formel + resultat de l'appel + +fermeture + + L'ensemble procédure + variables locales + signature + parametres effectifs + est appelé une **fermeture**. C'est la procédure + son contexte qui permet + de l'instancier dans un programme. + +Environnement + + Contexte d’évaluation d'une expression ou d'une fonction + +Portée + + La portée d'un identifiant (une variable) est sa condition d'utilisation dans un contexte donné + (utilisation locale uniquement, ou bien globale, ou bien locale et globale) + La portée d’une liaison est la portion du code dans laquelle cette + liaison est valide (i.e. où un identifiant est lié à une expression). + +.. ifconfig:: exercice + + **Exercice** : Que donne ce code ? + + .. code-block:: ocaml + + # let x = 42 in + let y = x - 1 in x - y ;; + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: ocaml + + - : int = 1 + + +.. code-block:: ocaml + + let a = 3 (* première liaison pour l'identifiant a *) + let b = 5 and c = 6 + let somme = a + b + c + val somme : int = 14 + let a = 45 (* deuxième liaison pour l'identifiant a *) + somme + val a : int = 45 + +.. ifconfig:: exercice + + **Exercice** : Que donne ce code ? + + .. code-block:: ocaml + + let a = 3 and b = 4 and c = 8 ;; + let somme = a + b + c ;; + val somme : int = ??? + let a = 44 + let b = 5 + let c = 1 + somme + - : int = ??? + +.. ifconfig:: correction + + .. code-block:: ocaml + + let a = 3 and b = 4 and c = 8 ;; + - : int = 15 + let somme = a + b + c ;; + val somme : int = 15 + let a = 44 + let b = 5 + let c = 1 + somme + - : int = 15 + + Même code en python + + .. code-block:: python + + >>> a = 1 + >>> b = 2 + >>> c = 3 + >>> somme = a + b + c + >>> somme + 6 + >>> a = 56 + >>> b = 5678 + >>> c = 56789 + >>> somme + 6 + >>> + +Portée locale dans une expression + +.. code-block:: ocaml + + # let a = 2 and b = 3 and c = 4 in + let somme = a+b+c in + somme + - : int = 9 + # somme ;; + Error: Unbound value somme + # a ;; + Error: Unbound value a + +.. important:: + + L’ordre d’évaluation dans un let ... in ... est bien déterminé, + sans grande importance dans un cadre purement fonctionnel, mais important + en cas d’effets de bord + + +Exemple de variable globale modifiée localement (**attention, mauvaise pratique** !) : + +.. code-block:: python + + >>> a = 5 + >>> def print_a(): + ... print("La variable a = {0}.".format(a)) + ... + >>> print_a() + La variable a = 5. + >>> a = 8 + >>> print_a() + La variable a = 8. + >>> + + + +niveau + + Le niveau d’une déclaration (de variable ou de procédure) est le nombre + de procédures sous lesquelles elle est déclarée. Le programme principal + a le niveau 0. + +.. code-block:: python + :linenos: + + def _get_config(name): + # return config value + if not isfile(CONFIG_FILE): + raise Exception("Fichier de configuration non existant") + from ConfigParser import ConfigParser + cfg = ConfigParser(allow_no_value=True) + cfg.read(CONFIG_FILE) + + if name == "SUBNETS": + return eval(cfg.get('eole', 'subnets')) + elif name == "LEASES_FILE": + DHCP_PATH = cfg.get('eole', 'container_path_dhcp') + return join('/', DHCP_PATH, 'var/lib/dhcp/dhcpd.leases') + def get_routes(*args, **kwargs): + """ + Send list of reserved IP + return list of tuple (id, machine name, IP, MAC Adress) + """ + cfg = creole_loader(load_extra=True, rw=False, owner=MODNAME, + mandatory_permissive=False) + return zip(cfg.dhcp.dhcp.id_dhcp.id_dhcp, cfg.dhcp.dhcp.id_dhcp.hostname, + cfg.dhcp.dhcp.id_dhcp.ip, cfg.dhcp.dhcp.id_dhcp.macaddress) + +On voit que l'objet `cfg` ligne 6 et 7 a le même nom que l'objet `cfg` ligne 19. +C'est autorisé et les espaces de nommages sont différents. + + +Description d'une fonction +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Une fonction renvoie une valeur et ne modifie pas l'état courant du programme +en cours d'exécution ni ne réalise d'effets de bord. Elle renvoie +**toujours** quelque chose (même la valeur ``None`` qui n'est pas rien) + +- une procédure peut prendre des paramètres +- elle modifie l'état courant du système + +- Déclaration des paramètes +- Déclaration du corps +- Appel de la fonction + +En programmation fonctionnelle, programme est un ensemble de définitions de fonctions, +un résultat est l'application d’une fonction à une structure de données effective. + +- composant de base : la fonction +- opération de base : l’application + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple de fonction}\label{fonction} + \begin{algorithmic}[1] + \Function{permuter}{$a,b$}{} \Comment{définition de la fonction} + \BState \emph{parametres}: \Comment{déclaration (noms, types) des paramètres formels} + \State $a: \textit{int}$ + \State $b: \textit{int}$ + \BState \emph{locales}: \Comment{déclaration (noms, types) des valeurs locales} + \State $z: \textit{int}$ + \BState \emph{corps}: + \State $z \gets a$ + \State $a \gets b$ + \State $b \gets z$ + \BState \emph{return}: \Comment{La valeur, le résulat renvoyé par la fonction} + \EndFunction + \State \Call{permuter}{10, 12} \Comment{appel de la fonction} + \BState \emph{result}: + \State (12, 10) \Comment{Le résultat effectif de la fonction après appel} + \end{algorithmic} + \end{algorithm} + +.. ifconfig:: exercice + + **Exercice** : factoriser le code suivant + :: + + Ecrire "Etes-vous marié ?" + Rep1 <- "" + TantQue Rep1 <> "Oui" et Rep1 <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Rep1 + FinTantQue + ... + Ecrire "Avez-vous des enfants ?" + Rep2 <- "" + TantQue Rep2 <> "Oui" et Rep2 <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Rep2 + FinTantQue + +.. ifconfig:: correction + + **Correction** : + + :: + + Fonction RepOuiNon() en caractère + Truc <- "" + TantQue Truc <> "Oui" et Truc <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Truc + FinTantQue + Renvoyer Truc + Fin + + Ecrire "Etes-vous marié ?" + Rep1 <- RepOuiNon() + ... + Ecrire "Avez-vous des enfants ?" + Rep2 <- RepOuiNon() + + +Définition mathématique +~~~~~~~~~~~~~~~~~~~~~~~~~ + +fonction + + Une fonction f d’un ensemble E vers un ensemble F est une + correspondance qui associe à chaque élément de E au plus + un élément de F. + +- E est appelé le domaine de définition +- F est appelé codomaine +- la **signature** de la fonction : `E → F (int -> int = )` + + +Exemple de signature d'une fonction + +:: + + Fonction RepOuiNon(Msg en Caractère) en Caractère + Ecrire Msg + Truc <- "" + TantQue Truc <> "Oui" et Truc <> "Non" + Ecrire "Tapez Oui ou Non" + Lire Truc + FinTantQue + Renvoyer Truc + Fin Fonction + + ... + Rep1 <- RepOuiNon("Etes-vous marié ?") + ... + Rep2 <- RepOuiNon("Avez-vous des enfants ?") + ... + + +curryfication + + évaluation de l'application d'une fonction + +- évaluter `(f x y)` +- peut donner une **valeur fonctionnelle** +- évaluation de la valeur fonctionnelle sur une valeur des types de base + +:: + + let g = function n -> (function p -> p + 1) n;; + +Typage d'une fonction +~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: ocaml + + # let f x y z = if x > 0 then y + x else z - x;; + val f : int -> int -> int -> int = + +c’est en fait une fonction à un argument qui retourne une fonction:: + +.. code-block:: ocaml + + val f : int -> (int -> (int -> int)) = + +application de f à trois valeurs + +.. code-block:: ocaml + + # f 1 2 3;; + - : int = 3 + +en programmation fonctionnelle, +les fonctions sont des valeurs comme les autres + + +.. code-block:: ocaml + + # fun x -> x * x;; + - : int -> int = + +Récursivité +~~~~~~~~~~~~ + +.. code-block:: ocaml + + let rec fact n = + if n=0 then 1 else n * fact (n-1) + + +équivalent impératif utilisant une boucle + +.. code-block:: c + + int fact(int n){ + int f = 1 ; + int i = n ; + while (i>0){ + f = f * i; + i-- ; + } ; + return f ; + } + +Définitions par cas +~~~~~~~~~~~~~~~~~~~ + +.. code-block:: ocaml + + let rec fact n = + match n with + 0 -> 1 + | -> n * fact (n-1) + +**exemple** : la fonction puissance + +.. code-block:: ocaml + + let rec puissance x n = match n with + 0 -> 1 + | -> x * puissance x (n-1) + + + +.. ifconfig:: exercice + + **Portée locale dans une fonction** + Quelles sera la valeur de la variable `a` ? + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... a = 2 + ... return a + 1 + ... + >>> a = myfunc() + a + + +.. ifconfig:: correction + + Correction: + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... a = 2 + ... return a + 1 + ... + >>> a = myfunc() + a + >>> a + 4 + >>> + + +.. ifconfig:: exercice + + **Exercice** : Portée locale dans une fonction avec variable globale + Quelles sera la valeur de la variable `a` ? + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... global a + ... a = 2 + ... return a + 1 + ... + >>> a = myfunc() + 3 + >>> + +.. ifconfig:: correction + + **Correction** : + + .. code-block:: python + + >>> a = 1 + >>> def myfunc(): + ... global a + ... a = 2 + ... return a + 1 + ... + >>> myfunc() + 3 + >>> a + 2 + >>> a = myfunc() + 3 + >>> a + 6 + >>> diff --git a/poo/cours/fondement.txt b/poo/cours/fondement.txt new file mode 100644 index 0000000..874365c --- /dev/null +++ b/poo/cours/fondement.txt @@ -0,0 +1,198 @@ +Présentation de l'art de programmer +==================================== + +Qu'est-ce que la programmation ? +-------------------------------- + +programmation + + Description d’un calcul (traitement) dans + un langage compréhensible par la machine + (langage de programmation) + +Le processus d'abstraction +-------------------------- + +Débuter en programmation n'est pas une chose aisée. Aujourd'hui, la tendance est au +"bas niveau". Souvent, on se jette dans le grand bain : + +- soit en s'approchant au maximum de la machine (admin système et réseau, noyau + linux, langage C) + +- soit en faisant du dev web côté backend, ce qui ramène à une administration réseau + de bas niveau (microservices, monde nodeJS/javascript, etc...) + +Soit on suit un cursus scolaire traditionnel qui commence souvent par une +explication du fonctionnement d'une machine abstraite de bas niveau, puis en +allant de plus en plus haut, mais étant sous-entendu qu'il faut rester connecté au +bas niveau (comprendre comment ça se passe derrière la scène). + +Dans ces deux cas, il est sous-entendu qu'on apprend plus de choses et plus rapidement en mettant +les mains dans le cambouis, ce qui est vrai bien sûr. Mais cela sous-entend qu'un développeur doit +rester le nez dans le guidon. Qu'il doit être un expert de son domaine en accumulant des technologies +sans aucun recul. Bien sûr il se doit d'être un expert du système dans lequel il évolue +(connaissance du système d'exploitation, binding avec le C, du ramasse miette (garbage +collector), interaction avec les différentes librairies, gestion et optimisation de la mémoire, +architecture par microservices, threads...) mais il doit aussi être capable de prendre du recul. + +L'approche algorithmique (algorithmique de pseudo code, algorithmique algébrique et modulaire) +est un véritable moyen pour le programmeur de prendre du recul : elle commence par se placer du +côté de l'esprit humain et de ses capacités de compréhension et d'abstraction, elle autorise une +pensée rationnelle sur l'art de programmer et permet au programmeur d'effectuer les bons choix, +en connaissance de sa discipline. + +Le lien est fait ensuite avec le plus bas niveau grâce une implémentation effective +des langages à partir des paradigmes de rationalisation de la penseée (modules, +objects, généricité, polymorphisme paramétrique...) et d'un outil de communication +avec la machine qu'on appelle compilateur (dont la description est en dehors de +l'objectif de ce cours). + +La tendance générale de l'évolution des langages est de se libérer de ces +contraintes de bas niveau, un peu comme en sciences physiques où les lois physiques +dépendent de l'échelle d'en dessous (du niveau microscopique/quantique) mais qu'à +l'échelle du dessus, on n'a pas affaire à des effets de bas niveau (pas d'effets +quantiques à un niveau macroscopique en général). Ce processus d'évolution est vrai +aussi dans le monde de la technique informatique lui-même (modèle OSI, comment est +construite une trame IP, indépendances de chaque couche (transport, payload) entre +elles). Même la tendance système est à la virtualisation qui accentue encore la +tendance à s'affranchir du bas niveau (le niveau système), le séparer nettement du +haut niveau (le niveau applicatif). + +Il apparaît régulièrement de nouveaux langages. Comment s'orienter ? Quel(s) +langage(s) choisir pour un projet de développement ? Au delà de leurs disparités, la +conception et la genèse de chacun d'eux procèdent d'une motivation partagée : la +volonté d'abstraire. + +- **s'abstraire de la machine** : un langage de programmation permet de + négliger l'aspect *mécanique* de l'ordinateur. On oublie le modèle du + microprocesseur, jusqu'au système d'exploitation sur lequel sera exécuté + le programme. + +- **abstraire les erreurs** : Il s'agit ici de garantir la sûreté d'exécution; un + programme ne doit pas se terminer brutalement ou devenir incohérent en cas d'erreur. + Un des moyens pour y parvenir est le typage des programmes et la mise + en oeuvre d'un mécanisme d'exceptions. + +- **abstraire le mode opératoire** : Il s'agit de choisir une représentation, un + paradigme d'implémentation qui est indépendant du domaine considéré (paradigme + objet, modulaire, générique, composants...) + +- **abstraire les composants** : Les langages de programmation donnent la + possibilité de découper une application en différents composants logiciels, plus ou + moins indépendants et autonomes. La modularité permet une structuration de plus haut + niveau de l'ensemble d'une application complexe. Les langages à objets constituent + une autre approche de la réutilisabilité permettant la réalisation très rapide de + prototypes. + +Description des niveaux d'abstraction par rapport à la machine +--------------------------------------------------------------- + +Les langages de haut niveau simplifient le travail du +programmeur là où les langages de bas niveau permettent de produire un code +plus efficace. + +- **niveau 0** : le langage machine. Illisible, c'est une suite d'optcode. + impossible de coder dans ce langage. + +- **niveau 1** : langage d'assemblage. Il reste très dépendant de la machine + et aujourd'hui il est rare d'en faire, sauf si on code un bootloader par exemple, + la gestion de l'accès à la mémoire est en réel (le mode protégé n'apparaît que après). + Il faut gérer les ressources,le langage est très optimisé mais presque impossible + à maintenir et rendre générique. Aujourd'hui plus personne ne code en assembleur. + +- **niveau 2** : langages dits de **bas niveau** : (exemple : le C, le C++) + indépendance par rapport à la machine, grande structuration mais très verbeux + +- **niveau 3** : langages dits de **haut niveau** : le raisonnement dans ces + langages ne dépent plus de la machine, et ils implémentent des paradigmes de + programmation indépendant de l'état de la mémoire de l'ordinateur, + ils sont indépendant même du système d'exploitation. + +Qu'est-ce qu'une machine ? +--------------------------- + +Une machine, ce truc apparemment si complexe, est en fait +un assemblage de bric et de brac. + +L'assemblage des connecteurs permet de simuler un additionneur, +en prenant en compte les propriétés de **reste euclidien** +de l'addition. + +La structure électronique est composée de : + +- un ordonnanceur. +- le stockage d'un **état**. +- une pile d'instruction + +.. glossary:: + + adressage + + Dès lors qu'on dispose de ces bases électronique au dessus du processeur, + un langage d'assemblage est possible, c'est le langage de calcul sur les registres. + + registre + + machines ont un espace mémoire et un espace de calcul (registres) + +Un ordinateur, c'est très très stupide, mais ça permet de disposer de : + +- une mémoire très grande et ordonnée, +- une capacité à effectuer inlassablement des tâches répétitives +- une grande rapidité de calcul + +Apprendre à programmer, c'est-à-dire être capable de +contrôler la machine. + +.. important:: Apprendre à programmer, c'est-à-dire apprendre à penser de manière structurée, + pour pouvoir accessoirement ensuite communiquer avec une machine. + +Compilateur +----------- + +Schématiquement, un compilateur est un programme qui traduit un +programme d’un langage source vers un langage cible, en signalant +d’éventuelles erreurs. + +Quand on parle de compilation, on pense typiquement à la traduction d’un +langage de haut niveau (C, Java, Caml, ...) vers le langage machine d’un +processeur (Intel Pentium, PowerPC, ...) + +- xml (libre office, word) -> postscript (imprimante) +- postcript -> image +- syntaxe wiki -> html (Wikipédia...) + +compilation graphique + + passer une description, ça donne un dessin genre ocaml Quilt < mon_dessin.txt + passer par une api qui permet de causer avec une interface + +**transpiler** : transformation d'un langage de haut niveau vers un autre +langage de haut niveau. + +- cofee script, typescript -> javascript +- (babel) javascript -> javascript ES 6 +- python -> javascript + +Un compilateur traduit un programme P en un programme Q tel que +pour toute entrée x , la sortie de `Q(x)` soit la même que celle de `P(x)` + +Un interprète est un programme qui, étant donné un programme `P` et une +entrée x , calcule la sortie s de `P(x)` + +Le compilateur fait un travail complexe une seule fois, pour produire un +code fonctionnant pour n’importe quelle entrée +L’interprète effectue un travail plus simple, mais le refait sur chaque entrée +Autre différence : le code compilé est généralement bien plus efficace que +le code interprété + +Typiquement, le travail d’un compilateur se compose d’une phase d’analyse + +- reconnaît le programme à traduire et sa signification +- signale les erreurs et peut donc échouer (erreurs de syntaxe, de portée, de typage, etc.) + +Puis d’une phase de synthèse + +- production du langage cible +- utilise de nombreux langages intermédiaires +- n’échoue pas diff --git a/poo/cours/index.txt b/poo/cours/index.txt new file mode 100644 index 0000000..aa2ef7d --- /dev/null +++ b/poo/cours/index.txt @@ -0,0 +1,19 @@ +Introduction à l'algorithmique +================================ + +.. toctree:: + :maxdepth: 2 + + presentation + fondement + langage + algo + programme + fonctions + control + donnees + apercu + modularite + modules + tp + annexes/index diff --git a/poo/cours/langage.txt b/poo/cours/langage.txt new file mode 100644 index 0000000..67f858d --- /dev/null +++ b/poo/cours/langage.txt @@ -0,0 +1,336 @@ +Les langages de programmation +============================= + +langage + + Un langage de + programmation + doit permettre d'écrire des + programmes de bonne qualité + +Un programme doit être : + +- correct +- robuste +- lisible, bien documenté +- facile à modifier, extensible + +Un langage de programmation doit permettre : + +- la programmation structurée +- la structuration avec les types +- proposer un mécanisme d’exceptions +- présenter des caractères de généricité, de polymorphisme et de surcharge + +.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes, + Elles sont une nécessité + +Approche historique et chronologique +------------------------------------- + +- Lambda calcul (1930) +- machines de Turing (1936) +- début des langages vers les années 1950 (A0, Fortran(impératif), + Lisp(impératif et fonctionnel), Cobol) +- années 60 : Simula (classes), CPL (compilation séparée) +- années 70 : C (référence du langage impératif de bas niveau), Pascal + (procédures), Smalltalk (programmation orientée objects), Prolog + (programmation logique), Scheme (programmation fonctionnelle pure), Modula, + C++, Ada, Turbo Pascal, Common Lisp, Eiffel (programmation par contrats) +- années 80 : ML, CAML (langages fonctionnels) +- années 90 : Perl, Python, Ruby (languages de scripting multi-paradigmes) + Haskell (fonctionnel pur), Lua, Delphi, Java (orienté objet, machine + virtuelle), PHP (impératif, dédié au web), Erlang (fonctionnel+ + programmation concurrente), javascript (orienté web, objets par + prototypage), OCaml (multi-paradigme, fortement typé, orienté sécurité, + programmation générique, fonctionnelle et objets, modulaire et fonctorielle) +- 2009 : go (google, compilé, typage statique, objets par prototypage, + prgrammation concurrente), Rust (fondation mozilla, multiparadigme, programmation concurrente) + +Les langages actuellement les plus utilisés dans le monde de l'entreprise sont : + +- javascript/NodeJS (70% du code dans le dépôt github) mais victime de son + succès (chaos complet des librairies) +- le go est de plus en plus utilisé, c'est **le** langage qui monte + actuellement +- Python, Ruby, lua, autres langages de scripting (de plus en plus utilisés) +- PHP, Java (stagnants) +- C, C++ (de moins en moins utilisés) + +Approche par typologie des langages +----------------------------------- + +- **A0 (1954)** : possibilité de découpage de programmes en + sous-programmes ; + +- **ALGOL (1958)** : concept de bloc de code (pas forcément nommé) et d'imbrication + de blocs de code ; + +- **C (1971)** : syntaxe claire et simple, programme fortement structuré ; + +- **C (1980)** : le **code objet**, qui consiste à essayer de faire fonctionner + un seul jeu d'instructions sur des machines différentes. Avant, le code + d'assemblage dépendait du processeur, donc il n'y avait pas un seul et unique + jeu d'instructions ; + +- **1980** : déploiement et succès des langages à objets ; + +- **1983** : turbo pascal (Borland) qui fut le tournant du C, + propose un IDE (Environnement de Développement Intégré). + aujourd'hui le turbo pascal a pratiquement disparu mais pas totalement, + il est soutenu par une communauté open source autour de **Lazarus** ; + +- **depuis les années 90** : deux grands groupes de langages. Les langages à + objets, et les langages fonctionnels. Les deux mondes s'interpénètrent (les + avancées actuelles du web, les microservices (Erlang, Haskell), + viennent du monde fonctionnel, le NoSQL, etc). + Les grandes avancées architecturales (système d'exploitation, linux, etc...) + viennent du monde de l'impératif. + + +Approches par modèles de programmation +-------------------------------------- + +- **le mécanisme d'exceptions** : il est possible de rompre l'exécution normale d'un + programme à un endroit et de la reprendre à un autre endroit du programme prévu à + cet effet. Ce mécanisme permet de gérer les situations exceptionnelles. + +- **le paradigme impératif** : les entrées-sorties, les modifications physiques de + valeurs et les structures de contrôle itératives sont possibles. + +- **le paradigme fonctionnel** : manipule les fonctions comme étant des valeurs du + langage. Celles-ci peuvent être utilisées en tant que paramètres d'autres fonctions + ou être retournées comme résultat d'un appel de fonction. + +- **le paradigme objet** : La représentation du programme colle à la réalité en + reproduisant des entités relativement proches des objets réel. Attention, le piège + est de croire qu'il s'agit *du* paradigme universel puisqu'il reproduit en miroir le + réel. **C'est en fait un processus d'abstraction comme un autre**. + +Sûreté du langage, typage +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Tri par ordre de sûreté croissant : + +0. typage très faible (presque inexistant aujourd'hui) : 42 == "42" == 42.0... +1. typage dynamique faible : (javascript) (possibilité de changer le prototype + d'un objet pendant l'éxécution du programme, c'est la fête on peut faire + n'importe quoi) +2. typage dynamique fort inféré par le comportement (behavior, duck typing) + (python, ruby, PHP) Le contenu de la variable détermine le choix du typage + `var = 0 -> type int` +3. typage statique déclaré fort (Java) + `int var = 0 ;` (pas mal mais super lourd, pas **agile** du tout) +4. langages à types statiques muni d'un moteur d'inférence de types (Ocaml) + sûreté d'exécution, agilité, sécurité. + + +La syntaxe, la lisibilité +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Importance de la lisibilité (notamment par rapport aux méthodes agiles). + +- courte (python) +- verbeuse (C) +- l'importance des mots clef du langage +- délimiteur de phrase, de blocs (parenthèses, accolades, tabulations, blocs...) + +Langages compilés ou interprétés ? +----------------------------------- + +.. glossary:: + + langage compilé + + une première passe est faite, des validations son effectuées **avant** + la génération du code objet, cette phase est faite par le compilateur. + + compilateur + + programme qui transforme un langage de haut niveau en un langage de base + niveau + + - phase d’analyse syntaxique (source -> syntaxe abstraite) + - phase de synthèse (syntaxe abstraite -> code objet) + + + scripting (langage de scripting) + + langage interprèté + + générique (langage) + + Langage à usage générique, qui peut être utilisé dans n'importe quel + domaine (par opposition au DSL) + + domain specific + + Domain Specific Language, langage destiné à être utilisé dans un + domaine prédéfini. + + paradigmes + + représentation d'une vision particulière à partir d'un modèle théorique + + impératif + + l'algorithme ressemble à une recette de cuisine, + c'est-à-dire à une succession d'instructions à exécuter + les unes à la suite des autres + + fonctionnel + + l'algorithme ne dépend plus de l'ordre d'exécution d'instructions + pas de mélange entre les données et les traitements + + objets (programmation) + + le monde est découpé en catégories + qui permettent de créer des objets + + **développement par composants** + + les objets sont organisés entre eux par composants suivant des designs patterns, + (patrons de conception) + + garbage collector (ramasse miettes) + + la gestion automatique de la mémoire apparaît en 1989 + + machine virtuelle + + portabilité du code (mais diminution en optimisation et performances) + + JIT (just in time compiler) + + code objet, programmes fonctionnant autour de machines virtuelles + + +- **le typage statique** : la vérification de la compatibilité entre les types des + paramètres formels et des paramètres d'appel est effectuée au moment de la + compilation du programme. Dès lors, il n'est pas nécessaire de faire ces + vérifications durant l'exécution du programme ce qui accroît son efficacité. En + outre, la vérification de type permet d'éliminer la plupart des erreurs introduites + par maladresse ou étourderie et contribue à la sûreté de l'exécution. + +- **le typage dynamique** : la vérification de la compatibilité entre les types des + paramètres formels et des paramètres d'appel est effectuée au moment de l'exécution + ou de l'appel à certaines parties de codes du programme. + +- **le polymorphisme paramétrique** : une fonction ou un objet qui n'explore pas la + totalité de la structure d'un de ses arguments accepte que celui-ci ait un type non + entièrement déterminé. Ce paramètre est alors dit polymorphe. Cette particularité + permet de développer un code générique utilisable pour des structures de données + différentes tant que la représentation exacte de cette structure n'a pas besoin + d'être connue par le code en question. L'algorithme de typage est à même de faire + cette distinction. + +- **l'inférence de types** : le programmeur n'a besoin de donner aucune information + de type à l'intérieur de son programme. Le langage se charge seul de déduire du code + le type le plus général des expressions et des déclarations qui y figurent. Cette + inférence est effectuée conjointement à la vérification, lors de la compilation du + programme. + +Les grands paradigmes de programmation +--------------------------------------- + +Le paradigme des objets +~~~~~~~~~~~~~~~~~~~~~~~ + +- 1962 (SIMULA) : premières notions de classes ; + +Pui, une dizaine d'années plus tard : + +- C++ : intégration des classes pour le C ; +- turbo pascal : intégration des classes pour le pascal ; + +Tous les langages actuels ont intégré des traits objets mais de manière très +différentes : + +- perl (1987) +- python (1991) +- Ruby (1993) + +- L'implémentation des objets en python est très proche des notions initiales de + classes issues du Smaltalk et présente une tentative très intéressante + d'unification des objets et des types depuis python 2.2 ; + +- Java (1995) : très grosse réussite industrielle en surfant sur la vague de la + programmation objet, et des machines virtuelles, mais en fait et avec le recul, + doté d'un support objet lourd et alambiqué. + Le monde Java est lourd, avec des outils consommant beaucoup de mémoire et + qui ne satisfont pas à la règle du KISS (Keep It Simple, Stupid) ; + + +Il n'y a pas **une** POO (Programmation Objet), il y a des POO. +Les implémentations objets dans les langages sont riches et variées : + +- objets obligatoirement construits pas des classes (Java, C++, ...) +- objets sans définition de classes (javascript, Ocaml, go, rust) +- langages à attributs (python) +- langages ou le type des objets est défini par leur classe (python, ruby) +- langages ou le type des objets est différent du type de leur classe (Ocaml) +- objets sans classes mais construits par des prototypes (javascript) +- construction d'objets possibles objets sans classe du tout (Ocaml) +- encapsulation des attributs des objets (Java, Ocaml, C++, PHP) +- pas d'encapsulation des attributs (python, ruby, javascript...) + +Le paradigme impératif +~~~~~~~~~~~~~~~~~~~~~~ + +Un programme est une suite d'états de la mémoire de l'ordinateur, +c'est la suite logique des machines de Turing. +La plupart des programmeur aujourd'hui raisonnent suivant ce paradigme, +et ont une très faible visibilité par rapport aux autres paradigmes existants. +Seuls les programmeurs cultivés sont aujourd'hui capable de raisonner +suivant différents paradigmes, ce sont des programmeurs chevronnés et +cultivés. + +Le paradigme fonctionnel +~~~~~~~~~~~~~~~~~~~~~~~~ + +La notion de fonction que possède sous une forme ou une autre la plupart des +langages est empruntée aux mathématiques et non à l'électronique. D'une manière +générale, les langages substituent des modèles formels aux conceptions purement +calculatoires. Ils y gagnent en expressivité. Certains langages fondent leur +paradigme de programmation sur l'abstraction entrée-traitement-sortie, donc sur le +**mathème fonctionnel** et pas sur la boite noire électronique. La fonction +mathématique apporte un niveau opératoire dans le traitement de l'information. + + +Approche par fonctionnalités +---------------------------- + +Plusieurs domaines de l'informatique on proposé/imposé des méthodologies, +des manières de faire. Ces modèles de programmation on fortement influencé +en retour les langages. On reconnaît aujourd'hui : + +- Le modèle client-serveur +- Le modèle de programmation concurrente (exécution de processus légers, threads) : +- Le modèle de développement d'une application de bureau (MVC, ergonomie d'interface) +- Le modèle de développement web (communiquer sur le réseau Internet, API + REST, microservices...) +- Le modèle de programmation système et réseau +- le modèle **Dev Ops** et les méthodes de développement virtualisés +- les langages présentant des **fonctionnalités agiles** + +Conclusion +----------- + +Les langages de haut niveau sont caractérisés par +des concepts tels que : + +- déclaration de valeurs, types, expressions, portée +- expressions, variables, instructions, structures de contrôle +- fonctions, procédures, fermetures +- encapsulation, modules, objets + +=========== ============ +Paradigmes Concepts +=========== ============ +impératif variables, procédures, modules +objets classes, méthodes, héritage, surcharge +fonctionnel fonctions, fermetures, modules +logique prédicats, modules +concurrent tâche/processus, communication +=========== ============ diff --git a/poo/cours/modularite.txt b/poo/cours/modularite.txt new file mode 100644 index 0000000..276d12d --- /dev/null +++ b/poo/cours/modularite.txt @@ -0,0 +1,200 @@ +La programmation structurée +============================= + +Un langage de programmation doit permettre la programmation structurée. + +.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes, + Elles sont une nécessité + +Structuration d'un programme +----------------------------- + +La réalisation d'applications importantes oblige le programmeur ou l'équipe de +développement à se poser des questions d'organisation et de structuration. +Aujourd'hui, on dispose de deux grands modèles d'organisation dont les avantages et les +particularités sont distincts. + +L'écriture des vrais programmes consiste à les structurer pour les présenter +comme un assemblage de briques qui s'emboîtent naturellement. +Ce problème se révèle fondamental dès que la taille des programmes devient conséquente. +Si on ne prend pas garde au bon découpage des programmes en modules indépendants, +on se retrouve rapidement débordé par un grand nombre de variables, +et il devient quasiment impossible de réaliser un programme correct. + +La programmation raisonnée +--------------------------- + +Un **programme** est le codage d'un algorithme dans un langage de programmation. +La programmation consiste à modéliser un problème du monde réel sous une forme +symbolique (pour faire résoudre ce problème par un ordinateur). + +Certains problèmes sont **indécidables** ou **ouverts**. +On utilise un langage de programmation pour décrire la **solution** du programme. +La sémantique du programme est le sens de chacune des constructions du langage. +**Comment passer de l'énoncé d'un problème à un programme de bonne qualité ?** + +spécifier + + décrire de manière complète et rigoureuse le problème à résoudre + +modéliser + + proposer une représentation du réel qui soit accessible au calcul + algorithmique + +transcrire + + La transcription du modèle algorithmique se fait dans un langage + de programmation cible adapté au problème + +valider + + La validation du programme est une étape qui permet de s'assurer plus ou + moins fortement que le programme produit les résultats attendus. + La validation va de la série de tests unitaires (validation faible) + à la preuve de programme (validation mathématique forte). + +Conception descendante +----------------------- + +Une vision **centripète** : du général au particulier. + +Il s'agit d'une méthode de résolution d'un problème. On le découpe en tâches +de plus en plus fines, de plus en plus détaillées, qui aboutiront au programme final. + +On met des *trous* dans les algorithmes de plus haut niveau, +c'est-à-dire des phrases en langage naturel. + +.. ifconfig: exercice + + **Exercice** : **Calculer la date du lendemain** + +.. ifconfig: correction + + - l'algorithme de plus bas niveau + + :: + + lendemain jour = + si jour [est le dernier jour du mois] alors + resultat = [calculer le 1er janvier de l'année suivante] + sinon + resultat = lendemain_dansl'année jour + + - les algorithmes de plus bas niveau + + :: + + lendemain_dans_l'année jour = + si jour [est le dernier jour du mois] alors + resultat = [calculer le premier jour du mois suivant] + sinon + resultat = jour suivant jour + + :: + + jour_suivant jour = + jour + 1 + + et ainsi de suite jusqu'à ce que toutes les phrases soient calculables. + +Algorithme vague +-------------------- + +L'algorithme vague, c'est quand on pense l'algorithme en se plaçant du côté de +l'implémentation en premier. On a le nez dans le guidon, la vue d'ensemble est +difficile. + +Voici, tiré du monde réel, un exemple d'algorithme vague +("ce que doit faire une fonction"), placé dans un bout de code +(souvent la **docstring** d'une fonction). + +.. code-block:: python + + def upsert_route(*args, **kwargs): + """ + Create or modify an existant DHCP route + param tuple (id or null, machine name, IP, MAC Adress) + return True or False with error message + """ + # si id présent alors modification sinon ajout + # récupère la liste des réservations en cours + # y cherche la variable sur la base de l'ID + # modifie les valeurs + # applique la nouvelle conf DHCP + + return True + +Voici un autre bout de code avec l'algorithme en commentaire, +et l'implémentation effective de l'algorithme + +.. code-block:: python + + def del_route(*args, **kwargs): + """ + Delete an existant DHCP route + param tuple (id, machine name, IP, MAC Adress) + return True or False with error message + """ + # récupère la liste des réservations en cours + # y cherche la variable sur l'id donné en paramètre + # supprime l'entrée avec vérification que les données fournies + # sont bien dans l'enregistrement à supprimer + # applique la nouvelle conf DHCP + route_to_del = (1, "host2","10.1.2.4","6E:FF:56:A2:AF:17") + routes = get_routes() + if route_to_del in routes: + c = creole_loader(load_extra=True, rw=True) + c_id = c.dhcp.dhcp.id_dhcp.id_dhcp.index(route_to_del[0]) + if c.dhcp.dhcp.id_dhcp.macaddress[c_id]==route_to_del[2] + and c.dhcp.dhcp.id_dhcp.ip[c_id]==route_to_del[1]: + c.dhcp.dhcp.id_dhcp.id_dhcp.pop(c_id) + config_save_values(c, MODNAME) + return True + return False + +Les deux grands paradigmes +--------------------------- + +La modularité +~~~~~~~~~~~~~~ + +Les données et les traitements sont regroupés au sein d'une même entité à deux +facettes : d'un côté le code proprement dit, de l'autre son interface. La +communication entre modules s'effectue via leur interface. La description d'un +type peut être masquée en n'apparaissant pas dans l'interface du module. Ces +types de données abstraits facilitent les modifications d'implantation à +l'intérieur d'un module sans affecter les autres modules qui s'en servent. De +plus, les modules peuvent être paramétrés par d'autres modules augmentant +ainsi leur réutilisabilité. + +Le paradigme objet +~~~~~~~~~~~~~~~~~~ + +Les descriptions des traitements et des données sont regroupées dans des +entités appelées **classes**; un objet est une instance (valeur) d'une classe. +La communication entre objets est réalisée par envoi de message, l'objet +receveur détermine à l'exécution (liaison retardée) le traitement +correspondant au message. En cela, la programmation objet est dirigée par +les données. La structuration d'un programme provient des relations entre +classes, en particulier l'héritage permet de définir une classe par extension +d'une autre. + +En programmation objet, un **programme** est une collection d’objets qui communiquent +entre eux par **message**, le **résultat** est un message envoyé à un objet particulier + +Comparaison entre les deux paradigmes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Il y a dualité entre ces deux modèles. + +- On ne peut pas augmenter les composants d'un type dans un module (pas + d'extensibilité des données), mais on peut ajouter de nouveaux traitements + (extensibilité des traitements) sur ces données. + +- En objet, on peut ajouter des sous-classes à une classe (extensibilité des + données) pour traiter des nouveaux cas, mais on ne peut pas ajouter de nouveaux + traitements visibles de la classe ancêtre (pas d'extensibilité des traitements). + +**La combinaison des deux paradigmes offre de nouvelles extensibilités pour les +traitements et les données.** diff --git a/poo/cours/modules.txt b/poo/cours/modules.txt new file mode 100644 index 0000000..5df4b5e --- /dev/null +++ b/poo/cours/modules.txt @@ -0,0 +1,313 @@ +La programmation modulaire +=========================== + +Il s'agit de décomposer un grand programme en +morceaux (**modules**) connectés entre eux par des **interfaces** bien +définies. + +Ces modules doivent être aussi indépendants que possible. + +module + + ensemble de ressources liées sémantiquement + +interface + + mode d’emploi du module, avec en plus un principe de masquage + des informations (partie publique, partie secrète) + + +Signatures, type abstrait et langage de modules : la programmation modulaire +permet d'aller très loin dans la programmation structurée. + + +Définir des fonctions dans un fichier séparé +-------------------------------------------- + +Les fonctions peuvent être définies dans un fichier et le programme dans un +autre fichier séparé. Dans ce cas, pour pouvoir être exécuté directement avec +la commande python `nomfichierprogramme.py`, le fichier du programme doit +importer d’abord les fonctions du fichier dans lequel les fonctions sont +définies. + +1. Fichier de fonctions +~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: python + + # Fichier foncmaxliste.py + # Recherche le premier élément maximal dans une liste ou + #dans une chaine de caractères + def max_list(L) : + k = len(L) + max, x = L[0], 0 + i = 1 + while i < k : + if max < L[i]: + max = L[i] + x = i + i = i + 1 + return max, x + +2. Fichier de programme +~~~~~~~~~~~~~~~~~~~~~~~~ + +Pour utilser les fonctions définies dans d’autres fichiers, le fichier de +programme doit commencer par les instructions qui importent ces fichiers de +fonctions ou directement les fonctions de ces fichiers. Dans la syntaxe +ci-dessous, on importe une ou toutes les fonctions du fichier `foncmaxlist.py`. + +.. code-block:: python + + # Fichier progmaxlist.py + from foncmaxliste import max_list + # ou plus simple: + # from foncmaxliste import * + print max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + print max_list(’totovaaumarche’) + couple = max_list(’totovaaumarche’) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + +Au lieu d’importer les fonctions, on peut importer le fichier qui définit les +fonctions avec la syntaxe qui suit. Dans ce cas, le fichier de programme sera +changé comme suit : + +.. code-block:: python + + # Fichier prog2maxlist + import foncmaxliste + print foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + # la syntaxe indiquant le chemin d’acces a la fonction max_list utiliser ‘‘.’’ + couple = foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7]) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + print foncmaxliste.max_list(’totovaaumarche’) + couple = foncmaxliste.max_list(’totovaaumarche’) + print ’Max de L est ’, couple[0] + print ’et se trouve à la position ’, couple[1] + +L’exécution directe du premier fichier de programme:: + + python prog max list.py + +L’exécution directe du seconde fichier de programme:: + + python prog2 max list.py + +Définition de l'implémentation d'un module +------------------------------------------- + +Tout fichier qui contient au moins une définition d’une fonction ou d’une +variable est appelé un module (une bibliothèque). Le nom du module est le nom +du fichier enlevé le suffixe `.py`. Ainsi, un fichier de programme qui contient +au moins une définition d’une fonction ou un fichier qui ne contient que des +définition de fonctions sont des modules. On peut importer un module ou des +fonctions ou variables d’un module dans un programme, comme nous avons vu dans +les exemples ci-dessus. + +.. important:: on peut importer un module, ou bien lancer un module en tant que + programme executable + +.. code-block:: python + + if __name__ == '__main__': + main() + +Pour faciliter la programmation, Python définit un certain nombre de **modules internes**, +appelés les builtins (la librairie standard). + +Par exemple : + +– Lors de l’ouverture d’une session interactive, on est dans un module interne nommé + main . Toutes les variables définies par affectation au niveau de ce module sont valides + globalement dans la session. + +– D’autres modules internes sont string, math, random + +Dans une session de travail sous l’interpréteur Python, la première importation d’un mo- +dule qui, à part des fonctions qu’elle définit, contient des instruction de programme fait +exécuter ces instructions. Dans la même session, les importations suivantes ne font pas +exécuter ces instructions. Pour les exécuter, on utilise la fonction reload(nomdumodule) +(sans sufffixe .py). + +Exemples d'interface +-------------------- + +:: + + type: son type + arguments + arg1 : description de l'argument 1 + arg2 : description de l'argument 2 + préconditions: + arg1 > 10 + postconditions: + result < 19 + raises: TypeError, AssertionError, SystemError... + test: tests nominaux pour chaque cas spécifié + +- L'interface racine carrée + +:: + + racine: + type: float -> float + arguments x: float, flottant dont on veut calculer la racine + pré: x >= 0 + test: racine 25.0 -> 5.0 ; racine (-25) -> raises TypeError + +- L'interface `lendemain` + +Il faut définir auparavant un type spécifique appelé `date` + +:: + + lendemain: le lendemain est la date qui désigne + le jour suivant de la date passée en argument + type: date -> date + arguments : + d: date + description: la date dont on veut calculer le lendemain + +Le langages des modules +------------------------- + +.. code-block:: ocaml + + module type PILE = (* signature (interface) du module *) + sig + type ’a t + val create : unit -> ’a t + val push : ’a -> ’a t -> unit + val pop : ’a t -> ’a + end + + (* implémentation du module *) + module Pile : PILE = (* le module est restreint + par la signature PILE *) + struct + type ’a t = ’a list ref + let create () = ref [] + let push x p = p := x::!p + let pop p = match !p with [...] + let rec print p = match p with [...] + end + +- `struct .. end` introduit une collection de définitions, valeurs, types ou modules. + C'est une **structure**. + +- `module Nom = struct .. end` permet de donner un nom à cette structure et + c'est ça un module. C'est une structure nommée. + +- `sig ... end` introduit une signature de module : une interface pour un module. + +On restreint souvent une structure par une signature pour "cacher" certaines +définitions. Une signature de module fournit une **interface** entre l'extérieur +et l'intérieur d'un module. + +En dehors du module, on accède à ses composants grâce à la notation pointée + +.. code-block:: ocaml + + let p = Pile.create() + Pile.push 45 p + +Les foncteurs +-------------- + +Si un langage possède un langage de modules, on peut aller plus loin : on peut +considérer un module comme étant une expression de base du langage. + +- La signature d'un module peut être considérée comme le type du module +- La structure du module peut être considéré comme sa valeur + +Quel est l'intérêt ? On peut alors définir des **foncteurs**. + +foncteur + + "fonction" d'une structure vers une autre structure. + On peut ainsi paramétrer un module par un autre module. + +.. code-block:: ocaml + + module Nom (M1 :S1 ) (M2 :S2 ) (M3 :S3 ) ... = + struct + ... + end + +On applique un foncteur à des paramètres modules, pour +obtenir un nouveau module : + +.. code-block:: ocaml + + module M = F (Titi) (Toto) + + +Contrainte de type par signature +------------------------------------ + +:: + + module M = + struct + type t = int * int * int ;; + let make d m y = d, m, y ;; + end ;; + + let d = M.make 8 5 8 ;; + + module type S = + sig + type t ;; + val make : int -> int -> int -> t ;; + end ;; + + module MS = (M:S) ;; + + MS.make 5 1 2 ;; + +Type et signature +------------------ + +:: + + # module type A = sig + val a: int -> int + end ;; + module type A = sig val a : int -> int end + # module B = struct + let a x = x + 1 ;; + end;; + module B : sig val a : int -> int end + # module C = (B:A) ;; + module C : A + + # C.a 2 ;; + - : int = 3 + # + +Module auquel on impose une signature +----------------------------------------- + + +:: + + module type DATE = sig + type t + val make: int -> t + val get_year: t -> int + val get_month: t -> int + end ;; + + module MR = struct + type t = int * int + let make x y = (x, y) + let get_month (x, y) = x + let get_year (x, y) = y + end ;; + + module date = (MR:DATE) ;; diff --git a/poo/cours/presentation.txt b/poo/cours/presentation.txt new file mode 100644 index 0000000..6263f9e --- /dev/null +++ b/poo/cours/presentation.txt @@ -0,0 +1,72 @@ +Avant propos +============ + +Introduction +~~~~~~~~~~~~ + +| "**Que nul n'entre ici s'il n'est géomètre**" +| Maxime apposée au porche d'entrée de l'École de Platon + + +- L'accent est mis sur l'approche **algorithmique scientifique**, dite algorithmique + algébrique. L'algorithmique est un sous-domaine de l'algèbre et des + approches modulaires (arithmétique modulaire...) + +- Le point de vue mathématique étant assez exigeant, **aucun formalisme fort** de + l'algorithmique mathématique ne sera présenté. Aucun symbole mathématique donc, et + seulement du pseudo-code. + L'approche mathématique forte utilisant le formalisme mathématique de + l'algorithmique algébrique est en général enseignée en France uniquement aux cours + des grandes écoles. + +- L'algorithmique présentée ici est donc délibérément pseudo-scientifique mais en revanche + ouverte au **multi-paradigme**. En général l'évocation d'un algorithme en pseudo code est toujours + réducteur car limité au style de programmation le plus à la mode actuellement, c'est-à-dire le + **style impératif**. Nous présenterons un éventail des plus grands paradigmes de programmation + existants. Nous nous limiterons à la **programmation impérative, fonctionnelle, modulaire, + générique et objet**. Nous envisagerons les structures de données et les structures de contrôle + spécifiques à chacun des styles évoqués. + +- Et parce qu'un honnête programmeur doit avoir une vue d'ensemble de **l'état de son art**, + nous évoquerons un panorama des différents langages existants -- historiques et contemporains -- + en les comparants les uns aux autres. + +- Durant tout le cours, nous souhaitons proposer une pédagogie par l'exemple, et nous + limiterons l'exposé à deux langages d'implémentation des algorithmes : le **Python** pour la programmation + impérative modulaire et objet, et le **OCaml**, car nous évoquerons aussi certains points + de programmation fonctionnelle et modulaire, polymorphe et teintée de généricité. + +Intérêt +------- + + +| "**Il ne suffit pas d'avoir les mains propres, il faut avoir l'esprit pur.**" +| Thalès de Milet ; Sentences - VIe s. av. J.-C. + +L'algorithmique en tant que rapport à la vérité et à la pensée juste et vraie, +en tant qu'art de découper un problème complexe en tâches élémentaires, +en tant qu'énoncés de compréhension et de sémantique, +est la seule chose vraiment profonde dans l'informatique. Le reste n'est que 0 ou 1. +Cette notion d'algorithme est profondément enracinée dans le désir humain de +transmettre des méthodes pour comprendre des problématiques, +qu'il s'agisse de processus scientifiques ou mathématiques, de secrets, +de philosophie ou de divination au sens des anciens Grecs. +De règles linguistiques, aussi, chez les Romains. + +Objectifs de ce cours +~~~~~~~~~~~~~~~~~~~~~ + +Il s'agit de : + +- maîtriser et concevoir un algorithme de base, +- choisir une représentation appropriée des données, +- décomposer en sous-problèmes et affinements successifs, +- savoir organiser son code en fonctions et en modules. + +Le développement raisonné d’algorithmes et leur implantation +permet d'acquérir les qualités suivantes : + ++ Analyser et modéliser un problème, spécifier, ++ Exprimer une problématique, une solution ou un algorithme, ++ Traduire un algorithme dans un langage de programmation, ++ Concevoir une réponse à un problème précisément posé. diff --git a/poo/cours/programme.txt b/poo/cours/programme.txt new file mode 100644 index 0000000..6133cf1 --- /dev/null +++ b/poo/cours/programme.txt @@ -0,0 +1,476 @@ +Définition d'un programme +========================== + +Qu'est-ce qu'un programme ? +---------------------------- + +- Un **programme** est une suite de **phrases** ; +- Une **phrase** est une **déclaration** ou une **expression** (*statement* en anglais) ; + +Production d'un programme : + +1. on écrit le code source du programme ; +2. on demande au compilateur de le traduire en code machine : c'est la compilation du programme ; +3. on demande à la machine d'effectuer le code machine : c'est l'exécution du programme. + +.. important:: + + L'introduction à la compilation et les différentes phases de la compilation + d'un programme sont des sujets qui ne seront pas traités dans ce cours. + +Dans un programme de base, il y a deux fichiers : + +1. un fichier contenant le code : c'est le source du programme. +2. un fichier contenant le code machine : c'est l'exécutable. + +Que peut faire un programme lorsqu'il est exécuté ? +Le programme doit communiquer. S'il reste isolé, il ne pourra pas +produire quoi que ce soit. Voici les trois moyens de communication qu'a un +programme : + +1. communiquer avec l'utilisateur, +2. communiquer avec des fichiers, +3. communiquer avec d'autres programmes. + +Les expressions +---------------- + +expression + + Une expression est une valeur caculée du langage, une opération arithmétique + qui retourne une valeur (entier, texte, valeur logique...). + C'est donc une suite sémantiquement correcte de **valeurs de base** et **d'opérateurs** + +Par exemple, la ligne suivante est une expression effectuant une addition:: + + 5 + 6 + +Expressions à partir de types de base +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Autres exemples d'expressions : + +- 5 est une expression de type int +- 4.5 est une expression de type float +- 'c' est une expression de type char +- true est une expression de type bool +- print ('c') est une expression de type None +- raw_input est une expression de type string + +Les expressions se complexifient avec la complexification des données et des traitements, +mais le principe de l'expressivité d'un langage reste le même. + + +.. ifconfig:: exercice + + **Exercice** : + Le parenthésage et les opérateurs booléens:: + + Variables A, B, C, D, E en Booléen + Variable X en Entier + Début + Lire X + A <- X > 12 + B <- X > 2 + C <- X < 6 + D <- (A ET B) OU C + E <- A ET (B OU C) + Ecrire D, E + Fin + + **Que valent D et E si X = 3 ?** + + +.. ifconfig:: correction + + **Correction** : D sera VRAI alors que E sera FAUX + + + + +Les déclarations +----------------- + +Un autre exemple d'expression : + +.. raw:: latex + + \begin{algorithm} + \caption{Exemple d'expression} + \begin{algorithmic}[1] + \BState \emph{sortie}: $l$ \Comment{C'est l'expression calculée renvoyée} + \ForAll {$v \in V(G)$} + \State $l(v) \leftarrow \infty$ + \EndFor + \State $l(u) \leftarrow 0$ + \Repeat + \For {$i \leftarrow 1, n$} + \State $min \leftarrow l(v_i)$ + \For {$j \leftarrow 1, n$} + \If {$min > e(v_i, v_j) + l(v_j)$} + \State $min \leftarrow e(v_i, v_j) + l(v_j)$ + \State $p(i) \leftarrow v_j$ + \EndIf + \EndFor + \State $l(i) \leftarrow min$ + \EndFor + \State $changed \leftarrow l \not= l’$ + \State $l \leftarrow l$ + \Until{$\neg changed$} + \end{algorithmic} + \end{algorithm} + +Exemple de déclarations : + +- `a = 1` +- `b = 'c'` + +.. important:: Le signe égal est utilisé de deux manières + + - lors d'une déclaration d'une expression + - lorsque deux expressions sont équivalentes + + Suivant les langages, il y a deux symboles différents, ou alors + ils sont identiques. + +Il s'agit de **renseigner** une valeur dans une expression nommée + +- en javascript : + +.. code-block:: javascript + + var b = "blabla" ; + +- en python : + +.. code-block:: python + + b = "blabla" + +- en java : + +.. code-block:: java + + String b = "A"; + +- en OCaml : + +.. code-block:: ocaml + + let a = 1 + +Grâce au mécanisme d'inférence de type dans OCaml, le mot-clef **let** +signifie ici véritablement l'instanciation d'une valeur au sens +mathématique du terme : soit `a` l'entier tel que a soit égal à 1... + +En OCaml comme dans tous les langages fonctionnels, tout ce que nous avons l'habitude +d'appeler des "variables" à propos des affectations, sont en fait des **constantes** +au sens du paradigme impératif de la programmation. + +.. important:: + + Par voie de conséquence, le symbole ``=`` est utilisé à la fois pour la définition des objets et pour le test d'égalité. + Pour les autres langages, on utilise `==` ou bien `===` (javascript) car + le `=` est sémantiquement déjà utilisé... + +Toutes ces notation, apparemment anodines, correspondent donc à des paradigmes de programmation + +Lorsqu'on ne déclare pas les types des symboles déclarés, c'est que soit + +- le typage est faible +- le typage est dynamique (calcul du type en fonction du contenu de la + variable) +- le typage est statique et fort mais ça ne se voit pas + (var le système les calcule automatiquement par inférence de type) + +Assigner, allouer, affecter une chose à quelqu'un ou à une autre chose. + +Exemples dans la langue française : + +- Le traitement que le budget **alloue** à ces fonctionnaires. +- Un système d'exploitation multitâche alloue le travail du processeur aux processus en attente, pour un bref laps de temps, à leur tour. + +.. glossary:: + + affectation + + Une affectation, aussi appelée assignation par anglicisme, est une structure qui permet d'attribuer une valeur à une variable. + + Il s'agit d'une structure particulièrement courante en programmation impérative, et dispose souvent pour cette raison d'une notation courte et infixée, + comme ``x = expr`` ou ``x := expr`` ou encore `x <- expr`. + Dans certains langages, le symbole est considéré comme un opérateur d'affectation, + et la structure entière peut alors être utilisée comme une expression. + D'autres langages considèrent une affectation comme une instruction et ne permettent pas cet usage. + +Voir aussi : + +- Les déclarations de types primitifs et conversions de type +- Les types de base:: + + Octets (8 bits) byte + Entiers courts (16 bits) short + Entiers (32 bits) int + Entiers longs (64 bits) long + Réels (32 bits) float + Réels longs (64 bits) double + Caractères (16 bits) char + Booléens boolean + +- Déclarations par lots:: + + x1 = e1, x2 = e2, ... xn = en; + +Exercices : algorithmes sur les affectations + +.. ifconfig:: exercice + + **Exercice** : Calculs d'affectation:: + + Variables A, B, C en Entier + Début + A <- 3 + B <- 10 + C <- A + B + B <- A + B + A <- C + Fin + +.. ifconfig:: correction + + **Correction**:: + + Après La valeur des variables est : + A <- 5 A = 5 B = ? + B <- 2 A = 5 B = 2 + A <- B A = 2 B = 2 + B <- A A = 2 B = 2 + +.. ifconfig:: exercice + + **Exercice** : Calculs d'affectation + Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ? + :: + + Variables A, B en Entier + Début + A <- 5 + B <- 2 + A <- B + B <- A + Fin + +.. ifconfig:: correction + + **Correction**:: + + Après La valeur des variables est : + A <- 5 A = 5 B = ? + B <- 2 A = 5 B = 2 + A <- B A = 2 B = 2 + B <- A A = 2 B = 2 + +.. ifconfig:: exercice + + **Exercice** : écrire un algorithme permettant d’échanger les valeurs + de deux variables A et B, et ce quel que soit leur contenu préalable. + +.. ifconfig:: correction + + **Correction**:: + + Début + A <- n + B <- p + C <- A + A <- B + B <- C + Fin + + Il faut passer par une variable dite temporaire (la variable C) + + +.. ifconfig:: exercice + + **Exercice** : + Que produit l’algorithme suivant ? + + :: + + Variables A, B, C de type entier + Début + A <- 423 + B <- 12 + C <- A + B + Fin + +.. ifconfig:: correction + + **Correction** : dans un prompt python + + .. code-block:: python + + >>> a = 423 + >>> b = 12 + >>> c = a + b + >>> c + 435 + +.. ifconfig:: exercice + + **Exercice** : + Que produit l’algorithme suivant ? + + :: + + Variables A, B, C de type texte + Début + A <- "423" + B <- "12" + C <- A + B + Fin + +.. ifconfig:: correction + + **Correction** : dans un prompt python + + .. code-block:: python + + >>> a = '423' + >>> b = '12' + >>> c = a + b + >>> c + '42312' + +Interaction avec l'utilisateur +------------------------------ + +Il est possible de communiquer de la manière suivante avec un programme : + +- lire et écrire sur l'entrée/sortie standard +- lire et écrire dans un fichier +- afficher (du texte, un nombre...) +- lire (du texte, un nombre...) +- interagir avec les prompts + + +.. code-block:: ocaml + + let x = read_int () in + let signe = + if x >= 0 + then " positif " + else " négatif " in + print_string signe + + +.. ifconfig:: exercice + + **Exercice** : écrire un algorithme qui demande le prénom d'une personne + et renvoie "bonjour, je m'appelle " + +.. ifconfig:: correction + + **Correction** : (implémentation en python) + + .. code-block:: python + + # coding: utf-8 + prenom = raw_input("quel est ton prénom ? \n") + print("bonjour, je m'appelle " + prenom.capitalize()) + + +La REPL (boucle d'interaction) +------------------------------- + +.. glossary:: + + REPL + + Read Eval Print Loop : outil principal de communication avec un programme + ou avec un système. Exemples : la console python, le prompt OCaml. + + interface + + outil de communication avec un programme. + + - interface texte + - interface graphique + +**Exemples de REPL** + +Le prompt python:: + + Python 2.7.12 (default, Nov 19 2016, 06:48:10) + [GCC 5.4.0 20160609] on linux2 + Type "help", "copyright", "credits" or "license" for more information. + >>> + >>> dir() + ['__builtins__', '__doc__', '__name__', readline', 'rlcompleter'] + >>> + +Le prompt ipython:: + + Python 2.7.12 (default, Nov 19 2016, 06:48:10) + Type "copyright", "credits" or "license" for more information. + + IPython 2.4.1 -- An enhanced Interactive Python. + ? -> Introduction and overview of IPython's features. + %quickref -> Quick reference. + help -> Python's own help system. + object? -> Details about 'object', use 'object??' for extra details. + + In [1]: + +Le prompt OCaml (utop):: + + Type #utop_help for help about using utop. + + ─( 09:21:24 )─< command 0 >── + utop # + # let x = 1 in x + 2;; + - : int = 3 + # let y = 1 + 2;; + val y : int = 3 + # y * y;; + - : int = 9 +Construire une boucle d'interaction avec l'utilisateur en python:: + + #!/usr/bin/env python3 + error = True + while error: + try: + entier = int(input('donnez un entier : ')) + error = False + except: + print('une valeur entiere est attendue') + print(entier) + +Lire et écrire dans un fichier +------------------------------ + +Les descripteurs de fichiers (file handle) + +Exemple en python + +.. code-block:: python + + >>> fh = file("test.txt", "w") + >>> fh.write("un contenu exemple") + >>> fh.close() + >>> + +.. code-block:: python + + >>> fh.read() + 'un contenu exemple' + >>> fh.close() + >>> + +Linéarisation (serialisation) de données par exemple en json + +.. code-block:: python + + import json + data = dict(a='essai', b='essai2', c=range(3)) + with open('data.txt', 'w') as outfile: + json.dump(data, outfile) diff --git a/poo/cours/tp.txt b/poo/cours/tp.txt new file mode 100644 index 0000000..3d3ebd5 --- /dev/null +++ b/poo/cours/tp.txt @@ -0,0 +1,101 @@ +Travaux Pratiques +================= + +.. ifconfig:: exercice + + **travaux pratiques :** + + Ecrire un algorithme qui renvoie le résultat d’une mini-calculatrice. Cette + méthode aura + comme paramètre deux nombres et une chaîne de caractère qui vaudra « + », « - + », « * », + « / ». + +.. ifconfig:: exercice + + **travaux pratiques :** + + + Ecrire un algorithme qui renvoie si deux mots (chaîne de caractères) passés en + paramètre + sont des anagrammes l’un de l’autre. (Lettres identiques mais dans un ordre + différent) + + +.. ifconfig:: exercice + + **travaux pratiques :** + + ascii art (ligne d'étoiles) + + Concevoir un algorithme qui, pour un caractère imprimable et un nombre n + donnés, imprime une barre + horizontale de n de ces caractères. + + ``****************`` + + 2. Modifier l’algorithme pour l’impression d’une barre double. + + :: + + **************** + **************** + + 3. Modifier l’algorithme pour l’impression d’une barre d’épaisseur quelconque + donnée. + 4. (optionnel) Transformer les algorithmes ci-dessus en fonctions. + 5. Écrire un programme Java implémentant la dernière version de l’algorithme + (épaisseur quelconque). + + 3.3 + Triangle de nombres + Concevoir un algorithme qui imprime pour n donné:: + + 1 + 1 2 + 1 2 3 + 1 2 3 4 + 1 2 3 4 5 + ........... + ............. + ............... + 1 2 3 4 5 6 ... n + +.. ifconfig:: exercice + + **travaux pratiques :** + + code de césar : faire un programme pour chiffrer et déchiffrer par décalage + + exemples : Effectue une rotation de x caractères vers la droite:: + + >>> print(chiffre('bonjour', 3)) + erqmrxu + >>> print(chiffre('Bonjour les amis!', 3)) + Erqmrxu ohv dplv! + >>> print(chiffre('Erqmrxu ohv dplv!', 23)) + Bonjour les amis! + +.. ifconfig:: exercice + + **travaux pratiques :** + + :: + + écrire “Entrer un numéro de mois” + mois <- lire + selon que mois est + cas 1 : écrire “janvier (31 jours)” + cas 2 : écrire “février (28 ou 29 jours)” + cas 3 : écrire “mars (31 jours)” + cas 4 : écrire “avril (30 jours)” + cas 5 : écrire “mai (31 jours)” + cas 6 : écrire “juin (30 jours)” + cas 7 : écrire “juillet (31 jours)” + cas 8 : écrire “août (31 jours)” + cas 9 : écrire “septembre (30 jours)” + cas 10 : écrire “octobre (31 jours)” + cas 11 : écrire “novembre (30 jours)” + cas 12 : écrire “décembre (31 jours)” + défaut : écrire “numéro invalide” + fselon diff --git a/poo/diapos/Makefile b/poo/diapos/Makefile new file mode 100644 index 0000000..fd60fc0 --- /dev/null +++ b/poo/diapos/Makefile @@ -0,0 +1,47 @@ +RST = python tools/rst.py + +TEXDOCUMENTS = $(basename $(wildcard *.tex)) +RSTDOCUMENTS = $(basename $(wildcard *.txt)) + +SOURCES = $(addsuffix .tex,$(TEXDOCUMENTS)) +DVI = $(addsuffix .dvi,$(TEXDOCUMENTS)) +POSTSCRIPT = $(addsuffix .ps,$(TEXDOCUMENTS)) +POSTSCRIPT_GZ = $(addsuffix .ps.gz,$(TEXDOCUMENTS)) +PDF = $(addsuffix .pdf,$(TEXDOCUMENTS)) +RSTSOURCES = $(addsuffix .txt,$(RSTDOCUMENTS)) +HTML = $(TEXDOCUMENTS) $(addsuffix .html,$(RSTDOCUMENTS)) + +all: dvi ps ps.gz html +dvi: $(DVI) +ps: $(POSTSCRIPT) +ps.gz: $(POSTSCRIPT_GZ) +pdf: $(PDF) +html: $(HTML) + + +${DVI}: %.dvi: %.tex + latex $< + latex $< + +${POSTSCRIPT}: %.ps: %.dvi + dvips -o $@ $< + +${POSTSCRIPT_GZ}: %.ps.gz: %.ps + gzip -c $< > $@ + +${PDF}: %.pdf: %.tex + rm -f $*.out $*.log $*.aux + xelatex $< + rm -f $*.out $*.log $*.aux + +%: %.tex %.dvi + latex2html -local_icons $< + touch $@ + +%.html: %.txt + $(RST) $< > $@ + + +clean: + rm -f -- *~ *.log *.aux *.out *.nav *.snm *.toc ${DVI} ${POSTSCRIPT} ${POSTSCRIPT_GZ} ${PDF} + rm -fr ${HTML} diff --git a/poo/diapos/beamer.tex b/poo/diapos/beamer.tex new file mode 100644 index 0000000..62eb264 --- /dev/null +++ b/poo/diapos/beamer.tex @@ -0,0 +1,268 @@ +\documentclass[ignorenonframetext]{beamer} +\usepackage{graphicx} +% Internal links only wors with second screen on the right +% \setbeameroption{show notes on second screen} +\usetheme{Madrid} +\usecolortheme{dolphin} + +% gets rid of bottom navigation bars +\setbeamertemplate{footline}[frame number]{} + +% gets rid of navigation symbols +\setbeamertemplate{navigation symbols}{} + +%\usetheme{Warsaw} +%\usepackage[french]{babel} +%\usepackage[utf8,utf8x]{inputenc} +%\usepackage[T1]{fontenc} + + +% Replace babel +\usepackage{polyglossia} +\setdefaultlanguage{french} + +%% Require XeTeX +\usepackage{xltxtra} +\usepackage{fontspec} +\usepackage{xunicode} + +\logo{ + \hspace{120pt} + \includegraphics[width=2cm]{img/cesi.jpg}~ + \hspace{113pt} + \includegraphics[width=1cm]{img/logo-cadoles.png}~ +} + + +%%\setbeamertemplate{background}{\includegraphics[width=128mm]{beamer-skel/img/banner01.png}} + +\title[]{Algorithmique} + +\subtitle{CESI alternance} +\subtitle{promotion GMSI B3} + +\author[Gwenaël Rémond]{} + +%\institute[E.O.L.E]{\includegraphics[width=2cm]{beamer-skel/img/logo-eole.png}} +\institute[Cadoles]{\includegraphics[width=2cm]{img/cesi.jpg}} + +%\date{{\small 8 avril 2013}} + +\subject{Talks} + +\AtBeginSection[] % Add a TOC with current section highlighted +{ + \begin{frame} + \frametitle{Plan} + \tableofcontents[currentsection] + \end{frame} +} + + +\usepackage{hyperref} +\usepackage{hyperxmp} +\hypersetup{% + colorlinks=true,linkcolor=blue,urlcolor=blue,pdfpagemode=UseNone, + pdftitle={EAD3}, + pdfsubject={Présentation technique d'EWT}, + pdfauthor={EOLE}, + pdfkeywords={EOLE, J-EOLE, distribution, GNU, Linux, Éducation, + nationale, Ubuntu}, + pdflang={fr-FR}, + pdfcopyright={Copyright © 2017 Équipe EOLE }, % Require XeTeX + pdflicenseurl={http://creativecommons.org/licenses/by-nc-sa/2.0/fr/}, +} + +\parskip=0.8em + +\begin{document} + +\frame{\titlepage} + +\section{Introduction} +\begin{frame} +\frametitle{Objectifs} + +\texttt{ + "Il ne suffit pas d'avoir les mains propres, \\ + il faut aussi avoir l'esprit pur."\\ +} +\emph{Thalès ; VIe s. av. J.-C.} + +\begin{itemize} +\item<1-> maîtriser et concevoir un algorithme, +\item<2-> choisir une représentation appropriée des données, +\item<3-> décomposer en sous-problèmes et affinements successifs, +\item<4-> savoir organiser son code et faire des petits programmes en python. +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{L'art de programmer} +\texttt{GEEK SUBLIME (Vikram CHANDRA) +Une vision esthétique, littéraire, mathématique du codage} + +\begin{itemize} +\item<1-> Programmer, c'est abstraire, prendre du recul. +\item<2-> Abstraire, par rapport à quoi ? Par rapport à la machine +\item<3-> Les niveaux d'abstraction par rapport à la machine +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Les langages de programmation} +\begin{itemize} +\item Qu'est-ce qu'un langage de programmation ? +\item Les grands paradigmes de programmation (procédural, objet, fonctionnel, modulaire, générique \dots) +\item L'historique des langages. +\end{itemize} +\end{frame} + +\section{Algorithmique} +\begin{frame} +\frametitle{Les algorithmes} +\begin{itemize} +\item définition d'un algorithme +\item implémentation d'un algorithme +\item représentation d'un algorithme dans un langage cible +\end{itemize} +\end{frame} + +\section{Algorithmique pour la programmation} + +\begin{frame} +\frametitle{Qu'est-ce qu'un programme ?} +\begin{itemize} +\item <1-> Les expressions +\item <2-> Les déclarations +\item <3-> La REPL (Read Eval Print Loop) +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Approche générale des fonctions} +\begin{itemize} +\item Les procédures +\item La portée d'une variable +\item Les fonctions +\end{itemize} +\end{frame} + + +\begin{frame} +\frametitle{Les structures de contrôle} +\begin{itemize} +\item Le branchement conditionnel +\item L'itération +\item \dots +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{Les structures de données} +\begin{itemize} +\item Les listes +\item Les dictionnaires +\item Les arbres, les graphes \dots +\end{itemize} +\end{frame} + +\begin{frame} +\frametitle{L'état de l'art de l'agorithmique} +\begin{itemize} +\item en mathématiques + \begin{itemize} + \item algorithmique algébrique, + \item arithmétique modulaire, + \item \dots + \end{itemize} +\item en informatique + \begin{itemize} + \item en informatique fondamentale + \item en langages de programmation + \item dans touts les domaines où l'informatique intervient\dots + \end{itemize} +\item en sciences physique, en biologie +\item en sciences sociales (réseaux sociaux, auto-organisation\dots) +\end{itemize} +\end{frame} + +\section{Programmation modulaire} +\begin{frame} +\frametitle{La programmation modulaire} +\begin{itemize} +\item La programmation raisonnée +\item Le paradigme modulaire vs le paradigme objet +\item exemple de programmation modulaire en python +\end{itemize} +\end{frame} + + + + +% Not present in TOC +\appendix + +\begin{frame}[label=thanks]{Remerciements} + + Je remercie la communauté du logiciel libre pour tous ces + merveilleux logiciels sans lesquels si peu de choses existeraient. + + Cette présentation a été réalisée grâce aux logiciels libres + suivants~: + + \begin{itemize} + \item Le système de composition \LaTeX{} + \href{https://fr.wikipedia.org/wiki/TeX_Live}{TeX Live} + \item L'éditeur de texte + \href{http://www.vim.org/}{Vim} + \item L'environnement graphique + \href{http://gnome.org/}{Gnome} + \item Le système d'exploitation + \href{https://debian.org/}{Debian} + \end{itemize} + + \begin{center} + % Do not mess with graphics + \hypersetup{hidelinks} + \begin{tabular}{cccccc} + \href{http://www.gnu.org}{\includegraphics[height=1.3cm]{graphics/gnu-head.pdf}} & + \href{http://www.kernel.org}{\includegraphics[height=1.2cm]{graphics/tux.pdf}} & + \href{http://www.debian.org/}{\includegraphics[height=1cm]{graphics/debian.eps}} & + \href{https://fr.wikipedia.org/wiki/TeX_Live}{\includegraphics[height=1cm]{graphics/texlive.pdf}} + \end{tabular} + \end{center} + +\end{frame} + +\begin{frame}[label=license]{Licence} + Cette présentation est mise à disposition sous licence\\ + \href{http://creativecommons.org/licenses/by-sa/4.0}% + {Creative Commons \textsc{by-sa 4.0}} + \begin{columns}[t] + \begin{column}{5.5cm} + \begin{itemize} + \item Attribution + \end{itemize} + \end{column} + \begin{column}{6.5cm} + \begin{itemize} + \item Partage dans les mêmes conditions + \end{itemize} + \end{column} + \end{columns} + Vous pouvez obtenir une copie de la licence + \begin{block}{par Internet} + \href{http://creativecommons.org/licenses/by-nc-sa/4.0}% + {\url{http://creativecommons.org/licenses/by-nc-sa/4.0}} + \end{block} + \begin{block}{par courrier postal} + \begin{quote} + Creative Commons\\ + 444 Castro Street, Suite 900 Mountain View,\\ + California, 94041, USA. + \end{quote} + \end{block} +\end{frame} + +\end{document} diff --git a/poo/diapos/graphics/Logo-EOLE.eps b/poo/diapos/graphics/Logo-EOLE.eps new file mode 100644 index 0000000..13f4889 --- /dev/null +++ b/poo/diapos/graphics/Logo-EOLE.eps @@ -0,0 +1,133 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.8 (http://cairographics.org) +%%CreationDate: Tue May 16 12:20:58 2017 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%BoundingBox: 0 -1 232 85 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 -1 232 85 +%%EndPageSetup +q 0 -1 232 86 rectclip q +0.290196 0.247059 0.454902 rg +133.668 16.757 m 133.668 16.757 133.25 1.257 148.941 1.257 c 176.328 1.257 + l 170.723 3.749 168.633 5.874 164.891 10.585 c 150.969 10.585 l 147.234 + 10.585 145.441 13.222 145.441 17.538 c 145.441 17.538 145.492 75.363 145.414 + 75.445 c 142.301 82.999 133.668 84.519 133.668 84.519 c 133.668 83.995 +133.676 39.347 133.668 16.757 c h +133.668 16.757 m f +41.039 38.73 m 41.207 38.808 41.25 38.921 41.457 39.109 c 41.5 40.347 41.375 + 41.511 41.164 42.823 c 40.625 46.238 40.664 49.726 41.207 53.07 c 41.125 + 53.214 l 41.043 53.366 40.914 53.405 40.914 53.405 c 40.664 53.48 40.414 + 53.554 40.121 53.515 c 35.613 53.366 31.141 52.577 26.758 51.265 c 24.457 + 50.702 22.16 50.14 19.863 49.577 c 17.984 49.015 16.688 48.152 15.812 46.913 + c 16.062 46.839 16.145 46.691 16.23 46.538 c 16.48 46.464 l 16.395 46.238 + l 15.98 45.863 15.812 45.409 15.895 44.886 c 15.977 44.738 16.105 44.698 + 16.188 44.55 c 16.523 44.327 16.859 44.101 17.062 43.909 c 17.234 43.988 + 17.234 43.988 17.355 43.952 c 17.523 44.027 17.816 44.062 18.023 44.249 + c 18.316 44.288 18.445 44.249 18.57 44.21 c 24.836 43.464 30.973 41.999 + 37.027 39.933 c 37.152 39.894 37.281 39.855 37.242 39.749 c 37.324 39.597 + 37.449 39.558 37.406 39.445 c 37.91 39.296 l 38.91 38.995 39.785 38.734 + 40.75 38.698 c 40.914 38.769 40.914 38.769 41.039 38.73 c 39.117 40.687 + m 38.117 40.988 l 39.078 40.948 l 39.16 40.796 39.117 40.687 39.117 40.687 + c f +49.855 72.859 m 49.855 72.859 54.316 79.749 63.262 84.269 c 13.684 84.269 + l 0.484 84.269 0.527 73.152 0.527 73.152 c 0.527 17.499 l 0.527 17.499 +0.117 1.984 15.809 1.984 c 64.07 1.984 l 58.465 4.472 54.559 8.597 50.816 + 13.308 c 50.816 13.308 15.844 13.296 15.891 13.308 c 11.449 13.308 12.086 + 17.542 12.086 17.542 c 12.156 69.034 l 12.156 73.109 15.902 72.859 15.902 + 72.859 c f +69.723 45.148 m 69.723 45.148 66.891 28.866 79.219 23.05 c 84.949 20.351 + 89.504 19.945 95.855 22.363 c 99.852 23.882 103.457 27.659 104.977 31.769 + c 106.496 35.878 105.191 40.874 101.199 44.757 c 99.793 38.538 98.297 33.53 + 92.91 30.741 c 89.711 29.116 86.457 29.386 83.211 30.995 c 79.961 32.605 + 77.473 36.48 76.484 40.363 c 76.484 40.363 74.473 47.585 82.195 59.417 +c 75.809 56.718 70.875 52.245 69.723 45.148 c h +69.723 45.148 m f +0.945098 0.792157 0.0745098 rg +110.621 8.773 m 117.836 13.503 123.312 20.792 125.211 30.261 c 125.238 +30.429 l 126.707 37.968 125.305 45.933 121.43 52.601 c 117.527 59.308 110.711 + 64.777 102.098 65.82 c 102.074 65.831 l 96.797 66.464 90.988 64.273 86.93 + 60.507 c 82.406 55.163 80.273 51.816 80.387 44.03 c 84.254 49.132 94.043 + 54.202 100.949 53.523 c 105.414 52.984 108.629 50.445 110.898 46.542 c +113.168 42.636 114.066 37.445 113.184 33.058 c 110.383 19.085 94.641 12.073 + 81.125 15.976 c 62.398 21.382 55.426 40.464 63.086 58.038 c 72.824 73.859 + 90.422 80.905 113.074 77.519 c 105.887 85.03 93.703 83.984 93.703 83.984 + c 82.363 84.874 61.398 78.519 53.613 63.808 c 42.234 42.316 52.059 11.566 + 78.055 4.062 c 89.188 0.847 101.344 2.695 110.621 8.777 c h +110.621 8.773 m f +0.290196 0.247059 0.454902 rg +194.387 67.495 m 185.594 67.495 178.215 64.179 172.285 57.597 c 166.355 + 51.011 164.41 42.503 164.41 32.046 c 164.41 20.98 166.184 15.999 171.609 + 9.894 c 180.992 -1.075 203.68 1.32 210.367 1.402 c 217.055 1.484 219.438 + 1.644 231.012 0.57 c 228.027 5.839 220.824 9.495 218.348 10.011 c 206.766 + 12.195 193.328 8.179 181.414 15.484 c 176.691 19.57 175.734 22.14 175.559 + 29.62 c 223.012 29.62 l 223.012 35.269 l 223.012 45.374 219.598 53.257 +214.785 58.945 c 208.164 64.816 201.25 67.409 194.387 67.495 c h +194.184 58.421 m 199.434 58.421 203.531 56.702 206.484 53.245 c 209.438 + 49.788 211.941 44.956 211.984 38.745 c 175.684 38.745 l 175.715 44.808 +177.715 49.339 181.262 52.972 c 184.805 56.601 189.109 58.421 194.184 58.421 + c h +194.184 58.421 m f +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/poo/diapos/graphics/Logo-EOLE.svg b/poo/diapos/graphics/Logo-EOLE.svg new file mode 100644 index 0000000..f55c0d7 --- /dev/null +++ b/poo/diapos/graphics/Logo-EOLE.svg @@ -0,0 +1,1277 @@ + + + +image/svg+xml       \ No newline at end of file diff --git a/poo/diapos/graphics/Logo-EOLEienne.eps b/poo/diapos/graphics/Logo-EOLEienne.eps new file mode 100644 index 0000000..72c3b78 --- /dev/null +++ b/poo/diapos/graphics/Logo-EOLEienne.eps @@ -0,0 +1,318 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.8 (http://cairographics.org) +%%CreationDate: Tue May 16 12:15:46 2017 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%BoundingBox: 0 -1 1660 851 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%BeginResource: font DejaVuSans-Bold +11 dict begin +/FontType 42 def +/FontName /DejaVuSans-Bold def +/PaintType 0 def +/FontMatrix [ 1 0 0 1 0 0 ] def +/FontBBox [ 0 0 0 0 ] def +/Encoding 256 array def +0 1 255 { Encoding exch /.notdef put } for +Encoding 32 /space put +/CharStrings 2 dict dup begin +/.notdef 0 def +/space 1 def +end readonly def +/sfnts [ +<000100000009008000030010637674203eb93108000000e8000002546670676d5b026bf00000 +033c000000ac676c7966e2f9cb840000009c0000004c686561640e24be09000003e800000036 +686865610eaf07730000042000000024686d74780796006600000444000000086c6f63610000 +00980000044c0000000c6d6178700647062d0000045800000020707265707c61a2e700000478 +000007a700020066fe96046605a400030007001fbc00040126000000060126b6010805890204 +002fc4d4ec310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f27206 +2900000001660133016600bc00e90000013d00a200fa031f00020002006601660002000200ac +015400ec00bc006201660181048501540166016d04a400020166007f04cd0000000201330062 +00710000002504a401bc00ba00e500660181018d0548055a0166016d000000000002000200f6 +05c301f0053902390058046d043d04b2048104b2016601750466048100b00466043902d1049c +047b04cf047b005801330166014c0166014c000200ac009a014a0123009a029a014401190144 +02cd00c100000166013f019a013b05cb05cb00d500d5015000ac00ac0077020a01c701f2012f +015801b2012300f600f6011f012f0135023501ee01e70133009800d10358050a009a008f0112 +009800bc00cd00e500e500f2007304000166008f05d5022b05d500c300e100d700e50000006a +01020000001d032d05d505d505f000a8006a00ec00e1010205d506140721046602f800ec0183 +02a602f80123010201020112011f031f005e03cd046004c7048900ec01bc00ba01020333031f +03420333035c0112011f05d5019a009a00e106660179046004600460047b000000ec02c302b8 +02cd00be00dd00d50000006a025c027b029a00dd01ae01ba01120000008501ae04600762041b +009a069a045800ee009a029a00d102cd019a015005cb05cb008b008b063100f6040600f0034c +016004a800c10000002505c101000121074a06120096014a078300a800000337007b00140000 +00c9010005c105c105c105c101000108061d00960427039e00ec0102027d0133009800d10358 +017900cd02390362009c009c009c009301b8009300b80073000014000326b707060504030201 +002c2010b002254964b040515820c859212d2cb002254964b040515820c859212d2c20100720 +b00050b00d7920b8ffff5058041b0559b0051cb0032508b0042523e120b00050b00d7920b8ff +ff5058041b0559b0051cb0032508e12d2c4b505820b80128454459212d2cb002254560442d2c +4b5358b00225b0022545445921212d2c45442d2cb00225b0022549b00525b005254960b02063 +68208a108a233a8a10653a2d0001000000025eb8b54203fc5f0f3cf5001f080000000000d3d9 +0a2000000000d3d90a20f772fcae0fcd096500010008000000010000000000010000076dfe1d +00001021f772f9320fcd00010000000000000000000000000000000204cd006602c900000000 +00000000004c0000004c000100000002034e002b0078000c0002001000400008000005ed0221 +0008000441840280012600fe000301250011000301240121003a0005012400fa000301230016 +000301220121003a0005012200fe00030121003a0003012000fa0003011f00bb0003011e0064 +0003011d00fe0003011c00190003011b001e0003011a00fe0003011900fe0003011800fe0003 +011700fe0003011600fe000301150114000e0005011500fe00030114000e0003011300fe0003 +011200fe0003010f010e007d0005010f00fe0003010e007d0003010d010c008c0005010d00fe +0003010d00c00004010c010b00590005010c008c0003010c00800004010b010a00260005010b +00590003010b00400004010a00260003010900fe0003010800fe00030107000c000301070080 +00040106b2972e054113010600fa0003010500fa0003010400fe0003010300190003010200fa +0003010100fa0003010040ff7d03ff3e03fefe03fcfb2c05fcfe03fb2c03fafe03f9f84705f9 +7d03f84703f7fa03f6fe03f5fe03f4fe03f3bb03f2fe03f1fe03f0fe03ef1e03eefe03edec0a +05edfe03ec0a03ec4004ebea0a05eb3203ea0a03e9fa03e8911605e8fe03e7fa03e6fa03e591 +1605e5fe03e4fe03e3fe03e2fe03e1fe03e0fe03dffe03defa03dddc1805dd6403dc1803dba0 +1e05db6403dad92505dafa03d92503d8d12505d8fa03d7d61405d71603d6d51005d61403d510 +03d4d30b05d42003d30b03d2d12505d2fa03d1911605d12503d0940c05d02303cfce1405cf26 +03cecd1205ce1403cd1203cc911605cc1d03cb1403cac9bb05cafe03c9c85d05c9bb03c98004 +c840ffc72505c85d03c84004c72503c6fe03c56403c4901005c4fe03c31c03c2fe03c1fe03c0 +bf3a05c0fa03bfad1b05bf3a03bebd1a05be3203bdbc1105bd1a03bcbb0f05bc1103bbba0c05 +bb0f03ba0c03b9911605b9fe03b8fe03b71503b61203b5fe03b4fe03b3fe03b21703b11903b0 +1603afad1b05affa03aead1b05aefa03ad911605ad1b03ac911605ac7d03abfe03aa2603a9fe +03a8fe03a7fe03a6fe03a50a03a4fe03a3a20e05a3fe03a20e03a24004a1a01e05a1fa03a091 +1605a01e039f9116059ffa039e940c059e1c039dfe039c9bbb059cfe039b9a5d059bbb039b80 +049a8f25059a5d039a400499fe0398972e0598fe03972e0396911605961e40ff0395940c0595 +2003940c0393911605934b039291160592fe03919010059116039010038f25038efe038dfe03 +8cfe038bfe038afe0389fe038887250588fe0387250386fe0385fe0384320383960382fe0381 +fe038019037f0a037efe037dfe037cfe037bfa037afa0379fe037776a60577fe0376a6037574 +1b0575fa03741b0373fa03727d0371fe03706f2c056f2c036efa036dfa036cfa036bfe036afe +0369fe0368630c0568320367fe0366320365640a0565fe03640a0364400463620a05630c0362 +0a0361601505619603600111056015035f0a035efe035dfe035c0111055cfe035b5a1b055bfe +035a0111055a1b0359fe0358fa0357fe035601110540ff56fe0355fe03541e03531403525119 +0552fa0351011105511903504f190550fa034f4e11054f19034e11034d1e034c4b14054c1503 +4b4a11054b14034a490e054a1103490e0348fa034746140547150346140345fa0344430e0544 +0f03430e034241250542fa0341011105412503403f0f0540fe033f3e0e053f0f033e0e033d3c +0d053d16033c0d033b64033afe0339140338fe0337130336351a0536250335341405351a0335 +c004340a0d0534140334800433320c05331403334004320c033130a60531fe033001110530a6 +032f0c032e13032d2c3a052dfa032c1525052c3a032b64032a640329fe032815032717110527 +1e03262003251e0324231105402b241e0323110322000d0522fa03210f032140042014031f0a +031e1e031d1c19051d25031c0f13051c19031cb801004091041b0d031a194b051a7d03190111 +05194b0318fe031711031615250516fa031501110515250314640313110312fe031101110511 +fe031064030f0e10050f13030fc0040e10030e80040d0111050dfa030c32030b0a0d050b1603 +0b80040a0d030a400409fe0308fe0307fe0306050a0506fe03050a0305400404fa0303640302 +01110502fe0301000d05011103000d0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b1d0000> +] def +/f-0-0 currentdict end definefont pop +%%EndResource +%%BeginResource: font DejaVuSans +11 dict begin +/FontType 42 def +/FontName /DejaVuSans def +/PaintType 0 def +/FontMatrix [ 1 0 0 1 0 0 ] def +/FontBBox [ 0 0 0 0 ] def +/Encoding 256 array def +0 1 255 { Encoding exch /.notdef put } for +Encoding 32 /space put +/CharStrings 2 dict dup begin +/.notdef 0 def +/space 1 def +end readonly def +/sfnts [ +<0001000000090080000300106376742000691d39000000e0000001fe6670676d7134766a0000 +02e0000000ab676c7966f9f1ddd70000009c00000044686561640d13be360000038c00000036 +686865610d9f076f000003c400000024686d747807580066000003e8000000086c6f63610000 +0088000003f00000000c6d617870046f0671000003fc00000020707265703b07f1000000041c +0000056800020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4d4ec +310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f2720629013500b8 +00cb00cb00c100aa009c01a600b800660000007100cb00a002b20085007500b800c301cb0189 +022d00cb00a600f000d300aa008700cb03aa0400014a003300cb000000d9050200f4015400b4 +009c01390114013907060400044e04b4045204b804e704cd0037047304cd04600473013303a2 +055605a60556053903c5021200c9001f00b801df007300ba03e9033303bc0444040e00df03cd +03aa00e503aa0404000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd009a +009a006f00cb00cd019e01d300f000ba018300d5009803040248009e01d500c100cb00f60083 +0354027f00000333026600d300c700a400cd008f009a0073040005d5010a00fe022b00a400b4 +009c00000062009c0000001d032d05d505d505d505f0007f007b005400a406b80614072301d3 +00b800cb00a601c301ec069300a000d3035c037103db0185042304a80448008f013901140139 +0360008f05d5019a0614072306660179046004600460047b009c00000277046001aa00e90460 +0762007b00c5007f027b000000b4025205cd006600bc00660077061000cd013b01850389008f +007b0000001d00cd074a042f009c009c0000077d006f0000006f0335006a006f007b00ae00b2 +002d0396008f027b00f600830354063705f6008f009c04e10266008f018d02f600cd03440029 +006604ee00730000140000960000b707060504030201002c2010b002254964b040515820c859 +212d2cb002254964b040515820c859212d2c20100720b00050b00d7920b8ffff5058041b0559 +b0051cb0032508b0042523e120b00050b00d7920b8ffff5058041b0559b0051cb0032508e12d +2c4b505820b0fd454459212d2cb002254560442d2c4b5358b00225b0022545445921212d2c45 +442d2cb00225b0022549b00525b005254960b0206368208a108a233a8a10653a2d0000010000 +00025eb862af5a3e5f0f3cf5001f080000000000d3d90a2c00000000d3d90a2cf7d6fc4c0e59 +09dc00000008000000010000000000010000076dfe1d00000efef7d6fa510e59000100000000 +00000000000000000000000204cd0066028b0000000000000000004400000044000100000002 +0354002b0068000c000200100099000800000415021600080004b8028040fffbfe03fa1403f9 +2503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603f02503ef8a4105effe03ee96 +03ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5e45305e59603e48a4105e453 +03e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603dcfe03db1203da7d03d9bb03 +d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe03d21b03d1fe03d0fe03cffe +03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c6851105c61c03c51603c4fe03c3fe +03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba1103b9862505b9fe03b8b7bb +05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004b52503b4fe03b39603b2fe03 +b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205ab2503aa1203a98a4105a9fa +03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03a16403a08a4105a096039ffe +039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a1003990a0398fe0397960d05 +97fe03960d03958a410595960394930e05942803930e0392fa039190bb0591fe03908f5d0590 +bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058cfe038b2e038a8625058a4103 +89880b05891403880b03878625058764038685110586250385110384fe038382110583fe0382 +110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c64037b5415057b25037afe0379fe +03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370fe036ffe036efe036c21036b +fe036a1142056a530369fe03687d036711420566fe0365fe0364fe0363fe0362fe03613a0360 +fa035e0c035dfe035bfe035afe0359580a0559fa03580a035716190557320356fe0355541505 +55420354150353011005531803521403514a130551fe03500b034ffe034e4d10054efe034d10 +034cfe034b4a13054bfe034a4910054a1303491d0d05491003480d0347fe0346960345960344 +fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e14033d3c0f053d12033c3b0d +053c40ff0f033b0d033afe0339fe033837140538fa033736100537140336350b05361003350b +03341e03330d0332310b0532fe03310b03302f0b05300d032f0b032e2d09052e10032d09032c +32032b2a25052b64032a2912052a25032912032827250528410327250326250b05260f03250b +0324fe0323fe03220f03210110052112032064031ffa031e1d0d051e64031d0d031c1142051c +fe031bfa031a42031911420519fe031864031716190517fe031601100516190315fe0314fe03 +13fe031211420512fe0311022d05114203107d030f64030efe030d0c16050dfe030c0110050c +16030bfe030a100309fe0308022d0508fe030714030664030401100504fe03401503022d0503 +fe0302011005022d0301100300fe0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b +2b2b2b1d00> +] def +/f-1-0 currentdict end definefont pop +%%EndResource +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 -1 1660 851 +%%EndPageSetup +q 0 -1 1660 852 rectclip q +0 g +BT +115.200005 0 0 115.200005 1659.494566 0.0000456218 Tm +/f-0-0 1 Tf +( )Tj +ET +0.945098 0.792157 0.0745098 rg +158.102 787.356 m 160.379 829.535 l 190.289 799.809 l h +158.102 787.356 m f +21.06434 w +0 J +0 j +[] 0.0 d +4 M q 0.380357 -1 -0.775998 -0.295156 0 1266.965088 cm +471.528 27.38 m 435.436 6.755 l 471.344 -14.188 l h +471.528 27.38 m S Q +58.695 757.856 m 80.516 721.688 l 39.07 729.465 l h +58.695 757.856 m f +18.464385 w +q -1 0.699805 0.543047 0.775998 0 1266.965088 cm +-278.556 -404.865 m -310.193 -422.942 l -278.719 -441.304 l h +-278.556 -404.865 m S Q +10.25 623.512 m 41.414 613.496 l 14.113 596.141 l h +10.25 623.512 m f +17.112694 w +q -1 -0.121862 -0.110002 0.811158 0 1266.965088 cm +75.757 -781.871 m 46.436 -798.623 l 75.608 -815.637 l h +75.757 -781.871 m S Q +101.438 509.071 m 70.375 498.742 l 82.148 528.875 l h +101.438 509.071 m f +12.576204 w +q 1 0.937579 0.772771 -0.802194 0 1266.965088 cm +-330.318 558.711 m -351.867 546.4 l -330.429 533.894 l h +-330.318 558.711 m S Q +0.290196 0.247059 0.454902 rg +161.094 604.578 m 161.094 604.578 152.773 561.961 192.316 543.309 c 210.699 + 534.641 225.316 533.344 245.688 541.098 c 258.508 545.977 270.074 558.094 + 274.949 571.278 c 279.824 584.461 275.645 600.489 262.836 612.942 c 258.316 + 592.989 253.516 576.926 236.242 567.981 c 225.973 562.762 215.535 563.629 + 205.117 568.793 c 194.703 573.957 186.715 586.391 183.539 598.844 c 183.539 + 598.844 177.09 622.012 201.859 659.969 c 182.059 644.739 164.789 627.348 + 161.094 604.578 c h +161.094 604.578 m f +0.945098 0.792157 0.0745098 rg +293.059 497.508 m 316.207 512.684 333.766 536.067 339.859 566.434 c 339.953 + 566.977 l 344.664 591.156 340.164 616.715 327.734 638.102 c 315.219 659.625 + 293.348 677.164 265.715 680.52 c 265.637 680.531 l 248.703 682.571 230.078 + 675.531 217.055 663.453 c 202.543 646.313 195.703 635.578 196.059 610.594 + c 208.465 626.961 239.875 643.227 262.027 641.047 c 276.348 639.321 286.664 + 631.18 293.949 618.653 c 301.23 606.125 304.105 589.465 301.281 575.391 + c 292.289 530.563 241.789 508.082 198.43 520.598 c 138.359 537.934 116.312 + 599.153 133.5 657.778 c 160.254 711.746 268.816 729.453 286.945 734.754 + c 280.277 744.656 213.539 742.957 213.539 742.957 c 180.559 734.364 130.008 + 728.141 104.754 682.086 c 53.828 589.199 105.188 506.442 188.582 482.371 + c 224.301 472.059 263.293 477.992 293.055 497.504 c h +293.059 497.508 m f +0 g +BT +32.000001 0 0 32.000001 1361.895445 368.012451 Tm +/f-1-0 1 Tf +( )Tj +ET +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/poo/diapos/graphics/Logo-EOLEienne.svg b/poo/diapos/graphics/Logo-EOLEienne.svg new file mode 100644 index 0000000..7a2c713 --- /dev/null +++ b/poo/diapos/graphics/Logo-EOLEienne.svg @@ -0,0 +1,779 @@ + + + +image/svg+xml    \ No newline at end of file diff --git a/poo/diapos/graphics/Logo-MENESR.jpg b/poo/diapos/graphics/Logo-MENESR.jpg new file mode 100644 index 0000000..02d6870 Binary files /dev/null and b/poo/diapos/graphics/Logo-MENESR.jpg differ diff --git a/poo/diapos/graphics/Logo-PCLL.eps b/poo/diapos/graphics/Logo-PCLL.eps new file mode 100644 index 0000000..f151afd --- /dev/null +++ b/poo/diapos/graphics/Logo-PCLL.eps @@ -0,0 +1,927 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.14.8 (http://cairographics.org) +%%CreationDate: Tue May 16 12:27:36 2017 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 3 +%%BoundingBox: 0 -1 300 165 +%%EndComments +%%BeginProlog +save +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 -1 300 165 +%%EndPageSetup +q 0 -1 300 166 rectclip q +0.32549 0.286275 0.529412 rg +197.438 160.944 m 171.461 160.944 148.402 148.244 134.059 128.76 c 154.211 + 128.76 l 165.531 139.28 180.707 145.713 197.438 145.713 c 214.016 145.713 + 229.07 139.405 240.355 129.057 c 260.641 129.057 l 246.285 148.385 223.293 + 160.944 197.438 160.944 c h +132.855 37.463 m 147.086 17.01 170.703 3.549 197.438 3.549 c 223.234 3.549 + 246.145 16.073 260.508 35.323 c 240.219 35.323 l 228.949 25.041 213.953 + 18.772 197.438 18.772 c 179.809 18.772 163.918 25.92 152.438 37.463 c h +132.855 37.463 m f* +4.26191 w +2 J +0 j +[] 0.0 d +5 M q 1 0 0 -1 0 164.490509 cm +197.438 3.547 m 171.461 3.547 148.402 16.246 134.059 35.73 c 154.211 35.73 + l 165.531 25.211 180.707 18.777 197.438 18.777 c 214.016 18.777 229.07 +25.086 240.355 35.434 c 260.641 35.434 l 246.285 16.105 223.293 3.547 197.438 + 3.547 c h +132.855 127.027 m 147.086 147.48 170.703 160.941 197.438 160.941 c 223.234 + 160.941 246.145 148.418 260.508 129.168 c 240.219 129.168 l 228.949 139.449 + 213.953 145.719 197.438 145.719 c 179.809 145.719 163.918 138.57 152.438 + 127.027 c h +132.855 127.027 m S Q +q +0 164.491 300 -165 re W n +% Fallback Image: x=0 y=0 w=300 h=165 res=300ppi size=2580000 +[ 0.24 0 0 0.24 0 -0.629491 ] concat +/DeviceRGB setcolorspace +8 dict dup begin + /ImageType 1 def + /Width 1250 def + /Height 688 def + /Interpolate false def + /BitsPerComponent 8 def + /Decode [ 0 1 0 1 0 1 ] def + /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def + /ImageMatrix [ 1 0 0 -1 0 688 ] def +end +image +Gb"-V#C$t`_Z+TWTnl<<&Yt88b,Xs2W2ka,:g=(M65>*n8eDZ2(mhN?N"B_H["+5p+.A + <))6]`'+5R]f?:_V:#om[bNcc\tLR=!98HgXVBTBGt8j6i'dBCB!VHZ0u + LnW#DWd,0R#dci1=3U^ZdGoX-LFj.hBC\rto0E=uRLJqe*Nd:%%]!1bkYap\`u6@:BmK-Uc + 5g>UMEJ*k$.Wb'gn1*Bef>o]]:Gf<3sE'j1,Z"98E%!&0DO@_$gHB)L'Jd6!Aj>dd-Z_$Ql + d+#\((^Rd`c/[fRU`nI`_piL1([`;HJIf)B3o]8[)<\0UO[:\OWQsK50rk*LSHE-6H(]XO9 + !:U!!3I)DRYO1(c,'*K$Z_hXXmCRIJh`4t(:28U0V"0sgfaIn(XcMmBtP)dsQq(cBtn\H2 + -ejdIEsMkN,QH!<<*"5Y>p3hSflS@s5hHL[>Ke]mN)Ki3l?M/+8!@)GsdeGPc7$nF4f8>B` + KSSN1h\h?j5_!!(_jVI]&NHW"r`s,kM$opdIgQ1As^O41hr(fC25`[kI<^ACIfRIp,&e]/a + 3!!!!592!Ng4*5X76qkD[jh8;)k1N:RG:Uc1kEcj;q^`)F]/=2%HqJFjlE^Qm!!!#c/gi%@ + k`Kr0(@N15CNtoc;jI)4o!!?so'>tn[.0o?O'M\)ab5S"4;\%u!'n8<1F6O,FSrf0c%?8Fj + borfRLUph%NDc/FRI]^HVa4c?iU0,!&!GT;Y&uCZ%2qf'L1K:!!z$G*=?SD2;1:qmR5>? + \hkb/8-_Y@)?*Lf5KZ.nB9C#ljr*TE%PGHZe#)BHQ^=D85";1#r@Lhe^MUT1*Nrm_,-TXSQ + `:!!!"\5NV!0iXVLg$/3n@lZD57Lq$9qm6#N'i49#;:Zgg#WBQ4@!!!#/]GoJO2Qf2&k1B) + 4/]T=/42duEWO;d$OisIW*PRrY2cp(\!!$-aE`2IcLmUL,6Tc=`.;q-jT;?\jOi%AU=M&>* + NU,@D(]XO9J + ohRAcLRgDP:kZfrGDT8!!&\9okUP$(C]Lr3H^deULXE.,!3.KX1X&r@PAfc`s% + E.*j[@\0@-Bh4Tk`b!5KRecWln:gP13,3Dk(^+N3Dao:!="p6J>fY,d"9!<<*"YYf"Ep82s + ;#PAU)hCiD[R\;JBBQ:DLB.AT!&3^)l,t59S%`Vn??rFk`(ojnoFD@d + 4IL.[ot(Y5!!'f%V5It.MqmLOH^=4,6&^9n:J!!&s/Yup]fs#FoB6I/-dCB>[%e&oSSDs625qbC>)+#!Zp!8puDkuhe'mH + `SN](0/mL_HZ;5GtW>Lri36;Z0>o!!!#i^Vk1pB22aU1J\>)NL-RCXQ^ZV?+cm->mgW4!9? + qrNh#\[]%F?OTCTrc+YK#1NCWi+>]qm]U?ZqV!!!"\J&E?g45=J2o$ooI/tG<,6=P,Wo9E; + U!!'fH\N+r)2oP^B@tsR94X'VJ"*t,hgN"PmO0T)m!!$+E1F%6X6qm>M;j8s"$-AP0[e&"i + jaUfPjf!X3!rr<$c7V7CCJ!`MYM+q:^5OEbhrgV=:0\jSS$!(u!!#,X7XEY6d%0f-66)LJm + /rY-h49t%Xniq9!!!!YMp..H'bN00WN:KX:.Tq1kI)&@_fjI.!<<*r^sPpaEN4E:ApigtXm + 'PfWilj3!!%PEAS'sS>J."XgBl#hjb/_Bd\U6bb%5p?EcP/e-NF,H!(Y,RZYW`bTUXPDj\' + S[Ldl]4T"8LN+U\f_"TSNf^33oQahHZX<5/8WKG[DODSPRpMGnrbzb]bTjEQF44PV9QR+ZA + Cg5Kl<=n?hJ]#QOi)@#d%@0)H)`XF-F1#a('j,G.,I=nNL5!!!#'h2U`7;^XuAo'fSl\gE) + tP1GU_cBtmq,ro9(eHGpQ!3f49:>UkaR#[cuPV9$C+f<;\Q%+&2:2U+A!!!"#&[O"e].SZW + (XdsJ]B9!ne+^j-W4q*g!!!"&cCDI.CsYN1Me>A4_r)*YUl1,X1)Vcg_$D!!!"tOI;4oHcF(V:&'Mt+YJil%bt*S-DT],DpHSNd'2X86!'!!%QIn']/o_gN:L?N:a+>TtDA??A1V=nQnF!!!# + p;dQ&,q9n*dRuL:ZmNmOr:cbs#]6_G&m]$Bi!!%)24`f^lIHN"cmLhik1d_Jk4eHsnop#pc + !!)g\DJid*fZpp"7k7s.&jfhai\D--GAD(kT'E?p!!!"(f]eSkhS!PN?ec8\nkJuRS='q<6 + 1qVp!!!#%-RU9#FRE0N1d_O'4lX>a0I07qA5lq!!!!#W1/@amnV8/APV6SS+o++rH3Tp(Q) + +7k#64`(B4nLI[3?flm2)O^Y@%Y[q**e9'-=S<09?#1!WW5Y_3-G,)"Q]LjU5-V8:eq!^2k + oGqd0='!8M3W<1K;Q^[h%I+f#+86d'Ib=7&q7'a+L:J?qe\OZ)Kk--DRRKTH6VE?Ps],Loj + `!!!!I[O:pt0'rb*Y>,BI7&3JfJA$:B<*pFB!!&Z]G'<;t^ic6.e?;M:Ia7,V-U:ogihA8B + k/Q2H4Or%S!!!!Ye:khV"*t,$?]Gaca91JYB@b$0f2Z0,!<<,X+PSdrl-OI@nl7(]eu"/d# + nTV(UZ]/S;/rV>QN.!cYck.0S>d/GPqP<-+iId,,thLQ<*q]f!!$CCB2;n6U&,8[CJI2%Yp + t15s*!PSA^sjY!!!"dCua4Om@0)4^=ji#8bf6gX%-F/2Qr0AI2rIk!.[)8ZZE%'?_r.48I- + K&R6G>-:/7tWCFT;a!2Nl1SFTUNfuhp4KFhTb#4r8:FRb+N.k:T"!,QarhoX/\-R`>%&jhD + 2&XTnXqbO3*^&e97^cE7S?f?od[drod^7HU'&CVjVDW,"c`J"d%!!"Vp,<]hdn8RL484!Te + CI\67-oEkLobA8C!!#(*S[n<>fBLFZO+\)(J;DD)q8@'KYIac7!-kI@J"6$!oN/bE,_Q_a` + N,:(J\_XbG4>Q1]RM@J[9gurmm'!.UNXJr0.[C`dZMcd(@W*@07=))'1ta6KIJ + N)]-cV^+pmEmAbS3Rh"nCMA(pJ"+*fj`*^$AJeRj3DShl0!/..ma))cEf`jH%?KbS\#b2nlSX;nVqG%O5;V$kn9`?jr/NaKD=hn + kJR8`NkJ%M%mTrAQnr5\u?C#*=\pKa\T2EEX5h27#UQsK + 5p:0l/hbZ9/kg+G6?j2@Q+GATFQD"4[mP?*V8g>f4_SrM77eATHR/stGh(B=HNIaZ\#LCIL + ]I+:`W/a]$ena82Kd^U%N@6:6.*(rD<2)i!0/B]itZf7%:hmiBqlkpa2DscCqMXk7CS1m;8 + /kAX[<.21V!!)(I=0JFllT%o>HB1$Q\p7!knaiLNZa]:WMA)Q1_M9'0^\"nWj$sd7YMMKZq + M&F2(4OeG]^g\DS0:,hQuV5.MX&Y(!!"-K3HOJk-mm).Tp[1UD:ZH54G'EmglE9NpI[e!If/M0C++<.9Zu8-?h]T11PodL(F!8o + Wp"`IGUKHk**Q&"7Y!HV=1`*?&0Ye:H>/]\o^=48He_)Bb2>oo@qPhQ(OA\L5[&`OdhiU.uR(]CH[TYps(Ordb*4EJM + i>5(2@2//F.'0uW>(TuC-q-RuAN@tod%k"o"X!'igt<^^D&UjR#K%&S1-Oi)UaG!s;\BBQ9 + YGMqgC1U8sCO8\l]$ToAJT-]iG.,Uj8<<*"qOGUBlB]#Z/=(T<@\p'SU*k(\:[8b[h%:%5U + M`3t7DYgBXGibhX0bV6pMfWq6CFB/_:_8J@3c`jcjm+Xq)^"PE]=&gAc74p?Q'J[ac%5lO" + Xu[4M/Gf]Z@q\F!W[b&7T>t!IM'_(@RMGXRuRsq^&6B:9<(c'j>RD8(BO[_`,UXKJo4 + pd/S2_&0 + YOaH*@aD]ji#X7#OKb!N4q=@DRQ+n-VrL#NkKBfcF!!'fp_WG]6^>^>\Vfe2c'?@7H4F:*$ + W<)q;Z+.^a5;2SDV#IJ^m`ta`>?%45!!!"BZ#!"=o!K7DPI=hWRPo0YV$kmTT,5;V:7\mOc + 7boW#>\KFU+BWT?1iID!!$E4[4D"Aq[k2Iqds>iVld^[,t7Ju!GFKcG\sbdau2s`.=]O&gK + Ck'YNh;Q!!'ek4/1^s)t@\Up$'hDgt^g^2m0'X4sL'&/ghskS@Z/r(N`[MC$"<_F5'RBB*8 + 27J-fZqS772O4RJSt%LLjRH8@q]klB?[l-bQA1!BC90'*Z]o0WaXX$.O(!!&gb5+1Knl*#J + GIs5JN_eHqdV&1YaAEoVj+d + -N[\Q_m*kReT[&E2ci:?QhCFrcLViZ!!'h-,i;/iY"PGYePq*ZGFr#n&+[P!jBL"nNqMg$? + 25GA^o$;H;m0P(`m*!!!!9P+.[0bM\)s=&9&SS_Hnq>lKM'rDfHkJE(0OjXck8X^0E'b27 + ^Q0]H!&S'(s?!!'NZ^kn2rf1lK$SrNXL7P@P/:02l5!B%#b:(_CFjmU+hQmq&sWBU(W!!#' + GK^M[NC+`_c(]Oh=IFnQ#!<*M6-LB/E5l"$OJ7LpKi+$bS`#$d?@.25+H!63&d\U6bV2I93+* + .D^JH&5;bP\'S%-;9#Je0S2s2a;On.B$CTU_P-Y^,!W1`<.fc!(b-]A%8'W>V^s3<0&pIi_ + bV4![f$lDPh9\51c-.k.J/38f*XT1g0M.p2UO\0,>7TS<;$)?9b6DJ%ffjm/Xg+"pFiNGB' + )51G)jbK\:9'"Xk*(]71]m[5q\KBf3@!!!A5bo:,WYDDatHj>F5:.eQ8W.Fm)6K5Br"6M(_ + ;s4$o=E?b#T`tJs"]Rhd"`EU@f6$X)[s$:c$_O!mb[[n[`7q;?o.eDFi;#?L\`GIE!)VYN[ + FD?"-RiC1jl?+G$,(AIDkR5UOa-Nc)GkOa"cZ + +>=%^7mM`NhURG?[6B@^cd44"!*O=7pP;!!!2A[#(hX=MoNhIM([pnaW3sY>>7T3LOic2pY + I2>Gd?dV>:H"!.Y,Z?0"32/"_3WL[^?PC!J&(O/e!!))$7us0 + Ue"jcDb/"S&"n()adZN0iRju$<;ROA,H + `6X?>P1*DQ?D*t'S%Y"ZTNWEl2 + qCo!:lCbEJ^feN)[O4a\VFK\L]lq;tY\Fn6d]el+[X5W;JuETCSU-W#k%.WW3%7*2tkQ\p' + U;I"dc&,*ltZ=7&q7;uu4(bHlj)D=VM=rh>Nndc7AWia4+6%kI\\E-W5B?R(=X;80K\2sJa + S+R\`%eOL@);*1N3g,C+Kr6g^G,6!;5(K:D8J>AGB1!3QTq'Ot3B3i'lH2*)Km8SKr!D'ItrXs-[^8>X;\p7$4+jg8i^]n;(LFZ`RjF_Phm=/O48_ + "%ZJ2qd@`I6EKXRZ`l5)A+C`I'rd!!$,4c-!`Bf.d"C5BNN;iV[iK#8;WU:7k5Fd@%2;RZQ + W(q1:'r!&3\K_PO\87k7r^\9^US>EY,?V>=R$0]2P=W<7GM/&008HJ11nFo5pIl@TBC!*m< + h^5i%!?UpC+oZ:n>o(Y$\ODftKV=3>=jd-le:\RUH5nsA"kR/6@>kttMV;p6B7-NF.WXgE+T"V0#(]mOucf5hQZjT + ]Z3HEpapBfjfWW3%WNi7qmPcmkf2uS%,?+YD]oe?TBhM(RQ^ZuN2r1`8`q0ctal=1)"!1^o + [`+pAsN`3YOERFQ+cVI3Y<.,/U3/a7T)2%d@.).ULB_[0/!!!S9ZZ>p8$rXepERB^a&WrWT + X83Y7E%[QHfo,!2$OPNTCrklVHW;.Q!!&[Z=:Yi('hiF7aNR?o^-`&(zzzzzzzzzzzzzzzz + zzzzz!",`i-SDNWL`s2Qma,+e#7q'dPq+:f2]X6R-13I*>6"X'Vm^Ni$3-.2Li(hVl%nU,L + k=j:itmrPr2uMhbP%kuJ,fQLcpCBj#qZlacr+FA9*G:qE,r*V#Zr@#*!%190Pm + K#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4F<@5 + (P!!)H.cH]HR"oJT1iZ>I+RF"j*">*V#Zr@$UEr5Rtqr!);cC[>ii9b,fAK(*[MsAin(G8t&d/PDLWa.!&gGX!,4DNBEc + CI&3rV#!,5Q5o$qp8705tdIL/JUn);Ir0f"TTqb'bs`K<2ht8Uft0@#mgq3gYBf.)t,FJZr + G(mrUndM%g4KW*jen7cr-P?/QF.);uhFuU,,",fOO[*PH%W`*^>,/ITrVE3WiQc[:lNpTqt + '^>,k80W;loE181O2$!O?&BW1t3`sW=c/R#N + [7S,%5[VU&-[-?>AV)eodWjQN>181O2$!O?&BW1uncX^X"?G#=IV+ZZ%M7h+=t5c0V94IW$32\(0/)ehn`(2n&X+S/!TW_@**:kFu_'3Zjc\:fD8#JU01gS/C#lurZE]=X!X.L+e9AP6 + oYY.aR=il$[kDJiM";!dc)S[r'3ZlMTV]eaQ3mUE_#Z.\[_d_+[r1"_ + 2E'.Aq0RI8CM`Y-Vk5"cA4Z7M`?4dYMA@eT@)2p?C!]bK">//-ZrEI?;P=4F<@5(P!,r5SC + T4eR]=[h%djHFf7=OA7Ma\&NZ)u`fCS*_7;Z+WW4*FT%:uPi4X@SHt1M>!tS.%""8^LA;78 + &mP/JUn);Ir0f"TXnIi0J[nN>a\Jn)#cYo<)B2C2BV5M\`:kWH\@2fs>>We>`&D5O@Op2LY + FDRE-q7scr-P?/QF.);ugkD8m5u'>;n3=\T4Ojbbn1)p:ueZjn/9?cHFDCkKdd + OA9`BF4n(s6PUNeZlW0Fqcr-D;/_+%3<12*2T`crI-F?_PE!`OJC8"kfE6Xh/16_J&n[X.n + OH:$5*uR:lr&kRl&c["$U.$idpktI'1h`l>U8?"cQ3npOWA:0D!ek/^Y?nm\*?@:]hRjq[r:.JphU?`9bJOGd"j-* + t7Ri-9YHR^sX+!Z7gX"3l@^4!jq@6]/PG"aUMj>h+=t5c0V94IW$32\E\#"QQq<(cf.,*[^ + =gQt0isk$#[;tBO3B9*Cg-NcPV)eodWjQN>181O2$!O?&BW2!i&km5CG:Zn&Ug1HN#)d4a7 + "i,Jj^>Gp-UCD5(+iN5ZrAG>99ff8'`_KjrE?5jkF[6)WD^]+95W7]R>F#eGdLEt5teU$/Q + F.)<%(%*PmK#W!*k+]>H4oWs*c3M<%V+MPW_5&S"6*umFjE&I%8ig>3beHf@/0r*4@l*iX@ + F3k09C;aiX85MHOVl181O2$!O?&BW2!i'("FPKn''e?b.ghLlRL]gsD<:9'03Y_r[;+511hb7JGOP%jE)Bme[ri48/bSc#dm68c?[_Ut>Aq2tcWum0GiB%W + g01n!20S?=?+Y:%ge1e,KS5#H1M?FKgUC%T7Wn"GH1AiiT7?k9>.&+Ys8MmiRPYm=B[H>3b + :d5:I.r[]^86^.l1S9S_$;'H044_HD3ZYT;B5GNN>qcipoIW)`nDAZ3hq,G^'oO;FG^Z[u'p.n\l<=Y3+m/9((MPNc1n2Bkc + %n9mc?BpY=QZ%.89"b*Dkumk7kH\MGtr\T?q_q;mq]2/3u].<3^!rqPLk1M5GAoqfQ0Wi5h + -&J="R.TWX<_:QGDl-`mE?:H"#lU\B^RF"j*">*V#Zr@$E#nCXJ_FG\rUq;BUp@bqnD3m[Yn'\%*;GrZ\o.cA@d,06BN + KM!)\=_u8!sT/F#?:S]agY6-`A2f6lk`uQ_5Puh:s\LH<.N3d*=(7?1b=A)r-C/qZVe`:rMM'nl#%1P1+8u< + 0MDq_R4O$33(r2satCoKpb*3!/OY5C+E'E@gAs)$>jnn$0GAO9%D'!tW+cr'n[,rhcu:7aR + NGMV,gH#nV5M+6Ogk?#04@JR3JLRXd&\$rikXhb#i2('bAP^VSamkphhs8M#sPan,RPa%D% + N>e4p?Q*HYlKm31++bBr%[qe)OLAn7k4o + Q1TS&!L26]p^cl@bWJPm+kPq1G`7DCh\r9ma@qig:Jh?^3mJ7mFq9d[0O"JV>C#`fjd3glI + <@jor>PUWE!W2181O2$!O?&BW2!i&ff@uVb`qf]3H-];0SP[e5RZ"EL$(YVk8hjD!__d[A@ + JHAVjRCDjPtMkpMt`-7L5ejioaA[,8%BcaK-Sn35C2q=s!2*Up;/LS:QeKU)rkBW3b\V#l0 + ?E(inF5('m.>.n4RG1qRN/=+kh>FX+N[!6nC>5L<^qmFqd]Y([igY-e"h;$d$04&JLoONao + \ODDlG29S'g!EVE9UK5V=nV1:f,h-"&[YN*cr-P?/QF.);ugkDNbPJ`3d&kVW;#N'6[K@d+ + !6\-J\KO,7pEBRp1pWP7Z;<%r]^/=PP71ae,^Q9rpFE999"gd1B)qORh[P\Gh]ZDG']^ed8 + FOB98+"c<12*2!Pg!@VPP3A/a_2q@l6`3M2?4rG;m8&J)Z;4hLGS([VacVo%U$9RsObmM>t + QiNu'HUr5]I#et7,#WFE%?5*eXeS52BJ<0Z^qd*Sn![r0j&@EtB'rVH2f<2l%s?1-:GRgh0 + \g"E]EXh>C1fU"XAl?IPu1i:sRDV_nM5QAA*pQDh^V-^cWX\+j.#"O.0[F]eRHpU.d`5s.5 + mD=PbI=6NZeZ*3Ma(s;0XlKl,ZrEI?;P=4F<@5(P!,r5SBW9apD)8Ii?bUp`_a__lbr'`u* + Dp$E[VWK``JXO7JLUj9h5t\W`^[r[hL"]Sj83MNQ7=r=)fNAtA?)Ar*^4uH@=sBm<1uV^h* + FFL5(3:7[?It#]6LplG^]4;F_0r[\9:[eIL@,I=[@B6uVX@8^Y?j(aGl.-tA*kOY + ',MHtj?Z-#md@g'^A%Y]_u7NqoBWTpQ75a%G>.$K2)[ADaKP&Zp$.g-Q)-WCDJlV>&&#aNe + lr@AAg1EY9PCD%JsIl"=t0N^"FIW-8WtLc0$Xj\H61,E7M$m-fk6r-*MGfR$@i'NVnlO'fs + Bl3`uinR;`$Rg".J(EF)l;CpKDYej#pQ[eX'Tg8UJ6njiSI?K^ukVqJ4n'?PN#!n8PF_]mT + X]mYb\iV7(-h8p?GN#7i^PROG1*DADiKhhg(u/QF.)<%(%*PmK#W!*k+]>O(:kP7?Ao`n/i + :@=s5fL?eb_WD]Q&*&q?Vgt&T3BB2!_#4H89H:senJ%k@+rr);8>;^#7FL:HgY?\WdW\J@0 + oB&alhamG7pU=T#f3a#5HWYnPou)\#\u0Fu"q@ZF(\G+Nf6"bS4D<(a)tmG>/QF.)<%(%*P + mK#W!*k,H>,iupiWlk]^8"f8@M^Y%Gh>j]^]2%9#iisd[pbGJqtAP\\RW[?7YW\3V:M\K:O + BmD?@'_Jhg9P2dRAN8n%\nZg+f]E&e^r9ZJ0aW+gY@P\$rj?39$_sFm>4!dgHKidN2HL6Nq + X"99ff8'hZhNAO9#n!1.)&9?kT#M2mT;3HF12YIpSmjukbLmej:D',)%%n)Gl)TP^<"9h@q + (rS?%7O$/f#Sut/>\Lgg'G29?=cBp?(L0`ZJGH^_E[;+6t@9BQIq'<'O:Goi1XHm&'H?JUp + ^AdtE)l>".-1-%R(F`8Cg9k]SN,1:RW_@**:kFu_'3Zjc\-1WRqX1uam^^Z@9q0_9>8J%j( + ).JDj5\Uf;lBKbl\e*-4k'RjT+Y/r@FL]$AW#m]F6:]OH1sgi*j%N_6id[C:u+-Yc=NpP(Jb55OKfRl>3@rr"eE+V*0Wk/ToaPAO^$!qe + 4ZgV;t:L621!$X]r9#).1+S?Fb*q][tRI'e31EGm19<99ff8'hZhNAO9#n!12X%QMT!!+!! + =[^u4"fNutPg>-VPUjBmK)ltkKllTY$]`0NH$g,(@u]d>*&<`>>qkro9&(b)A"2;KqTdD;K&BM\7=.aLhT*U + 8?"cQ3npOWA:0D!ec8MdGE6+&L4YQ0X + 7J>G&r"Ws8D\g?dXY/O%M+>>0AmD,R0#&Xc_9>-q7scr-P?/QF.);ug + kDVRP&QV+T:==0H8_T(D-k^Nf:CbhR;EC5j,h9R.4"O'S/6`k^Sc1^t + rT1cqn%ooGu(%&.'r:A5ij3+p]p$:5!pKH;1n])`,k80WDJ24.MGu8!4 + W0fQ>5%/XD-/^L8HEWi60BieU9Vq?soZ$+==Nrh0VWES!TJ.oS`QB[;+7?hKnA1SRog-DlG + HG1$608[P7#glitj8AO9%D'!tW+cr'n[,rfs=SMtJYmZLoNTrYbfP*0pr&fr*s4c"qH2'aG + 8H`4f8$ig"^O5>&dAB>J+QW1kX++C0%GER.eQ>``M:7TZP60Qt+U]"O!ET>'\]E6ZYV94IW + $70Ab181NGJ4jkDQ>5KeQdO4.P$9[34iG$\pM(4J@S>5l8iV>"]]H1N6I!P,DFm[m_EYGQZ\(9D([;+66#;NK[k2k^hhT\VKCUp!:-8[PYHe3q]F6D7>^*tZ + ,dn`3Y*i+)Qju1Q4g!EW.6;*"FZrEI?;?=QZ3-e/6e>SN'oZEFLQ]mVCoD#;aWOeA!uiI!+[LJ,KE_l(fK?ks/TnjZ!SW0j-rD0K3SEOd3Ybhu9PCD%J + sIl"=t0N^"=J,eUIL6k/N'S1YI8`Sfs>>WN^%7+,i*H^>H1\aG1CG$DJj@^naSO+[6bXe7J + HD\@df=!5Ao6NVR4j/L^/mWSnm]3P*Z>FPZ>&$Z%9$sA%[E!R + lq<'Oi1MrVW;k^&1KU)rkBW3b\V#l0?E:T;E]_q?D\ts#`RPd!^4CcA>h2t.l0f%8PmG#%h + .8ls4<`YO&M.L4.PV-6FHU'MK[k1gmfW`uMrVl]_\hC\J4553QDG!P:55F7Qh+c,UIVH?CM/`mP>e;M(#?R(>.*Xl9:)_#goQf&B?hLQ)&=Z!AEhO=f"V41KpF + 2%=t5c0V94IW$32]pq-0ktT=Vd>'L)Nkj,Ap*K4A6&I_Bplg:CdOm2@OjVb`r9*UW0r^G`g + XHhQgR*Di\@]mpBF]*BM^.$r^)'h;$em7 + k7iSn:hAkN:41BrJb`BjH2sPN#?-sNK,Z!^-$Q'%qXs0d]=WtCT/1,?nNAbKjN3Spm[C)*c'gLo^OCTSG..+3\[f8^ + ^EPVn;FQl%I9c4]O$32=f99ff8'`_Kj9=.YA4?VD,?RU$^F-s(6\+]Fb'BO#kb*B;GcQ58tGe8.db*FVpI$"0qk? + Bg]k09A7**IBU[VacV]"2Lu)H!"^`pD6VQgkC>);N-IUOW=C@eTs,!uELj0Q#ONZ"(fa*BL + QOn(nKm2QTr]gASe[rR\g`-$Oa<-5tu-n%st,L(.jH6 + ocP>jb4LW0R`EXf;r+2M'HN*A&jTmqWO[afXnauePZQj-9,C6jiWjpdu1;cQ7&&A0qHImOjabKMZXuoN^1MWTe>XW\MHI9[8sLmj%N?3#BB82PP$WJ!-(BpOXDXDOq'6:/PqcTZ.5 + M+'j%g#M2E78&mP/JUn);Ir0f"TXnI=tTEN>JIIkrqYaEe.eo^W?QDmg[jUS)gQhQ*W>j-1 + H=r[%3'3BB#f@0@q0B4ECmKKc+7XO*jHEA5Y6f@;ekJh3Pan3k6,j:6:f*8DOcLMEB&ji52@Bm#PMC@")`MZ9>e. + 0=p?iFF>,m[SSF#M)BtoMtl-m].Qdd-]W_@**:kFu_'3Zjc\-,lLWBs?TcJZNkc2%U6)!@f + hI`fgU11b>R=0=CT:"&7hBWFTt92"mMp+BCIQmmB1&*"1U[?E+BY&rsYakiZh[CN+@(5q:` + hgRBV,U7(Br:mbcBW3b\V*YJlW_@**!8nJp[&)Up)]LIJ).G\T>/#Rql*4 + <12*2T`crI-F?_PE!aY.ak&B&pA7%o'2o>M%dquSUIK5:^#8_LT,51KcC?mQ4DVqpU&aW=^ + HXD+Y\2:R*ZcBk^AG(s-DJ(0D;*L(nc/CENsQIHZu=k$Dh%YRp8rk;HKqI?5Q"?b^WDZe7n + #kCV59S8!W1!`bn]jBp%<1W\8dc`I%d2=BO5(V+\cl+$+Kl,9oSKeElV_`JXs2*8%T1O4`Reldq&ELl[Tm8kN"STG\DS + AS!/5,`"SreQ(t,peUG+7un]+s5UM&f::pR_)H8e&8.H!fVVB4`$D+QUZ:@ncC[=nR[U7&C + (Ed,PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P + =4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G + :qE,r*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff + 8'hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.) + ;ucmu-V$gp#qZlacr+FA9*G:qE,r*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc< + 12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);I + r0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G:qE,r*V#Zr@#*!%1 + 90PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4 + F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G:q + E,r*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8' + hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);u + cmu-V$gp#qZlacr+FA9*G;3Fm7>NjQ'k%ZN/nhZrEI?;P=4F<@5(P!,t@E)&_nWqsGDA]TJ + GCUj=Wnm#IA]'3ZlMTV]eaQ3mUEa'u;qkg6$M/N%=p4EKYDl59W,03YALBW4g[Q7*V#Zr@$E/W1Du/mPo*U&V0@q==FVm8H/*!;8`P + PmK#W9$gII6;%I^(\5TgIm!SkUP0bb9URZj[V\r+5lc'o99ff8'hZhNAO9#n!*=1>r;"L#. + mL84hH$pmaiMOoe^FY/5$Fs[BW4g[Q7GV8cTeJ%.0/te;Ir0fKb + CalRF"h4_"h+aQ8WU6:f2cFMj>h+=t5c0V94IWMYo%h4oNa$6[SOn=gr9SA7VM2cY_FFM>q + nmjN6cTCt5ioN#FZpTPd3kp%;6If9,h4S+N + OP2>$N]mBA:%3%4lhnT2C"Ug>45H]>#^k7>qL:Xq+Bq3E,ruF=Q]]s24YTm>O9PCD%JsIl" + =t9)uoB4FqQnY4?]mBE;Tu4AI'e4=hcsb4i3B(j2:q]63Ir4)W]m0),g(ebYUe.Sa$,F8gW + A:0D64$hq9PCDEFaNiKC#?XQd@s'H/uSFo;5-J%Q7\l+U/^S$$G'06:6dJ>?K59B;PZj&E3 + KGAZ$Q*.0k84Fl-^k=3niG[")pJ.W_@**:kFu_'3Zkj='T"ckF[6A@QD-ZHgeYg""9j88kM + _Cg9n==C.LmOl.\p+9O,&Eh>$O#]6h+=t5c0V94IW$(P"\rB1hA9OHTlF6O.opK.OsQuD[r1$5g2@4".\Hnr<@5(P-p^Lk + #qZlE-S@#Hq\Mr'gV%sClCCCqo>;)'BUk:*M\hG1Lp4pChgG#imC*0L'i9LJ.MGu8Pb=kqK + U)ts&f)6`Z=HO*4/e1+?@#39:8>U]N/Z7G-cK:tmFnskg,(ArE)*c>RF"j*">*V#ZrFPs=g + M_N]=XQd61k[+2GEdmUVP!rc0aB$qZBX87j!/$_hJWogGCJsE)*c>RF"j*">*V#ZrFOBIt) + t87n23bfO@06K'HW3!TiM-GL$Ru\od0W4*K8!UU4"93RL`96;*"FZrEI?;W/6T6:0``Wk5l + iM%V,9qN8@3l`/fa'PP>!_08(-:o6pS?+Y:5H],71^cBe?AO9%D'!tW+cr/j#eui:o_sMh? + +nb?o(ccWtqXs/MT0Ag8RsSe`o^qdN7urQ-IDUXD?[r#sN>aYq2@+O$KlYA&/UQQ@8'7)I[ + t"F,#AfEd$90D:W_@**:kFu_'3ZlUgk?+PSppNMX8;)\r6PDeS2p2\N>omHEoP#oET>(;rU + 56Nq_tsX)IL4+fm^O;(pnGOf#*7R4(_^(<5:NA;Ir0fKbCalRF"jjbUaN&_hJV[pXAEXX8i + 1rmkS)]Fk,*qpNA3-d\M_&3s)o!=t8I#BW3b\V*YJlW_@**E+Un))FFW35TfX#5:OX!BEdaDY1ccO:cO,k)EX^Ah,.On'g_p + P5L1G^i3R_0*tm&ZSuY$JZXc>MCF:&M>bVqR!`,;1_=jN3U$euY8sCY"_!;Z["%VG3Nq()F + >ga,UND/ss@5-Z>te=]pLj+'uBlfl+Y(2IXIUWDf^PGEDU'qtBDM:/4hIX5!*6ZY.UAdn.3 + g`EBQ^djB'(mG>N\r:@I?kJTYc27IpCA7WWu`emi6p?^Jl6lJ:=r9_sIq=.H[C8@p"(d"[f#3M:[6H/oBE0F[Vjp4H + hZr\"q;4.f]LGJ*C$faTr#nbQ3npOWA:0D_Dto8HM,ZU+#VJE7u\F`HEoTM$"q155aoflIDpO.oo@@V(Q,h]SD + 8tGeqAacH'%(gpeNYT3]'PIH?_q*dF#`2`J4gPq+e1g2tQ+0uo=s\)71V3,p-)4T*fdW+rHhWt/Y#A4rk005@?Ua/mIq`qc:mHW,r9=]*)Zk(jG*e4+XO$EVgi4smo=0?X1Oae3OW_@ + **:kFu_'3ZlUP?OD0\`]P?^)X^Y<"H5<^3&V&=YgYjbl\1\L_[3 + t-]=8TSO[YQ7P&+>KA3nUirccUQ'Jb%nRAcWe6TZC1M4=HogG,\V-\V#04):>k0U#%+44lH + PURi`Z\%Ct?[_UtmbPM:-YA%a:trEqXa9XCn`Rk:j_k=(gJVlBGOA_j-Bjpg]4fTdpYL8Cg + +A2r1N_j-.p&lE^)DLWHLL4X^OO+R$16HS'.m>W]i4.GWW(1)mfWk#Mg('VoX(/PHa[kM^/ + d+s]2bk1WF*DhU9<34J_8W-YJ:(JABC!8D-+BkU=/J_A*3VU>Zepi=K>ISgKob!8sLn!jd0 + =lgU>AF\J[e.PmK#W9$gII6;*"Gb08'dnr6VRnhKo44ibaea:O8?Z(@(\%R'C(,JAHu[d&u + 9%ho]l<46UGR@-02e##hQ',0hN-oj;5q!d7n4uqgJFm@HgL"b[[4am2!M_DeXedgQ3If9+? + ;,NL36UQ6K]SD8tbRBCD.FPP8:RU+@3_rCS]mB?E0>/X;h(iQa9URY)jqiWuVb`ZZ>E4IN* + AA`a`9+UE]6a.M3"rCl]8d+GcC\LFQ9%Y[kigRJH + XQpmn1]7uDiWU;\DO`/ + H6E"(qC.q<[D)60dQC8:O]e=-^16-=Ka)HYB>b#s + Hsl=EJqJ[tHgEIc[U-+A\VGTL_]WrM1B"Bpeui:/1F:f&;Ir0fKbCalRF"jjKY4t1F;G609 + 9usNGF*,(HLtnHcNN)l1o%d5qrZu#fJY%f[a[XQ9''8q]k-W!@[BN!ZXIM6h,8/)'u7b!C0 + FeEZY%J+SRI?f-,RR;D4$:QQ?qoM1"1Uk?EID=KS0II?4@.H<2!pKRV(BM7pI@Q]tM[]hQU + G+N)(QX41fRscK7ke>Z$-*Jo#d"Q7lVE^b<[M&6C7.s'ieM>,k80WDJ24.MGu8S5!$bQBAr + VmaS5"lC$MP@^5Rie&U8*d+t-IBk#i1BC4MQmA+^[_D^1EehJbad&kXFcC-W6L;S"l)`MZI + s8MohQsm7/`Ki)[B'juq[a]a&p6k\K^q3UK>4pCE;qAZ$NbPIZX]i-nMpKY;2a@)q"4QGAI + J\2?'1bnpDqqk-kn>IelY6tN*,P!M,#5%+*dP]rajdCpe(U4WJsIl"=t5c0V94IW$>6\^gG + U;BK[#uFX.JRhHM6]>qJtd@/R,ZjiCe>Hg/MBV&$YMEh5:4VR;3>DIQUaVi# + ei=JGic`ue>V8RY8OO,oY*;R8 + 'q?647>-t5.Qi4"eXI!:CfcDs>o('*Z-qU,/b(Q&f-"s85Tr#WZN#=E@GEG_)>WLtmrnqYR + a,d^MEp.rS#7e+aDQ__lL$md/>ICetCoN,+rC1qod\YM9OkW8MC!iZ/]k@,W$SR;gCj]9`> + 3_qWQ`=&dB)8Cnnb(L@>BPlEfi!MA1M0`H]fX0Ce>cM!HVCD1P9pLsd&gM2HVE@8'e31mHM + +;Sq#gg'fP)7f-;Cf50M/"8b(Q&f-"s85Tr#WZ(g1XRqQ&t@4U_++ghn^C8u)5!1WQ7>Lm[5U$ + njH2rIe>Q6PC/s*Qr8(/\IB:!pO+U[%dn`3!P*0:%H?U3RFI*HT=__IK$Pk:tC05JlXB;a% + 316n^&\>fnB?89>1]E^^cTLem_hJW>aBcE$mG,7YVl+0["q=mep!niR@DM#0P=_LFb(Q&f- + "s85Tr#WZ<3KV6G>Vf?%:JQH,9rsqc'ej'6\PmaY#hg`kg?.A/R#MugU8+aFt?q1<3-1+Zt + N=26j\Ku<3BKZWlNTP[T"t3Z.f6AUQ<.bk*mM]LA:ZCc^H`WpYUI-Z=M(Q8X'#Ckp,dmY$/ + 5Jp$:3_+"]Y2"tT$E]X,:kB^c'gM + !R6>idA2-"r0eSV:ph`Dp/pn?n2iX^sV[^\ATG + PA+;X$T->`!P"o;^\V0`]R\H"G:d-j1p3J7RMiE_HSNpXnU;<>_55F9'ic6<)fA.O'\T[A/\1AKp\?_TngV/+5FJgDX89Z + KP#5n2LD`(!W:J]l]HabsYT7?k9SaX%FT5q`"DBF\#.MGu8Pb=kqKU)tCP+.qVA@Z:==7,@ + sf@SWqi_$:a]63F_k006KN?]4qU(81/DPHkCT:p-qmEq\amN<)R&QV&.7MJ!M5JOO;cTZ/1 + nUDGSp"@MA^MJ:1F^(kJ-Q=$q*"M")dh)2jp`tQJ%3+Sm.GbH,9&I:,o3m9-V>g,OdiX);E + S[>&qsHOu'@Uft2Vc_QgXW?+`Bho-L%=?Kc^m:(UL5Dr-hloV96VB7pYUHZ3&fZZqYg0GlO + G*Ke%0\f%,M6DWjDZ->JGplqqqEkAE6(d*cSc5k>'hf;c6N3qn6:IG0`>GS<69ZjK@k/![t + 3-g7Qu&Y[Bc-EohCuC>HJ/mZ_f(>`BXZNZL?`43el+D)d"Bph-4Ip76Ea1&b,6U8?"cQ3np + OWA:0D_Ps%hIG2bW-R0j'oh>DOb*=KR9:+5#F30Rk=05Y;AAF0D2]DJtg`qkBP*hVME0@** + <8k]J$^E2Ad[cjUZh*>(1\g:9T76W.GLORK_WOI^6rJuI+_oN7YGiFQqf<,u2EbFa*?@#1J*/oh7HLtn,d2FiT?uU"\[+*iNEcO3am& + 3!)_5\$-04)Ya;/8q@s*]EOWm4Nrqbq=h-1 + =-C$YL,#P$076T4k8.;5\9Tqt'^>,k80WGj=k[VX>sDE[U81TIAK^BP2iX?0jq68M_&DVMC + (6h00TFbfAA^V@Scc"a5-h)[g4/(3$UHd2?2k2k\Bq&NC9=I?o*c#'GhBDC;,hs&FjO>W)a + XC&`Vp/$GN(LFRgSaf9@6q$66cerkc*8FGq>e-U+2;=!'.pfl5dJ0*dIf$88bA6V94\T[kJ + ).^%ll0lUTfo(,n*b165`\gU:tRVYcL=;56Tp&# + 0$.L_iHsVq%H:b(Q&f-"s85Tr#W*)#:jq-oJ$&q-RUUC#ms-e##jGG3#%Ghf?gm7f'Z0t>oD;3Y"BH&mJe/cfih*!e[ + g8[^_Q]R<%gF0i7nk3bRmGG[np6ahjeK3]&B:m`LnJ>P[dFLH]M3]V)=t5c0V94IW$E#Xlc + 5bY/=2Tb%e-R`K(]Z#%)*OJ%4tR,ZrAG>99ff8'i&>oZt[+0Y%GqIWLi7%[;4AhGIG,-n$[*&f[s<^ + cdoOg>WYM*Kt]= + V]fB'PD?QBnD]O+hKMda5-UV#?qcq&eu1FRIr;[ZP\?G^+JC`fJ`P=&8_6D19^66F9^[cr- + P?/QF.)<&bU;:QRF4EB(SQcHb"SDj'X.ofsUJpn@EV@Z?hJSut/8\Lgg+qsCl##OKm8McBl + Uqtk.>=K5=LK1"=qV2?M#H^Eb?Sp3U!6bb?11"miX2W(*;`/##Z,>Xab8Tt_9[T)(stR9#_t!j/0-B*=6Fj + $(&]&T17;S.,>W]ab=VG402E;fY+\pKm9S8;^aqmBD>gY5qVSpU5"eJKGP+@,hEX&lKBoCR + .>o@Ua'GMPP)fi":rBqi9mCX:5:%3.?(HZ14E9s[>_c-4B_>e%$3YhHi?]WGDIDVB`--rE> + .aY/fD6US7/:pt1C,N%""+Peu^p:gllgt/]DeZ*E9XKcVg9$gII6;*"FZrEI?;W1TP:S4f% + [.sFVO&]!I5E'tLq8A+'17Pdnj+cu:G3$`,]&T17;K_GQo>rAP=>f%,j2Z:Lbk(#D)]?f$/ + bS&aks/$k1W,I)LgQ\q + AY1V$^5&<7)b1p?^JDK=q3[le6tJDVWm!\Ja#&?U*oaI/`s)2@lCJR]8N\p4HqcD;1rdj*, + `mGhDKQ;Wa^Mb(Q&f-"s85Tr#W*(qG!VjMtrY@cSRinlsMT[u?Hq5F^M-FUusUDng/>J/K4 + B\mN=6O,l4TP[.L.?='5kP=`Objr99l?@2&sm2n:d'U&>>-RW[??F+6q+mf,eJds'tL\^oBHhp2(OkXKa([B^@=U\&>5%` + $:-SHP^JIJA&s/5XhrN?j#b)n%JII_2_e5"@T9^ZMEY(qsij"XI7W4m'V*+labm<]]ZM3rF + RqMhKuAm\T9(H`_P9sD1r@Zr.]>$_@n=(hd?lt6`jP"KZd!r3UL*W>U7NsAkZU3EWSl;>_& + Zn#qQgY'J(c^<2icLGFAKM_SSXL:.9X'mFehDn5bu9D+\Y5ED&HDr4$]u2/:VPgJdB"0J%/ + --*(j]"R=dcJ,]8A^rORD>57-X;PZhqC'T`1W@TRjW(N*l4fCfLA?"(f-5S48+Pai_Vba94 + 'YAsX=K5H+/n0%*JFHHA-Vp_&Zn#qQgY'ULI[V@Fl/( + GF(Gbl8m"C4%qJG6"U="nT@p^6@H1=A->HiIZ$$A]pASgJdAu03>;]@;/5K9-$*;XDn'eW` + @7/ZOmc]_Oi[e8P)Lj*Aj4]Z@!sp.d#mUe07nue,]XU#WFhjnmp\pLk/GcW9W_7#(qL'c'$ + fUqtga;aYF>&=)$6efo@(7<1P(5!jGWaJY`E#^f'7sQ3p:mlAKd60M\F=.b+,ZVG3O,Ik0# + ?O)sF*7;YG49;PB]._u82PURj4k/E5p=kZa-;Q1$l$@IauX?lWf7R6b3Vdq#U.a+=;Wm[V1 + $YkeR=mF(j,DDVX0O]QP$S:TfWHt1qNfFm[YLS3(i?9?fe@0W*q!Pc_aN]q=NHcZJ99g/m. + c:@Zj(7Imq)1)?]=:Tq:)H?jcB2^lKF.oiSpgnop1.W + s./I/3>Ep0!]Z1t&ilfOrUn + e:n)(1T=+u4%apBU6Dul7S-a6QXC.t6`SN9^u;l0tG&fA$M0(h2>eh$W$Tg%'UnB5)eYZ.$ + uV1nc9l8RUJPM'TZ5Ok4%DdI/`Zd'6!*BSG?(2:(?\o-=bC'Rb0r5TMCp_E\cD.mVHUe-b\ + :AXV=GMbQ5r`l;5.L[k.:11&O$aHJ# + V8tfD/#CsDk:qFV+R#qm'H0;]bCCHg6=!_K%`Mc=mGkVl]'BZbimfj0==?7[FD<_[o,:)'G + Mgd2F_.b@RTQu(!)t0HX^HYKZ].PY#qr\\eMOP'e32Pp%;=4QVrC2apBU6Dul7S-a6QXC64 + RCR@+q8S1o?cE5$J'C=Pqd67XQ:q-3[\YJ5b"_QkpG/6-;!Bc0'[ZuGp8lIF)EZRh;mX]r: + &Q"gk)VKU="Q?r>q@GqY-*^4tMhVS&&nKYG4PI8n]kKZs!SsPe1K\G'-;P]+f!V>L#=7>Xl + If3GFnHOX)baC7m\oc&^1FI<@B&o:cISk6.WilIsPnR7LhuYH0:11':"DQGg)0M%&042FhT + 0@6GP.KX]Pq#epDhYbQg9tikD$6.SZaR6JB[K/VI7m4+JWE_O'OS.VM4F.te#6+giX82[m8Y`'5p@Ks*$$%M.o$jX;e-_6Y5;$R^2fIQKDSk5cS_=Q)D_3gT,5%g6'DR54"&p$7bkPRhnJalU^4/%)Ksh7Mm=LN#`Y9KGoD(8dpJH?!!,9s$B*Z#V_?/;\NKaKA*_,=jqQ@cq\T[ + !pKW`1G+Y>&?9GTkiD@IW3kdOJ3!Wr%_l0g_jV;&X]Y_?tfs7G/97j"_#qQg1!L>2_YZ,#!&4[rP7NI+mqssUHSiqG1'M2R + WL+mi>>\T2PgY5XGB3ad-Q7B5L'Sn@J\"&FpEK_Jor)'s9E_:\)H:f\c5*I?i(+ue9oB&Y^ + MoFA!pu."lk\-g$-l,ai<.BCIlC/B2o&T?7p6JMu,LgYsZ5NVG=9Vj5A;P9WW`QBAb^*ZrE + WSl;>_&Zn#qQgY/=SP7U5j_$0JbM+EH*^^L%!m3U]-L>042H&Dr6Fh3?TGpA^8C:2f>k,#" + t4a>On,a9e'/C,ht.`hnFNgVP[%T6>`W?j2Sa]N-at[7_sY(E,b<@7>pTjV-G./QBp%S>.8B$C'kOs7-UFjSJQ8eCms*>,Ba285n$_AQ/54=AbHqV/G/&R + :Yh=?+O!%OXpV>#3O'nMcrBpVG3h[U/\-YK36g'[jC;(%[H\od2R\7S$);Guu?]ij'"?ORO4R[/ + ?snm/hK8Q9PeNfG[R+oB+uD;2Lq[RU&n + ]1P$mtI5<#RG,$^-,,)`5gP\BS3-nUg(n?-'/\od0lET0BkT4M._Z:U6,TqS10VT;ndk007bkKaP6c.ojN)>?Vfg9hG33[A + -rb1Eh(4$#D\CY%jnOX$SaB]>>Hbk;*b$E[OA^3B%;W&d:468i]7FR@d>J\QL(ll#K8LD7J + ujr5Mf&fqjMLkn$0i'?bf]a"ub`;Z`QgU?qRq2*p.>0+a<]2ke&)*.)B"dUVcYZ/CA=K7n, + ;LsZ<*ZeX_7Ld@G=B`"CcX*YQXeA+;g=b0HhS#BeQ-!.ombPKVY$<.MR>c8IDVVa0_#eCfl + fQH](G&ZBZZ`;9IQi#GJE<1X6N6oY7un]c$HQnphVR,_,E + hIb3b!eUc^l.5AdnPK))uT.W;]t'=g?RMLA+*%af(]!-^fC"6EZR-[r8mh\_5]jeu`.8Fd] + $irqJi[@>&(,L9X]XZ=HO9cl'TF+Vd1jrd;bH*W>m0s7Y2cZ[MXE5[\Z/o!2iMZL86s##hE + p4ad%/^V>81D3FpUW:ATLCBk7bOEUFmicLoBEX@6gCTaJ/ + ,\$DdNusuSF(U=G/Q1HJS2G)JE"+@6Au1Y<:EJMbY-+pg*^.[4$O>*/:J]=(gUBtK33dJ`` + i4m5e?3)HEOWm)`/ru8A"&mV]=YZgcXm#^.WKHJSN:m+m`Y(6s":`_3P\PS"I9D)!)&Rj== + Q"QaJas,-B!2SbhU)7@o*N.48%pkn'Iaqa,V/Z2/;d>GMe8R3"[--3tR_#6D6`".TNKJZ!t + \"q=9C@Ck2Wk`;XNCiPUGF7>jd:1OoE%5Q:Ff]mB?T[r+p!K:GKns".*B6tUrKrV,3-4Vh\ + US.Sb!\T6fQC##R[Rt_@k8\c^m9N:T?oT7sfK*r;?04eG@;O_/t>E!g + Y;`YZ/CA=K7n,;Lp/SHhONDG>JDt^nsQ`t + Dc5#JLh98;QUgpA=Q,uG2.=K#$RPEShr/Uiu)N>mf0'q2@+K!i"oE]Y^5eZ)WE(-jKJ`^`X + 3o'G$cQ6"uKkkN\hP:M[7G_ZbLL(>@iCXt$u4$*ZP#P,pr5EKA<@).hr(DDWU!*[5>3+g"j]9MA-4"q?gO:]H'8R2O3/eSEa;;5 + o)Q*&qnfAV]pBdmrdtIer:V;9)3kYZ*W6V#i9b;WS%I$8f]ggUBVb^SV^(o?TOKr`n"Eo&n + >KqXeJ.q[Jjk*fV'qqY^/qfZp?\N/;,*)k!p+#G"Ir@Udf`9bja\S:oCOP!.L0F__.>qGjJ + XR&*5%QC@__VB^+>.^u&LLO]@&Q_fE_99uMU5Uq[-/Rk\InV7-#Eqo-4Z,]B^YZ*W6V#i9b + ;WS%I$FE5u:f+cImF32+Un^81$B2a7]Qis5V-d2[(+jjk_?FX8%@4",N>jgB0O\Zb(+rk53 + (p8.,Y[f&Gl%%]qrCURg:)"HZ;DgG*BSFDC85-)e5ndOZIIqg'0E7jq-1=GAZW`$ffX\o^MO-6cH@&ZDd":#0m))EUXhRokK7e5`g5A\uVf<8P>Wf7Fnh;-mcf&2W]Y$ANYR + $6X.0EGR\b!M+>qbKlOKS>*lj[ia"6U?2!nOL]$H$OZaAK:&Dod#$4IU;P_HVt\@E[5uLR^ + :KX4?YimIJVRDdSa$FdF$A&[\Lk@\Nk]Ie0eJ_baG7$G#N,*Wg26$aHQal.OVH"^]di?SA8 + $RV?mY>,\*NGV+N0u%O#`B[VacY)`P&R>EBa%rr0@7[`!55f.^aV&32tKV?0Cb$ZXAm#7`S + +ekGkb^'Y`$:S0gVc<3Hp`JYPML(.XbAQ5%]KiTMDSs5P^aN-r:-HVZd]6sGFe##k:o]_Rl + 9qORqp5_H;:h3W=b*FXVcThGcP%BVVC@[]MMmmW^?F+66-kH?(O":kOgiO,],.3=4g!O + R<'TB_C/kF&YeLhnHcJ>>,:4-dS;CPAr#k21VOG#qQg1!L>2_YZ.7taEWXP?2j]d0554qV* + [B&X]r8/Rl1ET#:idnnRr.4#F;4\;Q3^!g4BJ97*Y6GN4Z]K)aRN->Uc\h=0Gp:2b74^0d? + c)$kR&-o1@]fPhBOPt3FeudQ-?QTjl+gtb+q"XBSMi5cNJ,Un5%>u# + UDIHs.J,]B;kKagX<2uaEJ:KY$k1$A/LTq7D1UHrNl]Y3Ec'pYUP*4mBRN0e%oB+T(=&818 + X=;>Qo]ah;p$1*%mbK*H$F-)W]QpjQBt7j#)@8Q1[r.aUZd-kA&t7&Ng%1O_>oGkP["O:l. + TWWAY"Dbsfc&V5:#AVoO]0.:R145(!"iP:'.\LPI['OkdaoD>ZWuq2\F3j, + aqXHhZsh4I!/oj9&&?'3HaB!\@>H@&ZD(q"jjTfs>>6PUSbAoOu[Ka`lWjQZ8Of2fE"HUs5 + Af-SdQ.r-0u+4EKYD^V@P;Kl,YWp$]ZqDV)$30dBRuTgFG?(+`RnABCiOWtHKtQ;*+P@\57 + Wl!V!M<'Ga,FQ15q"Uc*uf[u9oH,kpc]63Gj^OL`;>?`I&VfV%H.JWnA=Q8B$n(bI[G4!ui + './f\Empm[M6-[NKpjl7P5gl=3TRps1M.'C,uQ48=]5(jq=u$nG`ZV!Y[PG*%MP[RfW\eB( + +hRhkWjN7e>Q6)NfI2D>Z"=Z;^%`Qp?^HY99t\=P0K-Veui:?AT.MEo?X4ep?gW/mbN6GUubKF]"qXp%":[Zc6(V'Y"Y?sNUn<$p!\Qojl,q!cV.p?fJ:n`%HA&,Z1unLj`hJ>LBp//<+)Q7=8d; + uhH?J>E;IF9sKu:11&O$aq;?6 + d/"I:MbYZ/CA=K7n,;?6cD!gX/ncm>nq3J"".0#1BH"I9ApckEW_!.Z\QV90)q'lX2>.OVH + "!.^YkV#gX=#qT(O@&\YaYZ*W6V#gYh"=t8fTM&[lEWSl;>_&Zn#qQekTI4-H!!$:+99g/m + .c:@ZWgpk&!<@G_f@RLD+@CkliE[Z.!/LiF.OVH"^]di?SA8#'z9H707SA8#'( + LX4_!_W[s!!!!QEF>bd!_W]%J>LBp//8-b!!'gQJYgKq//<+)Q7=8d;ucmu!!!Z;Q7=8d<5 + 8Z>Wgpk&!<<*"!)+A7Wgpk&!>f.CEWSl;z0QCL"EWSl;>_&Zn#qQek!!!#7`.=c-#qQg1!L + >2_YZ(T&!!!!4#F6heYZ/CA=K7n,;?6at!!#\4=K7n,;?7SAWH&&5"TSN&!&/D#WH&&5"^H + SSapBU6z^r1f#apBU6Dul7S-a6PMz'*jgQ-a6Rc"^%dp^et15!!!!m**B52^et1L@&\/J9* + G:q!!"]m@&\/J9*JRNV90)q'`\46!5QO(V90)q'lX2>.OVH"z!##U'.OVH"^]di?SA8#'z9 + H707SA8#'(LX4_!_W[s!!!!QEF>bd!_W]%J>LBp//8-b!!'gQJYgKq//<+)Q7=8d;ucmu!! + !Z;Q7=8d<58Z>Wgpk&!<<*"!)+A7Wgpk&!>f.CEWSl;z0QCL"EWSl;>_&Zn#qQek!!!#7`. + =c-#qQg1!L>2_YZ(T&!!!!4#F6heYZ/CA=K7n,;?6at!!#\4=K7n,;?7SAWH&&5"TSN&!&/ + D#WH&&5"^HSSapBU6!!$!8f@Tchl-kZQNl-S\Z`p[l>n0\nW2M+?:X?.I[n`JT[:@7;#7hm + :>nPF&YZ*W6V#i9b;WS%I$31'`&/#UrjiS;S(RMo:rjtmo2C2"^ba+!%^\sIBJNtsLio2"B + HK=&D0miW\mbPM,XBF#rbUi/?hR$u1mi$c6J>LBp//<+)Q7=8d;ufUXf\"h4B?o/agJ=4mA + a.X>QS2]@8kS)KP]Zj$r*3N5kKK>MCY#Qr)`G?UpPsGd9(M&bPAGid;G@:7&RE"lD:u4+;l + + @oU'V8<*B\RccC?oDp*E4h*.@_XrUf=fn*6,L9\om*) + am9#\g=ihk"\T$=#F6heYZ/CA=K7n,;?8I/gt^\<#Jaq`B%O4nk?TDJ#(rUPZY%)1C!`N(V + OqBo!L@K[>e>/2h5d:gEHcV>C^l[;N"7I>:11&O$aE_(F\dqWcV3]SiW8\8c#E^=9,\LNfS8JYf6]Ub + )2]Pq,NE/s]8EG3rE.o)%mjo<) + %FYgdc^PbgQlqNU6=b*MG9OWuCd_GYsTJYaQ:%4i5[1`'8/(*kRf:ggPe[XPq0I]Xh9M@!dEp8\oOJP6F.PO&j<(*p@V':`X!_^e,=B\m+O6NH3 + PB`G9`9Z$YF6Ch#gm=NkF*`1[o<)%FYgdc^Pbf!>:7OkWVdmc-N30ooJan;f,'j\L'gXYm= + DHFJq=EdfBESfYeZ)V:6UQ-cai_JS$\cpQ=gM`1Y#,4-WTc)o9-oouPq#de&($4N0,RoGV# + oZZ91AIk==So90!NhVbO+&nbEXUPeYDs3cTf0io7hI?iZK<=e]4&`B?rbenmo`T.SUmbC-# + &5;NnlnZ;3*FY?"Q0CtW%%DQu,(9*N[XO6RF'=-H1U1KW)4f$+;1BK=0LK + 'Pq-?R@X+4dKfaMHo^(8;8"^#M#@& + ^eS"F:09MWcq%"^#M#@&^eS"F:09MWcq%"^#M#@&^eS"F:09MWc + q%"^#M#@&^eS"F:09MWcq%4*N;>4 + IgW#'OkN\/mc1]cE8c?+\1?Ct:_M + +1$:F>8#Xf^u\3HJ6(>e+Fh(=IVOF&7%U/;t3dg_l_hSbf?2Z6*/rn_ + "aM1>7LCPVSr^MkcV-KVQg?d:d&%Tr&gU>?@meeC;//?QJ@&XF+\`hI>,9e>QpoS,NQ8s$K + UfL6h:n[q.4$A&jfU,)s7n<%(]=3"QhIXlrALTC"6A5csX]p"bJ-!i[00ascHq6eaKWQUK- + ?c:Q7[OO+G/oU`mFntkT0GPM2pKRjaJb8H3pC-P;Nc"r`:8QY68W&K^5rBbSiqE]GOCt[Dd + J`i<39>hN5f5;GThRc`j+%Gf[u`VGENH%/mXpBKB.\27uF7c`f1poOr+T3q)'j8JsK$i9DD + J6rqncd;iI"\+!4;(s+(7WQ7>m,q!W:baAK^$rE6I=&XcXuq[!Q8[r:/IE,b$oZY,OQj7(aM#/[SN>i?k3VI4o]]:g>:6m;ik/gNN;"27h"f&%nac8)[r:0dc'ug\B[3,.$Pk:4 + EcN@jfZB=)("[O&^etcX#*t,hRZ#HB2)$_'p?^I$MA0J=)PuJ\?[a/N*4:RTY@#$c4*GFk! + X5A7R1\FE6\Z"hF`i-(jpbf0A7S>M$!h2m-8f@M1_haq$`75RnQ,'fhO5@Y0n<`(. + >/Rl>7@2FY#QH[C*[EKr(XP5XU?5]jDDa,YB4hGpT-`3tJLR@BZrEa'c+9CZ.Q7Og7>$:7TtLH#ou=P@Hm2R5Sp99U[ePn(tb#5(+RT==U&s^etb4F4#uD + '($m<'Lg#4^]!l\UIUBp-o*2!B[itX6s/Ldq,MnBoiLkC7;YbrV%Tb4]6:=;D[b&kUIG]DD + &L/faT/VO\T0HPOXEqrfs><=,U>p]5s7ju(^qoqXAJDUP<]*F;d(KAaPrL8'4PU&qXfpA(i + XS=oTUe'W`5slCgg>EkDI(c^m;sl)107$k1RH.p&n8bEjaVU[%:']4Lu;8B#[%e]5^c'Vf' + f`f(c[YW5]82(C(jnDM+ip8)otefR,*PYd3/Q5U>Id@io4"Zo8B3HM'N9#Ld(Pu"AWV(Q)e + .'9ft5($2%Uji:=0bt<:(M@5f_ueu`/!lI8\2P.Gf%8h37UYZ+#oJYaQHk + +VrN4`]USTgFHt)B5K+W(h)EXS`E^&e5j=9T9D.@3V"0]V%ZL'$>BWpkZ^$e[*c@^qfg>lR + U_VCgVW0Q8%ch)O=!UEkQel'^su=_hZ33+otfG,37%?Hi*O(&j!(VV39#iAa%S&+MWcq%: + S(PS*R@]rG3pdTd9g>`D;2L!]>@OW>O&1dVfLtGXa%UL1he/H>r=/j/1aKJa2g'bWDb0AVj + ?>.3dpjH2>T`Gq'($k6suu$OuI=9J,fIK<+jace=8O?;SO%oJ"Y6!/#eX(a\@q0-]iiTe0s + 86_hXtHKi5]a&\SC7MBJ@GFtM8!gUhF`_J0Ji1,ZB\I + /,mMnqd.8R@+rifJ40P%hGo[Q75b0=gM]\4*DT!A4ZI_h7Igq7`;WB`JTU=)00>)GH/Tpm[jm69O=gR7@!<]2mR:9fA2f[iqhS"9B^Qr + *2B[M?\!62%'[FC<`8$_lOe60P8rDp%(2/_3:\4jGRjmqNVQe^nWq>W/DpkFQjP$+dGr#3AhgbYh + j(HJO'OKqS?naEOdY,:NG0#BWIMA"MQAXl`YZ(bQ>Vp2pAB;U^cTN-[=^,+&3HHN"/hUuKD + r/-0]65e'P`3"beREn+/;9ai+SHlm.p&mdGk#6oj_m][NupT`5+fsE;AUrjaOjVsnJqi>#; + 7a6F9dL2*Ze(2nP2hS`6_G[6maf[>ol=897?Ku(#u@&mFnu>o^pA[!nk8B%NQbeb0gP->K4 + Mo[+*a\=I(tf.TNLU@`=4k0>I(=HW!bie#-!NDr5GBA!='n7MA-kC'rjGo*m^taUO6b-.;c + 0qXNUdgUD)S>-s+aokJO0^O?!FYsK4!D;;Y+Xf^u^4aT_:kq;&8`'g>NLCYIRG7P&hMj.ja + KV'k&$k-ZoKVi>(QIi9FbLcmLkc%LY)Dl-Cd`?q>!sFK)s/`F]Oohn/nrH>jVG/!fCe,%+l + -cC3Q;T"qc$0L.#F:8226^$_d9O%lWFVZ"Y[Bb_JO/2-I>+$c+=$7_)`Ed4*_U:ocHbcFNZ + C3IV+i]l,eh:.JEFRoqh/26AZ&)Zl?)\hf6fn:DpJ^ + CM0OY$j.<71"mV2nWp&+XW_G0.5O^lLr-1$[5^3fTl`f(d(MA.3UN/39tr00l_WB^=MK9MK + 4FW)lQUYEG,1S`k+p"*Q0's^pkfed2SjCIlQnfkPeJ\N'dHoQ8,`;[2]fcp@62qcd[q=CR[ + jiWi]^tJVWksK<=>`r$`:;(`3:<&bcWUT#mQc.e'+4RK$5OEbX&n\FI$(8r7!$bMV + :sSS;!T:KSNE1C_7Op[ZM^k)[VT*dKk\WDL?3D:@WnYFT4[Q%a]^1SZ_RKrpS\!?.LcP5p" + $6Le;fbC?8Ne@mQ6[Q"s8G1 + AV\BB%MWcq%#_h=.*M1CkI,6^=BZpoHtlSJA(c?39YiP;Pmjft + -K,h)Gd-8.P,TjCWE*&#_G0.5Ob9Spkf/RC&JIH^//30N>,U;7N0e3HO&jH + WP#r7A5sB;Q'65Pq/3.L[kBAo2">24Zkj*N>U,BT07NJTpnLUQ7ATFkih5NjiRn=S0LN6QD + pdABrPufDSd>:GCF6:!;,R,9=X)+ldfYFeGfFDKg0_<^]E,Zjo?qId;*-h#bnkCb>Nb9I"[ + !5,'<(t7<89)%:n_&XfX1_&U/GC29I_hV;Ah.O4oW%[C(\5MF&ab,s+r5SUUP68ZQgb[V`l + 5Nu^T\$r:k9jQM^==POVR> + 6A7WMC+3]B!LAW,26^$_d9O%iWT;rbC*hAtIG5`Ug_/q_CZHN;C(XE& + aYmXV9YJbLYC%U>IPl"dS(A6\Z!]/u*+-U5[RjAd3A]RJcmP$S7f?4?'Usl;NiCgS,!XlL2Lf0&4ND5Q)k0Z_C: + 7;Qj?9,2.AR< + /(\I#qWQ5;IQJHmFoGE;jSA%cr + *)Wr(-cD/_cV9rVH9WDmDU-_GV]33G[1siPos$bXqcQcY/V:I4;RGl-aV+DqVFmE;LMS9dM + lV3h$f9LZI$^i%2o2c@D>I2,>IB!]*BW9)^0D_M3I'uCt%YkQ::/">l + Dr1i9;C0r*B?qXaY4MA\(2h'(Q:c;bC=T?+\Mes:q.J[[^O"D.;kg,8TL"2T7ujOW%[XK:; + A$SHQAQfRMhWc?0JJSl`nnCUj_osd# + Mu-.T`cX&["r59D.rLUqVVRNj<6>&mp_YbHVu$;C0pd%$\?hcCI$Egka?/Fl:&de.&D"TgO + Sjb&`f8J;"Q&*;&4J.XDV_nRm\n9b'.8G`<7XqR'.-D7:a^8;DV_lAg&A\m/6-_] + iSibF?+4tB/JE#q5_0!"4"CY,/=$'"Y1 + aHM'!>&N99"mhCso,9jFV1!Y.\`/3mrh_N@G2b(8r7!$b;V4K_jMHYbHV3kab?.OV9YPh:Ul*6A]dR3X=+dfe?WZ/;YQ$Jm,#E[\3e.dPn4iP>-D6q3Fs!Z + >^4u0Be2&,.h4+1:8uaBc^$4k0&2'+/=$(gW7n=W[k>#@W6`cq5cu+H)]P!0SICgAkV]SD" + OUI2A?!V0*M\o4'GMgB6cZl)[7A5O6(+WFE\k + c;EpqNZ&5RoXDRi*\EM\`_0[nfOcOALI<@&\0=V4R1"G':_S(sPsZA=Mp0.2 + IqOX!Ao:7WZVWi%DP<(*p@V':`XU*3/mGO?HYN&P\3aPTh+G3ssld]H`_bW`XbokNcB7.RS + ,e1?kG2Che-PdI$>71i0-?I.+,S3;4"\3cH32>PDug>pa8=KnIB0!o<>6BUFK(kJMUY*0iF + lD(B?Z4_&nBU27r`CXo/4?S9IFE_p^:nW?/9p!7IB[EDJT0CBS?#kIl,'j\L'gXYm%9_uhl + dr+IgqS>Gre?k#D_A\frr)_,p=W``G#=1qq!k,d_G&3Pa[$_\+`H5MdX!AY74bioq=<$`U+ + /*>g^pVb4\JKm+&g\S]T\i``!L>4G:6sRs2Jh"ggka?/[:-t-e.&D"Z"( + hQ7='<-P<6"m%?\76q3OkU*g7!`("$f)Wq="\NoQbV"F!D>lR)H\J@B + J(4/e>T;oC)PMSs/?QXbF:Gon5^MK*&@E$YHKUeaMj&R9<6=e/G8)GPLN(7]Y(%_p@u'.&L8n=Y:0LJoR*:)W9!7d4TgR=87o_@o=YEc_XoRKL\pW + MU#tmoaC"*(po&Rn[?*%'Q@&\rg"%u&obsb!c8gn#Y\8W=\7urtHM>R&9;`cN-NY8b@2Jq/ + =X3K-Fp$q(_e4*tDnA9u*Q9&j70]>Ki1hgEP^'J+?921+F&VCM[bu1H8T.[dA8sLmJhhpF7Gq>Y.iPL.sJ]=l2QAXl`YZ(bQ>dS(A^]4;FE#HFgn + r(^d\@T7L48\Bt1P$=cc-:r,SiqGoQS52j/PXJf8L%2[))Z/nKV"&i&PI7gF;/Vg:n^3FT# + 3H,>V%`9EYFg#F!gQ!R'[PZ>#anNBjdp'l_NC7^An1ZC*Q3Se8u + -$oB+!`J,hU!kgZSqn0SJY/o33Y"Bnp + ?GVO>b$,"q@J>l[$J\'?CR5/=d',)[68s<&/>pKG'/WS-)`mT + Ksb^JW`foadS(ALCYK(iJ"U4#5SQiW&G4!ui2r`r\74g8bNZ8ig?5 + -V8$!QVm;5:)WS2bLTCer$ELo!R/6r8[,K*Mof].X4^/[\EK6:N@J4?VE=`eL#$e3d"o9@Z + XBWR?Z/Y[@KS^F`ToK\DI6/2\RoTlAu-_AhdmZ(q4+)$0:="SEN)<2NE]C?4qnWJFj_919E + :79c&r'buue?U!F@lIDp_r*-'!e>6.NCY#S\[_oD^?c@m;hn=@aW]Us%eG]:=;qj%DkYVpb + -+%@56F`RKH1JUmnNuX2A-UR^F6:\\Zsle%4@rg$Z=qX[Wn%/CPu&X7Mj>kpNk4,\]tLC>) + 9l%cSND$2hN4.nR;qA(;hUo9O-VA%QFchUeu``K_I0@!?3?P + +.g(sdG+B-J\o]_RelIin"41--h7-YKe99i>IXfX0tVq%_CK;C#,>,mL=$[#\7%]ROXN5N\ + s+7%O^0AIeHhFMrW5=1`Q#n=3,kO3kKZ)/k+oFtHqPc-ldh'L<9;8f.8Ai',/:?m"uN.W,31"(L)*,G%P + GBQ'sRGNZC44_80R'Q7]8BY2hf@S2dcBM\[iGZW+G:lB*;]=DI0KT`[#e`q%'BPbf#H[V\\ + )$Sg=?]6:1'(BIX($m%ELUbPLd4'&j4lC+2_J>J.'mJd(]`JPD*mP/b.#n@GWC!`659'G*C + 2g'2pZY(Z[?DY)D"M/^>,2=D`e;RN@//?QJ@&XF+\S08d$1$3HVq.(!bNk7K^Y`n`\<5nI" + X9,re('Vd)0&-33Yd=+V37G$W`=tR]O--`jis8RN"q4:5tbdWkr7@`_=36m,NLD)6(InnN> + l=k7=Dm2=0>fJ*7bT:0L3.>HhZs-[rke&HXR-h*2$%lPesqMiu$N-ZDIQtn%XepjS%ieLJb + Fn$Fr<+]66oJZA"u)>\iC6(m^'C26^$_d9MpAe2ha;FAmb:T0Hti-QsY,>.&)r@hn!gkK]V + 3kZU5:^qbL'=dgQ$h7Hb3Y0m9I:l-aY8b^'6f4aZ5XhS!uSGOO.e+&N6.,q7=5o?TX"X"%,LeG8_!W + D,O(qGbu9#1Dd^rVEqG9aJODWPAE*S)X1=0k846q.7>e=ag2(:m-* + VTh7#;OTVbRu71:S'?Tr$Oc\uSeV?qH7_KT.'J>FH9%4i5[1`)u><@' + C>0:b7QQ@7;olIDpKQ+1el!Z@;ZKn]@!qN?CR)3+:Vh4+79:b(Vijq=O$5(ITc$FR.L0173I^lBS9FkG:hqMD^;UqF\jiX!VA5 + #WBgEJR24$1&!7ujC8G`Nn/+t"GBd9XJ6H2$a_j2[4a;Pf8LY,tp;Nd^pHhbr@EGse-*3\< + @4jJZ:lmdT2Qf<8OWG1#^3\">m7:3I5[`ejYVs+Xdb;l37Qe>ZBC8sRhQQMd.i1#rE1nF2P + 8<=ebb)cEo1p;I)+7J%L#.Y;=d)RWNGOTM;C;5d;7acjNM]=YCCI&%%\/1hbjc]F6?:h82K%:uW\>M:+-q,LdmF$tisXQO*^'5_+-RAggt\D:l\ZE-[VacBq!d5u?Tt[;UIPhlS#B5]9#a>V*NR\b<6 + WS1aD!<9GG9Va.RhIB,mDl;ap]ng8r/FbCtc7qgA>FMi5*9AUjXO4/`b-ZZkY))=Us4r4AR<=utFrqhH]+%k2c]IYr9Ml?XSqsUQQ(?+H,hnFN>l + IN:i=V<,2-qK?2-NG\4d;*-h#bnkCh,4RJhnO*^YbC'GcCI&+PEV1CpQ,?*GhgE)-ic>OccZhk`n)FhFj1fak>X3^f + '8ZcCaXea2c0<8`'Jp/N&6!gU<@q;*q*bjQl-$fle`;R\\A$;]u)[8@p\!"I=r/26^$_d9Q + `3If1+Q;VP(UZ*CS*k05DUW0#4JP"MWISMJr + cg6S3*ASGFcC[569E[fP0'T*\[/p[;,@Y--=#A8E^RX@rb?DOD_JH@2pSs6dp):>piG3RFD + ]e96^qsX:Jhj:nR9u0_k^H@qapYUHN50%p,_M&0M12,@HV6ZR`9A-U^7BQ3^+L"g5YCWMoL + utEZ925C@2=$8C4+@%j-OJNO5%SMFlf[FYoff'1F6Cg`mK38iZpq:L'M'Hik0/rJaV?fm`" + 3*,pI;C:']-NM7ns]m^YKSU>-pYP%Qen&'UTMjKnP*^GB\7^R:M+SBDf#Nl-cC`ld(OD[;/ + !QoLM`<7%nNl2&H`4+$Lt5G3@/A1Rk=5/4ATGo]X+tK.nW]W@.SfiRCe:1D;)F + 8lfR=Vn6KV:Kq+C(7ZA>!'K$boMWd"'#cTo_/&]B + E:i@S9TBa:T3ub_?OBW1)g_`JC>VG/)*\h,WZa97U#7jq&%"@a+"lo4JU*0J>OYT+MrbR6. + Po6f*7'D0<,)GBu@]>eC,UDI!V+X2ck0BMZA]b]B"rK::gl*+,*$$&\*'*TVfeXi`U*N+k/ + 68j>n0$oL\T>F,Um$n%5a7.jlK[Y,Ne3gmh9;9Cao>YQAe"QS%N[`'#)^n6#>GH_AM7E),g + tu?k-f$TWmpIf_al1j7073TNC9kM!\#^SduB=BHF/9)1`TJi@W + )>eG=/h;*MPlIBF;baLD)n`%M_:/5$&DEW+*&G_q^I/"hdnUQ,idLL8*7(8r7!!pUC' + '%(5[D@CHM-R9b67Yb3&m;(X1,S4h(Lm?rqsZh&)lL+]^#X77#?n_]mBA:qXs/%:7TtKGOI + crr3J\A#'K4\q=+j#C=R(S\8durD7XoXC27Us@Ddhh2fG/C"U.OfoGUg]JnQd@<)#&rrd=" + _o&IcOk?TD7!!!H191AIk==So90!J=JLlRMPZ=Sslkt7J9S>^Ko&WF%_,ldoF]`LhqoGUg] + JnQd@<;!bIodZ*Er;#sYmbN6ep?`LL4F6MT60HOa=l+(s=gOu+VL\dK!+;82;A$SHQAQfR$ + S5:@*#osH\Ra6j<ch=kV]SD"OUI^WTqm;B29;Zbagh>d@s'&Pq)IO2rCiTBj,9&XI503^q72Y!!'A8//? + QJ@&XF+\\M+nUI'YAd]?@]AnGWk04*_qlR)H\J@BJ-Mg2 + )#jU`JYO6_bY@:c>@E8*>fX7]8HXh!;$IH("$f)W + FrRs4Pj7'D0<,)G@_9*G:q!'i:j("$r-Wq//8-b!!!/j-be?k/nV5q?J + Omp#17i?5Bt6GnktB)Y6*99*]KWL0&^_-Lctl5"TSN&zTIR3$na)*n:Z,M3zzzzzzzzzzzz + zzzz!!'gALl.-Si,Ji2Q(X2s]T4!3z!!)5KFXp70CUY-hccCZQ"8tT4+#a0"z!73*u1%Ab/ + \o:_8D.UWcVZ;N&z!!!"t_lFUQ4Y6!2X.Qge7+M;>6ko\%z!*$dEqc3(@Vn(_%<<*"!z:^M + cjnB[nIgq?L)qT,,nVj-!WuTCG*q!!#sVr94Ggk=]jX9\Yu"AD + hkE!<<*"?n,u95/VerU=&V?>]TMs'A`s*!5KJ)+aM\jbM;PWgEG_'@*];=LCjLd!!"@gTtNCqO&\$-V$m";a!L4=MuWk< + &JG"edTBT=2]kb,i@GLe`mG!!"]eJj2[4m'20>\4+lO*P!=I+H6&W"9>CD_u"?W=Q+-H.m5HNT0C9\Vu + Qet!2+DnW]0[GMq0\_V^%L*"[L+5^[ea5Vkr0e2-S=grKqd=zXK5TOK_st%lQIM*X-^%W%0 + /HMJB&,#0eGW`oCh-c;ucmu!3d+O)*;T[>4,l;XbVjFp[#DE@2K!U+X&#VH.<5hpD+c[eDP + J3TCFrlz`:;o^:\XR+gda+\Lr5qhYqbd]O!aom/g8''ViT`PrKa11o]isI`Np)fO!ao-!!" + jtG1VZ-#;c4tpqJ]jqM4W*ScAcTGX(^=g35FKRu'=Lr:""K`tJFQ!!$1K0d19%hcL+[R1/B + Fq!e8ehM2dF+GEb7me*ql_YlBeO"=L[JG8R:!!!"L[L)R:*RGg"/LZf(*UJh.]YjW.!WYV" + +.p'onMp9TLMem$g,UVq.nTmD!!#8:[r4CLCmGE?\_Y)hkW%Eh'`^M^;c(D3>BfKo%Gdg]V + kpS(#4OgVzcjfkVl>J + pEJTX3R!;ucmu!3"&3*S7e3Gk@=d?'_$GI@p8="X$I%R#n[to*$WPHkE9(cCX[fI:9es%IM:(><\6JOqsXXe!!#:a6q51T*U:LijJ0o + r20ds+a7"9q@0!SKQd.bZf@>HLjfcjd)mqCY-D'rD"onW'5aK4SI;j\:jkRm@\r;o.h'V;@ + #mlI$%l+.]-TX;+e^>\tYBmlo@#l'%+$t5pA,lT0!+[8@gjFYh\CA]tZ**QQ"n=dt!9fgu% + t-nX=i^JMf5#\SY^bU(QM3ZL!!!!aQ=KAYbbV%DH?WP=o\^aB_8,q-"/%S^A)]GL4,r^^<6 + _[8GBk9CzA4;;=/RNmeqcHDHR5TMPYKnTQLDg0knDp:h(i*dPQaXW7g>OIKisYnf!._.D>[ + 5.AZ*)kP7/BZ^:.l+Bgdk&SO/`3$,!%2sPOf[iKW93mNSb?jO#QA*!!!#7PbFB\pcL!7SpE04`IH&+3M7f#b`k + 2gHKdzJFjZeaXc]gE??W@SIFqoo%^5A=K2RUFMu2;Dg/hGX!:q<0OC8NTAY.M!<<*"!5;2p + 6K7>\41L?RXoCUmf>=XjekmS6GLidKkgz1*n,,HL+HEm\?X1 + 'e>3]X-Oe5$]X.on,_I(T5QF2-19Ap*);&HH%.qdl/F19BB%:I,T*O$43Zg3bnn$R56+0i?nbhFo + 3c6=bi6ehIChPQIMoru'EA+5!!!SHod`hM\$tB]NlmfY1Nga->I460d)U+^B)r"Tj8Ho?k+lkLYHf\uEdP?EiA' + f-z!'ha?[p@rVTZYFABt;0-eVVZ"8DY]q!6X6co4cmP"'-380m3;"?!<<*"!'i.@K>D!D!U_0_A8n` + ;L\BP]NK*+L7K=QkM"#*P%Hi%[>0?df6In1=2]-e3&-)\1!!#WQOH;GGqG-J=.thG(n!/\% + hMdGFWr`_A()jU:ojY[RbILt>#`8MmI7["L;ucmu!9f4%kd\`a]5f!)+XquC!YZsFA,)pDV + u(RB`r0@4;Y&/pmI>0&][$rczKaA9JZ5KouqcF4tc/;nYp[#C*q)O3(W<'g7_s`$CRcVS9= + P@i25`jJhrnB:[17%[6!<<*"!2'ZB_4SbM4*)K`+_fE/X+U;(F2=ImGb6!!X7Q1!^mFkD0g + Ch8A]!Y*T-Ni2('"=7!;&t3a7)rYf5VmV+mIG(ElhM*j1[^LGb6*$/+W>[qh;@=YeH&&`b* + /DYg=fT-O9\P!!%Q7"T!n6(uW>\oS$fad=_]'m.S$b#1Ieu,ES"KGicg&C#c[A5P(#@ArO- + =8FU9KV[3>'!!%P3nFm;.eo*G?0c6'V`X[,OHLME1XT9m`)A7>2j2UTfCUg#%87i_o^aUr[ + N;&_Az?rZ!t$Q@f9-23N=,*5)R*OiRc#kSYhIBikOnDp:(_kI7#*6H,T]`/mTp](9o!6CVA + GniBauJl@8S9/=OcOrbM!R.KBGK!'gm0?O%)*NH\>ZQ9dYS2` + [LUrA&otklXV8KS7:u2kD[j^TXQs'(2YG+t=fA3;J'>];P]0!!!$!%ptr)R.XOUYo19)pU2 + Ror'GY#7"?XKDhGK9^4]W!fIj!rr<$!"]@/Wgiof=!qlKEo8j)VU5VQK>IGAYPZ?2 + UPIb7eOaRHC^:K,jF(V@zBE056Ih,o4IJegJQjKNHmr6&6gtRmW%e&usLa+&dn_^s^SQDGf + m^%fJM1d:E.5l&UiR,\Tm)E&oaN,4TB,M7)cp.0h8 + M>if#PqXVkC2,-MJ(5AS^Gi)][&>5zNBp$1A/rR:/;L0gmd9D=NSh$WlfG%*h^9`tnNPdEI + u+Gl^4,mWoBI!6VH;YXZ=#oJ3sGZb!!&)b)+Q8_G_#[I%T,=d\h1C\]D'BtgTOrg,UME3@& + ">NQf*#Tc.:,U-B3/UZEWA<1*C=EXlFD+AH2]1!!%$^UFGA+-b,6'&>Q):eac/8pDht0o=; + >;@KM!g4<4NZG^CEp;O;f$<'3/7SNZ=Y)b@k6CB2&HDe2!'jU*3H,of + 1THWTTA'C>b3f-+Xt2ko\Q-??_$a*S.lRVY^WY1]F*SFc2mtG!!)4&^\>Qo%E:.@#ZH%l>[fK + uKAG=rS"7kFhLFkFjepFrp]c6EX9j65NfN^V)g(i*b7dB.[r/pa_Z%o@$!W2X>D&>g&]TbK + \M<;X3:@Luz+A37])DuB%480=0U>>IGZl_$e0A!rk17o?MODI + #`T+N`bk[be + GmX)`Na!4%bT+^7m9I-:)^AT^4&WAPs%1\F71$An#T]9,U"=npO*q[!!!!Ab@*(AL_4SJ%3 + c(0Qqj_6(@Tt'=UU:t!rr<$!9f^^7m-=bPk!4fG6%u$A5)Ge9Ddkz!%;*coV>:GA_ + ]e:889j/&q['EIbg=I^%IQ_*>\\U!!!!Qn`ki.L]L9+a,gRY+=^sXaGkY__7]6Ez!'g\G@8 + ZWnn)QZq6kBJu4HB,j@UnDChdlfg!!!"LBTeMe41AJ'ZEW@QUdPas;'\:Um>i:!bPUE/z!+ + ^*!G"#U2:8VJHbPNT>LH"TS + N&!!%lg+.p("knNl3-6b[A0c8#IZ*IKEA^gIn`$F46;#gRr!!&ZSQS1JhgXUlPQkMasKJA+ + *3b#W;z!.Enno4c)*c.kg\#_F2Kbau*bpsWm4G>/&;!!!"l3q;`sS"7l-=n!Mb+p^&N_DuD + /7gJoS40BG0#2])Iz!+7oODnd:?HR8Ek."WR4\r7Kao^pOXhY0P@z^k'joaEc6YEZ^Df#_J + klIbqfb&M^reNW9%Z!!%Ng#".st4Z@^k0&\uN71^`&VbcJe-]WHB^*s*`zPMkPDs"W*MgrH + ?!Jn3P.Z$#Yb+3aUg#QXZ"g:R*W.-j$Hj8WGuR + J;+a,*2&-Or2FGEgK^qGR/hH@0cCT$Q1T+qB%Jdm3HHl=G7hL0@msI=*m'?[GK(Sa0D^mg/ + O\1dk\]KopmAN#,j%oaVpg)-=m;oUlJkrM3`^o]n.?8i<5tM%Vr/pcF^63/(nC^f>Af&QmO + ZmOVHM^(%GlRi'%]<+2k"Lg?T490YA94>Is(,,Uk]746J5N2AVq6j,P(pD9er"-,[Ek9B!8 + rEVh@Q/6D-cYQ<`0./?rlgnk0'Go2#mVG]t5qtHMjtB#;21)Rm';fj,).G)#sZ)j4r>]"ga + )=cao9oWenXdKbi"hde_5=ct=0q!#[2I(t_]*Cs)PNi7#*0;:4IpH0(lFrVajbV\]=5RB4* + (F32;)i7"m*&`+I"._`ZF/bFl'!5Ot`8e(4ErPeELP*NXnrP>)[5%k-#J7-Y]?[d"Ok2ghH6,AV%o)cJ1MisPk&#]esOpR8api7#!-i@L.W]4()XY-+AC-P-7Xr4 + \KZmhX7(&q"_c1^q(.FPEXMSY8h"!!'NaA27/3i,$^2B^cU;dR.beG#A49kpoLGPG-;>!!%6Tf<9=`6u+-/b7-X=9DXQ8Z>u]DeQk,I"Vh# + f;6R+0j3=FT6B0P06dPI(#.3CW?/Jre3V6GU!!#CNe;8)[cJBCcfTpVd^%QJlm&MY1cOU!U + GUS`seDWd>o:FYII.3GDcPFj]Er'<^k[O\p!$8_&JRhJtj0LNKK+Hq(I^aSuD5d?mgu.*uk + gKS5!/=9V?[pVH-_I!92Y]Nil.9sQ8#n.9H%[gN!+T%lT%LILZg>c%i5<)^`d;ku@oFsL9T)s>4CL + GX!.[;\fA"&apD:/KHFB"/&=].p<)_W:rMKVqn0b&fkC`Z#SpT1(ejr0`id"bn4unrL8;4e + $!kIPA!!)L)%1Wl>q4dQLIr#WZj@c8Q860X-ZJ?=+ + 5DHn;!<=7k[($!5\8'pN$2MEXIVDcG^0-?Febo3[NR7DP!!$Q8?b5[lW&XMCPdS>/!,9B;1 + HeoJ>'K"QGNeo=!!(#r6t2h_^tD05Z7>g&Y:lk7h@N=,4WFb.!5`Dbm>)NW:EH,EHomDk2K + _@cb2noFHjTiR,K.hG[s)]hCi4Dnn7CQBH6i,i5T.sj:N*2eH(t1:4S2nb!!)rJi8A!a;u= + `!Q'95L#2^GsLYA!_q9.[LFhAl`9)3-%cVdZCqWp;X+n:]Adb-hMf + k!!(fH<9h4OX[W\uV`e&lI'\q6@X$^TR_GR&]lj__!2EfnXn[I\B3okW/GPs5i@)%hn/KJQ + n`iahe5SC#o^mmPP5kT5+nklrCEI@Uo'D=Pi2_WTcPFg_\81tSSK2"0mi)6,i8I;)#+JAs7 + 9<#f[hmI3uN!!'eGqPj(QrDdKr]tS"Qhu#U@ma4ssfNapl&rBnSjg#VhqM14+)AFHB6jRYJ0;FA` + K)sr8tn1aZ\sER8IEoDB8Y.S5l*7Gh;'%HH3=3Jpn'(o>s#:bbj#pi4EDt3S"!]jIeCFMLK + eZQ\/kFW!rr>2[uRLp7r$AP?bQL8S + kPK%nCdKjU1q#"3"-n?aJq5!.hHX!Bq+9;HB@ngF1H7`uLm77__6=1<)!!"67It.%;`Qn=tkKC?c/ULu_k6;H6Of[=A3@26)I(ZS_^ + >VUUHX!DU'EA-k^@_'i``fMbg>B8K6g_LhJ$`TaZ.E4[A4Cp;#APd^k^e/!heK/H[YR`&*?!b5%@oG9lK#!Aei(pUge1Iebbg + Hn(VnE]oAo(jfY(9U&Xoh!!)f#;Q7JOf=P6?>\uOXmZ_OS'[3O7CjibY:`uAJXC7B"=)_6-(fN)$[?e.O + hIpos] + +Q +Q Q +showpage +%%Trailer +end restore +%%EOF diff --git a/poo/diapos/graphics/Logo-PCLL.svg b/poo/diapos/graphics/Logo-PCLL.svg new file mode 100644 index 0000000..d42bd44 --- /dev/null +++ b/poo/diapos/graphics/Logo-PCLL.svg @@ -0,0 +1,585 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + +   + +       + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/poo/diapos/graphics/debian.eps b/poo/diapos/graphics/debian.eps new file mode 100644 index 0000000..ff431ef --- /dev/null +++ b/poo/diapos/graphics/debian.eps @@ -0,0 +1,318 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 262 316 372 461 +%................................ +%%Creator: GNU Ghostscript 510 (epswrite) +%%CreationDate: 1999/12/10 21:20:34 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%EndComments +%%BeginProlog +% This copyright applies to everything between here and the %%EndProlog: +% Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved. +%%BeginResource: procset GS_pswrite_ProcSet +/GS_pswrite_ProcSet 40 dict dup begin +/!{bind def}bind def/X{load def}! +/rg/setrgbcolor X/g/setgray X/w/setlinewidth X/J/setlinecap X +/j/setlinejoin X/M/setmiterlimit X/d/setdash X/i/setflat X +/m/moveto X/l/lineto X/c/curveto X/h/closepath X +/lx{0 rlineto}!/ly{0 exch rlineto}!/v{currentpoint 6 2 roll c}!/y{2 copy c}! +/re{4 -2 roll m exch dup lx exch ly neg lx h}! +/q/gsave X/Q/grestore X/f/fill X/f*/eofill X/S/stroke X/rf{re f}! +/Y{initclip clip newpath}!/Y*{initclip eoclip newpath}!/rY{re Y}! +/@/currentfile X/|{string readstring pop}! +/Ix{[1 0 0 1 9 -1 roll neg 9 -1 roll neg]exch}! +/It{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! +/Ic{Ix false 1 colorimage}! +/@85{@/ASCII85Decode filter}! +end def +%%EndResource +%%EndProlog +%%Page: 1 1 +%%BeginPageSetup +save GS_pswrite_ProcSet begin 0.1 0.1 scale +%%EndPageSetup +0.843137 0.027451 0.317647 rg +0 0 m +6120 0 l +6120 7920 l +0 7920 l +Y +3233.33 4125.86 m +3218.39 4125.66 3236.15 4118.18 3255.66 4115.17 c +3261.06 4119.39 3265.94 4123.63 3270.29 4127.77 c +3258.15 4124.8 3245.79 4124.73 3233.33 4125.86 c +f +3313.52 4145.85 m +3322.43 4158.14 3328.92 4171.58 3331.2 4185.48 c +3329.19 4175.58 3323.84 4167.03 3318.76 4157.99 c +3290.83 4140.4 3316.12 4168.43 3318.74 4179.1 c +3288.72 4141.27 3314.61 4156.42 3313.52 4145.85 c +f +3343.14 4222.89 m +3344.95 4249.8 3337.84 4241.28 3335.46 4231.03 c +3338.23 4229.57 3340.44 4212.05 3343.14 4222.89 c +f +3176.66 4590.68 m +3184.64 4589.26 3193.91 4588.16 3192.58 4586.25 c +3201.32 4588.18 3203.3 4589.92 3176.66 4590.68 c +f +3192.58 4586.25 m +3186.96 4585.08 l +3192.21 4585.56 l +3192.58 4586.25 l +f +3441.26 4212.69 m +3442.16 4188.53 3434.21 4176.79 3427.02 4156.03 c +3414.1 4149.6 l +3403.54 4129.06 3415.15 4136.56 3407.57 4120.23 c +3391.05 4105.56 3357.51 4074.34 3346.77 4071.48 c +3338.92 4071.65 3352.08 4080.74 3353.8 4084.29 c +3331.71 4069.13 3336.06 4061.53 3302.29 4052.3 c +3301.3 4054.51 l +3218 4015.31 3102.28 4092.98 3103.8 4198.94 c +3102.92 4192.22 3101.27 4193.9 3099.43 4191.2 c +3095.13 4245.71 3124.61 4300.46 3174.33 4322.85 c +3222.96 4346.91 3279.97 4337.05 3314.79 4304.56 c +3295.66 4329.62 3257.58 4356.19 3212.45 4353.73 c +3168.24 4353.01 3126.88 4324.92 3113.07 4294.41 c +3090.43 4280.16 3087.79 4239.45 3077.93 4231.99 c +3064.64 4134.39 3102.9 4092.24 3167.63 4042.63 c +3177.79 4035.77 3170.49 4034.72 3171.85 4029.5 c +3150.35 4039.56 3130.67 4054.76 3114.47 4073.37 c +3123.07 4060.8 3132.34 4048.58 3144.33 4038.98 c +3124.04 4045.83 3096.95 4088.11 3089.06 4089.83 c +3124.01 4027.25 3230.84 3980.08 3286.81 4003.49 c +3260.92 4002.53 3228.03 4002.96 3198.94 4013.71 c +3186.7 4020 3170.1 4033.01 3173.07 4035.44 c +3249.42 4006.93 3328.29 4013.86 3394.36 4066.81 c +3411.16 4079.91 3429.52 4102.18 3434.83 4102.48 c +3426.85 4090.46 3436.2 4096.7 3430.07 4086.09 c +3446.8 4113.1 3422.78 4097.09 3447.37 4132.73 c +3456.46 4120.23 l +3453.07 4142.67 3484.31 4169.89 3481.12 4205.35 c +3488.29 4216.19 3489.11 4193.67 3481.51 4168.73 c +3492.06 4196.4 3484.31 4200.85 3487 4223.69 c +3489.92 4216.01 3493.78 4207.86 3495.75 4199.75 c +3488.88 4226.5 3502.78 4244.78 3506.24 4260.33 c +3502.82 4261.83 3495.64 4248.51 3493.98 4280.09 c +3494.23 4293.81 3497.8 4287.28 3499.17 4290.66 c +3496.49 4292.21 3489.42 4302.73 3485.13 4322.9 c +3488.22 4327.65 3493.45 4310.61 3497.69 4309.92 c +3494.96 4325.95 3490.26 4338.18 3490.07 4350.49 c +3477.67 4376.39 3485.67 4347.03 3475.64 4361.61 c +3462.44 4402.75 3486.57 4371.16 3488.21 4389.84 c +3508.19 4360.89 3519.59 4315.99 3524.83 4297.4 c +3520.83 4320.07 3514.39 4342.04 3506.49 4363.29 c +3512.59 4360.72 3496.72 4409.92 3514.4 4377.34 c +3495.52 4446.79 3433.62 4511.69 3376.67 4542.13 c +3383.62 4535.76 3392.42 4527.76 3389.27 4526.5 c +3360.94 4543.35 3365.92 4544.68 3361.85 4551.8 c +3338.8 4561.19 3337.27 4551.03 3322 4551.78 c +3278.52 4574.86 3270.13 4572.4 3230.1 4586.85 c +3231.91 4578.33 l +3203.1 4587.93 3198.34 4574.71 3167.21 4578.31 c +3165.32 4579.78 3177.19 4583.67 3186.96 4585.08 c +3159.11 4581.4 3160.41 4590.58 3133.15 4584.07 c +3139.86 4588.78 3146.98 4591.91 3154.14 4595.91 c +3131.43 4594.53 3099.9 4582.69 3109.63 4593.47 c +3072.58 4576.93 3006.77 4553.72 2969.84 4519.09 c +2968.68 4526.85 l +2951.76 4506.54 2894.89 4466.19 2890.36 4439.86 c +2885.83 4438.81 l +2877.04 4423.9 2871.33 4407.01 2864.35 4391.68 c +2852.84 4372.05 2847.47 4384.12 2849.11 4381.04 c +2826.46 4335.12 2815.19 4296.54 2805.48 4264.88 c +2812.4 4254.53 2805.65 4202.56 2808.26 4160.97 c +2796.9 3955.53 2952.44 3756.07 3122.46 3710.04 c +3147.38 3701.11 3184.43 3701.44 3215.96 3700.55 c +3178.77 3711.19 3173.97 3706.17 3137.73 3718.81 c +3111.6 3731.13 3105.88 3745.18 3087.36 3761.25 c +3094.69 3748.3 l +3058.39 3761.15 3073.58 3764.2 3044.04 3773.55 c +3051.87 3783.77 l +3040.1 3784.67 3020.7 3803.59 3015.4 3814.1 c +3002.52 3813.59 l +2987.06 3832.66 2978.81 3846.43 2979.42 3857.09 c +2975.26 3849.67 l +2970.55 3857.75 2918.35 3921.25 2945.43 3906.47 c +2940.4 3911.05 2933.71 3913.94 2926.46 3927.13 c +2931.97 3933.42 l +2918.96 3950.19 2907.99 3971.68 2908.83 3978.84 c +2915.78 3969.46 2920.6 3967.7 2925.38 3966.09 c +2892.47 4047.73 2890.62 3970.58 2865.71 4049.19 c +2870.97 4049.61 l +2866.94 4055.72 2864.47 4062.31 2861.23 4068.8 c +2863.53 4091.65 l +2839.85 4119.01 2856.91 4208.1 2860.34 4256.95 c +2862.69 4276.81 2880.11 4297.96 2893.34 4331.13 c +2885.28 4332.51 l +2900.7 4359.39 2973.3 4440.5 3006.94 4436.34 c +3023.23 4456.8 3003.7 4436.42 3000.51 4441.56 c +3036.3 4478.59 3047.55 4467.72 3071.7 4474.39 c +3097.73 4489.84 3049.35 4468.35 3061.69 4480.28 c +3106.72 4491.77 3093.59 4506.42 3152.32 4512.25 c +3158.52 4508.73 3137.95 4506.81 3132.79 4502.24 c +3170.29 4520.6 3251.48 4516.41 3304.23 4492.06 c +3365.41 4463.45 3434.17 4378.92 3436.89 4299.39 c +3439.97 4298.56 l +3438.41 4266.94 3444.81 4230.37 3433.71 4196.79 c +3441.26 4212.69 l +f +3070.23 4105.36 m +3068.12 4094.89 l +3077.95 4081.54 3085.75 4067.08 3098.28 4056.68 c +3089.26 4074.27 3082.57 4081.54 3070.23 4105.36 c +f +3093.44 4106.26 m +3088.24 4112.02 3085.18 4118.94 3081.72 4125.82 c +3085.02 4113.71 3091.78 4103.3 3098.05 4092.7 c +3093.44 4106.26 l +f +3504.27 4195.56 m +3502.08 4190.04 l +3498.06 4161.46 3489.36 4133.18 3476.03 4106.95 c +3490.75 4134.62 3500.25 4164.89 3504.27 4195.56 c +f +3179.63 4597.85 m +3189.73 4601.54 3204.45 4599.88 3215.19 4602.31 c +3201.21 4601.14 3187.3 4600.44 3173.57 4598.69 c +3179.63 4597.85 l +f +2824.92 4409.23 m +2827.25 4387.69 2808.72 4379.32 2829.02 4393.54 c +2839.92 4418.08 2824.78 4400.31 2824.92 4409.23 c +f +2801.04 4309.49 m +2805.73 4323.86 2806.57 4332.48 2808.36 4340.81 c +2795.43 4324.27 2802.4 4320.74 2801.04 4309.49 c +f +0 g +2758.02 3347.25 m +2757.57 3346.78 2757.57 3272.19 2756.64 3252.72 c +2755.72 3236.97 2754.32 3203.15 2720.96 3203.15 c +2686.67 3203.15 2678.33 3242.54 2675.55 3259.67 c +2672.31 3278.67 2672.31 3294.43 2672.31 3301.37 c +2672.31 3323.61 2673.7 3385.72 2726.06 3385.72 c +2741.82 3385.72 2750.62 3381.07 2757.57 3377.38 c +2758.02 3347.25 l +h +2623.65 3292.56 m +2623.65 3161.9 2693.16 3161.9 2703.35 3161.9 c +2732.08 3161.9 2750.62 3177.66 2758.49 3204.98 c +2759.42 3163.75 l +2768.23 3164.22 2777.03 3165.14 2791.39 3165.14 c +2796.49 3165.14 2800.65 3165.14 2804.37 3164.67 c +2808.08 3164.67 2811.78 3164.22 2815.95 3163.75 c +2808.54 3178.57 2802.98 3211.93 2802.98 3284.24 c +2802.98 3354.67 2802.98 3473.75 2809 3509.9 c +2792.33 3502.01 2777.95 3496.91 2746.44 3494.14 c +2758.95 3480.7 2758.95 3473.75 2758.95 3412.6 c +2750.16 3415.37 2739.03 3418.61 2720.03 3418.61 c +2637.09 3418.61 2623.65 3346.33 2623.65 3292.56 c +f +2874.95 3316.21 m +2875.42 3354.67 2883.3 3388.97 2916.19 3388.97 c +2952.34 3388.97 2955.1 3349.12 2954.18 3316.21 c +2874.95 3316.21 l +h +3000.05 3311.56 m +3000.05 3365.78 2989.4 3419.08 2920.82 3419.08 c +2826.3 3419.08 2826.3 3314.35 2826.3 3292.11 c +2826.3 3198.05 2868.46 3160.98 2939.36 3160.98 c +2970.85 3160.98 2986.16 3165.6 2994.5 3167.93 c +2994.04 3184.61 2996.35 3195.27 2999.15 3209.63 c +2989.4 3203.59 2976.89 3195.72 2949.09 3195.72 c +2876.8 3195.72 2875.87 3261.54 2875.87 3284.24 c +2999.15 3284.24 l +3000.05 3311.56 l +f +3150.8 3291.64 m +3150.8 3248.55 3142.93 3190.62 3089.18 3190.62 c +3081.76 3190.62 3072.5 3192.03 3066.48 3193.42 c +3065.55 3210.1 3065.55 3238.83 3065.55 3272.19 c +3065.55 3312.05 3069.71 3332.87 3072.97 3343.09 c +3082.69 3375.98 3104.47 3376.44 3108.63 3376.44 c +3143.85 3376.44 3150.8 3327.77 3150.8 3291.64 c +h +3017.82 3241.13 m +3017.82 3206.84 3017.82 3187.38 3012.26 3172.56 c +3031.26 3165.14 3054.88 3160.98 3083.16 3160.98 c +3101.23 3160.98 3153.59 3160.98 3181.85 3218.89 c +3195.29 3245.76 3199.92 3281.91 3199.92 3309.26 c +3199.92 3325.94 3198.07 3362.54 3184.63 3385.72 c +3171.66 3407.48 3150.8 3418.61 3128.57 3418.61 c +3084.08 3418.61 3071.11 3381.54 3064.17 3362.54 c +3064.17 3386.17 3064.62 3468.65 3068.32 3510.82 c +3038.21 3496.91 3019.66 3494.61 2999.75 3492.75 c +3017.82 3485.35 3017.82 3454.75 3017.82 3355.12 c +3017.82 3241.13 l +f +3288.99 3163.75 m +3279.73 3165.14 3273.22 3166.07 3259.78 3166.07 c +3244.98 3166.07 3234.77 3165.14 3224.12 3163.75 c +3228.75 3172.56 3230.6 3176.74 3231.99 3206.84 c +3233.85 3248.09 3234.32 3358.38 3231.07 3381.54 c +3228.75 3399.16 3224.59 3401.93 3218.1 3406.56 c +3256.09 3410.27 3266.76 3413.05 3284.35 3421.39 c +3280.65 3401.02 3280.18 3390.8 3280.18 3359.77 c +3279.26 3199.88 3278.79 3182.75 3288.99 3163.75 c +f +3437.37 3294.9 m +3436.46 3265.7 3435.99 3245.31 3428.1 3229.1 c +3418.37 3208.24 3402.16 3202.23 3390.11 3202.23 c +3362.29 3202.23 3356.28 3225.39 3356.28 3248.09 c +3356.28 3291.64 3395.21 3294.9 3412.8 3294.9 c +3437.37 3294.9 l +h +3309.93 3237.89 m +3309.93 3208.69 3318.74 3179.51 3344.7 3166.99 c +3356.28 3161.9 3367.86 3161.9 3371.57 3161.9 c +3414.21 3161.9 3428.56 3193.42 3437.37 3212.87 c +3436.9 3192.48 3437.37 3179.98 3438.76 3163.75 c +3447.1 3164.22 3455.44 3165.14 3469.35 3165.14 c +3477.22 3165.14 3484.64 3164.22 3492.51 3163.75 c +3487.41 3171.62 3484.64 3176.27 3483.23 3194.34 c +3482.31 3211.93 3482.31 3229.55 3482.31 3254.1 c +3482.78 3348.63 l +3482.78 3383.87 3473.51 3418.61 3403.99 3418.61 c +3358.14 3418.61 3331.26 3404.71 3317.82 3397.75 c +3323.39 3387.56 3328.02 3378.77 3332.18 3358.83 c +3350.26 3374.59 3373.9 3382.93 3397.98 3382.93 c +3436.46 3382.93 3436.46 3357.44 3436.46 3321.31 c +3427.65 3321.76 3420.22 3322.68 3407.71 3322.68 c +3348.86 3322.68 3309.93 3300 3309.93 3237.89 c +f +3704.27 3209.63 m +3704.74 3193.87 3704.74 3177.19 3711.22 3163.75 c +3701.02 3164.67 3694.99 3166.07 3676.01 3166.07 c +3664.87 3166.07 3658.86 3165.14 3650.05 3163.75 c +3651.89 3169.77 3652.84 3172.09 3653.76 3179.98 c +3655.15 3190.62 3656.08 3226.31 3656.08 3238.83 c +3656.08 3288.87 l +3656.08 3310.65 3656.08 3342.17 3654.68 3353.28 c +3653.76 3361.15 3651.46 3382.46 3624.56 3382.46 c +3598.15 3382.46 3589.36 3363.01 3586.1 3347.25 c +3582.41 3331.03 3582.41 3313.42 3582.41 3244.84 c +3582.86 3185.53 3582.86 3179.98 3587.49 3163.75 c +3579.62 3164.67 3569.89 3165.6 3555.99 3165.6 c +3544.85 3165.6 3537.45 3165.14 3528.19 3163.75 c +3531.44 3171.17 3533.29 3174.88 3534.21 3200.82 c +3535.15 3226.31 3537 3351.43 3532.8 3381.07 c +3530.5 3399.16 3525.85 3403.32 3520.77 3407.95 c +3558.31 3409.8 3570.34 3415.84 3581.94 3421.85 c +3581.94 3372.73 l +3587.49 3387.11 3599.07 3419.08 3645.42 3419.08 c +3703.35 3419.08 3703.8 3376.91 3704.27 3349.12 c +3704.27 3209.63 l +f +0.843137 0.027451 0.317647 rg +3292.9 3486.97 m +3254.53 3448.61 l +3216.17 3486.97 l +3254.53 3525.33 l +3292.9 3486.97 l +f +end showpage restore +%%PageTrailer +%%Trailer +%%Pages: 1 diff --git a/poo/diapos/img/cesi.jpg b/poo/diapos/img/cesi.jpg new file mode 100644 index 0000000..dafbe55 Binary files /dev/null and b/poo/diapos/img/cesi.jpg differ diff --git a/poo/diapos/img/logo-cadoles.png b/poo/diapos/img/logo-cadoles.png new file mode 100644 index 0000000..de8ddc0 Binary files /dev/null and b/poo/diapos/img/logo-cadoles.png differ