# =============================================================================
# STATISTIQUES DESCRIPTIVES - Panel Macroprudentiel
# 161 pays × 25 ans (2000-2024) | 4025 observations
# =============================================================================

# --- 1. PACKAGES ---
# install.packages(c("readxl", "dplyr", "psych", "ggplot2", "tidyr", "knitr"))

library(readxl)
library(dplyr)
library(psych)
library(ggplot2)
library(tidyr)


# --- 2. IMPORTATION ---
df_raw <- read_excel("Copie_Panel_X.xlsx", sheet = 1, skip = 3)

# Renommage des colonnes
colnames(df_raw) <- c(
  "Pays", "Statut", "Annee", "Cle_panel",
  "Credit_growth", "LTV", "DSTI", "LLP_DP", "CCB", "LVR",
  "SIFI", "CONC", "LFC", "RR_FCD", "LCG", "TAX",
  "MPI", "BORROWER",
  "GDP_growth", "Inflation", "Unemployment", "GDPpc_log",
  "Credit_PIB", "Market_Rate",
  "Crisis", "COVID", "FINANCIAL"
)

# Nettoyage : lignes valides uniquement
df <- df_raw %>%
  filter(!is.na(Annee), !is.na(Pays), Annee != "Annee") %>%
  mutate(Annee = as.integer(Annee))

cat("Dimensions :", nrow(df), "observations x", ncol(df), "variables\n")
Dimensions : 4025 observations x 27 variables
cat("Pays :", n_distinct(df$Pays), "| Années :", min(df$Annee), "-", max(df$Annee), "\n\n")
Pays : 161 | Années : 2000 - 2024 
# --- 3. APERÇU GENERAL ---
glimpse(df)
Rows: 4,025
Columns: 27
$ Pays          <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghani…
$ Statut        <chr> "Developpement", "Developpement", "Developpement", "Developpement", …
$ Annee         <int> 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 20…
$ Cle_panel     <chr> "AFG_2000", "AFG_2001", "AFG_2002", "AFG_2003", "AFG_2004", "AFG_200…
$ Credit_growth <dbl> NA, NA, NA, NA, NA, NA, NA, 65.823, 38.767, 38.916, 36.722, -61.790,…
$ LTV           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ DSTI          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ LLP_DP        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ CCB           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ LVR           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ SIFI          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ CONC          <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ LFC           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ RR_FCD        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ LCG           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ TAX           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ MPI           <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ BORROWER      <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ GDP_growth    <dbl> NA, -9.4319741, 28.6000012, 8.8322778, 1.4141180, 11.2297148, 5.3574…
$ Inflation     <dbl> NA, NA, NA, NA, NA, 12.68626872, 6.78459655, 8.68057079, 26.41866415…
$ Unemployment  <dbl> 7.897, 7.973, 7.867, 7.844, 7.794, 7.878, 7.897, 7.841, 7.879, 7.808…
$ GDPpc_log     <dbl> 5.731133, 5.624444, 5.823460, 5.846646, 5.824930, 5.896165, 5.907426…
$ Credit_PIB    <dbl> NA, NA, NA, NA, NA, NA, 4.8429, 6.8400, 9.3883, 10.5841, 11.5750, 4.…
$ Market_Rate   <dbl> NA, NA, NA, NA, NA, NA, NA, 2.500, 6.106, 10.254, 6.119, 5.401, 2.12…
$ Crisis        <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ COVID         <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,…
$ FINANCIAL     <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
# --- 4. STATISTIQUES DESCRIPTIVES GLOBALES ---

## 4a. Variables continues : macroéconomiques
vars_macro <- c("GDP_growth", "Inflation", "Unemployment", "GDPpc_log",
                "Credit_PIB", "Market_Rate", "Credit_growth")

cat("\n====== VARIABLES MACROÉCONOMIQUES ======\n")

====== VARIABLES MACROÉCONOMIQUES ======
df %>%
  select(all_of(vars_macro)) %>%
  describe() %>%
  print()
              vars    n  mean    sd median trimmed   mad    min    max  range  skew
GDP_growth       1 3289  3.63  5.07   3.80    3.75  3.16 -36.66  63.33  99.99  0.27
Inflation        2 3187  6.64 15.36   3.68    4.53  3.57 -16.86 359.09 375.95 12.38
Unemployment     3 3219  7.65  5.53   6.15    6.92  4.28   0.10  37.32  37.22  1.50
GDPpc_log        4 3293  8.58  1.43   8.49    8.58  1.66   5.49  11.63   6.14  0.07
Credit_PIB       5 3325 54.90 45.52  41.00   48.11 35.82   0.38 301.02 300.64  1.41
Market_Rate      6 1414  6.14  6.90   4.47    5.04  3.66  -0.65  88.14  88.79  4.76
Credit_growth    7 2915  4.52 19.18   3.76    3.91 11.92 -97.83 196.68 294.51  0.97
              kurtosis   se
GDP_growth       19.04 0.09
Inflation       210.75 0.27
Unemployment      3.01 0.10
GDPpc_log        -0.86 0.02
Credit_PIB        2.03 0.79
Market_Rate      41.55 0.18
Credit_growth    10.66 0.36
## 4b. Variables d'instruments macroprudentiels (binaires 0/1)
vars_mpi <- c("LTV", "DSTI", "LLP_DP", "CCB", "LVR",
              "SIFI", "CONC", "LFC", "RR_FCD", "LCG", "TAX")

cat("\n====== INSTRUMENTS MACROPRUDENTIELS (taux d'activation) ======\n")

====== INSTRUMENTS MACROPRUDENTIELS (taux d'activation) ======
df %>%
  select(all_of(vars_mpi)) %>%
  summarise(across(everything(), ~ mean(.x, na.rm = TRUE))) %>%
  pivot_longer(everything(), names_to = "Instrument", values_to = "Taux_activation") %>%
  mutate(Taux_activation = round(Taux_activation * 100, 1)) %>%
  arrange(desc(Taux_activation)) %>%
  print()
# A tibble: 11 × 2
   Instrument Taux_activation
   <chr>                <dbl>
 1 SIFI                  12  
 2 DSTI                  10.8
 3 LTV                    8.1
 4 CONC                   7.6
 5 CCB                    7.2
 6 LLP_DP                 6.4
 7 LVR                    4.6
 8 RR_FCD                 3.8
 9 TAX                    2.1
10 LFC                    1.7
11 LCG                    1  
## 4c. Indices composites
cat("\n====== INDICES COMPOSITES ======\n")

====== INDICES COMPOSITES ======
df %>%
  select(MPI, BORROWER, FINANCIAL) %>%
  describe() %>%
  print()
          vars    n mean   sd median trimmed mad min max range skew kurtosis   se
MPI          1 4025 0.65 1.23      0    0.35   0   0   8     8 2.16     4.52 0.02
BORROWER     2 4025 0.19 0.56      0    0.01   0   0   2     2 2.76     5.89 0.01
FINANCIAL    3 4025 0.46 0.90      0    0.25   0   0   6     6 2.19     4.82 0.01
## 4d. Variables binaires (crise, COVID)
cat("\n====== VARIABLES INDICATRICES ======\n")

====== VARIABLES INDICATRICES ======
df %>%
  summarise(
    Pct_Crisis  = round(mean(Crisis,  na.rm = TRUE) * 100, 2),
    Pct_COVID   = round(mean(COVID,   na.rm = TRUE) * 100, 2)
  ) %>%
  print()
# A tibble: 1 × 2
  Pct_Crisis Pct_COVID
       <dbl>     <dbl>
1       2.21         8
# --- 5. STATISTIQUES PAR GROUPE (Statut de développement) ---
cat("\n====== STATS PAR STATUT (Développement / Émergent / Avancé) ======\n")

====== STATS PAR STATUT (Développement / Émergent / Avancé) ======
df %>%
  group_by(Statut) %>%
  summarise(
    N             = n(),
    GDP_growth_m  = round(mean(GDP_growth,  na.rm = TRUE), 2),
    Inflation_m   = round(mean(Inflation,   na.rm = TRUE), 2),
    Credit_PIB_m  = round(mean(Credit_PIB,  na.rm = TRUE), 2),
    MPI_moyen     = round(mean(MPI,         na.rm = TRUE), 2),
    FINANCIAL_m   = round(mean(FINANCIAL,   na.rm = TRUE), 2),
    Pct_Crisis    = round(mean(Crisis,      na.rm = TRUE) * 100, 1)
  ) %>%
  print()
# A tibble: 3 × 8
  Statut            N GDP_growth_m Inflation_m Credit_PIB_m MPI_moyen FINANCIAL_m Pct_Crisis
  <chr>         <int>        <dbl>       <dbl>        <dbl>     <dbl>       <dbl>      <dbl>
1 Avance          750         2.4         2.37        104.       1.25        0.86        2.7
2 Developpement   925         4.41        8.25         25.8      0.2         0.15        1.9
3 Emergent       2350         3.77        7.79         50.1      0.64        0.46        2.2
# --- 6. EVOLUTION TEMPORELLE ---
cat("\n====== ÉVOLUTION ANNUELLE MOYENNE ======\n")

====== ÉVOLUTION ANNUELLE MOYENNE ======
evolution <- df %>%
  group_by(Annee) %>%
  summarise(
    MPI_moy          = round(mean(MPI,         na.rm = TRUE), 3),
    GDP_growth_moy   = round(mean(GDP_growth,  na.rm = TRUE), 2),
    Credit_PIB_moy   = round(mean(Credit_PIB,  na.rm = TRUE), 2),
    N_obs            = n()
  )
print(evolution)
# A tibble: 25 × 5
   Annee MPI_moy GDP_growth_moy Credit_PIB_moy N_obs
   <int>   <dbl>          <dbl>          <dbl> <int>
 1  2000   0.106           4.79           39.2   161
 2  2001   0.106           3.49           46.1   161
 3  2002   0.087           3.81           45.2   161
 4  2003   0.149           4              46     161
 5  2004   0.242           5.92           46.5   161
 6  2005   0.174           5.05           49.4   161
 7  2006   0.224           6.36           51.4   161
 8  2007   0.261           6.2            54.7   161
 9  2008   0.379           4.42           56.0   161
10  2009   0.335          -0.03           57.3   161
# ℹ 15 more rows
# ℹ Use `print(n = ...)` to see more rows
# --- 7. VALEURS MANQUANTES ---
cat("\n====== VALEURS MANQUANTES (%) ======\n")

====== VALEURS MANQUANTES (%) ======
df %>%
  summarise(across(everything(), ~ round(mean(is.na(.x)) * 100, 1))) %>%
  pivot_longer(everything(), names_to = "Variable", values_to = "Pct_NA") %>%
  filter(Pct_NA > 0) %>%
  arrange(desc(Pct_NA)) %>%
  print()
# A tibble: 7 × 2
  Variable      Pct_NA
  <chr>          <dbl>
1 Market_Rate     64.9
2 Credit_growth   27.6
3 Inflation       20.8
4 Unemployment    20  
5 GDP_growth      18.3
6 GDPpc_log       18.2
7 Credit_PIB      17.4
# --- 8. GRAPHIQUES ---

## 8a. Distribution de GDP_growth
p1 <- ggplot(df, aes(x = GDP_growth)) +
  geom_histogram(binwidth = 1, fill = "#2C7BB6", color = "white", alpha = 0.8) +
  labs(title = "Distribution de la croissance du PIB",
       x = "Croissance du PIB (%)", y = "Fréquence") +
  theme_minimal()
print(p1)


## 8b. MPI moyen par statut au fil du temps
p2 <- df %>%
  group_by(Annee, Statut) %>%
  summarise(MPI_moy = mean(MPI, na.rm = TRUE), .groups = "drop") %>%
  ggplot(aes(x = Annee, y = MPI_moy, color = Statut)) +
  geom_line(linewidth = 1) +
  labs(title = "Évolution de l'indice MPI moyen par groupe",
       x = "Année", y = "MPI moyen (0-11)", color = "Statut") +
  theme_minimal()
print(p2)


## 8c. Taux d'activation des instruments MPI
df %>%
  select(all_of(vars_mpi)) %>%
  summarise(across(everything(), ~ mean(.x, na.rm = TRUE) * 100)) %>%
  pivot_longer(everything(), names_to = "Instrument", values_to = "Pct") %>%
  ggplot(aes(x = reorder(Instrument, Pct), y = Pct, fill = Pct)) +
  geom_col() +
  coord_flip() +
  scale_fill_gradient(low = "#D7E9F7", high = "#1A5276") +
  labs(title = "Taux d'activation des instruments macroprudentiels (%)",
       x = "", y = "% d'observations actives", fill = "%") +
  theme_minimal() +
  theme(legend.position = "none") -> p3
print(p3)


## 8d. Boxplot GDP growth par statut
p4 <- ggplot(df, aes(x = Statut, y = GDP_growth, fill = Statut)) +
  geom_boxplot(outlier.alpha = 0.3) +
  labs(title = "Croissance du PIB par statut de développement",
       x = "Statut", y = "Croissance du PIB (%)") +
  theme_minimal() +
  theme(legend.position = "none")
print(p4)


cat("\n✅ Analyse terminée.\n")

✅ Analyse terminée.
# =============================================================================
# TABLEAU DE STATISTIQUES DESCRIPTIVES
# Variables macro + Instruments MPI
# =============================================================================

library(readxl)
library(dplyr)
library(tidyr)

# --- IMPORTATION & NETTOYAGE ---
df_raw <- read_excel("Copie_Panel_X.xlsx", sheet = 1, skip = 3)

colnames(df_raw) <- c(
  "Pays", "Statut", "Annee", "Cle_panel",
  "Credit_growth", "LTV", "DSTI", "LLP_DP", "CCB", "LVR",
  "SIFI", "CONC", "LFC", "RR_FCD", "LCG", "TAX",
  "MPI", "BORROWER",
  "GDP_growth", "Inflation", "Unemployment", "GDPpc_log",
  "Credit_PIB", "Market_Rate",
  "Crisis", "COVID", "FINANCIAL"
)

df <- df_raw %>%
  filter(!is.na(Annee), !is.na(Pays), Annee != "Annee") %>%
  mutate(Annee = as.integer(Annee))


# --- VARIABLES SELECTIONNEES ---
vars_macro <- c("GDP_growth", "Inflation", "Unemployment",
                "GDPpc_log", "Credit_PIB", "Market_Rate", "Credit_growth")

vars_mpi <- c("LTV", "DSTI", "LLP_DP", "CCB", "LVR",
              "SIFI", "CONC", "LFC", "RR_FCD", "LCG", "TAX")


# --- FONCTION : stats pour une variable ---
stats_var <- function(x) {
  c(
    N       = sum(!is.na(x)),
    Moyenne = round(mean(x, na.rm = TRUE), 3),
    Ecart_type = round(sd(x, na.rm = TRUE), 3),
    Min     = round(min(x, na.rm = TRUE), 3),
    P25     = round(quantile(x, 0.25, na.rm = TRUE), 3),
    Mediane = round(median(x, na.rm = TRUE), 3),
    P75     = round(quantile(x, 0.75, na.rm = TRUE), 3),
    Max     = round(max(x, na.rm = TRUE), 3),
    NA_pct  = round(mean(is.na(x)) * 100, 1)
  )
}


# --- TABLEAU VARIABLES MACRO ---
tableau_macro <- do.call(rbind, lapply(vars_macro, function(v) {
  stats_var(df[[v]])
}))
rownames(tableau_macro) <- vars_macro

cat("\n========================================================\n")

========================================================
cat("  STATISTIQUES DESCRIPTIVES — VARIABLES MACROÉCONOMIQUES\n")
  STATISTIQUES DESCRIPTIVES — VARIABLES MACROÉCONOMIQUES
cat("========================================================\n")
========================================================
print(tableau_macro)
                 N Moyenne Ecart_type     Min P25.25% Mediane P75.75%     Max NA_pct
GDP_growth    3289   3.632      5.071 -36.657   1.636   3.803   5.908  63.335   18.3
Inflation     3187   6.638     15.358 -16.860   1.803   3.683   7.446 359.093   20.8
Unemployment  3219   7.650      5.532   0.100   3.740   6.147  10.344  37.320   20.0
GDPpc_log     3293   8.583      1.433   5.493   7.485   8.490   9.759  11.630   18.2
Credit_PIB    3325  54.900     45.524   0.383  21.470  40.996  75.509 301.019   17.4
Market_Rate   1414   6.136      6.896  -0.654   2.291   4.471   7.620  88.140   64.9
Credit_growth 2915   4.522     19.180 -97.827  -4.130   3.761  11.988 196.680   27.6
# --- TABLEAU INSTRUMENTS MPI ---
tableau_mpi <- do.call(rbind, lapply(vars_mpi, function(v) {
  x <- df[[v]]
  c(
    N          = sum(!is.na(x)),
    Moyenne    = round(mean(x, na.rm = TRUE), 3),
    Ecart_type = round(sd(x, na.rm = TRUE), 3),
    Min        = round(min(x, na.rm = TRUE), 3),
    Mediane    = round(median(x, na.rm = TRUE), 3),
    Max        = round(max(x, na.rm = TRUE), 3),
    Taux_activation_pct = round(mean(x == 1, na.rm = TRUE) * 100, 1),
    NA_pct     = round(mean(is.na(x)) * 100, 1)
  )
}))
rownames(tableau_mpi) <- vars_mpi

cat("\n========================================================\n")

========================================================
cat("  STATISTIQUES DESCRIPTIVES — INSTRUMENTS MPI (0/1)\n")
  STATISTIQUES DESCRIPTIVES — INSTRUMENTS MPI (0/1)
cat("========================================================\n")
========================================================
print(tableau_mpi)
          N Moyenne Ecart_type Min Mediane Max Taux_activation_pct NA_pct
LTV    4025   0.081      0.273   0       0   1                 8.1      0
DSTI   4025   0.108      0.311   0       0   1                10.8      0
LLP_DP 4025   0.064      0.244   0       0   1                 6.4      0
CCB    4025   0.072      0.258   0       0   1                 7.2      0
LVR    4025   0.046      0.209   0       0   1                 4.6      0
SIFI   4025   0.120      0.326   0       0   1                12.0      0
CONC   4025   0.076      0.265   0       0   1                 7.6      0
LFC    4025   0.017      0.131   0       0   1                 1.7      0
RR_FCD 4025   0.038      0.192   0       0   1                 3.8      0
LCG    4025   0.010      0.098   0       0   1                 1.0      0
TAX    4025   0.021      0.143   0       0   1                 2.1      0
# =============================================================================
# MODÈLE DE BASE — RÉGRESSION PANEL (VERSION CORRIGÉE)
# Yi,t = a*Yi,t-1 + b*MPI(t-1) + mu_i + lambda_t + e(i,t)
# Y = Credit_growth | Effets fixes pays + année
# =============================================================================

library(readxl)
library(dplyr)
library(plm)
library(lmtest)
library(sandwich)


# --- 1. IMPORTATION & NETTOYAGE ---
df_raw <- read_excel("Copie_Panel_X.xlsx", sheet = 1, skip = 3)

colnames(df_raw) <- c(
  "Pays", "Statut", "Annee", "Cle_panel",
  "Credit_growth", "LTV", "DSTI", "LLP_DP", "CCB", "LVR",
  "SIFI", "CONC", "LFC", "RR_FCD", "LCG", "TAX",
  "MPI", "BORROWER",
  "GDP_growth", "Inflation", "Unemployment", "GDPpc_log",
  "Credit_PIB", "Market_Rate",
  "Crisis", "COVID", "FINANCIAL"
)

df <- df_raw %>%
  filter(!is.na(Annee), !is.na(Pays), Annee != "Annee") %>%
  mutate(Annee = as.integer(Annee))


# --- 2. CRÉATION DES LAGS (correction : dplyr::lag forcé) ---
df <- df %>%
  arrange(Pays, Annee) %>%
  group_by(Pays) %>%
  mutate(
    L_Credit_growth = dplyr::lag(Credit_growth, 1),  # Yi,t-1
    L_MPI           = dplyr::lag(MPI, 1)              # MPI(t-1)
  ) %>%
  ungroup()

cat("Observations totales :", nrow(df), "\n")
Observations totales : 4025 
cat("Observations complètes (sans NA) :",
    sum(complete.cases(df[, c("Credit_growth", "L_Credit_growth", "L_MPI")])), "\n\n")
Observations complètes (sans NA) : 2767 
# Vérification rapide : les deux colonnes ne doivent PAS être identiques
cat("Vérification lag — corrélation Credit_growth vs L_Credit_growth :",
    round(cor(df$Credit_growth, df$L_Credit_growth, use = "complete.obs"), 3),
    "(doit être < 1)\n\n")
Vérification lag — corrélation Credit_growth vs L_Credit_growth : 0.407 (doit être < 1)
# --- 3. DÉCLARATION DU PANEL ---
pdf <- pdata.frame(df, index = c("Pays", "Annee"))


# --- 4. MODÈLE DE BASE ---
modele_base <- plm(
  Credit_growth ~ L_Credit_growth + L_MPI,
  data   = pdf,
  model  = "within",
  effect = "twoways"
)

cat("======================================================\n")
======================================================
cat("  MODÈLE DE BASE — Effets fixes pays + année (within)\n")
  MODÈLE DE BASE — Effets fixes pays + année (within)
cat("======================================================\n")
======================================================
summary(modele_base)
Twoways effects Within Model

Call:
plm(formula = Credit_growth ~ L_Credit_growth + L_MPI, data = pdf, 
    effect = "twoways", model = "within")

Unbalanced Panel: n = 146, T = 2-23, N = 2767

Residuals:
      Min.    1st Qu.     Median    3rd Qu.       Max. 
-85.662206  -6.167051   0.068461   5.698592 157.680534 

Coefficients:
                 Estimate Std. Error t-value Pr(>|t|)    
L_Credit_growth  0.258089   0.018049 14.2993   <2e-16 ***
L_MPI           -0.063680   0.310963 -0.2048   0.8378    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Total Sum of Squares:    662510
Residual Sum of Squares: 614150
R-Squared:      0.072986
Adj. R-Squared: 0.012661
F-statistic: 102.235 on 2 and 2597 DF, p-value: < 2.22e-16
# --- 5. ERREURS ROBUSTES CLUSTÉRISÉES PAR PAYS ---
cat("\n======================================================\n")

======================================================
cat("  RÉSULTATS AVEC ERREURS ROBUSTES (cluster = pays)\n")
  RÉSULTATS AVEC ERREURS ROBUSTES (cluster = pays)
cat("======================================================\n")
======================================================
coeftest(modele_base,
         vcov = vcovHC(modele_base, type = "HC1", cluster = "group"))

t test of coefficients:

                Estimate Std. Error t value  Pr(>|t|)    
L_Credit_growth  0.25809    0.04851  5.3203 1.124e-07 ***
L_MPI           -0.06368    0.25597 -0.2488    0.8036    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# --- 6. TEST EFFETS FIXES ---
cat("\n--- Test de significativité des effets fixes ---\n")

--- Test de significativité des effets fixes ---
pFtest(modele_base,
       plm(Credit_growth ~ L_Credit_growth + L_MPI,
           data = pdf, model = "pooling"))

    F test for twoways effects

data:  Credit_growth ~ L_Credit_growth + L_MPI
F = 4.5097, df1 = 167, df2 = 2597, p-value < 2.2e-16
alternative hypothesis: significant effects
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgpgYGB7cn0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIFNUQVRJU1RJUVVFUyBERVNDUklQVElWRVMgLSBQYW5lbCBNYWNyb3BydWRlbnRpZWwKIyAxNjEgcGF5cyDDlyAyNSBhbnMgKDIwMDAtMjAyNCkgfCA0MDI1IG9ic2VydmF0aW9ucwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIC0tLSAxLiBQQUNLQUdFUyAtLS0KIyBpbnN0YWxsLnBhY2thZ2VzKGMoInJlYWR4bCIsICJkcGx5ciIsICJwc3ljaCIsICJnZ3Bsb3QyIiwgInRpZHlyIiwgImtuaXRyIikpCgpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShkcGx5cikKbGlicmFyeShwc3ljaCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpZHlyKQoKCiMgLS0tIDIuIElNUE9SVEFUSU9OIC0tLQpkZl9yYXcgPC0gcmVhZF9leGNlbCgiQ29waWVfUGFuZWxfWC54bHN4Iiwgc2hlZXQgPSAxLCBza2lwID0gMykKCiMgUmVub21tYWdlIGRlcyBjb2xvbm5lcwpjb2xuYW1lcyhkZl9yYXcpIDwtIGMoCiAgIlBheXMiLCAiU3RhdHV0IiwgIkFubmVlIiwgIkNsZV9wYW5lbCIsCiAgIkNyZWRpdF9ncm93dGgiLCAiTFRWIiwgIkRTVEkiLCAiTExQX0RQIiwgIkNDQiIsICJMVlIiLAogICJTSUZJIiwgIkNPTkMiLCAiTEZDIiwgIlJSX0ZDRCIsICJMQ0ciLCAiVEFYIiwKICAiTVBJIiwgIkJPUlJPV0VSIiwKICAiR0RQX2dyb3d0aCIsICJJbmZsYXRpb24iLCAiVW5lbXBsb3ltZW50IiwgIkdEUHBjX2xvZyIsCiAgIkNyZWRpdF9QSUIiLCAiTWFya2V0X1JhdGUiLAogICJDcmlzaXMiLCAiQ09WSUQiLCAiRklOQU5DSUFMIgopCgojIE5ldHRveWFnZSA6IGxpZ25lcyB2YWxpZGVzIHVuaXF1ZW1lbnQKZGYgPC0gZGZfcmF3ICU+JQogIGZpbHRlcighaXMubmEoQW5uZWUpLCAhaXMubmEoUGF5cyksIEFubmVlICE9ICJBbm5lZSIpICU+JQogIG11dGF0ZShBbm5lZSA9IGFzLmludGVnZXIoQW5uZWUpKQoKY2F0KCJEaW1lbnNpb25zIDoiLCBucm93KGRmKSwgIm9ic2VydmF0aW9ucyB4IiwgbmNvbChkZiksICJ2YXJpYWJsZXNcbiIpCmNhdCgiUGF5cyA6Iiwgbl9kaXN0aW5jdChkZiRQYXlzKSwgInwgQW5uw6llcyA6IiwgbWluKGRmJEFubmVlKSwgIi0iLCBtYXgoZGYkQW5uZWUpLCAiXG5cbiIpCgoKIyAtLS0gMy4gQVBFUsOHVSBHRU5FUkFMIC0tLQpnbGltcHNlKGRmKQoKCiMgLS0tIDQuIFNUQVRJU1RJUVVFUyBERVNDUklQVElWRVMgR0xPQkFMRVMgLS0tCgojIyA0YS4gVmFyaWFibGVzIGNvbnRpbnVlcyA6IG1hY3Jvw6ljb25vbWlxdWVzCnZhcnNfbWFjcm8gPC0gYygiR0RQX2dyb3d0aCIsICJJbmZsYXRpb24iLCAiVW5lbXBsb3ltZW50IiwgIkdEUHBjX2xvZyIsCiAgICAgICAgICAgICAgICAiQ3JlZGl0X1BJQiIsICJNYXJrZXRfUmF0ZSIsICJDcmVkaXRfZ3Jvd3RoIikKCmNhdCgiXG49PT09PT0gVkFSSUFCTEVTIE1BQ1JPw4lDT05PTUlRVUVTID09PT09PVxuIikKZGYgJT4lCiAgc2VsZWN0KGFsbF9vZih2YXJzX21hY3JvKSkgJT4lCiAgZGVzY3JpYmUoKSAlPiUKICBwcmludCgpCgojIyA0Yi4gVmFyaWFibGVzIGQnaW5zdHJ1bWVudHMgbWFjcm9wcnVkZW50aWVscyAoYmluYWlyZXMgMC8xKQp2YXJzX21waSA8LSBjKCJMVFYiLCAiRFNUSSIsICJMTFBfRFAiLCAiQ0NCIiwgIkxWUiIsCiAgICAgICAgICAgICAgIlNJRkkiLCAiQ09OQyIsICJMRkMiLCAiUlJfRkNEIiwgIkxDRyIsICJUQVgiKQoKY2F0KCJcbj09PT09PSBJTlNUUlVNRU5UUyBNQUNST1BSVURFTlRJRUxTICh0YXV4IGQnYWN0aXZhdGlvbikgPT09PT09XG4iKQpkZiAlPiUKICBzZWxlY3QoYWxsX29mKHZhcnNfbXBpKSkgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIH4gbWVhbigueCwgbmEucm0gPSBUUlVFKSkpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIkluc3RydW1lbnQiLCB2YWx1ZXNfdG8gPSAiVGF1eF9hY3RpdmF0aW9uIikgJT4lCiAgbXV0YXRlKFRhdXhfYWN0aXZhdGlvbiA9IHJvdW5kKFRhdXhfYWN0aXZhdGlvbiAqIDEwMCwgMSkpICU+JQogIGFycmFuZ2UoZGVzYyhUYXV4X2FjdGl2YXRpb24pKSAlPiUKICBwcmludCgpCgojIyA0Yy4gSW5kaWNlcyBjb21wb3NpdGVzCmNhdCgiXG49PT09PT0gSU5ESUNFUyBDT01QT1NJVEVTID09PT09PVxuIikKZGYgJT4lCiAgc2VsZWN0KE1QSSwgQk9SUk9XRVIsIEZJTkFOQ0lBTCkgJT4lCiAgZGVzY3JpYmUoKSAlPiUKICBwcmludCgpCgojIyA0ZC4gVmFyaWFibGVzIGJpbmFpcmVzIChjcmlzZSwgQ09WSUQpCmNhdCgiXG49PT09PT0gVkFSSUFCTEVTIElORElDQVRSSUNFUyA9PT09PT1cbiIpCmRmICU+JQogIHN1bW1hcmlzZSgKICAgIFBjdF9DcmlzaXMgID0gcm91bmQobWVhbihDcmlzaXMsICBuYS5ybSA9IFRSVUUpICogMTAwLCAyKSwKICAgIFBjdF9DT1ZJRCAgID0gcm91bmQobWVhbihDT1ZJRCwgICBuYS5ybSA9IFRSVUUpICogMTAwLCAyKQogICkgJT4lCiAgcHJpbnQoKQoKCiMgLS0tIDUuIFNUQVRJU1RJUVVFUyBQQVIgR1JPVVBFIChTdGF0dXQgZGUgZMOpdmVsb3BwZW1lbnQpIC0tLQpjYXQoIlxuPT09PT09IFNUQVRTIFBBUiBTVEFUVVQgKETDqXZlbG9wcGVtZW50IC8gw4ltZXJnZW50IC8gQXZhbmPDqSkgPT09PT09XG4iKQoKZGYgJT4lCiAgZ3JvdXBfYnkoU3RhdHV0KSAlPiUKICBzdW1tYXJpc2UoCiAgICBOICAgICAgICAgICAgID0gbigpLAogICAgR0RQX2dyb3d0aF9tICA9IHJvdW5kKG1lYW4oR0RQX2dyb3d0aCwgIG5hLnJtID0gVFJVRSksIDIpLAogICAgSW5mbGF0aW9uX20gICA9IHJvdW5kKG1lYW4oSW5mbGF0aW9uLCAgIG5hLnJtID0gVFJVRSksIDIpLAogICAgQ3JlZGl0X1BJQl9tICA9IHJvdW5kKG1lYW4oQ3JlZGl0X1BJQiwgIG5hLnJtID0gVFJVRSksIDIpLAogICAgTVBJX21veWVuICAgICA9IHJvdW5kKG1lYW4oTVBJLCAgICAgICAgIG5hLnJtID0gVFJVRSksIDIpLAogICAgRklOQU5DSUFMX20gICA9IHJvdW5kKG1lYW4oRklOQU5DSUFMLCAgIG5hLnJtID0gVFJVRSksIDIpLAogICAgUGN0X0NyaXNpcyAgICA9IHJvdW5kKG1lYW4oQ3Jpc2lzLCAgICAgIG5hLnJtID0gVFJVRSkgKiAxMDAsIDEpCiAgKSAlPiUKICBwcmludCgpCgoKIyAtLS0gNi4gRVZPTFVUSU9OIFRFTVBPUkVMTEUgLS0tCmNhdCgiXG49PT09PT0gw4lWT0xVVElPTiBBTk5VRUxMRSBNT1lFTk5FID09PT09PVxuIikKCmV2b2x1dGlvbiA8LSBkZiAlPiUKICBncm91cF9ieShBbm5lZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgTVBJX21veSAgICAgICAgICA9IHJvdW5kKG1lYW4oTVBJLCAgICAgICAgIG5hLnJtID0gVFJVRSksIDMpLAogICAgR0RQX2dyb3d0aF9tb3kgICA9IHJvdW5kKG1lYW4oR0RQX2dyb3d0aCwgIG5hLnJtID0gVFJVRSksIDIpLAogICAgQ3JlZGl0X1BJQl9tb3kgICA9IHJvdW5kKG1lYW4oQ3JlZGl0X1BJQiwgIG5hLnJtID0gVFJVRSksIDIpLAogICAgTl9vYnMgICAgICAgICAgICA9IG4oKQogICkKcHJpbnQoZXZvbHV0aW9uKQoKCiMgLS0tIDcuIFZBTEVVUlMgTUFOUVVBTlRFUyAtLS0KY2F0KCJcbj09PT09PSBWQUxFVVJTIE1BTlFVQU5URVMgKCUpID09PT09PVxuIikKZGYgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIH4gcm91bmQobWVhbihpcy5uYSgueCkpICogMTAwLCAxKSkpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIlZhcmlhYmxlIiwgdmFsdWVzX3RvID0gIlBjdF9OQSIpICU+JQogIGZpbHRlcihQY3RfTkEgPiAwKSAlPiUKICBhcnJhbmdlKGRlc2MoUGN0X05BKSkgJT4lCiAgcHJpbnQoKQoKCiMgLS0tIDguIEdSQVBISVFVRVMgLS0tCgojIyA4YS4gRGlzdHJpYnV0aW9uIGRlIEdEUF9ncm93dGgKcDEgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IEdEUF9ncm93dGgpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxLCBmaWxsID0gIiMyQzdCQjYiLCBjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44KSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gZGUgbGEgY3JvaXNzYW5jZSBkdSBQSUIiLAogICAgICAgeCA9ICJDcm9pc3NhbmNlIGR1IFBJQiAoJSkiLCB5ID0gIkZyw6lxdWVuY2UiKSArCiAgdGhlbWVfbWluaW1hbCgpCnByaW50KHAxKQoKIyMgOGIuIE1QSSBtb3llbiBwYXIgc3RhdHV0IGF1IGZpbCBkdSB0ZW1wcwpwMiA8LSBkZiAlPiUKICBncm91cF9ieShBbm5lZSwgU3RhdHV0KSAlPiUKICBzdW1tYXJpc2UoTVBJX21veSA9IG1lYW4oTVBJLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBBbm5lZSwgeSA9IE1QSV9tb3ksIGNvbG9yID0gU3RhdHV0KSkgKwogIGdlb21fbGluZShsaW5ld2lkdGggPSAxKSArCiAgbGFicyh0aXRsZSA9ICLDiXZvbHV0aW9uIGRlIGwnaW5kaWNlIE1QSSBtb3llbiBwYXIgZ3JvdXBlIiwKICAgICAgIHggPSAiQW5uw6llIiwgeSA9ICJNUEkgbW95ZW4gKDAtMTEpIiwgY29sb3IgPSAiU3RhdHV0IikgKwogIHRoZW1lX21pbmltYWwoKQpwcmludChwMikKCiMjIDhjLiBUYXV4IGQnYWN0aXZhdGlvbiBkZXMgaW5zdHJ1bWVudHMgTVBJCmRmICU+JQogIHNlbGVjdChhbGxfb2YodmFyc19tcGkpKSAlPiUKICBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgfiBtZWFuKC54LCBuYS5ybSA9IFRSVUUpICogMTAwKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiSW5zdHJ1bWVudCIsIHZhbHVlc190byA9ICJQY3QiKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKEluc3RydW1lbnQsIFBjdCksIHkgPSBQY3QsIGZpbGwgPSBQY3QpKSArCiAgZ2VvbV9jb2woKSArCiAgY29vcmRfZmxpcCgpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICIjRDdFOUY3IiwgaGlnaCA9ICIjMUE1Mjc2IikgKwogIGxhYnModGl0bGUgPSAiVGF1eCBkJ2FjdGl2YXRpb24gZGVzIGluc3RydW1lbnRzIG1hY3JvcHJ1ZGVudGllbHMgKCUpIiwKICAgICAgIHggPSAiIiwgeSA9ICIlIGQnb2JzZXJ2YXRpb25zIGFjdGl2ZXMiLCBmaWxsID0gIiUiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpIC0+IHAzCnByaW50KHAzKQoKIyMgOGQuIEJveHBsb3QgR0RQIGdyb3d0aCBwYXIgc3RhdHV0CnA0IDwtIGdncGxvdChkZiwgYWVzKHggPSBTdGF0dXQsIHkgPSBHRFBfZ3Jvd3RoLCBmaWxsID0gU3RhdHV0KSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLmFscGhhID0gMC4zKSArCiAgbGFicyh0aXRsZSA9ICJDcm9pc3NhbmNlIGR1IFBJQiBwYXIgc3RhdHV0IGRlIGTDqXZlbG9wcGVtZW50IiwKICAgICAgIHggPSAiU3RhdHV0IiwgeSA9ICJDcm9pc3NhbmNlIGR1IFBJQiAoJSkiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCnByaW50KHA0KQoKY2F0KCJcbuKchSBBbmFseXNlIHRlcm1pbsOpZS5cbiIpCmBgYAoKYGBge3J9CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBUQUJMRUFVIERFIFNUQVRJU1RJUVVFUyBERVNDUklQVElWRVMKIyBWYXJpYWJsZXMgbWFjcm8gKyBJbnN0cnVtZW50cyBNUEkKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCgojIC0tLSBJTVBPUlRBVElPTiAmIE5FVFRPWUFHRSAtLS0KZGZfcmF3IDwtIHJlYWRfZXhjZWwoIkNvcGllX1BhbmVsX1gueGxzeCIsIHNoZWV0ID0gMSwgc2tpcCA9IDMpCgpjb2xuYW1lcyhkZl9yYXcpIDwtIGMoCiAgIlBheXMiLCAiU3RhdHV0IiwgIkFubmVlIiwgIkNsZV9wYW5lbCIsCiAgIkNyZWRpdF9ncm93dGgiLCAiTFRWIiwgIkRTVEkiLCAiTExQX0RQIiwgIkNDQiIsICJMVlIiLAogICJTSUZJIiwgIkNPTkMiLCAiTEZDIiwgIlJSX0ZDRCIsICJMQ0ciLCAiVEFYIiwKICAiTVBJIiwgIkJPUlJPV0VSIiwKICAiR0RQX2dyb3d0aCIsICJJbmZsYXRpb24iLCAiVW5lbXBsb3ltZW50IiwgIkdEUHBjX2xvZyIsCiAgIkNyZWRpdF9QSUIiLCAiTWFya2V0X1JhdGUiLAogICJDcmlzaXMiLCAiQ09WSUQiLCAiRklOQU5DSUFMIgopCgpkZiA8LSBkZl9yYXcgJT4lCiAgZmlsdGVyKCFpcy5uYShBbm5lZSksICFpcy5uYShQYXlzKSwgQW5uZWUgIT0gIkFubmVlIikgJT4lCiAgbXV0YXRlKEFubmVlID0gYXMuaW50ZWdlcihBbm5lZSkpCgoKIyAtLS0gVkFSSUFCTEVTIFNFTEVDVElPTk5FRVMgLS0tCnZhcnNfbWFjcm8gPC0gYygiR0RQX2dyb3d0aCIsICJJbmZsYXRpb24iLCAiVW5lbXBsb3ltZW50IiwKICAgICAgICAgICAgICAgICJHRFBwY19sb2ciLCAiQ3JlZGl0X1BJQiIsICJNYXJrZXRfUmF0ZSIsICJDcmVkaXRfZ3Jvd3RoIikKCnZhcnNfbXBpIDwtIGMoIkxUViIsICJEU1RJIiwgIkxMUF9EUCIsICJDQ0IiLCAiTFZSIiwKICAgICAgICAgICAgICAiU0lGSSIsICJDT05DIiwgIkxGQyIsICJSUl9GQ0QiLCAiTENHIiwgIlRBWCIpCgoKIyAtLS0gRk9OQ1RJT04gOiBzdGF0cyBwb3VyIHVuZSB2YXJpYWJsZSAtLS0Kc3RhdHNfdmFyIDwtIGZ1bmN0aW9uKHgpIHsKICBjKAogICAgTiAgICAgICA9IHN1bSghaXMubmEoeCkpLAogICAgTW95ZW5uZSA9IHJvdW5kKG1lYW4oeCwgbmEucm0gPSBUUlVFKSwgMyksCiAgICBFY2FydF90eXBlID0gcm91bmQoc2QoeCwgbmEucm0gPSBUUlVFKSwgMyksCiAgICBNaW4gICAgID0gcm91bmQobWluKHgsIG5hLnJtID0gVFJVRSksIDMpLAogICAgUDI1ICAgICA9IHJvdW5kKHF1YW50aWxlKHgsIDAuMjUsIG5hLnJtID0gVFJVRSksIDMpLAogICAgTWVkaWFuZSA9IHJvdW5kKG1lZGlhbih4LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgIFA3NSAgICAgPSByb3VuZChxdWFudGlsZSh4LCAwLjc1LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgIE1heCAgICAgPSByb3VuZChtYXgoeCwgbmEucm0gPSBUUlVFKSwgMyksCiAgICBOQV9wY3QgID0gcm91bmQobWVhbihpcy5uYSh4KSkgKiAxMDAsIDEpCiAgKQp9CgoKIyAtLS0gVEFCTEVBVSBWQVJJQUJMRVMgTUFDUk8gLS0tCnRhYmxlYXVfbWFjcm8gPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHZhcnNfbWFjcm8sIGZ1bmN0aW9uKHYpIHsKICBzdGF0c192YXIoZGZbW3ZdXSkKfSkpCnJvd25hbWVzKHRhYmxlYXVfbWFjcm8pIDwtIHZhcnNfbWFjcm8KCmNhdCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKY2F0KCIgIFNUQVRJU1RJUVVFUyBERVNDUklQVElWRVMg4oCUIFZBUklBQkxFUyBNQUNST8OJQ09OT01JUVVFU1xuIikKY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKcHJpbnQodGFibGVhdV9tYWNybykKCgojIC0tLSBUQUJMRUFVIElOU1RSVU1FTlRTIE1QSSAtLS0KdGFibGVhdV9tcGkgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KHZhcnNfbXBpLCBmdW5jdGlvbih2KSB7CiAgeCA8LSBkZltbdl1dCiAgYygKICAgIE4gICAgICAgICAgPSBzdW0oIWlzLm5hKHgpKSwKICAgIE1veWVubmUgICAgPSByb3VuZChtZWFuKHgsIG5hLnJtID0gVFJVRSksIDMpLAogICAgRWNhcnRfdHlwZSA9IHJvdW5kKHNkKHgsIG5hLnJtID0gVFJVRSksIDMpLAogICAgTWluICAgICAgICA9IHJvdW5kKG1pbih4LCBuYS5ybSA9IFRSVUUpLCAzKSwKICAgIE1lZGlhbmUgICAgPSByb3VuZChtZWRpYW4oeCwgbmEucm0gPSBUUlVFKSwgMyksCiAgICBNYXggICAgICAgID0gcm91bmQobWF4KHgsIG5hLnJtID0gVFJVRSksIDMpLAogICAgVGF1eF9hY3RpdmF0aW9uX3BjdCA9IHJvdW5kKG1lYW4oeCA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwLCAxKSwKICAgIE5BX3BjdCAgICAgPSByb3VuZChtZWFuKGlzLm5hKHgpKSAqIDEwMCwgMSkKICApCn0pKQpyb3duYW1lcyh0YWJsZWF1X21waSkgPC0gdmFyc19tcGkKCmNhdCgiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKY2F0KCIgIFNUQVRJU1RJUVVFUyBERVNDUklQVElWRVMg4oCUIElOU1RSVU1FTlRTIE1QSSAoMC8xKVxuIikKY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKcHJpbnQodGFibGVhdV9tcGkpCmBgYApgYGB7cn0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE1PRMOITEUgREUgQkFTRSDigJQgUsOJR1JFU1NJT04gUEFORUwgKFZFUlNJT04gQ09SUklHw4lFKQojIFlpLHQgPSBhKllpLHQtMSArIGIqTVBJKHQtMSkgKyBtdV9pICsgbGFtYmRhX3QgKyBlKGksdCkKIyBZID0gQ3JlZGl0X2dyb3d0aCB8IEVmZmV0cyBmaXhlcyBwYXlzICsgYW5uw6llCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHBsbSkKbGlicmFyeShsbXRlc3QpCmxpYnJhcnkoc2FuZHdpY2gpCgoKIyAtLS0gMS4gSU1QT1JUQVRJT04gJiBORVRUT1lBR0UgLS0tCmRmX3JhdyA8LSByZWFkX2V4Y2VsKCJDb3BpZV9QYW5lbF9YLnhsc3giLCBzaGVldCA9IDEsIHNraXAgPSAzKQoKY29sbmFtZXMoZGZfcmF3KSA8LSBjKAogICJQYXlzIiwgIlN0YXR1dCIsICJBbm5lZSIsICJDbGVfcGFuZWwiLAogICJDcmVkaXRfZ3Jvd3RoIiwgIkxUViIsICJEU1RJIiwgIkxMUF9EUCIsICJDQ0IiLCAiTFZSIiwKICAiU0lGSSIsICJDT05DIiwgIkxGQyIsICJSUl9GQ0QiLCAiTENHIiwgIlRBWCIsCiAgIk1QSSIsICJCT1JST1dFUiIsCiAgIkdEUF9ncm93dGgiLCAiSW5mbGF0aW9uIiwgIlVuZW1wbG95bWVudCIsICJHRFBwY19sb2ciLAogICJDcmVkaXRfUElCIiwgIk1hcmtldF9SYXRlIiwKICAiQ3Jpc2lzIiwgIkNPVklEIiwgIkZJTkFOQ0lBTCIKKQoKZGYgPC0gZGZfcmF3ICU+JQogIGZpbHRlcighaXMubmEoQW5uZWUpLCAhaXMubmEoUGF5cyksIEFubmVlICE9ICJBbm5lZSIpICU+JQogIG11dGF0ZShBbm5lZSA9IGFzLmludGVnZXIoQW5uZWUpKQoKCiMgLS0tIDIuIENSw4lBVElPTiBERVMgTEFHUyAoY29ycmVjdGlvbiA6IGRwbHlyOjpsYWcgZm9yY8OpKSAtLS0KZGYgPC0gZGYgJT4lCiAgYXJyYW5nZShQYXlzLCBBbm5lZSkgJT4lCiAgZ3JvdXBfYnkoUGF5cykgJT4lCiAgbXV0YXRlKAogICAgTF9DcmVkaXRfZ3Jvd3RoID0gZHBseXI6OmxhZyhDcmVkaXRfZ3Jvd3RoLCAxKSwgICMgWWksdC0xCiAgICBMX01QSSAgICAgICAgICAgPSBkcGx5cjo6bGFnKE1QSSwgMSkgICAgICAgICAgICAgICMgTVBJKHQtMSkKICApICU+JQogIHVuZ3JvdXAoKQoKY2F0KCJPYnNlcnZhdGlvbnMgdG90YWxlcyA6IiwgbnJvdyhkZiksICJcbiIpCmNhdCgiT2JzZXJ2YXRpb25zIGNvbXBsw6h0ZXMgKHNhbnMgTkEpIDoiLAogICAgc3VtKGNvbXBsZXRlLmNhc2VzKGRmWywgYygiQ3JlZGl0X2dyb3d0aCIsICJMX0NyZWRpdF9ncm93dGgiLCAiTF9NUEkiKV0pKSwgIlxuXG4iKQoKIyBWw6lyaWZpY2F0aW9uIHJhcGlkZSA6IGxlcyBkZXV4IGNvbG9ubmVzIG5lIGRvaXZlbnQgUEFTIMOqdHJlIGlkZW50aXF1ZXMKY2F0KCJWw6lyaWZpY2F0aW9uIGxhZyDigJQgY29ycsOpbGF0aW9uIENyZWRpdF9ncm93dGggdnMgTF9DcmVkaXRfZ3Jvd3RoIDoiLAogICAgcm91bmQoY29yKGRmJENyZWRpdF9ncm93dGgsIGRmJExfQ3JlZGl0X2dyb3d0aCwgdXNlID0gImNvbXBsZXRlLm9icyIpLCAzKSwKICAgICIoZG9pdCDDqnRyZSA8IDEpXG5cbiIpCgoKIyAtLS0gMy4gRMOJQ0xBUkFUSU9OIERVIFBBTkVMIC0tLQpwZGYgPC0gcGRhdGEuZnJhbWUoZGYsIGluZGV4ID0gYygiUGF5cyIsICJBbm5lZSIpKQoKCiMgLS0tIDQuIE1PRMOITEUgREUgQkFTRSAtLS0KbW9kZWxlX2Jhc2UgPC0gcGxtKAogIENyZWRpdF9ncm93dGggfiBMX0NyZWRpdF9ncm93dGggKyBMX01QSSwKICBkYXRhICAgPSBwZGYsCiAgbW9kZWwgID0gIndpdGhpbiIsCiAgZWZmZWN0ID0gInR3b3dheXMiCikKCmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQpjYXQoIiAgTU9Ew4hMRSBERSBCQVNFIOKAlCBFZmZldHMgZml4ZXMgcGF5cyArIGFubsOpZSAod2l0aGluKVxuIikKY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpCnN1bW1hcnkobW9kZWxlX2Jhc2UpCgoKIyAtLS0gNS4gRVJSRVVSUyBST0JVU1RFUyBDTFVTVMOJUklTw4lFUyBQQVIgUEFZUyAtLS0KY2F0KCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIikKY2F0KCIgIFLDiVNVTFRBVFMgQVZFQyBFUlJFVVJTIFJPQlVTVEVTIChjbHVzdGVyID0gcGF5cylcbiIpCmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQoKY29lZnRlc3QobW9kZWxlX2Jhc2UsCiAgICAgICAgIHZjb3YgPSB2Y292SEMobW9kZWxlX2Jhc2UsIHR5cGUgPSAiSEMxIiwgY2x1c3RlciA9ICJncm91cCIpKQoKCiMgLS0tIDYuIFRFU1QgRUZGRVRTIEZJWEVTIC0tLQpjYXQoIlxuLS0tIFRlc3QgZGUgc2lnbmlmaWNhdGl2aXTDqSBkZXMgZWZmZXRzIGZpeGVzIC0tLVxuIikKcEZ0ZXN0KG1vZGVsZV9iYXNlLAogICAgICAgcGxtKENyZWRpdF9ncm93dGggfiBMX0NyZWRpdF9ncm93dGggKyBMX01QSSwKICAgICAgICAgICBkYXRhID0gcGRmLCBtb2RlbCA9ICJwb29saW5nIikpCmBgYAoKCg==