Caroline Patenaude
Bibliothécaire - Bibliothèque des lettres et sciences humaines

Script Colab | Script R



1. Statistiques descriptives univariées


1.1. Fonction générique summary()

  • Fournit les principales mesures de tendance centrale et de dispersion d’une distribution avec quartiles
  • C’est une fonction dont le comportement s’adapte au type d’objet
  • Élimine d’emblée valeurs manquantes
##        id              age           sexe     
##  Min.   :   1.0   Min.   :18.00   Homme: 899  
##  1st Qu.: 500.8   1st Qu.:35.00   Femme:1101  
##  Median :1000.5   Median :48.00               
##  Mean   :1000.5   Mean   :48.16               
##  3rd Qu.:1500.2   3rd Qu.:60.00               
##  Max.   :2000.0   Max.   :97.00               
##                                               
##                                                  nivetud        poids         
##  Enseignement technique ou professionnel court       :463   Min.   :   78.08  
##  Enseignement superieur y compris technique superieur:441   1st Qu.: 2221.82  
##  Derniere annee d'etudes primaires                   :341   Median : 4631.19  
##  1er cycle                                           :204   Mean   : 5535.61  
##  2eme cycle                                          :183   3rd Qu.: 7626.53  
##  (Other)                                             :256   Max.   :31092.14  
##  NA's                                                :112                     
##                    occup                           qualif    freres.soeurs   
##  Exerce une profession:1049   Employe                 :594   Min.   : 0.000  
##  Chomeur              : 134   Ouvrier qualifie        :292   1st Qu.: 1.000  
##  Etudiant, eleve      :  94   Cadre                   :260   Median : 2.000  
##  Retraite             : 392   Ouvrier specialise      :203   Mean   : 3.283  
##  Retire des affaires  :  77   Profession intermediaire:160   3rd Qu.: 5.000  
##  Au foyer             : 171   (Other)                 :144   Max.   :22.000  
##  Autre inactif        :  83   NA's                    :347                   
##           clso                              relig    
##  Oui        : 936   Pratiquant regulier        :266  
##  Non        :1037   Pratiquant occasionnel     :442  
##  Ne sait pas:  27   Appartenance sans pratique :760  
##                     Ni croyance ni appartenance:399  
##                     Rejet                      : 93  
##                     NSP ou NVPR                : 40  
##                                                      
##                          trav.imp           trav.satisf  hard.rock  lecture.bd
##  Le plus important           : 29   Satisfaction  :480   Non:1986   Non:1953  
##  Aussi important que le reste:259   Insatisfaction:117   Oui:  14   Oui:  47  
##  Moins important que le reste:708   Equilibre     :451                        
##  Peu important               : 52   NA's          :952                        
##  NA's                        :952                                             
##                                                                               
##                                                                               
##  peche.chasse cuisine    bricol     cinema     sport        heures.tv     
##  Non:1776     Non:1119   Non:1147   Non:1174   Non:1277   Min.   : 0.000  
##  Oui: 224     Oui: 881   Oui: 853   Oui: 826   Oui: 723   1st Qu.: 1.000  
##                                                           Median : 2.000  
##                                                           Mean   : 2.247  
##                                                           3rd Qu.: 3.000  
##                                                           Max.   :12.000  
##                                                           NA's   :5
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   18.00   35.00   48.00   48.16   60.00   97.00
## Exerce une profession               Chomeur       Etudiant, eleve 
##                  1049                   134                    94 
##              Retraite   Retire des affaires              Au foyer 
##                   392                    77                   171 
##         Autre inactif 
##                    83


1.2. Autres fonctions pour indicateurs individuels

## [1] 2
## [1] 2.246566
## [1] 12
## [1] 0
## [1] 4481.9
## [1]  0 12
## [1] 3.153653
## [1] 1.775853
##   0%  25%  50%  75% 100% 
##    0    1    2    3   12


Fonctions de normalité

## [1] 1.308538
## [1] 3.230284


Fonctions de transformation: normalité & rang


1.3. La très utile fonction apply()

##           age     heures.tv freres.soeurs 
##     48.157000      2.246566      3.283000


1.4. Table de fréquences


Fonction table() - Tableaux d’effectifs

## 
##   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  18  22 
## 167 407 427 284 210 151  99  94  52  37  21  21   8  10   4   4   1   2   1


Autres fonctions pertinentes

## 
##       Ouvrier specialise         Ouvrier qualifie               Technicien 
##               0.12280702               0.17664852               0.05202662 
## Profession intermediaire                    Cadre                  Employe 
##               0.09679371               0.15728978               0.35934664 
##                    Autre 
##               0.03508772
## 
##       Ouvrier specialise         Ouvrier qualifie               Technicien 
##                       12                       18                        5 
## Profession intermediaire                    Cadre                  Employe 
##                       10                       16                       36 
##                    Autre 
##                        4
##                            n    % val%
## Ouvrier specialise       203 10.2 12.3
## Ouvrier qualifie         292 14.6 17.7
## Technicien                86  4.3  5.2
## Profession intermediaire 160  8.0  9.7
## Cadre                    260 13.0 15.7
## Employe                  594 29.7 35.9
## Autre                     58  2.9  3.5
## NA                       347 17.3   NA
##                             n   % %cum
## Autre                      58   4    4
## Technicien                 86   5    9
## Profession intermediaire  160  10   18
## Ouvrier specialise        203  12   31
## Cadre                     260  16   46
## Ouvrier qualifie          292  18   64
## Employe                   594  36  100
## Total                    1653 100  100


2. Statistiques descriptives bivariées


2.1. Tableaux croisées


Fonction table() et cie.

  • 1er argument var en ligne (x), 2e var en colonne (y)
##                 
##                  Homme Femme
##   Satisfaction     233   247
##   Insatisfaction    61    56
##   Equilibre        226   225
##                 
##                  Homme Femme  Sum
##   Satisfaction     233   247  480
##   Insatisfaction    61    56  117
##   Equilibre        226   225  451
##   Sum              520   528 1048
##                 
##                  Homme Femme Total
##   Satisfaction    22.2  23.6  45.8
##   Insatisfaction   5.8   5.3  11.2
##   Equilibre       21.6  21.5  43.0
##   Total           49.6  50.4 100.0
##                 
##                      Homme     Femme
##   Satisfaction   0.4480769 0.4678030
##   Insatisfaction 0.1173077 0.1060606
##   Equilibre      0.4346154 0.4261364
##                 
##                  Homme  Femme  Ensemble
##   Satisfaction    44.8%  46.8%  45.8%  
##   Insatisfaction  11.7%  10.6%  11.2%  
##   Equilibre       43.5%  42.6%  43.0%  
##   Total          100.0% 100.0% 100.0%
##                 
##                  Homme Femme Total
##   Satisfaction    49%   51%  100% 
##   Insatisfaction  52%   48%  100% 
##   Equilibre       50%   50%  100% 
##   Ensemble        50%   50%  100%


2.2. Comparer des groupes : by() et tapply()

  • Les très pratiques fonctions by() et tapply() (variante de la fonction apply)
  • Permettent d’appliquer une fonction sur une variable quantitative (1er) selon les modalités d’une variable catégorielle (2iem)
## bd$sexe: Homme
## [1] 48.16129
## ------------------------------------------------------------ 
## bd$sexe: Femme
## [1] 48.1535
##    Homme    Femme 
## 48.16129 48.15350
## $Homme
## 
##         Pratiquant regulier      Pratiquant occasionnel 
##                          86                         170 
##  Appartenance sans pratique Ni croyance ni appartenance 
##                         365                         210 
##                       Rejet                 NSP ou NVPR 
##                          52                          16 
## 
## $Femme
## 
##         Pratiquant regulier      Pratiquant occasionnel 
##                         180                         272 
##  Appartenance sans pratique Ni croyance ni appartenance 
##                         395                         189 
##                       Rejet                 NSP ou NVPR 
##                          41                          24
## $Homme
##                               n    % val%
## Pratiquant regulier          86  9.6  9.6
## Pratiquant occasionnel      170 18.9 18.9
## Appartenance sans pratique  365 40.6 40.6
## Ni croyance ni appartenance 210 23.4 23.4
## Rejet                        52  5.8  5.8
## NSP ou NVPR                  16  1.8  1.8
## 
## $Femme
##                               n    % val%
## Pratiquant regulier         180 16.3 16.3
## Pratiquant occasionnel      272 24.7 24.7
## Appartenance sans pratique  395 35.9 35.9
## Ni croyance ni appartenance 189 17.2 17.2
## Rejet                        41  3.7  3.7
## NSP ou NVPR                  24  2.2  2.2


2.3. Fonction xtabs - Notation formule

  • Repose sur l’utilisation de la notation formule qui définissent les relations entre les variables : NomFonction(VD ~ VI).
  • Puisque le tableau croisé n’attribue pas de rôle spécifique aux variables, on place les deux variables après le tilde: ~ x + y.
  • On indique le nom du tableau après la virgule.
##        occup
## sexe    Exerce une profession Chomeur Etudiant, eleve Retraite
##   Homme                   520      54              48      208
##   Femme                   529      80              46      184
##        occup
## sexe    Retire des affaires Au foyer Autre inactif
##   Homme                  39        0            30
##   Femme                  38      171            53



LS0tDQp0aXRsZTogIkNhcHN1bGUgNjogU3RhdGlzdGlxdWVzIGRlc2NyaXB0aXZlcyINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIGhpZ2hsaWdodDogaGFkZG9jaw0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIFNtb290aF9zY3JvbGw6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQpjc3M6IGhpZGUuY3NzDQotLS0NCg0KPHNjcmlwdCBzcmM9ImhpZGVPdXRwdXQuanMiPjwvc2NyaXB0Pg0KDQpDYXJvbGluZSBQYXRlbmF1ZGUgPGJyPiANCipbQmlibGlvdGjDqWNhaXJlIC0gQmlibGlvdGjDqHF1ZSBkZXMgbGV0dHJlcyBldCBzY2llbmNlcyBodW1haW5lc10oaHR0cHM6Ly9iaWIudW1vbnRyZWFsLmNhL2d1aWRlcy9kb25uZWVzLXN0YXRpc3RpcXVlcy1nZW9zcGF0aWFsZXMvZG9ubmVlcy1zdGF0aXN0aXF1ZXMpKiANCjxicj4gDQoNCltTY3JpcHQgQ29sYWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9Db3Vycy1FRFVsaWIvRkFTLUlTRFMvYmxvYi9tYWluL21vZHVsZS00LzRfMV9zdGF0aXN0aXF1ZXNfZGVzY3JpcHRpdmVzLmlweW5iKSB8IFtTY3JpcHQgUl0oaHR0cHM6Ly9naXRodWIuY29tL0NvdXJzLUVEVWxpYi9GQVMtSVNEUy9ibG9iL21haW4vbW9kdWxlLTQvNC4xLXN0YXRpc3RpcXVlcy1kZXNjcmlwdGl2ZXMuUikgDQoNCjxicj4NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KDQoNCjxkaXYgY2xhc3M9ImZvbGQgbyI+DQpgYGB7cn0NCiMgQ2hhcmdlbWVudCBkZXMgbW9kdWxlcyBuw6ljZXNzYWlyZXMNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShxdWVzdGlvbnIpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShIbWlzYykNCg0KIyBBam91dGVyIGxhIGZvbmN0aW9uIGRlIHTDqWzDqWNoYXJnZW1lbnQgc2kgbsOpY2Vzc2FpcmU6DQojIGluc3RhbGwucGFja2FnZXMoImNhciIsIGRlcGVuZGVuY2llcz1UUlVFKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJxdWVzdGlvbnIiLCBkZXBlbmRlbmNpZXM9VFJVRSkNCiMgaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giLCBkZXBlbmRlbmNpZXM9VFJVRSkNCiMgaW5zdGFsbC5wYWNrYWdlcygiSG1pc2MiLCBkZXBlbmRlbmNpZXM9VFJVRSkNCg0KIyBUw6lsw6ljaGFyZ2VtZW50IGRlIGxhIGJhc2UgZGUgZG9ubsOpZXMgaGR2MjAwMyBkdSBtb2R1bGUgcXVlc3Rpb25yDQojIChFeHRyYWl0IGRlIGwnZW5xdcOqdGUgIkhpc3RvaXJlIGRlIHZpZSIgZGUgbCdJbnNlZSAtIGh0dHBzOi8vd3d3Lmluc2VlLmZyL2ZyL3N0YXRpc3RpcXVlcy8yNTMyMjQ0KQ0KZGF0YShoZHYyMDAzKQ0KDQojIENvcGllIGRlIGxhIGJhc2UgZGUgZG9ubsOpZXMgZGFucyB1biBvYmpldCAoZGF0YXRhYmxlKSBub21tw6kgYmQNCmJkIDwtIGhkdjIwMDMNCmBgYA0KDQo8YnI+DQoNCg0KIyAxLiBTdGF0aXN0aXF1ZXMgZGVzY3JpcHRpdmVzIHVuaXZhcmnDqWVzDQoNCjxicj4NCg0KIyMgMS4xLiBGb25jdGlvbiBnw6luw6lyaXF1ZSBzdW1tYXJ5KCkgDQoqICAgRm91cm5pdCBsZXMgcHJpbmNpcGFsZXMgbWVzdXJlcyBkZSB0ZW5kYW5jZSBjZW50cmFsZSBldCBkZSBkaXNwZXJzaW9uIGTigJl1bmUgZGlzdHJpYnV0aW9uIGF2ZWMgcXVhcnRpbGVzIA0KKiAgIEPigJllc3QgdW5lIGZvbmN0aW9uIGRvbnQgbGUgY29tcG9ydGVtZW50IHPigJlhZGFwdGUgYXUgdHlwZSBk4oCZb2JqZXQNCiogICDDiWxpbWluZSBkJ2VtYmzDqWUgdmFsZXVycyBtYW5xdWFudGVzDQoNCmBgYHtyfQ0Kc3VtbWFyeShiZCkgIyBiYXNlIGRlIGRvbm7DqWVzIA0KYGBgDQoNCg0KYGBge3J9DQpzdW1tYXJ5KGJkJGFnZSkgIyB2YXJpYWJsZSBxdWFudGl0YXRpdmUNCmBgYA0KDQoNCmBgYHtyfQ0Kc3VtbWFyeShiZCRvY2N1cCkgIyB2YXJpYWJsZSBxdWFsaXRhdGl2ZQ0KYGBgDQoNCjxicj4NCg0KIyMgMS4yLiBBdXRyZXMgZm9uY3Rpb25zIHBvdXIgaW5kaWNhdGV1cnMgaW5kaXZpZHVlbHMNCg0KYGBge3J9DQojIEZvbmN0aW9ucyBkaXZlcnNlcyBwZXJtZXR0YW50IGQnZXhwbG9yZXIgbGVzIGluZGljYXRldXJzIGRlIGNlbnRyYWxpdMOpIA0KIyBldCBkZSBkaXNwZXJzaW9uIHBvdXIgdmFyaWFibGUgcXVhbnRpdGF0aXZlDQojIFRvdWpvdXJzIGFqb3V0ZXIgbmEucm09VCBlbiBhcmd1bWVudA0KDQptZWRpYW4oYmQkaGV1cmVzLnR2LCBuYS5ybT1UUlVFKQ0KYGBgDQoNCg0KYGBge3J9DQptZWFuKGJkJGhldXJlcy50diwgbmEucm09VFJVRSkNCmBgYA0KDQoNCmBgYHtyfQ0KbWF4KGJkJGhldXJlcy50diwgbmEucm09VFJVRSkNCmBgYA0KDQoNCmBgYHtyfQ0KbWluKGJkJGhldXJlcy50diwgbmEucm09VFJVRSkNCmBgYA0KDQoNCmBgYHtyfQ0Kc3VtKGJkJGhldXJlcy50diwgbmEucm09VFJVRSkNCmBgYA0KDQoNCmBgYHtyfQ0KcmFuZ2UoYmQkaGV1cmVzLnR2LCBuYS5ybT1UUlVFKQ0KYGBgDQoNCg0KYGBge3J9DQp2YXIoYmQkaGV1cmVzLnR2LCBuYS5ybT1UUlVFKQ0KYGBgDQoNCg0KYGBge3J9DQpzZChiZCRoZXVyZXMudHYsIG5hLnJtPVRSVUUpDQpgYGANCg0KDQpgYGB7cn0NCnF1YW50aWxlKGJkJGhldXJlcy50diwgbmEucm09VFJVRSkNCmBgYA0KDQo8YnI+DQoNCiMjIyBGb25jdGlvbnMgZGUgbm9ybWFsaXTDqQ0KDQpgYGB7cn0NCnNrZXcoYmQkaGV1cmVzLnR2LCBuYS5ybT1UUlVFKSAjIG1vZHVsZSBwc3ljaA0KYGBgDQoNCg0KYGBge3J9DQprdXJ0b3NpKGJkJGhldXJlcy50diwgbmEucm09VFJVRSkgIyBtb2R1bGUgcHN5Y2gNCmBgYA0KDQo8YnI+DQoNCiMjIyBGb25jdGlvbnMgZGUgdHJhbnNmb3JtYXRpb246IG5vcm1hbGl0w6kgJiByYW5nDQoNCmBgYHtyfQ0KYmQkYWdlLmxvZyA8LSBsb2coYmQkYWdlLCBiYXNlPTEwKSAgICAgIyBMb2dhcml0aG1lICgsIGJhc2U9MTApDQpgYGANCg0KDQpgYGB7cn0NCmJkJGFnZS5zcXJ0IDwtIHNxcnQoYmQkYWdlKSAgICAjIFJhY2luZSBjYXJyw6llDQpgYGANCg0KDQpgYGB7cn0NCmJkJGFnZS5zY2FsZSA8LSBzY2FsZShiZCRhZ2UsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkgICAgIyBTdGFuZGFyZGlzYXRpb246IGNlbnRyYWdlIGV0IHLDqWR1Y3Rpb24gKFpzY29yZSkNCmBgYA0KDQoNCjxicj4NCg0KIyMgMS4zLiBMYSB0csOocyB1dGlsZSBmb25jdGlvbiBhcHBseSgpDQoNCmBgYHtyfQ0KIyMjIFBvdXIgYXBwbGlxdWVyIHVuZSBmb25jdGlvbiBzdXIgcGx1c2lldXJzIHZhcmlhYmxlcyDDoCBsYSBmb2lzDQphcHBseShiZFsgLGMoImFnZSIsICJoZXVyZXMudHYiLCJmcmVyZXMuc29ldXJzIildLCBuYS5ybT1UUlVFLCBNQVJHSU49MiwgRlVOPW1lYW4pDQoNCiMgYygpIGluZGlxdWUgbGVzIHZhcmlhYmxlcyDDoCB1dGlsaXNlciBkYW5zIGxlIGNhbGN1bA0KIyBNQVJHSU49MjogY2FsY3VsIMOgIHRyYXZlcnMgbGVzIHBhcnRpY2lwYW50cyAoaWNpIG1veWVubmUgZGUgY29sb25uZXMpLCA9MSBlc3Qgw6AgdHJhdmVycyBsZXMgcmFuZ8OpZXMNCiMgRlVOPW1lYW46IGxhIGZvbmN0aW9uIMOgIGFwcGxpcXVlciwgcG91cnJhaXQgw6p0cmUgbidpbXBvcnRlIGxhcXVlbGxlIGNvbW1lIHNvbW1lLCB2YXJpYW5jZS4uLg0KYGBgDQoNCjxicj4NCg0KIyMgMS40LiBUYWJsZSBkZSBmcsOpcXVlbmNlcw0KDQo8YnI+DQoNCiMjIyBGb25jdGlvbiB0YWJsZSgpIC0gVGFibGVhdXggZCdlZmZlY3RpZnMgDQoNCmBgYHtyfQ0KdGFibGUoYmQkZnJlcmVzLnNvZXVycykgICAgIyB2YXIgbnVtw6lyaXF1ZQ0KYGBgDQoNCg0KYGBge3J9DQp0Yi5jYXQgPC0gdGFibGUoYmQkcXVhbGlmKSAgICAgICAgICAgICMgdmFyIHF1YWxpIChyw6lzdWx0YXQgcGFyZWlsIMOgIHN1bW1hcnkoKSkNCg0KIyBFeGNsdSBOQSBwYXIgZMOpZmF1dCwgc2lub24gaWwgZmF1dCB1dGlsaXNlciBs4oCZYXJndW1lbnQgdXNlTkEgPSJhbHdheXMiIG91ICJpZmFueSINCiMgT24gcGxhY2UgbGEgdGFibGUgZGFucyB1biBub3V2ZWwgb2JqZXQgcG91ciBwb3V2b2lyIGx1aSBhcHBsaXF1ZXIgZCdhdXRyZXMgb3DDqXJhdGlvbnMNCmBgYA0KDQoNCjxicj4NCg0KIyMjIEF1dHJlcyBmb25jdGlvbnMgcGVydGluZW50ZXMNCg0KYGBge3J9DQpwcm9wLnRhYmxlKHRiLmNhdCkgIyBBcHBsaXF1w6llIMOgIHVuZSAidGFibGUiIHBvdXIgdHJhbnNmb3JtZXIgbGVzIHZhbGV1cnMgZW4gcHJvcG9ydGlvbnMNCmBgYA0KDQpgYGB7cn0NCiMgQWZmaWNoZXIgZW4gJSBldCBhcnJvbmRpcg0KDQpyb3VuZCgocHJvcC50YWJsZSh0Yi5jYXQpKSoxMDApIA0KYGBgDQoNCg0KYGBge3J9DQojIEZvbmN0aW9uIGZyZXEgKG1vZHVsZSBxdWVzdGlvbnIpDQoNCmZyZXEoYmQkcXVhbGlmKSAjIGFmZmljaGUgbGVzIE5BIHBhciBkw6lmYXV0DQpgYGANCg0KDQpgYGB7cn0NCiMjIyBGb25jdGlvbiBmcmVxOiBub21icmV1eCBhcmd1bWVudHMgdXRpbGVzIHBvc3NpYmxlcw0KDQpmcmVxKGJkJHF1YWxpZiwgY3VtID0gVFJVRSwgdG90YWwgPSBUUlVFLCBzb3J0ID0gImluYyIsIGRpZ2l0cyA9IDAsIGV4Y2x1ZGUgPSBOQSkNCg0KICAjIGN1bTogYWZmaWNoZXIgb3Ugbm9uIGxlcyAlIGN1bXVsw6lzDQogICMgdG90YWw6IGFqb3V0ZXIgbGVzIGVmZmVjdGlmcyB0b3RhdXgNCiAgIyBzb3J0OiB0cmllciBsZSB0YWJsZWF1IHBhciBmcsOpcXVlbmNlIGNyb2lzc2FudGUgKHNvcnQ9ImluYyIpIG91IGTDqWNyb2lzc2FudGUgKHNvcnQ9ImRlYyIpDQogICMgZGlnaXRzOiBhcnJvbmRpcg0KICAjIGV4Y2x1ZGU6IGV4Y2x1cmUgdmFsZXVycyBtYW5xdWFudGVzDQpgYGANCg0KPGJyPg0KDQojIDIuIFN0YXRpc3RpcXVlcyBkZXNjcmlwdGl2ZXMgYml2YXJpw6llcw0KDQo8YnI+DQoNCiMjIDIuMS4gVGFibGVhdXggY3JvaXPDqWVzDQoNCjxicj4NCg0KIyMjIEZvbmN0aW9uIHRhYmxlKCkgZXQgY2llLg0KKiAgIDFlciBhcmd1bWVudCB2YXIgZW4gbGlnbmUgKHgpLCAyZSB2YXIgZW4gY29sb25uZSAoeSkNCg0KYGBge3J9DQp0YiA8LXRhYmxlKGJkJHRyYXYuc2F0aXMsIGJkJHNleGUpIA0KDQojIHBvdXIgdW5lIHRhYmxlIMOgIHBsdXMgZGUgZGV1eCBuaXZlYXV4LCBzaW1wbGVtZW50IGFqb3V0ZXIgdW5lIHZhcmlhYmxlIGFkZGl0aW9ubmVsbGUNCmBgYA0KDQoNCmBgYHtyfQ0KdGIgIyBEaXN0cmlidXRpb24gZGUgbGEgc2F0aXNmYWN0aW9uIGF1IHRyYXZhaWwgc2Vsb24gbGUgc2V4ZQ0KYGBgDQoNCmBgYHtyfQ0KIyBBam91dGVyIGxlcyB0b3RhdXggZGVzIGVmZmVjdGlmcw0KDQphZGRtYXJnaW5zKHRiKSAgICANCmBgYA0KDQoNCmBgYHtyfQ0KIyAlIFRvdGF1eCANCnByb3AodGIpICAgICAgDQpgYGANCg0KDQpgYGB7cn0NCiMgJSBUb3RhdXgNCg0KcHJvcC50YWJsZSh0YiwgbWFyZ2luID0gMikgICAgDQoNCiMgbWFyZ2luID0gMSBwb3VyIHByb3BvcnRpb24gZW4gcmFuZ8OpZXMNCiMgbWFyZ2luID0gMiBwb3VyIHByb3BvcnRpb24gZW4gY29sb25uZXMNCiMgKjEwMA0KYGBgDQoNCg0KYGBge3J9DQojIHJwcm9wIGV0IGNwcm9wIGRlIHF1ZXN0aW9uciBwb3VyICUNCg0KY3Byb3AodGIsIHBlcmNlbnQgPSBUUlVFKSAgICAjICUgZW4gY29sb25uZXMNCg0KIyBBcmd1bWVudCBwZXJjZW50IHBvdXIgYWZmaWNoZXIgbGVzICUNCmBgYA0KDQpgYGB7cn0NCnJwcm9wKHRiLCBwZXJjZW50ID0gVFJVRSwgZGlnaXRzID0gMCkgICAgIyAlIGVuIGxpZ25lcywgYXJndW1lbnQgZGlnaXRzIHBvdXIgYXJyb25kaXINCmBgYA0KDQo8YnI+DQoNCiMjIyAyLjIuIENvbXBhcmVyIGRlcyBncm91cGVzIDogYnkoKSBldCB0YXBwbHkoKSANCg0KKiAgIExlcyB0csOocyBwcmF0aXF1ZXMgZm9uY3Rpb25zIGJ5KCkgZXQgdGFwcGx5KCkgKHZhcmlhbnRlIGRlIGxhIGZvbmN0aW9uIGFwcGx5KQ0KKiAgIFBlcm1ldHRlbnQgZCdhcHBsaXF1ZXIgdW5lIGZvbmN0aW9uIHN1ciB1bmUgdmFyaWFibGUgcXVhbnRpdGF0aXZlICgxZXIpIHNlbG9uIGxlcyBtb2RhbGl0w6lzIGQndW5lIHZhcmlhYmxlIGNhdMOpZ29yaWVsbGUgKDJpZW0pDQoNCmBgYHtyfQ0KYnkoYmQkYWdlLCBiZCRzZXhlLCBtZWFuLCBuYS5ybT1UUlVFKQ0KYGBgDQoNCmBgYHtyfQ0KdGFwcGx5KGJkJGFnZSwgYmQkc2V4ZSwgbWVhbiwgbmEucm09VFJVRSkNCmBgYA0KDQpgYGB7cn0NCnRhcHBseShiZCRyZWxpZywgYmQkc2V4ZSwgdGFibGUpIA0KYGBgDQoNCmBgYHtyfQ0KdGFwcGx5KGJkJHJlbGlnLCBiZCRzZXhlLCBmcmVxKQ0KYGBgDQoNCjxicj4NCg0KIyMjIDIuMy4gRm9uY3Rpb24geHRhYnMgLSBOb3RhdGlvbiBmb3JtdWxlDQoNCiogUmVwb3NlIHN1ciBsJ3V0aWxpc2F0aW9uIGRlIGxhIG5vdGF0aW9uIGZvcm11bGUgcXVpIGTDqWZpbmlzc2VudCBsZXMgcmVsYXRpb25zIGVudHJlIGxlcyB2YXJpYWJsZXMgOiBOb21Gb25jdGlvbihWRCB+IFZJKS4NCiogUHVpc3F1ZSBsZSB0YWJsZWF1IGNyb2lzw6kgbidhdHRyaWJ1ZSBwYXMgZGUgcsO0bGUgc3DDqWNpZmlxdWUgYXV4IHZhcmlhYmxlcywgb24gcGxhY2UgbGVzIGRldXggdmFyaWFibGVzIGFwcsOocyBsZSB0aWxkZTogfiB4ICsgeS4NCiogT24gaW5kaXF1ZSBsZSBub20gZHUgdGFibGVhdSBhcHLDqHMgbGEgdmlyZ3VsZS4NCg0KYGBge3J9DQp4dGFicyAofiBzZXhlICsgb2NjdXAsIGJkKQ0KYGBgDQoNCjxicj4NCg0KKioqDQoNCjwvZGl2Pg==