4.5 Kriging Ajustar el modelo de variograma Primero, necesitamos crear un modelo de variograma. Tenga en cuenta que el modelo de variograma se calcula sobre los datos de tendencia. Esto se implementa en el siguiente fragmento de código pasando el modelo de tendencia de primer orden (definido en un fragmento de código anterior como objeto de fórmula f.1) a la función variograma.

4.3 Ajuste polinomial de primer orden Para ajustar un modelo polinomial de primer orden de la forma precip.

# Define the 1st order polynomial equation
f.1 <- as.formula(precipitaciones ~ X + Y) 
 
# Add X and Y to P
P$X <- coordinates(P)[,1]
P$Y <- coordinates(P)[,2]

# Run the regression model
lm.1 <- lm( f.1, data=P)

# Use the regression model output to interpolate the surface
dat.1st <- SpatialGridDataFrame(grd, data.frame(var1.pred = predict(lm.1, newdata=grd))) 
# Clip the interpolated raster to Texas
r   <- raster(dat.1st)
CRS object has comment, which is lost in outputDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preserved
r.m <- raster::mask(r, meta2)
Discarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preserved
# Plot the map
tm_shape(r.m) + 
  tm_raster(n=10, palette="RdBu", auto.palette.mapping=FALSE, 
            title="1st order polinomial fir \nPredicted precipitation \n(in mm)") +
  tm_shape(P) + tm_dots(size=0.2) +
  tm_legend(legend.outside=TRUE)
The argument auto.palette.mapping is deprecated. Please use midpoint for numeric data and stretch.palette for categorical data to control the palette mapping.CRS object has comment, which is lost in output

Ahora si, kriging

# Definir la ecuación polinómica de primer orden
f.1 <- as.formula (precipitaciones ~ X + Y)

# Calcular el variograma de muestra; tenga en cuenta que el modelo de tendencia f.1 es uno de los
# parámetros pasados a variogram (). Esto le dice a la función que cree el
# variograma en los datos de tendencia.
var.smpl <- variogram(f.1, P, cloud = FALSE, cutoff=200000, width=10000)

# Calcular el modelo de variograma pasando los valores de pepita, umbral y rango
# to fit.variogram () a través de la función vgm ().
dat.fit  <- fit.variogram(var.smpl, fit.ranges = TRUE, fit.sills = TRUE,
                          vgm(psill=5, model="Mat", range=120000, nugget=-0.2))

## modelo puede ser Exp, Gau, Sph, Mat
## Consulte el paquete gstat - función vgm - para obtener los nombres de estos modelos
## Revise la teoría de kriging para comprender su significado
dat.fit
# La siguiente plot nos permite evaluar el ajuste
plot(var.smpl, dat.fit, xlim=c(0,150000))

Generar superficie Kriged Luego, se usa el modelo de variograma dat.fit para generar una superficie interpolada kriged. La función krige nos permite incluir el modelo de tendencia, lo que nos evita tener que reducir la tendencia de los datos, corregir los residuos y luego combinar los dos rásteres. En cambio, todo lo que tenemos que hacer es pasar krige la fórmula de tendencia f.1.

# Definir el modelo de tendencia
f.1 <- as.formula (precipitaciones ~ X + Y)

# Realice la interpolación de krige (observe el uso del modelo de variograma
# creado en el paso anterior)
dat.krg <- krige (f.1, P, grd, dat.fit)
CRS object has comment, which is lost in outputCRS object has comment, which is lost in output
[using universal kriging]
CRS object has comment, which is lost in outputDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preserved
# Convertir superficie kriged en un objeto ráster para el recorte
r <- raster(dat.krg)
CRS object has comment, which is lost in outputDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preserved
r.m <- raster::mask(r, meta2)
Discarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preserved
r.m
class      : RasterLayer 
dimensions : 652, 767, 500084  (nrow, ncol, ncell)
resolution : 543.8037, 543.8037  (x, y)
extent     : 911335.7, 1328433, 671186.5, 1025747  (xmin, xmax, ymin, ymax)
crs        : +proj=tmerc +lat_0=4.59620041666667 +lon_0=-74.0775079166667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs 
source     : memory
names      : var1.pred 
values     : 0.8829389, 34.13062  (min, max)
# Plot the map
tm_shape(r.m) + 
  tm_raster(n=10, palette="RdBu", auto.palette.mapping=FALSE, 
            title="Kriging universal \nPredicted precipitation \n(in mm)") +
  tm_shape(P) + tm_dots(size=0.2) +
  tm_legend(legend.outside=TRUE)
The argument auto.palette.mapping is deprecated. Please use midpoint for numeric data and stretch.palette for categorical data to control the palette mapping.CRS object has comment, which is lost in output

Una mejor visualización

library(leaflet)
library(RColorBrewer)
pal <- colorNumeric(c("red", "orange", "yellow", "blue", "darkblue"), values(precip.mask),
  na.color = "transparent")

leaflet() %>% addTiles() %>%
  addRasterImage(r.m, colors = pal, opacity = 0.6) %>%
  addLegend(pal = pal, values = values(r.m),
    title = "Precipitación Interpolación Kriging en Meta\n Del  26.03 al 30.03 en 2020 [mm]")
Discarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedUsing PROJ not WKT2 stringsDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedUsing PROJ not WKT2 stringsDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionUsing PROJ not WKT2 stringsDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedUsing PROJ not WKT2 stringsDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionDiscarded ellps WGS 84 in CRS definition: +proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defsDiscarded datum WGS_1984 in CRS definitionUsing PROJ not WKT2 stringsSome values were outside the color scale and will be treated as NASome values were outside the color scale and will be treated as NA

Generar los mapas de varianza e intervalo de confianza. El objeto dat.krg almacena no solo los valores interpolados, sino también los valores de varianza. Estos se pueden pasar al objeto ráster para la asignación de la siguiente manera:

r   <- raster(dat.krg, layer="var1.var")
CRS object has comment, which is lost in outputDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preserved
r.m <- raster::mask(r, meta2)
Discarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preserved
tm_shape(r.m) + 
  tm_raster(n=7, palette ="Reds",
            title="Interpolación kriging \nMapa de varianza \n(en mm)") +tm_shape(P) + tm_dots(size=0.02) +
  tm_legend(legend.outside=TRUE)
CRS object has comment, which is lost in output

Un mapa más fácil de interpretar es el mapa del intervalo de confianza del 95% que se puede generar a partir del objeto de varianza de la siguiente manera (los valores del mapa deben interpretarse como el número de mm por encima y por debajo de la cantidad de lluvia estimada).

r   <- sqrt(raster(dat.krg, layer="var1.var")) * 1.96
CRS object has comment, which is lost in outputDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preserved
r.m <- raster::mask(r, meta2)
Discarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preservedDiscarded datum Unknown based on GRS80 ellipsoid in CRS definition,
 but +towgs84= values preserved
tm_shape(r.m) + 
  tm_raster(n=7, palette ="Reds",
            title="Interpolación Kriging\n mapa con 95% IC \n(en mm)") +tm_shape(P) + tm_dots(size=0.2) +
  tm_legend(legend.outside=TRUE)
CRS object has comment, which is lost in output

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQo0LjUgS3JpZ2luZw0KQWp1c3RhciBlbCBtb2RlbG8gZGUgdmFyaW9ncmFtYQ0KUHJpbWVybywgbmVjZXNpdGFtb3MgY3JlYXIgdW4gbW9kZWxvIGRlIHZhcmlvZ3JhbWEuIFRlbmdhIGVuIGN1ZW50YSBxdWUgZWwgbW9kZWxvIGRlIHZhcmlvZ3JhbWEgc2UgY2FsY3VsYSBzb2JyZSBsb3MgZGF0b3MgZGUgdGVuZGVuY2lhLiBFc3RvIHNlIGltcGxlbWVudGEgZW4gZWwgc2lndWllbnRlIGZyYWdtZW50byBkZSBjw7NkaWdvIHBhc2FuZG8gZWwgbW9kZWxvIGRlIHRlbmRlbmNpYSBkZSBwcmltZXIgb3JkZW4gKGRlZmluaWRvIGVuIHVuIGZyYWdtZW50byBkZSBjw7NkaWdvIGFudGVyaW9yIGNvbW8gb2JqZXRvIGRlIGbDs3JtdWxhIGYuMSkgYSBsYSBmdW5jacOzbiB2YXJpb2dyYW1hLg0KDQo0LjMgQWp1c3RlIHBvbGlub21pYWwgZGUgcHJpbWVyIG9yZGVuDQpQYXJhIGFqdXN0YXIgdW4gbW9kZWxvIHBvbGlub21pYWwgZGUgcHJpbWVyIG9yZGVuIGRlIGxhIGZvcm1hIHByZWNpcC4NCg0KYGBge3J9DQojIERlZmluZSB0aGUgMXN0IG9yZGVyIHBvbHlub21pYWwgZXF1YXRpb24NCmYuMSA8LSBhcy5mb3JtdWxhKHByZWNpcGl0YWNpb25lcyB+IFggKyBZKSANCiANCiMgQWRkIFggYW5kIFkgdG8gUA0KUCRYIDwtIGNvb3JkaW5hdGVzKFApWywxXQ0KUCRZIDwtIGNvb3JkaW5hdGVzKFApWywyXQ0KDQojIFJ1biB0aGUgcmVncmVzc2lvbiBtb2RlbA0KbG0uMSA8LSBsbSggZi4xLCBkYXRhPVApDQoNCiMgVXNlIHRoZSByZWdyZXNzaW9uIG1vZGVsIG91dHB1dCB0byBpbnRlcnBvbGF0ZSB0aGUgc3VyZmFjZQ0KZGF0LjFzdCA8LSBTcGF0aWFsR3JpZERhdGFGcmFtZShncmQsIGRhdGEuZnJhbWUodmFyMS5wcmVkID0gcHJlZGljdChsbS4xLCBuZXdkYXRhPWdyZCkpKSANCiMgQ2xpcCB0aGUgaW50ZXJwb2xhdGVkIHJhc3RlciB0byBUZXhhcw0KciAgIDwtIHJhc3RlcihkYXQuMXN0KQ0Kci5tIDwtIHJhc3Rlcjo6bWFzayhyLCBtZXRhMikNCmBgYA0KYGBge3J9DQojIFBsb3QgdGhlIG1hcA0KdG1fc2hhcGUoci5tKSArIA0KICB0bV9yYXN0ZXIobj0xMCwgcGFsZXR0ZT0iUmRCdSIsIGF1dG8ucGFsZXR0ZS5tYXBwaW5nPUZBTFNFLCANCiAgICAgICAgICAgIHRpdGxlPSIxc3Qgb3JkZXIgcG9saW5vbWlhbCBmaXIgXG5QcmVkaWN0ZWQgcHJlY2lwaXRhdGlvbiBcbihpbiBtbSkiKSArDQogIHRtX3NoYXBlKFApICsgdG1fZG90cyhzaXplPTAuMikgKw0KICB0bV9sZWdlbmQobGVnZW5kLm91dHNpZGU9VFJVRSkNCmBgYA0KDQpBaG9yYSBzaSwga3JpZ2luZw0KDQoNCmBgYHtyfQ0KIyBEZWZpbmlyIGxhIGVjdWFjacOzbiBwb2xpbsOzbWljYSBkZSBwcmltZXIgb3JkZW4NCmYuMSA8LSBhcy5mb3JtdWxhIChwcmVjaXBpdGFjaW9uZXMgfiBYICsgWSkNCg0KIyBDYWxjdWxhciBlbCB2YXJpb2dyYW1hIGRlIG11ZXN0cmE7IHRlbmdhIGVuIGN1ZW50YSBxdWUgZWwgbW9kZWxvIGRlIHRlbmRlbmNpYSBmLjEgZXMgdW5vIGRlIGxvcw0KIyBwYXLDoW1ldHJvcyBwYXNhZG9zIGEgdmFyaW9ncmFtICgpLiBFc3RvIGxlIGRpY2UgYSBsYSBmdW5jacOzbiBxdWUgY3JlZSBlbA0KIyB2YXJpb2dyYW1hIGVuIGxvcyBkYXRvcyBkZSB0ZW5kZW5jaWEuDQp2YXIuc21wbCA8LSB2YXJpb2dyYW0oZi4xLCBQLCBjbG91ZCA9IEZBTFNFLCBjdXRvZmY9MjAwMDAwLCB3aWR0aD0xMDAwMCkNCg0KIyBDYWxjdWxhciBlbCBtb2RlbG8gZGUgdmFyaW9ncmFtYSBwYXNhbmRvIGxvcyB2YWxvcmVzIGRlIHBlcGl0YSwgdW1icmFsIHkgcmFuZ28NCiMgdG8gZml0LnZhcmlvZ3JhbSAoKSBhIHRyYXbDqXMgZGUgbGEgZnVuY2nDs24gdmdtICgpLg0KZGF0LmZpdCAgPC0gZml0LnZhcmlvZ3JhbSh2YXIuc21wbCwgZml0LnJhbmdlcyA9IFRSVUUsIGZpdC5zaWxscyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHZnbShwc2lsbD01LCBtb2RlbD0iTWF0IiwgcmFuZ2U9MTIwMDAwLCBudWdnZXQ9LTAuMikpDQoNCiMjIG1vZGVsbyBwdWVkZSBzZXIgRXhwLCBHYXUsIFNwaCwgTWF0DQojIyBDb25zdWx0ZSBlbCBwYXF1ZXRlIGdzdGF0IC0gZnVuY2nDs24gdmdtIC0gcGFyYSBvYnRlbmVyIGxvcyBub21icmVzIGRlIGVzdG9zIG1vZGVsb3MNCiMjIFJldmlzZSBsYSB0ZW9yw61hIGRlIGtyaWdpbmcgcGFyYSBjb21wcmVuZGVyIHN1IHNpZ25pZmljYWRvDQpgYGANCmBgYHtyfQ0KZGF0LmZpdA0KYGBgDQoNCg0KYGBge3J9DQojIExhIHNpZ3VpZW50ZSBwbG90IG5vcyBwZXJtaXRlIGV2YWx1YXIgZWwgYWp1c3RlDQpwbG90KHZhci5zbXBsLCBkYXQuZml0LCB4bGltPWMoMCwxNTAwMDApKQ0KYGBgDQpHZW5lcmFyIHN1cGVyZmljaWUgS3JpZ2VkDQpMdWVnbywgc2UgdXNhIGVsIG1vZGVsbyBkZSB2YXJpb2dyYW1hIGRhdC5maXQgcGFyYSBnZW5lcmFyIHVuYSBzdXBlcmZpY2llIGludGVycG9sYWRhIGtyaWdlZC4gTGEgZnVuY2nDs24ga3JpZ2Ugbm9zIHBlcm1pdGUgaW5jbHVpciBlbCBtb2RlbG8gZGUgdGVuZGVuY2lhLCBsbyBxdWUgbm9zIGV2aXRhIHRlbmVyIHF1ZSByZWR1Y2lyIGxhIHRlbmRlbmNpYSBkZSBsb3MgZGF0b3MsIGNvcnJlZ2lyIGxvcyByZXNpZHVvcyB5IGx1ZWdvIGNvbWJpbmFyIGxvcyBkb3MgcsOhc3RlcmVzLiBFbiBjYW1iaW8sIHRvZG8gbG8gcXVlIHRlbmVtb3MgcXVlIGhhY2VyIGVzIHBhc2FyIGtyaWdlIGxhIGbDs3JtdWxhIGRlIHRlbmRlbmNpYSBmLjEuDQoNCmBgYHtyfQ0KIyBEZWZpbmlyIGVsIG1vZGVsbyBkZSB0ZW5kZW5jaWENCmYuMSA8LSBhcy5mb3JtdWxhIChwcmVjaXBpdGFjaW9uZXMgfiBYICsgWSkNCg0KIyBSZWFsaWNlIGxhIGludGVycG9sYWNpw7NuIGRlIGtyaWdlIChvYnNlcnZlIGVsIHVzbyBkZWwgbW9kZWxvIGRlIHZhcmlvZ3JhbWENCiMgY3JlYWRvIGVuIGVsIHBhc28gYW50ZXJpb3IpDQpkYXQua3JnIDwtIGtyaWdlIChmLjEsIFAsIGdyZCwgZGF0LmZpdCkNCmBgYA0KDQpgYGB7cn0NCiMgQ29udmVydGlyIHN1cGVyZmljaWUga3JpZ2VkIGVuIHVuIG9iamV0byByw6FzdGVyIHBhcmEgZWwgcmVjb3J0ZQ0KciA8LSByYXN0ZXIoZGF0LmtyZykNCnIubSA8LSByYXN0ZXI6Om1hc2sociwgbWV0YTIpDQpgYGANCmBgYHtyfQ0Kci5tDQpgYGANCmBgYHtyfQ0KIyBQbG90IHRoZSBtYXANCnRtX3NoYXBlKHIubSkgKyANCiAgdG1fcmFzdGVyKG49MTAsIHBhbGV0dGU9IlJkQnUiLCBhdXRvLnBhbGV0dGUubWFwcGluZz1GQUxTRSwgDQogICAgICAgICAgICB0aXRsZT0iS3JpZ2luZyB1bml2ZXJzYWwgXG5QcmVkaWN0ZWQgcHJlY2lwaXRhdGlvbiBcbihpbiBtbSkiKSArDQogIHRtX3NoYXBlKFApICsgdG1fZG90cyhzaXplPTAuMikgKw0KICB0bV9sZWdlbmQobGVnZW5kLm91dHNpZGU9VFJVRSkNCmBgYA0KDQpVbmEgbWVqb3IgdmlzdWFsaXphY2nDs24gDQoNCmBgYHtyfQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpwYWwgPC0gY29sb3JOdW1lcmljKGMoInJlZCIsICJvcmFuZ2UiLCAieWVsbG93IiwgImJsdWUiLCAiZGFya2JsdWUiKSwgdmFsdWVzKHByZWNpcC5tYXNrKSwNCiAgbmEuY29sb3IgPSAidHJhbnNwYXJlbnQiKQ0KDQpsZWFmbGV0KCkgJT4lIGFkZFRpbGVzKCkgJT4lDQogIGFkZFJhc3RlckltYWdlKHIubSwgY29sb3JzID0gcGFsLCBvcGFjaXR5ID0gMC42KSAlPiUNCiAgYWRkTGVnZW5kKHBhbCA9IHBhbCwgdmFsdWVzID0gdmFsdWVzKHIubSksDQogICAgdGl0bGUgPSAiUHJlY2lwaXRhY2nDs24gSW50ZXJwb2xhY2nDs24gS3JpZ2luZyBlbiBNZXRhXG4gRGVsICAyNi4wMyBhbCAzMC4wMyBlbiAyMDIwIFttbV0iKQ0KYGBgDQoNCkdlbmVyYXIgbG9zIG1hcGFzIGRlIHZhcmlhbnphIGUgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YS4NCkVsIG9iamV0byBkYXQua3JnIGFsbWFjZW5hIG5vIHNvbG8gbG9zIHZhbG9yZXMgaW50ZXJwb2xhZG9zLCBzaW5vIHRhbWJpw6luIGxvcyB2YWxvcmVzIGRlIHZhcmlhbnphLiBFc3RvcyBzZSBwdWVkZW4gcGFzYXIgYWwgb2JqZXRvIHLDoXN0ZXIgcGFyYSBsYSBhc2lnbmFjacOzbiBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOg0KDQpgYGB7cn0NCnIgICA8LSByYXN0ZXIoZGF0LmtyZywgbGF5ZXI9InZhcjEudmFyIikNCnIubSA8LSByYXN0ZXI6Om1hc2sociwgbWV0YTIpDQoNCnRtX3NoYXBlKHIubSkgKyANCiAgdG1fcmFzdGVyKG49NywgcGFsZXR0ZSA9IlJlZHMiLA0KICAgICAgICAgICAgdGl0bGU9IkludGVycG9sYWNpw7NuIGtyaWdpbmcgXG5NYXBhIGRlIHZhcmlhbnphIFxuKGVuIG1tKSIpICt0bV9zaGFwZShQKSArIHRtX2RvdHMoc2l6ZT0wLjAyKSArDQogIHRtX2xlZ2VuZChsZWdlbmQub3V0c2lkZT1UUlVFKQ0KYGBgDQpVbiBtYXBhIG3DoXMgZsOhY2lsIGRlIGludGVycHJldGFyIGVzIGVsIG1hcGEgZGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGVsIDk1JSBxdWUgc2UgcHVlZGUgZ2VuZXJhciBhIHBhcnRpciBkZWwgb2JqZXRvIGRlIHZhcmlhbnphIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmEgKGxvcyB2YWxvcmVzIGRlbCBtYXBhIGRlYmVuIGludGVycHJldGFyc2UgY29tbyBlbCBuw7ptZXJvIGRlIG1tIHBvciBlbmNpbWEgeSBwb3IgZGViYWpvIGRlIGxhIGNhbnRpZGFkIGRlIGxsdXZpYSBlc3RpbWFkYSkuDQoNCg0KYGBge3J9DQpyICAgPC0gc3FydChyYXN0ZXIoZGF0LmtyZywgbGF5ZXI9InZhcjEudmFyIikpICogMS45Ng0Kci5tIDwtIHJhc3Rlcjo6bWFzayhyLCBtZXRhMikNCg0KdG1fc2hhcGUoci5tKSArIA0KICB0bV9yYXN0ZXIobj03LCBwYWxldHRlID0iUmVkcyIsDQogICAgICAgICAgICB0aXRsZT0iSW50ZXJwb2xhY2nDs24gS3JpZ2luZ1xuIG1hcGEgY29uIDk1JSBJQyBcbihlbiBtbSkiKSArdG1fc2hhcGUoUCkgKyB0bV9kb3RzKHNpemU9MC4yKSArDQogIHRtX2xlZ2VuZChsZWdlbmQub3V0c2lkZT1UUlVFKQ0KYGBgDQoNCg0KDQoNCg0K