Example of a function
\(f\in C(\Gamma)\cap
\mathcal{K}(\Gamma)\setminus C^1(\Gamma)\)
Let us consider the \(3\)-star graph
\(\Gamma = (\mathcal{V},
\mathcal{E})\), where \(\mathcal{V} =
\{v, v_1, v_2, v_3\}\) and \(\mathcal{E} = \{e_1, e_2, e_3\}\). Each
edge \(e_i\) has common length \(\ell\) and connects the central vertex
\(v\) to the outer vertex \(v_i\) for \(i=1,2,3\) in such a way that \(v = \underline{e_1} = \underline{e_2} =
\underline{e_3}\). On \(\Gamma\), we define the function \(f = \{f_e\}_{e\in\mathcal{E}}\) via
\[
f_{e_1}(s) = a + b_1 s - \frac{b_1 s^3}{3\ell^2}, \quad f_{e_2}(s) = a +
b_2 s - \frac{b_2 s^3}{3\ell^2}, \quad f_{e_3}(s) = a + b_3 s -
\frac{b_3 s^3}{3\ell^2},
\]
where \(a\) (to be chosen) is the
value of \(f\) at the central vertex
and \(b_1, b_2, b_3\) are constants (to
be chosen) such that \(b_1 + b_2 + b_3 =
0\). Clearly, \(f\) is a
continuous function since
\[
f_{e_1}(0) = f_{e_2}(0) = f_{e_3}(0) = a.
\]
The derivative \(f' =
\{f'_e\}_{e\in\mathcal{E}}\) of \(f\) on each edge is given by
\[
f_{e_1}'(s) = b_1 - \frac{b_1 s^2}{\ell^2}, \quad f_{e_2}'(s) =
b_2 - \frac{b_2 s^2}{\ell^2}, \quad f_{e_3}'(s) = b_3 - \frac{b_3
s^2}{\ell^2}.
\] Since \(f_{e_1}'(0) =
b_1\), \(f_{e_2}'(0) = b_2\)
and \(f_{e_3}'(0) = b_3\), we can
choose \(b_1, b_2, b_3\) such that
\(f'\) is discontinuous at the
central vertex and satisfies the Kirchhoff vertex conditions
simultaneously. The Kirchhoff vertex conditions at the central vertex
are satisfied since
\[
f_{e_1}'(0) + f_{e_2}'(0) + f_{e_3}'(0) = b_1 + b_2 + b_3 =
0.
\]
and at the outer vertices we have
\[
f_{e_1}'(\ell) = f_{e_2}'(\ell) = f_{e_3}'(\ell) = 0.
\]
For instance, we can choose \(b_1 =
1\), \(b_2 = 1\) and \(b_3 = -2\). This choice ensures \(f\) to be continuous and satisfy the
Kirchhoff vertex conditions while \(f'\) is discontinuous at the central
vertex. See Figure 1 and 2.
# General parameters
L <- my_length # edge length
a <- 1 # value at central vertex
b <- c(1, 1, -2) # b1+b2+b3 must be 0
f1 <- function(s) a + b[1]*s - b[1]*s^3/(3*L^2)
f2 <- function(s) a + b[2]*s - b[2]*s^3/(3*L^2)
f3 <- function(s) a + b[3]*s - b[3]*s^3/(3*L^2)
df1 <- function(s) b[1] - b[1]*s^2/L^2
df2 <- function(s) b[2] - b[2]*s^2/L^2
df3 <- function(s) b[3] - b[3]*s^2/L^2
ddf1 <- function(s) -2*b[1]*s/L^2
ddf2 <- function(s) -2*b[2]*s/L^2
ddf3 <- function(s) -2*b[3]*s/L^2
dddf1 <- function(s) -2*b[1]/L^2
dddf2 <- function(s) -2*b[2]/L^2
dddf3 <- function(s) -2*b[3]/L^2
f_list <- list(f1, f2, f3)
df_list <- list(df1, df2, df3)
ddf_list <- list(ddf1, ddf2, ddf3)
dddf_list <- list(dddf1, dddf2, dddf3)
f <- apply_edge_functions_fast(graph, f_list)
df <- apply_edge_functions_fast(graph_disc, df_list)
ddf <- apply_edge_functions_fast(graph, ddf_list)
dddf <- apply_edge_functions_fast(graph_disc, dddf_list)
l_mesh <- seq(0, my_length, by = h)
dfl1 <- df1(l_mesh)
dfl2 <- df2(l_mesh)
dfl3 <- df3(l_mesh)
l_mesh_norm <- l_mesh/my_length
PtE1 <- cbind(rep(1, length(l_mesh)), l_mesh_norm)
PtE2 <- cbind(rep(2, length(l_mesh)), l_mesh_norm)
PtE3 <- cbind(rep(3, length(l_mesh)), l_mesh_norm)
XY1 <- graph$coordinates(PtE1)
XY2 <- graph$coordinates(PtE2)
XY3 <- graph$coordinates(PtE3)
DF1 <- data.frame(x = XY1[,1], y = XY1[,2], z = dfl1)
DF2 <- data.frame(x = XY2[,1], y = XY2[,2], z = dfl2)
DF3 <- data.frame(x = XY3[,1], y = XY3[,2], z = dfl3)
DF <- rbind(DF1, rep(NA, 3), DF2, rep(NA, 3), DF3)
DF_NO_NA <- rbind(DF1, DF2, DF3)
x_eye <- 5#8
y_eye <- -1#-2
z_eye <- 2#3
graph_disc$plot_function(X = df, vertex_size = gsw, edge_width = gsw, line_width = gsw, continuous = FALSE, interpolate_plot = TRUE, type = "plotly") |>
config(mathjax = 'cdn') |>
plotly::layout(title = TeX("f'"),
font = list(family = "Palatino"),
scene = list(
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0))
))
star3f <- graph$plot_function(X = f, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = dy3,
v = dx3,
w = dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
plotly::layout(title = list(text = TeX("f"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("e_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
star3df <- graph$plot_function(X = f*0, vertex_size = gsw, line_color = "black", edge_width = gsw, line_width = gsw, type = "plotly") |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = dy3,
v = dx3,
w = dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(data = DF,
x = ~y,
y = ~x,
z = ~z,
type = "scatter3d",
mode = "lines",
line = list(color = "rgb(0,0,200)", width = gsw),
showlegend = FALSE) |>
add_trace(x = rep(DF$y, each = 3),
y = rep(DF$x, each = 3),
z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
type = "scatter3d",
mode = "lines",
line = list(color = "gray", width = 0.5),
showlegend = FALSE) |>
config(mathjax = 'cdn') |>
plotly::layout(title = list(text = TeX("f'"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("e_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
star3ddf <- graph$plot_function(X = ddf, vertex_size = gsw, edge_width = gsw, line_width = gsw, continuous = TRUE, interpolate_plot = TRUE, type = "plotly") |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = dy3,
v = dx3,
w = dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
config(mathjax = 'cdn') |>
plotly::layout(title = list(text = TeX("f''"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("e_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
star3dddf <- graph_disc$plot_function(X = dddf, vertex_size = gsw, edge_width = gsw, line_width = gsw, continuous = FALSE, interpolate_plot = TRUE, type = "plotly") |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = dy3,
v = dx3,
w = dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
config(mathjax = 'cdn') |>
plotly::layout(title = list(text = TeX("f'''"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("e_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
save(star3f, file = here::here("data_files/star3f.Rdata"))
save(star3df, file = here::here("data_files/star3df.Rdata"))
save(star3ddf, file = here::here("data_files/star3ddf.Rdata"))
save(star3dddf, file = here::here("data_files/star3dddf.Rdata"))
For illustration purposes, Figure 3 and 4 shows \(f''\) and \(f'''\).
load(here::here("data_files/star3f.Rdata"))
star3f
load(here::here("data_files/star3df.Rdata"))
star3df
load(here::here("data_files/star3ddf.Rdata"))
star3ddf
load(here::here("data_files/star3dddf.Rdata"))
star3dddf
Example of a function
\(g\in C^1(\Gamma)\cap
\mathcal{K}(\Gamma)\)
Let us consider the function \(g =
\{g_e\}_{e\in\mathcal{E}}\) defined on the \(3\)-star graph with common edge length
\(\ell\) via \[
g_{e_1}(s) = \cos\left(\frac{\pi s}{\ell}\right), \quad g_{e_2}(s) =
\cos\left(\frac{\pi s}{\ell}\right), \quad g_{e_3}(s) =
\cos\left(\frac{\pi s}{\ell}\right).
\] Clearly, \(g\) is a
continuous function (see Figure 5) on \(\Gamma\) since \[
g_{e_1}(0) = g_{e_2}(0) = g_{e_3}(0) = 1.
\] The derivative \(g' =
\{g'_e\}_{e\in\mathcal{E}}\) of \(g\) on each edge is given by \[
g_{e_1}'(s) = -\frac{\pi}{\ell}\sin\left(\frac{\pi s}{\ell}\right),
\quad g_{e_2}'(s) = -\frac{\pi}{\ell}\sin\left(\frac{\pi
s}{\ell}\right), \quad g_{e_3}'(s) =
-\frac{\pi}{\ell}\sin\left(\frac{\pi s}{\ell}\right).
\] Since \(g_{e_1}'(0) =
g_{e_2}'(0) = g_{e_3}'(0) = 0\), \(g\) satisfies the Kirchhoff vertex
conditions \[
g_{e_1}'(0) + g_{e_2}'(0) + g_{e_3}'(0) = 0\text{ and
}g_{e_1}'(\ell) = g_{e_2}'(\ell) = g_{e_3}'(\ell) = 0.
\] Moreover, \(g'\) is a
continuous function. See Figure 6.
g1 <- function(s) cos(pi*s/L)
g2 <- function(s) cos(pi*s/L)
g3 <- function(s) cos(pi*s/L)
dg1 <- function(s) -pi/L*sin(pi*s/L)
dg2 <- function(s) -pi/L*sin(pi*s/L)
dg3 <- function(s) -pi/L*sin(pi*s/L)
ddg1 <- function(s) -pi^2/L^2*cos(pi*s/L)
ddg2 <- function(s) -pi^2/L^2*cos(pi*s/L)
ddg3 <- function(s) -pi^2/L^2*cos(pi*s/L)
dddg1 <- function(s) pi^3/L^3*sin(pi*s/L)
dddg2 <- function(s) pi^3/L^3*sin(pi*s/L)
dddg3 <- function(s) pi^3/L^3*sin(pi*s/L)
g_list <- list(g1, g2, g3)
dg_list <- list(dg1, dg2, dg3)
ddg_list <- list(ddg1, ddg2, ddg3)
dddg_list <- list(dddg1, dddg2, dddg3)
g <- apply_edge_functions_fast(graph, g_list)
dg <- apply_edge_functions_fast(graph, dg_list)
ddg <- apply_edge_functions_fast(graph, ddg_list)
dddg <- apply_edge_functions_fast(graph, dddg_list)
star3g <- graph$plot_function(X = g, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = dy3,
v = dx3,
w = dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
plotly::layout(title = list(text = TeX("g"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("e_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
star3dg <- graph$plot_function(X = dg, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = dy3,
v = dx3,
w = dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
plotly::layout(title = list(text = TeX("g'"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("e_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
star3ddg <- graph$plot_function(X = ddg, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = dy3,
v = dx3,
w = dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
plotly::layout(title = list(text = TeX("g''"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("e_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
star3dddg <- graph$plot_function(X = dddg, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = dy3,
v = dx3,
w = dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
plotly::layout(title = list(text = TeX("g'''"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("e_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
save(star3g, file = here::here("data_files/star3g.Rdata"))
save(star3dg, file = here::here("data_files/star3dg.Rdata"))
save(star3ddg, file = here::here("data_files/star3ddg.Rdata"))
save(star3dddg, file = here::here("data_files/star3dddg.Rdata"))
dg1 <- function(s) -pi/L*sin(pi*s/L)
dg2 <- function(s) -pi/L*sin(pi*s/L)*0
dg3 <- function(s) -pi/L*sin(pi*s/L)*(-1)
dg_list <- list(dg1, dg2, dg3)
dg <- apply_edge_functions_fast(graph, dg_list)
star3dg_path1 <- graph$plot_function(X = dg, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = -dy3,
v = -dx3,
w = -dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
add_trace(
x = c(e2_ini_y, e2_fin_y),
y = c(e2_ini_x, e2_fin_x),
z = c(e2_ini_z, e2_fin_z),
type = "scatter3d",
mode = "lines",
line = list(color = "black", width = 7),
showlegend = FALSE
) |>
add_trace(
x = c(e3_fin_y, 0, e1_fin_y),
y = c(e3_fin_x, 0, e1_fin_x),
z = c(e3_fin_z, 0, e1_fin_z),
type = "scatter3d",
mode = "lines",
line = list(color = "green", width = 7),
showlegend = FALSE
) |>
plotly::layout(title = list(text = TeX("(g|_{p_{\\hat{e}_3e_1}})'"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("\\hat{e}_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
dg1 <- function(s) -pi/L*sin(pi*s/L)*0
dg2 <- function(s) -pi/L*sin(pi*s/L)
dg3 <- function(s) -pi/L*sin(pi*s/L)*(-1)
dg_list <- list(dg1, dg2, dg3)
dg <- apply_edge_functions_fast(graph, dg_list)
star3dg_path2 <- graph$plot_function(X = dg, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = -dy3,
v = -dx3,
w = -dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
add_trace(
x = c(e1_ini_y, e1_fin_y),
y = c(e1_ini_x, e1_fin_x),
z = c(e1_ini_z, e1_fin_z),
type = "scatter3d",
mode = "lines",
line = list(color = "black", width = 7),
showlegend = FALSE
) |>
add_trace(
x = c(e3_fin_y, 0, e2_fin_y),
y = c(e3_fin_x, 0, e2_fin_x),
z = c(e3_fin_z, 0, e2_fin_z),
type = "scatter3d",
mode = "lines",
line = list(color = "green", width = 7),
showlegend = FALSE
) |>
plotly::layout(title = list(text = TeX("(g|_{p_{\\hat{e}_3e_2}})'"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("\\hat{e}_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
dg1 <- function(s) -pi/L*sin(pi*s/L)
dg2 <- function(s) -pi/L*sin(pi*s/L)*(-1)
dg3 <- function(s) -pi/L*sin(pi*s/L)*0
dg_list <- list(dg1, dg2, dg3)
dg <- apply_edge_functions_fast(graph, dg_list)
star3dg_path3 <- graph$plot_function(X = dg, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = -dy2,
v = -dx2,
w = -dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = dy3,
v = dx3,
w = dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
x = c(e3_ini_y, e3_fin_y),
y = c(e3_ini_x, e3_fin_x),
z = c(e3_ini_z, e3_fin_z),
type = "scatter3d",
mode = "lines",
line = list(color = "black", width = 7),
showlegend = FALSE
) |>
add_trace(
x = c(e1_fin_y, 0, e2_fin_y),
y = c(e1_fin_x, 0, e2_fin_x),
z = c(e1_fin_z, 0, e2_fin_z),
type = "scatter3d",
mode = "lines",
line = list(color = "green", width = 7),
showlegend = FALSE
) |>
plotly::layout(title = list(text = TeX("(g|_{p_{\\hat{e}_2e_1}})'"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("\\hat{e}_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("e_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
dg1 <- function(s) -pi/L*sin(pi*s/L)
dg2 <- function(s) -pi/L*sin(pi*s/L)
dg3 <- function(s) -pi/L*sin(pi*s/L)*(-1)
dg_list <- list(dg1, dg2, dg3)
dg <- apply_edge_functions_fast(graph, dg_list)
star3dg_path_ok <- graph$plot_function(X = dg, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = -dy3,
v = -dx3,
w = -dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
plotly::layout(title = list(text = TeX("g'"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("\\hat{e}_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
save(star3dg_path1, file = here::here("data_files/star3dg_path1.Rdata"))
save(star3dg_path2, file = here::here("data_files/star3dg_path2.Rdata"))
save(star3dg_path3, file = here::here("data_files/star3dg_path3.Rdata"))
save(star3dg_path_ok, file = here::here("data_files/star3dg_path_ok.Rdata"))
ddg1 <- function(s) -pi^2/L^2*cos(pi*s/L)
ddg2 <- function(s) -pi^2/L^2*cos(pi*s/L)*0
ddg3 <- function(s) -pi^2/L^2*cos(pi*s/L)*(-1)
ddg_list <- list(ddg1, ddg2, ddg3)
ddg <- apply_edge_functions_fast(graph, ddg_list)
l_mesh <- seq(0, my_length, by = h)
dfl1 <- ddg1(l_mesh)
dfl2 <- ddg2(l_mesh)
dfl3 <- ddg3(l_mesh)
l_mesh_norm <- l_mesh/my_length
PtE1 <- cbind(rep(1, length(l_mesh)), l_mesh_norm)
PtE2 <- cbind(rep(2, length(l_mesh)), l_mesh_norm)
PtE3 <- cbind(rep(3, length(l_mesh)), l_mesh_norm)
XY1 <- graph$coordinates(PtE1)
XY2 <- graph$coordinates(PtE2)
XY3 <- graph$coordinates(PtE3)
DF1 <- data.frame(x = XY1[,1], y = XY1[,2], z = dfl1)
DF2 <- data.frame(x = XY2[,1], y = XY2[,2], z = dfl2)
DF3 <- data.frame(x = XY3[,1], y = XY3[,2], z = dfl3)
DF <- rbind(DF1, rep(NA, 3), DF2, rep(NA, 3), DF3)
DF_NO_NA <- rbind(DF1, DF2, DF3)
star3ddg_path1 <- graph$plot_function(X = ddg*0, vertex_size = gsw, line_color = "black", edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = -dy3,
v = -dx3,
w = -dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
add_trace(data = DF,
x = ~y,
y = ~x,
z = ~z,
type = "scatter3d",
mode = "lines",
line = list(color = "rgb(0,0,200)", width = gsw),
showlegend = FALSE) |>
add_trace(x = rep(DF$y, each = 3),
y = rep(DF$x, each = 3),
z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
type = "scatter3d",
mode = "lines",
line = list(color = "gray", width = 0.5),
showlegend = FALSE) |>
add_trace(
x = c(e2_ini_y, e2_fin_y),
y = c(e2_ini_x, e2_fin_x),
z = c(e2_ini_z, e2_fin_z),
type = "scatter3d",
mode = "lines",
line = list(color = "black", width = 7),
showlegend = FALSE
) |>
add_trace(
x = c(e3_fin_y, 0, e1_fin_y),
y = c(e3_fin_x, 0, e1_fin_x),
z = c(e3_fin_z, 0, e1_fin_z),
type = "scatter3d",
mode = "lines",
line = list(color = "green", width = 7),
showlegend = FALSE
) |>
plotly::layout(title = list(text = TeX("(g'|_{p_{\\hat{e}_3e_1}})'"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("\\hat{e}_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
ddg1 <- function(s) -pi^2/L^2*cos(pi*s/L)*0
ddg2 <- function(s) -pi^2/L^2*cos(pi*s/L)
ddg3 <- function(s) -pi^2/L^2*cos(pi*s/L)*(-1)
ddg_list <- list(ddg1, ddg2, ddg3)
ddg <- apply_edge_functions_fast(graph, ddg_list)
l_mesh <- seq(0, my_length, by = h)
dfl1 <- ddg1(l_mesh)
dfl2 <- ddg2(l_mesh)
dfl3 <- ddg3(l_mesh)
l_mesh_norm <- l_mesh/my_length
PtE1 <- cbind(rep(1, length(l_mesh)), l_mesh_norm)
PtE2 <- cbind(rep(2, length(l_mesh)), l_mesh_norm)
PtE3 <- cbind(rep(3, length(l_mesh)), l_mesh_norm)
XY1 <- graph$coordinates(PtE1)
XY2 <- graph$coordinates(PtE2)
XY3 <- graph$coordinates(PtE3)
DF1 <- data.frame(x = XY1[,1], y = XY1[,2], z = dfl1)
DF2 <- data.frame(x = XY2[,1], y = XY2[,2], z = dfl2)
DF3 <- data.frame(x = XY3[,1], y = XY3[,2], z = dfl3)
DF <- rbind(DF1, rep(NA, 3), DF2, rep(NA, 3), DF3)
DF_NO_NA <- rbind(DF1, DF2, DF3)
star3ddg_path2 <- graph$plot_function(X = ddg*0, vertex_size = gsw, line_color = "black", edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = dy2,
v = dx2,
w = dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = -dy3,
v = -dx3,
w = -dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
add_trace(data = DF,
x = ~y,
y = ~x,
z = ~z,
type = "scatter3d",
mode = "lines",
line = list(color = "rgb(0,0,200)", width = gsw),
showlegend = FALSE) |>
add_trace(x = rep(DF$y, each = 3),
y = rep(DF$x, each = 3),
z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
type = "scatter3d",
mode = "lines",
line = list(color = "gray", width = 0.5),
showlegend = FALSE) |>
add_trace(
x = c(e1_ini_y, e1_fin_y),
y = c(e1_ini_x, e1_fin_x),
z = c(e1_ini_z, e1_fin_z),
type = "scatter3d",
mode = "lines",
line = list(color = "black", width = 7),
showlegend = FALSE
) |>
add_trace(
x = c(e3_fin_y, 0, e2_fin_y),
y = c(e3_fin_x, 0, e2_fin_x),
z = c(e3_fin_z, 0, e2_fin_z),
type = "scatter3d",
mode = "lines",
line = list(color = "green", width = 7),
showlegend = FALSE
) |>
plotly::layout(title = list(text = TeX("(g'|_{p_{\\hat{e}_3e_2}})'"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("\\hat{e}_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
ddg1 <- function(s) -pi^2/L^2*cos(pi*s/L)
ddg2 <- function(s) -pi^2/L^2*cos(pi*s/L)*(-1)
ddg3 <- function(s) -pi^2/L^2*cos(pi*s/L)*0
ddg_list <- list(ddg1, ddg2, ddg3)
ddg <- apply_edge_functions_fast(graph, ddg_list)
l_mesh <- seq(0, my_length, by = h)
dfl1 <- ddg1(l_mesh)
dfl2 <- ddg2(l_mesh)
dfl3 <- ddg3(l_mesh)
l_mesh_norm <- l_mesh/my_length
PtE1 <- cbind(rep(1, length(l_mesh)), l_mesh_norm)
PtE2 <- cbind(rep(2, length(l_mesh)), l_mesh_norm)
PtE3 <- cbind(rep(3, length(l_mesh)), l_mesh_norm)
XY1 <- graph$coordinates(PtE1)
XY2 <- graph$coordinates(PtE2)
XY3 <- graph$coordinates(PtE3)
DF1 <- data.frame(x = XY1[,1], y = XY1[,2], z = dfl1)
DF2 <- data.frame(x = XY2[,1], y = XY2[,2], z = dfl2)
DF3 <- data.frame(x = XY3[,1], y = XY3[,2], z = dfl3)
DF <- rbind(DF1, rep(NA, 3), DF2, rep(NA, 3), DF3)
DF_NO_NA <- rbind(DF1, DF2, DF3)
star3ddg_path3 <- graph$plot_function(X = ddg*0, vertex_size = gsw, line_color = "black", edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym2,
y = xm2,
z = zm2,
u = -dy2,
v = -dx2,
w = -dz2,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("green", "green")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym3,
y = xm3,
z = zm3,
u = dy3,
v = dx3,
w = dz3,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(data = DF,
x = ~y,
y = ~x,
z = ~z,
type = "scatter3d",
mode = "lines",
line = list(color = "rgb(0,0,200)", width = gsw),
showlegend = FALSE) |>
add_trace(x = rep(DF$y, each = 3),
y = rep(DF$x, each = 3),
z = unlist(lapply(DF$z, function(zj) c(0, zj, NA))),
type = "scatter3d",
mode = "lines",
line = list(color = "gray", width = 0.5),
showlegend = FALSE) |>
add_trace(
x = c(e3_ini_y, e3_fin_y),
y = c(e3_ini_x, e3_fin_x),
z = c(e3_ini_z, e3_fin_z),
type = "scatter3d",
mode = "lines",
line = list(color = "black", width = 7),
showlegend = FALSE
) |>
add_trace(
x = c(e1_fin_y, 0, e2_fin_y),
y = c(e1_fin_x, 0, e2_fin_x),
z = c(e1_fin_z, 0, e2_fin_z),
type = "scatter3d",
mode = "lines",
line = list(color = "green", width = 7),
showlegend = FALSE
) |>
plotly::layout(title = list(text = TeX("(g'|_{p_{\\hat{e}_2e_1}})'"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e2_fin_y, y = e2_fin_x, z = e2_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e3_fin_y, y = e3_fin_x, z = e3_fin_z,
text = TeX("v_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym2, y = xm2, z = zm2,
text = TeX("\\hat{e}_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym3, y = xm3, z = zm3,
text = TeX("e_3"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
save(star3ddg_path1, file = here::here("data_files/star3ddg_path1.Rdata"))
save(star3ddg_path2, file = here::here("data_files/star3ddg_path2.Rdata"))
save(star3ddg_path3, file = here::here("data_files/star3ddg_path3.Rdata"))
For illustration purposes, Figure 7 and 8 shows \(g''\) and \(g'''\).
load(here::here("data_files/star3g.Rdata"))
star3g
load(here::here("data_files/star3dg.Rdata"))
star3dg
load(here::here("data_files/star3ddg.Rdata"))
star3ddg
load(here::here("data_files/star3dddg.Rdata"))
star3dddg
Example of a function
\(h\in C^1(\Gamma)\cap
\mathcal{K}(\Gamma)\) where \(h'\) looks discontinuous
Let us consider the \(2\)-star graph
\(\Gamma = (\mathcal{V},
\mathcal{E})\), where \(\mathcal{V} =
\{v, v_1, v_2\}\) and \(\mathcal{E} =
\{e_1, e_2\}\). Each edge \(e_i\) has common length \(\ell\) and connects the central vertex
\(v\) to the outer vertex \(v_i\) for \(i=1,2\) in such a way that \(v = \underline{e_1} = \underline{e_2}\). On
\(\Gamma\), we define the function
\(h = \{h_e\}_{e\in\mathcal{E}}\)
via
\[
h_{e_1}(s) = a + b_1 s - \frac{b_1 s^3}{3\ell^2}, \quad h_{e_2}(s) = a +
b_2 s - \frac{b_2 s^3}{3\ell^2}.
\] Clearly, \(h\) is a
continuous function (see Figure 9) since \[
h_{e_1}(0) = h_{e_2}(s) = a.
\] The derivative \(h' =
\{h'_e\}_{e\in\mathcal{E}}\) of \(h\) on each edge is given by
\[
h_{e_1}'(s) = b_1 - \frac{b_1 s^2}{\ell^2}, \quad h_{e_2}'(s) =
b_2 - \frac{b_2 s^2}{\ell^2}.
\] By choosing \(b_1=1\) and
\(b_2=-1\), we have that \[
h_{e_1}'(0)+h_{e_2}'(0) = b_1+b_2=0\quad\text{ and }\quad
h_{e_1}'(\ell) =h_{e_2}'(\ell) = 0,
\] so that \(h\) satisfies the
Kirchhoff conditions at every vertex. This means that \(h'\) should be a continuous function.
However, Figure 10 shows that \(h'\) is discontinuous. This is actually
an artefact due to the fact that the edges are not compatible oriented.
For a discussion about compatible orientation, go to this page.
n <- 2
my_length <- 2
edges <-edges_roots_of_unity(n, length = my_length)
edges[[1]] <- rbind(c(0, 0), c(my_length, 0))
edges[[2]] <- rbind(c(0, 0), c(-my_length, 0))
graph <- metric_graph$new(edges = edges)
graph_disc <- graph$clone()
graph$build_mesh(h = h)
graph_disc$build_mesh(h = h, continuous = FALSE)
# General parameters
L <- my_length # edge length
a <- 1 # value at central vertex
b <- c(1, -1) # b1+b2+b3 must be 0
f1 <- function(s) a + b[1]*s - b[1]*s^3/(3*L^2)
f2 <- function(s) a + b[2]*s - b[2]*s^3/(3*L^2)
df1 <- function(s) b[1] - b[1]*s^2/L^2
df2 <- function(s) b[2] - b[2]*s^2/L^2
ddf1 <- function(s) -2*b[1]*s/L^2
ddf2 <- function(s) -2*b[2]*s/L^2
dddf1 <- function(s) -2*b[1]/L^2
dddf2 <- function(s) -2*b[2]/L^2
f_list <- list(f1, f2)
df_list <- list(df1, df2)
ddf_list <- list(ddf1, ddf2)
dddf_list <- list(dddf1, dddf2)
f <- apply_edge_functions_fast(graph, f_list)
df <- apply_edge_functions_fast(graph_disc, df_list)
ddf <- apply_edge_functions_fast(graph, ddf_list)
dddf <- apply_edge_functions_fast(graph_disc, dddf_list)
l_mesh <- seq(0, my_length, by = h)
dfl1 <- df1(l_mesh)
dfl2 <- df2(l_mesh)
l_mesh_norm <- l_mesh/my_length
PtE1 <- cbind(rep(1, length(l_mesh)), l_mesh_norm)
PtE2 <- cbind(rep(2, length(l_mesh)), l_mesh_norm)
XY1 <- graph$coordinates(PtE1)
XY2 <- graph$coordinates(PtE2)
DF1 <- data.frame(x = XY1[,1], y = XY1[,2], z = dfl1)
DF2 <- data.frame(x = XY2[,1], y = XY2[,2], z = dfl2)
DF <- rbind(DF1, rep(NA, 3), DF2)
DF_NO_NA <- rbind(DF1, DF2)
star2f <- graph$plot_function(X = f, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym4,
y = xm4,
z = zm4,
u = dy4,
v = dx4,
w = dz4,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
plotly::layout(title = list(text = TeX("h"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e4_fin_y, y = e4_fin_x, z = e4_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym4, y = xm4, z = zm4,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
star2df <- graph$plot_function(X = f*0, vertex_size = gsw, line_color = "black", edge_width = gsw, line_width = gsw, type = "plotly") |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym4,
y = xm4,
z = zm4,
u = dy4,
v = dx4,
w = dz4,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(data = DF,
x = ~y,
y = ~x,
z = ~z,
type = "scatter3d",
mode = "lines",
line = list(color = "rgb(0,0,200)", width = gsw),
showlegend = FALSE) |>
add_trace(x = rep(DF_NO_NA$y, each = 3),
y = rep(DF_NO_NA$x, each = 3),
z = unlist(lapply(DF_NO_NA$z, function(zj) c(0, zj, NA))),
type = "scatter3d",
mode = "lines",
line = list(color = "gray", width = 0.5),
showlegend = FALSE) |>
config(mathjax = 'cdn') |>
plotly::layout(title = list(text = TeX("h'"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e4_fin_y, y = e4_fin_x, z = e4_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym4, y = xm4, z = zm4,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
star2ddf <- graph$plot_function(X = ddf, vertex_size = gsw, edge_width = gsw, line_width = gsw, type = "plotly") |>
config(mathjax = 'cdn') |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym4,
y = xm4,
z = zm4,
u = dy4,
v = dx4,
w = dz4,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
plotly::layout(title = list(text = TeX("h''"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e4_fin_y, y = e4_fin_x, z = e4_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym4, y = xm4, z = zm4,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
star2dddf <- graph_disc$plot_function(X = dddf, vertex_size = gsw, edge_width = gsw, line_width = gsw, continuous = FALSE, interpolate_plot = TRUE, type = "plotly") |>
add_trace(
type = "cone",
x = ym1,
y = xm1,
z = zm1,
u = dy1,
v = dx1,
w = dz1,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
add_trace(
type = "cone",
x = ym4,
y = xm4,
z = zm4,
u = dy4,
v = dx4,
w = dz4,
sizemode = "absolute",
sizeref = sizeref,
showscale = FALSE,
showlegend = FALSE,
colorscale = list(c(0, 1), c("red", "red")),
cmin = 0,
cmax = 1
) |>
config(mathjax = 'cdn') |>
plotly::layout(title = list(text = TeX("h'''"), y = 0.8),
font = list(family = "Palatino"),
scene = list(xaxis = list(title = list(text = "x", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
yaxis = list(title = list(text = "y", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
zaxis = list(title = list(text = "z", font = list(color = colaxnn)), tickfont = list(color = colaxnn)),
aspectratio = list(x = 2,
y = 2,
z = 2),
camera = list(eye = list(x = x_eye,
y = y_eye,
z = z_eye),
center = list(x = 0,
y = 0,
z = 0)),
annotations = list(
list(
x = 0, y = 0, z = 0,
text = TeX("v"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e1_fin_y, y = e1_fin_x, z = e1_fin_z,
text = TeX("v_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = e4_fin_y, y = e4_fin_x, z = e4_fin_z,
text = TeX("v_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym1, y = xm1, z = zm1,
text = TeX("e_1"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"),
list(
x = ym4, y = xm4, z = zm4,
text = TeX("e_2"),
textangle = 0, ax = 0, ay = 35,
font = list(color = "black", size = gfsize),
arrowcolor = "rgba(0,0,0,0)"))
))
save(star2f, file = here::here("data_files/star2f.Rdata"))
save(star2df, file = here::here("data_files/star2df.Rdata"))
save(star2ddf, file = here::here("data_files/star2ddf.Rdata"))
save(star2dddf, file = here::here("data_files/star2dddf.Rdata"))
For illustration purposes, Figure 11 and 12 shows \(h''\) and \(h'''\).
load(here::here("data_files/star2f.Rdata"))
star2f
load(here::here("data_files/star2df.Rdata"))
star2df
load(here::here("data_files/star2ddf.Rdata"))
star2ddf
load(here::here("data_files/star2dddf.Rdata"))
star2dddf
LS0tCnRpdGxlOiAiS2lyY2hob2ZmIHZlcnRleCBjb25kaXRpb25zIgpkYXRlOiAiTGFzdCBtb2RpZmllZDogYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWS4nKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgbWF0aGpheDogImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vbWF0aGpheEAzL2VzNS90ZXgtbW1sLWNodG1sLmpzIgogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgdGhlbWU6IGZsYXRseQogICAgY29kZV9mb2xkaW5nOiBoaWRlICMgY2xhc3Muc291cmNlID0gImZvbGQtaGlkZSIgdG8gaGlkZSBjb2RlIGFuZCBhZGQgYSBidXR0b24gdG8gc2hvdyBpdAogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNzczogdmlzdWFsLmNzcwphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQpiaWJsaW9ncmFwaHk6IAogIC0gcmVmZXJlbmNlcy5iaWIKICAtIGdyYXRlZnVsLXJlZnMuYmliCmhlYWRlci1pbmNsdWRlczoKICAtIFxuZXdjb21tYW5ke1xhcn17XG1hdGhiYntSfX0KICAtIFxuZXdjb21tYW5ke1xsbGF2fVsxXXtcbGVmdFx7IzFccmlnaHRcfX0KICAtIFxuZXdjb21tYW5ke1xwYXJlfVsxXXtcbGVmdCgjMVxyaWdodCl9CiAgLSBcbmV3Y29tbWFuZHtcTmNhbH17XG1hdGhjYWx7Tn19CiAgLSBcbmV3Y29tbWFuZHtcVmNhbH17XG1hdGhjYWx7Vn19CiAgLSBcbmV3Y29tbWFuZHtcRWNhbH17XG1hdGhjYWx7RX19CiAgLSBcbmV3Y29tbWFuZHtcV2NhbH17XG1hdGhjYWx7V319CiAgLSBcbmV3Y29tbWFuZHtcYWxtb3N0ZXZlcnl3aGVyZX17XG1hdGhybXthLmUufVw7fQotLS0KCkdvIGJhY2sgdG8gdGhlIFtDb250ZW50c10oYWJvdXQuaHRtbCkgcGFnZS4KCjxkaXYgc3R5bGU9ImNvbG9yOiAjMmMzZTUwOyB0ZXh0LWFsaWduOiByaWdodDsiPgoqKioqKioqKiAgCjxzdHJvbmc+UHJlc3MgU2hvdyB0byByZXZlYWwgdGhlIGNvZGUgY2h1bmtzLjwvc3Ryb25nPiAgCgoqKioqKioqKgo8L2Rpdj4KCgpgYGB7cn0KIyBDcmVhdGUgYSBjbGlwYm9hcmQgYnV0dG9uIG9uIHRoZSByZW5kZXJlZCBIVE1MIHBhZ2UKc291cmNlKGhlcmU6OmhlcmUoImNsaXBib2FyZC5SIikpOyBjbGlwYm9hcmQKIyBTZXQgc2VlZCBmb3IgcmVwcm9kdWNpYmlsaXR5CnNldC5zZWVkKDE5ODIpIAojIFNldCBnbG9iYWwgb3B0aW9ucyBmb3IgYWxsIGNvZGUgY2h1bmtzCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICAjIERpc2FibGUgbWVzc2FnZXMgcHJpbnRlZCBieSBSIGNvZGUgY2h1bmtzCiAgbWVzc2FnZSA9IEZBTFNFLCAgICAKICAjIERpc2FibGUgd2FybmluZ3MgcHJpbnRlZCBieSBSIGNvZGUgY2h1bmtzCiAgd2FybmluZyA9IEZBTFNFLCAgICAKICAjIFNob3cgUiBjb2RlIHdpdGhpbiBjb2RlIGNodW5rcyBpbiBvdXRwdXQKICBlY2hvID0gVFJVRSwgICAgICAgIAogICMgSW5jbHVkZSBib3RoIFIgY29kZSBhbmQgaXRzIHJlc3VsdHMgaW4gb3V0cHV0CiAgaW5jbHVkZSA9IFRSVUUsICAgICAKICAjIEV2YWx1YXRlIFIgY29kZSBjaHVua3MKICBldmFsID0gRkFMU0UsICAgICAgIAogICMgRW5hYmxlIGNhY2hpbmcgb2YgUiBjb2RlIGNodW5rcyBmb3IgZmFzdGVyIHJlbmRlcmluZwogIGNhY2hlID0gRkFMU0UsICAgICAgCiAgIyBBbGlnbiBmaWd1cmVzIGluIHRoZSBjZW50ZXIgb2YgdGhlIG91dHB1dAogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLAogICMgRW5hYmxlIHJldGluYSBkaXNwbGF5IGZvciBoaWdoLXJlc29sdXRpb24gZmlndXJlcwogIHJldGluYSA9IDIsCiAgIyBTaG93IGVycm9ycyBpbiB0aGUgb3V0cHV0IGluc3RlYWQgb2Ygc3RvcHBpbmcgcmVuZGVyaW5nCiAgZXJyb3IgPSBUUlVFLAogICMgRG8gbm90IGNvbGxhcHNlIGNvZGUgYW5kIG91dHB1dCBpbnRvIGEgc2luZ2xlIGJsb2NrCiAgY29sbGFwc2UgPSBGQUxTRQopCiMgU3RhcnQgdGhlIGZpZ3VyZSBjb3VudGVyCmZpZ19jb3VudCA8LSAwCiMgRGVmaW5lIHRoZSBjYXB0aW9uZXIgZnVuY3Rpb24KY2FwdGlvbmVyIDwtIGZ1bmN0aW9uKGNhcHRpb24pIHsKICBmaWdfY291bnQgPDwtIGZpZ19jb3VudCArIDEKICBwYXN0ZTAoIkZpZ3VyZSAiLCBmaWdfY291bnQsICI6ICIsIGNhcHRpb24pCn0KCmBgYAoKYGBge3IsIGV2YWwgPSBUUlVFfQpsaWJyYXJ5KE1ldHJpY0dyYXBoKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocmVzaGFwZTIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShwbG90bHkpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KHNsYWNrcikKc291cmNlKCJrZXlzLlIiKQpzbGFja3Jfc2V0dXAodG9rZW4gPSB0b2tlbikgIyB0b2tlbiBjb21lcyBmcm9tIGtleXMuUgpgYGAKCgpgYGB7cn0KY2FwdHVyZS5vdXRwdXQoCiAga25pdHI6OnB1cmwoaGVyZTo6aGVyZSgiZnVuY3Rpb25hbGl0eTEuUm1kIiksIG91dHB1dCA9IGhlcmU6OmhlcmUoImZ1bmN0aW9uYWxpdHkxLlIiKSksCiAgZmlsZSA9IGhlcmU6OmhlcmUoIm9sZC9wdXJsX2xvZy50eHQiKQopCnNvdXJjZShoZXJlOjpoZXJlKCJmdW5jdGlvbmFsaXR5MS5SIikpCmBgYAoKYGBge3J9CmVkZ2VzX3Jvb3RzX29mX3VuaXR5IDwtIGZ1bmN0aW9uKG4sIGxlbmd0aCA9IDEwKSB7CiAgeF9jb29yZHMgPC0gY29zKDIgKiBwaSAqICgwOihuLTEpKSAvIG4pCiAgeV9jb29yZHMgPC0gc2luKDIgKiBwaSAqICgwOihuLTEpKSAvIG4pCiAgcmV0dXJuKGxhcHBseSgxOm4sIGZ1bmN0aW9uKGkpIHtyYmluZChjKDAsIDApLCBjKGxlbmd0aCp4X2Nvb3Jkc1tpXSwgbGVuZ3RoKnlfY29vcmRzW2ldKSl9KSkKfQpuIDwtIDMKbXlfbGVuZ3RoIDwtIDIKZWRnZXMgPC1lZGdlc19yb290c19vZl91bml0eShuLCBsZW5ndGggPSBteV9sZW5ndGgpCiNlZGdlc1tbMV1dIDwtIGVkZ2VzW1sxXV1bMjoxLF0KZ3JhcGggPC0gbWV0cmljX2dyYXBoJG5ldyhlZGdlcyA9IGVkZ2VzKQpncmFwaF9kaXNjIDwtIGdyYXBoJGNsb25lKCkKYGBgCgoKYGBge3J9CmUxX2luaV94IDwtIGVkZ2VzW1sxXV1bMSwxXTsgZTFfaW5pX3kgPC0gZWRnZXNbWzFdXVsxLDJdOyBlMV9pbmlfeiA8LSAwCmUxX2Zpbl94IDwtIGVkZ2VzW1sxXV1bMiwxXTsgZTFfZmluX3kgPC0gZWRnZXNbWzFdXVsyLDJdOyBlMV9maW5feiA8LSAwCgojIE1pZHBvaW50CnhtMSA8LSAoZTFfZmluX3ggKyBlMV9pbmlfeCkvMgp5bTEgPC0gKGUxX2Zpbl95ICsgZTFfaW5pX3kpLzIKem0xIDwtIChlMV9maW5feiArIGUxX2luaV96KS8yCgojIERpcmVjdGlvbiB2ZWN0b3IKZHgxIDwtIGUxX2Zpbl94IC0gZTFfaW5pX3gKZHkxIDwtIGUxX2Zpbl95IC0gZTFfaW5pX3kKZHoxIDwtIGUxX2Zpbl96IC0gZTFfaW5pX3oKCmUyX2luaV94IDwtIGVkZ2VzW1syXV1bMSwxXTsgZTJfaW5pX3kgPC0gZWRnZXNbWzJdXVsxLDJdOyBlMl9pbmlfeiA8LSAwCmUyX2Zpbl94IDwtIGVkZ2VzW1syXV1bMiwxXTsgZTJfZmluX3kgPC0gZWRnZXNbWzJdXVsyLDJdOyBlMl9maW5feiA8LSAwCgojIE1pZHBvaW50CnhtMiA8LSAoZTJfZmluX3ggKyBlMl9pbmlfeCkvMgp5bTIgPC0gKGUyX2Zpbl95ICsgZTJfaW5pX3kpLzIKem0yIDwtIChlMl9maW5feiArIGUyX2luaV96KS8yCgojIERpcmVjdGlvbiB2ZWN0b3IKZHgyIDwtIGUyX2Zpbl94IC0gZTJfaW5pX3gKZHkyIDwtIGUyX2Zpbl95IC0gZTJfaW5pX3kKZHoyIDwtIGUyX2Zpbl96IC0gZTJfaW5pX3oKCmUzX2luaV94IDwtIGVkZ2VzW1szXV1bMSwxXTsgZTNfaW5pX3kgPC0gZWRnZXNbWzNdXVsxLDJdOyBlM19pbmlfeiA8LSAwCmUzX2Zpbl94IDwtIGVkZ2VzW1szXV1bMiwxXTsgZTNfZmluX3kgPC0gZWRnZXNbWzNdXVsyLDJdOyBlM19maW5feiA8LSAwCgojIE1pZHBvaW50CnhtMyA8LSAoZTNfZmluX3ggKyBlM19pbmlfeCkvMgp5bTMgPC0gKGUzX2Zpbl95ICsgZTNfaW5pX3kpLzIKem0zIDwtIChlM19maW5feiArIGUzX2luaV96KS8yCgojIERpcmVjdGlvbiB2ZWN0b3IKZHgzIDwtIGUzX2Zpbl94IC0gZTNfaW5pX3gKZHkzIDwtIGUzX2Zpbl95IC0gZTNfaW5pX3kKZHozIDwtIGUzX2Zpbl96IC0gZTNfaW5pX3oKCmU0X2luaV94IDwtIDA7IGU0X2luaV95IDwtIDA7IGU0X2luaV96IDwtIDAKZTRfZmluX3ggPC0gLW15X2xlbmd0aDsgZTRfZmluX3kgPC0gMDsgZTRfZmluX3ogPC0gMAoKIyBNaWRwb2ludAp4bTQgPC0gKGU0X2Zpbl94ICsgZTRfaW5pX3gpLzIKeW00IDwtIChlNF9maW5feSArIGU0X2luaV95KS8yCnptNCA8LSAoZTRfZmluX3ogKyBlNF9pbmlfeikvMgoKIyBEaXJlY3Rpb24gdmVjdG9yCmR4NCA8LSBlNF9maW5feCAtIGU0X2luaV94CmR5NCA8LSBlNF9maW5feSAtIGU0X2luaV95CmR6NCA8LSBlNF9maW5feiAtIGU0X2luaV96CgpzaXplcmVmIDwtIDAuMgpgYGAKCgpgYGB7cn0KaCA9IDAuMDIKZ3JhcGgkYnVpbGRfbWVzaChoID0gaCkKZ3JhcGhfZGlzYyRidWlsZF9tZXNoKGggPSBoLCBjb250aW51b3VzID0gRkFMU0UpCmBgYAoKCgoKYGBge3J9CmFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QgPC0gZnVuY3Rpb24oZ3JhcGgsIGZfbGlzdCkgewogIAogIGlmIChsZW5ndGgoZl9saXN0KSAhPSBncmFwaCRuRSkgewogICAgc3RvcChzcHJpbnRmKAogICAgICAiTnVtYmVyIG9mIGZ1bmN0aW9ucyAoJWQpIG11c3QgZXF1YWwgbnVtYmVyIG9mIGVkZ2VzICglZCkuIiwKICAgICAgbGVuZ3RoKGZfbGlzdCksIGdyYXBoJG5FCiAgICApKQogIH0KICBWdEUgPC0gZ3JhcGgkbWVzaCRWdEUKICBlZGdlX2xlbmd0aHMgPC0gZ3JhcGgkZWRnZV9sZW5ndGhzCiAgCiAgZWRnZSAgIDwtIFZ0RVssMV0KICBzX25vcm0gPC0gVnRFWywyXQogIHNfdHJ1ZSA8LSBzX25vcm0gKiBlZGdlX2xlbmd0aHNbZWRnZV0KICAKICAjIHNfdHJ1ZSA8LSBpZmVsc2UoZ3JhcGgkZWRnZV9vcmllbnRhdGlvbltlZGdlXSA9PSAtMSwKICAjICAgICAgICAgICAgICAgIGVkZ2VfbGVuZ3Roc1tlZGdlXSAqICgxIC0gc19ub3JtKSwKICAjICAgICAgICAgICAgICAgIGVkZ2VfbGVuZ3Roc1tlZGdlXSAqIHNfbm9ybSkKCiAgCiAgIyBvdXQgPC0gbnVtZXJpYyhsZW5ndGgoZWRnZSkpCiAgIyBmb3IgKGUgaW4gc2VxX2xlbihncmFwaCRuRSkpIHsKICAjICAgaWR4IDwtIHdoaWNoKGVkZ2UgPT0gZSkKICAjICAgb3V0W2lkeF0gPC0gZl9saXN0W1tlXV0oc190cnVlW2lkeF0pCiAgIyB9CiAgIyByZXR1cm4ob3V0KQogIG91dCA8LSBzYXBwbHkoc2VxX2xlbihucm93KFZ0RSkpLCBmdW5jdGlvbihpKSBmX2xpc3RbW2VkZ2VbaV1dXShzX3RydWVbaV0pKQogIHJldHVybihvdXQpCn0KYGBgCgoKIyBFeGFtcGxlIG9mIGEgZnVuY3Rpb24gJGZcaW4gQyhcR2FtbWEpXGNhcCBcbWF0aGNhbHtLfShcR2FtbWEpXHNldG1pbnVzIENeMShcR2FtbWEpJAoKCkxldCB1cyBjb25zaWRlciB0aGUgJDMkLXN0YXIgZ3JhcGggJFxHYW1tYSA9IChcbWF0aGNhbHtWfSwgXG1hdGhjYWx7RX0pJCwgd2hlcmUgJFxtYXRoY2Fse1Z9ID0gXHt2LCB2XzEsIHZfMiwgdl8zXH0kIGFuZCAkXG1hdGhjYWx7RX0gPSBce2VfMSwgZV8yLCBlXzNcfSQuIEVhY2ggZWRnZSAkZV9pJCBoYXMgY29tbW9uIGxlbmd0aCAkXGVsbCQgYW5kIGNvbm5lY3RzIHRoZSBjZW50cmFsIHZlcnRleCAkdiQgdG8gdGhlIG91dGVyIHZlcnRleCAkdl9pJCBmb3IgJGk9MSwyLDMkIGluIHN1Y2ggYSB3YXkgdGhhdCAkdiA9IFx1bmRlcmxpbmV7ZV8xfSA9IFx1bmRlcmxpbmV7ZV8yfSA9IFx1bmRlcmxpbmV7ZV8zfSQuIE9uICRcR2FtbWEkLCB3ZSBkZWZpbmUgdGhlIGZ1bmN0aW9uICRmID0gXHtmX2VcfV97ZVxpblxtYXRoY2Fse0V9fSQgdmlhCgokJApmX3tlXzF9KHMpID0gYSArIGJfMSBzIC0gXGZyYWN7Yl8xIHNeM317M1xlbGxeMn0sIFxxdWFkIGZfe2VfMn0ocykgPSBhICsgYl8yIHMgLSBcZnJhY3tiXzIgc14zfXszXGVsbF4yfSwgXHF1YWQgZl97ZV8zfShzKSA9IGEgKyBiXzMgcyAtIFxmcmFje2JfMyBzXjN9ezNcZWxsXjJ9LAokJAoKd2hlcmUgJGEkICh0byBiZSBjaG9zZW4pIGlzIHRoZSB2YWx1ZSBvZiAkZiQgYXQgdGhlIGNlbnRyYWwgdmVydGV4IGFuZCAkYl8xLCBiXzIsIGJfMyQgYXJlIGNvbnN0YW50cyAodG8gYmUgY2hvc2VuKSBzdWNoIHRoYXQgJGJfMSArIGJfMiArIGJfMyA9IDAkLiBDbGVhcmx5LCAkZiQgaXMgYSBjb250aW51b3VzIGZ1bmN0aW9uIHNpbmNlIAoKJCQKZl97ZV8xfSgwKSA9IGZfe2VfMn0oMCkgPSBmX3tlXzN9KDApID0gYS4KJCQKClRoZSBkZXJpdmF0aXZlICRmJyA9IFx7ZidfZVx9X3tlXGluXG1hdGhjYWx7RX19JCBvZiAkZiQgb24gZWFjaCBlZGdlIGlzIGdpdmVuIGJ5CgokJApmX3tlXzF9JyhzKSA9IGJfMSAtIFxmcmFje2JfMSBzXjJ9e1xlbGxeMn0sIFxxdWFkIGZfe2VfMn0nKHMpID0gYl8yIC0gXGZyYWN7Yl8yIHNeMn17XGVsbF4yfSwgXHF1YWQgZl97ZV8zfScocykgPSBiXzMgLSBcZnJhY3tiXzMgc14yfXtcZWxsXjJ9LgokJApTaW5jZSAkZl97ZV8xfScoMCkgPSBiXzEkLCAkZl97ZV8yfScoMCkgPSBiXzIkIGFuZCAkZl97ZV8zfScoMCkgPSBiXzMkLCB3ZSBjYW4gY2hvb3NlICRiXzEsIGJfMiwgYl8zJCBzdWNoIHRoYXQgJGYnJCBpcyBkaXNjb250aW51b3VzIGF0IHRoZSBjZW50cmFsIHZlcnRleCBhbmQgc2F0aXNmaWVzIHRoZSBLaXJjaGhvZmYgdmVydGV4IGNvbmRpdGlvbnMgc2ltdWx0YW5lb3VzbHkuIFRoZSBLaXJjaGhvZmYgdmVydGV4IGNvbmRpdGlvbnMgYXQgdGhlIGNlbnRyYWwgdmVydGV4IGFyZSBzYXRpc2ZpZWQgc2luY2UKCiQkCmZfe2VfMX0nKDApICsgZl97ZV8yfScoMCkgKyBmX3tlXzN9JygwKSA9IGJfMSArIGJfMiArIGJfMyA9IDAuCiQkCgphbmQgYXQgdGhlIG91dGVyIHZlcnRpY2VzIHdlIGhhdmUKCiQkCmZfe2VfMX0nKFxlbGwpID0gIGZfe2VfMn0nKFxlbGwpID0gZl97ZV8zfScoXGVsbCkgPSAwLgokJAoKRm9yIGluc3RhbmNlLCB3ZSBjYW4gY2hvb3NlICRiXzEgPSAxJCwgJGJfMiA9IDEkIGFuZCAkYl8zID0gLTIkLiBUaGlzIGNob2ljZSBlbnN1cmVzICRmJCB0byBiZSBjb250aW51b3VzIGFuZCBzYXRpc2Z5IHRoZSBLaXJjaGhvZmYgdmVydGV4IGNvbmRpdGlvbnMgd2hpbGUgJGYnJCBpcyBkaXNjb250aW51b3VzIGF0IHRoZSBjZW50cmFsIHZlcnRleC4gU2VlIEZpZ3VyZSAxIGFuZCAyLgoKCgpgYGB7cn0KIyBHZW5lcmFsIHBhcmFtZXRlcnMKTCA8LSBteV9sZW5ndGggICAgICAgICAgICAgIyBlZGdlIGxlbmd0aAphIDwtIDEgICAgICAgICAgICAgIyB2YWx1ZSBhdCBjZW50cmFsIHZlcnRleApiIDwtIGMoMSwgMSwgLTIpICAgIyBiMStiMitiMyBtdXN0IGJlIDAKCmYxIDwtIGZ1bmN0aW9uKHMpIGEgKyBiWzFdKnMgLSBiWzFdKnNeMy8oMypMXjIpCmYyIDwtIGZ1bmN0aW9uKHMpIGEgKyBiWzJdKnMgLSBiWzJdKnNeMy8oMypMXjIpCmYzIDwtIGZ1bmN0aW9uKHMpIGEgKyBiWzNdKnMgLSBiWzNdKnNeMy8oMypMXjIpCgoKZGYxIDwtIGZ1bmN0aW9uKHMpIGJbMV0gLSBiWzFdKnNeMi9MXjIKZGYyIDwtIGZ1bmN0aW9uKHMpIGJbMl0gLSBiWzJdKnNeMi9MXjIKZGYzIDwtIGZ1bmN0aW9uKHMpIGJbM10gLSBiWzNdKnNeMi9MXjIKCmRkZjEgPC0gZnVuY3Rpb24ocykgLTIqYlsxXSpzL0xeMgpkZGYyIDwtIGZ1bmN0aW9uKHMpIC0yKmJbMl0qcy9MXjIKZGRmMyA8LSBmdW5jdGlvbihzKSAtMipiWzNdKnMvTF4yCgpkZGRmMSA8LSBmdW5jdGlvbihzKSAtMipiWzFdL0xeMgpkZGRmMiA8LSBmdW5jdGlvbihzKSAtMipiWzJdL0xeMgpkZGRmMyA8LSBmdW5jdGlvbihzKSAtMipiWzNdL0xeMgoKZl9saXN0IDwtIGxpc3QoZjEsIGYyLCBmMykKZGZfbGlzdCA8LSBsaXN0KGRmMSwgZGYyLCBkZjMpCmRkZl9saXN0IDwtIGxpc3QoZGRmMSwgZGRmMiwgZGRmMykKZGRkZl9saXN0IDwtIGxpc3QoZGRkZjEsIGRkZGYyLCBkZGRmMykKCmYgPC0gYXBwbHlfZWRnZV9mdW5jdGlvbnNfZmFzdChncmFwaCwgZl9saXN0KQpkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoX2Rpc2MsIGRmX2xpc3QpCmRkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoLCBkZGZfbGlzdCkKZGRkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoX2Rpc2MsIGRkZGZfbGlzdCkKYGBgCgoKYGBge3J9CmxfbWVzaCA8LSBzZXEoMCwgbXlfbGVuZ3RoLCBieSA9IGgpCmRmbDEgPC0gZGYxKGxfbWVzaCkKZGZsMiA8LSBkZjIobF9tZXNoKQpkZmwzIDwtIGRmMyhsX21lc2gpCgpsX21lc2hfbm9ybSA8LSBsX21lc2gvbXlfbGVuZ3RoClB0RTEgPC0gY2JpbmQocmVwKDEsIGxlbmd0aChsX21lc2gpKSwgbF9tZXNoX25vcm0pClB0RTIgPC0gY2JpbmQocmVwKDIsIGxlbmd0aChsX21lc2gpKSwgbF9tZXNoX25vcm0pClB0RTMgPC0gY2JpbmQocmVwKDMsIGxlbmd0aChsX21lc2gpKSwgbF9tZXNoX25vcm0pClhZMSA8LSBncmFwaCRjb29yZGluYXRlcyhQdEUxKQpYWTIgPC0gZ3JhcGgkY29vcmRpbmF0ZXMoUHRFMikKWFkzIDwtIGdyYXBoJGNvb3JkaW5hdGVzKFB0RTMpCkRGMSA8LSBkYXRhLmZyYW1lKHggPSBYWTFbLDFdLCB5ID0gWFkxWywyXSwgeiA9IGRmbDEpCkRGMiA8LSBkYXRhLmZyYW1lKHggPSBYWTJbLDFdLCB5ID0gWFkyWywyXSwgeiA9IGRmbDIpCkRGMyA8LSBkYXRhLmZyYW1lKHggPSBYWTNbLDFdLCB5ID0gWFkzWywyXSwgeiA9IGRmbDMpCgpERiA8LSByYmluZChERjEsIHJlcChOQSwgMyksIERGMiwgcmVwKE5BLCAzKSwgREYzKQpERl9OT19OQSA8LSByYmluZChERjEsIERGMiwgREYzKQpgYGAKCmBgYHtyfQp4X2V5ZSA8LSA1IzgKeV9leWUgPC0gLTEjLTIKel9leWUgPC0gMiMzCmBgYAoKYGBge3IsIGV2YWwgPSBGQUxTRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGYnID0gXFx7ZidfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkZl97ZV9pfScocykgPSBiX2kgLSBcXGRmcmFje2JfaSBzXjJ9e1xcZWxsXjJ9JCBmb3IgJGk9MSwyLDMkLiIpfQpncmFwaF9kaXNjJHBsb3RfZnVuY3Rpb24oWCA9IGRmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgY29udGludW91cyA9IEZBTFNFLCBpbnRlcnBvbGF0ZV9wbG90ID0gVFJVRSwgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gVGVYKCJmJyIpLCAKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKQogICAgICAgICAgICAgICAgICkpCmBgYAoKCgoKYGBge3J9CnN0YXIzZiA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0zLAogIHkgPSB4bTMsCiAgeiA9IHptMywKICB1ID0gZHkzLAogIHYgPSBkeDMsCiAgdyA9IGR6MywKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJmIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUzX2Zpbl95LCB5ID0gZTNfZmluX3gsIHogPSBlM19maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMywgeSA9IHhtMywgeiA9IHptMywKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCnN0YXIzZGYgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZiowLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgbGluZV9jb2xvciA9ICJibGFjayIsIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IGR5MywKICB2ID0gZHgzLAogIHcgPSBkejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICAgIGFkZF90cmFjZShkYXRhID0gREYsCiAgICAgICAgICAgIHggPSB+eSwgCiAgICAgICAgICAgIHkgPSB+eCwgCiAgICAgICAgICAgIHogPSB+eiwgCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsICAKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiKDAsMCwyMDApIiwgd2lkdGggPSBnc3cpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgYWRkX3RyYWNlKHggPSByZXAoREYkeSwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeSA9IHJlcChERiR4LCBlYWNoID0gMyksIAogICAgICAgICAgICB6ID0gdW5saXN0KGxhcHBseShERiR6LCBmdW5jdGlvbih6aikgYygwLCB6aiwgTkEpKSksCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJncmF5Iiwgd2lkdGggPSAwLjUpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZiciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKc3RhcjNkZGYgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZGRmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgY29udGludW91cyA9IFRSVUUsIGludGVycG9sYXRlX3Bsb3QgPSBUUlVFLCB0eXBlID0gInBsb3RseSIpIHw+IAogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0zLAogIHkgPSB4bTMsCiAgeiA9IHptMywKICB1ID0gZHkzLAogIHYgPSBkeDMsCiAgdyA9IGR6MywKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBUZVgoImYnJyIpLCB5ID0gMC44KSwKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUxX2Zpbl95LCB5ID0gZTFfZmluX3gsIHogPSBlMV9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTJfZmluX3ksIHkgPSBlMl9maW5feCwgeiA9IGUyX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlM19maW5feSwgeSA9IGUzX2Zpbl94LCB6ID0gZTNfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMyIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTMsIHkgPSB4bTMsIHogPSB6bTMsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMyIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgpzdGFyM2RkZGYgPC0gZ3JhcGhfZGlzYyRwbG90X2Z1bmN0aW9uKFggPSBkZGRmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgY29udGludW91cyA9IEZBTFNFLCBpbnRlcnBvbGF0ZV9wbG90ID0gVFJVRSwgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IGR5MywKICB2ID0gZHgzLAogIHcgPSBkejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJmJycnIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUzX2Zpbl95LCB5ID0gZTNfZmluX3gsIHogPSBlM19maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMywgeSA9IHhtMywgeiA9IHptMywKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCgpzYXZlKHN0YXIzZiwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNmLlJkYXRhIikpCnNhdmUoc3RhcjNkZiwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNkZi5SZGF0YSIpKQpzYXZlKHN0YXIzZGRmLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RkZi5SZGF0YSIpKQpzYXZlKHN0YXIzZGRkZiwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNkZGRmLlJkYXRhIikpCmBgYAoKCgpGb3IgaWxsdXN0cmF0aW9uIHB1cnBvc2VzLCBGaWd1cmUgMyBhbmQgNCBzaG93cyAkZicnJCBhbmQgJGYnJyckLgoKOjo6OiB7c3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDg1cHggNDg1cHggNDg1cHggNDg1cHg7IGdyaWQtY29sdW1uLWdhcDogMHB4OyJ9CgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGYgPSBcXHtmX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGZfe2VfaX0ocykgPSBhICsgYl9pIHMgLSBcXGRmcmFje2JfaSBzXjN9ezNcXGVsbF4yfSQgZm9yICRpPTEsMiwzJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZi5SZGF0YSIpKQpzdGFyM2YKYGBgCgoKCjo6OgoKCjo6OiB7fQoKCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkZicgPSBcXHtmJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRmJ197ZV9pfShzKSA9IGJfaSAtIFxcZGZyYWN7Yl9pIHNeMn17XFxlbGxeMn0kIGZvciAkaT0xLDIsMyQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RmLlJkYXRhIikpCnN0YXIzZGYKYGBgCgoKCjo6OgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGYnJyA9IFxce2YnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRmJydfe2VfaX0ocykgPSAtXFxkZnJhY3syIGJfaSBzfXtcXGVsbF4yfSQgZm9yICRpPTEsMiwzJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGRmLlJkYXRhIikpCnN0YXIzZGRmCmBgYAoKCjo6OgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGYnJycgPSBcXHtmJycnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGYnJydfe2VfaX0ocykgPSAtXFxkZnJhY3syIGJfaX17XFxlbGxeMn0kIGZvciAkaT0xLDIsMyQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RkZGYuUmRhdGEiKSkKc3RhcjNkZGRmCmBgYAoKCjo6OgoKOjo6OgoKCgojIEV4YW1wbGUgb2YgYSBmdW5jdGlvbiAkZ1xpbiBDXjEoXEdhbW1hKVxjYXAgXG1hdGhjYWx7S30oXEdhbW1hKSQKCgoKTGV0IHVzIGNvbnNpZGVyIHRoZSBmdW5jdGlvbiAkZyA9IFx7Z19lXH1fe2VcaW5cbWF0aGNhbHtFfX0kIGRlZmluZWQgb24gdGhlICQzJC1zdGFyIGdyYXBoIHdpdGggY29tbW9uIGVkZ2UgbGVuZ3RoICRcZWxsJCB2aWEKJCQKZ197ZV8xfShzKSA9IFxjb3NcbGVmdChcZnJhY3tccGkgc317XGVsbH1ccmlnaHQpLCBccXVhZCBnX3tlXzJ9KHMpID0gXGNvc1xsZWZ0KFxmcmFje1xwaSBzfXtcZWxsfVxyaWdodCksIFxxdWFkIGdfe2VfM30ocykgPSBcY29zXGxlZnQoXGZyYWN7XHBpIHN9e1xlbGx9XHJpZ2h0KS4KJCQKQ2xlYXJseSwgJGckIGlzIGEgY29udGludW91cyBmdW5jdGlvbiAoc2VlIEZpZ3VyZSA1KSBvbiAkXEdhbW1hJCBzaW5jZQokJApnX3tlXzF9KDApID0gIGdfe2VfMn0oMCkgPSAgZ197ZV8zfSgwKSA9IDEuCiQkClRoZSBkZXJpdmF0aXZlICRnJyA9IFx7ZydfZVx9X3tlXGluXG1hdGhjYWx7RX19JCAgb2YgJGckIG9uIGVhY2ggZWRnZSBpcyBnaXZlbiBieQokJApnX3tlXzF9JyhzKSA9IC1cZnJhY3tccGl9e1xlbGx9XHNpblxsZWZ0KFxmcmFje1xwaSBzfXtcZWxsfVxyaWdodCksIFxxdWFkIGdfe2VfMn0nKHMpID0gLVxmcmFje1xwaX17XGVsbH1cc2luXGxlZnQoXGZyYWN7XHBpIHN9e1xlbGx9XHJpZ2h0KSwgXHF1YWQgZ197ZV8zfScocykgPSAtXGZyYWN7XHBpfXtcZWxsfVxzaW5cbGVmdChcZnJhY3tccGkgc317XGVsbH1ccmlnaHQpLgokJApTaW5jZSAkZ197ZV8xfScoMCkgPSBnX3tlXzJ9JygwKSA9IGdfe2VfM30nKDApID0gMCQsICRnJCBzYXRpc2ZpZXMgdGhlIEtpcmNoaG9mZiB2ZXJ0ZXggY29uZGl0aW9ucwokJApnX3tlXzF9JygwKSArIGdfe2VfMn0nKDApICsgZ197ZV8zfScoMCkgPSAwXHRleHR7IGFuZCB9Z197ZV8xfScoXGVsbCkgPSAgZ197ZV8yfScoXGVsbCkgPSAgZ197ZV8zfScoXGVsbCkgPSAwLgokJApNb3Jlb3ZlciwgJGcnJCBpcyBhIGNvbnRpbnVvdXMgZnVuY3Rpb24uIFNlZSBGaWd1cmUgNi4KCgpgYGB7cn0KZzEgPC0gZnVuY3Rpb24ocykgY29zKHBpKnMvTCkKZzIgPC0gZnVuY3Rpb24ocykgY29zKHBpKnMvTCkKZzMgPC0gZnVuY3Rpb24ocykgY29zKHBpKnMvTCkKCmRnMSA8LSBmdW5jdGlvbihzKSAtcGkvTCpzaW4ocGkqcy9MKQpkZzIgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkKZGczIDwtIGZ1bmN0aW9uKHMpIC1waS9MKnNpbihwaSpzL0wpCgpkZGcxIDwtIGZ1bmN0aW9uKHMpIC1waV4yL0xeMipjb3MocGkqcy9MKQpkZGcyIDwtIGZ1bmN0aW9uKHMpIC1waV4yL0xeMipjb3MocGkqcy9MKQpkZGczIDwtIGZ1bmN0aW9uKHMpIC1waV4yL0xeMipjb3MocGkqcy9MKQoKZGRkZzEgPC0gZnVuY3Rpb24ocykgcGleMy9MXjMqc2luKHBpKnMvTCkKZGRkZzIgPC0gZnVuY3Rpb24ocykgcGleMy9MXjMqc2luKHBpKnMvTCkKZGRkZzMgPC0gZnVuY3Rpb24ocykgcGleMy9MXjMqc2luKHBpKnMvTCkKCmdfbGlzdCA8LSBsaXN0KGcxLCBnMiwgZzMpCmRnX2xpc3QgPC0gbGlzdChkZzEsIGRnMiwgZGczKQpkZGdfbGlzdCA8LSBsaXN0KGRkZzEsIGRkZzIsIGRkZzMpCmRkZGdfbGlzdCA8LSBsaXN0KGRkZGcxLCBkZGRnMiwgZGRkZzMpCgpnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGdfbGlzdCkKZGcgPC0gYXBwbHlfZWRnZV9mdW5jdGlvbnNfZmFzdChncmFwaCwgZGdfbGlzdCkKZGRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRkZ19saXN0KQpkZGRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRkZGdfbGlzdCkKYGBgCgoKCmBgYHtyfQpzdGFyM2cgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZywgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IGR5MywKICB2ID0gZHgzLAogIHcgPSBkejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZyIpLCB5ID0gMC44KSwgCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKc3RhcjNkZyA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBkZywgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IGR5MywKICB2ID0gZHgzLAogIHcgPSBkejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZyciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKc3RhcjNkZGcgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZGRnLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0zLAogIHkgPSB4bTMsCiAgeiA9IHptMywKICB1ID0gZHkzLAogIHYgPSBkeDMsCiAgdyA9IGR6MywKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJnJyciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKc3RhcjNkZGRnIDwtIGdyYXBoJHBsb3RfZnVuY3Rpb24oWCA9IGRkZGcsIHZlcnRleF9zaXplID0gZ3N3LCBlZGdlX3dpZHRoID0gZ3N3LCBsaW5lX3dpZHRoID0gZ3N3LCB0eXBlID0gInBsb3RseSIpIHw+IAogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTMsCiAgeSA9IHhtMywKICB6ID0gem0zLAogIHUgPSBkeTMsCiAgdiA9IGR4MywKICB3ID0gZHozLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgcGxvdGx5OjpsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBUZVgoImcnJyciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKCgoKCnNhdmUoc3RhcjNnLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2cuUmRhdGEiKSkKc2F2ZShzdGFyM2RnLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RnLlJkYXRhIikpCnNhdmUoc3RhcjNkZGcsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGRnLlJkYXRhIikpCnNhdmUoc3RhcjNkZGRnLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RkZGcuUmRhdGEiKSkKCmBgYAoKCmBgYHtyfQoKCgoKCmRnMSA8LSBmdW5jdGlvbihzKSAtcGkvTCpzaW4ocGkqcy9MKQpkZzIgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkqMApkZzMgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkqKC0xKQoKZGdfbGlzdCA8LSBsaXN0KGRnMSwgZGcyLCBkZzMpCmRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRnX2xpc3QpCgoKc3RhcjNkZ19wYXRoMSA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBkZywgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoImdyZWVuIiwgImdyZWVuIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gZHkyLAogIHYgPSBkeDIsCiAgdyA9IGR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTMsCiAgeSA9IHhtMywKICB6ID0gem0zLAogIHUgPSAtZHkzLAogIHYgPSAtZHgzLAogIHcgPSAtZHozLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygiZ3JlZW4iLCAiZ3JlZW4iKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUyX2luaV95LCBlMl9maW5feSksCiAgICB5ID0gYyhlMl9pbmlfeCwgZTJfZmluX3gpLAogICAgeiA9IGMoZTJfaW5pX3osIGUyX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUzX2Zpbl95LCAwLCBlMV9maW5feSksCiAgICB5ID0gYyhlM19maW5feCwgMCwgZTFfZmluX3gpLAogICAgeiA9IGMoZTNfZmluX3osIDAsIGUxX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JlZW4iLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCIoZ3xfe3Bfe1xcaGF0e2V9XzNlXzF9fSknIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUzX2Zpbl95LCB5ID0gZTNfZmluX3gsIHogPSBlM19maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMywgeSA9IHhtMywgeiA9IHptMywKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiXFxoYXR7ZX1fMyIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgoKCmRnMSA8LSBmdW5jdGlvbihzKSAtcGkvTCpzaW4ocGkqcy9MKSowCmRnMiA8LSBmdW5jdGlvbihzKSAtcGkvTCpzaW4ocGkqcy9MKQpkZzMgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkqKC0xKQoKZGdfbGlzdCA8LSBsaXN0KGRnMSwgZGcyLCBkZzMpCmRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRnX2xpc3QpCgoKc3RhcjNkZ19wYXRoMiA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBkZywgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygiZ3JlZW4iLCAiZ3JlZW4iKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTMsCiAgeSA9IHhtMywKICB6ID0gem0zLAogIHUgPSAtZHkzLAogIHYgPSAtZHgzLAogIHcgPSAtZHozLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygiZ3JlZW4iLCAiZ3JlZW4iKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUxX2luaV95LCBlMV9maW5feSksCiAgICB5ID0gYyhlMV9pbmlfeCwgZTFfZmluX3gpLAogICAgeiA9IGMoZTFfaW5pX3osIGUxX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUzX2Zpbl95LCAwLCBlMl9maW5feSksCiAgICB5ID0gYyhlM19maW5feCwgMCwgZTJfZmluX3gpLAogICAgeiA9IGMoZTNfZmluX3osIDAsIGUyX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JlZW4iLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCIoZ3xfe3Bfe1xcaGF0e2V9XzNlXzJ9fSknIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUzX2Zpbl95LCB5ID0gZTNfZmluX3gsIHogPSBlM19maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMywgeSA9IHhtMywgeiA9IHptMywKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiXFxoYXR7ZX1fMyIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgoKCmRnMSA8LSBmdW5jdGlvbihzKSAtcGkvTCpzaW4ocGkqcy9MKQpkZzIgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkqKC0xKQpkZzMgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkqMAoKZGdfbGlzdCA8LSBsaXN0KGRnMSwgZGcyLCBkZzMpCmRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRnX2xpc3QpCgoKc3RhcjNkZ19wYXRoMyA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBkZywgdmVydGV4X3NpemUgPSBnc3csIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4gCiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0xLAogIHkgPSB4bTEsCiAgeiA9IHptMSwKICB1ID0gZHkxLAogIHYgPSBkeDEsCiAgdyA9IGR6MSwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoImdyZWVuIiwgImdyZWVuIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0yLAogIHkgPSB4bTIsCiAgeiA9IHptMiwKICB1ID0gLWR5MiwKICB2ID0gLWR4MiwKICB3ID0gLWR6MiwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoImdyZWVuIiwgImdyZWVuIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0zLAogIHkgPSB4bTMsCiAgeiA9IHptMywKICB1ID0gZHkzLAogIHYgPSBkeDMsCiAgdyA9IGR6MywKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUzX2luaV95LCBlM19maW5feSksCiAgICB5ID0gYyhlM19pbmlfeCwgZTNfZmluX3gpLAogICAgeiA9IGMoZTNfaW5pX3osIGUzX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUxX2Zpbl95LCAwLCBlMl9maW5feSksCiAgICB5ID0gYyhlMV9maW5feCwgMCwgZTJfZmluX3gpLAogICAgeiA9IGMoZTFfZmluX3osIDAsIGUyX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JlZW4iLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCIoZ3xfe3Bfe1xcaGF0e2V9XzJlXzF9fSknIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMl9maW5feSwgeSA9IGUyX2Zpbl94LCB6ID0gZTJfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUzX2Zpbl95LCB5ID0gZTNfZmluX3gsIHogPSBlM19maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTIsIHkgPSB4bTIsIHogPSB6bTIsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoIlxcaGF0e2V9XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTMsIHkgPSB4bTMsIHogPSB6bTMsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMyIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgoKCgoKCgoKCgoKZGcxIDwtIGZ1bmN0aW9uKHMpIC1waS9MKnNpbihwaSpzL0wpCmRnMiA8LSBmdW5jdGlvbihzKSAtcGkvTCpzaW4ocGkqcy9MKQpkZzMgPC0gZnVuY3Rpb24ocykgLXBpL0wqc2luKHBpKnMvTCkqKC0xKQoKZGdfbGlzdCA8LSBsaXN0KGRnMSwgZGcyLCBkZzMpCmRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRnX2xpc3QpCgoKc3RhcjNkZ19wYXRoX29rIDwtIGdyYXBoJHBsb3RfZnVuY3Rpb24oWCA9IGRnLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW0zLAogIHkgPSB4bTMsCiAgeiA9IHptMywKICB1ID0gLWR5MywKICB2ID0gLWR4MywKICB3ID0gLWR6MywKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoImdyZWVuIiwgImdyZWVuIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiZyciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCgoKc2F2ZShzdGFyM2RnX3BhdGgxLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RnX3BhdGgxLlJkYXRhIikpCnNhdmUoc3RhcjNkZ19wYXRoMiwgZmlsZSA9IGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNkZ19wYXRoMi5SZGF0YSIpKQpzYXZlKHN0YXIzZGdfcGF0aDMsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGdfcGF0aDMuUmRhdGEiKSkKc2F2ZShzdGFyM2RnX3BhdGhfb2ssIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGdfcGF0aF9vay5SZGF0YSIpKQoKCmBgYAoKCgpgYGB7cn0KZGRnMSA8LSBmdW5jdGlvbihzKSAtcGleMi9MXjIqY29zKHBpKnMvTCkKZGRnMiA8LSBmdW5jdGlvbihzKSAtcGleMi9MXjIqY29zKHBpKnMvTCkqMApkZGczIDwtIGZ1bmN0aW9uKHMpIC1waV4yL0xeMipjb3MocGkqcy9MKSooLTEpCgoKCmRkZ19saXN0IDwtIGxpc3QoZGRnMSwgZGRnMiwgZGRnMykKZGRnIDwtIGFwcGx5X2VkZ2VfZnVuY3Rpb25zX2Zhc3QoZ3JhcGgsIGRkZ19saXN0KQoKbF9tZXNoIDwtIHNlcSgwLCBteV9sZW5ndGgsIGJ5ID0gaCkKZGZsMSA8LSBkZGcxKGxfbWVzaCkKZGZsMiA8LSBkZGcyKGxfbWVzaCkKZGZsMyA8LSBkZGczKGxfbWVzaCkKCmxfbWVzaF9ub3JtIDwtIGxfbWVzaC9teV9sZW5ndGgKUHRFMSA8LSBjYmluZChyZXAoMSwgbGVuZ3RoKGxfbWVzaCkpLCBsX21lc2hfbm9ybSkKUHRFMiA8LSBjYmluZChyZXAoMiwgbGVuZ3RoKGxfbWVzaCkpLCBsX21lc2hfbm9ybSkKUHRFMyA8LSBjYmluZChyZXAoMywgbGVuZ3RoKGxfbWVzaCkpLCBsX21lc2hfbm9ybSkKWFkxIDwtIGdyYXBoJGNvb3JkaW5hdGVzKFB0RTEpClhZMiA8LSBncmFwaCRjb29yZGluYXRlcyhQdEUyKQpYWTMgPC0gZ3JhcGgkY29vcmRpbmF0ZXMoUHRFMykKREYxIDwtIGRhdGEuZnJhbWUoeCA9IFhZMVssMV0sIHkgPSBYWTFbLDJdLCB6ID0gZGZsMSkKREYyIDwtIGRhdGEuZnJhbWUoeCA9IFhZMlssMV0sIHkgPSBYWTJbLDJdLCB6ID0gZGZsMikKREYzIDwtIGRhdGEuZnJhbWUoeCA9IFhZM1ssMV0sIHkgPSBYWTNbLDJdLCB6ID0gZGZsMykKCkRGIDwtIHJiaW5kKERGMSwgcmVwKE5BLCAzKSwgREYyLCByZXAoTkEsIDMpLCBERjMpCkRGX05PX05BIDwtIHJiaW5kKERGMSwgREYyLCBERjMpCgoKCnN0YXIzZGRnX3BhdGgxIDwtIGdyYXBoJHBsb3RfZnVuY3Rpb24oWCA9IGRkZyowLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgbGluZV9jb2xvciA9ICJibGFjayIsIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygiZ3JlZW4iLCAiZ3JlZW4iKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTIsCiAgeSA9IHhtMiwKICB6ID0gem0yLAogIHUgPSBkeTIsCiAgdiA9IGR4MiwKICB3ID0gZHoyLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IC1keTMsCiAgdiA9IC1keDMsCiAgdyA9IC1kejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKGRhdGEgPSBERiwKICAgICAgICAgICAgeCA9IH55LCAKICAgICAgICAgICAgeSA9IH54LCAKICAgICAgICAgICAgeiA9IH56LCAKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwgIAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2IoMCwwLDIwMCkiLCB3aWR0aCA9IGdzdyksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoeCA9IHJlcChERiR5LCBlYWNoID0gMyksIAogICAgICAgICAgICB5ID0gcmVwKERGJHgsIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHogPSB1bmxpc3QobGFwcGx5KERGJHosIGZ1bmN0aW9uKHpqKSBjKDAsIHpqLCBOQSkpKSwKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyYXkiLCB3aWR0aCA9IDAuNSksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoCiAgICB4ID0gYyhlMl9pbmlfeSwgZTJfZmluX3kpLAogICAgeSA9IGMoZTJfaW5pX3gsIGUyX2Zpbl94KSwKICAgIHogPSBjKGUyX2luaV96LCBlMl9maW5feiksCiAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICBtb2RlID0gImxpbmVzIiwKICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgd2lkdGggPSA3KSwKICAgIHNob3dsZWdlbmQgPSBGQUxTRQogICkgfD4KICBhZGRfdHJhY2UoCiAgICB4ID0gYyhlM19maW5feSwgMCwgZTFfZmluX3kpLAogICAgeSA9IGMoZTNfZmluX3gsIDAsIGUxX2Zpbl94KSwKICAgIHogPSBjKGUzX2Zpbl96LCAwLCBlMV9maW5feiksCiAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICBtb2RlID0gImxpbmVzIiwKICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyZWVuIiwgd2lkdGggPSA3KSwKICAgIHNob3dsZWdlbmQgPSBGQUxTRQogICkgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiKGcnfF97cF97XFxoYXR7ZX1fM2VfMX19KSciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCgpkZGcxIDwtIGZ1bmN0aW9uKHMpIC1waV4yL0xeMipjb3MocGkqcy9MKSowCmRkZzIgPC0gZnVuY3Rpb24ocykgLXBpXjIvTF4yKmNvcyhwaSpzL0wpCmRkZzMgPC0gZnVuY3Rpb24ocykgLXBpXjIvTF4yKmNvcyhwaSpzL0wpKigtMSkKCgoKZGRnX2xpc3QgPC0gbGlzdChkZGcxLCBkZGcyLCBkZGczKQpkZGcgPC0gYXBwbHlfZWRnZV9mdW5jdGlvbnNfZmFzdChncmFwaCwgZGRnX2xpc3QpCgoKbF9tZXNoIDwtIHNlcSgwLCBteV9sZW5ndGgsIGJ5ID0gaCkKZGZsMSA8LSBkZGcxKGxfbWVzaCkKZGZsMiA8LSBkZGcyKGxfbWVzaCkKZGZsMyA8LSBkZGczKGxfbWVzaCkKCmxfbWVzaF9ub3JtIDwtIGxfbWVzaC9teV9sZW5ndGgKUHRFMSA8LSBjYmluZChyZXAoMSwgbGVuZ3RoKGxfbWVzaCkpLCBsX21lc2hfbm9ybSkKUHRFMiA8LSBjYmluZChyZXAoMiwgbGVuZ3RoKGxfbWVzaCkpLCBsX21lc2hfbm9ybSkKUHRFMyA8LSBjYmluZChyZXAoMywgbGVuZ3RoKGxfbWVzaCkpLCBsX21lc2hfbm9ybSkKWFkxIDwtIGdyYXBoJGNvb3JkaW5hdGVzKFB0RTEpClhZMiA8LSBncmFwaCRjb29yZGluYXRlcyhQdEUyKQpYWTMgPC0gZ3JhcGgkY29vcmRpbmF0ZXMoUHRFMykKREYxIDwtIGRhdGEuZnJhbWUoeCA9IFhZMVssMV0sIHkgPSBYWTFbLDJdLCB6ID0gZGZsMSkKREYyIDwtIGRhdGEuZnJhbWUoeCA9IFhZMlssMV0sIHkgPSBYWTJbLDJdLCB6ID0gZGZsMikKREYzIDwtIGRhdGEuZnJhbWUoeCA9IFhZM1ssMV0sIHkgPSBYWTNbLDJdLCB6ID0gZGZsMykKCkRGIDwtIHJiaW5kKERGMSwgcmVwKE5BLCAzKSwgREYyLCByZXAoTkEsIDMpLCBERjMpCkRGX05PX05BIDwtIHJiaW5kKERGMSwgREYyLCBERjMpCgoKCnN0YXIzZGRnX3BhdGgyIDwtIGdyYXBoJHBsb3RfZnVuY3Rpb24oWCA9IGRkZyowLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgbGluZV9jb2xvciA9ICJibGFjayIsIGVkZ2Vfd2lkdGggPSBnc3csIGxpbmVfd2lkdGggPSBnc3csIHR5cGUgPSAicGxvdGx5IikgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IGR5MiwKICB2ID0gZHgyLAogIHcgPSBkejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IC1keTMsCiAgdiA9IC1keDMsCiAgdyA9IC1kejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKGRhdGEgPSBERiwKICAgICAgICAgICAgeCA9IH55LCAKICAgICAgICAgICAgeSA9IH54LCAKICAgICAgICAgICAgeiA9IH56LCAKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwgIAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2IoMCwwLDIwMCkiLCB3aWR0aCA9IGdzdyksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoeCA9IHJlcChERiR5LCBlYWNoID0gMyksIAogICAgICAgICAgICB5ID0gcmVwKERGJHgsIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHogPSB1bmxpc3QobGFwcGx5KERGJHosIGZ1bmN0aW9uKHpqKSBjKDAsIHpqLCBOQSkpKSwKICAgICAgICAgICAgdHlwZSA9ICJzY2F0dGVyM2QiLCAKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyYXkiLCB3aWR0aCA9IDAuNSksCiAgICAgICAgICAgIHNob3dsZWdlbmQgPSBGQUxTRSkgfD4KICBhZGRfdHJhY2UoCiAgICB4ID0gYyhlMV9pbmlfeSwgZTFfZmluX3kpLAogICAgeSA9IGMoZTFfaW5pX3gsIGUxX2Zpbl94KSwKICAgIHogPSBjKGUxX2luaV96LCBlMV9maW5feiksCiAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICBtb2RlID0gImxpbmVzIiwKICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgd2lkdGggPSA3KSwKICAgIHNob3dsZWdlbmQgPSBGQUxTRQogICkgfD4KICBhZGRfdHJhY2UoCiAgICB4ID0gYyhlM19maW5feSwgMCwgZTJfZmluX3kpLAogICAgeSA9IGMoZTNfZmluX3gsIDAsIGUyX2Zpbl94KSwKICAgIHogPSBjKGUzX2Zpbl96LCAwLCBlMl9maW5feiksCiAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICBtb2RlID0gImxpbmVzIiwKICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gImdyZWVuIiwgd2lkdGggPSA3KSwKICAgIHNob3dsZWdlbmQgPSBGQUxTRQogICkgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiKGcnfF97cF97XFxoYXR7ZX1fM2VfMn19KSciKSwgeSA9IDAuOCksCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUyX2Zpbl95LCB5ID0gZTJfZmluX3gsIHogPSBlMl9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTNfZmluX3ksIHkgPSBlM19maW5feCwgeiA9IGUzX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMiwgeSA9IHhtMiwgeiA9IHptMiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8zIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCmRkZzEgPC0gZnVuY3Rpb24ocykgLXBpXjIvTF4yKmNvcyhwaSpzL0wpCmRkZzIgPC0gZnVuY3Rpb24ocykgLXBpXjIvTF4yKmNvcyhwaSpzL0wpKigtMSkKZGRnMyA8LSBmdW5jdGlvbihzKSAtcGleMi9MXjIqY29zKHBpKnMvTCkqMAoKCgpkZGdfbGlzdCA8LSBsaXN0KGRkZzEsIGRkZzIsIGRkZzMpCmRkZyA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoLCBkZGdfbGlzdCkKCgpsX21lc2ggPC0gc2VxKDAsIG15X2xlbmd0aCwgYnkgPSBoKQpkZmwxIDwtIGRkZzEobF9tZXNoKQpkZmwyIDwtIGRkZzIobF9tZXNoKQpkZmwzIDwtIGRkZzMobF9tZXNoKQoKbF9tZXNoX25vcm0gPC0gbF9tZXNoL215X2xlbmd0aApQdEUxIDwtIGNiaW5kKHJlcCgxLCBsZW5ndGgobF9tZXNoKSksIGxfbWVzaF9ub3JtKQpQdEUyIDwtIGNiaW5kKHJlcCgyLCBsZW5ndGgobF9tZXNoKSksIGxfbWVzaF9ub3JtKQpQdEUzIDwtIGNiaW5kKHJlcCgzLCBsZW5ndGgobF9tZXNoKSksIGxfbWVzaF9ub3JtKQpYWTEgPC0gZ3JhcGgkY29vcmRpbmF0ZXMoUHRFMSkKWFkyIDwtIGdyYXBoJGNvb3JkaW5hdGVzKFB0RTIpClhZMyA8LSBncmFwaCRjb29yZGluYXRlcyhQdEUzKQpERjEgPC0gZGF0YS5mcmFtZSh4ID0gWFkxWywxXSwgeSA9IFhZMVssMl0sIHogPSBkZmwxKQpERjIgPC0gZGF0YS5mcmFtZSh4ID0gWFkyWywxXSwgeSA9IFhZMlssMl0sIHogPSBkZmwyKQpERjMgPC0gZGF0YS5mcmFtZSh4ID0gWFkzWywxXSwgeSA9IFhZM1ssMl0sIHogPSBkZmwzKQoKREYgPC0gcmJpbmQoREYxLCByZXAoTkEsIDMpLCBERjIsIHJlcChOQSwgMyksIERGMykKREZfTk9fTkEgPC0gcmJpbmQoREYxLCBERjIsIERGMykKCgoKc3RhcjNkZGdfcGF0aDMgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZGRnKjAsIHZlcnRleF9zaXplID0gZ3N3LCBsaW5lX2NvbG9yID0gImJsYWNrIiwgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PgogIGNvbmZpZyhtYXRoamF4ID0gJ2NkbicpIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMiwKICB5ID0geG0yLAogIHogPSB6bTIsCiAgdSA9IC1keTIsCiAgdiA9IC1keDIsCiAgdyA9IC1kejIsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJncmVlbiIsICJncmVlbiIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMywKICB5ID0geG0zLAogIHogPSB6bTMsCiAgdSA9IGR5MywKICB2ID0gZHgzLAogIHcgPSBkejMsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoZGF0YSA9IERGLAogICAgICAgICAgICB4ID0gfnksIAogICAgICAgICAgICB5ID0gfngsIAogICAgICAgICAgICB6ID0gfnosIAogICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLCAgCiAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJnYigwLDAsMjAwKSIsIHdpZHRoID0gZ3N3KSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSB8PgogIGFkZF90cmFjZSh4ID0gcmVwKERGJHksIGVhY2ggPSAzKSwgCiAgICAgICAgICAgIHkgPSByZXAoREYkeCwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeiA9IHVubGlzdChsYXBwbHkoREYkeiwgZnVuY3Rpb24oemopIGMoMCwgemosIE5BKSkpLAogICAgICAgICAgICB0eXBlID0gInNjYXR0ZXIzZCIsIAogICAgICAgICAgICBtb2RlID0gImxpbmVzIiwKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JheSIsIHdpZHRoID0gMC41KSwKICAgICAgICAgICAgc2hvd2xlZ2VuZCA9IEZBTFNFKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUzX2luaV95LCBlM19maW5feSksCiAgICB5ID0gYyhlM19pbmlfeCwgZTNfZmluX3gpLAogICAgeiA9IGMoZTNfaW5pX3osIGUzX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIGFkZF90cmFjZSgKICAgIHggPSBjKGUxX2Zpbl95LCAwLCBlMl9maW5feSksCiAgICB5ID0gYyhlMV9maW5feCwgMCwgZTJfZmluX3gpLAogICAgeiA9IGMoZTFfZmluX3osIDAsIGUyX2Zpbl96KSwKICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgIG1vZGUgPSAibGluZXMiLAogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JlZW4iLCB3aWR0aCA9IDcpLAogICAgc2hvd2xlZ2VuZCA9IEZBTFNFCiAgKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCIoZyd8X3twX3tcXGhhdHtlfV8yZV8xfX0pJyIpLCB5ID0gMC44KSwKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUxX2Zpbl95LCB5ID0gZTFfZmluX3gsIHogPSBlMV9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTJfZmluX3ksIHkgPSBlMl9maW5feCwgeiA9IGUyX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlM19maW5feSwgeSA9IGUzX2Zpbl94LCB6ID0gZTNfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMyIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0yLCB5ID0geG0yLCB6ID0gem0yLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJcXGhhdHtlfV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0zLCB5ID0geG0zLCB6ID0gem0zLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzMiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKCnNhdmUoc3RhcjNkZGdfcGF0aDEsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGRnX3BhdGgxLlJkYXRhIikpCnNhdmUoc3RhcjNkZGdfcGF0aDIsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGRnX3BhdGgyLlJkYXRhIikpCnNhdmUoc3RhcjNkZGdfcGF0aDMsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGRnX3BhdGgzLlJkYXRhIikpCgpgYGAKCgpGb3IgaWxsdXN0cmF0aW9uIHB1cnBvc2VzLCBGaWd1cmUgNyBhbmQgOCBzaG93cyAkZycnJCBhbmQgJGcnJyckLgoKOjo6OiB7c3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDg1cHggNDg1cHggNDg1cHggNDg1cHg7IGdyaWQtY29sdW1uLWdhcDogMHB4OyJ9CgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGcgPSBcXHtnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGdfe2VfaX0ocykgPSBcXGNvcyhcXGRmcmFje1xccGkgc317XFxlbGx9KSQgZm9yICRpPTEsMiwzJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZy5SZGF0YSIpKQpzdGFyM2cKYGBgCgo6OjoKCgo6Ojoge30KCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkZycgPSBcXHtnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRnJ197ZV9pfShzKSA9IC1cXGRmcmFje1xccGl9e1xcZWxsfVxcc2luKFxcZGZyYWN7XFxwaSBzfXtcXGVsbH0pJCBmb3IgJGk9MSwyLDMkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNkZy5SZGF0YSIpKQpzdGFyM2RnCmBgYAoKCjo6OgoKOjo6IHt9CgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGcnJyA9IFxce2cnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRnJydfe2VfaX0ocykgPSAtXFxkZnJhY3tcXHBpXjJ9e1xcZWxsXjJ9XFxjb3MoXFxkZnJhY3tcXHBpIHN9e1xcZWxsfSkkIGZvciAkaT0xLDIsMyQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RkZy5SZGF0YSIpKQpzdGFyM2RkZwpgYGAKCgo6OjoKCjo6OiB7fQoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRnJycnID0gXFx7ZycnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRnJycnX3tlX2l9KHMpID0gXFxkZnJhY3tcXHBpXjN9e1xcZWxsXjN9XFxzaW4oXFxkZnJhY3tcXHBpIHN9e1xcZWxsfSkkIGZvciAkaT0xLDIsMyQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RkZGcuUmRhdGEiKSkKc3RhcjNkZGRnCmBgYAoKCjo6OgoKOjo6OgoKIyBFeGFtcGxlIG9mIGEgZnVuY3Rpb24gJGhcaW4gQ14xKFxHYW1tYSlcY2FwIFxtYXRoY2Fse0t9KFxHYW1tYSkkIHdoZXJlICRoJyQgbG9va3MgZGlzY29udGludW91cwoKCkxldCB1cyBjb25zaWRlciB0aGUgJDIkLXN0YXIgZ3JhcGggJFxHYW1tYSA9IChcbWF0aGNhbHtWfSwgXG1hdGhjYWx7RX0pJCwgd2hlcmUgJFxtYXRoY2Fse1Z9ID0gXHt2LCB2XzEsIHZfMlx9JCBhbmQgJFxtYXRoY2Fse0V9ID0gXHtlXzEsIGVfMlx9JC4gRWFjaCBlZGdlICRlX2kkIGhhcyBjb21tb24gbGVuZ3RoICRcZWxsJCBhbmQgY29ubmVjdHMgdGhlIGNlbnRyYWwgdmVydGV4ICR2JCB0byB0aGUgb3V0ZXIgdmVydGV4ICR2X2kkIGZvciAkaT0xLDIkIGluIHN1Y2ggYSB3YXkgdGhhdCAkdiA9IFx1bmRlcmxpbmV7ZV8xfSA9IFx1bmRlcmxpbmV7ZV8yfSQuIE9uICRcR2FtbWEkLCB3ZSBkZWZpbmUgdGhlIGZ1bmN0aW9uICRoID0gXHtoX2VcfV97ZVxpblxtYXRoY2Fse0V9fSQgdmlhCgokJApoX3tlXzF9KHMpID0gYSArIGJfMSBzIC0gXGZyYWN7Yl8xIHNeM317M1xlbGxeMn0sIFxxdWFkIGhfe2VfMn0ocykgPSBhICsgYl8yIHMgLSBcZnJhY3tiXzIgc14zfXszXGVsbF4yfS4KJCQKQ2xlYXJseSwgJGgkIGlzIGEgY29udGludW91cyBmdW5jdGlvbiAoc2VlIEZpZ3VyZSA5KSBzaW5jZQokJApoX3tlXzF9KDApID0gaF97ZV8yfShzKSA9IGEuCiQkClRoZSBkZXJpdmF0aXZlICRoJyA9IFx7aCdfZVx9X3tlXGluXG1hdGhjYWx7RX19JCBvZiAkaCQgb24gZWFjaCBlZGdlIGlzIGdpdmVuIGJ5CgokJApoX3tlXzF9JyhzKSA9IGJfMSAtIFxmcmFje2JfMSBzXjJ9e1xlbGxeMn0sIFxxdWFkIGhfe2VfMn0nKHMpID0gYl8yIC0gXGZyYWN7Yl8yIHNeMn17XGVsbF4yfS4KJCQKQnkgY2hvb3NpbmcgJGJfMT0xJCBhbmQgJGJfMj0tMSQsIHdlIGhhdmUgdGhhdCAKJCQKaF97ZV8xfScoMCkraF97ZV8yfScoMCkgPSBiXzErYl8yPTBccXVhZFx0ZXh0eyBhbmQgfVxxdWFkIGhfe2VfMX0nKFxlbGwpID1oX3tlXzJ9JyhcZWxsKSA9IDAsCiQkCnNvIHRoYXQgJGgkIHNhdGlzZmllcyB0aGUgS2lyY2hob2ZmIGNvbmRpdGlvbnMgYXQgZXZlcnkgdmVydGV4LiBUaGlzIG1lYW5zIHRoYXQgJGgnJCBzaG91bGQgYmUgYSBjb250aW51b3VzIGZ1bmN0aW9uLiBIb3dldmVyLCBGaWd1cmUgMTAgc2hvd3MgdGhhdCAkaCckIGlzIGRpc2NvbnRpbnVvdXMuIFRoaXMgaXMgYWN0dWFsbHkgYW4gYXJ0ZWZhY3QgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIGVkZ2VzIGFyZSBub3QgY29tcGF0aWJsZSBvcmllbnRlZC4gRm9yIGEgZGlzY3Vzc2lvbiBhYm91dCBjb21wYXRpYmxlIG9yaWVudGF0aW9uLCBnbyB0byB0aGlzIFtwYWdlXShncmFwaHMzLmh0bWwpLgoKYGBge3J9Cm4gPC0gMgpteV9sZW5ndGggPC0gMgplZGdlcyA8LWVkZ2VzX3Jvb3RzX29mX3VuaXR5KG4sIGxlbmd0aCA9IG15X2xlbmd0aCkKZWRnZXNbWzFdXSA8LSByYmluZChjKDAsIDApLCBjKG15X2xlbmd0aCwgMCkpCmVkZ2VzW1syXV0gPC0gcmJpbmQoYygwLCAwKSwgYygtbXlfbGVuZ3RoLCAwKSkKZ3JhcGggPC0gbWV0cmljX2dyYXBoJG5ldyhlZGdlcyA9IGVkZ2VzKQpncmFwaF9kaXNjIDwtIGdyYXBoJGNsb25lKCkKZ3JhcGgkYnVpbGRfbWVzaChoID0gaCkKZ3JhcGhfZGlzYyRidWlsZF9tZXNoKGggPSBoLCBjb250aW51b3VzID0gRkFMU0UpCmBgYAoKCmBgYHtyfQojIEdlbmVyYWwgcGFyYW1ldGVycwpMIDwtIG15X2xlbmd0aCAgICAgICAgICAgICAjIGVkZ2UgbGVuZ3RoCmEgPC0gMSAgICAgICAgICAgICAjIHZhbHVlIGF0IGNlbnRyYWwgdmVydGV4CmIgPC0gYygxLCAtMSkgICAjIGIxK2IyK2IzIG11c3QgYmUgMAoKZjEgPC0gZnVuY3Rpb24ocykgYSArIGJbMV0qcyAtIGJbMV0qc14zLygzKkxeMikKZjIgPC0gZnVuY3Rpb24ocykgYSArIGJbMl0qcyAtIGJbMl0qc14zLygzKkxeMikKCgpkZjEgPC0gZnVuY3Rpb24ocykgYlsxXSAtIGJbMV0qc14yL0xeMgpkZjIgPC0gZnVuY3Rpb24ocykgYlsyXSAtIGJbMl0qc14yL0xeMgoKZGRmMSA8LSBmdW5jdGlvbihzKSAtMipiWzFdKnMvTF4yCmRkZjIgPC0gZnVuY3Rpb24ocykgLTIqYlsyXSpzL0xeMgoKZGRkZjEgPC0gZnVuY3Rpb24ocykgLTIqYlsxXS9MXjIKZGRkZjIgPC0gZnVuY3Rpb24ocykgLTIqYlsyXS9MXjIKCmZfbGlzdCA8LSBsaXN0KGYxLCBmMikKZGZfbGlzdCA8LSBsaXN0KGRmMSwgZGYyKQpkZGZfbGlzdCA8LSBsaXN0KGRkZjEsIGRkZjIpCmRkZGZfbGlzdCA8LSBsaXN0KGRkZGYxLCBkZGRmMikKCmYgPC0gYXBwbHlfZWRnZV9mdW5jdGlvbnNfZmFzdChncmFwaCwgZl9saXN0KQpkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoX2Rpc2MsIGRmX2xpc3QpCmRkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoLCBkZGZfbGlzdCkKZGRkZiA8LSBhcHBseV9lZGdlX2Z1bmN0aW9uc19mYXN0KGdyYXBoX2Rpc2MsIGRkZGZfbGlzdCkKYGBgCgpgYGB7cn0KbF9tZXNoIDwtIHNlcSgwLCBteV9sZW5ndGgsIGJ5ID0gaCkKZGZsMSA8LSBkZjEobF9tZXNoKQpkZmwyIDwtIGRmMihsX21lc2gpCgpsX21lc2hfbm9ybSA8LSBsX21lc2gvbXlfbGVuZ3RoClB0RTEgPC0gY2JpbmQocmVwKDEsIGxlbmd0aChsX21lc2gpKSwgbF9tZXNoX25vcm0pClB0RTIgPC0gY2JpbmQocmVwKDIsIGxlbmd0aChsX21lc2gpKSwgbF9tZXNoX25vcm0pClhZMSA8LSBncmFwaCRjb29yZGluYXRlcyhQdEUxKQpYWTIgPC0gZ3JhcGgkY29vcmRpbmF0ZXMoUHRFMikKREYxIDwtIGRhdGEuZnJhbWUoeCA9IFhZMVssMV0sIHkgPSBYWTFbLDJdLCB6ID0gZGZsMSkKREYyIDwtIGRhdGEuZnJhbWUoeCA9IFhZMlssMV0sIHkgPSBYWTJbLDJdLCB6ID0gZGZsMikKCkRGIDwtIHJiaW5kKERGMSwgcmVwKE5BLCAzKSwgREYyKQpERl9OT19OQSA8LSByYmluZChERjEsIERGMikKYGBgCgoKYGBge3J9CnN0YXIyZiA8LSBncmFwaCRwbG90X2Z1bmN0aW9uKFggPSBmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltNCwKICB5ID0geG00LAogIHogPSB6bTQsCiAgdSA9IGR5NCwKICB2ID0gZHg0LAogIHcgPSBkejQsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiaCIpLCB5ID0gMC44KSwgCiAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIlBhbGF0aW5vIiksCiAgICAgICAgICAgICAgICAgc2NlbmUgPSBsaXN0KHhheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ4IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInkiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieiIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgICAgICAgYXNwZWN0cmF0aW8gPSBsaXN0KHggPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMiksCiAgICAgICAgICAgICAgICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IHhfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHlfZXllLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHpfZXllKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IGxpc3QoeCA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAwKSksCiAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KAogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSAwLCB5ID0gMCwgeiA9IDAsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInYiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlMV9maW5feSwgeSA9IGUxX2Zpbl94LCB6ID0gZTFfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGU0X2Zpbl95LCB5ID0gZTRfZmluX3gsIHogPSBlNF9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW0xLCB5ID0geG0xLCB6ID0gem0xLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTQsIHkgPSB4bTQsIHogPSB6bTQsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpKQogICAgICAgICAgICAgICAgICkpCgpzdGFyMmRmIDwtIGdyYXBoJHBsb3RfZnVuY3Rpb24oWCA9IGYqMCwgdmVydGV4X3NpemUgPSBnc3csIGxpbmVfY29sb3IgPSAiYmxhY2siLCBlZGdlX3dpZHRoID0gZ3N3LCBsaW5lX3dpZHRoID0gZ3N3LCB0eXBlID0gInBsb3RseSIpIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltMSwKICB5ID0geG0xLAogIHogPSB6bTEsCiAgdSA9IGR5MSwKICB2ID0gZHgxLAogIHcgPSBkejEsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBhZGRfdHJhY2UoCiAgdHlwZSA9ICJjb25lIiwKICB4ID0geW00LAogIHkgPSB4bTQsCiAgeiA9IHptNCwKICB1ID0gZHk0LAogIHYgPSBkeDQsCiAgdyA9IGR6NCwKICBzaXplbW9kZSA9ICJhYnNvbHV0ZSIsCiAgc2l6ZXJlZiA9IHNpemVyZWYsCiAgc2hvd3NjYWxlID0gRkFMU0UsCiAgc2hvd2xlZ2VuZCA9IEZBTFNFLAogIGNvbG9yc2NhbGUgPSBsaXN0KGMoMCwgMSksIGMoInJlZCIsICJyZWQiKSksCiAgY21pbiA9IDAsCiAgY21heCA9IDEKKSB8PgogIGFkZF90cmFjZShkYXRhID0gREYsCiAgICAgICAgICAgIHggPSB+eSwgCiAgICAgICAgICAgIHkgPSB+eCwgCiAgICAgICAgICAgIHogPSB+eiwgCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwKICAgICAgICAgICAgbW9kZSA9ICJsaW5lcyIsICAKICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAicmdiKDAsMCwyMDApIiwgd2lkdGggPSBnc3cpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgYWRkX3RyYWNlKHggPSByZXAoREZfTk9fTkEkeSwgZWFjaCA9IDMpLCAKICAgICAgICAgICAgeSA9IHJlcChERl9OT19OQSR4LCBlYWNoID0gMyksIAogICAgICAgICAgICB6ID0gdW5saXN0KGxhcHBseShERl9OT19OQSR6LCBmdW5jdGlvbih6aikgYygwLCB6aiwgTkEpKSksCiAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwgCiAgICAgICAgICAgIG1vZGUgPSAibGluZXMiLAogICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJncmF5Iiwgd2lkdGggPSAwLjUpLAogICAgICAgICAgICBzaG93bGVnZW5kID0gRkFMU0UpIHw+CiAgY29uZmlnKG1hdGhqYXggPSAnY2RuJykgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiaCciKSwgeSA9IDAuOCksIAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlNF9maW5feSwgeSA9IGU0X2Zpbl94LCB6ID0gZTRfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW00LCB5ID0geG00LCB6ID0gem00LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKc3RhcjJkZGYgPC0gZ3JhcGgkcGxvdF9mdW5jdGlvbihYID0gZGRmLCB2ZXJ0ZXhfc2l6ZSA9IGdzdywgZWRnZV93aWR0aCA9IGdzdywgbGluZV93aWR0aCA9IGdzdywgdHlwZSA9ICJwbG90bHkiKSB8PiAKICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltNCwKICB5ID0geG00LAogIHogPSB6bTQsCiAgdSA9IGR5NCwKICB2ID0gZHg0LAogIHcgPSBkejQsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBwbG90bHk6OmxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IFRlWCgiaCcnIiksIHkgPSAwLjgpLCAKICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiUGFsYXRpbm8iKSwKICAgICAgICAgICAgICAgICBzY2VuZSA9IGxpc3QoeGF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gIngiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieSIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ6IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgICAgICBhc3BlY3RyYXRpbyA9IGxpc3QoeCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSAyKSwKICAgICAgICAgICAgICAgICAgIGNhbWVyYSA9IGxpc3QoZXllID0gbGlzdCh4ID0geF9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geV9leWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gel9leWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gbGlzdCh4ID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDApKSwKICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGxpc3QoCiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IDAsIHkgPSAwLCB6ID0gMCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IGUxX2Zpbl95LCB5ID0gZTFfZmluX3gsIHogPSBlMV9maW5feiwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgidl8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTRfZmluX3ksIHkgPSBlNF9maW5feCwgeiA9IGU0X2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSB5bTEsIHkgPSB4bTEsIHogPSB6bTEsCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoImVfMSIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltNCwgeSA9IHhtNCwgeiA9IHptNCwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8yIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIikpCiAgICAgICAgICAgICAgICAgKSkKCnN0YXIyZGRkZiA8LSBncmFwaF9kaXNjJHBsb3RfZnVuY3Rpb24oWCA9IGRkZGYsIHZlcnRleF9zaXplID0gZ3N3LCBlZGdlX3dpZHRoID0gZ3N3LCBsaW5lX3dpZHRoID0gZ3N3LCBjb250aW51b3VzID0gRkFMU0UsIGludGVycG9sYXRlX3Bsb3QgPSBUUlVFLCB0eXBlID0gInBsb3RseSIpIHw+IAogIGFkZF90cmFjZSgKICB0eXBlID0gImNvbmUiLAogIHggPSB5bTEsCiAgeSA9IHhtMSwKICB6ID0gem0xLAogIHUgPSBkeTEsCiAgdiA9IGR4MSwKICB3ID0gZHoxLAogIHNpemVtb2RlID0gImFic29sdXRlIiwKICBzaXplcmVmID0gc2l6ZXJlZiwKICBzaG93c2NhbGUgPSBGQUxTRSwKICBzaG93bGVnZW5kID0gRkFMU0UsCiAgY29sb3JzY2FsZSA9IGxpc3QoYygwLCAxKSwgYygicmVkIiwgInJlZCIpKSwKICBjbWluID0gMCwKICBjbWF4ID0gMQopIHw+CiAgYWRkX3RyYWNlKAogIHR5cGUgPSAiY29uZSIsCiAgeCA9IHltNCwKICB5ID0geG00LAogIHogPSB6bTQsCiAgdSA9IGR5NCwKICB2ID0gZHg0LAogIHcgPSBkejQsCiAgc2l6ZW1vZGUgPSAiYWJzb2x1dGUiLAogIHNpemVyZWYgPSBzaXplcmVmLAogIHNob3dzY2FsZSA9IEZBTFNFLAogIHNob3dsZWdlbmQgPSBGQUxTRSwKICBjb2xvcnNjYWxlID0gbGlzdChjKDAsIDEpLCBjKCJyZWQiLCAicmVkIikpLAogIGNtaW4gPSAwLAogIGNtYXggPSAxCikgfD4KICBjb25maWcobWF0aGpheCA9ICdjZG4nKSB8PgogIHBsb3RseTo6bGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gVGVYKCJoJycnIiksIHkgPSAwLjgpLAogICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGZhbWlseSA9ICJQYWxhdGlubyIpLAogICAgICAgICAgICAgICAgIHNjZW5lID0gbGlzdCh4YXhpcyA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQgPSAieCIsIGZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLCAgdGlja2ZvbnQgPSBsaXN0KGNvbG9yID0gY29sYXhubikpLAogICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICJ5IiwgZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksICB0aWNrZm9udCA9IGxpc3QoY29sb3IgPSBjb2xheG5uKSksCiAgICAgICAgICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gInoiLCBmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwgIHRpY2tmb250ID0gbGlzdChjb2xvciA9IGNvbGF4bm4pKSwKICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvID0gbGlzdCh4ID0gMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDIpLAogICAgICAgICAgICAgICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSB4X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5X2V5ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSB6X2V5ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIgPSBsaXN0KHggPSAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gMCkpLAogICAgICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gMCwgeSA9IDAsIHogPSAwLAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2IiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0gZTFfZmluX3ksIHkgPSBlMV9maW5feCwgeiA9IGUxX2Zpbl96LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJ2XzEiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSwKICAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgIHggPSBlNF9maW5feSwgeSA9IGU0X2Zpbl94LCB6ID0gZTRfZmluX3osCiAgICAgICAgICAgICAgIHRleHQgPSBUZVgoInZfMiIpLAogICAgICAgICAgICAgICB0ZXh0YW5nbGUgPSAwLCBheCA9IDAsIGF5ID0gMzUsCiAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IGdmc2l6ZSksCiAgICAgICAgICAgICAgIGFycm93Y29sb3IgPSAicmdiYSgwLDAsMCwwKSIpLAogICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgeCA9IHltMSwgeSA9IHhtMSwgeiA9IHptMSwKICAgICAgICAgICAgICAgdGV4dCA9IFRlWCgiZV8xIiksCiAgICAgICAgICAgICAgIHRleHRhbmdsZSA9IDAsIGF4ID0gMCwgYXkgPSAzNSwKICAgICAgICAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAiYmxhY2siLCBzaXplID0gZ2ZzaXplKSwKICAgICAgICAgICAgICAgYXJyb3djb2xvciA9ICJyZ2JhKDAsMCwwLDApIiksCiAgICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICB4ID0geW00LCB5ID0geG00LCB6ID0gem00LAogICAgICAgICAgICAgICB0ZXh0ID0gVGVYKCJlXzIiKSwKICAgICAgICAgICAgICAgdGV4dGFuZ2xlID0gMCwgYXggPSAwLCBheSA9IDM1LAogICAgICAgICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICJibGFjayIsIHNpemUgPSBnZnNpemUpLAogICAgICAgICAgICAgICBhcnJvd2NvbG9yID0gInJnYmEoMCwwLDAsMCkiKSkKICAgICAgICAgICAgICAgICApKQoKCnNhdmUoc3RhcjJmLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyMmYuUmRhdGEiKSkKc2F2ZShzdGFyMmRmLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyMmRmLlJkYXRhIikpCnNhdmUoc3RhcjJkZGYsIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIyZGRmLlJkYXRhIikpCnNhdmUoc3RhcjJkZGRmLCBmaWxlID0gaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyMmRkZGYuUmRhdGEiKSkKYGBgCgoKRm9yIGlsbHVzdHJhdGlvbiBwdXJwb3NlcywgRmlndXJlIDExIGFuZCAxMiBzaG93cyAkaCcnJCBhbmQgJGgnJyckLgoKCjo6Ojoge3N0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDQ4NXB4IDQ4NXB4IDQ4NXB4IDQ4NXB4OyBncmlkLWNvbHVtbi1nYXA6IDBweDsifQoKCjo6OiB7fQoKCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkaCA9IFxce2hfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkaF97ZV9pfShzKSA9IGEgKyBiX2kgcyAtIFxcZGZyYWN7Yl9pIHNeM317M1xcZWxsXjJ9JCBmb3IgJGk9MSwyJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIyZi5SZGF0YSIpKQpzdGFyMmYKYGBgCgoKOjo6Cgo6Ojoge30KCgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGgnID0gXFx7aCdfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkaCdfe2VfaX0ocykgPSBiX2kgLSBcXGRmcmFje2JfaSBzXjJ9e1xcZWxsXjJ9JCBmb3IgJGk9MSwyJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIyZGYuUmRhdGEiKSkKc3RhcjJkZgpgYGAKCgo6OjoKCjo6OiB7fQoKCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkaCcnID0gXFx7aCcnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGgnJ197ZV9pfShzKSA9ICAtIFxcZGZyYWN7MiBiX2kgc317XFxlbGxeMn0kIGZvciAkaT0xLDIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjJkZGYuUmRhdGEiKSkKc3RhcjJkZGYKYGBgCgoKOjo6CgoKOjo6IHt9CgoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRoJycnID0gXFx7aCcnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoJycnX3tlX2l9KHMpID0gIC0gXFxkZnJhY3syIGJfaX17XFxlbGxeMn0kIGZvciAkaT0xLDIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjJkZGRmLlJkYXRhIikpCnN0YXIyZGRkZgpgYGAKCgo6OjoKCgo6Ojo6CgoKIyBQYXRoIGRlcml2YXRpdmVzCgoKOjo6OiB7c3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDg1cHggNDg1cHggNDg1cHggNDg1cHg7IGdyaWQtY29sdW1uLWdhcDogMHB4OyJ9CgoKOjo6IHt9CgoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRoID0gXFx7aF9lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoX3tlX2l9KHMpID0gYSArIGJfaSBzIC0gXFxkZnJhY3tiX2kgc14zfXszXFxlbGxeMn0kIGZvciAkaT0xLDIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNkZ19wYXRoMS5SZGF0YSIpKQpzdGFyM2RnX3BhdGgxCmBgYAoKCjo6OgoKOjo6IHt9CgoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRoJyA9IFxce2gnX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGgnX3tlX2l9KHMpID0gYl9pIC0gXFxkZnJhY3tiX2kgc14yfXtcXGVsbF4yfSQgZm9yICRpPTEsMiQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RnX3BhdGgyLlJkYXRhIikpCnN0YXIzZGdfcGF0aDIKYGBgCgoKOjo6Cgo6Ojoge30KCgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGgnJyA9IFxce2gnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoJydfe2VfaX0ocykgPSAgLSBcXGRmcmFjezIgYl9pIHN9e1xcZWxsXjJ9JCBmb3IgJGk9MSwyJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGdfcGF0aDMuUmRhdGEiKSkKc3RhcjNkZ19wYXRoMwpgYGAKCgo6OjoKCgoKOjo6IHt9CgoKYGBge3IsIGV2YWwgPVRSVUUsIGZpZy5oZWlnaHQgPSA3LCBvdXQud2lkdGggPSAiMTAwJSIsIGZpZy5jYXAgPSBjYXB0aW9uZXIoIkZ1bmN0aW9uICRoJycgPSBcXHtoJydfZVxcfV97ZVxcaW5cXG1hdGhjYWx7RX19JCBnaXZlbiBieSAkaCcnX3tlX2l9KHMpID0gIC0gXFxkZnJhY3syIGJfaSBzfXtcXGVsbF4yfSQgZm9yICRpPTEsMiQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RnX3BhdGhfb2suUmRhdGEiKSkKc3RhcjNkZ19wYXRoX29rCmBgYAoKCjo6OgoKCjo6OjoKCgoKIyBQYXRoIGRlcml2YXRpdmVzIDIKCgo6Ojo6IHtzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0ODVweCA0ODVweCA0ODVweCA0ODVweDsgZ3JpZC1jb2x1bW4tZ2FwOiAwcHg7In0KCgo6Ojoge30KCgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGggPSBcXHtoX2VcXH1fe2VcXGluXFxtYXRoY2Fse0V9fSQgZ2l2ZW4gYnkgJGhfe2VfaX0ocykgPSBhICsgYl9pIHMgLSBcXGRmcmFje2JfaSBzXjN9ezNcXGVsbF4yfSQgZm9yICRpPTEsMiQuIil9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YV9maWxlcy9zdGFyM2RkZ19wYXRoMS5SZGF0YSIpKQpzdGFyM2RkZ19wYXRoMQpgYGAKCgo6OjoKCjo6OiB7fQoKCmBgYHtyLCBldmFsID1UUlVFLCBmaWcuaGVpZ2h0ID0gNywgb3V0LndpZHRoID0gIjEwMCUiLCBmaWcuY2FwID0gY2FwdGlvbmVyKCJGdW5jdGlvbiAkaCcgPSBcXHtoJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoJ197ZV9pfShzKSA9IGJfaSAtIFxcZGZyYWN7Yl9pIHNeMn17XFxlbGxeMn0kIGZvciAkaT0xLDIkLiIpfQpsb2FkKGhlcmU6OmhlcmUoImRhdGFfZmlsZXMvc3RhcjNkZGdfcGF0aDIuUmRhdGEiKSkKc3RhcjNkZGdfcGF0aDIKYGBgCgoKOjo6Cgo6Ojoge30KCgpgYGB7ciwgZXZhbCA9VFJVRSwgZmlnLmhlaWdodCA9IDcsIG91dC53aWR0aCA9ICIxMDAlIiwgZmlnLmNhcCA9IGNhcHRpb25lcigiRnVuY3Rpb24gJGgnJyA9IFxce2gnJ19lXFx9X3tlXFxpblxcbWF0aGNhbHtFfX0kIGdpdmVuIGJ5ICRoJydfe2VfaX0ocykgPSAgLSBcXGRmcmFjezIgYl9pIHN9e1xcZWxsXjJ9JCBmb3IgJGk9MSwyJC4iKX0KbG9hZChoZXJlOjpoZXJlKCJkYXRhX2ZpbGVzL3N0YXIzZGRnX3BhdGgzLlJkYXRhIikpCnN0YXIzZGRnX3BhdGgzCmBgYAoKCjo6OgoKCjo6OjoKCiMgUmVmZXJlbmNlcwoKYGBge3IsIGV2YWwgPVRSVUV9CmdyYXRlZnVsOjpjaXRlX3BhY2thZ2VzKG91dHB1dCA9ICJwYXJhZ3JhcGgiLCBvdXQuZGlyID0gIi4iKQpgYGAKCg==