Reading Data

LEAD 2022-2024

2022 Champ

Elo Champ 2022

-Competitors = 23-

######Elo History check code Chunk if running Sub16 alone

Elo in time

Elo Accumulated Champ_2022

elo.last.accum <- elo.last.comp.new
elo.last.comp.new <- elo.last.comp.new
competitor Team R.new Prob.Finals Prob.podium
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

2023 First

Elo First 2023

-Competitors = 32-

#####_ Elo History _

Elo in time

Elo Accumulated First_2023

competitor Team R.new Prob.Finals Prob.podium
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 %

2023 Second

Elo Second 2023

-Competitors = 35-

#####_ Elo History _

Elo in time

Elo Accumulated Second_2023

competitor Team R.new Prob.Finals Prob.podium
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 %

2023 Third

Elo Third 2023

-Competitors = 35-

#####_ Elo History _

Elo in time

Elo Accumulated Third_2023

competitor Team R.new Prob.Finals Prob.podium
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 %

2023 CAMP

Elo CAMP 2023

-Competitors = 35-

#####_ Elo History _

Elo in time

Elo Accumulated camp_2023

competitor Team R.new Prob.Finals Prob.podium
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

MERGING FROM SUB14-2023

2024 FIRST

Elo First 2024

-Competitors = 35-

re-instating ‘elo.last.accum’

elo.last.accum <- elo.23.accum 

#####_ Elo History _

Elo in time

Elo Accumulated First_2024

competitor Team R.new Prob.Finals Prob.podium
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 %

2024 Second

Elo Second 2023

-Competitors = 35-

#####_ Elo History _

Elo in time

Elo Accumulated Second_2024

competitor Team R.new Prob.Finals Prob.podium
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 %

2024 THIRD

Elo Third 2023

-Competitors = 28-

#####_ Elo History _

Elo in time

Elo Accumulated Third_2024

competitor Team R.new Prob.Finals Prob.podium
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=