Packages

library(tidyverse)
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     
── Attaching packages ───────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
āœ” ggplot2 3.2.0     āœ” purrr   0.3.2
āœ” tibble  2.1.3     āœ” dplyr   0.8.3
āœ” tidyr   0.8.3     āœ” stringr 1.4.0
āœ” readr   1.3.1     āœ” forcats 0.4.0
── Conflicts ──────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
āœ– dplyr::filter() masks stats::filter()
āœ– dplyr::lag()    masks stats::lag()
# install.packages("mada")
# install.packages("meta")
library(mada)
Loading required package: mvtnorm
Loading required package: ellipse

Attaching package: ā€˜ellipse’

The following object is masked from ā€˜package:graphics’:

    pairs

Loading required package: mvmeta
This is mvmeta 0.4.11. For an overview type: help('mvmeta-package').

Attaching package: ā€˜mada’

The following object is masked from ā€˜package:readr’:

    spec
library(meta)
Loading 'meta' package (version 4.9-5).
Type 'help(meta)' for a brief overview.

Attaching package: ā€˜meta’

The following object is masked from ā€˜package:mada’:

    forest

Dataset

# install.packages("rapportools")
df$SIGNO <- rapportools::tocamel(df$SIGNO) 
df <- df %>% 
  mutate(SIGNO = case_when(
    SIGNO == "InterrupciónDeLaCorticalCanalMandibular" ~ "InterrupciónDeCorticalCanalMandibular",
    SIGNO == "OscurecimientoDeLaRaiz" ~ "OscurecimientoDeLasRaices", 
    TRUE ~ as.character(SIGNO)
  ))
df <- janitor::clean_names(df)
aNumero <- function(x, na.rm = FALSE) (as.integer(x))
df <- df %>% 
  mutate_at(c("a_seleccion_pacientes", 
              "a_referencia_estandar", 
              "especificidad"), aNumero)

EDA

table(df$autor)

     A. HASANI       A. KADAM        A.JHAMB   H. GHAEMINIA   L. H. MATZEN      S. KURSUN TANTANAPORNKUL 
            12              4             12             10              6              5              8 

Calidad

df %>% 
  mutate(riesgoDeSesgo = rs_seleccion_paciente + rs_test_indice + rs_referencia_estandar) %>% 
  mutate(aplicabilidad = a_flujo_y_tiempo + a_seleccion_pacientes + a_test_indice + a_referencia_estandar) %>% 
  group_by(autor) %>% 
  summarise(sesgo = mean(riesgoDeSesgo), aplicab = mean(aplicabilidad))

Meta-analysis

table(df$signo)

                DesviaciónDeLasRaices          DesviaciónDelCanalMandibular                  DilaceraciónDeRaices 
                                    5                                    12                                     1 
            EstrechamientoDeLasRaices      EstrechamientoDelCanalMandibular InterrupciónDeCorticalCanalMandibular 
                                    4                                     5                                    12 
            OscurecimientoDeLasRaices  OscurecimientoYDobleContornoDeRaices  SuperposiciónRaicesEnCanalMandibular 
                                   10                                     5                                     3 
df %>% 
  mutate_if(is.character, funs(factor(trimws(.)))) %>% 
  group_by(signo) %>% 
  summarise(n = n())

Creo los totales

df <- df %>% 
  mutate(n1 = vp + fp, 
         n2 = vn + fn)
md1 <- df %>% 
  select(autor, 
         TP = vp, 
         FP = fp, 
         TN = vn, 
         FN = fn) %>% 
  na.omit() %>% 
  madad(., level = 0.95)
Unknown or uninitialised column: 'names'.
print(md1, digits = 2)
Descriptive summary of . with 42 primary studies.
Confidence level for all calculations set to 95 %
Using a continuity correction of 0.5 if applicable 

Diagnostic accuracies 
      sens 2.5% 97.5% spec 2.5% 97.5%
 [1,] 0.98 0.83  1.00 0.05 0.01  0.19
 [2,] 0.98 0.83  1.00 0.05 0.01  0.19
 [3,] 0.98 0.83  1.00 0.05 0.01  0.19
 [4,] 0.98 0.83  1.00 0.05 0.01  0.19
 [5,] 0.98 0.83  1.00 0.05 0.01  0.19
 [6,] 0.94 0.77  0.99 0.24 0.13  0.42
 [7,] 0.94 0.77  0.99 0.24 0.13  0.42
 [8,] 0.94 0.77  0.99 0.24 0.13  0.42
 [9,] 0.94 0.77  0.99 0.24 0.13  0.42
[10,] 0.94 0.77  0.99 0.24 0.13  0.42
[11,] 0.70 0.51  0.83 0.73 0.64  0.81
[12,] 0.70 0.51  0.83 0.73 0.64  0.81
[13,] 0.70 0.51  0.83 0.73 0.64  0.81
[14,] 0.70 0.51  0.83 0.73 0.64  0.81
[15,] 0.91 0.75  0.97 0.67 0.59  0.75
[16,] 0.91 0.75  0.97 0.67 0.59  0.75
[17,] 0.91 0.75  0.97 0.67 0.59  0.75
[18,] 0.91 0.75  0.97 0.67 0.59  0.75
[19,] 0.96 0.86  0.99 0.02 0.00  0.20
[20,] 0.96 0.86  0.99 0.02 0.00  0.20
[21,] 0.96 0.86  0.99 0.02 0.00  0.20
[22,] 0.96 0.86  0.99 0.02 0.00  0.20
[23,] 0.96 0.86  0.99 0.02 0.00  0.20
[24,] 0.96 0.86  0.99 0.02 0.00  0.20
[25,] 0.92 0.79  0.97 0.92 0.73  0.98
[26,] 0.92 0.79  0.97 0.92 0.73  0.98
[27,] 0.92 0.79  0.97 0.92 0.73  0.98
[28,] 0.92 0.79  0.97 0.92 0.73  0.98
[29,] 0.92 0.79  0.97 0.92 0.73  0.98
[30,] 0.92 0.79  0.97 0.92 0.73  0.98
[31,] 0.95 0.66  0.99 0.54 0.35  0.73
[32,] 0.95 0.66  0.99 0.54 0.35  0.73
[33,] 0.95 0.66  0.99 0.54 0.35  0.73
[34,] 0.95 0.66  0.99 0.54 0.35  0.73
[35,] 0.95 0.66  0.99 0.54 0.35  0.73
[36,] 0.95 0.66  0.99 0.54 0.35  0.73
[37,] 0.85 0.54  0.96 0.93 0.76  0.98
[38,] 0.85 0.54  0.96 0.93 0.76  0.98
[39,] 0.85 0.54  0.96 0.93 0.76  0.98
[40,] 0.85 0.54  0.96 0.93 0.76  0.98
[41,] 0.85 0.54  0.96 0.93 0.76  0.98
[42,] 0.85 0.54  0.96 0.93 0.76  0.98

Test for equality of sensitivities: 
X-squared = 84.9717, df = 41, p-value = 6.6e-05
Test for equality of specificities: 
X-squared = 590.0949, df = 41, p-value = <2e-16


Diagnostic OR and likelihood ratios 
         DOR  2.5%  97.5% posLR 2.5% 97.5% negLR 2.5% 97.5%
 [1,]   2.39  0.09  61.40  1.03 0.93  1.14  0.43 0.02 10.11
 [2,]   2.39  0.09  61.40  1.03 0.93  1.14  0.43 0.02 10.11
 [3,]   2.39  0.09  61.40  1.03 0.93  1.14  0.43 0.02 10.11
 [4,]   2.39  0.09  61.40  1.03 0.93  1.14  0.43 0.02 10.11
 [5,]   2.39  0.09  61.40  1.03 0.93  1.14  0.43 0.02 10.11
 [6,]   4.79  0.76  30.32  1.24 0.99  1.55  0.26 0.05  1.37
 [7,]   4.79  0.76  30.32  1.24 0.99  1.55  0.26 0.05  1.37
 [8,]   4.79  0.76  30.32  1.24 0.99  1.55  0.26 0.05  1.37
 [9,]   4.79  0.76  30.32  1.24 0.99  1.55  0.26 0.05  1.37
[10,]   4.79  0.76  30.32  1.24 0.99  1.55  0.26 0.05  1.37
[11,]   6.28  2.50  15.75  2.60 1.73  3.91  0.41 0.23  0.74
[12,]   6.28  2.50  15.75  2.60 1.73  3.91  0.41 0.23  0.74
[13,]   6.28  2.50  15.75  2.60 1.73  3.91  0.41 0.23  0.74
[14,]   6.28  2.50  15.75  2.60 1.73  3.91  0.41 0.23  0.74
[15,]  20.99  5.45  80.83  2.78 2.13  3.65  0.13 0.04  0.44
[16,]  20.99  5.45  80.83  2.78 2.13  3.65  0.13 0.04  0.44
[17,]  20.99  5.45  80.83  2.78 2.13  3.65  0.13 0.04  0.44
[18,]  20.99  5.45  80.83  2.78 2.13  3.65  0.13 0.04  0.44
[19,]   0.69  0.03  17.78  0.99 0.90  1.08  1.43 0.06 33.54
[20,]   0.69  0.03  17.78  0.99 0.90  1.08  1.43 0.06 33.54
[21,]   0.69  0.03  17.78  0.99 0.90  1.08  1.43 0.06 33.54
[22,]   0.69  0.03  17.78  0.99 0.90  1.08  1.43 0.06 33.54
[23,]   0.69  0.03  17.78  0.99 0.90  1.08  1.43 0.06 33.54
[24,]   0.69  0.03  17.78  0.99 0.90  1.08  1.43 0.06 33.54
[25,] 135.67 18.52 993.94 12.22 2.62 57.12  0.09 0.03  0.25
[26,] 135.67 18.52 993.94 12.22 2.62 57.12  0.09 0.03  0.25
[27,] 135.67 18.52 993.94 12.22 2.62 57.12  0.09 0.03  0.25
[28,] 135.67 18.52 993.94 12.22 2.62 57.12  0.09 0.03  0.25
[29,] 135.67 18.52 993.94 12.22 2.62 57.12  0.09 0.03  0.25
[30,] 135.67 18.52 993.94 12.22 2.62 57.12  0.09 0.03  0.25
[31,]  22.62  1.17 436.42  2.08 1.30  3.32  0.09 0.01  1.41
[32,]  22.62  1.17 436.42  2.08 1.30  3.32  0.09 0.01  1.41
[33,]  22.62  1.17 436.42  2.08 1.30  3.32  0.09 0.01  1.41
[34,]  22.62  1.17 436.42  2.08 1.30  3.32  0.09 0.01  1.41
[35,]  22.62  1.17 436.42  2.08 1.30  3.32  0.09 0.01  1.41
[36,]  22.62  1.17 436.42  2.08 1.30  3.32  0.09 0.01  1.41
[37,]  81.22  7.38 893.94 13.03 2.71 62.58  0.16 0.04  0.70
[38,]  81.22  7.38 893.94 13.03 2.71 62.58  0.16 0.04  0.70
[39,]  81.22  7.38 893.94 13.03 2.71 62.58  0.16 0.04  0.70
[40,]  81.22  7.38 893.94 13.03 2.71 62.58  0.16 0.04  0.70
[41,]  81.22  7.38 893.94 13.03 2.71 62.58  0.16 0.04  0.70
[42,]  81.22  7.38 893.94 13.03 2.71 62.58  0.16 0.04  0.70

Correlation of sensitivities and false positive rates: 
   rho  2.5 % 97.5 % 
  0.58   0.33   0.75 
oldpar <- par(mfrow=c(1, 2), pty="m")

Desviación raíces / clinica

md1 <- df %>% 
  filter(signo == "DesviaciónDeLasRaices") %>% 
  select(autor, 
         TP = vp, 
         FP = fp, 
         TN = vn, 
         FN = fn) %>% 
  na.omit() %>% 
  madad(., level = 0.95)
Unknown or uninitialised column: 'names'.
md1  
Descriptive summary of . with 5 primary studies.
Confidence level for all calculations set to 95 %
Using a continuity correction of 0.5 if applicable 

Diagnostic accuracies 
      sens  2.5% 97.5%  spec  2.5% 97.5%
[1,] 0.979 0.828 0.998 0.048 0.011 0.185
[2,] 0.938 0.769 0.985 0.242 0.125 0.415
[3,] 0.911 0.750 0.972 0.673 0.589 0.747
[4,] 0.950 0.655 0.995 0.543 0.349 0.726
[5,] 0.850 0.541 0.965 0.935 0.760 0.985

Test for equality of sensitivities: 
X-squared = 2.1747, df = 4, p-value = 0.704
Test for equality of specificities: 
X-squared = 65.2807, df = 4, p-value = 2.25e-13


Diagnostic OR and likelihood ratios 
        DOR  2.5%   97.5%  posLR  2.5%  97.5% negLR  2.5%  97.5%
[1,]  2.390 0.093  61.399  1.029 0.932  1.135 0.431 0.018 10.107
[2,]  4.787 0.756  30.322  1.237 0.988  1.547 0.258 0.049  1.372
[3,] 20.986 5.449  80.832  2.784 2.126  3.647 0.133 0.040  0.436
[4,] 22.619 1.172 436.417  2.081 1.303  3.323 0.092 0.006  1.407
[5,] 81.222 7.380 893.939 13.033 2.714 62.584 0.160 0.037  0.704

Correlation of sensitivities and false positive rates: 
   rho  2.5 % 97.5 % 
 0.901  0.091  0.994 

mada::forest(md1, type = "sens", main = "Sensibilidad", xlab = "Sensibilidad")

mada::forest(md1, type = "spec", main = "Especificidad")

mada::forest(md1, type = "DOR", log = TRUE,  main = "Log DOR")

DesviaciónDelCanalMandibular 2 10

md2 <- df %>%
  select(autor,
         signo, 
         gold_standard, 
         test, 
         TP = vp, 
         FP = fp, 
         TN = vn, 
         FN = fn) %>%
  filter(TP > 0) %>% 
  filter(test == "OPG") %>% 
  filter(signo == "DesviaciónDelCanalMandibular") %>%
  madad(., level = 0.95)
Unknown or uninitialised column: 'names'.There are very few primary studies!
md2  
Descriptive summary of . with 4 primary studies.
Confidence level for all calculations set to 95 %
Using a continuity correction of 0.5 if applicable 

Diagnostic accuracies 
      sens  2.5% 97.5%  spec  2.5% 97.5%
[1,] 0.979 0.828 0.998 0.048 0.011 0.185
[2,] 0.696 0.511 0.834 0.732 0.638 0.810
[3,] 0.964 0.859 0.992 0.025 0.003 0.200
[4,] 0.950 0.655 0.995 0.543 0.349 0.726

Test for equality of sensitivities: 
X-squared = 15.9214, df = 3, p-value = 0.00118
Test for equality of specificities: 
X-squared = 64.8844, df = 3, p-value = 5.31e-14


Diagnostic OR and likelihood ratios 
        DOR  2.5%   97.5% posLR  2.5% 97.5% negLR  2.5%  97.5%
[1,]  2.390 0.093  61.399 1.029 0.932 1.135 0.431 0.018 10.107
[2,]  6.276 2.501  15.753 2.602 1.731 3.910 0.415 0.234  0.736
[3,]  0.692 0.027  17.781 0.989 0.903 1.083 1.429 0.061 33.538
[4,] 22.619 1.172 436.417 2.081 1.303 3.323 0.092 0.006  1.407

Correlation of sensitivities and false positive rates: 
   rho  2.5 % 97.5 % 
 0.787 -0.714  0.995 
mada::forest(md1, type = "sens", main = "Sensibilidad", xlab = "Sensibilidad")

mada::forest(md2, type = "spec", main = "Especificidad")

mada::forest(md2, type = "DOR", log = TRUE,  main = "Log DOR")

DilaceraciónDeRaices 1 0

Sin artĆ­culos para OPG

EstrechamientoDeLasRaices 0 4

md4  
Descriptive summary of . with 2 primary studies.
Confidence level for all calculations set to 95 %
Using a continuity correction of 0.5 if applicable 

Diagnostic accuracies 
      sens  2.5% 97.5%  spec  2.5% 97.5%
[1,] 0.696 0.511 0.834 0.732 0.638 0.810
[2,] 0.950 0.655 0.995 0.543 0.349 0.726

Test for equality of sensitivities: 
X-squared = 1.406, df = 1, p-value = 0.236
Test for equality of specificities: 
X-squared = 2.3197, df = 1, p-value = 0.128


Diagnostic OR and likelihood ratios 
        DOR  2.5%   97.5% posLR  2.5% 97.5% negLR  2.5% 97.5%
[1,]  6.276 2.501  15.753 2.602 1.731 3.910 0.415 0.234 0.736
[2,] 22.619 1.172 436.417 2.081 1.303 3.323 0.092 0.006 1.407

Correlation of sensitivities and false positive rates: 
Error in CIrho(x$cor_sens_fpr, x$nobs) : rho < 1 is not TRUE

EstrechamientoDelCanalMandibular 1 4

md5  
Descriptive summary of . with 2 primary studies.
Confidence level for all calculations set to 95 %
Using a continuity correction of 0.5 if applicable 

Diagnostic accuracies 
      sens  2.5% 97.5%  spec  2.5% 97.5%
[1,] 0.979 0.828 0.998 0.048 0.011 0.185
[2,] 0.964 0.859 0.992 0.025 0.003 0.200

Test for equality of sensitivities: 
X-squared = 0, df = 1, p-value = 1
Test for equality of specificities: 
X-squared = 0, df = 1, p-value = 1


Diagnostic OR and likelihood ratios 
       DOR  2.5%  97.5% posLR  2.5% 97.5% negLR  2.5%  97.5%
[1,] 2.390 0.093 61.399 1.029 0.932 1.135 0.431 0.018 10.107
[2,] 0.692 0.027 17.781 0.989 0.903 1.083 1.429 0.061 33.538

Correlation of sensitivities and false positive rates: 
Error in CIrho(x$cor_sens_fpr, x$nobs) : rho > -1 is not TRUE

InterrupciónDeCorticalCanalMandibular 2 10

md6  
Descriptive summary of . with 4 primary studies.
Confidence level for all calculations set to 95 %
Using a continuity correction of 0.5 if applicable 

Diagnostic accuracies 
      sens  2.5% 97.5%  spec  2.5% 97.5%
[1,] 0.979 0.828 0.998 0.048 0.011 0.185
[2,] 0.696 0.511 0.834 0.732 0.638 0.810
[3,] 0.964 0.859 0.992 0.025 0.003 0.200
[4,] 0.950 0.655 0.995 0.543 0.349 0.726

Test for equality of sensitivities: 
X-squared = 15.9214, df = 3, p-value = 0.00118
Test for equality of specificities: 
X-squared = 64.8844, df = 3, p-value = 5.31e-14


Diagnostic OR and likelihood ratios 
        DOR  2.5%   97.5% posLR  2.5% 97.5% negLR  2.5%  97.5%
[1,]  2.390 0.093  61.399 1.029 0.932 1.135 0.431 0.018 10.107
[2,]  6.276 2.501  15.753 2.602 1.731 3.910 0.415 0.234  0.736
[3,]  0.692 0.027  17.781 0.989 0.903 1.083 1.429 0.061 33.538
[4,] 22.619 1.172 436.417 2.081 1.303 3.323 0.092 0.006  1.407

Correlation of sensitivities and false positive rates: 
   rho  2.5 % 97.5 % 
 0.787 -0.714  0.995 

OscurecimientoDeLasRaices 1 9

md7  
Descriptive summary of . with 4 primary studies.
Confidence level for all calculations set to 95 %
Using a continuity correction of 0.5 if applicable 

Diagnostic accuracies 
      sens  2.5% 97.5%  spec  2.5% 97.5%
[1,] 0.979 0.828 0.998 0.048 0.011 0.185
[2,] 0.696 0.511 0.834 0.732 0.638 0.810
[3,] 0.964 0.859 0.992 0.025 0.003 0.200
[4,] 0.950 0.655 0.995 0.543 0.349 0.726

Test for equality of sensitivities: 
X-squared = 15.9214, df = 3, p-value = 0.00118
Test for equality of specificities: 
X-squared = 64.8844, df = 3, p-value = 5.31e-14


Diagnostic OR and likelihood ratios 
        DOR  2.5%   97.5% posLR  2.5% 97.5% negLR  2.5%  97.5%
[1,]  2.390 0.093  61.399 1.029 0.932 1.135 0.431 0.018 10.107
[2,]  6.276 2.501  15.753 2.602 1.731 3.910 0.415 0.234  0.736
[3,]  0.692 0.027  17.781 0.989 0.903 1.083 1.429 0.061 33.538
[4,] 22.619 1.172 436.417 2.081 1.303 3.323 0.092 0.006  1.407

Correlation of sensitivities and false positive rates: 
   rho  2.5 % 97.5 % 
 0.787 -0.714  0.995 

OscurecimientoYDobleContornoDeRaices 1 4

md8  
Descriptive summary of . with 2 primary studies.
Confidence level for all calculations set to 95 %
Using a continuity correction of 0.5 if applicable 

Diagnostic accuracies 
      sens  2.5% 97.5%  spec  2.5% 97.5%
[1,] 0.964 0.859 0.992 0.025 0.003 0.200
[2,] 0.950 0.655 0.995 0.543 0.349 0.726

Test for equality of sensitivities: 
X-squared = 0, df = 1, p-value = 1
Test for equality of specificities: 
X-squared = 11.2867, df = 1, p-value = 0.000781


Diagnostic OR and likelihood ratios 
        DOR  2.5%   97.5% posLR  2.5% 97.5% negLR  2.5%  97.5%
[1,]  0.692 0.027  17.781 0.989 0.903 1.083 1.429 0.061 33.538
[2,] 22.619 1.172 436.417 2.081 1.303 3.323 0.092 0.006  1.407

Correlation of sensitivities and false positive rates: 
Error in CIrho(x$cor_sens_fpr, x$nobs) : rho < 1 is not TRUE

SuperposiciónRaicesEnCanalMandibular 1 2

md9  
Descriptive summary of . with 1 primary studies.
Confidence level for all calculations set to 95 %
Using a continuity correction of 0.5 if applicable 

Diagnostic accuracies 
      sens  2.5% 97.5%  spec  2.5% 97.5%
[1,] 0.964 0.859 0.992 0.025 0.003   0.2

Test for equality of sensitivities: 
X-squared = 34.381, df = 1, p-value = 4.53e-09
Test for equality of specificities: 
X-squared = 16.2, df = 1, p-value = 5.7e-05


Diagnostic OR and likelihood ratios 
       DOR  2.5%  97.5% posLR  2.5% 97.5% negLR  2.5%  97.5%
[1,] 0.692 0.027 17.781 0.989 0.903 1.083 1.429 0.061 33.538

Correlation of sensitivities and false positive rates: 
Error in CIrho(x$cor_sens_fpr, x$nobs) : rho < 1 is not TRUE

LS0tCnRpdGxlOiAiMjAxOSBTeXN0ZW1hdGljIHJldmlldyBQYW5vcmFtaWMgQWx2ZW9sYXIgTmVydmUgRGFtYWdlIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgZmlnX2NhcHRpb246IHRydWUKLS0tCiMgUGFja2FnZXMKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQojIGluc3RhbGwucGFja2FnZXMoIm1hZGEiKQojIGluc3RhbGwucGFja2FnZXMoIm1ldGEiKQpsaWJyYXJ5KG1hZGEpCmxpYnJhcnkobWV0YSkKYGBgCgojIERhdGFzZXQKYGBge3IsIGluY2x1ZGU9RkFMU0V9CmRmIDwtIHJlYWRfY3N2KCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLzJQQUNYLTF2VDU2ZWJsSHpRN2Iwcmo1Rmd4dHlUb0dlTElpQm9oTXVUSm5fOE1lVkRuVnkwejZMM0NzbU5ZRVpEYTFqV0JWUS9wdWI/Z2lkPTU1ODg3MzA4MiZzaW5nbGU9dHJ1ZSZvdXRwdXQ9Y3N2IikgJT4lIAogIHNlbGVjdChBVVRPUjpURVNUKQpkZiA8LSBkZlstNTgsIF0KYGBgCmBgYHtyfQojIGluc3RhbGwucGFja2FnZXMoInJhcHBvcnRvb2xzIikKZGYkU0lHTk8gPC0gcmFwcG9ydG9vbHM6OnRvY2FtZWwoZGYkU0lHTk8pIApkZiA8LSBkZiAlPiUgCiAgbXV0YXRlKFNJR05PID0gY2FzZV93aGVuKAogICAgU0lHTk8gPT0gIkludGVycnVwY2nDs25EZUxhQ29ydGljYWxDYW5hbE1hbmRpYnVsYXIiIH4gIkludGVycnVwY2nDs25EZUNvcnRpY2FsQ2FuYWxNYW5kaWJ1bGFyIiwKICAgIFNJR05PID09ICJPc2N1cmVjaW1pZW50b0RlTGFSYWl6IiB+ICJPc2N1cmVjaW1pZW50b0RlTGFzUmFpY2VzIiwgCiAgICBUUlVFIH4gYXMuY2hhcmFjdGVyKFNJR05PKQogICkpCmBgYAoKYGBge3J9CmRmIDwtIGphbml0b3I6OmNsZWFuX25hbWVzKGRmKQpgYGAKCgpgYGB7cn0KYU51bWVybyA8LSBmdW5jdGlvbih4LCBuYS5ybSA9IEZBTFNFKSAoYXMuaW50ZWdlcih4KSkKZGYgPC0gZGYgJT4lIAogIG11dGF0ZV9hdChjKCJhX3NlbGVjY2lvbl9wYWNpZW50ZXMiLCAKICAgICAgICAgICAgICAiYV9yZWZlcmVuY2lhX2VzdGFuZGFyIiwgCiAgICAgICAgICAgICAgImVzcGVjaWZpY2lkYWQiKSwgYU51bWVybykKYGBgCgoKIyBFREEKCmBgYHtyfQp0YWJsZShkZiRhdXRvcikKYGBgCgojIyBDYWxpZGFkCgpgYGB7cn0KZGYgJT4lIAogIG11dGF0ZShyaWVzZ29EZVNlc2dvID0gcnNfc2VsZWNjaW9uX3BhY2llbnRlICsgcnNfdGVzdF9pbmRpY2UgKyByc19yZWZlcmVuY2lhX2VzdGFuZGFyKSAlPiUgCiAgbXV0YXRlKGFwbGljYWJpbGlkYWQgPSBhX2ZsdWpvX3lfdGllbXBvICsgYV9zZWxlY2Npb25fcGFjaWVudGVzICsgYV90ZXN0X2luZGljZSArIGFfcmVmZXJlbmNpYV9lc3RhbmRhcikgJT4lIAogIGdyb3VwX2J5KGF1dG9yKSAlPiUgCiAgc3VtbWFyaXNlKHNlc2dvID0gbWVhbihyaWVzZ29EZVNlc2dvKSwgYXBsaWNhYiA9IG1lYW4oYXBsaWNhYmlsaWRhZCkpCmBgYAoKCiMgTWV0YS1hbmFseXNpcwoKYGBge3J9CnRhYmxlKGRmJHNpZ25vKQpgYGAKCmBgYHtyfQpkZiAlPiUgCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgZnVucyhmYWN0b3IodHJpbXdzKC4pKSkpICU+JSAKICBncm91cF9ieShzaWdubykgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKQpgYGAKCkNyZW8gbG9zIHRvdGFsZXMKYGBge3J9CmRmIDwtIGRmICU+JSAKICBtdXRhdGUobjEgPSB2cCArIGZwLCAKICAgICAgICAgbjIgPSB2biArIGZuKQpgYGAKCmBgYHtyfQptZDEgPC0gZGYgJT4lIAogIHNlbGVjdChhdXRvciwgCiAgICAgICAgIFRQID0gdnAsIAogICAgICAgICBGUCA9IGZwLCAKICAgICAgICAgVE4gPSB2biwgCiAgICAgICAgIEZOID0gZm4pICU+JSAKICBuYS5vbWl0KCkgJT4lIAogIG1hZGFkKC4sIGxldmVsID0gMC45NSkKYGBgCmBgYHtyfQpwcmludChtZDEsIGRpZ2l0cyA9IDIpCmBgYApgYGB7cn0Kb2xkcGFyIDwtIHBhcihtZnJvdz1jKDEsIDIpLCBwdHk9Im0iKQpgYGAKCgoKCiMjIERlc3ZpYWNpw7NuIHJhw61jZXMgLyBjbGluaWNhCmBgYHtyfQptZDEgPC0gZGYgJT4lIAogIGZpbHRlcihzaWdubyA9PSAiRGVzdmlhY2nDs25EZUxhc1JhaWNlcyIpICU+JSAKICBzZWxlY3QoYXV0b3IsIAogICAgICAgICBUUCA9IHZwLCAKICAgICAgICAgRlAgPSBmcCwgCiAgICAgICAgIFROID0gdm4sIAogICAgICAgICBGTiA9IGZuKSAlPiUgCiAgbmEub21pdCgpICU+JSAKICBtYWRhZCguLCBsZXZlbCA9IDAuOTUpCm1kMSAgCgoKYGBgCmBgYHtyfQoKbWFkYTo6Zm9yZXN0KG1kMSwgdHlwZSA9ICJzZW5zIiwgbWFpbiA9ICJTZW5zaWJpbGlkYWQiLCB4bGFiID0gIlNlbnNpYmlsaWRhZCIpCmBgYApgYGB7cn0KbWFkYTo6Zm9yZXN0KG1kMSwgdHlwZSA9ICJzcGVjIiwgbWFpbiA9ICJFc3BlY2lmaWNpZGFkIikKYGBgCmBgYHtyfQptYWRhOjpmb3Jlc3QobWQxLCB0eXBlID0gIkRPUiIsIGxvZyA9IFRSVUUsICBtYWluID0gIkxvZyBET1IiKQpgYGAKICAKIyMgRGVzdmlhY2nDs25EZWxDYW5hbE1hbmRpYnVsYXIgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgMTAKCmBgYHtyfQptZDIgPC0gZGYgJT4lCiAgc2VsZWN0KGF1dG9yLAogICAgICAgICBzaWdubywgCiAgICAgICAgIGdvbGRfc3RhbmRhcmQsIAogICAgICAgICB0ZXN0LCAKICAgICAgICAgVFAgPSB2cCwgCiAgICAgICAgIEZQID0gZnAsIAogICAgICAgICBUTiA9IHZuLCAKICAgICAgICAgRk4gPSBmbikgJT4lCiAgZmlsdGVyKFRQID4gMCkgJT4lIAogIGZpbHRlcih0ZXN0ID09ICJPUEciKSAlPiUgCiAgZmlsdGVyKHNpZ25vID09ICJEZXN2aWFjacOzbkRlbENhbmFsTWFuZGlidWxhciIpICU+JQogIG1hZGFkKC4sIGxldmVsID0gMC45NSkKbWQyICAKCgpgYGAKYGBge3J9Cm1hZGE6OmZvcmVzdChtZDEsIHR5cGUgPSAic2VucyIsIG1haW4gPSAiU2Vuc2liaWxpZGFkIiwgeGxhYiA9ICJTZW5zaWJpbGlkYWQiKQpgYGAKYGBge3J9Cm1hZGE6OmZvcmVzdChtZDIsIHR5cGUgPSAic3BlYyIsIG1haW4gPSAiRXNwZWNpZmljaWRhZCIpCmBgYApgYGB7cn0KbWFkYTo6Zm9yZXN0KG1kMiwgdHlwZSA9ICJET1IiLCBsb2cgPSBUUlVFLCAgbWFpbiA9ICJMb2cgRE9SIikKYGBgCiAKCgojIyBEaWxhY2VyYWNpw7NuRGVSYWljZXMgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgMAogU2luIGFydMOtY3Vsb3MgcGFyYSBPUEcKCiMjICBFc3RyZWNoYW1pZW50b0RlTGFzUmFpY2VzICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICA0CmBgYHtyfQptZDQgPC0gZGYgJT4lCiAgc2VsZWN0KGF1dG9yLAogICAgICAgICBzaWdubywgCiAgICAgICAgIGdvbGRfc3RhbmRhcmQsIAogICAgICAgICB0ZXN0LCAKICAgICAgICAgVFAgPSB2cCwgCiAgICAgICAgIEZQID0gZnAsIAogICAgICAgICBUTiA9IHZuLCAKICAgICAgICAgRk4gPSBmbikgJT4lCiAgZmlsdGVyKFRQID4gMCkgJT4lIAogIGZpbHRlcih0ZXN0ID09ICJPUEciKSAlPiUgCiAgZmlsdGVyKHNpZ25vID09ICJFc3RyZWNoYW1pZW50b0RlTGFzUmFpY2VzIikgJT4lCiAgbWFkYWQoLiwgbGV2ZWwgPSAwLjk1KQptZDQgIAoKCmBgYApgYGB7cn0KbWFkYTo6Zm9yZXN0KG1kNCwgdHlwZSA9ICJzZW5zIiwgbWFpbiA9ICJTZW5zaWJpbGlkYWQiLCB4bGFiID0gIlNlbnNpYmlsaWRhZCIpCmBgYApgYGB7cn0KbWFkYTo6Zm9yZXN0KG1kNCwgdHlwZSA9ICJzcGVjIiwgbWFpbiA9ICJFc3BlY2lmaWNpZGFkIikKYGBgCmBgYHtyfQptYWRhOjpmb3Jlc3QobWQ0LCB0eXBlID0gIkRPUiIsIGxvZyA9IFRSVUUsICBtYWluID0gIkxvZyBET1IiKQpgYGAKICAKIyMgIEVzdHJlY2hhbWllbnRvRGVsQ2FuYWxNYW5kaWJ1bGFyICAgICAgICAgMSAgICAgICAgICAgICAgICAgIDQKCmBgYHtyfQptZDUgPC0gZGYgJT4lCiAgc2VsZWN0KGF1dG9yLAogICAgICAgICBzaWdubywgCiAgICAgICAgIGdvbGRfc3RhbmRhcmQsIAogICAgICAgICB0ZXN0LCAKICAgICAgICAgVFAgPSB2cCwgCiAgICAgICAgIEZQID0gZnAsIAogICAgICAgICBUTiA9IHZuLCAKICAgICAgICAgRk4gPSBmbikgJT4lCiAgZmlsdGVyKFRQID4gMCkgJT4lIAogIGZpbHRlcih0ZXN0ID09ICJPUEciKSAlPiUgCiAgZmlsdGVyKHNpZ25vID09ICJFc3RyZWNoYW1pZW50b0RlbENhbmFsTWFuZGlidWxhciIpICU+JQogIG1hZGFkKC4sIGxldmVsID0gMC45NSkKbWQ1ICAKCgpgYGAKYGBge3J9Cm1hZGE6OmZvcmVzdChtZDUsIHR5cGUgPSAic2VucyIsIG1haW4gPSAiU2Vuc2liaWxpZGFkIiwgeGxhYiA9ICJTZW5zaWJpbGlkYWQiKQpgYGAKYGBge3J9Cm1hZGE6OmZvcmVzdChtZDUsIHR5cGUgPSAic3BlYyIsIG1haW4gPSAiRXNwZWNpZmljaWRhZCIpCmBgYApgYGB7cn0KbWFkYTo6Zm9yZXN0KG1kNSwgdHlwZSA9ICJET1IiLCBsb2cgPSBUUlVFLCAgbWFpbiA9ICJMb2cgRE9SIikKYGBgCgoKIyMgIEludGVycnVwY2nDs25EZUNvcnRpY2FsQ2FuYWxNYW5kaWJ1bGFyICAgIDIgICAgICAgICAgICAgICAgIDEwCgpgYGB7cn0KbWQ2IDwtIGRmICU+JQogIHNlbGVjdChhdXRvciwKICAgICAgICAgc2lnbm8sIAogICAgICAgICBnb2xkX3N0YW5kYXJkLCAKICAgICAgICAgdGVzdCwgCiAgICAgICAgIFRQID0gdnAsIAogICAgICAgICBGUCA9IGZwLCAKICAgICAgICAgVE4gPSB2biwgCiAgICAgICAgIEZOID0gZm4pICU+JQogIGZpbHRlcihUUCA+IDApICU+JSAKICBmaWx0ZXIodGVzdCA9PSAiT1BHIikgJT4lIAogIGZpbHRlcihzaWdubyA9PSAiSW50ZXJydXBjacOzbkRlQ29ydGljYWxDYW5hbE1hbmRpYnVsYXIiKSAlPiUKICBtYWRhZCguLCBsZXZlbCA9IDAuOTUpCm1kNiAgCgoKYGBgCmBgYHtyfQptYWRhOjpmb3Jlc3QobWQ2LCB0eXBlID0gInNlbnMiLCBtYWluID0gIlNlbnNpYmlsaWRhZCIsIHhsYWIgPSAiU2Vuc2liaWxpZGFkIikKYGBgCmBgYHtyfQptYWRhOjpmb3Jlc3QobWQ2LCB0eXBlID0gInNwZWMiLCBtYWluID0gIkVzcGVjaWZpY2lkYWQiKQpgYGAKYGBge3J9Cm1hZGE6OmZvcmVzdChtZDYsIHR5cGUgPSAiRE9SIiwgbG9nID0gVFJVRSwgIG1haW4gPSAiTG9nIERPUiIpCmBgYAoKCiMjICBPc2N1cmVjaW1pZW50b0RlTGFzUmFpY2VzICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICA5CgpgYGB7cn0KbWQ3IDwtIGRmICU+JQogIHNlbGVjdChhdXRvciwKICAgICAgICAgc2lnbm8sIAogICAgICAgICBnb2xkX3N0YW5kYXJkLCAKICAgICAgICAgdGVzdCwgCiAgICAgICAgIFRQID0gdnAsIAogICAgICAgICBGUCA9IGZwLCAKICAgICAgICAgVE4gPSB2biwgCiAgICAgICAgIEZOID0gZm4pICU+JQogIGZpbHRlcihUUCA+IDApICU+JSAKICBmaWx0ZXIodGVzdCA9PSAiT1BHIikgJT4lIAogIGZpbHRlcihzaWdubyA9PSAiT3NjdXJlY2ltaWVudG9EZUxhc1JhaWNlcyIpICU+JQogIG1hZGFkKC4sIGxldmVsID0gMC45NSkKbWQ3ICAKCgpgYGAKYGBge3J9Cm1hZGE6OmZvcmVzdChtZDcsIHR5cGUgPSAic2VucyIsIG1haW4gPSAiU2Vuc2liaWxpZGFkIiwgeGxhYiA9ICJTZW5zaWJpbGlkYWQiKQpgYGAKYGBge3J9Cm1hZGE6OmZvcmVzdChtZDcsIHR5cGUgPSAic3BlYyIsIG1haW4gPSAiRXNwZWNpZmljaWRhZCIpCmBgYApgYGB7cn0KbWFkYTo6Zm9yZXN0KG1kNywgdHlwZSA9ICJET1IiLCBsb2cgPSBUUlVFLCAgbWFpbiA9ICJMb2cgRE9SIikKYGBgCgojIyAgT3NjdXJlY2ltaWVudG9ZRG9ibGVDb250b3Jub0RlUmFpY2VzICAgICAxICAgICAgICAgICAgICAgICAgNAoKYGBge3J9Cm1kOCA8LSBkZiAlPiUKICBzZWxlY3QoYXV0b3IsCiAgICAgICAgIHNpZ25vLCAKICAgICAgICAgZ29sZF9zdGFuZGFyZCwgCiAgICAgICAgIHRlc3QsIAogICAgICAgICBUUCA9IHZwLCAKICAgICAgICAgRlAgPSBmcCwgCiAgICAgICAgIFROID0gdm4sIAogICAgICAgICBGTiA9IGZuKSAlPiUKICBmaWx0ZXIoVFAgPiAwKSAlPiUgCiAgZmlsdGVyKHRlc3QgPT0gIk9QRyIpICU+JSAKICBmaWx0ZXIoc2lnbm8gPT0gIk9zY3VyZWNpbWllbnRvWURvYmxlQ29udG9ybm9EZVJhaWNlcyIpICU+JQogIG1hZGFkKC4sIGxldmVsID0gMC45NSkKbWQ4ICAKCgpgYGAKYGBge3J9Cm1hZGE6OmZvcmVzdChtZDgsIHR5cGUgPSAic2VucyIsIG1haW4gPSAiU2Vuc2liaWxpZGFkIiwgeGxhYiA9ICJTZW5zaWJpbGlkYWQiKQpgYGAKYGBge3J9Cm1hZGE6OmZvcmVzdChtZDgsIHR5cGUgPSAic3BlYyIsIG1haW4gPSAiRXNwZWNpZmljaWRhZCIpCmBgYApgYGB7cn0KbWFkYTo6Zm9yZXN0KG1kOCwgdHlwZSA9ICJET1IiLCBsb2cgPSBUUlVFLCAgbWFpbiA9ICJMb2cgRE9SIikKYGBgCiAKCiMjICBTdXBlcnBvc2ljacOzblJhaWNlc0VuQ2FuYWxNYW5kaWJ1bGFyICAgICAxICAgICAgICAgICAgICAgICAgMgoKYGBge3J9Cm1kOSA8LSBkZiAlPiUKICBzZWxlY3QoYXV0b3IsCiAgICAgICAgIHNpZ25vLCAKICAgICAgICAgZ29sZF9zdGFuZGFyZCwgCiAgICAgICAgIHRlc3QsIAogICAgICAgICBUUCA9IHZwLCAKICAgICAgICAgRlAgPSBmcCwgCiAgICAgICAgIFROID0gdm4sIAogICAgICAgICBGTiA9IGZuKSAlPiUKICBmaWx0ZXIoVFAgPiAwKSAlPiUgCiAgZmlsdGVyKHRlc3QgPT0gIk9QRyIpICU+JSAKICBmaWx0ZXIoc2lnbm8gPT0gIlN1cGVycG9zaWNpw7NuUmFpY2VzRW5DYW5hbE1hbmRpYnVsYXIiKSAlPiUKICBtYWRhZCguLCBsZXZlbCA9IDAuOTUpCm1kOSAgCgoKYGBgCmBgYHtyfQptYWRhOjpmb3Jlc3QobWQ5LCB0eXBlID0gInNlbnMiLCBtYWluID0gIlNlbnNpYmlsaWRhZCIsIHhsYWIgPSAiU2Vuc2liaWxpZGFkIikKYGBgCmBgYHtyfQptYWRhOjpmb3Jlc3QobWQ5LCB0eXBlID0gInNwZWMiLCBtYWluID0gIkVzcGVjaWZpY2lkYWQiKQpgYGAKYGBge3J9Cm1hZGE6OmZvcmVzdChtZDksIHR5cGUgPSAiRE9SIiwgbG9nID0gVFJVRSwgIG1haW4gPSAiTG9nIERPUiIpCmBgYAo=