library(ggplot2)
library(ggExtra)
library(tidyverse)
-- Attaching packages --------------------------------------- tidyverse 1.2.1 --
v tibble  1.4.2     v purrr   0.2.5
v tidyr   0.8.1     v dplyr   0.7.6
v readr   1.1.1     v stringr 1.3.1
v tibble  1.4.2     v forcats 0.3.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(psych)

Attaching package: 㤼㸱psych㤼㸲

The following objects are masked from 㤼㸱package:ggplot2㤼㸲:

    %+%, alpha
library(ggcorrplot)
library(stats)
library(FactoMineR)
library(ggmap)
Google Maps API Terms of Service: http://developers.google.com/maps/terms.
Please cite ggmap if you use it: see citation("ggmap") for details.
library(rgdal)
rgdal: version: 1.3-3, (SVN revision 759)
 Geospatial Data Abstraction Library extensions to R successfully loaded
 Loaded GDAL runtime: GDAL 2.2.3, released 2017/11/20
 Path to GDAL shared files: C:/Users/leona/AppData/Local/conda/conda/envs/rstudio/lib/R/library/rgdal/gdal
 GDAL binary built with GEOS: TRUE 
 Loaded PROJ.4 runtime: Rel. 4.9.3, 15 August 2016, [PJ_VERSION: 493]
 Path to PROJ.4 shared files: C:/Users/leona/AppData/Local/conda/conda/envs/rstudio/lib/R/library/rgdal/proj
 Linking to sp version: 1.3-1 

Data Import

Geral <- read.csv("Geral.csv", as.is=TRUE, sep=",") %>% as.data.frame()
Geral <- Geral[-c(57, 67, 68, 69),]
describe(Geral)
NAs introduced by coercionno non-missing arguments to min; returning Infno non-missing arguments to max; returning -Inf

Tidy

Elements <- c(5, 7, 8, 10, 11, 12, 14, 15, 16, 20, 23, 25, 27)
Chemical_Tr <- select(Geral, c(Elements))
Mag_Param <- c("SusF1","ARM","SIRM_VSM","MU","MS")
Tracers <- select(Geral, c(Elements, Mag_Param)) %>% na.omit()
describe(Tracers)

Species subset is a agreggate of the tracers with the tree species to use multi-type multivariate statistics

Species <- select(Geral, c("Especie", Elements, Mag_Param)) %>% as.data.frame %>% na.omit()
Species$Especie <- as.factor(Species$Especie)
str(Species)
'data.frame':   63 obs. of  19 variables:
 $ Especie : Factor w/ 2 levels "Sibipiruna","Tipuana": 2 2 2 2 2 2 2 2 1 1 ...
 $ Al      : num  148 1957 278 324 908 ...
 $ Ba      : num  132 1053 166 604 646 ...
 $ Ca      : num  3.85 1.73 3.13 3.71 3.24 ...
 $ Cl      : num  197 275 249 131 358 ...
 $ Cu      : num  6.38 11.52 6.36 7.58 8.27 ...
 $ Fe      : num  231 2788 648 642 1898 ...
 $ K       : num  605 1162 962 805 1172 ...
 $ Mg      : num  2308 610 2255 975 1788 ...
 $ Mn      : num  44.8 49.6 51.2 240 132.3 ...
 $ P       : num  718 542 802 802 968 ...
 $ S       : num  3252 2478 2590 2565 2992 ...
 $ Sr      : num  150.8 79.5 114 178.7 157.8 ...
 $ Zn      : num  124 258 166 408 239 ...
 $ SusF1   : num  2.28e-06 4.60e-05 9.08e-06 1.02e-05 3.43e-05 ...
 $ ARM     : num  -5.80e-08 7.01e-06 2.17e-05 1.26e-04 4.01e-06 ...
 $ SIRM_VSM: num  6.20e-07 3.81e-06 1.24e-06 1.14e-06 3.31e-06 ...
 $ MU      : num  7.84e-19 9.07e-19 8.28e-19 4.93e-19 4.20e-19 ...
 $ MS      : num  4.40e-06 4.67e-05 1.06e-05 1.28e-05 4.22e-05 ...
 - attr(*, "na.action")= 'omit' Named int  2 57
  ..- attr(*, "names")= chr  "2" "58"

Map subset is a agg. of the spacial data

Map <- select(Geral, c("Lat", "Long", "Latcart", "Longcart", Elements, Mag_Param)) %>% na.omit()
describe(Map)

Data Statistics

Correlation Plot

corr <- cor(Tracers, use = "complete.obs") %>% round(1)
ggcorrplot(corr, hc.order = TRUE, 
           type = "lower", 
           lab = TRUE, 
           lab_size = 3, 
           method="square", 
           colors = c("tomato2", "white", "springgreen3"), 
           title="Correlogram of Tracers", 
           ggtheme=theme_bw)%>% plot()

PCA

PCA <- principal(Tracers, nfactors=5, rotate="varimax", impute="mean")
PCA$loadings

Loadings:
         RC1    RC3    RC2    RC4    RC5   
Al        0.976  0.157                     
Ba        0.930  0.256 -0.131              
Ca       -0.549        -0.103 -0.524  0.487
Cl                      0.775  0.463 -0.330
Cu        0.217  0.932                     
Fe        0.938  0.262 -0.143              
K         0.174         0.677  0.423 -0.383
Mg                      0.294  0.859  0.111
Mn        0.268  0.926                     
P        -0.278         0.805  0.256 -0.173
S                              0.936       
Sr        0.148  0.237 -0.228  0.154  0.871
Zn        0.343  0.906 -0.117              
SusF1     0.963  0.232                     
ARM       0.217  0.891                0.116
SIRM_VSM  0.945  0.262                     
MU       -0.129         0.798 -0.174  0.133
MS        0.966  0.198                     

                 RC1   RC3   RC2   RC4   RC5
SS loadings    6.201 3.737 2.558 2.412 1.339
Proportion Var 0.344 0.208 0.142 0.134 0.074
Cumulative Var 0.344 0.552 0.694 0.828 0.903
fa.diagram(PCA$loadings)

PCA_scores <- PCA$scores %>% as.data.frame
colnames(PCA_scores) <- c("PCA_1", "PCA_2", "PCA_3", "PCA_4", "PCA_5")
describe(PCA_scores)

Factor Analisys

FA <- factanal(Tracers, factors = 4, start = NULL, nstart = 1000, rotation = "varimax", scores = 'regression')
FA$loadings

Loadings:
         Factor1 Factor2 Factor3 Factor4
Al        0.973   0.174                 
Ba        0.926   0.271  -0.105   0.226 
Ca       -0.550  -0.101  -0.434  -0.229 
Cl                        0.994         
Cu        0.205   0.930                 
Fe        0.932   0.285           0.124 
K         0.197           0.905         
Mg                        0.536         
Mn        0.260   0.910                 
P        -0.257           0.819  -0.148 
S                         0.435   0.238 
Sr        0.137   0.310  -0.333   0.103 
Zn        0.330   0.924                 
SusF1     0.961   0.248                 
ARM       0.213   0.857           0.101 
SIRM_VSM  0.943   0.276          -0.163 
MU       -0.169  -0.101   0.403         
MS        0.964   0.213          -0.130 

               Factor1 Factor2 Factor3 Factor4
SS loadings      6.147   3.779   3.460   0.296
Proportion Var   0.342   0.210   0.192   0.016
Cumulative Var   0.342   0.551   0.744   0.760
fa.diagram(FA$loadings)

FA_scores <- FA$scores %>% as.data.frame
colnames(FA_scores) <- c("FA_1", "FA_2", "FA_3", "FA_4")
describe(FA_scores)

FAMD

FAMD_Species <- FAMD(Species, graph = TRUE, axes = c(1,2))

zero-length arrow is of indeterminate angle and so skipped

FAMD scores

Maps

Setup

Map <- cbind2(Map, PCA_scores)
Map <- cbind2(Map, FA_scores)
Map <- cbind2(Map, FAMD_scores)
describe(Map)

Shapefile of the PPABC contour:

DataSet

The DataSet have the coordinates and the protagonist tracer

DataSet <- cbind2(as.data.frame(Map$Latcart), as.data.frame(Map$Longcart)) %>% as.data.frame()
DataSet <- cbind2(DataSet, as.data.frame(Map$FAMD_5)) %>% as.data.frame() # INPUT THE TRACER HERE
names(DataSet)[1] <- "y"
names(DataSet)[2] <- "x"
names(DataSet)[3] <- "z"

Data Density

Interpolation

This chunk of code in addition to the “DataSet” chunk was utilized to generate the distribution map of all factors of the multivariate statistical analisys

## akima interpolation
library(akima)
df_akima <-interp2xyz(interp(x=DataSet$x, y=DataSet$y, z=DataSet$z, duplicate="mean", linear = F,
                             xo=seq(min(DataSet$x), max(DataSet$x), length=30),
                             yo=seq(min(DataSet$y), max(DataSet$y), length=30)), data.frame=TRUE)
## akima plot
mapa <- ggmap(Capuava, extent = "device", darken = .5) +
  geom_path(data = shapefile_df, 
          aes(x = long, y = lat, group = group), 
          color = 'blue', fill = 'blue', size = 2) +
  geom_tile(aes(x = x, y = y, fill = z), data = df_akima, alpha = .4) +
  stat_contour(aes(x = x, y = y, z = z, fill = ..level..), data = df_akima, geom = 'polygon', alpha = .4) +
  geom_contour(aes(x = x, y = y, z = z), data = df_akima, colour = 'white', alpha = .4) +
  scale_fill_distiller(palette = "Spectral", na.value = NA) +
  geom_point(aes(x, y), data = DataSet, colour = "red", size = 1) +
  labs(title = "Distribuição espacial do fator da FAMD", fill = "FAMD_5")
Ignoring unknown parameters: fill
ggsave(mapa, file = "FAMD_5.png", width = 5, height = 5, type = "cairo-png")

LS0tDQp0aXRsZTogIkNhcHVhdmEgLSBQcm9jZXNzaW5nIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KLS0tDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ0V4dHJhKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShnZ2NvcnJwbG90KQ0KbGlicmFyeShzdGF0cykNCmxpYnJhcnkoRmFjdG9NaW5lUikNCmxpYnJhcnkoZ2dtYXApDQpsaWJyYXJ5KHJnZGFsKQ0KYGBgDQoNCiMgRGF0YSBJbXBvcnQNCg0KYGBge3J9DQpHZXJhbCA8LSByZWFkLmNzdigiR2VyYWwuY3N2IiwgYXMuaXM9VFJVRSwgc2VwPSIsIikgJT4lIGFzLmRhdGEuZnJhbWUoKQ0KDQpHZXJhbCA8LSBHZXJhbFstYyg1NywgNjcsIDY4LCA2OSksXQ0KDQpkZXNjcmliZShHZXJhbCkNCmBgYA0KDQojIFRpZHkNCg0KYGBge3J9DQpFbGVtZW50cyA8LSBjKDUsIDcsIDgsIDEwLCAxMSwgMTIsIDE0LCAxNSwgMTYsIDIwLCAyMywgMjUsIDI3KQ0KDQpDaGVtaWNhbF9UciA8LSBzZWxlY3QoR2VyYWwsIGMoRWxlbWVudHMpKQ0KDQpNYWdfUGFyYW0gPC0gYygiU3VzRjEiLCJBUk0iLCJTSVJNX1ZTTSIsIk1VIiwiTVMiKQ0KDQpUcmFjZXJzIDwtIHNlbGVjdChHZXJhbCwgYyhFbGVtZW50cywgTWFnX1BhcmFtKSkgJT4lIG5hLm9taXQoKQ0KDQpkZXNjcmliZShUcmFjZXJzKQ0KYGBgDQoNClNwZWNpZXMgc3Vic2V0IGlzIGEgYWdyZWdnYXRlIG9mIHRoZSB0cmFjZXJzIHdpdGggdGhlIHRyZWUgc3BlY2llcyB0byB1c2UgbXVsdGktdHlwZSBtdWx0aXZhcmlhdGUgc3RhdGlzdGljcw0KDQpgYGB7cn0NClNwZWNpZXMgPC0gc2VsZWN0KEdlcmFsLCBjKCJFc3BlY2llIiwgRWxlbWVudHMsIE1hZ19QYXJhbSkpICU+JSBhcy5kYXRhLmZyYW1lICU+JSBuYS5vbWl0KCkNCg0KU3BlY2llcyRFc3BlY2llIDwtIGFzLmZhY3RvcihTcGVjaWVzJEVzcGVjaWUpDQoNCnN0cihTcGVjaWVzKQ0KYGBgDQoNCk1hcCBzdWJzZXQgaXMgYSBhZ2cuIG9mIHRoZSBzcGFjaWFsIGRhdGENCg0KYGBge3J9DQpNYXAgPC0gc2VsZWN0KEdlcmFsLCBjKCJMYXQiLCAiTG9uZyIsICJMYXRjYXJ0IiwgIkxvbmdjYXJ0IiwgRWxlbWVudHMsIE1hZ19QYXJhbSkpICU+JSBuYS5vbWl0KCkNCg0KZGVzY3JpYmUoTWFwKQ0KYGBgDQoNCg0KIyBEYXRhIFN0YXRpc3RpY3MNCg0KIyMgQ29ycmVsYXRpb24gUGxvdA0KDQpgYGB7cn0NCmNvcnIgPC0gY29yKFRyYWNlcnMsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKSAlPiUgcm91bmQoMSkNCg0KZ2djb3JycGxvdChjb3JyLCBoYy5vcmRlciA9IFRSVUUsIA0KICAgICAgICAgICB0eXBlID0gImxvd2VyIiwgDQogICAgICAgICAgIGxhYiA9IFRSVUUsIA0KICAgICAgICAgICBsYWJfc2l6ZSA9IDMsIA0KICAgICAgICAgICBtZXRob2Q9InNxdWFyZSIsIA0KICAgICAgICAgICBjb2xvcnMgPSBjKCJ0b21hdG8yIiwgIndoaXRlIiwgInNwcmluZ2dyZWVuMyIpLCANCiAgICAgICAgICAgdGl0bGU9IkNvcnJlbG9ncmFtIG9mIFRyYWNlcnMiLCANCiAgICAgICAgICAgZ2d0aGVtZT10aGVtZV9idyklPiUgcGxvdCgpDQpgYGANCg0KIyMgUENBDQoNCmBgYHtyfQ0KUENBIDwtIHByaW5jaXBhbChUcmFjZXJzLCBuZmFjdG9ycz01LCByb3RhdGU9InZhcmltYXgiLCBpbXB1dGU9Im1lYW4iKQ0KDQpQQ0EkbG9hZGluZ3MNCmBgYA0KDQpgYGB7cn0NCmZhLmRpYWdyYW0oUENBJGxvYWRpbmdzKQ0KYGBgDQoNCmBgYHtyfQ0KUENBX3Njb3JlcyA8LSBQQ0Ekc2NvcmVzICU+JSBhcy5kYXRhLmZyYW1lDQoNCmNvbG5hbWVzKFBDQV9zY29yZXMpIDwtIGMoIlBDQV8xIiwgIlBDQV8yIiwgIlBDQV8zIiwgIlBDQV80IiwgIlBDQV81IikNCg0KZGVzY3JpYmUoUENBX3Njb3JlcykNCmBgYA0KDQojIyBGYWN0b3IgQW5hbGlzeXMNCg0KYGBge3J9DQpGQSA8LSBmYWN0YW5hbChUcmFjZXJzLCBmYWN0b3JzID0gNCwgc3RhcnQgPSBOVUxMLCBuc3RhcnQgPSAxMDAwLCByb3RhdGlvbiA9ICJ2YXJpbWF4Iiwgc2NvcmVzID0gJ3JlZ3Jlc3Npb24nKQ0KYGBgDQoNCmBgYHtyfQ0KRkEkbG9hZGluZ3MNCmBgYA0KDQpgYGB7cn0NCmZhLmRpYWdyYW0oRkEkbG9hZGluZ3MpDQpgYGANCg0KYGBge3J9DQpGQV9zY29yZXMgPC0gRkEkc2NvcmVzICU+JSBhcy5kYXRhLmZyYW1lDQoNCmNvbG5hbWVzKEZBX3Njb3JlcykgPC0gYygiRkFfMSIsICJGQV8yIiwgIkZBXzMiLCAiRkFfNCIpDQoNCmRlc2NyaWJlKEZBX3Njb3JlcykNCmBgYA0KDQojIyBGQU1EDQoNCmBgYHtyfQ0KRkFNRF9TcGVjaWVzIDwtIEZBTUQoU3BlY2llcywgZ3JhcGggPSBUUlVFLCBheGVzID0gYygxLDIpKQ0KDQpkZXNjcmliZShGQU1EX1NwZWNpZXMpDQpgYGANCg0KRkFNRCBzY29yZXMNCg0KYGBge3J9DQpGQU1EX3Njb3JlcyA8LSBGQU1EX1NwZWNpZXMkaW5kJGNvb3JkICU+JSBhcy5kYXRhLmZyYW1lKCkNCmNvbG5hbWVzKEZBTURfc2NvcmVzKSA8LSBjKCJGQU1EXzEiLCAiRkFNRF8yIiwgIkZBTURfMyIsICJGQU1EXzQiLCAiRkFNRF81IikNCg0KZGVzY3JpYmUoRkFNRF9zY29yZXMpDQpgYGANCg0KIyMgTWFwcw0KDQojIyMgU2V0dXANCg0KYGBge3J9DQpNYXAgPC0gY2JpbmQyKE1hcCwgUENBX3Njb3JlcykNCg0KTWFwIDwtIGNiaW5kMihNYXAsIEZBX3Njb3JlcykNCg0KTWFwIDwtIGNiaW5kMihNYXAsIEZBTURfc2NvcmVzKQ0KDQpkZXNjcmliZShNYXApDQpgYGANCg0KU2hhcGVmaWxlIG9mIHRoZSBQUEFCQyBjb250b3VyOg0KDQpgYGB7cn0NCnNoYXBlZmlsZSA8LSByZWFkT0dSKCJHOi9NeSBEcml2ZS9JQy9PbGQvVEcvRGFkb3MvUUdpcyIsICJQb2xpZ29ub0FyZWFQb2xvUGV0cm9xdWltaWNvQ2FwdWF2YSIpDQoNCnNoX2RmIDwtIGZvcnRpZnkoc2hhcGVmaWxlKQ0KDQpsaWJyYXJ5KHByb2o0KQ0KDQpwcm9qNHN0cmluZyA8LSAiK3Byb2o9dXRtICt6b25lPTIzICtzb3V0aCArZWxscHM9V0dTODQgK2RhdHVtPVdHUzg0ICt1bml0cz1tICtub19kZWZzICINCg0KIyBTb3VyY2UgZGF0YQ0KeHkgPC0gc2hfZGZbLDE6Ml0NCg0KIyBUcmFuc2Zvcm1lZCBkYXRhDQpwaiA8LSBwcm9qZWN0KHh5LCBwcm9qNHN0cmluZywgaW52ZXJzZT1UUlVFKQ0KbGF0bG9uIDwtIGRhdGEuZnJhbWUobGF0PXBqJHksIGxvbmc9cGokeCkNCg0Kc2hhcGVmaWxlX2RmIDwtIHNoYXBlZmlsZV9kZlssLWMoMSwyKV0NCg0Kc2hhcGVmaWxlX2RmIDwtIGNiaW5kMihsYXRsb24sIHNoYXBlZmlsZV9kZikNCg0KYGBgDQoNCg0KYGBge3J9DQpyZWdpc3Rlcl9nb29nbGUoa2V5ID0gIkFJemFTeUFOOE5sLUJHNUVHUWp2Y1hUTW1BaVhYbno1VVJvMkJtTSIpDQoNCkNhcHVhdmEgPC0gZ2V0X21hcChjKGxvbiA9IC00LjY0NzcwMmUrMDEsIGxhdCA9IC0yLjM2NDYxN2UrMDEpLCB6b29tID0gMTMsIHNvdXJjZSA9ICJzdGFtZW4iLCBtYXB0eXBlID0gInRvbmVyLWJhY2tncm91bmQiKQ0KYGBgDQoNCiMjIyBEYXRhU2V0DQoNClRoZSBEYXRhU2V0IGhhdmUgdGhlIGNvb3JkaW5hdGVzIGFuZCB0aGUgcHJvdGFnb25pc3QgdHJhY2VyDQoNCmBgYHtyfQ0KRGF0YVNldCA8LSBjYmluZDIoYXMuZGF0YS5mcmFtZShNYXAkTGF0Y2FydCksIGFzLmRhdGEuZnJhbWUoTWFwJExvbmdjYXJ0KSkgJT4lIGFzLmRhdGEuZnJhbWUoKQ0KRGF0YVNldCA8LSBjYmluZDIoRGF0YVNldCwgYXMuZGF0YS5mcmFtZShNYXAkRkFNRF81KSkgJT4lIGFzLmRhdGEuZnJhbWUoKSAjIElOUFVUIFRIRSBUUkFDRVIgSEVSRQ0KbmFtZXMoRGF0YVNldClbMV0gPC0gInkiDQpuYW1lcyhEYXRhU2V0KVsyXSA8LSAieCINCm5hbWVzKERhdGFTZXQpWzNdIDwtICJ6Ig0KYGBgDQoNCg0KIyMjIERhdGEgRGVuc2l0eQ0KDQpgYGB7cn0NCg0KDQpnZ21hcChDYXB1YXZhLCBleHRlbnQgPSAiZGV2aWNlIiwgZGFya2VuID0gLjUpICsgDQogIGdlb21fcGF0aChkYXRhID0gc2hhcGVmaWxlX2RmLCANCiAgICAgICAgICBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLCANCiAgICAgICAgICBjb2xvciA9ICdibHVlJywgZmlsbCA9ICdibHVlJywgc2l6ZSA9IDIpICsNCiAgZ2VvbV9kZW5zaXR5MmQoZGF0YSA9IERhdGFTZXQsIGFlcyh4LCB5KSwgY29sb3IgPSAid2hpdGUiKSArDQogIHN0YXRfZGVuc2l0eTJkKGRhdGEgPSBEYXRhU2V0LCANCiAgICAgICAgICAgICAgICAgYWVzKHgsIHksIGZpbGwgPSAuLmxldmVsLi4sIGFscGhhID0gLi5sZXZlbC4uKSwgDQogICAgICAgICAgICAgICAgIHNpemUgPSAwLjAxLCANCiAgICAgICAgICAgICAgICAgYmlucyA9IDE2LCANCiAgICAgICAgICAgICAgICAgZ2VvbSA9ICdwb2x5Z29uJykgKw0KICBnZW9tX3BvaW50KGFlcyh4LCB5KSwgZGF0YSA9IERhdGFTZXQsIGNvbG91ciA9ICJyZWQiLCBzaXplID0gMikgKw0KICBzY2FsZV9hbHBoYShyYW5nZSA9IGMoMCwgMC4zKSwgZ3VpZGUgPSBGQUxTRSkgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlNwZWN0cmFsIikNCg0KYGBgDQoNCiMjIyBJbnRlcnBvbGF0aW9uDQoNClRoaXMgY2h1bmsgb2YgY29kZSBpbiBhZGRpdGlvbiB0byB0aGUgIkRhdGFTZXQiIGNodW5rIHdhcyB1dGlsaXplZCB0byBnZW5lcmF0ZSB0aGUgZGlzdHJpYnV0aW9uIG1hcCBvZiBhbGwgZmFjdG9ycyBvZiB0aGUgbXVsdGl2YXJpYXRlIHN0YXRpc3RpY2FsIGFuYWxpc3lzDQoNCmBgYHtyfQ0KIyMgYWtpbWEgaW50ZXJwb2xhdGlvbg0KbGlicmFyeShha2ltYSkNCg0KZGZfYWtpbWEgPC1pbnRlcnAyeHl6KGludGVycCh4PURhdGFTZXQkeCwgeT1EYXRhU2V0JHksIHo9RGF0YVNldCR6LCBkdXBsaWNhdGU9Im1lYW4iLCBsaW5lYXIgPSBGLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bz1zZXEobWluKERhdGFTZXQkeCksIG1heChEYXRhU2V0JHgpLCBsZW5ndGg9MzApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bz1zZXEobWluKERhdGFTZXQkeSksIG1heChEYXRhU2V0JHkpLCBsZW5ndGg9MzApKSwgZGF0YS5mcmFtZT1UUlVFKQ0KDQojIyBha2ltYSBwbG90DQoNCm1hcGEgPC0gZ2dtYXAoQ2FwdWF2YSwgZXh0ZW50ID0gImRldmljZSIsIGRhcmtlbiA9IC41KSArDQogIGdlb21fcGF0aChkYXRhID0gc2hhcGVmaWxlX2RmLCANCiAgICAgICAgICBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLCANCiAgICAgICAgICBjb2xvciA9ICdibHVlJywgZmlsbCA9ICdibHVlJywgc2l6ZSA9IDIpICsNCiAgZ2VvbV90aWxlKGFlcyh4ID0geCwgeSA9IHksIGZpbGwgPSB6KSwgZGF0YSA9IGRmX2FraW1hLCBhbHBoYSA9IC40KSArDQogIHN0YXRfY29udG91cihhZXMoeCA9IHgsIHkgPSB5LCB6ID0geiwgZmlsbCA9IC4ubGV2ZWwuLiksIGRhdGEgPSBkZl9ha2ltYSwgZ2VvbSA9ICdwb2x5Z29uJywgYWxwaGEgPSAuNCkgKw0KICBnZW9tX2NvbnRvdXIoYWVzKHggPSB4LCB5ID0geSwgeiA9IHopLCBkYXRhID0gZGZfYWtpbWEsIGNvbG91ciA9ICd3aGl0ZScsIGFscGhhID0gLjQpICsNCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIsIG5hLnZhbHVlID0gTkEpICsNCiAgZ2VvbV9wb2ludChhZXMoeCwgeSksIGRhdGEgPSBEYXRhU2V0LCBjb2xvdXIgPSAicmVkIiwgc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWnDp8OjbyBlc3BhY2lhbCBkbyBmYXRvciBkYSBGQU1EIiwgZmlsbCA9ICJGQU1EXzUiKQ0KDQpnZ3NhdmUobWFwYSwgZmlsZSA9ICJGQU1EXzUucG5nIiwgd2lkdGggPSA1LCBoZWlnaHQgPSA1LCB0eXBlID0gImNhaXJvLXBuZyIpDQoNCmBgYA0KDQpgYGB7cn0NCg0KYGBgDQoNCg==