Reading Data
LEAD 2022-2024
Elo Champ 2022
-Competitors = 23-
######Elo History check code Chunk if running Sub16
alone
Elo Accumulated Champ_2022
elo.last.accum <- elo.last.comp.new
elo.last.comp.new <- elo.last.comp.new
Geila MACIÀ MARTÍN |
FEEC |
1030.61 |
53.3 % |
51.3 % |
Júlia BENACH ZUBERO |
FEEC |
1027.70 |
52.9 % |
50.8 % |
Emily Charlotte PESCETTO |
FEEC |
1024.79 |
52.5 % |
50.4 % |
Laia TAULATS MCDONALD |
AND |
1021.88 |
52.1 % |
50 % |
Maria FERRÉ PRIM |
FEEC |
1018.97 |
51.7 % |
49.6 % |
Maite VILA LÓPEZ |
FEXME |
1016.06 |
51.3 % |
49.2 % |
Erika CARRASCO AGUILA |
FMM |
1013.15 |
50.8 % |
48.7 % |
India PERSSON FERNÁNDEZ |
FADMES |
1010.25 |
50.4 % |
48.3 % |
Maddi AGIRRE ZUBELDIA |
EMF-FVM |
1007.34 |
50 % |
47.9 % |
Paula HUERGO MIYAR |
FEMPA |
1004.43 |
49.6 % |
47.5 % |
Martina MUÑIZ VALENCIA |
FMM |
1001.52 |
49.2 % |
47.1 % |
Carmen SÁNCHEZ JIMENEZ |
FDMCM |
998.61 |
48.7 % |
46.7 % |
Amaya DEL POZO CARRION |
FMM |
995.70 |
48.3 % |
46.2 % |
Maria SANTOS GONZÁLEZ |
FEXME |
992.79 |
47.9 % |
45.8 % |
Irati ASO ESAIN |
FNDME |
989.88 |
47.5 % |
45.4 % |
Intza ELIZALDE LARRARTE |
EMF-FVM |
986.97 |
47.1 % |
45 % |
Lucia LORES REY |
FEGAMON |
984.06 |
46.7 % |
44.6 % |
Lara PRIDA SEOANE |
FGM |
981.15 |
46.2 % |
44.2 % |
Irene Xiaozhao PEREZ PRADO |
FAM |
978.25 |
45.8 % |
43.8 % |
Ainhoa USKOLA SAENZ DE OGER |
EMF-FVM |
975.34 |
45.4 % |
43.3 % |
Carlota BÖCK VÁZQUEZ |
FGM |
972.43 |
45 % |
42.9 % |
Sofía PEÑAS PÉREZ |
FMM |
972.43 |
45 % |
42.9 % |
Elna ROTGÉS CASELLAS |
FEEC |
966.61 |
44.2 % |
42.1 % |
#####* Capturando los futuros Sub18
lead.Sub18F.23 <- ranks %>%
filter(stage=="Clasific",
Category=="Sub18_F",
year=="2023"
# Name== nombre
) %>%
group_by(competitor= Name,
Year= year,
Compe= Compe_,
Team = Team,
Date= Date) %>%
reframe(rank= Rank) %>%
reshape2::dcast(formula = competitor + Team ~ Compe,
na.rm = TRUE)
lead.Sub18F.23 <- as_tibble(lead.Sub18F.23)
### ### REVIEWING
#####* Los sub16 “salen”
## enviando los sub16 a otro archivo
elo.22.accum.to_sub18 <- elo.last.accum %>% semi_join(lead.Sub18F.23,by="competitor")
## sub16 saliendo
elo.last.accum <- elo.last.accum %>% anti_join(lead.Sub18F.23,by="competitor")
MERGING from sub14
Elo First 2023
-Competitors = 32-
#####_ Elo History _
Elo Accumulated First_2023
Aina VILA CANTERO |
FEEC |
1059.71 |
67.4 % |
56.6 % |
Júlia BENACH ZUBERO |
FEEC |
1055.87 |
66.9 % |
56.1 % |
Ines ALLENDE LOPEZ |
EMF-FVM |
1049.09 |
66.1 % |
55.1 % |
Candela AMADOR DEL CASTILLO |
FMM |
1040.23 |
64.9 % |
53.9 % |
Udane MUGICA LASA |
EMF-FVM |
1039.93 |
64.9 % |
53.8 % |
Erika CARRASCO AGUILA |
FMM |
1033.21 |
64 % |
52.9 % |
Geila MACIÀ MARTÍN |
FEEC |
1030.61 |
53.3 % |
51.3 % |
Maddi AGIRRE ZUBELDIA |
EMF-FVM |
1029.52 |
63.5 % |
52.3 % |
Emily Charlotte PESCETTO BUDDEN |
FEEC |
1026.87 |
63.1 % |
51.9 % |
Emily Charlotte PESCETTO |
FEEC |
1024.79 |
52.5 % |
50.4 % |
África PIÉDROLA SÁNCHEZ |
FADMES |
1020.15 |
62.2 % |
51 % |
Clara SALA PÉREZ |
FEMECV |
1019.25 |
62.1 % |
50.8 % |
Maria FERRÉ PRIM |
FEEC |
1018.97 |
51.7 % |
49.6 % |
Noa PERSSON FERNÁNDEZ |
FADMES |
1014.55 |
61.5 % |
50.2 % |
Maite VILA LÓPEZ |
FEXME |
1013.38 |
61.3 % |
50 % |
Kanae Maria FRAILE ITAGAKI |
FECAMON |
1012.42 |
61.2 % |
49.9 % |
Martina MUÑIZ VALENCIA |
FMM |
1009.31 |
60.7 % |
49.4 % |
Lucía LÓPEZ SÁNCHEZ |
FEXME |
1006.27 |
60.3 % |
49 % |
Paula HUERGO MIYAR |
FEMPA |
1006.00 |
60.3 % |
48.9 % |
Edurne MARTÍNEZ ALMENDROS |
FDMESCyL |
1003.33 |
59.9 % |
48.6 % |
Naroa AYERDI ARIZ |
FNDME |
1002.47 |
59.8 % |
48.4 % |
Amanda BECERRA ESPINOSA |
FEXME |
999.78 |
59.4 % |
48 % |
Loreto PEINADO FRANGANILLO |
FMM |
998.91 |
59.3 % |
47.9 % |
Meia LEÓN VILCHES |
FEXME |
989.71 |
58 % |
46.6 % |
Sara SANMARTÍN CALVO |
FNDME |
987.65 |
57.7 % |
46.3 % |
Intza ELIZALDE LARRARTE |
EMF-FVM |
986.97 |
47.1 % |
45 % |
Nayara PANTIGA GUTIERREZ |
FEMPA |
985.58 |
57.4 % |
46 % |
Berta GONZÁLEZ MARTÍNEZ |
FDMCM |
981.45 |
56.9 % |
45.4 % |
Marta RIVERA GALLERA |
FMM |
977.32 |
56.3 % |
44.8 % |
Lara PRIDA SEOANE |
FGM |
976.76 |
56.2 % |
44.7 % |
Carmen SÁNCHEZ JIMENEZ |
FDMCM |
975.46 |
56 % |
44.6 % |
Swann LAMBLIN BURGUET |
FEEC |
975.26 |
56 % |
44.5 % |
Maissane POULAIN VIELLET |
FAM-AND |
973.20 |
55.7 % |
44.2 % |
Sofía PEÑAS PÉREZ |
FMM |
972.43 |
45 % |
42.9 % |
Martina CARLASSARE ESCRIBANO |
FEMECV |
971.13 |
55.4 % |
43.9 % |
Carla PEREZ AMBRONA |
FMM |
967.00 |
54.8 % |
43.4 % |
Elna ROTGÉS CASELLAS |
FEEC |
933.47 |
50 % |
38.7 % |
Elo Second 2023
-Competitors = 35-
#####_ Elo History _
Elo Accumulated Second_2023
Aina VILA CANTERO |
FEEC |
1086.66 |
56.2 % |
53.6 % |
Júlia BENACH ZUBERO |
FEEC |
1084.72 |
55.9 % |
53.3 % |
Ines ALLENDE LOPEZ |
EMF-FVM |
1068.55 |
53.6 % |
51 % |
Geila MACIÀ MARTÍN |
FEEC |
1061.42 |
52.6 % |
50 % |
Udane MUGICA LASA |
EMF-FVM |
1061.30 |
52.6 % |
50 % |
Candela AMADOR DEL CASTILLO |
FMM |
1055.95 |
51.8 % |
49.2 % |
Maddi AGIRRE ZUBELDIA |
EMF-FVM |
1052.80 |
51.4 % |
48.8 % |
Emily Charlotte PESCETTO BUDDEN |
FEEC |
1052.04 |
51.3 % |
48.7 % |
Erika CARRASCO AGUILA |
FMM |
1043.31 |
50 % |
47.4 % |
África PIÉDROLA SÁNCHEZ |
FADMES |
1034.05 |
48.7 % |
46.1 % |
Emily Charlotte PESCETTO |
FEEC |
1024.79 |
52.5 % |
50.4 % |
Clara SALA PÉREZ |
FEMECV |
1021.86 |
46.9 % |
44.3 % |
Maite VILA LÓPEZ |
FEXME |
1021.66 |
46.9 % |
44.3 % |
Maria FERRÉ PRIM |
FEEC |
1018.97 |
51.7 % |
49.6 % |
Lucía LÓPEZ SÁNCHEZ |
FEXME |
1018.33 |
46.4 % |
43.8 % |
Kanae Maria FRAILE ITAGAKI |
FECAMON |
1016.93 |
46.2 % |
43.6 % |
Noa PERSSON FERNÁNDEZ |
FADMES |
1013.41 |
45.7 % |
43.1 % |
Martina MUÑIZ VALENCIA |
FMM |
1008.19 |
45 % |
42.4 % |
Loreto PEINADO FRANGANILLO |
FMM |
1005.35 |
44.6 % |
42 % |
Paula HUERGO MIYAR |
FEMPA |
1004.89 |
44.5 % |
41.9 % |
Edurne MARTÍNEZ ALMENDROS |
FDMESCyL |
1004.11 |
44.4 % |
41.8 % |
Swann LAMBLIN BURGUET |
FEEC |
993.07 |
42.8 % |
40.3 % |
Amanda BECERRA ESPINOSA |
FEXME |
991.16 |
42.6 % |
40 % |
Intza ELIZALDE LARRARTE |
EMF-FVM |
986.97 |
47.1 % |
45 % |
Sara SANMARTÍN CALVO |
FNDME |
986.60 |
41.9 % |
39.4 % |
Sofia PÉREZ PEREA |
FMM |
980.27 |
41 % |
38.5 % |
Naroa AYERDI ARIZ |
FNDME |
978.78 |
40.8 % |
38.3 % |
Lara PRIDA SEOANE |
FGM |
976.76 |
56.2 % |
44.7 % |
Sofia LERMA SÁNCHEZ |
FADMES |
974.62 |
40.2 % |
37.8 % |
Meia LEÓN VILCHES |
FEXME |
973.59 |
40.1 % |
37.6 % |
Nayara PANTIGA GUTIERREZ |
FEMPA |
973.24 |
40.1 % |
37.6 % |
Maissane POULAIN VIELLET |
FAM-AND |
973.20 |
55.7 % |
44.2 % |
Berta GONZÁLEZ MARTÍNEZ |
FDMCM |
972.89 |
40 % |
37.5 % |
Sofía PEÑAS PÉREZ |
FMM |
972.43 |
45 % |
42.9 % |
Martina CARLASSARE ESCRIBANO |
FEMECV |
971.13 |
55.4 % |
43.9 % |
Ana SECO GABARRI |
FNDME |
968.98 |
39.5 % |
37 % |
Elba ROMÁN VAL |
FAM |
968.98 |
39.5 % |
37 % |
Carla PEREZ AMBRONA |
FMM |
967.00 |
54.8 % |
43.4 % |
Marta RIVERA GALLERA |
FMM |
959.36 |
38.1 % |
35.7 % |
Alba DÍAZ MARTÍNEZ |
FEMECV |
958.60 |
38 % |
35.6 % |
Carmen SÁNCHEZ JIMENEZ |
FDMCM |
955.62 |
37.6 % |
35.2 % |
Sofia SUAREZ DIAZ |
FEMPA |
944.90 |
36.2 % |
33.8 % |
Elna ROTGÉS CASELLAS |
FEEC |
919.41 |
32.9 % |
30.6 % |
Elo Third 2023
-Competitors = 35-
#####_ Elo History _
Elo Accumulated Third_2023
Júlia BENACH ZUBERO |
FEEC |
1115.22 |
61.6 % |
55 % |
Aina VILA CANTERO |
FEEC |
1112.23 |
61.2 % |
54.6 % |
Ines ALLENDE LOPEZ |
EMF-FVM |
1091.72 |
58.4 % |
51.7 % |
Emily Charlotte PESCETTO BUDDEN |
FEEC |
1080.19 |
56.8 % |
50 % |
Udane MUGICA LASA |
EMF-FVM |
1074.65 |
56 % |
49.2 % |
Maddi AGIRRE ZUBELDIA |
EMF-FVM |
1073.57 |
55.8 % |
49 % |
Erika CARRASCO AGUILA |
FMM |
1061.65 |
54.1 % |
47.3 % |
Geila MACIÀ MARTÍN |
FEEC |
1061.42 |
52.6 % |
50 % |
Candela AMADOR DEL CASTILLO |
FMM |
1057.01 |
53.5 % |
46.7 % |
Kanae Maria FRAILE ITAGAKI |
FECAMON |
1032.90 |
50 % |
43.2 % |
África PIÉDROLA SÁNCHEZ |
FADMES |
1027.80 |
49.3 % |
42.5 % |
Emily Charlotte PESCETTO |
FEEC |
1024.79 |
52.5 % |
50.4 % |
Lucía LÓPEZ SÁNCHEZ |
FEXME |
1021.99 |
48.4 % |
41.7 % |
Maite VILA LÓPEZ |
FEXME |
1020.38 |
48.2 % |
41.5 % |
Martina MUÑIZ VALENCIA |
FMM |
1019.27 |
48 % |
41.3 % |
Maria FERRÉ PRIM |
FEEC |
1018.97 |
51.7 % |
49.6 % |
Noa PERSSON FERNÁNDEZ |
FADMES |
1013.41 |
45.7 % |
43.1 % |
Loreto PEINADO FRANGANILLO |
FMM |
1005.35 |
44.6 % |
42 % |
Paula HUERGO MIYAR |
FEMPA |
1004.89 |
44.5 % |
41.9 % |
Clara SALA PÉREZ |
FEMECV |
1003.35 |
45.8 % |
39.1 % |
Swann LAMBLIN BURGUET |
FEEC |
1001.74 |
45.5 % |
38.9 % |
Edurne MARTÍNEZ ALMENDROS |
FDMESCyL |
997.97 |
45 % |
38.4 % |
Mar CAPDEVILA GONZÁLEZ |
FEEC |
996.38 |
44.8 % |
38.2 % |
Sara SANMARTÍN CALVO |
FNDME |
992.83 |
44.3 % |
37.7 % |
Intza ELIZALDE LARRARTE |
EMF-FVM |
986.97 |
47.1 % |
45 % |
Amanda BECERRA ESPINOSA |
FEXME |
985.07 |
43.2 % |
36.6 % |
Lara PRIDA SEOANE |
FGM |
976.76 |
56.2 % |
44.7 % |
Sofia LERMA SÁNCHEZ |
FADMES |
974.62 |
40.2 % |
37.8 % |
Meia LEÓN VILCHES |
FEXME |
973.59 |
40.1 % |
37.6 % |
Nayara PANTIGA GUTIERREZ |
FEMPA |
973.24 |
40.1 % |
37.6 % |
Maissane POULAIN VIELLET |
FAM-AND |
973.20 |
55.7 % |
44.2 % |
Sofía PEÑAS PÉREZ |
FMM |
972.43 |
45 % |
42.9 % |
Ana SECO GABARRI |
FNDME |
968.98 |
39.5 % |
37 % |
Elba ROMÁN VAL |
FAM |
968.98 |
39.5 % |
37 % |
Carla PEREZ AMBRONA |
FMM |
967.00 |
54.8 % |
43.4 % |
Berta GONZÁLEZ MARTÍNEZ |
FDMCM |
959.48 |
39.6 % |
33.3 % |
Sofia PÉREZ PEREA |
FMM |
954.52 |
38.9 % |
32.7 % |
Naroa AYERDI ARIZ |
FNDME |
950.58 |
38.4 % |
32.2 % |
Sofia SUAREZ DIAZ |
FEMPA |
944.90 |
36.2 % |
33.8 % |
Carmen SÁNCHEZ JIMENEZ |
FDMCM |
939.80 |
36.9 % |
30.8 % |
Martina CARLASSARE ESCRIBANO |
FEMECV |
938.03 |
36.7 % |
30.6 % |
Marta RIVERA GALLERA |
FMM |
936.15 |
36.4 % |
30.4 % |
Alba DÍAZ MARTÍNEZ |
FEMECV |
928.01 |
35.3 % |
29.4 % |
Elna ROTGÉS CASELLAS |
FEEC |
898.79 |
31.6 % |
26 % |
Elo CAMP 2023
-Competitors = 35-
#####_ Elo History _
Elo Accumulated camp_2023
Júlia BENACH ZUBERO |
FEEC |
1143.83 |
61.6 % |
55.3 % |
Aina VILA CANTERO |
FEEC |
1136.84 |
60.6 % |
54.3 % |
Ines ALLENDE LOPEZ |
EMF-FVM |
1108.39 |
56.7 % |
50.2 % |
Emily Charlotte PESCETTO BUDDEN |
FEEC |
1106.90 |
56.5 % |
50 % |
Udane MUGICA LASA |
EMF-FVM |
1097.37 |
55.1 % |
48.6 % |
Maddi AGIRRE ZUBELDIA |
EMF-FVM |
1094.30 |
54.7 % |
48.2 % |
Geila MACIÀ MARTÍN |
FEEC |
1092.18 |
54.4 % |
47.9 % |
Erika CARRASCO AGUILA |
FMM |
1080.41 |
52.7 % |
46.2 % |
Candela AMADOR DEL CASTILLO |
FMM |
1061.78 |
50 % |
43.5 % |
Lucía LÓPEZ SÁNCHEZ |
FEXME |
1034.87 |
46.1 % |
39.8 % |
Kanae Maria FRAILE ITAGAKI |
FECAMON |
1029.75 |
45.4 % |
39.1 % |
África PIÉDROLA SÁNCHEZ |
FADMES |
1028.66 |
45.2 % |
38.9 % |
Martina MUÑIZ VALENCIA |
FMM |
1028.16 |
45.2 % |
38.9 % |
Emily Charlotte PESCETTO |
FEEC |
1024.79 |
52.5 % |
50.4 % |
Loreto PEINADO FRANGANILLO |
FMM |
1020.28 |
44.1 % |
37.8 % |
Maite VILA LÓPEZ |
FEXME |
1019.27 |
43.9 % |
37.6 % |
Maria FERRÉ PRIM |
FEEC |
1018.97 |
51.7 % |
49.6 % |
Paula HUERGO MIYAR |
FEMPA |
1015.82 |
43.4 % |
37.2 % |
Clara SALA PÉREZ |
FEMECV |
1006.29 |
42.1 % |
35.9 % |
Edurne MARTÍNEZ ALMENDROS |
FDMESCyL |
1004.92 |
41.9 % |
35.7 % |
Noa PERSSON FERNÁNDEZ |
FADMES |
1004.32 |
41.8 % |
35.7 % |
Swann LAMBLIN BURGUET |
FEEC |
1001.74 |
45.5 % |
38.9 % |
Mar CAPDEVILA GONZÁLEZ |
FEEC |
996.38 |
44.8 % |
38.2 % |
Intza ELIZALDE LARRARTE |
EMF-FVM |
986.97 |
47.1 % |
45 % |
Sara SANMARTÍN CALVO |
FNDME |
985.80 |
39.2 % |
33.2 % |
Elena FERREIRO RODRIGUEZ |
FGM |
981.04 |
38.6 % |
32.6 % |
Sofia LERMA SÁNCHEZ |
FADMES |
974.62 |
40.2 % |
37.8 % |
Lara PRIDA SEOANE |
FGM |
973.78 |
37.6 % |
31.7 % |
Maissane POULAIN VIELLET |
FAM-AND |
973.20 |
55.7 % |
44.2 % |
Sofía PEÑAS PÉREZ |
FMM |
972.43 |
45 % |
42.9 % |
Ana SECO GABARRI |
FNDME |
968.98 |
39.5 % |
37 % |
Elba ROMÁN VAL |
FAM |
968.98 |
39.5 % |
37 % |
Carla PEREZ AMBRONA |
FMM |
967.00 |
54.8 % |
43.4 % |
Nora GARCÍA MAESTU |
FGM |
961.99 |
36 % |
30.3 % |
Amanda BECERRA ESPINOSA |
FEXME |
960.06 |
35.8 % |
30 % |
Nayara PANTIGA GUTIERREZ |
FEMPA |
958.27 |
35.5 % |
29.8 % |
Sofia PÉREZ PEREA |
FMM |
954.52 |
38.9 % |
32.7 % |
Meia LEÓN VILCHES |
FEXME |
952.62 |
34.8 % |
29.2 % |
Haizea PINTO ILINCHETA |
FNDME |
947.81 |
34.2 % |
28.6 % |
Berta GONZÁLEZ MARTÍNEZ |
FDMCM |
942.55 |
33.5 % |
28 % |
Martina CARLASSARE ESCRIBANO |
FEMECV |
938.03 |
36.7 % |
30.6 % |
Naroa AYERDI ARIZ |
FNDME |
937.68 |
32.9 % |
27.4 % |
Carmen SÁNCHEZ JIMENEZ |
FDMCM |
928.93 |
31.8 % |
26.4 % |
Sofia SUAREZ DIAZ |
FEMPA |
918.02 |
30.4 % |
25.2 % |
Marta RIVERA GALLERA |
FMM |
907.29 |
29.1 % |
24.1 % |
Alba DÍAZ MARTÍNEZ |
FEMECV |
905.18 |
28.9 % |
23.8 % |
Elna ROTGÉS CASELLAS |
FEEC |
898.79 |
31.6 % |
26 % |
###* Capturando los futuros Sub18
lead.Sub18F.24 <- ranks %>%
filter(stage=="Clasific",
Category=="Sub18_F",
year=="2024"
# Name== nombre
) %>%
group_by(competitor= Name,
Year= year,
Compe= Compe_,
Team = Team,
Date= Date) %>%
reframe(rank= Rank) %>%
reshape2::dcast(formula = competitor + Team ~ Compe,
na.rm = TRUE)
lead.Sub18F.24 <- as_tibble(lead.Sub18F.24)
###* Los futuros sub18 “salen”
## enviando los sub16 a otro archivo
elo.23.accum.to_sub18 <- elo.last.accum %>% semi_join(lead.Sub18F.24,by="competitor")
## sub16 saliendo
elo.last.accum <- elo.last.accum %>% anti_join(lead.Sub18F.24,by="competitor")
Anchoring ‘elo.last.accum’ 2023
elo.23.accum <- elo.last.accum
Elo First 2024
-Competitors = 35-
re-instating ‘elo.last.accum’
elo.last.accum <- elo.23.accum
#####_ Elo History _
Elo Accumulated First_2024
Aina VILA CANTERO |
FEEC |
1163.86 |
71.7 % |
62.1 % |
Júlia BENACH ZUBERO |
FEEC |
1143.83 |
61.6 % |
55.3 % |
Paula HERNÁNDEZ CARBALLAR |
FADMES |
1137.36 |
68.5 % |
58.5 % |
Ines ALLENDE LOPEZ |
EMF-FVM |
1128.05 |
67.3 % |
57.2 % |
Udane MUGICA LASA |
EMF-FVM |
1122.74 |
66.6 % |
56.4 % |
Milena CASETTA |
FEEC |
1107.67 |
64.7 % |
54.3 % |
Emily Charlotte PESCETTO BUDDEN |
FEEC |
1106.90 |
56.5 % |
50 % |
Abril FARRUS SORIANO |
FEEC |
1100.53 |
63.7 % |
53.2 % |
Celia CALVIN DEL FRESNO |
FMM |
1096.48 |
63.2 % |
52.7 % |
Geila MACIÀ MARTÍN |
FEEC |
1092.18 |
54.4 % |
47.9 % |
Elene OTERMIN LOSADA |
EMF-FVM |
1078.55 |
60.8 % |
50.1 % |
Candela AMADOR DEL CASTILLO |
FMM |
1077.97 |
60.7 % |
50 % |
Alicia LOPEZ GARCIA |
FDMCLM |
1075.69 |
60.4 % |
49.7 % |
Araceli DE BILBAO ORTEGA |
EMF-FVM |
1052.91 |
57.2 % |
46.4 % |
África PIÉDROLA SÁNCHEZ |
FADMES |
1050.71 |
56.9 % |
46.1 % |
Maia MARTÍNEZ GASOL |
FEEC |
1048.38 |
56.5 % |
45.8 % |
Lucía LÓPEZ SÁNCHEZ |
FEXME |
1047.47 |
56.4 % |
45.6 % |
Vera GARCÍA MARTÍN |
FEXME |
1047.47 |
56.4 % |
45.6 % |
Emily Charlotte PESCETTO |
FEEC |
1024.79 |
52.5 % |
50.4 % |
Loreto PEINADO FRANGANILLO |
FMM |
1021.68 |
52.7 % |
42 % |
Maria FERRÉ PRIM |
FEEC |
1018.97 |
51.7 % |
49.6 % |
Jana ESTEVE VALDES |
FEEC |
1018.31 |
52.3 % |
41.5 % |
Leire MONREAL OLLER |
FAM |
1016.61 |
52 % |
41.3 % |
Clara SALA PÉREZ |
FEMECV |
1005.90 |
50.5 % |
39.8 % |
Edurne MARTÍNEZ ALMENDROS |
FDMESCyL |
1002.65 |
50 % |
39.3 % |
Noa PERSSON FERNÁNDEZ |
FADMES |
1002.06 |
49.9 % |
39.2 % |
Swann LAMBLIN BURGUET |
FEEC |
1001.74 |
45.5 % |
38.9 % |
Sara SANMARTÍN CALVO |
FNDME |
991.19 |
48.4 % |
37.8 % |
Alba FERNÁNDEZ RUÍZ |
FMM |
989.45 |
48.1 % |
37.5 % |
Intza ELIZALDE LARRARTE |
EMF-FVM |
986.97 |
47.1 % |
45 % |
Elena FERREIRO RODRIGUEZ |
FGM |
981.04 |
38.6 % |
32.6 % |
Mireia IBARS FOLCH |
FEMECV |
978.40 |
46.5 % |
36.1 % |
Asia LATORRE CORO |
FAM |
974.64 |
46 % |
35.6 % |
Nikole BITORIKA ARDUENGO |
EMF-FVM |
974.64 |
46 % |
35.6 % |
Sofia LERMA SÁNCHEZ |
FADMES |
974.62 |
40.2 % |
37.8 % |
Maissane POULAIN VIELLET |
FAM-AND |
973.20 |
55.7 % |
44.2 % |
Ana SECO GABARRI |
FNDME |
968.98 |
39.5 % |
37 % |
Elba ROMÁN VAL |
FAM |
968.98 |
39.5 % |
37 % |
Cecilia ARENAL PARENTE |
FAM |
967.11 |
44.9 % |
34.6 % |
Carla PEREZ AMBRONA |
FMM |
967.00 |
54.8 % |
43.4 % |
Sofia PÉREZ PEREA |
FMM |
954.52 |
38.9 % |
32.7 % |
Amanda BECERRA ESPINOSA |
FEXME |
948.68 |
42.3 % |
32.2 % |
Haizea PINTO ILINCHETA |
FNDME |
947.81 |
34.2 % |
28.6 % |
Nora GARCÍA MAESTU |
FEGAMON |
943.06 |
41.5 % |
31.5 % |
Berta GONZÁLEZ MARTÍNEZ |
FDMCM |
942.55 |
33.5 % |
28 % |
Naroa AYERDI ARIZ |
FNDME |
937.68 |
32.9 % |
27.4 % |
Adriana TÚÑEZ SECO |
FEGAMON |
933.72 |
40.2 % |
30.4 % |
Alba GUTIÉRREZ GÓMEZ |
FEXME |
933.20 |
40.1 % |
30.3 % |
Natasha FUXET NAGY |
FAM |
926.73 |
39.2 % |
29.5 % |
Sofia SUAREZ DIAZ |
FEMPA |
918.02 |
30.4 % |
25.2 % |
Martina CARLASSARE ESCRIBANO |
FEMECV |
917.37 |
38 % |
28.4 % |
Alba DÍAZ MARTÍNEZ |
FEMECV |
905.18 |
28.9 % |
23.8 % |
África MARTÍNEZ AZAÑA |
FDMCLM |
895.38 |
35 % |
25.9 % |
Martina VERT REUS |
FBME |
894.78 |
35 % |
25.8 % |
Elo Second 2023
-Competitors = 35-
#####_ Elo History _
Elo Accumulated Second_2024
Aina VILA CANTERO |
FEEC |
1192.10 |
65.1 % |
57.1 % |
Paula HERNÁNDEZ CARBALLAR |
FADMES |
1161.40 |
61 % |
52.7 % |
Ines ALLENDE LOPEZ |
EMF-FVM |
1145.72 |
58.8 % |
50.5 % |
Júlia BENACH ZUBERO |
FEEC |
1143.83 |
61.6 % |
55.3 % |
Udane MUGICA LASA |
EMF-FVM |
1142.56 |
58.4 % |
50 % |
Milena CASETTA |
FEEC |
1138.20 |
57.8 % |
49.4 % |
Emily Charlotte PESCETTO BUDDEN |
FEEC |
1106.90 |
56.5 % |
50 % |
Celia CALVIN DEL FRESNO |
FMM |
1103.58 |
52.9 % |
44.4 % |
Abril FARRUS SORIANO |
FEEC |
1100.53 |
63.7 % |
53.2 % |
Geila MACIÀ MARTÍN |
FEEC |
1092.18 |
54.4 % |
47.9 % |
Alicia LOPEZ GARCIA |
FDMCLM |
1091.39 |
51.1 % |
42.7 % |
Candela AMADOR DEL CASTILLO |
FMM |
1087.26 |
50.5 % |
42.1 % |
Elene OTERMIN LOSADA |
EMF-FVM |
1083.57 |
50 % |
41.6 % |
Maia MARTÍNEZ GASOL |
FEEC |
1070.56 |
48.1 % |
39.8 % |
Lucía LÓPEZ SÁNCHEZ |
FEXME |
1058.99 |
46.5 % |
38.2 % |
África PIÉDROLA SÁNCHEZ |
FADMES |
1053.69 |
45.7 % |
37.5 % |
Araceli DE BILBAO ORTEGA |
EMF-FVM |
1052.91 |
57.2 % |
46.4 % |
Vera GARCÍA MARTÍN |
FEXME |
1033.39 |
42.8 % |
34.8 % |
Jana ESTEVE VALDES |
FEEC |
1032.06 |
42.6 % |
34.6 % |
Swann LAMBLIN BURGUET |
FEEC |
1028.34 |
42.1 % |
34.1 % |
Emily Charlotte PESCETTO |
FEEC |
1024.79 |
52.5 % |
50.4 % |
Loreto PEINADO FRANGANILLO |
FMM |
1021.68 |
52.7 % |
42 % |
Maria FERRÉ PRIM |
FEEC |
1018.97 |
51.7 % |
49.6 % |
Leire MONREAL OLLER |
FAM |
1015.43 |
40.3 % |
32.5 % |
Clara SALA PÉREZ |
FEMECV |
1002.62 |
38.6 % |
30.9 % |
Noa PERSSON FERNÁNDEZ |
FADMES |
992.40 |
37.2 % |
29.6 % |
Sara SANMARTÍN CALVO |
FNDME |
992.23 |
37.1 % |
29.6 % |
Edurne MARTÍNEZ ALMENDROS |
FDMESCyL |
990.85 |
37 % |
29.5 % |
Alba FERNÁNDEZ RUÍZ |
FMM |
989.45 |
48.1 % |
37.5 % |
Intza ELIZALDE LARRARTE |
EMF-FVM |
986.97 |
47.1 % |
45 % |
Arlet CODINA CASADEVALL |
FEEC |
985.56 |
36.3 % |
28.8 % |
Lia CLÉMENÇON URIEL |
FEEC |
984.69 |
36.1 % |
28.7 % |
Elena FERREIRO RODRIGUEZ |
FGM |
981.04 |
38.6 % |
32.6 % |
Nikole BITORIKA ARDUENGO |
EMF-FVM |
974.64 |
46 % |
35.6 % |
Sofia LERMA SÁNCHEZ |
FADMES |
974.62 |
40.2 % |
37.8 % |
Clara LEDESMA PRUNES |
FBME |
973.39 |
34.7 % |
27.4 % |
Maissane POULAIN VIELLET |
FAM-AND |
973.20 |
55.7 % |
44.2 % |
Ana SECO GABARRI |
FNDME |
968.98 |
39.5 % |
37 % |
Elba ROMÁN VAL |
FAM |
968.98 |
39.5 % |
37 % |
Cecilia ARENAL PARENTE |
FAM |
967.11 |
44.9 % |
34.6 % |
Carla PEREZ AMBRONA |
FMM |
967.00 |
54.8 % |
43.4 % |
Mireia IBARS FOLCH |
FEMECV |
960.28 |
33 % |
25.9 % |
Sofia PÉREZ PEREA |
FMM |
954.52 |
38.9 % |
32.7 % |
Asia LATORRE CORO |
FAM |
952.27 |
32 % |
25.1 % |
Haizea PINTO ILINCHETA |
FNDME |
947.81 |
34.2 % |
28.6 % |
Amanda BECERRA ESPINOSA |
FEXME |
943.46 |
30.9 % |
24.1 % |
Nora GARCÍA MAESTU |
FEGAMON |
943.06 |
41.5 % |
31.5 % |
Berta GONZÁLEZ MARTÍNEZ |
FDMCM |
942.55 |
33.5 % |
28 % |
Naroa AYERDI ARIZ |
FNDME |
937.68 |
32.9 % |
27.4 % |
Adriana TÚÑEZ SECO |
FEGAMON |
933.72 |
40.2 % |
30.4 % |
Sofia SUAREZ DIAZ |
FEMPA |
918.02 |
30.4 % |
25.2 % |
Alba GUTIÉRREZ GÓMEZ |
FEXME |
917.36 |
27.8 % |
21.5 % |
Alba DÍAZ MARTÍNEZ |
FEMECV |
905.18 |
28.9 % |
23.8 % |
Natasha FUXET NAGY |
FAM |
893.84 |
25.1 % |
19.3 % |
Martina CARLASSARE ESCRIBANO |
FEMECV |
886.65 |
24.3 % |
18.6 % |
África MARTÍNEZ AZAÑA |
FDMCLM |
871.12 |
22.7 % |
17.3 % |
Martina VERT REUS |
FBME |
866.26 |
22.3 % |
16.9 % |
Elo Third 2023
-Competitors = 28-
#####_ Elo History _
Elo Accumulated Third_2024
Aina VILA CANTERO |
FEEC |
1222.24 |
67.7 % |
60.4 % |
Paula HERNÁNDEZ CARBALLAR |
FADMES |
1186.71 |
63 % |
55.4 % |
Udane MUGICA LASA |
EMF-FVM |
1160.54 |
59.5 % |
51.7 % |
Ines ALLENDE LOPEZ |
EMF-FVM |
1148.93 |
57.8 % |
50 % |
Júlia BENACH ZUBERO |
FEEC |
1143.83 |
61.6 % |
55.3 % |
Milena CASETTA |
FEEC |
1138.20 |
57.8 % |
49.4 % |
Celia CALVIN DEL FRESNO |
FMM |
1109.39 |
52.2 % |
44.3 % |
Emily Charlotte PESCETTO BUDDEN |
FEEC |
1106.90 |
56.5 % |
50 % |
Candela AMADOR DEL CASTILLO |
FMM |
1102.97 |
51.3 % |
43.4 % |
Alicia LOPEZ GARCIA |
FDMCLM |
1102.16 |
51.2 % |
43.3 % |
Elene OTERMIN LOSADA |
EMF-FVM |
1094.37 |
50 % |
42.2 % |
Abril FARRUS SORIANO |
FEEC |
1094.04 |
50 % |
42.2 % |
Geila MACIÀ MARTÍN |
FEEC |
1092.18 |
54.4 % |
47.9 % |
Maia MARTÍNEZ GASOL |
FEEC |
1091.26 |
49.6 % |
41.8 % |
África PIÉDROLA SÁNCHEZ |
FADMES |
1067.06 |
46.1 % |
38.4 % |
Lucía LÓPEZ SÁNCHEZ |
FEXME |
1057.57 |
44.8 % |
37.1 % |
Swann LAMBLIN BURGUET |
FEEC |
1056.57 |
44.6 % |
37 % |
Araceli DE BILBAO ORTEGA |
EMF-FVM |
1052.91 |
57.2 % |
46.4 % |
Vera GARCÍA MARTÍN |
FEXME |
1033.39 |
42.8 % |
34.8 % |
Clara SALA PÉREZ |
FEMECV |
1026.03 |
40.3 % |
33 % |
Emily Charlotte PESCETTO |
FEEC |
1024.79 |
52.5 % |
50.4 % |
Loreto PEINADO FRANGANILLO |
FMM |
1021.68 |
52.7 % |
42 % |
Jana ESTEVE VALDES |
FEEC |
1020.90 |
39.6 % |
32.4 % |
Maria FERRÉ PRIM |
FEEC |
1018.97 |
51.7 % |
49.6 % |
Leire MONREAL OLLER |
FAM |
1006.79 |
37.7 % |
30.6 % |
Sara SANMARTÍN CALVO |
FNDME |
993.52 |
35.9 % |
29 % |
Noa PERSSON FERNÁNDEZ |
FADMES |
991.23 |
35.6 % |
28.7 % |
Alba FERNÁNDEZ RUÍZ |
FMM |
989.45 |
48.1 % |
37.5 % |
Intza ELIZALDE LARRARTE |
EMF-FVM |
986.97 |
47.1 % |
45 % |
Arlet CODINA CASADEVALL |
FEEC |
985.56 |
36.3 % |
28.8 % |
Lia CLÉMENÇON URIEL |
FEEC |
984.69 |
36.1 % |
28.7 % |
Elena FERREIRO RODRIGUEZ |
FGM |
981.04 |
38.6 % |
32.6 % |
Enara MALO SANTOS |
FNDME |
979.24 |
34.1 % |
27.4 % |
Edurne MARTÍNEZ ALMENDROS |
FDMESCyL |
974.91 |
33.5 % |
26.9 % |
Nikole BITORIKA ARDUENGO |
EMF-FVM |
974.64 |
46 % |
35.6 % |
Sofia LERMA SÁNCHEZ |
FADMES |
974.62 |
40.2 % |
37.8 % |
Maissane POULAIN VIELLET |
FAM-AND |
973.20 |
55.7 % |
44.2 % |
Ana SECO GABARRI |
FNDME |
968.98 |
39.5 % |
37 % |
Elba ROMÁN VAL |
FAM |
968.98 |
39.5 % |
37 % |
Cecilia ARENAL PARENTE |
FAM |
967.11 |
44.9 % |
34.6 % |
Carla PEREZ AMBRONA |
FMM |
967.00 |
54.8 % |
43.4 % |
Iris CABRERIZO GUASCH |
FBME |
966.93 |
32.5 % |
26 % |
Ona FERNÁNDEZ ROSSELL |
FAM-AND |
966.93 |
32.5 % |
26 % |
Sofia PÉREZ PEREA |
FMM |
954.52 |
38.9 % |
32.7 % |
Haizea PINTO ILINCHETA |
FNDME |
947.81 |
34.2 % |
28.6 % |
Clara LEDESMA PRUNES |
FBME |
947.67 |
30.1 % |
23.9 % |
Amanda BECERRA ESPINOSA |
FEXME |
943.46 |
30.9 % |
24.1 % |
Nora GARCÍA MAESTU |
FEGAMON |
943.06 |
41.5 % |
31.5 % |
Berta GONZÁLEZ MARTÍNEZ |
FDMCM |
942.55 |
33.5 % |
28 % |
Mireia IBARS FOLCH |
FEMECV |
939.53 |
29.1 % |
23.1 % |
Naroa AYERDI ARIZ |
FNDME |
937.68 |
32.9 % |
27.4 % |
Adriana TÚÑEZ SECO |
FEGAMON |
933.72 |
40.2 % |
30.4 % |
Asia LATORRE CORO |
FAM |
924.17 |
27.3 % |
21.5 % |
Sofia SUAREZ DIAZ |
FEMPA |
918.02 |
30.4 % |
25.2 % |
Alba DÍAZ MARTÍNEZ |
FEMECV |
905.18 |
28.9 % |
23.8 % |
Natasha FUXET NAGY |
FAM |
893.84 |
25.1 % |
19.3 % |
Alba GUTIÉRREZ GÓMEZ |
FEXME |
886.92 |
23.3 % |
18.1 % |
Martina CARLASSARE ESCRIBANO |
FEMECV |
886.65 |
24.3 % |
18.6 % |
Martina VERT REUS |
FBME |
853.21 |
20 % |
15.4 % |
África MARTÍNEZ AZAÑA |
FDMCLM |
853.13 |
20 % |
15.4 % |
## Up-coming SEASON
###* Capturando los futuros Sub18
###* Los sub16 “salen”
LS0tDQp0aXRsZTogIkVsb19TcG9ydC5MZWFkX0VTUF9TdWIxNkYiDQphdXRob3I6ICJGZWRlcmljbyBKLiBWaWxsYXRvcm8iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQotLS0NCg0KIyMjIyMgRnVlbnRlOiBbaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm9dKGh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvLykNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0NCmxpYnJhcnkoa25pdHIpDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBGQUxTRSwNCgltZXNzYWdlID0gRkFMU0UsDQogIHdhcm5pbmcgPSBGQUxTRSwNCglpbmNsdWRlID0gVFJVRQ0KKQ0KYGBgICANCg0KYGBge3IgcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQppZighcmVxdWlyZSh0aWR5dmVyc2UpKXtpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiLHJlcG9zID0gImh0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmciKX0NCmlmKCFyZXF1aXJlKGdvb2dsZXNoZWV0czQpKXtpbnN0YWxsLnBhY2thZ2VzKCJnb29nbGVzaGVldHM0Iil9DQppZighcmVxdWlyZShnb29nbGVkcml2ZSkpe2luc3RhbGwucGFja2FnZXMoImdvb2dsZWRyaXZlIil9DQppZighcmVxdWlyZShkcGx5cikpe2luc3RhbGwucGFja2FnZXMoImRwbHlyIil9DQppZighcmVxdWlyZShodHRyMikpe2luc3RhbGwucGFja2FnZXMoImh0dHIyIil9DQppZighcmVxdWlyZShqc29ubGl0ZSkpe2luc3RhbGwucGFja2FnZXMoImpzb25saXRlIil9DQppZighcmVxdWlyZShSc2VsZW5pdW0pKXtpbnN0YWxsLnBhY2thZ2VzKCJSc2VsZW5pdW0iKX0NCmlmKCFyZXF1aXJlKGNocm9tb3RlKSl7aW5zdGFsbC5wYWNrYWdlcygiY2hyb21vdGUiKX0NCmlmKCFyZXF1aXJlKHB1cnJyKSl7aW5zdGFsbC5wYWNrYWdlcygicHVycnIiKX0NCmlmKCFyZXF1aXJlKHdkbWFuKSl7aW5zdGFsbC5wYWNrYWdlcygid2RtYW4iKX0NCmlmKCFyZXF1aXJlKERUKSl7aW5zdGFsbC5wYWNrYWdlcygiRFQiKX0NCmlmKCFyZXF1aXJlKHBsb3RseSkpe2luc3RhbGwucGFja2FnZXMoInBsb3RseSIpfQ0KIyMNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGNocm9tb3RlKQ0KbGlicmFyeShwdXJycikNCmxpYnJhcnkod2RtYW4pDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGpzb25saXRlKQ0KbGlicmFyeShSU2VsZW5pdW0pDQoNCmxpYnJhcnkoZ29vZ2xlc2hlZXRzNCkNCmxpYnJhcnkoZ29vZ2xlZHJpdmUpDQoNCmBgYCAgDQoNCg0KIyMjIyMgUmVhZGluZyBEYXRhDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCg0Kb3B0aW9ucyhnYXJnbGVfb2F1dGhfZW1haWwgPSAidmlsbGF0b3JvcGF6ZmpAZGF0YWFuYWx5c2lzbGFiLmNvbSIpDQoNCnNzIDwtICJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xa1hZVUg5X1FXTkJiZEloVmtncnRoWEFnMlNVQzVwNi1yQjY1MUhseUc2ay9lZGl0P3VzcD1zaGFyaW5nIg0KaG9qYSA9IDENCnJhbmdvID0gIkExOkszNTY1Ig0KcmFua3MgPC0gcmVhZF9zaGVldChzcywNCiAgICAgICAgICAgICAgICBzaGVldD1ob2phLA0KICAgICAgICAgICAgICAgIHJhbmdlPSByYW5nbywgDQogICAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gVFJVRSkNCg0KcmFua3MgPC0gIHJhbmtzICU+JQ0KICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5mYWN0b3IpDQoNCmBgYCAgDQoNCiMjIExFQUQgMjAyMi0yMDI0DQpgYGB7ciBpbmNsdWRlPUZBTFNFLCByb3dzLnByaW50PSA4fQ0KbGVhZC5TdWIxNkYgPC0gcmFua3MgJT4lDQogIGZpbHRlcihzdGFnZT09IkNsYXNpZmljIiwNCiAgICAgICAgIENhdGVnb3J5PT0iU3ViMTZfRiIsDQogICAgICAgICB5ZWFyPT0iMjAyMiJ8eWVhcj09IjIwMjMifHllYXI9PSIyMDI0Ig0KICAgICMgICAgIE5hbWU9PSBub21icmUNCiAgICAgICAgICkgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBDb21wZV8sDQogICAgICAgICAgIFRlYW0gPSBUZWFtLA0KICAgICAgICAgICBEYXRlPSBEYXRlKSAlPiUNCiAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgVGVhbSB+IENvbXBlLCANCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KbGVhZC5TdWIxNkYgPC0gYXNfdGliYmxlKGxlYWQuU3ViMTZGKQ0KIyMNCmxlYWQuU3ViMTZGW29yZGVyKGxlYWQuU3ViMTZGJGMubGVhZC5jYW1wLjIyKSxjKDEsMiwzKV0gDQoNCmNvbXBldGl0b3JzLmMgPC0gbnJvdyhsZWFkLlN1YjE2RlshaXMubmEobGVhZC5TdWIxNkYkYy5sZWFkLmNhbXAuMjIpLF0pDQpjb21wZXRpdG9ycy5kIDwtIG5yb3cobGVhZC5TdWIxNkZbIWlzLm5hKGxlYWQuU3ViMTZGJGQubGVhZC5maXJzdC4yMyksXSkNCmNvbXBldGl0b3JzLmUgPC0gbnJvdyhsZWFkLlN1YjE2RlshaXMubmEobGVhZC5TdWIxNkYkZS5sZWFkLnNlYy4yMyksXSkNCmNvbXBldGl0b3JzLmYgPC0gbnJvdyhsZWFkLlN1YjE2RlshaXMubmEobGVhZC5TdWIxNkYkZi5sZWFkLnRocmQuMjMpLF0pDQpjb21wZXRpdG9ycy5nIDwtIG5yb3cobGVhZC5TdWIxNkZbIWlzLm5hKGxlYWQuU3ViMTZGJGcubGVhZC5jYW1wLjIzKSxdKQ0KY29tcGV0aXRvcnMuaCA8LSBucm93KGxlYWQuU3ViMTZGWyFpcy5uYShsZWFkLlN1YjE2RiRoLmxlYWQuZmlyc3QuMjQpLF0pDQpjb21wZXRpdG9ycy5pIDwtIG5yb3cobGVhZC5TdWIxNkZbIWlzLm5hKGxlYWQuU3ViMTZGJGkubGVhZC5zZWMuMjQpLF0pDQpjb21wZXRpdG9ycy5qIDwtIG5yb3cobGVhZC5TdWIxNkZbIWlzLm5hKGxlYWQuU3ViMTZGJGoubGVhZC50aHJkLjI0KSxdKQ0KYGBgICANCg0KDQojIyMgMjAyMiBDaGFtcA0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KbGVhZC5TdWIxNkZbb3JkZXIobGVhZC5TdWIxNkYkYy5sZWFkLmNhbXAuMjIpLCBjKDEsMiwzKV0gJT4lIHByaW50KG49NjUpDQpgYGAgIA0KDQojIyMgRWxvIENoYW1wIDIwMjIgDQoqLUNvbXBldGl0b3JzID0gYHIgY29tcGV0aXRvcnMuY2AtKg0KDQpgYGB7ciBldmFsPVRSVUUsaW5jbHVkZT1GQUxTRX0NCmxhc3QuY29tcCA8LSBsZWFkLlN1YjE2RlssYygxLDIsMyldICU+JSBmaWx0ZXIobGVhZC5TdWIxNkYkYy5sZWFkLmNhbXAuMjIhPSJOQSIpIA0KIw0KI2xhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0Kbi5kZWJ1dCA9IDANCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gbGFzdC5jb21wIA0KIyU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldKQ0KUiA8LSByZXAoMTAwMCwgTikNCiNSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksMV0NClRlYW0gPC0gbGFzdC5jb21wLmNhbGMkVGVhbVshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXQ0KcmVzdWx0cyA8LSAodW5saXN0KHJlc3VsdHMpKQ0Kc3RkZXYgPC0gc2QoYygxOihOK24uZGVidXQpKSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUikpDQptZWRpYW5hIDwtIG1lZGlhbih1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gdW5saXN0KGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdKSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5sYXN0LmNvbXAubmV3IDwtIGFzX3RpYmJsZShlbG8ubGFzdC5jb21wLm5ldykNCiMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KI24gPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQojTiA8LSBsZW5ndGgodW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KI1IuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQojbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0WywxXQ0KI1RlYW0gPC0gbGFzdF9jb21wX2RlYnV0JFRlYW0NCiMjDQojUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXRbLDNdKSAvIHN0ZGV2KSAvIG1heC5zdGQNCiNFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNCiNSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCiNtYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNCiNQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXdbLDFdKS9EICkpKQ0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KI1Byb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3WywxXSkvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojZWxvLmxhc3QuY29tcC5uZXcuZGVidXQgPC0gYXNfdGliYmxlKGNiaW5kKG5hbWVzID0gbmFtZXMsDQogIyAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICMgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dFssM10pLA0KICAgICMgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTWywxXSwNCiAgICAgIyAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXdbLDFdLDIpLA0KICAgICAgIyAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAjICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgIyAgICAgICAgICAgICAgICAgICkpDQoNCg0KI2Vsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCkNCg0KDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcC5uZXdbb3JkZXIoZWxvLmxhc3QuY29tcC5uZXckcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCiMjIyMjI19FbG8gSGlzdG9yeSBfICpjaGVjayBjb2RlIENodW5rIGlmIHJ1bm5pbmcgU3ViMTYgYWxvbmUqDQpgYGB7cn0NCiMjIA0KDQpjb21wZT0gIjIwMjIuY2hhbXAiDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSksDQogICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZGIiwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KDQojZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeS5sYXN0IA0KDQojJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCiMgdGltZS1zZXJpZXMgZGF0YS5mcmFtZQ0KIyMgc3ViMTZGDQplbG8uaGlzdG9yeS50X3Nlcmllcy5TMTZGIDwtIA0KICBhc190aWJibGUoZWxvLmhpc3RvcnkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihjYXRlZz09IlN1YjE2RiIpICU+JQ0KICAgICAgICAgICAgICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3J+Y29tcCwgdmFsdWUudmFyID0gIlIubmV3IikpIA0KIyMgDQoNCmBgYCAgDQoNCiMjIyBFbG8gaW4gdGltZQ0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KcCA8LSBlbG8uaGlzdG9yeSAlPiUgDQogIGZpbHRlcihjYXRlZz09IlN1YjE2RiIsIFIubmV3Pj0wKSAlPiUNCiAgZ2dwbG90KGFlcyh4PSBjb21wLCB5PSBSLm5ldywgZ3JvdXAgPSBjb21wZXRpdG9yLCBjb2wgPSBUZWFtKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQojICBnZW9tX2xpbmUobGluZXR5cGU9ICJkYXNoZWQiKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MTAwMCxsaW5ldHlwZT0gImRhc2hlZCIpDQoNCiNwDQpnZ3Bsb3RseShwKQ0KYGBgDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIENoYW1wXzIwMjIqKg0KYGBge3IgZXZhbD1UUlVFLCBlY2hvPVRSVUV9DQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcC5uZXcNCmBgYA0KDQpgYGB7ciBldmFsPVRSVUUsIGluY2x1ZGU9VFJVRSwgY29scy5wcmludD03fQ0KDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcC5uZXcsYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQpgYGAgIA0KDQoNCg0KIyMjIyMqICoqQ2FwdHVyYW5kbyBsb3MgZnV0dXJvcyBTdWIxOCoqIA0KYGBge3IgaW5jbHVkZT1UUlVFLCBlY2hvPVRSVUV9DQpsZWFkLlN1YjE4Ri4yMyA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKHN0YWdlPT0iQ2xhc2lmaWMiLA0KICAgICAgICAgQ2F0ZWdvcnk9PSJTdWIxOF9GIiwNCiAgICAgICAgIHllYXI9PSIyMDIzIg0KICAgICMgICAgIE5hbWU9PSBub21icmUNCiAgICAgICAgICkgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBDb21wZV8sDQogICAgICAgICAgIFRlYW0gPSBUZWFtLA0KICAgICAgICAgICBEYXRlPSBEYXRlKSAlPiUNCiAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgVGVhbSB+IENvbXBlLCANCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KbGVhZC5TdWIxOEYuMjMgPC0gYXNfdGliYmxlKGxlYWQuU3ViMThGLjIzKQ0KYGBgDQoNCg0KDQojIyMgIyMjICMjIyAgUkVWSUVXSU5HDQoNCg0KIyMjIyMqICpfTG9zIHN1YjE2ICJzYWxlbiJfKg0KDQoNCmBgYHtyIGluY2x1ZGU9VFJVRSwgZWNobz1UUlVFLGNvbHMucHJpbnQ9N30NCiMjIGVudmlhbmRvIGxvcyBzdWIxNiBhIG90cm8gYXJjaGl2bw0KZWxvLjIyLmFjY3VtLnRvX3N1YjE4IDwtIGVsby5sYXN0LmFjY3VtICU+JSBzZW1pX2pvaW4obGVhZC5TdWIxOEYuMjMsYnk9ImNvbXBldGl0b3IiKQ0KDQojIyBzdWIxNiBzYWxpZW5kbw0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihsZWFkLlN1YjE4Ri4yMyxieT0iY29tcGV0aXRvciIpIA0KYGBgICANCg0KDQojIyMjIE1FUkdJTkcgZnJvbSBzdWIxNCAjIyMjDQpgYGB7cn0NCmxlYWQuU3ViMTRGIDwtIHJhbmtzICU+JQ0KICBmaWx0ZXIoc3RhZ2U9PSJDbGFzaWZpYyIsDQogICAgICAgICBDYXRlZ29yeT09IlN1YjE0X0YiLA0KICAgICAgICAgeWVhcj09IjIwMjIifHllYXI9PSIyMDIzIg0KICAgICMgICAgIE5hbWU9PSBub21icmUNCiAgICAgICAgICkgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBDb21wZV8sDQogICAgICAgICAgIFRlYW0gPSBUZWFtLA0KICAgICAgICAgICBEYXRlPSBEYXRlKSAlPiUNCiAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgVGVhbSB+IENvbXBlLCANCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KbGVhZC5TdWIxNEYgPC0gYXNfdGliYmxlKGxlYWQuU3ViMTRGKQ0KIyMNCg0KbGVhZC5TdWIxNEYuYyA8LSBhc190aWJibGUobGVhZC5TdWIxNEZbIWlzLm5hKGxlYWQuU3ViMTRGJGMubGVhZC5jYW1wLjIyKSAsIGMoMSwyLDMpXSkNCg0KIyMNCg0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQojbiA9IGxlbmd0aChlbG8uYi5sZWFkLnNlYy4yMi5hY2N1bSRjb21wZXRpdG9yKQ0Kbi5kZWJ1dCA9IDANCiMjIw0KYyA8LSBsZWFkLlN1YjE0Ri5jIA0KIyU+JSByaWdodF9qb2luKGVsby5iLmxlYWQuc2VjLjIyLmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGMkY29tcGV0aXRvclshaXMubmEoYyRjLmxlYWQuY2FtcC4yMildKQ0KUiA8LSByZXAoMTAwMCwgTikNCm5hbWVzIDwtIGNbIWlzLm5hKGMkYy5sZWFkLmNhbXAuMjIpLDFdDQpUZWFtIDwtIGMkVGVhbVshaXMubmEoYyRjLmxlYWQuY2FtcC4yMildDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGVhZC5TdWIxNEYuYyRjLmxlYWQuY2FtcC4yMg0Kc3RkZXYgPC0gc2QocmVzdWx0cykNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKDEwMDAsIG4uZGVidXQgKSkpDQptZWRpYW5hIDwtIG1lZGlhbihsZWFkLlN1YjE0RiRjLmxlYWQuY2FtcC4yMlshaXMubmEobGVhZC5TdWIxNEYkYy5sZWFkLmNhbXAuMjIpXSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBjJGMubGVhZC5jYW1wLjIyWyFpcy5uYShjJGMubGVhZC5jYW1wLjIyKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQoNCmVsby5jLmxlYWQuY2FtcC4yMiA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGMkYy5sZWFkLmNhbXAuMjJbIWlzLm5hKGMkYy5sZWFkLmNhbXAuMjIpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5jLmxlYWQuY2FtcC4yMiA8LSBhc190aWJibGUoZWxvLmMubGVhZC5jYW1wLjIyKQ0KDQojIyMjIyMjIyMjIw0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KI24gPSBsZW5ndGgobGVhZC5TdWIxNEYuYy5kZWJ1dCRjLmxlYWQuY2FtcC4yMikNCiNOIDwtIGxlbmd0aChsZWFkLlN1YjE0RiRjLmxlYWQuY2FtcC4yMlshaXMubmEobGVhZC5TdWIxNEYkYy5sZWFkLmNhbXAuMjIpXSkNCiNSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KI25hbWVzIDwtIGxlYWQuU3ViMTRGLmMuZGVidXRbLDFdDQojVGVhbSA8LSBsZWFkLlN1YjE0Ri5jLmRlYnV0JFRlYW0NCiNjYXRlZyA8LSBsZWFkLlN1YjE0Ri5hX2INCiNTIDwtICgobWVkaWFuYS0gbGVhZC5TdWIxNEYuYy5kZWJ1dCRjLmxlYWQuY2FtcC4yMikgLyBzdGRldikgLyBtYXguc3RkDQojRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQojUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQojUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmMubGVhZC5jYW1wLjIyJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ldykvRCApKSkNCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNCiNQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8uYy5sZWFkLmNhbXAuMjIkUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KI2Vsby5jLmxlYWQuY2FtcC4yMi5kZWJ1dCA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICMgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAjICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxlYWQuU3ViMTRGLmMuZGVidXQkYy5sZWFkLmNhbXAuMjIsDQogICAgIyAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICMgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgIyAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAjICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgIyAgICAgICAgICAgICAgICAgICkNCiNlbG8uYy5sZWFkLmNhbXAuMjIuZGVidXQgPC0gYXNfdGliYmxlKGVsby5jLmxlYWQuY2FtcC4yMi5kZWJ1dCkNCg0KI2Vsby5jLmxlYWQuY2FtcC4yMiA8LSBlbG8uYy5sZWFkLmNhbXAuMjIgJT4lIHJiaW5kKGVsby5jLmxlYWQuY2FtcC4yMi5kZWJ1dCkNCg0KDQojZWxvLmIubGVhZC5zZWMuMjIuYWNjdW0uY19hYnNlbnQgPC0gZWxvLmIubGVhZC5zZWMuMjIuYWNjdW0gJT4lIGFudGlfam9pbihlbG8uYy5sZWFkLmNhbXAuMjIsIGJ5PSJjb21wZXRpdG9yIikNCiMjDQplbG8uYy5sZWFkLmNhbXAuMjIuYWNjdW0gPC0gZWxvLmMubGVhZC5jYW1wLjIyIA0KIyU+JSByYmluZChlbG8uYi5sZWFkLnNlYy4yMi5hY2N1bS5jX2Fic2VudCkNCmVsby5jLmxlYWQuY2FtcC4yMi5hY2N1bSA8LSBlbG8uYy5sZWFkLmNhbXAuMjIuYWNjdW1bb3JkZXIoZWxvLmMubGVhZC5jYW1wLjIyLmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmxlYWQuU3ViMTZGLjIzIDwtIHJhbmtzICU+JQ0KICBmaWx0ZXIoc3RhZ2U9PSJDbGFzaWZpYyIsDQogICAgICAgICBDYXRlZ29yeT09IlN1YjE2X0YiLA0KICAgICAgICAgeWVhcj09IjIwMjMiDQogICAgICAgICAjICAgICBOYW1lPT0gbm9tYnJlDQogICkgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBDb21wZV8sDQogICAgICAgICAgIFRlYW0gPSBUZWFtLA0KICAgICAgICAgICBEYXRlPSBEYXRlKSAlPiUNCiAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgVGVhbSB+IENvbXBlLCANCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KbGVhZC5TdWIxNkYuMjMgPC0gYXNfdGliYmxlKGxlYWQuU3ViMTZGLjIzKQ0KIw0KIyAqICoqX0xvcyBzdWIxNiAic2FsZW4iXyogIyMjIw0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgRmlyc3RfMjAyMyoqICMjIyMNCiMjIGVudmlhbmRvIGxvcyBzdWIxNiBhIG90cm8gYXJjaGl2bw0KZWxvLjIyLmFjY3VtLnRvX3N1YjE2IDwtIGVsby5jLmxlYWQuY2FtcC4yMi5hY2N1bSAlPiUgc2VtaV9qb2luKGxlYWQuU3ViMTZGLjIzLGJ5PSJjb21wZXRpdG9yIikNCiMjIHN1YjE2IHNhbGllbmRvDQojIGVsby5jLmxlYWQuY2FtcC4yMi5hY2N1bSA8LSBlbG8uYy5sZWFkLmNhbXAuMjIuYWNjdW0gJT4lIGFudGlfam9pbihsZWFkLlN1YjE2Ri4yMyxieT0iY29tcGV0aXRvciIpIA0KDQpgYGANCg0KDQojIyMgMjAyMyBGaXJzdA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpsZWFkLlN1YjE2RltvcmRlcihsZWFkLlN1YjE2RiRkLmxlYWQuZmlyc3QuMjMpLCBjKDEsMiw0KV0gJT4lIHByaW50KG49NjUpDQpgYGAgIA0KDQojIyMgRWxvIEZpcnN0IDIwMjMgDQoqLUNvbXBldGl0b3JzID0gYHIgY29tcGV0aXRvcnMuZGAtKg0KDQpgYGB7ciBldmFsPVRSVUUsaW5jbHVkZT1GQUxTRX0NCmxhc3QuY29tcCA8LSBsZWFkLlN1YjE2RlssYygxLDIsNCldICU+JSBmaWx0ZXIobGVhZC5TdWIxNkYkZC5sZWFkLmZpcnN0LjIzIT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgICANCg0KDQoNCmBgYHtyfQ0KIyMgZXgtU3ViMTQgY29taW5nIGluICMjIw0KbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCA8LSBsYXN0X2NvbXBfZGVidXQgJT4lIHJpZ2h0X2pvaW4oZWxvLjIyLmFjY3VtLnRvX3N1YjE2LCBieT0iY29tcGV0aXRvciIpDQpsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0IDwtIGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbIWlzLm5hKGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDNdKSxdDQojDQpsYXN0X2NvbXBfZGVidXQgPC0gbGFzdF9jb21wX2RlYnV0ICU+JSBhbnRpX2pvaW4obGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpuLmRlYnV0LmZyb21fbHdyX2NhdCA9IG5yb3cobGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCkNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gbGFzdC5jb21wICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDFdDQpUZWFtIDwtIGxhc3QuY29tcC5jYWxjJFRlYW0ueFshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXQ0KcmVzdWx0cyA8LSAodW5saXN0KHJlc3VsdHMpKQ0Kc3RkZXYgPC0gc2QoYygxOihOK24uZGVidXQrbi5kZWJ1dC5mcm9tX2x3cl9jYXQpKSkNCiMNClIubHdyX2NhdCA8LSBsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0JFIubmV3DQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0KSxjKFIubHdyX2NhdCkgKSkNCm1lZGlhbmEgPC0gbWVkaWFuKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSB1bmxpc3QobGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10pICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmxhc3QuY29tcC5uZXcgPC0gYXNfdGliYmxlKGVsby5sYXN0LmNvbXAubmV3KQ0KIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCk4gPC0gbGVuZ3RoKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXRbLDFdDQpUZWFtIDwtIGxhc3RfY29tcF9kZWJ1dCRUZWFtDQojY2F0ZWcgPC0gbGVhZC5TdWIxNEYuYV9iDQpTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KDQojIyBmcm9tX2x3cl9DYXQgIyMjIyMjIyMjIyMjIyMjIyMNCm4gPSBucm93KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIFIubHdyX2NhdA0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssMV0NClRlYW0gPC0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDJdKQ0KI2NhdGVnIDwtIGxlYWQuU3ViMTRGLmFfYg0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywzXSkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXdbLDFdKS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ld1ssMV0pL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLmxhc3QuY29tcC5uZXcuZGVidXQubHdyX2NhdCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssM10pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFNbLDFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpDQoNCiMjIyMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCwgZWxvLmxhc3QuY29tcC5uZXcuZGVidXQubHdyX2NhdCkNCg0KDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcC5uZXdbb3JkZXIoZWxvLmxhc3QuY29tcC5uZXckcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7cn0NCiMjIA0KY29tcGU9ICIyMDIzLjEiDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSksDQogICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZGIiwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCiMgdGltZS1zZXJpZXMgZGF0YS5mcmFtZQ0KIyMgc3ViMTZGDQplbG8uaGlzdG9yeS50X3Nlcmllcy5TMTZGIDwtIA0KICBhc190aWJibGUoZWxvLmhpc3RvcnkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihjYXRlZz09IlN1YjE2RiIpICU+JQ0KICAgICAgICAgICAgICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3J+Y29tcCwgdmFsdWUudmFyID0gIlIubmV3IikpIA0KIyMgDQoNCmBgYCAgDQoNCg0KIyMjIEVsbyBpbiB0aW1lDQpgYGB7ciBpbmNsdWRlPVRSVUUsIGZpZy53aWR0aD0gOX0NCnAgPC0gZWxvLmhpc3RvcnkgJT4lIA0KICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNkYiLCBSLm5ldz49MCkgJT4lDQogIGdncGxvdChhZXMoeD0gY29tcCwgeT0gUi5uZXcsIGdyb3VwID0gY29tcGV0aXRvciwgY29sID0gVGVhbSkpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX2xpbmUobGluZXR5cGU9ICJkYXNoZWQiKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MTAwMCxsaW5ldHlwZT0gImRhc2hlZCIpDQoNCiNwDQpnZ3Bsb3RseShwKQ0KYGBgICANCg0KDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBGaXJzdF8yMDIzKiogIA0KDQpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQplbG8ubGFzdC5hY2N1bQ0KZWxvLmxhc3QuY29tcC5uZXcNCmBgYA0KDQpgYGB7ciBldmFsPVRSVUUsIGluY2x1ZGU9VFJVRSwgY29scy5wcmludD03fQ0KDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcC5uZXcsYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQpgYGAgIA0KDQojIyMgMjAyMyBTZWNvbmQgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpsZWFkLlN1YjE2RltvcmRlcihsZWFkLlN1YjE2RiRlLmxlYWQuc2VjLjIzKSwgYygxLDIsNSldICU+JSBwcmludChuPTY1KQ0KYGBgICANCg0KIyMjIEVsbyBTZWNvbmQgMjAyMyANCiotQ29tcGV0aXRvcnMgPSBgciBjb21wZXRpdG9ycy5lYC0qDQoNCmBgYHtyIGV2YWw9VFJVRSxpbmNsdWRlPUZBTFNFfQ0KbGFzdC5jb21wIDwtIGxlYWQuU3ViMTZGWyxjKDEsMiw1KV0gJT4lIGZpbHRlcihsZWFkLlN1YjE2RiRlLmxlYWQuc2VjLjIzIT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCmBgYHtyfQ0KIyMgZXgtU3ViMTQgY29taW5nIGluICMjIw0KbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCA8LSBsYXN0X2NvbXBfZGVidXQgJT4lIHJpZ2h0X2pvaW4oZWxvLjIyLmFjY3VtLnRvX3N1YjE2LCBieT0iY29tcGV0aXRvciIpDQpsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0IDwtIGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbIWlzLm5hKGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDNdKSxdDQojDQpsYXN0X2NvbXBfZGVidXQgPC0gbGFzdF9jb21wX2RlYnV0ICU+JSBhbnRpX2pvaW4obGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0Kbi5kZWJ1dC5mcm9tX2x3cl9jYXQgPSBucm93KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKGMoMTooTituLmRlYnV0K24uZGVidXQuZnJvbV9sd3JfY2F0KSkpDQojDQpSLmx3cl9jYXQgPC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCRSLm5ldw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCksYyhSLmx3cl9jYXQpICkpDQptZWRpYW5hIDwtIG1lZGlhbih1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gdW5saXN0KGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdKSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5sYXN0LmNvbXAubmV3IDwtIGFzX3RpYmJsZShlbG8ubGFzdC5jb21wLm5ldykNCiMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0WywxXQ0KVGVhbSA8LSBsYXN0X2NvbXBfZGVidXQkVGVhbQ0KI2NhdGVnIDwtIGxlYWQuU3ViMTRGLmFfYg0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXRbLDNdKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3WywxXSkvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0WywzXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXdbLDFdLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCg0KIyMgZnJvbV9sd3JfQ2F0ICMjIyMjIyMjIyMjIyMjIyMjDQpuID0gbnJvdyhsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0KQ0KTiA8LSBsZW5ndGgodW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KUi5kZWJ1dCA8LSBSLmx3cl9jYXQNCm5hbWVzIDwtIGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDFdDQpUZWFtIDwtIHVubGlzdChsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywyXSkNCiNjYXRlZyA8LSBsZWFkLlN1YjE0Ri5hX2INClMgPC0gKChtZWRpYW5hIC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0Lmx3cl9jYXQgPC0gYXNfdGliYmxlKGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KDQojIyMjDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuY29tcC5uZXcuZGVidXQsIGVsby5sYXN0LmNvbXAubmV3LmRlYnV0Lmx3cl9jYXQpDQoNCg0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXAubmV3W29yZGVyKGVsby5sYXN0LmNvbXAubmV3JHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCldKQ0KDQoNCmBgYCAgDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7cn0NCiMjIA0KY29tcGU9ICIyMDIzLjIiDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSksDQogICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZGIiwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCiMgdGltZS1zZXJpZXMgZGF0YS5mcmFtZQ0KIyMgc3ViMTZGDQplbG8uaGlzdG9yeS50X3Nlcmllcy5TMTZGIDwtIA0KICBhc190aWJibGUoZWxvLmhpc3RvcnkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihjYXRlZz09IlN1YjE2RiIpICU+JQ0KICAgICAgICAgICAgICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3J+Y29tcCwgdmFsdWUudmFyID0gIlIubmV3IikpIA0KIyMgDQoNCmBgYCAgDQoNCiMjIyBFbG8gaW4gdGltZQ0KYGBge3IgaW5jbHVkZT1UUlVFLCBmaWcud2lkdGg9IDE2fQ0KcCA8LSBlbG8uaGlzdG9yeSAlPiUgDQogIGZpbHRlcihjYXRlZz09IlN1YjE2RiIsIFIubmV3Pj0wKSAlPiUNCiAgZ2dwbG90KGFlcyh4PSBjb21wLCB5PSBSLm5ldywgZ3JvdXAgPSBjb21wZXRpdG9yLCBjb2wgPSBUZWFtKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fbGluZShsaW5ldHlwZT0gImRhc2hlZCIpICsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0xMDAwLGxpbmV0eXBlPSAiZGFzaGVkIikNCg0KI3ANCmdncGxvdGx5KHApDQpgYGAgIA0KDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBTZWNvbmRfMjAyMyoqDQpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQplbG8ubGFzdC5hY2N1bQ0KZWxvLmxhc3QuY29tcC5uZXcNCmBgYA0KDQpgYGB7ciBldmFsPVRSVUUsIGluY2x1ZGU9VFJVRSwgY29scy5wcmludD03fQ0KDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcC5uZXcsYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQpgYGAgIA0KDQojIyMgMjAyMyBUaGlyZCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmxlYWQuU3ViMTZGW29yZGVyKGxlYWQuU3ViMTZGJGYubGVhZC50aHJkLjIzKSwgYygxLDIsNildICU+JSBwcmludChuPTY1KQ0KYGBgICANCg0KIyMjIEVsbyBUaGlyZCAyMDIzIA0KKi1Db21wZXRpdG9ycyA9IGByIGNvbXBldGl0b3JzLmVgLSoNCg0KYGBge3IgZXZhbD1UUlVFLGluY2x1ZGU9RkFMU0V9DQpsYXN0LmNvbXAgPC0gbGVhZC5TdWIxNkZbLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGxlYWQuU3ViMTZGJGYubGVhZC50aHJkLjIzIT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KYGBge3J9DQojIyBleC1TdWIxNCBjb21pbmcgaW4gIyMjDQpsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0IDwtIGxhc3RfY29tcF9kZWJ1dCAlPiUgcmlnaHRfam9pbihlbG8uMjIuYWNjdW0udG9fc3ViMTYsIGJ5PSJjb21wZXRpdG9yIikNCmxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQgPC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFshaXMubmEobGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssM10pLF0NCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0X2NvbXBfZGVidXQgJT4lIGFudGlfam9pbihsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0LCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsYXN0LmNvbXAgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksMV0NClRlYW0gPC0gbGFzdC5jb21wLmNhbGMkVGVhbS54WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdDQpyZXN1bHRzIDwtICh1bmxpc3QocmVzdWx0cykpDQpzdGRldiA8LSBzZChjKDE6KE4rbi5kZWJ1dCkpKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSB1bmxpc3QobGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10pICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmxhc3QuY29tcC5uZXcgPC0gYXNfdGliYmxlKGVsby5sYXN0LmNvbXAubmV3KQ0KIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KTiA8LSBsZW5ndGgodW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KUi5kZWJ1dCA8LSByZXAoMTAwMCwgbikNCm5hbWVzIDwtIGxhc3RfY29tcF9kZWJ1dFssMV0NClRlYW0gPC0gbGFzdF9jb21wX2RlYnV0JFRlYW0NCiNjYXRlZyA8LSBsZWFkLlN1YjE0Ri5hX2INClMgPC0gKChtZWRpYW5hIC0gbGFzdF9jb21wX2RlYnV0WywzXSkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXdbLDFdKS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ld1ssMV0pL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLmxhc3QuY29tcC5uZXcuZGVidXQgPC0gYXNfdGliYmxlKGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dFssM10pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFNbLDFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpDQoNCg0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmNvbXAubmV3LmRlYnV0KQ0KDQoNCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5jb21wLm5ld1tvcmRlcihlbG8ubGFzdC5jb21wLm5ldyRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgpXSkNCg0KYGBgICANCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyfQ0KIyMgDQpjb21wZT0gIjIwMjMuMyINCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSwNCiAgICAgICAgIGNhdGVnID0gcmVwKCJTdWIxNkYiLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KIyB0aW1lLXNlcmllcyBkYXRhLmZyYW1lDQojIyBzdWIxNkYNCmVsby5oaXN0b3J5LnRfc2VyaWVzLlMxNkYgPC0gDQogIGFzX3RpYmJsZShlbG8uaGlzdG9yeSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKGNhdGVnPT0iU3ViMTZGIikgJT4lDQogICAgICAgICAgICAgIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvcn5jb21wLCB2YWx1ZS52YXIgPSAiUi5uZXciKSkgDQojIyANCg0KYGBgICANCg0KIyMjIEVsbyBpbiB0aW1lDQpgYGB7ciBpbmNsdWRlPVRSVUUsIGZpZy53aWR0aD0gMTZ9DQpwIDwtIGVsby5oaXN0b3J5ICU+JSANCiAgZmlsdGVyKGNhdGVnPT0iU3ViMTZGIiwgUi5uZXc+PTApICU+JQ0KICBnZ3Bsb3QoYWVzKHg9IGNvbXAsIHk9IFIubmV3LCBncm91cCA9IGNvbXBldGl0b3IsIGNvbCA9IFRlYW0pKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9saW5lKGxpbmV0eXBlPSAiZGFzaGVkIikgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEwMDAsbGluZXR5cGU9ICJkYXNoZWQiKQ0KDQojcA0KZ2dwbG90bHkocCkNCmBgYCAgDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIFRoaXJkXzIwMjMqKg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KZWxvLmxhc3QuYWNjdW0NCmVsby5sYXN0LmNvbXAubmV3DQpgYGANCg0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUUsIGNvbHMucHJpbnQ9N30NCg0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICAgDQoNCiMjIyAyMDIzIENBTVAgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpsZWFkLlN1YjE2RltvcmRlcihsZWFkLlN1YjE2RiRnLmxlYWQuY2FtcC4yMyksIGMoMSwyLDcpXSAlPiUgcHJpbnQobj02NSkNCmBgYCAgDQoNCiMjIyBFbG8gQ0FNUCAyMDIzIA0KKi1Db21wZXRpdG9ycyA9IGByIGNvbXBldGl0b3JzLmVgLSoNCg0KYGBge3IgZXZhbD1UUlVFLGluY2x1ZGU9RkFMU0V9DQpsYXN0LmNvbXAgPC0gbGVhZC5TdWIxNkZbLGMoMSwyLDcpXSAlPiUgZmlsdGVyKGxlYWQuU3ViMTZGJGcubGVhZC5jYW1wLjIzIT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KYGBge3J9DQojIyBleC1TdWIxNCBjb21pbmcgaW4gIyMjDQpsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0IDwtIGxhc3RfY29tcF9kZWJ1dCAlPiUgcmlnaHRfam9pbihlbG8uMjIuYWNjdW0udG9fc3ViMTYsIGJ5PSJjb21wZXRpdG9yIikNCmxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQgPC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFshaXMubmEobGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssM10pLF0NCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0X2NvbXBfZGVidXQgJT4lIGFudGlfam9pbihsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0LCBieT0iY29tcGV0aXRvciIpDQpgYGAgIA0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0Kbi5kZWJ1dCA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCm4uZGVidXQuZnJvbV9sd3JfY2F0ID0gbnJvdyhsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0KQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsYXN0LmNvbXAgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksMV0NClRlYW0gPC0gbGFzdC5jb21wLmNhbGMkVGVhbS54WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdDQpyZXN1bHRzIDwtICh1bmxpc3QocmVzdWx0cykpDQpzdGRldiA8LSBzZChjKDE6KE4rbi5kZWJ1dCtuLmRlYnV0LmZyb21fbHdyX2NhdCkpKQ0KIw0KUi5sd3JfY2F0IDwtIGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQkUi5uZXcNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKDEwMDAsIG4uZGVidXQpLGMoUi5sd3JfY2F0KSApKQ0KbWVkaWFuYSA8LSBtZWRpYW4odW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIHVubGlzdChsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXSkgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wLm5ldyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8ubGFzdC5jb21wLm5ldyA8LSBhc190aWJibGUoZWxvLmxhc3QuY29tcC5uZXcpDQojIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KTiA8LSBsZW5ndGgodW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KUi5kZWJ1dCA8LSByZXAoMTAwMCwgbikNCm5hbWVzIDwtIGxhc3RfY29tcF9kZWJ1dFssMV0NClRlYW0gPC0gbGFzdF9jb21wX2RlYnV0JFRlYW0NCiNjYXRlZyA8LSBsZWFkLlN1YjE0Ri5hX2INClMgPC0gKChtZWRpYW5hIC0gbGFzdF9jb21wX2RlYnV0WywzXSkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXdbLDFdKS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ld1ssMV0pL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLmxhc3QuY29tcC5uZXcuZGVidXQgPC0gYXNfdGliYmxlKGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dFssM10pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFNbLDFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpDQoNCiMjIGZyb21fbHdyX0NhdCAjIyMjIyMjIyMjIyMjIyMjIw0KbiA9IG5yb3cobGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCkNCk4gPC0gbGVuZ3RoKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNClIuZGVidXQgPC0gUi5sd3JfY2F0DQpuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywxXQ0KVGVhbSA8LSB1bmxpc3QobGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssMl0pDQojY2F0ZWcgPC0gbGVhZC5TdWIxNEYuYV9iDQpTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDNdKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3WywxXSkvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8ubGFzdC5jb21wLm5ldy5kZWJ1dC5sd3JfY2F0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywzXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXdbLDFdLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCg0KIyMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmNvbXAubmV3LmRlYnV0LCBlbG8ubGFzdC5jb21wLm5ldy5kZWJ1dC5sd3JfY2F0KQ0KDQoNCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5jb21wLm5ld1tvcmRlcihlbG8ubGFzdC5jb21wLm5ldyRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgpXSkNCg0KDQpgYGAgIA0KDQojIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3J9DQojIyANCmNvbXBlPSAiMjAyMy5jYW1wIg0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpLA0KICAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2RiIsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQojIHRpbWUtc2VyaWVzIGRhdGEuZnJhbWUNCiMjIHN1YjE2Rg0KZWxvLmhpc3RvcnkudF9zZXJpZXMuUzE2RiA8LSANCiAgYXNfdGliYmxlKGVsby5oaXN0b3J5ICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNkYiKSAlPiUNCiAgICAgICAgICAgICAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yfmNvbXAsIHZhbHVlLnZhciA9ICJSLm5ldyIpKSANCiMjIA0KDQpgYGAgIA0KDQoNCiMjIyBFbG8gaW4gdGltZQ0KYGBge3IgaW5jbHVkZT1UUlVFLCBmaWcud2lkdGg9IDE2fQ0KcCA8LSBlbG8uaGlzdG9yeSAlPiUgDQogIGZpbHRlcihjYXRlZz09IlN1YjE2RiIsIFIubmV3Pj0wKSAlPiUNCiAgZ2dwbG90KGFlcyh4PSBjb21wLCB5PSBSLm5ldywgZ3JvdXAgPSBjb21wZXRpdG9yLCBjb2wgPSBUZWFtKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fbGluZShsaW5ldHlwZT0gImRhc2hlZCIpICsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0xMDAwLGxpbmV0eXBlPSAiZGFzaGVkIikNCg0KI3ANCmdncGxvdGx5KHApDQpgYGANCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIGNhbXBfMjAyMyoqDQpgYGB7ciBldmFsPVRSVUUsIGluY2x1ZGU9VFJVRX0NCmVsby5sYXN0LmFjY3VtDQplbG8ubGFzdC5jb21wLm5ldw0KYGBgDQoNCmBgYHtyIGV2YWw9VFJVRSwgaW5jbHVkZT1UUlVFLCBjb2xzLnByaW50PTd9DQoNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLm5ldyxieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDgpXSkNCmBgYCAgIA0KDQojIyMqICoqQ2FwdHVyYW5kbyBsb3MgZnV0dXJvcyBTdWIxOCoqIA0KYGBge3IgZWNobz1UUlVFLCBpbmNsdWRlPVRSVUV9DQpsZWFkLlN1YjE4Ri4yNCA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKHN0YWdlPT0iQ2xhc2lmaWMiLA0KICAgICAgICAgQ2F0ZWdvcnk9PSJTdWIxOF9GIiwNCiAgICAgICAgIHllYXI9PSIyMDI0Ig0KICAgICMgICAgIE5hbWU9PSBub21icmUNCiAgICAgICAgICkgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBDb21wZV8sDQogICAgICAgICAgIFRlYW0gPSBUZWFtLA0KICAgICAgICAgICBEYXRlPSBEYXRlKSAlPiUNCiAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgVGVhbSB+IENvbXBlLCANCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KbGVhZC5TdWIxOEYuMjQgPC0gYXNfdGliYmxlKGxlYWQuU3ViMThGLjI0KQ0KYGBgDQoNCiMjIyogKl9Mb3MgZnV0dXJvcyBzdWIxOCAic2FsZW4iXyoNCmBgYHtyIGVjaG89VFJVRSwgaW5jbHVkZT1UUlVFLCBjb2xzLnByaW50PTd9DQojIyBlbnZpYW5kbyBsb3Mgc3ViMTYgYSBvdHJvIGFyY2hpdm8NCmVsby4yMy5hY2N1bS50b19zdWIxOCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgc2VtaV9qb2luKGxlYWQuU3ViMThGLjI0LGJ5PSJjb21wZXRpdG9yIikNCg0KIyMgc3ViMTYgc2FsaWVuZG8NCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4obGVhZC5TdWIxOEYuMjQsYnk9ImNvbXBldGl0b3IiKSANCmBgYCAgDQoNCg0KDQojIyMjIEFuY2hvcmluZyAnZWxvLmxhc3QuYWNjdW0nIDIwMjMNCmBgYHtyIGVjaG89VFJVRSwgaW5jbHVkZT1UUlVFfQ0KZWxvLjIzLmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtDQpgYGANCg0KDQojIyMjIE1FUkdJTkcgRlJPTSBTVUIxNC0yMDIzICMjIyMjDQpgYGB7cn0NCiNsZWFkLlN1YjE0RiA8LSByYW5rcyAlPiUNCiMgIGZpbHRlcihzdGFnZT09IkNsYXNpZmljIiwNCiAjICAgICAgICBDYXRlZ29yeT09IlN1YjE0X0YiLA0KICAjICAgICAgIHllYXI9PSIyMDIyInx5ZWFyPT0iMjAyMyINCiAgICAjICAgICBOYW1lPT0gbm9tYnJlDQogICAjICAgICAgKSAlPiUNCiMgIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogIyAgICAgICAgICBZZWFyPSB5ZWFyLA0KICAjICAgICAgICAgQ29tcGU9IENvbXBlXywNCiAgICMgICAgICAgIFRlYW0gPSBUZWFtLA0KICAgICMgICAgICAgRGF0ZT0gRGF0ZSkgJT4lDQojICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICMgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgVGVhbSB+IENvbXBlLCANCiAjICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQoNCiNsZWFkLlN1YjE0RiA8LSBhc190aWJibGUobGVhZC5TdWIxNEYpDQojIw0KbGVhZC5TdWIxNEYuZCA8LSBsZWFkLlN1YjE0RlssYygxLDIsNCldICU+JSBmaWx0ZXIobGVhZC5TdWIxNEYkZC5sZWFkLmZpcnN0LjIzIT0iTkEiKSANCiMNCmxlYWQuU3ViMTRGLmQuZGVidXQgPC0gbGVhZC5TdWIxNEYuZCAlPiUgYW50aV9qb2luKGVsby5jLmxlYWQuY2FtcC4yMi5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGVhZC5TdWIxNEYuZC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpkIDwtIGxlYWQuU3ViMTRGLmQgJT4lIHJpZ2h0X2pvaW4oZWxvLmMubGVhZC5jYW1wLjIyLmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGQkY29tcGV0aXRvclshaXMubmEoZCRkLmxlYWQuZmlyc3QuMjMpXSkNClIgPC0gZCRSLm5ld1shaXMubmEoZCRkLmxlYWQuZmlyc3QuMjMpXQ0KbmFtZXMgPC0gZFshaXMubmEoZCRkLmxlYWQuZmlyc3QuMjMpLDFdDQpUZWFtIDwtIGQkVGVhbS54WyFpcy5uYShkJGQubGVhZC5maXJzdC4yMyldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGVhZC5TdWIxNEYuZCRkLmxlYWQuZmlyc3QuMjMNCnN0ZGV2IDwtIHNkKHJlc3VsdHMpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0ICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4obGVhZC5TdWIxNEYkZC5sZWFkLmZpcnN0LjIzWyFpcy5uYShsZWFkLlN1YjE0RiRkLmxlYWQuZmlyc3QuMjMpXSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBkJGQubGVhZC5maXJzdC4yM1shaXMubmEoZCRkLmxlYWQuZmlyc3QuMjMpXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCg0KZWxvLmQubGVhZC5maXJzdC4yMyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGQkZC5sZWFkLmZpcnN0LjIzWyFpcy5uYShkJGQubGVhZC5maXJzdC4yMyldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmQubGVhZC5maXJzdC4yMyA8LSBhc190aWJibGUoZWxvLmQubGVhZC5maXJzdC4yMykNCg0KIyMjIyMjIyMjIyMNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGVhZC5TdWIxNEYuZC5kZWJ1dCRkLmxlYWQuZmlyc3QuMjMpDQpOIDwtIGxlbmd0aChsZWFkLlN1YjE0RiRkLmxlYWQuZmlyc3QuMjNbIWlzLm5hKGxlYWQuU3ViMTRGJGQubGVhZC5maXJzdC4yMyldKQ0KUi5kZWJ1dCA8LSByZXAoMTAwMCwgbikNCm5hbWVzIDwtIGxlYWQuU3ViMTRGLmQuZGVidXRbLDFdDQpUZWFtIDwtIGxlYWQuU3ViMTRGLmQuZGVidXQkVGVhbQ0KI2NhdGVnIDwtIGxlYWQuU3ViMTRGLmFfYg0KUyA8LSAoKG1lZGlhbmEtIGxlYWQuU3ViMTRGLmQuZGVidXQkZC5sZWFkLmZpcnN0LjIzKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5kLmxlYWQuZmlyc3QuMjMkUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8uZC5sZWFkLmZpcnN0LjIzJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5kLmxlYWQuZmlyc3QuMjMuZGVidXQgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsZWFkLlN1YjE0Ri5kLmRlYnV0JGQubGVhZC5maXJzdC4yMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmQubGVhZC5maXJzdC4yMy5kZWJ1dCA8LSBhc190aWJibGUoZWxvLmQubGVhZC5maXJzdC4yMy5kZWJ1dCkNCg0KZWxvLmQubGVhZC5maXJzdC4yMyA8LSBlbG8uZC5sZWFkLmZpcnN0LjIzICU+JSByYmluZChlbG8uZC5sZWFkLmZpcnN0LjIzLmRlYnV0KQ0KDQoNCg0KDQoNCg0KIyAjIENvcnRlIFN1YjE0LVN1YjE2IF8yMDI0ICMjIyMgIA0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIEZpcnN0XzIwMjMqKg0KIyMNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5jLmxlYWQuY2FtcC4yMi5hY2N1bQ0KZWxvLmxhc3QuY29tcCA8LSBlbG8uZC5sZWFkLmZpcnN0LjIzDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLGJ5PSJjb21wZXRpdG9yIikNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojIyMgMjAyMyBTZWNvbmQgIA0KbGVhZC5TdWIxNEZbb3JkZXIobGVhZC5TdWIxNEYkZS5sZWFkLnNlYy4yMyksIGMoMSwyLDUpXSAlPiUgcHJpbnQobj02NSkNCiMjIyBFbG8gU2Vjb25kIDIwMjMgDQpsYXN0LmNvbXAgPC0gbGVhZC5TdWIxNEZbLGMoMSwyLDUpXSAlPiUgZmlsdGVyKGxlYWQuU3ViMTRGJGUubGVhZC5zZWMuMjMhPSJOQSIpIA0KIw0KbGFzdF9jb21wX2RlYnV0IDwtIGxhc3QuY29tcCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsYXN0LmNvbXAgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksMV0NClRlYW0gPC0gbGFzdC5jb21wLmNhbGMkVGVhbS54WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdDQpyZXN1bHRzIDwtICh1bmxpc3QocmVzdWx0cykpDQpzdGRldiA8LSBzZChjKDE6KE4rbi5kZWJ1dCkpKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSB1bmxpc3QobGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10pICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KKQ0KZWxvLmxhc3QuY29tcC5uZXcgPC0gYXNfdGliYmxlKGVsby5sYXN0LmNvbXAubmV3KQ0KIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCk4gPC0gbGVuZ3RoKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXRbLDFdDQpUZWFtIDwtIGxhc3RfY29tcF9kZWJ1dCRUZWFtDQojDQpTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCikpDQojDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuY29tcC5uZXcuZGVidXQpDQoNCiMjIyBfIEVsbyBIaXN0b3J5IF8NCmVsby5sYXN0LmFjY3VtDQplbG8ubGFzdC5jb21wLm5ldw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCiMNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0KI2tuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQojDQpsZWFkLlN1YjE0RltvcmRlcihsZWFkLlN1YjE0RiRmLmxlYWQudGhyZC4yMyksYygxLDIsNildICU+JSBmaWx0ZXIoZi5sZWFkLnRocmQuMjMhPSJOQSIgKQ0KIyMjIEVsbyBUaGlyZCAyMDIzIA0KbGFzdC5jb21wIDwtIGxlYWQuU3ViMTRGWyxjKDEsMiw2KV0gJT4lIGZpbHRlcihsZWFkLlN1YjE0RiRmLmxlYWQudGhyZC4yMyE9Ik5BIikgDQojDQpsYXN0X2NvbXBfZGVidXQgPC0gbGFzdC5jb21wICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKGMoMTooTituLmRlYnV0KSkpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0ICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4odW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIHVubGlzdChsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXSkgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wLm5ldyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQopDQplbG8ubGFzdC5jb21wLm5ldyA8LSBhc190aWJibGUoZWxvLmxhc3QuY29tcC5uZXcpDQojIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCk4gPC0gbGVuZ3RoKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXRbLDFdDQpUZWFtIDwtIGxhc3RfY29tcF9kZWJ1dCRUZWFtDQojDQpTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCikpDQojDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuY29tcC5uZXcuZGVidXQpDQojIyMjIyAjIyMjIyMjIyMjDQoja25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXAubmV3W29yZGVyKGVsby5sYXN0LmNvbXAubmV3JHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCldKQ0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIFRoaXJkXzIwMjMqKg0KI2Vsby5sYXN0LmFjY3VtDQojZWxvLmxhc3QuY29tcC5uZXcNCiMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLm5ldyxieT0iY29tcGV0aXRvciIpDQojDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCiNrbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KIyMjIDIwMjMgQ2hhbXANCmxlYWQuU3ViMTRGW29yZGVyKGxlYWQuU3ViMTRGJGcubGVhZC5jYW1wLjIzKSxjKDEsMiw3KV0gJT4lIGZpbHRlcihnLmxlYWQuY2FtcC4yMyE9Ik5BIiApDQojIyMgRWxvIENhbXAgMjAyMyANCmxhc3QuY29tcCA8LSBsZWFkLlN1YjE0RlssYygxLDIsNyldICU+JSBmaWx0ZXIobGVhZC5TdWIxNEYkZy5sZWFkLmNhbXAuMjMhPSJOQSIpIA0KIw0KbGFzdF9jb21wX2RlYnV0IDwtIGxhc3QuY29tcCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsYXN0LmNvbXAgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksMV0NClRlYW0gPC0gbGFzdC5jb21wLmNhbGMkVGVhbS54WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdDQpyZXN1bHRzIDwtICh1bmxpc3QocmVzdWx0cykpDQpzdGRldiA8LSBzZChjKDE6KE4rbi5kZWJ1dCkpKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSB1bmxpc3QobGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10pICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KKQ0KZWxvLmxhc3QuY29tcC5uZXcgPC0gYXNfdGliYmxlKGVsby5sYXN0LmNvbXAubmV3KQ0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KTiA8LSBsZW5ndGgodW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KUi5kZWJ1dCA8LSByZXAoMTAwMCwgbikNCm5hbWVzIDwtIGxhc3RfY29tcF9kZWJ1dFssMV0NClRlYW0gPC0gbGFzdF9jb21wX2RlYnV0JFRlYW0NCiMNClMgPC0gKChtZWRpYW5hIC0gbGFzdF9jb21wX2RlYnV0WywzXSkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXdbLDFdKS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ld1ssMV0pL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLmxhc3QuY29tcC5uZXcuZGVidXQgPC0gYXNfdGliYmxlKGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dFssM10pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXdbLDFdLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KKSkNCiMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCkNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBDaGFtcF8yMDIzKioNCiNlbG8ubGFzdC5hY2N1bQ0KI2Vsby5sYXN0LmNvbXAubmV3DQojDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcC5uZXcsYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCiMjIyogKipDYXB0dXJhbmRvIGxvcyBmdXR1cm9zIFN1YjE2KiogDQpsZWFkLlN1YjE2Ri4yNCA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKHN0YWdlPT0iQ2xhc2lmaWMiLA0KICAgICAgICAgQ2F0ZWdvcnk9PSJTdWIxNl9GIiwNCiAgICAgICAgIHllYXI9PSIyMDI0Ig0KICAgICAgICAgIyAgICAgTmFtZT09IG5vbWJyZQ0KICApICU+JQ0KICBncm91cF9ieShjb21wZXRpdG9yPSBOYW1lLA0KICAgICAgICAgICBZZWFyPSB5ZWFyLA0KICAgICAgICAgICBDb21wZT0gQ29tcGVfLA0KICAgICAgICAgICBUZWFtID0gVGVhbSwNCiAgICAgICAgICAgRGF0ZT0gRGF0ZSkgJT4lDQogIHJlZnJhbWUocmFuaz0gUmFuaykgJT4lDQogIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvciArIFRlYW0gfiBDb21wZSwgDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQojDQpsZWFkLlN1YjE2Ri4yNCA8LSBhc190aWJibGUobGVhZC5TdWIxNkYuMjQpDQojIyMqICpfTG9zIHN1YjE2ICJzYWxlbiJfKg0KIyMgZW52aWFuZG8gbG9zIHN1YjE2IGEgb3RybyBhcmNoaXZvDQplbG8uMjMuYWNjdW0udG9fc3ViMTYgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIHNlbWlfam9pbihsZWFkLlN1YjE2Ri4yNCxieT0iY29tcGV0aXRvciIpDQojIyBzdWIxNiBzYWxpZW5kbw0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4obGVhZC5TdWIxNkYuMjQsYnk9ImNvbXBldGl0b3IiKQ0KYGBgICANCg0KDQojIyMgMjAyNCBGSVJTVA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpsZWFkLlN1YjE2RltvcmRlcihsZWFkLlN1YjE2RiRoLmxlYWQuZmlyc3QuMjQpLCBjKDEsMiw4KV0gJT4lIHByaW50KG49NjUpDQpgYGAgIA0KIyMjIEVsbyBGaXJzdCAyMDI0IA0KKi1Db21wZXRpdG9ycyA9IGByIGNvbXBldGl0b3JzLmhgLSoNCmBgYHtyIGV2YWw9VFJVRSxpbmNsdWRlPUZBTFNFfQ0KbGFzdC5jb21wIDwtIGxlYWQuU3ViMTZGWyxjKDEsMiw4KV0gJT4lIGZpbHRlcihsZWFkLlN1YjE2RiRoLmxlYWQuZmlyc3QuMjQhPSJOQSIpIA0KIw0KbGFzdF9jb21wX2RlYnV0IDwtIGxhc3QuY29tcCAlPiUgYW50aV9qb2luKGVsby4yMy5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgICANCg0KDQpgYGB7cn0NCiMjIGV4LVN1YjE0IGNvbWluZyBpbiAjIyMNCmxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQgPC0gbGFzdF9jb21wX2RlYnV0ICU+JSByaWdodF9qb2luKGVsby4yMy5hY2N1bS50b19zdWIxNiwgYnk9ImNvbXBldGl0b3IiKQ0KbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCA8LSBsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WyFpcy5uYShsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywzXSksXQ0KIw0KbGFzdF9jb21wX2RlYnV0IDwtIGxhc3RfY29tcF9kZWJ1dCAlPiUgYW50aV9qb2luKGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQsIGJ5PSJjb21wZXRpdG9yIikNCmBgYCAgIA0KDQoNCiMjIyMgcmUtaW5zdGF0aW5nICdlbG8ubGFzdC5hY2N1bScgDQpgYGB7ciBlY2hvPVRSVUUsIGluY2x1ZGU9VFJVRX0NCmVsby5sYXN0LmFjY3VtIDwtIGVsby4yMy5hY2N1bSANCmBgYA0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpuLmRlYnV0LmZyb21fbHdyX2NhdCA9IG5yb3cobGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCkNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gbGFzdC5jb21wICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDFdDQpUZWFtIDwtIGxhc3QuY29tcC5jYWxjJFRlYW0ueFshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXQ0KcmVzdWx0cyA8LSAodW5saXN0KHJlc3VsdHMpKQ0Kc3RkZXYgPC0gc2QoYygxOihOK24uZGVidXQrbi5kZWJ1dC5mcm9tX2x3cl9jYXQpKSkNCiMNClIubHdyX2NhdCA8LSBsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0JFIubmV3DQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0KSxjKFIubHdyX2NhdCkgKSkNCm1lZGlhbmEgPC0gbWVkaWFuKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSB1bmxpc3QobGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10pICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmxhc3QuY29tcC5uZXcgPC0gYXNfdGliYmxlKGVsby5sYXN0LmNvbXAubmV3KQ0KIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCk4gPC0gbGVuZ3RoKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXRbLDFdDQpUZWFtIDwtIGxhc3RfY29tcF9kZWJ1dCRUZWFtDQojY2F0ZWcgPC0gbGVhZC5TdWIxNEYuYV9iDQpTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KDQojIyBmcm9tX2x3cl9DYXQgIyMjIyMjIyMjIyMjIyMjIyMNCm4gPSBucm93KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIFIubHdyX2NhdA0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssMV0NClRlYW0gPC0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDJdKQ0KI2NhdGVnIDwtIGxlYWQuU3ViMTRGLmFfYg0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywzXSkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXdbLDFdKS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ld1ssMV0pL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLmxhc3QuY29tcC5uZXcuZGVidXQubHdyX2NhdCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssM10pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFNbLDFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpDQoNCiMjIyMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCwgZWxvLmxhc3QuY29tcC5uZXcuZGVidXQubHdyX2NhdCkNCg0KDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcC5uZXdbb3JkZXIoZWxvLmxhc3QuY29tcC5uZXckcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7cn0NCiMjIA0KY29tcGU9ICIyMDI0LjEiDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSksDQogICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZGIiwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCiMgdGltZS1zZXJpZXMgZGF0YS5mcmFtZQ0KIyMgc3ViMTZGDQplbG8uaGlzdG9yeS50X3Nlcmllcy5TMTZGIDwtIA0KICBhc190aWJibGUoZWxvLmhpc3RvcnkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihjYXRlZz09IlN1YjE2RiIpICU+JQ0KICAgICAgICAgICAgICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3J+Y29tcCwgdmFsdWUudmFyID0gIlIubmV3IikpIA0KIyMgDQoNCmBgYCAgDQoNCg0KIyMjIEVsbyBpbiB0aW1lDQpgYGB7ciBpbmNsdWRlPVRSVUUsIGZpZy53aWR0aD0gMTJ9DQpwIDwtIGVsby5oaXN0b3J5ICU+JSANCiAgZmlsdGVyKGNhdGVnPT0iU3ViMTZGIiwgUi5uZXc+PTApICU+JQ0KICBnZ3Bsb3QoYWVzKHg9IGNvbXAsIHk9IFIubmV3LCBncm91cCA9IGNvbXBldGl0b3IsIGNvbCA9IFRlYW0pKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9saW5lKGxpbmV0eXBlPSAiZGFzaGVkIikgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEwMDAsbGluZXR5cGU9ICJkYXNoZWQiKSArDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSAiRWxvIFJhbmtpbmciKSArDQogIHNjYWxlX3hfZGlzY3JldGUobmFtZSA9ICJUaW1lIikNCiNwDQpnZ3Bsb3RseShwKQ0KYGBgICANCg0KDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBGaXJzdF8yMDI0KiogIA0KDQpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQplbG8ubGFzdC5hY2N1bQ0KZWxvLmxhc3QuY29tcC5uZXcNCmBgYA0KDQpgYGB7ciBldmFsPVRSVUUsIGluY2x1ZGU9VFJVRSwgY29scy5wcmludD03fQ0KDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcC5uZXcsYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQpgYGAgIA0KDQoNCiMjIyAyMDI0IFNlY29uZCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmxlYWQuU3ViMTZGW29yZGVyKGxlYWQuU3ViMTZGJGkubGVhZC5zZWMuMjQpLCBjKDEsMiw5KV0gJT4lIHByaW50KG49NjUpDQpgYGAgIA0KDQojIyMgRWxvIFNlY29uZCAyMDIzIA0KKi1Db21wZXRpdG9ycyA9IGByIGNvbXBldGl0b3JzLmVgLSoNCg0KYGBge3IgZXZhbD1UUlVFLGluY2x1ZGU9RkFMU0V9DQpsYXN0LmNvbXAgPC0gbGVhZC5TdWIxNkZbLGMoMSwyLDkpXSAlPiUgZmlsdGVyKGxlYWQuU3ViMTZGJGkubGVhZC5zZWMuMjQhPSJOQSIpIA0KIw0KbGFzdF9jb21wX2RlYnV0IDwtIGxhc3QuY29tcCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGAgIA0KDQpgYGB7cn0NCiMjIGV4LVN1YjE0IGNvbWluZyBpbiAjIyMNCmxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQgPC0gbGFzdF9jb21wX2RlYnV0ICU+JSByaWdodF9qb2luKGVsby4yMy5hY2N1bS50b19zdWIxNiwgYnk9ImNvbXBldGl0b3IiKQ0KbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCA8LSBsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WyFpcy5uYShsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywzXSksXQ0KIw0KbGFzdF9jb21wX2RlYnV0IDwtIGxhc3RfY29tcF9kZWJ1dCAlPiUgYW50aV9qb2luKGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQsIGJ5PSJjb21wZXRpdG9yIikNCmBgYCANCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpuLmRlYnV0LmZyb21fbHdyX2NhdCA9IG5yb3cobGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCkNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gbGFzdC5jb21wICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDFdDQpUZWFtIDwtIGxhc3QuY29tcC5jYWxjJFRlYW0ueFshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXQ0KcmVzdWx0cyA8LSAodW5saXN0KHJlc3VsdHMpKQ0Kc3RkZXYgPC0gc2QoYygxOihOK24uZGVidXQrbi5kZWJ1dC5mcm9tX2x3cl9jYXQpKSkNCiMNClIubHdyX2NhdCA8LSBsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0JFIubmV3DQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0KSxjKFIubHdyX2NhdCkgKSkNCm1lZGlhbmEgPC0gbWVkaWFuKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSB1bmxpc3QobGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10pICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmxhc3QuY29tcC5uZXcgPC0gYXNfdGliYmxlKGVsby5sYXN0LmNvbXAubmV3KQ0KIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCk4gPC0gbGVuZ3RoKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXRbLDFdDQpUZWFtIDwtIGxhc3RfY29tcF9kZWJ1dCRUZWFtDQojY2F0ZWcgPC0gbGVhZC5TdWIxNEYuYV9iDQpTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KDQojIyBmcm9tX2x3cl9DYXQgIyMjIyMjIyMjIyMjIyMjIyMNCm4gPSBucm93KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIFIubHdyX2NhdA0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssMV0NClRlYW0gPC0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDJdKQ0KI2NhdGVnIDwtIGxlYWQuU3ViMTRGLmFfYg0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywzXSkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXdbLDFdKS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ld1ssMV0pL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLmxhc3QuY29tcC5uZXcuZGVidXQubHdyX2NhdCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssM10pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFNbLDFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpDQoNCiMjIyMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCwgZWxvLmxhc3QuY29tcC5uZXcuZGVidXQubHdyX2NhdCkNCg0KDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcC5uZXdbb3JkZXIoZWxvLmxhc3QuY29tcC5uZXckcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7cn0NCiMjIA0KY29tcGU9ICIyMDI0LjIiDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSksDQogICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZGIiwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCiMgdGltZS1zZXJpZXMgZGF0YS5mcmFtZQ0KIyMgc3ViMTZGDQplbG8uaGlzdG9yeS50X3Nlcmllcy5TMTZGIDwtIA0KICBhc190aWJibGUoZWxvLmhpc3RvcnkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihjYXRlZz09IlN1YjE2RiIpICU+JQ0KICAgICAgICAgICAgICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3J+Y29tcCwgdmFsdWUudmFyID0gIlIubmV3IikpIA0KIyMgDQoNCmBgYCAgDQoNCiMjIyBFbG8gaW4gdGltZQ0KYGBge3IgaW5jbHVkZT1UUlVFLCBmaWcud2lkdGg9IDE2fQ0KcCA8LSBlbG8uaGlzdG9yeSAlPiUgDQogIGZpbHRlcihjYXRlZz09IlN1YjE2RiIsIFIubmV3Pj0wKSAlPiUNCiAgZ2dwbG90KGFlcyh4PSBjb21wLCB5PSBSLm5ldywgZ3JvdXAgPSBjb21wZXRpdG9yLCBjb2wgPSBUZWFtKSkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIGdlb21fbGluZShsaW5ldHlwZT0gImRhc2hlZCIpICsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdD0xMDAwLGxpbmV0eXBlPSAiZGFzaGVkIikNCg0KI3ANCmdncGxvdGx5KHApDQpgYGAgIA0KDQoNCiMjIyAqKkVsbyBBY2N1bXVsYXRlZCBTZWNvbmRfMjAyNCoqDQpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQplbG8ubGFzdC5hY2N1bQ0KZWxvLmxhc3QuY29tcC5uZXcNCmBgYA0KDQpgYGB7ciBldmFsPVRSVUUsIGluY2x1ZGU9VFJVRSwgY29scy5wcmludD03fQ0KDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcC5uZXcsYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQpgYGAgIA0KDQojIyMgMjAyNCBUSElSRCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmxlYWQuU3ViMTZGW29yZGVyKGxlYWQuU3ViMTZGJGoubGVhZC50aHJkLjI0KSwgYygxLDIsMTApXSAlPiUgcHJpbnQobj02NSkNCmBgYCAgDQoNCiMjIyBFbG8gVGhpcmQgMjAyMyANCiotQ29tcGV0aXRvcnMgPSBgciBjb21wZXRpdG9ycy5qYC0qDQoNCmBgYHtyIGV2YWw9VFJVRSxpbmNsdWRlPUZBTFNFIH0NCmxhc3QuY29tcCA8LSBsZWFkLlN1YjE2RlssYygxLDIsMTApXSAlPiUgZmlsdGVyKGxlYWQuU3ViMTZGJGoubGVhZC50aHJkLjI0IT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCmBgYHtyfQ0KIyMgZXgtU3ViMTQgY29taW5nIGluICMjIw0KbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCA8LSBsYXN0X2NvbXBfZGVidXQgJT4lIHJpZ2h0X2pvaW4oZWxvLjIzLmFjY3VtLnRvX3N1YjE2LCBieT0iY29tcGV0aXRvciIpDQpsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0IDwtIGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbIWlzLm5hKGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDNdKSxdDQojDQpsYXN0X2NvbXBfZGVidXQgPC0gbGFzdF9jb21wX2RlYnV0ICU+JSBhbnRpX2pvaW4obGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgIA0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQojbi5kZWJ1dC5mcm9tX2x3cl9jYXQgPSBucm93KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKGMoMTooTituLmRlYnV0K24uZGVidXQuZnJvbV9sd3JfY2F0KSkpDQojDQojUi5sd3JfY2F0IDwtIGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXQkUi5uZXcNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKDEwMDAsIG4uZGVidXQpDQogICAgICAgICAgICAgICAgICAgICAgICMsDQogICAgICAgICAgICAgICAgICAgICAgICNjKFIubHdyX2NhdCkgDQogICAgICAgICAgICAgICAgICAgICAgICkpDQptZWRpYW5hIDwtIG1lZGlhbih1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gdW5saXN0KGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdKSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5sYXN0LmNvbXAubmV3IDwtIGFzX3RpYmJsZShlbG8ubGFzdC5jb21wLm5ldykNCiMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0WywxXQ0KVGVhbSA8LSBsYXN0X2NvbXBfZGVidXQkVGVhbQ0KI2NhdGVnIDwtIGxlYWQuU3ViMTRGLmFfYg0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXRbLDNdKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3WywxXSkvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0WywzXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXdbLDFdLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCg0KIyMgZnJvbV9sd3JfQ2F0ICMjIyMjIyMjIyMjIyMjIyMjDQojbiA9IG5yb3cobGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdCkNCiNOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQojUi5kZWJ1dCA8LSBSLmx3cl9jYXQNCiNuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywxXQ0KI1RlYW0gPC0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dC5mcm9tX2x3cl9jYXRbLDJdKQ0KI2NhdGVnIDwtIGxlYWQuU3ViMTRGLmFfYg0KI1MgPC0gKChtZWRpYW5hIC0gbGFzdF9jb21wX2RlYnV0LmZyb21fbHdyX2NhdFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KI0UgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KI1IubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KI21heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KI1Byb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQojbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQojUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiNlbG8ubGFzdC5jb21wLm5ldy5kZWJ1dC5sd3JfY2F0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICMgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAjICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXQuZnJvbV9sd3JfY2F0WywzXSksDQogICAgIyAgICAgICAgICAgICAgICAgICAgICAgUyA9IFNbLDFdLA0KICAgICAjICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAjICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICMgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAjICAgICAgICAgICAgICAgICAgKSkNCg0KIyMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmNvbXAubmV3LmRlYnV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIywgZWxvLmxhc3QuY29tcC5uZXcuZGVidXQubHdyX2NhdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcC5uZXdbb3JkZXIoZWxvLmxhc3QuY29tcC5uZXckcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7cn0NCiMjIA0KY29tcGU9ICIyMDI0LjMiDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSksDQogICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZGIiwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCiMgdGltZS1zZXJpZXMgZGF0YS5mcmFtZQ0KIyMgc3ViMTZGDQplbG8uaGlzdG9yeS50X3Nlcmllcy5TMTZGIDwtIA0KICBhc190aWJibGUoZWxvLmhpc3RvcnkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihjYXRlZz09IlN1YjE2RiIpICU+JQ0KICAgICAgICAgICAgICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3J+Y29tcCwgdmFsdWUudmFyID0gIlIubmV3IikpIA0KIyMgDQoNCmBgYCAgDQoNCiMjIyBFbG8gaW4gdGltZQ0KYGBge3IgaW5jbHVkZT1UUlVFLCAgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPSAxNn0NCiNpZCA9ICIiDQojc2hvcnRuYW1lID0gIiINCiMNCiNjb2xzPSBjKCJGRUVDL0ZFTUVDViIgPSAiZGFya29yYW5nZTMiLA0KICMgICAgICAgImNjdDIxIj0gInllbGxvdzMiLA0KICAjICAgICAgIkZFTUVDViIgPSAicmVkNCIsDQogICAjICAgICAiT3RoZXIgY2xpbW5iZXJzIiA9ICJncmF5Ig0KICAgICMgICAgKQ0KIw0KY2N0ID0gYygiY2N0MjEiID0gImJsYWNrIiwNCiAgICAgICAgIkZFRUMiID0gImRhcmtvcmFuZ2UzIiwNCiAgICAgICAgIkZFTUVDViIgPSAicmVkNCIsDQogICAgICAgICJPdGhlciBjbGltYmVycyI9ICJkYXJrZ3JheSIpDQojIw0KcCA8LSBlbG8uaGlzdG9yeSAlPiUNCiAgbXV0YXRlKGZvY3VzID0gY2FzZV93aGVuKGNvbXBldGl0b3IgPT0gIkFicmlsIEZBUlJVUyBTT1JJQU5PIiB+ICJjY3QyMSIsIGNvbXBldGl0b3IgPT0gIk1hcmlhIEZFUlLDiSBQUklNIiB+ICJjY3QyMSIsIGNvbXBldGl0b3IgPT0gICJKYW5hIEVTVEVWRSBWQUxERVMiIH4gImNjdDIxIiwgY29tcGV0aXRvciA9PSAgIk3Dsm5pY2EgSkFVU0VUIFNBQkFURVIiIH4gImNjdDIxIiwgY29tcGV0aXRvciA9PSAgIlJ1dCBUT1JSQUxMQVJET05BIFZBTEwiIH4gImNjdDIxIiwgY29tcGV0aXRvciA9PSAgIkFzaGEgR1VJVEFSVCBDSFVORyIgfiAiY2N0MjEiLCBjb21wZXRpdG9yID09ICAiSsO6bGlhIEJPUkdFUyBERUwgVklMTEFTQU5URSIgfiAiY2N0MjEiLCBjb21wZXRpdG9yID09ICAiTWFyIFZJQ0VOVEUgSlVBTiBERSBMQSBDUlVaIiB+ICJjY3QyMSIsIGNvbXBldGl0b3IgPT0gIkFpbmEgVklMQSBDQU5URVJPIiB+ICJjY3QyMSIsDQogICAgICAgICAgICAgICAgICAgICAjY29tcGV0aXRvciA9PSAiRXJpYyBHT05aQUxFWiBJTkdMw4lTIiB+ICJjY3QyMSIsDQogICAgICAgICAgICAgICAgICAgICAjY29tcGV0aXRvciA9PSAiQmVsIFRPUlJFTlRTIFBBTE9NQVJFUyIgfiAiY2N0MjEiLA0KICAgICAgICAgICAgICAgICAgICAgVGVhbT09ICJGRUVDIiB+ICJGRUVDIiwgVGVhbT09ICJGRU1FQ1YiIH4gIkZFTUVDViIsIFRSVUUgfiAiT3RoZXIgY2xpbWJlcnMiKSkgJT4lDQogIGZpbHRlcihjYXRlZz09IlN1YjE2RiIsIFIubmV3Pj0wKSAlPiUNCiAgZ2dwbG90KGFlcyh4PSBjb21wLCB5PSBSLm5ldywgZ3JvdXAgPSBjb21wZXRpdG9yLCBjb2wgPSBmb2N1cykpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX2xpbmUobGluZXR5cGU9ICJkYXNoZWQiKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MTAwMCxsaW5ldHlwZT0gImRhc2hlZCIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiQ2xpbWJlciIsDQogICAgICAgICAgICAgICAgICAgICBhZXN0aGV0aWNzID0gImNvbG9yIiwNCiAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGNjdA0KICAgICAgICAgICAgICAgICAgICAgKQ0KDQojcA0KZ2dwbG90bHkocCkNCmBgYCAgDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIFRoaXJkXzIwMjQqKg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KZWxvLmxhc3QuYWNjdW0NCmVsby5sYXN0LmNvbXAubmV3DQpgYGANCg0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPVRSVUUsIGNvbHMucHJpbnQ9N30NCg0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KDQoNCiMjIyAjIyBVcC1jb21pbmcgU0VBU09OICMjIyMjDQoNCiMjIyogKipDYXB0dXJhbmRvIGxvcyBmdXR1cm9zIFN1YjE4KiogDQpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI2xlYWQuU3ViMThGLjI1IDwtIHJhbmtzICU+JQ0KICMgZmlsdGVyKHN0YWdlPT0iQ2xhc2lmaWMiLA0KICAjICAgICAgIENhdGVnb3J5PT0iU3ViMThfRiIsDQogICAjICAgICAgeWVhcj09IjIwMjUiDQojICAgICBOYW1lPT0gbm9tYnJlDQogICAgIyAgICAgKSAlPiUNCiMgIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogIyAgICAgICAgICBZZWFyPSB5ZWFyLA0KICAjICAgICAgICAgQ29tcGU9IENvbXBlXywNCiAgICMgICAgICAgIFRlYW0gPSBUZWFtLA0KICAgICMgICAgICAgRGF0ZT0gRGF0ZSkgJT4lDQojICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICMgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgVGVhbSB+IENvbXBlLCANCiAgIyAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQoNCiNsZWFkLlN1YjE4Ri4yNSA8LSBhc190aWJibGUobGVhZC5TdWIxOEYuMjUpDQpgYGANCg0KDQojIyMqICpfTG9zIHN1YjE2ICJzYWxlbiJfKg0KYGBge3IgZXZhbD0gRkFMU0UsIGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9N30NCiMjIGVudmlhbmRvIGxvcyBzdWIxNiBhIG90cm8gYXJjaGl2bw0KI2Vsby4yNC5hY2N1bS50b19zdWIxOCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgc2VtaV9qb2luKGxlYWQuU3ViMTZGLjI1LGJ5PSJjb21wZXRpdG9yIikNCg0KIyMgc3ViMTYgc2FsaWVuZG8NCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGxlYWQuU3ViMThGLjI1LGJ5PSJjb21wZXRpdG9yIikgDQpgYGAgDQo=