Reading Data
BLOC 2022-2024
2022 First
Elo First 2022
competitors = 32
#####_ Elo History _
2022 Second
Elo Second 2022
-competitors = 33-
#####_ Elo History _
2022 Third
Elo Third 2022
Competitors = 36
debut list
#####_ Elo History _
Elo Accumulated 2022
* Capturando los futuros Sub16
* Los sub16 “salen”
2023
2023 First
Elo First 2023
-Competitors = 25-
#####_ Elo History _
Elo Accumulated First_2023
2023 Second
#####Elo Second 2023 -Competitors = 34-
#####_ Elo History _
Elo Accumulated Second_2023
2023 Third
Elo Third 2023
-Competitors = 38-
#####_ Elo History _
Elo Accumulated Third_2023
2023 Champ
Elo Camp 2023
-Competitors = 38-
#####_ Elo History _
Elo Accumulated Champ_2023
* Capturando los futuros Sub16
* Los sub16 “salen”
2024
2024 First
Elo First 2024
-Competitors = 32-
#####_ Elo History _
Elo Accumulated First_2024
2024 Second
Elo Second 2024
-Competitors = 33-
#####_ Elo History _
Elo Accumulated Second_2024
2024 Third
Elo Third 2024
-Competitors = 43-
#####_ Elo History _
Elo Accumulated Third_2024
Abril FARRUS SORIANO |
FEEC |
1149.28 |
64.8 % |
63.2 % |
Carlota MERLE GARCIA |
FEMPA |
1131.96 |
65.7 % |
58.6 % |
Vera GARCÍA MARTÍN |
FEXME |
1120.38 |
60.9 % |
59.2 % |
Ines ALLENDE LOPEZ |
EMF-FVM |
1092.73 |
57.9 % |
54.5 % |
Edurne MARTÍNEZ ALMENDROS |
FDMESCyL |
1083.20 |
56.5 % |
53.2 % |
Mònica JAUSET SABATER |
FEEC |
1082.37 |
59 % |
51.6 % |
Martina LÓPEZ CASADO |
FDMCLM |
1074.20 |
57.9 % |
50.4 % |
Paula HERNÁNDEZ CARBALLAR |
FADMES |
1073.19 |
54.3 % |
52.6 % |
Maia MARTINEZ GASOL |
FEEC |
1072.99 |
55.6 % |
51.4 % |
Victoria PEINADO FRANGANILLO |
FMM |
1071.31 |
57.5 % |
50 % |
Rebeca GARCÍA ALONSO |
FMM |
1069.27 |
57.2 % |
49.7 % |
Aina VILA CANTERO |
FEEC |
1066.45 |
54.2 % |
50.8 % |
Lola IBORRA FORNER |
FEMECV |
1062.97 |
54.1 % |
50 % |
Udane MUGICA LASA |
EMF-FVM |
1061.04 |
53.4 % |
50 % |
Elora RAMIRO-IBÁÑEZ CRAIG |
FDMCM |
1059.93 |
53.7 % |
49.6 % |
Martina LONDOÑO LOPEZ |
FDMCM |
1055.40 |
51.7 % |
50 % |
Alicia LOPEZ GARCIA |
FDMCM |
1051.99 |
51.2 % |
49.5 % |
Araceli DE BILBAO ORTEGA |
EMF-FVM |
1047.53 |
50.6 % |
48.9 % |
Leire MONREAL OLLER |
FAM |
1046.19 |
50.4 % |
48.7 % |
África PIÉDROLA SÁNCHEZ |
FADMES |
1045.01 |
51.1 % |
47.7 % |
Ines ROMERO MORALES |
FADMES |
1043.58 |
50 % |
48.3 % |
Loreto PEINADO FRANGANILLO |
FMM |
1039.59 |
50.3 % |
46.9 % |
Candela AMADOR DEL CASTILLO |
FMM |
1039.00 |
50.2 % |
46.8 % |
Noa PERSSON FERNÁNDEZ |
FADMES |
1037.46 |
50 % |
46.6 % |
Swann LAMBLIN BURGUET |
FEEC |
1034.58 |
49.6 % |
46.2 % |
Asha GUITART CHUNG |
FEEC |
1030.90 |
51.7 % |
44.2 % |
Elene OTERMIN LOSADA |
EMF-FVM |
1030.29 |
48.1 % |
46.4 % |
Eva MUNILL ASENSIO |
FEEC |
1029.98 |
51.6 % |
44.1 % |
Jana ESTEVE VALDES |
FEEC |
1029.60 |
48 % |
46.3 % |
Clara SALA PÉREZ |
FEMECV |
1028.51 |
48.7 % |
45.3 % |
Amanda BECERRA ESPINOSA |
FEXME |
1027.70 |
48.6 % |
45.2 % |
Emma HERNÁNDEZ LAGO |
EMF-FVM |
1026.68 |
51.1 % |
43.6 % |
Monica JAUSET SABATER |
FEEC |
1025.31 |
48.7 % |
44.6 % |
Eyne HERRERA LLAVATA |
FEMECV |
1023.29 |
50.6 % |
43.1 % |
Júlia CHAVEZ |
FEXME |
1023.07 |
51.8 % |
46.2 % |
Celia CALVIN DEL FRESNO |
FMM |
1022.43 |
47 % |
45.3 % |
Ivet CLUSA SANZ |
FEEC |
1019.02 |
50 % |
42.5 % |
Maia MARTÍNEZ GASOL |
FEEC |
1018.16 |
46.3 % |
44.7 % |
Anna Sofia BETHENCOURT NEMECKOVA |
FECAMON |
1017.77 |
49.5 % |
47.2 % |
Alba GONZÁLEZ GUTIÉRREZ |
FEXME |
1017.57 |
47.6 % |
43.5 % |
Nora GARCÍA MAESTU |
FEGAMON |
1015.59 |
49.2 % |
46.9 % |
Noa MARCOTE HERNAEZ |
FCDME |
1012.92 |
49.1 % |
41.7 % |
Nora ECHEVARRIA NUÑEZ |
EMF-FVM |
1008.39 |
45.8 % |
42.5 % |
Lucía LÓPEZ SÁNCHEZ |
FEXME |
1007.68 |
45.7 % |
42.4 % |
Júlia BORGES DEL VILLASANTE |
FEEC |
1005.70 |
48.1 % |
40.7 % |
Izana ALVARO BLAZQUEZ |
FAM |
1003.82 |
47.8 % |
40.4 % |
Enara MALO SANTOS |
FNDME |
1001.85 |
44.9 % |
41.6 % |
Lia CLÉMENÇON URIEL |
FEEC |
1001.75 |
45.3 % |
41.3 % |
Maddi MENDIBURU LAS HAYAS |
EMF-FVM |
999.25 |
47.2 % |
39.8 % |
Berta GONZÁLEZ MARTÍNEZ |
FDMCM |
998.80 |
44.5 % |
41.1 % |
Berta SAURA MOR |
FEMECV |
998.48 |
47 % |
39.7 % |
Haizea IBAR FUERTES |
FNDME |
996.21 |
46.7 % |
39.4 % |
Alba SÁNCHEZ GARCÍA |
FMRM |
994.54 |
43.9 % |
40.5 % |
Irune HUALDE URDANGARIN |
FNDME |
993.87 |
46.4 % |
39 % |
Laia HERRERA LLAVATA |
FEMECV |
993.45 |
46.3 % |
39 % |
Naroa AYERDI ARIZ |
FNDME |
993.34 |
43.7 % |
40.4 % |
Mar VICENTE JUAN DE LA CRUZ |
FEEC |
993.08 |
46.3 % |
38.9 % |
Emma GONZALEZ ALAMEDA |
FDMCLM |
992.78 |
46.2 % |
38.9 % |
Laia HERRERO LLAVATA |
FEMECV |
990.43 |
42.4 % |
40.8 % |
Lucía GAVIRO CASCO |
FEXME |
989.05 |
43.1 % |
39.8 % |
Alejandra MORLANS FERRER |
FEMPA |
988.59 |
45.6 % |
38.3 % |
África MARTÍNEZ AZAÑA |
FDMCM |
987.64 |
42 % |
40.4 % |
Alba MELLÉN AUBERT |
FAM |
987.06 |
45.4 % |
38.1 % |
Deva ALONSO HURLÉ |
FEMPA |
987.06 |
45.4 % |
38.1 % |
Irati FERNÁNDEZ MUR |
FAM |
987.06 |
45.4 % |
38.1 % |
Júlia CHAVEZ GARCÍA |
FEXME |
987.06 |
45.4 % |
38.1 % |
Aitana INIESTA LLORENS |
FDMCM |
985.06 |
45.4 % |
40.8 % |
Alba FERNÁNDEZ RUÍZ |
FMM |
983.97 |
41.5 % |
39.9 % |
Alejandra SÁNCHEZ ALCAZAR |
FDMCLM |
983.52 |
55.6 % |
50.9 % |
Sandra BULES DEL CUETO |
FEMPA |
983.52 |
55.6 % |
50.9 % |
Vera RODRÍGUEZ LOZANO |
FEXME |
983.52 |
55.6 % |
50.9 % |
Laia BELTRÁN DE HEREDIA RANGEL |
EMF-FVM |
982.33 |
42.6 % |
38.6 % |
Ana VEIGA RODRIGUEZ |
FEXME |
982.18 |
44.7 % |
37.4 % |
Alba DÍAZ MARTÍNEZ |
FEMECV |
980.60 |
44.2 % |
41.9 % |
Lucía GONZÁLEZ TRAPOTE |
FECAMON |
979.57 |
44.3 % |
37.1 % |
Maissane POULAIN VIELLET |
FAM-AND |
979.39 |
45 % |
43.5 % |
Naiara DE LA IGLESIA ÁLVAREZ |
FEGAMON |
979.26 |
42.2 % |
38.2 % |
Viktória ZILÁKOVÁ |
FEMECV |
979.26 |
42.2 % |
38.2 % |
Rut TORRALLARDONA VALL |
FEEC |
976.38 |
41.8 % |
37.8 % |
Telma FLORES YUSTE |
FDMCLM |
975.31 |
43.7 % |
36.5 % |
Danae VILLEGAS RODRÍGUEZ |
FCDME |
974.51 |
43.6 % |
36.4 % |
Patricia LEAL ABAD |
FMRM |
970.77 |
40.5 % |
37.3 % |
Paula POSE PÉREZ |
FEXME |
970.43 |
43.1 % |
35.9 % |
Jimena SÁNCHEZ SANZ |
FDMESCyL |
970.15 |
43 % |
35.8 % |
Sofia MARTINEZ REVILLA |
FDMESCyL |
969.02 |
44.1 % |
38.6 % |
Luna CORROTO LINARES |
FDMCLM |
967.05 |
42.6 % |
35.4 % |
Aitana MARTÍNEZ PAVÓN |
FMM |
965.14 |
42.3 % |
35.2 % |
Sandra BULNES DEL CUETO |
FEMPA |
965.00 |
42.3 % |
35.2 % |
Ana SECO GABARRI |
FNDME |
964.56 |
39.7 % |
36.5 % |
Luisa ALONSO CORROTO |
FDMCLM |
961.97 |
41.9 % |
34.8 % |
Marina VILA ANDRÉS |
FEMECV |
961.08 |
38.3 % |
36.8 % |
Aiora PEREZ ZUBIETA |
FNDME |
960.65 |
41.7 % |
34.6 % |
Nuria TEIXEIRA ARAÑA |
FECAMON |
960.17 |
38.2 % |
36.6 % |
Laga HERNAIZ FAGGIANA |
EMF-FVM |
960.07 |
41.6 % |
34.5 % |
Irene ÁLVAREZ ASTORGA |
FDMESCyL |
959.96 |
41.6 % |
34.5 % |
Adriana TÚÑEZ SECO |
FEGAMON |
956.30 |
37.7 % |
36.1 % |
Noa CALVO RUIZ |
FDMESCyL |
955.28 |
40.9 % |
33.9 % |
Pau NOGUES PEREZ |
FEMECV |
951.29 |
40.4 % |
33.4 % |
Alba DOMÍNGUEZ PÉREZ |
FDMESCyL |
949.36 |
40.1 % |
33.1 % |
Valentina COLLADO MEDINA |
FECAMON |
949.30 |
40.1 % |
33.1 % |
Elena FERREIRO RODRIGUEZ |
FEGAMON |
946.06 |
37.1 % |
34 % |
Iraia URTIAGA GONZALEZ |
EMF-FVM |
941.38 |
36.9 % |
33.2 % |
Natasha FUXET NAGY |
FAM |
931.64 |
35.7 % |
32 % |
Alba GUTIÉRREZ GÓMEZ |
FEXME |
930.23 |
34.2 % |
32.7 % |
Sofia SUAREZ DIAZ |
FEMPA |
924.34 |
34.3 % |
31.3 % |
Martina CARLASSARE ESCRIBANO |
FEMECV |
920.73 |
33.8 % |
30.8 % |
Vega SÁNCHEZ ESCUDERO |
FDMESCyL |
914.64 |
33 % |
30.1 % |
Valeria RODRIGUEZ REBOLLIDO |
FMM |
909.76 |
31.6 % |
30.2 % |
Consuelo GRAÑA FAJARDO |
FEGAMON |
865.79 |
26.4 % |
25.1 % |
Berta RODRIGUEZ GARCIA |
FDMCLM |
854.67 |
28 % |
22.3 % |
Martina VERT REUS |
FBME |
827.16 |
22.3 % |
21.2 % |
## upcoming SEASON
###* Capturando los futuros Sub16
###* Los sub16 “salen”
LS0tDQp0aXRsZTogIkVsb19TcG9ydC5DbGltYmluZ19FU1BfU3ViMTRGIg0KYXV0aG9yOiAiRmVkZXJpY28gSi4gVmlsbGF0b3JvIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KLS0tDQoNCiMjIyMjIEZ1ZW50ZTogW2h0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvXShodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby8pDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShmbGV4ZGFzaGJvYXJkKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBlY2hvID0gRkFMU0UsDQoJbWVzc2FnZSA9IEZBTFNFLA0KICB3YXJuaW5nID0gRkFMU0UsDQoJaW5jbHVkZSA9IEZBTFNFDQopDQpgYGAgIA0KDQpgYGB7ciBwYWNrYWdlcywgbWVzc2FnZT1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmlmKCFyZXF1aXJlKHRpZHl2ZXJzZSkpe2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIscmVwb3MgPSAiaHR0cDovL2NyYW4udXMuci1wcm9qZWN0Lm9yZyIpfQ0KaWYoIXJlcXVpcmUoZ29vZ2xlc2hlZXRzNCkpe2luc3RhbGwucGFja2FnZXMoImdvb2dsZXNoZWV0czQiKX0NCmlmKCFyZXF1aXJlKGdvb2dsZWRyaXZlKSl7aW5zdGFsbC5wYWNrYWdlcygiZ29vZ2xlZHJpdmUiKX0NCmlmKCFyZXF1aXJlKGRwbHlyKSl7aW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKX0NCmlmKCFyZXF1aXJlKGh0dHIyKSl7aW5zdGFsbC5wYWNrYWdlcygiaHR0cjIiKX0NCmlmKCFyZXF1aXJlKGpzb25saXRlKSl7aW5zdGFsbC5wYWNrYWdlcygianNvbmxpdGUiKX0NCmlmKCFyZXF1aXJlKFJzZWxlbml1bSkpe2luc3RhbGwucGFja2FnZXMoIlJzZWxlbml1bSIpfQ0KaWYoIXJlcXVpcmUoY2hyb21vdGUpKXtpbnN0YWxsLnBhY2thZ2VzKCJjaHJvbW90ZSIpfQ0KaWYoIXJlcXVpcmUocHVycnIpKXtpbnN0YWxsLnBhY2thZ2VzKCJwdXJyciIpfQ0KaWYoIXJlcXVpcmUod2RtYW4pKXtpbnN0YWxsLnBhY2thZ2VzKCJ3ZG1hbiIpfQ0KaWYoIXJlcXVpcmUoRFQpKXtpbnN0YWxsLnBhY2thZ2VzKCJEVCIpfQ0KaWYoIXJlcXVpcmUocGxvdGx5KSl7aW5zdGFsbC5wYWNrYWdlcygicGxvdGx5Iil9DQojIw0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShjaHJvbW90ZSkNCmxpYnJhcnkocHVycnIpDQpsaWJyYXJ5KHdkbWFuKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocnZlc3QpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShqc29ubGl0ZSkNCmxpYnJhcnkoUlNlbGVuaXVtKQ0KDQpsaWJyYXJ5KGdvb2dsZXNoZWV0czQpDQpsaWJyYXJ5KGdvb2dsZWRyaXZlKQ0KDQpgYGAgIA0KDQoNCiMjIyMjIFJlYWRpbmcgRGF0YQ0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KDQpvcHRpb25zKGdhcmdsZV9vYXV0aF9lbWFpbCA9ICJ2aWxsYXRvcm9wYXpmakBkYXRhYW5hbHlzaXNsYWIuY29tIikNCg0Kc3MgPC0gImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFrWFlVSDlfUVdOQmJkSWhWa2dydGhYQWcyU1VDNXA2LXJCNjUxSGx5RzZrL2VkaXQ/dXNwPXNoYXJpbmciDQpob2phID0gMg0KcmFuZ28gPSAiQTE6TTU0MzUiDQpyYW5rcyA8LSByZWFkX3NoZWV0KHNzLA0KICAgICAgICAgICAgICAgIHNoZWV0PWhvamEsDQogICAgICAgICAgICAgICAgcmFuZ2U9IHJhbmdvLCANCiAgICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBUUlVFKQ0KDQpyYW5rcyA8LSAgcmFua3MgJT4lDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLmZhY3RvcikNCg0KYGBgICANCg0KDQojIyBCTE9DIDIwMjItMjAyNA0KIyMjIDIwMjIgRmlyc3QNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIHJvd3MucHJpbnQ9IDh9DQpibG9jLlN1YjE0RiA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKHN0YWdlPT0iQ2xhc2lmaWMiLA0KICAgICAgICAgQ2F0ZWdvcnk9PSJTdWIxNF9GIiwNCiAgICAgICAgIHllYXI9PSIyMDIyInx5ZWFyPT0iMjAyMyINCiAgICAjICAgICBOYW1lPT0gbm9tYnJlDQogICAgICAgICApICU+JQ0KICBncm91cF9ieShjb21wZXRpdG9yPSBOYW1lLA0KICAgICAgICAgICBZZWFyPSB5ZWFyLA0KICAgICAgICAgICBDb21wZT0gQ29tcGVfLA0KICAgICAgICAgICBUZWFtID0gVGVhbSwNCiAgICAgICAgICAgRGF0ZT0gRGF0ZSkgJT4lDQogIHJlZnJhbWUocmFuaz0gUmFuaykgJT4lDQogIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvciArIFRlYW0gfiBDb21wZSwgDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQoNCmJsb2MuU3ViMTRGIDwtIGFzX3RpYmJsZShibG9jLlN1YjE0RikNCiMjDQpibG9jLlN1YjE0RltvcmRlcihibG9jLlN1YjE0RiRhLmJsb2MuZmlyc3QuMjIpLGMoMSwyLDMpXSANCg0KY29tcGV0aXRvcnMuYSA8LSBucm93KGJsb2MuU3ViMTRGWyFpcy5uYShibG9jLlN1YjE0RiRhLmJsb2MuZmlyc3QuMjIpLF0pDQpjb21wZXRpdG9ycy5iIDwtIG5yb3coYmxvYy5TdWIxNEZbIWlzLm5hKGJsb2MuU3ViMTRGJGIuYmxvYy5zZWMuMjIpLF0pDQpjb21wZXRpdG9ycy5jIDwtIG5yb3coYmxvYy5TdWIxNEZbIWlzLm5hKGJsb2MuU3ViMTRGJGMuYmxvYy50aHJkLjIyKSxdKQ0KY29tcGV0aXRvcnMuZCA8LSBucm93KGJsb2MuU3ViMTRGWyFpcy5uYShibG9jLlN1YjE0RiRkLmJsb2MuZmlyc3QuMjMpLF0pDQpjb21wZXRpdG9ycy5lIDwtIG5yb3coYmxvYy5TdWIxNEZbIWlzLm5hKGJsb2MuU3ViMTRGJGUuYmxvYy5zZWMuMjMpLF0pDQpjb21wZXRpdG9ycy5mIDwtIG5yb3coYmxvYy5TdWIxNEZbIWlzLm5hKGJsb2MuU3ViMTRGJGYuYmxvYy50aHJkLjIzKSxdKQ0KY29tcGV0aXRvcnMuZyA8LSBucm93KGJsb2MuU3ViMTRGWyFpcy5uYShibG9jLlN1YjE0RiRnLmJsb2MuY2FtcC4yMyksXSkNCmBgYCAgDQoNCg0KIyMjIEVsbyBGaXJzdCAyMDIyICANCg0KKl9jb21wZXRpdG9ycyA9IGByIGNvbXBldGl0b3JzLmFgXyoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KTiA8LSBsZW5ndGgoYmxvYy5TdWIxNEYkYS5ibG9jLmZpcnN0LjIyWyFpcy5uYShibG9jLlN1YjE0RiRhLmJsb2MuZmlyc3QuMjIpXSkNClIgPC0gcmVwKDEwMDAsIE4pDQpuYW1lcyA8LSBibG9jLlN1YjE0RlshaXMubmEoYmxvYy5TdWIxNEYkYS5ibG9jLmZpcnN0LjIyKSwgMV0NClRlYW0gPC0gYmxvYy5TdWIxNEZbIWlzLm5hKGJsb2MuU3ViMTRGJGEuYmxvYy5maXJzdC4yMiksIDJdDQojY2F0ZWcgPC0gYmxvYy5TdWIxNEZbIWlzLm5hKGJsb2MuU3ViMTRGJGEuYmxvYy5maXJzdC4yMiksIF0NCnJlc3VsdHMgPC0gYmxvYy5TdWIxNEYkYS5ibG9jLmZpcnN0LjIyWyFpcy5uYShibG9jLlN1YjE0RiRhLmJsb2MuZmlyc3QuMjIpXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cykNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKFIpDQptZWRpYW5hIDwtIG1lZGlhbihyZXN1bHRzKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KUyA8LSAoKG1lZGlhbmEtcmVzdWx0cykgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmEuYmxvYy5maXJzdC4yMiA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgcmVzdWx0cyA9IHJlc3VsdHMsDQogICAgICBTID0gUywNCiAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLCAiJSIpLCANCiAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwiJSIgKSApDQoNCmVsby5hLmJsb2MuZmlyc3QuMjIgPC0gYXNfdGliYmxlKGVsby5hLmJsb2MuZmlyc3QuMjIpDQoNCmtuaXRyOjprYWJsZShlbG8uYS5ibG9jLmZpcnN0LjIyW29yZGVyKGVsby5hLmJsb2MuZmlyc3QuMjIkcmVzdWx0cyksIGMoMSwyLDMsNCw2LDcsOCldLCApDQoNCg0KDQpgYGAgIA0KDQojIyMjI18gRWxvIEhpc3RvcnkgXw0KDQpgYGB7cn0NCmVsby5oaXN0b3J5Lmxhc3QgPC0NCmVsby5hLmJsb2MuZmlyc3QuMjIgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcCgiMjAyMi4xIiwgbGVuZ3RoKGVsby5hLmJsb2MuZmlyc3QuMjIkY29tcGV0aXRvcikpLA0KICAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE0RiIsIGxlbmd0aChlbG8uYS5ibG9jLmZpcnN0LjIyJGNvbXBldGl0b3IpKSkNCmVsby5oaXN0b3J5IDwtIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQpgYGANCg0KDQojIyMgMjAyMiBTZWNvbmQgDQpgYGB7ciBpbmNsdWRlPUZBTFNFLCByb3dzLnByaW50PTh9DQpibG9jLlN1YjE0RltvcmRlcihibG9jLlN1YjE0RiRiLmJsb2Muc2VjLjIyKSwgYygxLDIsMyw0KV0NCiMNCmJsb2MuU3ViMTRGLmFfYiA8LSBibG9jLlN1YjE0RlssYygxOjQpXSAlPiUNCiAgZmlsdGVyKCFpcy5uYShibG9jLlN1YjE0RiRiLmJsb2Muc2VjLjIyKSYhaXMubmEoYmxvYy5TdWIxNEYkYS5ibG9jLmZpcnN0LjIyKSkNCg0KYmxvYy5TdWIxNEYuYV9iIDwtIGVsby5hLmJsb2MuZmlyc3QuMjIgJT4lIA0KICByaWdodF9qb2luKGJsb2MuU3ViMTRGLmFfYiwgYnk9ICJjb21wZXRpdG9yIikgJT4lDQogIGFzX3RpYmJsZSgpDQoNCmBgYCAgDQoNCg0KIyMjIEVsbyBTZWNvbmQgMjAyMg0KKi1jb21wZXRpdG9ycyA9IGByIGNvbXBldGl0b3JzLmJgLSoNCg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGJsb2MuU3ViMTRGLmFfYiRiLmJsb2Muc2VjLjIyKQ0KTiA8LSBsZW5ndGgoYmxvYy5TdWIxNEYkYi5ibG9jLnNlYy4yMlshaXMubmEoYmxvYy5TdWIxNEYkYi5ibG9jLnNlYy4yMildKQ0KUiA8LSBibG9jLlN1YjE0Ri5hX2IkUi5uZXcNCm5hbWVzIDwtIGJsb2MuU3ViMTRGLmFfYlshaXMubmEoYmxvYy5TdWIxNEYuYV9iJGIuYmxvYy5zZWMuMjIpLDFdDQpUZWFtIDwtIGJsb2MuU3ViMTRGLmFfYiRUZWFtLngNCiNjYXRlZyA8LSBibG9jLlN1YjE0Ri5hX2INCnJlc3VsdHMgPC0gYmxvYy5TdWIxNEYkYi5ibG9jLnNlYy4yMlshaXMubmEoYmxvYy5TdWIxNEYkYi5ibG9jLnNlYy4yMildDQpzdGRldiA8LSBzZChyZXN1bHRzKQ0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgTi1uICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4oYmxvYy5TdWIxNEYkYi5ibG9jLnNlYy4yMlshaXMubmEoYmxvYy5TdWIxNEYkYi5ibG9jLnNlYy4yMildKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIw0KUyA8LSAoKG1lZGlhbmEgLSBibG9jLlN1YjE0Ri5hX2IkYi5ibG9jLnNlYy4yMiApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCg0KZWxvLmIuYmxvYy5zZWMuMjIgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBibG9jLlN1YjE0Ri5hX2IkYi5ibG9jLnNlYy4yMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmIuYmxvYy5zZWMuMjIgPC0gYXNfdGliYmxlKGVsby5iLmJsb2Muc2VjLjIyKQ0KDQojIyMjIGRlYnV0IGxpc3QNCmJsb2MuU3ViMTRGLmIuZGVidXQgPC0gYmxvYy5TdWIxNEZbIWlzLm5hKGJsb2MuU3ViMTRGJGIuYmxvYy5zZWMuMjIpLGMoMSwyLDQpXSAlPiUgYW50aV9qb2luKGJsb2MuU3ViMTRGLmFfYlssIGMoMSldLCBieT0gImNvbXBldGl0b3IiKSAlPiUgYXNfdGliYmxlKCkNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChibG9jLlN1YjE0Ri5iLmRlYnV0JGIuYmxvYy5zZWMuMjIpDQpOIDwtIGxlbmd0aChibG9jLlN1YjE0RiRiLmJsb2Muc2VjLjIyWyFpcy5uYShibG9jLlN1YjE0RiRiLmJsb2Muc2VjLjIyKV0pDQpSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KbmFtZXMgPC0gYmxvYy5TdWIxNEYuYi5kZWJ1dFssMV0NClRlYW0gPC0gYmxvYy5TdWIxNEYuYi5kZWJ1dCRUZWFtDQojY2F0ZWcgPC0gYmxvYy5TdWIxNEYuYV9iDQpTIDwtICgobWVkaWFuYS0gYmxvYy5TdWIxNEYuYi5kZWJ1dCRiLmJsb2Muc2VjLjIyKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5iLmJsb2Muc2VjLjIyJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmIuYmxvYy5zZWMuMjIkUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLmIuYmxvYy5zZWMuMjIuZGVidXQgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBibG9jLlN1YjE0Ri5iLmRlYnV0JGIuYmxvYy5zZWMuMjIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5iLmJsb2Muc2VjLjIyLmRlYnV0IDwtIGFzX3RpYmJsZShlbG8uYi5ibG9jLnNlYy4yMi5kZWJ1dCkNCg0KZWxvLmIuYmxvYy5zZWMuMjIgPC0gZWxvLmIuYmxvYy5zZWMuMjIgJT4lIHJiaW5kKGVsby5iLmJsb2Muc2VjLjIyLmRlYnV0KQ0KDQoNCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8uYi5ibG9jLnNlYy4yMltvcmRlcihlbG8uYi5ibG9jLnNlYy4yMiRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgpXSkNCg0KYGBgICANCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyfQ0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8uYi5ibG9jLnNlYy4yMiAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKCIyMDIyLjIiLCBsZW5ndGgoZWxvLmIuYmxvYy5zZWMuMjIkY29tcGV0aXRvcikpLA0KICAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE0RiIsIGxlbmd0aChlbG8uYi5ibG9jLnNlYy4yMiRjb21wZXRpdG9yKSkpDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCiMgdGltZS1zZXJpZXMgZGF0YS5mcmFtZQ0KZWxvLmhpc3RvcnkudF9zZXJpZXMgPC0gZWxvLmhpc3RvcnkgJT4lIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvcn5jb21wLCB2YWx1ZS52YXIgPSAiUi5uZXciKQ0KYGBgICANCg0KDQojIyMgMjAyMiBUaGlyZA0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcm93cy5wcmludD04fQ0KYmxvYy5TdWIxNEZbb3JkZXIoYmxvYy5TdWIxNEYkYy5ibG9jLnRocmQuMjIpLCBjKDEsMiwzLDQsNSldDQpgYGANCg0KIyMjIEVsbyBUaGlyZCAyMDIyICANCg0KKkNvbXBldGl0b3JzID0gYHIgY29tcGV0aXRvcnMuY2AqDQoNCmBgYHtyfQ0KYmxvYy5TdWIxNEYuYyA8LSBhc190aWJibGUoYmxvYy5TdWIxNEZbIWlzLm5hKGJsb2MuU3ViMTRGJGMuYmxvYy50aHJkLjIyKSAsIGMoMSwyLDUpXSkNCiMjDQpibG9jLlN1YjE0Ri5jLmRlYnV0IDwtIGJsb2MuU3ViMTRGW2lzLm5hKGJsb2MuU3ViMTRGJGEuYmxvYy5maXJzdC4yMikmaXMubmEoYmxvYy5TdWIxNEYkYi5ibG9jLnNlYy4yMiYhaXMubmEoYmxvYy5TdWIxNEYkYy5ibG9jLnRocmQuMjIpKSAsIGMoMSwyLDUpXQ0KIyMNCmJsb2MuU3ViMTRGLmFfYl9jIDwtIGJsb2MuU3ViMTRGWyFpcy5uYShibG9jLlN1YjE0RiRhLmJsb2MuZmlyc3QuMjIpJiFpcy5uYShibG9jLlN1YjE0RiRiLmJsb2Muc2VjLjIyKSYhaXMubmEoYmxvYy5TdWIxNEYkYy5ibG9jLnRocmQuMjIpLCBjKDEsMiw1KV0NCiMjDQpibG9jLlN1YjE0Ri5hX19jIDwtIGJsb2MuU3ViMTRGWyFpcy5uYShibG9jLlN1YjE0RiRhLmJsb2MuZmlyc3QuMjIpJmlzLm5hKGJsb2MuU3ViMTRGJGIuYmxvYy5zZWMuMjIpJiFpcy5uYShibG9jLlN1YjE0RiRjLmJsb2MudGhyZC4yMiksIGMoMSwyLDMsNSldDQojDQpibG9jLlN1YjE0Ri5hX29ubHkgPC0gYmxvYy5TdWIxNEZbIWlzLm5hKGJsb2MuU3ViMTRGJGEuYmxvYy5maXJzdC4yMikmaXMubmEoYmxvYy5TdWIxNEYkYi5ibG9jLnNlYy4yMikmaXMubmEoYmxvYy5TdWIxNEYkYy5ibG9jLnRocmQuMjIpLF0NCiMjIyBFTE9zIyMjDQplbG8uYS5ibG9jLmZpcnN0LjIyLmFfb25seSA8LSBlbG8uYS5ibG9jLmZpcnN0LjIyWyxdICU+JSBhbnRpX2pvaW4oZWxvLmIuYmxvYy5zZWMuMjIsIGJ5PSJjb21wZXRpdG9yIikNCiMjIyBFbG8gQWNjdW11bGF0ZWQgc2Vjb25kIGNvbXANCmVsby5iLmJsb2Muc2VjLjIyLmFjY3VtIDwtIGVsby5iLmJsb2Muc2VjLjIyICU+JSByYmluZChlbG8uYS5ibG9jLmZpcnN0LjIyLmFfb25seSkNCmVsby5iLmJsb2Muc2VjLjIyLmFjY3VtICA8LSANCiAgZWxvLmIuYmxvYy5zZWMuMjIuYWNjdW1bb3JkZXIoZWxvLmIuYmxvYy5zZWMuMjIuYWNjdW0kY29tcGV0aXRvciksXQ0KYGBgDQoNCmRlYnV0IGxpc3QNCmByIGJsb2MuU3ViMTRGLmMuZGVidXRgDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChlbG8uYi5ibG9jLnNlYy4yMi5hY2N1bSRjb21wZXRpdG9yKQ0Kbi5kZWJ1dCA9IGxlbmd0aChibG9jLlN1YjE0Ri5jLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmMgPC0gYmxvYy5TdWIxNEYuYyAlPiUgcmlnaHRfam9pbihlbG8uYi5ibG9jLnNlYy4yMi5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChjJGNvbXBldGl0b3JbIWlzLm5hKGMkYy5ibG9jLnRocmQuMjIpXSkNClIgPC0gYyRSLm5ld1shaXMubmEoYyRjLmJsb2MudGhyZC4yMildDQpuYW1lcyA8LSBjWyFpcy5uYShjJGMuYmxvYy50aHJkLjIyKSwxXQ0KVGVhbSA8LSBjJFRlYW0ueFshaXMubmEoYyRjLmJsb2MudGhyZC4yMildDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gYmxvYy5TdWIxNEYuYyRjLmJsb2MudGhyZC4yMg0Kc3RkZXYgPC0gc2QocmVzdWx0cykNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKDEwMDAsIG4uZGVidXQgKSkpDQptZWRpYW5hIDwtIG1lZGlhbihibG9jLlN1YjE0RiRjLmJsb2MudGhyZC4yMlshaXMubmEoYmxvYy5TdWIxNEYkYy5ibG9jLnRocmQuMjIpXSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBjJGMuYmxvYy50aHJkLjIyWyFpcy5uYShjJGMuYmxvYy50aHJkLjIyKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQoNCmVsby5jLmJsb2MudGhyZC4yMiA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGMkYy5ibG9jLnRocmQuMjJbIWlzLm5hKGMkYy5ibG9jLnRocmQuMjIpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5jLmJsb2MudGhyZC4yMiA8LSBhc190aWJibGUoZWxvLmMuYmxvYy50aHJkLjIyKQ0KDQojIyMjIyMjIyMjIw0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChibG9jLlN1YjE0Ri5jLmRlYnV0JGMuYmxvYy50aHJkLjIyKQ0KTiA8LSBsZW5ndGgoYmxvYy5TdWIxNEYkYy5ibG9jLnRocmQuMjJbIWlzLm5hKGJsb2MuU3ViMTRGJGMuYmxvYy50aHJkLjIyKV0pDQpSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KbmFtZXMgPC0gYmxvYy5TdWIxNEYuYy5kZWJ1dFssMV0NClRlYW0gPC0gYmxvYy5TdWIxNEYuYy5kZWJ1dCRUZWFtDQojY2F0ZWcgPC0gYmxvYy5TdWIxNEYuYV9iDQpTIDwtICgobWVkaWFuYS0gYmxvYy5TdWIxNEYuYy5kZWJ1dCRjLmJsb2MudGhyZC4yMikgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8uYy5ibG9jLnRocmQuMjIkUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8uYy5ibG9jLnRocmQuMjIkUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLmMuYmxvYy50aHJkLjIyLmRlYnV0IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gYmxvYy5TdWIxNEYuYy5kZWJ1dCRjLmJsb2MudGhyZC4yMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmMuYmxvYy50aHJkLjIyLmRlYnV0IDwtIGFzX3RpYmJsZShlbG8uYy5ibG9jLnRocmQuMjIuZGVidXQpDQoNCmVsby5jLmJsb2MudGhyZC4yMiA8LSBlbG8uYy5ibG9jLnRocmQuMjIgJT4lIHJiaW5kKGVsby5jLmJsb2MudGhyZC4yMi5kZWJ1dCkNCg0KDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmMuYmxvYy50aHJkLjIyW29yZGVyKGVsby5jLmJsb2MudGhyZC4yMiRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgpXSkNCg0KYGBgICANCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyfQ0KY29tcGUgPC0gIjIwMjIuMyINCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmMuYmxvYy50aHJkLjIyICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8uYy5ibG9jLnRocmQuMjIkY29tcGV0aXRvcikpLA0KICAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE0RiIsIGxlbmd0aChlbG8uYy5ibG9jLnRocmQuMjIkY29tcGV0aXRvcikpKQ0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQojIHRpbWUtc2VyaWVzIGRhdGEuZnJhbWUNCmVsby5oaXN0b3J5LnRfc2VyaWVzIDwtIGFzX3RpYmJsZShlbG8uaGlzdG9yeSAlPiUgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yfmNvbXAsIHZhbHVlLnZhciA9ICJSLm5ldyIpKQ0KYGBgICANCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIDIwMjIqKg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD03fQ0KZWxvLmIuYmxvYy5zZWMuMjIuYWNjdW0uY19hYnNlbnQgPC0gZWxvLmIuYmxvYy5zZWMuMjIuYWNjdW0gJT4lIGFudGlfam9pbihlbG8uYy5ibG9jLnRocmQuMjIsIGJ5PSJjb21wZXRpdG9yIikNCiMjDQplbG8uYy5ibG9jLnRocmQuMjIuYWNjdW0gPC0gZWxvLmMuYmxvYy50aHJkLjIyICU+JSByYmluZChlbG8uYi5ibG9jLnNlYy4yMi5hY2N1bS5jX2Fic2VudCkNCmVsby5jLmJsb2MudGhyZC4yMi5hY2N1bSA8LSBlbG8uYy5ibG9jLnRocmQuMjIuYWNjdW1bb3JkZXIoZWxvLmMuYmxvYy50aHJkLjIyLmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8uYy5ibG9jLnRocmQuMjIuYWNjdW1bb3JkZXIoZWxvLmMuYmxvYy50aHJkLjIyLmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDgpXSkNCmBgYA0KDQoNCiMjIyMgKiAqKkNhcHR1cmFuZG8gbG9zIGZ1dHVyb3MgU3ViMTYqKiANCmBgYHtyIGVjaG89VFJVRSwgaW5jbHVkZT1GQUxTRX0NCmJsb2MuU3ViMTZNLjIzIDwtIHJhbmtzICU+JQ0KICBmaWx0ZXIoc3RhZ2U9PSJDbGFzaWZpYyIsDQogICAgICAgICBDYXRlZ29yeT09IlN1YjE2X00iLA0KICAgICAgICAgeWVhcj09IjIwMjMiDQogICAgIyAgICAgTmFtZT09IG5vbWJyZQ0KICAgICAgICAgKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IENvbXBlXywNCiAgICAgICAgICAgVGVhbSA9IFRlYW0sDQogICAgICAgICAgIERhdGU9IERhdGUpICU+JQ0KICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBUZWFtIH4gQ29tcGUsIA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpibG9jLlN1YjE2TS4yMyA8LSBhc190aWJibGUoYmxvYy5TdWIxNk0uMjMpDQpgYGANCg0KDQojIyMjICogKl9Mb3Mgc3ViMTYgInNhbGVuIl8qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIGVjaG89VFJVRSwgaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD03fQ0KIyMgZW52aWFuZG8gbG9zIHN1YjE2IGEgb3RybyBhcmNoaXZvDQplbG8uMjIuYWNjdW0udG9fc3ViMTYgPC0gZWxvLmMuYmxvYy50aHJkLjIyLmFjY3VtICU+JSBzZW1pX2pvaW4oYmxvYy5TdWIxNk0uMjMsYnk9ImNvbXBldGl0b3IiKQ0KDQojIyBzdWIxNiBzYWxpZW5kbw0KZWxvLmMuYmxvYy50aHJkLjIyLmFjY3VtIDwtIGVsby5jLmJsb2MudGhyZC4yMi5hY2N1bSAlPiUgYW50aV9qb2luKGJsb2MuU3ViMTZNLjIzLGJ5PSJjb21wZXRpdG9yIikgDQpgYGAgIA0KDQoNCg0KDQojIyMgKioyMDIzKiogDQoNCiMjIyAyMDIzIEZpcnN0DQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpibG9jLlN1YjE0RltvcmRlcihibG9jLlN1YjE0RiRkLmJsb2MuZmlyc3QuMjMpLCBjKDEsMiw2KV0gJT4lIHByaW50KG49NjApDQpgYGAgIA0KDQojIyMgRWxvIEZpcnN0IDIwMjMgDQoqLUNvbXBldGl0b3JzID0gYHIgY29tcGV0aXRvcnMuZGAtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYmxvYy5TdWIxNEYuZCA8LSBibG9jLlN1YjE0RlssYygxLDIsNildICU+JSBmaWx0ZXIoYmxvYy5TdWIxNEYkZC5ibG9jLmZpcnN0LjIzIT0iTkEiKSANCiMNCmJsb2MuU3ViMTRGLmQuZGVidXQgPC0gYmxvYy5TdWIxNEYuZCAlPiUgYW50aV9qb2luKGVsby5jLmJsb2MudGhyZC4yMi5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgoYmxvYy5TdWIxNEYuZC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpkIDwtIGJsb2MuU3ViMTRGLmQgJT4lIHJpZ2h0X2pvaW4oZWxvLmMuYmxvYy50aHJkLjIyLmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGQkY29tcGV0aXRvclshaXMubmEoZCRkLmJsb2MuZmlyc3QuMjMpXSkNClIgPC0gZCRSLm5ld1shaXMubmEoZCRkLmJsb2MuZmlyc3QuMjMpXQ0KbmFtZXMgPC0gZFshaXMubmEoZCRkLmJsb2MuZmlyc3QuMjMpLDFdDQpUZWFtIDwtIGQkVGVhbS54WyFpcy5uYShkJGQuYmxvYy5maXJzdC4yMyldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gYmxvYy5TdWIxNEYuZCRkLmJsb2MuZmlyc3QuMjMNCnN0ZGV2IDwtIHNkKHJlc3VsdHMpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0ICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4oYmxvYy5TdWIxNEYkZC5ibG9jLmZpcnN0LjIzWyFpcy5uYShibG9jLlN1YjE0RiRkLmJsb2MuZmlyc3QuMjMpXSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBkJGQuYmxvYy5maXJzdC4yM1shaXMubmEoZCRkLmJsb2MuZmlyc3QuMjMpXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCg0KZWxvLmQuYmxvYy5maXJzdC4yMyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGQkZC5ibG9jLmZpcnN0LjIzWyFpcy5uYShkJGQuYmxvYy5maXJzdC4yMyldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmQuYmxvYy5maXJzdC4yMyA8LSBhc190aWJibGUoZWxvLmQuYmxvYy5maXJzdC4yMykNCg0KIyMjIyMjIyMjIyMNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgoYmxvYy5TdWIxNEYuZC5kZWJ1dCRkLmJsb2MuZmlyc3QuMjMpDQpOIDwtIGxlbmd0aChibG9jLlN1YjE0RiRkLmJsb2MuZmlyc3QuMjNbIWlzLm5hKGJsb2MuU3ViMTRGJGQuYmxvYy5maXJzdC4yMyldKQ0KUi5kZWJ1dCA8LSByZXAoMTAwMCwgbikNCm5hbWVzIDwtIGJsb2MuU3ViMTRGLmQuZGVidXRbLDFdDQpUZWFtIDwtIGJsb2MuU3ViMTRGLmQuZGVidXQkVGVhbQ0KI2NhdGVnIDwtIGJsb2MuU3ViMTRGLmFfYg0KUyA8LSAoKG1lZGlhbmEtIGJsb2MuU3ViMTRGLmQuZGVidXQkZC5ibG9jLmZpcnN0LjIzKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5kLmJsb2MuZmlyc3QuMjMkUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8uZC5ibG9jLmZpcnN0LjIzJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5kLmJsb2MuZmlyc3QuMjMuZGVidXQgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBibG9jLlN1YjE0Ri5kLmRlYnV0JGQuYmxvYy5maXJzdC4yMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmQuYmxvYy5maXJzdC4yMy5kZWJ1dCA8LSBhc190aWJibGUoZWxvLmQuYmxvYy5maXJzdC4yMy5kZWJ1dCkNCg0KZWxvLmQuYmxvYy5maXJzdC4yMyA8LSBlbG8uZC5ibG9jLmZpcnN0LjIzICU+JSByYmluZChlbG8uZC5ibG9jLmZpcnN0LjIzLmRlYnV0KQ0KDQoNCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8uZC5ibG9jLmZpcnN0LjIzW29yZGVyKGVsby5kLmJsb2MuZmlyc3QuMjMkcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCg0KDQoNCg0KDQojIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3IgZXZhbD1GQUxTRX0NCiMNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIjIwMjMuMSINCiNlbG8uaGlzdG9yeS5sYXN0IDwtIGVsby4yMi5hY2N1bS50b19zdWIxNiAlPiUgDQojICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSksDQogIyAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpKQ0KIw0KI2Vsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KIyMgDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5kLmJsb2MuZmlyc3QuMjMgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5kLmJsb2MuZmlyc3QuMjMkY29tcGV0aXRvcikpLA0KICAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE0RiIsIGxlbmd0aChlbG8uZC5ibG9jLmZpcnN0LjIzJGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCiMgdGltZS1zZXJpZXMgZGF0YS5mcmFtZQ0KIyMgc3ViMTRGDQplbG8uaGlzdG9yeS50X3Nlcmllcy5TMTRNIDwtIA0KICBhc190aWJibGUoZWxvLmhpc3RvcnkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihjYXRlZz09IlN1YjE0RiIpICU+JQ0KICAgICAgICAgICAgICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3J+Y29tcCwgdmFsdWUudmFyID0gIlIubmV3IikpIA0KIyMgDQojIyBzdWIxNk0NCiNlbG8uaGlzdG9yeS50X3Nlcmllcy5TMTZNIDwtIA0KICMgYXNfdGliYmxlKGVsby5oaXN0b3J5ICU+JQ0KICAjICAgICAgICAgICAgZmlsdGVyKGNhdGVnPT0iU3ViMTZNIikgJT4lDQogICAjICAgICAgICAgICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3J+Y29tcCwgdmFsdWUudmFyID0gIlIubmV3IikpIA0KDQpgYGAgIA0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgRmlyc3RfMjAyMyoqDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIw0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmMuYmxvYy50aHJkLjIyLmFjY3VtDQplbG8ubGFzdC5jb21wIDwtIGVsby5kLmJsb2MuZmlyc3QuMjMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wICU+JSByYmluZChlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDgpXSkNCmBgYCAgDQoNCg0KIyMjIDIwMjMgU2Vjb25kICANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJsb2MuU3ViMTRGW29yZGVyKGJsb2MuU3ViMTRGJGUuYmxvYy5zZWMuMjMpLCBjKDEsMiw2LDcpXSAlPiUgcHJpbnQobj02NSkNCmBgYCAgDQoNCiMjIyMjX0VsbyBTZWNvbmQgMjAyM18gDQoqLUNvbXBldGl0b3JzID0gYHIgY29tcGV0aXRvcnMuZWAtKg0KDQpgYGB7ciBldmFsPVRSVUUsaW5jbHVkZT1GQUxTRX0NCmxhc3QuY29tcCA8LSBibG9jLlN1YjE0RlssYygxLDIsNyldICU+JSBmaWx0ZXIoYmxvYy5TdWIxNEYkZS5ibG9jLnNlYy4yMyE9Ik5BIikgDQojDQpsYXN0X2NvbXBfZGVidXQgPC0gbGFzdC5jb21wICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsYXN0LmNvbXAgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksMV0NClRlYW0gPC0gbGFzdC5jb21wLmNhbGMkVGVhbS54WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdDQpyZXN1bHRzIDwtICh1bmxpc3QocmVzdWx0cykpDQpzdGRldiA8LSBzZChyZXN1bHRzKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSB1bmxpc3QobGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10pICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmxhc3QuY29tcC5uZXcgPC0gYXNfdGliYmxlKGVsby5sYXN0LmNvbXAubmV3KQ0KIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KTiA8LSBsZW5ndGgodW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KUi5kZWJ1dCA8LSByZXAoMTAwMCwgbikNCm5hbWVzIDwtIGxhc3RfY29tcF9kZWJ1dFssMV0NClRlYW0gPC0gbGFzdF9jb21wX2RlYnV0JFRlYW0NCiNjYXRlZyA8LSBibG9jLlN1YjE0Ri5hX2INClMgPC0gKChtZWRpYW5hIC0gbGFzdF9jb21wX2RlYnV0WywzXSkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXdbLDFdKS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ld1ssMV0pL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLmxhc3QuY29tcC5uZXcuZGVidXQgPC0gYXNfdGliYmxlKGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dFssM10pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFNbLDFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpDQoNCg0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmNvbXAubmV3LmRlYnV0KQ0KDQoNCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5jb21wLm5ld1tvcmRlcihlbG8ubGFzdC5jb21wLm5ldyRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgpXSkNCg0KYGBgICANCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyfQ0KIyMgDQpjb21wZT0gIjIwMjMuMiINCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSwNCiAgICAgICAgIGNhdGVnID0gcmVwKCJTdWIxNEYiLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KIyB0aW1lLXNlcmllcyBkYXRhLmZyYW1lDQojIyBzdWIxNEYNCmVsby5oaXN0b3J5LnRfc2VyaWVzLlMxNE0gPC0gDQogIGFzX3RpYmJsZShlbG8uaGlzdG9yeSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKGNhdGVnPT0iU3ViMTRGIikgJT4lDQogICAgICAgICAgICAgIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvcn5jb21wLCB2YWx1ZS52YXIgPSAiUi5uZXciKSkgDQojIyANCg0KYGBgICANCg0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgU2Vjb25kXzIwMjMqKg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmVsby5sYXN0LmFjY3VtDQplbG8ubGFzdC5jb21wLm5ldw0KYGBgDQoNCmBgYHtyIGV2YWw9VFJVRSwgaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD03fQ0KDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcC5uZXcsYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQpgYGAgIA0KDQojIyMgMjAyMyBUaGlyZA0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KYmxvYy5TdWIxNEZbb3JkZXIoYmxvYy5TdWIxNEYkZi5ibG9jLnRocmQuMjMpLGMoMSwyLDYsNyw4KV0gJT4lIGZpbHRlcihmLmJsb2MudGhyZC4yMyE9Ik5BIiApDQpgYGANCg0KIyMjIEVsbyBUaGlyZCAyMDIzIA0KKi1Db21wZXRpdG9ycyA9IGByIGNvbXBldGl0b3JzLmZgLSoNCg0KYGBge3IgZXZhbD1UUlVFLGluY2x1ZGU9RkFMU0V9DQpsYXN0LmNvbXAgPC0gYmxvYy5TdWIxNEZbLGMoMSwyLDgpXSAlPiUgZmlsdGVyKGJsb2MuU3ViMTRGJGYuYmxvYy50aHJkLjIzIT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgICANCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKHJlc3VsdHMpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0ICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4odW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIHVubGlzdChsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXSkgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wLm5ldyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8ubGFzdC5jb21wLm5ldyA8LSBhc190aWJibGUoZWxvLmxhc3QuY29tcC5uZXcpDQojIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0WywxXQ0KVGVhbSA8LSBsYXN0X2NvbXBfZGVidXQkVGVhbQ0KI2NhdGVnIDwtIGJsb2MuU3ViMTRGLmFfYg0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXRbLDNdKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3WywxXSkvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0WywzXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXdbLDFdLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCg0KDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuY29tcC5uZXcuZGVidXQpDQoNCg0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXAubmV3W29yZGVyKGVsby5sYXN0LmNvbXAubmV3JHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCldKQ0KDQpgYGAgIA0KDQojIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3J9DQojIyANCmNvbXBlPSAiMjAyMy4zIg0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpLA0KICAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE0RiIsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQojIHRpbWUtc2VyaWVzIGRhdGEuZnJhbWUNCiMjIHN1YjE0Rg0KZWxvLmhpc3RvcnkudF9zZXJpZXMuUzE0TSA8LSANCiAgYXNfdGliYmxlKGVsby5oaXN0b3J5ICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNEYiKSAlPiUNCiAgICAgICAgICAgICAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yfmNvbXAsIHZhbHVlLnZhciA9ICJSLm5ldyIpKSANCiMjIA0KDQpgYGAgIA0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgVGhpcmRfMjAyMyoqDQpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KZWxvLmxhc3QuYWNjdW0NCmVsby5sYXN0LmNvbXAubmV3DQpgYGANCg0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PTd9DQoNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLm5ldyxieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDgpXSkNCmBgYCAgDQoNCiMjIyAyMDIzIENoYW1wDQpgYGB7ciBldmFsPVRSVUUsIGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQpibG9jLlN1YjE0RltvcmRlcihibG9jLlN1YjE0RiRnLmJsb2MuY2FtcC4yMyksYygxLDIsNiw3LDgsOSldICU+JSBmaWx0ZXIoZy5ibG9jLmNhbXAuMjMhPSJOQSIgKQ0KYGBgDQoNCiMjIyBFbG8gQ2FtcCAyMDIzIA0KKi1Db21wZXRpdG9ycyA9IGByIGNvbXBldGl0b3JzLmZgLSoNCg0KYGBge3IgZXZhbD1UUlVFLGluY2x1ZGU9RkFMU0V9DQpsYXN0LmNvbXAgPC0gYmxvYy5TdWIxNEZbLGMoMSwyLDkpXSAlPiUgZmlsdGVyKGJsb2MuU3ViMTRGJGcuYmxvYy5jYW1wLjIzIT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgICANCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKHJlc3VsdHMpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0ICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4odW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIHVubGlzdChsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXSkgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wLm5ldyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8ubGFzdC5jb21wLm5ldyA8LSBhc190aWJibGUoZWxvLmxhc3QuY29tcC5uZXcpDQojIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0WywxXQ0KVGVhbSA8LSBsYXN0X2NvbXBfZGVidXQkVGVhbQ0KI2NhdGVnIDwtIGJsb2MuU3ViMTRGLmFfYg0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXRbLDNdKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3WywxXSkvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0WywzXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXdbLDFdLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCg0KDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuY29tcC5uZXcuZGVidXQpDQoNCg0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXAubmV3W29yZGVyKGVsby5sYXN0LmNvbXAubmV3JHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCldKQ0KDQpgYGAgIA0KDQojIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3J9DQojIyANCmNvbXBlPSAiMjAyMy5jaGFtcCINCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSwNCiAgICAgICAgIGNhdGVnID0gcmVwKCJTdWIxNEYiLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KIyB0aW1lLXNlcmllcyBkYXRhLmZyYW1lDQojIyBzdWIxNEYNCmVsby5oaXN0b3J5LnRfc2VyaWVzLlMxNE0gPC0gDQogIGFzX3RpYmJsZShlbG8uaGlzdG9yeSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKGNhdGVnPT0iU3ViMTRGIikgJT4lDQogICAgICAgICAgICAgIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvcn5jb21wLCB2YWx1ZS52YXIgPSAiUi5uZXciKSkgDQojIyANCg0KYGBgICANCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIENoYW1wXzIwMjMqKg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmVsby5sYXN0LmFjY3VtDQplbG8ubGFzdC5jb21wLm5ldw0KYGBgDQoNCmBgYHtyIGV2YWw9VFJVRSwgaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD03fQ0KDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcC5uZXcsYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNyw4KV0pDQpgYGAgIA0KDQoNCiMjIyMgKiAqKkNhcHR1cmFuZG8gbG9zIGZ1dHVyb3MgU3ViMTYqKiANCmBgYHtyIGVjaG89VFJVRSwgaW5jbHVkZT1GQUxTRX0NCmJsb2MuU3ViMTZNLjI0IDwtIHJhbmtzICU+JQ0KICBmaWx0ZXIoc3RhZ2U9PSJDbGFzaWZpYyIsDQogICAgICAgICBDYXRlZ29yeT09IlN1YjE2X00iLA0KICAgICAgICAgeWVhcj09IjIwMjQiDQogICAgIyAgICAgTmFtZT09IG5vbWJyZQ0KICAgICAgICAgKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IENvbXBlXywNCiAgICAgICAgICAgVGVhbSA9IFRlYW0sDQogICAgICAgICAgIERhdGU9IERhdGUpICU+JQ0KICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBUZWFtIH4gQ29tcGUsIA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpibG9jLlN1YjE2TS4yNCA8LSBhc190aWJibGUoYmxvYy5TdWIxNk0uMjQpDQpgYGANCg0KDQojIyMjICogKl9Mb3Mgc3ViMTYgInNhbGVuIl8qDQpgYGB7ciBlY2hvPVRSVUUsIGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9N30NCiMjIGVudmlhbmRvIGxvcyBzdWIxNiBhIG90cm8gYXJjaGl2bw0KZWxvLjIzLmFjY3VtLnRvX3N1YjE2IDwtIGVsby5sYXN0LmFjY3VtICU+JSBzZW1pX2pvaW4oYmxvYy5TdWIxNk0uMjQsYnk9ImNvbXBldGl0b3IiKQ0KDQojIyBzdWIxNiBzYWxpZW5kbw0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihibG9jLlN1YjE2TS4yNCxieT0iY29tcGV0aXRvciIpIA0KYGBgICANCg0KDQojIyMgKioyMDI0KiogDQoNCiMjIyAyMDI0IEZpcnN0ICANCmBgYHtyIGluY2x1ZGU9RkFMU0UsIHJvd3MucHJpbnQ9IDh9DQpibG9jLlN1YjE0RiA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKHN0YWdlPT0iQ2xhc2lmaWMiLA0KICAgICAgICAgQ2F0ZWdvcnk9PSJTdWIxNF9GIiwNCiAgICAgICAgeWVhcj09IjIwMjMifHllYXI9PSIyMDI0Ig0KICAgICMgICAgIE5hbWU9PSBub21icmUNCiAgICAgICAgICkgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBDb21wZV8sDQogICAgICAgICAgIFRlYW0gPSBUZWFtLA0KICAgICAgICAgICBEYXRlPSBEYXRlKSAlPiUNCiAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgVGVhbSB+IENvbXBlLCANCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KYmxvYy5TdWIxNEYgPC0gYXNfdGliYmxlKGJsb2MuU3ViMTRGKQ0KIyMNCmJsb2MuU3ViMTRGW29yZGVyKGJsb2MuU3ViMTRGJGguYmxvYy5maXJzdC4yNCksYygxLDIsNyldIA0KIw0KY29tcGV0aXRvcnMuaCA8LSBucm93KGJsb2MuU3ViMTRGWyFpcy5uYShibG9jLlN1YjE0RiRoLmJsb2MuZmlyc3QuMjQpLF0pDQpjb21wZXRpdG9ycy5pIDwtIG5yb3coYmxvYy5TdWIxNEZbIWlzLm5hKGJsb2MuU3ViMTRGJGkuYmxvYy5zZWMuMjQpLF0pDQpjb21wZXRpdG9ycy5qIDwtIG5yb3coYmxvYy5TdWIxNEZbIWlzLm5hKGJsb2MuU3ViMTRGJGouYmxvYy50aHJkLjI0KSxdKQ0KYGBgICANCg0KIyMjIEVsbyBGaXJzdCAyMDI0IA0KKi1Db21wZXRpdG9ycyA9IGByIGNvbXBldGl0b3JzLmhgLSoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxhc3QuY29tcCA8LSBibG9jLlN1YjE0RlssYygxLDIsNyldICU+JSBmaWx0ZXIoYmxvYy5TdWIxNEYkaC5ibG9jLmZpcnN0LjI0IT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgICANCg0KDQpgYGB7ciBldmFsPSBUUlVFLCBpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBsYXN0LmNvbXAgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksMV0NClRlYW0gPC0gbGFzdC5jb21wLmNhbGMkVGVhbS54WyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdDQpyZXN1bHRzIDwtICh1bmxpc3QocmVzdWx0cykpDQpzdGRldiA8LSBzZChyZXN1bHRzKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAoMTAwMCwgbi5kZWJ1dCApKSkNCm1lZGlhbmEgPC0gbWVkaWFuKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSB1bmxpc3QobGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10pICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLVIubmV3KS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLmxhc3QuY29tcC5uZXcgPC0gYXNfdGliYmxlKGVsby5sYXN0LmNvbXAubmV3KQ0KIyMjIyMjIyMjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3RfY29tcF9kZWJ1dCRjb21wZXRpdG9yKQ0KTiA8LSBsZW5ndGgodW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KUi5kZWJ1dCA8LSByZXAoMTAwMCwgbikNCm5hbWVzIDwtIGxhc3RfY29tcF9kZWJ1dFssMV0NClRlYW0gPC0gbGFzdF9jb21wX2RlYnV0JFRlYW0NCiNjYXRlZyA8LSBibG9jLlN1YjE0Ri5hX2INClMgPC0gKChtZWRpYW5hIC0gbGFzdF9jb21wX2RlYnV0WywzXSkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXdbLDFdKS9EICkpKQ0KbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChlbG8ubGFzdC5jb21wLm5ldyRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ld1ssMV0pL0QgKSkpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLmxhc3QuY29tcC5uZXcuZGVidXQgPC0gYXNfdGliYmxlKGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gdW5saXN0KGxhc3RfY29tcF9kZWJ1dFssM10pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFNbLDFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3WywxXSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMSksIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkpDQoNCg0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmNvbXAubmV3LmRlYnV0KQ0KDQoNCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5jb21wLm5ld1tvcmRlcihlbG8ubGFzdC5jb21wLm5ldyRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgpXSkNCg0KYGBgICANCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyfQ0KIyMgDQpjb21wZT0gIjIwMjQuMSINCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSwNCiAgICAgICAgIGNhdGVnID0gcmVwKCJTdWIxNEYiLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KIyB0aW1lLXNlcmllcyBkYXRhLmZyYW1lDQojIyBzdWIxNEYNCmVsby5oaXN0b3J5LnRfc2VyaWVzLlMxNE0gPC0gDQogIGFzX3RpYmJsZShlbG8uaGlzdG9yeSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKGNhdGVnPT0iU3ViMTRGIikgJT4lDQogICAgICAgICAgICAgIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvcn5jb21wLCB2YWx1ZS52YXIgPSAiUi5uZXciKSkgDQojIyANCg0KYGBgICANCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIEZpcnN0XzIwMjQqKg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmVsby5sYXN0LmFjY3VtDQplbG8ubGFzdC5jb21wLm5ldw0KYGBgDQoNCmBgYHtyIGV2YWw9VFJVRSwgaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD03fQ0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KIyMjIDIwMjQgU2Vjb25kDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpibG9jLlN1YjE0RltvcmRlcihibG9jLlN1YjE0RiRpLmJsb2Muc2VjLjI0KSwgYygxLDIsNyw4KV0gJT4lIHByaW50KG49MTIwKQ0KYGBgICANCg0KIyMjIEVsbyBTZWNvbmQgMjAyNCANCiotQ29tcGV0aXRvcnMgPSBgciBjb21wZXRpdG9ycy5pYC0qDQoNCmBgYHtyIGV2YWw9VFJVRSxpbmNsdWRlPUZBTFNFfQ0KbGFzdC5jb21wIDwtIGJsb2MuU3ViMTRGWyxjKDEsMiw4KV0gJT4lIGZpbHRlcihibG9jLlN1YjE0RiRpLmJsb2Muc2VjLjI0IT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0Kbi5kZWJ1dCA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gbGFzdC5jb21wICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDFdDQpUZWFtIDwtIGxhc3QuY29tcC5jYWxjJFRlYW0ueFshaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXQ0KcmVzdWx0cyA8LSAodW5saXN0KHJlc3VsdHMpKQ0Kc3RkZXYgPC0gc2QocmVzdWx0cykNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKDEwMDAsIG4uZGVidXQgKSkpDQptZWRpYW5hIDwtIG1lZGlhbih1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gdW5saXN0KGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pLDNdKSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC1SLm5ldykvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUZWFtPSBUZWFtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5sYXN0LmNvbXAubmV3IDwtIGFzX3RpYmJsZShlbG8ubGFzdC5jb21wLm5ldykNCiMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0X2NvbXBfZGVidXQkY29tcGV0aXRvcikNCk4gPC0gbGVuZ3RoKHVubGlzdChsYXN0LmNvbXBbIWlzLm5hKGxhc3QuY29tcFssM10pLDNdKSkNClIuZGVidXQgPC0gcmVwKDEwMDAsIG4pDQpuYW1lcyA8LSBsYXN0X2NvbXBfZGVidXRbLDFdDQpUZWFtIDwtIGxhc3RfY29tcF9kZWJ1dCRUZWFtDQojY2F0ZWcgPC0gYmxvYy5TdWIxNEYuYV9iDQpTIDwtICgobWVkaWFuYSAtIGxhc3RfY29tcF9kZWJ1dFssM10pIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3WywxXSkvRCApKSkNCm1heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoZWxvLmxhc3QuY29tcC5uZXckUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXdbLDFdKS9EICkpKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5sYXN0LmNvbXAubmV3LmRlYnV0IDwtIGFzX3RpYmJsZShjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHVubGlzdChsYXN0X2NvbXBfZGVidXRbLDNdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTWywxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ld1ssMV0sMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwgMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIikgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApKQ0KDQoNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCkNCg0KDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcC5uZXdbb3JkZXIoZWxvLmxhc3QuY29tcC5uZXckcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4KV0pDQoNCmBgYCAgDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7cn0NCiMjIA0KY29tcGU9ICIyMDI0LjIiDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSksDQogICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTRGIiwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCiMgdGltZS1zZXJpZXMgZGF0YS5mcmFtZQ0KIyMgc3ViMTRGDQplbG8uaGlzdG9yeS50X3Nlcmllcy5TMTRNIDwtIA0KICBhc190aWJibGUoZWxvLmhpc3RvcnkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihjYXRlZz09IlN1YjE0RiIpICU+JQ0KICAgICAgICAgICAgICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3J+Y29tcCwgdmFsdWUudmFyID0gIlIubmV3IikpIA0KIyMgDQoNCmBgYCAgDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIFNlY29uZF8yMDI0KioNCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQplbG8ubGFzdC5hY2N1bQ0KZWxvLmxhc3QuY29tcC5uZXcNCmBgYA0KDQpgYGB7ciBldmFsPVRSVUUsIGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9N30NCg0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAubmV3LGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIHJiaW5kKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsOCldKQ0KYGBgICANCg0KDQojIyMgMjAyNCBUaGlyZA0KYGBge3IgZXZhbD1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KYmxvYy5TdWIxNEZbb3JkZXIoYmxvYy5TdWIxNEYkai5ibG9jLnRocmQuMjQpLGMoMSwyLDcsOCw5KV0gJT4lIGZpbHRlcihqLmJsb2MudGhyZC4yNCE9Ik5BIiApDQpgYGANCg0KIyMjIEVsbyBUaGlyZCAyMDI0IA0KKi1Db21wZXRpdG9ycyA9IGByIGNvbXBldGl0b3JzLmpgLSoNCg0KYGBge3IgZXZhbD1UUlVFLGluY2x1ZGU9RkFMU0V9DQpsYXN0LmNvbXAgPC0gYmxvYy5TdWIxNEZbLGMoMSwyLDkpXSAlPiUgZmlsdGVyKGJsb2MuU3ViMTRGJGouYmxvYy50aHJkLjI0IT0iTkEiKSANCiMNCmxhc3RfY29tcF9kZWJ1dCA8LSBsYXN0LmNvbXAgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgICANCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGxhc3QuY29tcCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsY1ssM10pXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwxXQ0KVGVhbSA8LSBsYXN0LmNvbXAuY2FsYyRUZWFtLnhbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjWywzXSksM10NCnJlc3VsdHMgPC0gKHVubGlzdChyZXN1bHRzKSkNCnN0ZGV2IDwtIHNkKHJlc3VsdHMpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcCgxMDAwLCBuLmRlYnV0ICkpKQ0KbWVkaWFuYSA8LSBtZWRpYW4odW5saXN0KGxhc3QuY29tcFshaXMubmEobGFzdC5jb21wWywzXSksM10pKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIHVubGlzdChsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGNbLDNdKSwzXSkgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCm1heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtUi5uZXcpL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wLm5ldyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbT0gVGVhbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8ubGFzdC5jb21wLm5ldyA8LSBhc190aWJibGUoZWxvLmxhc3QuY29tcC5uZXcpDQojIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdF9jb21wX2RlYnV0JGNvbXBldGl0b3IpDQpOIDwtIGxlbmd0aCh1bmxpc3QobGFzdC5jb21wWyFpcy5uYShsYXN0LmNvbXBbLDNdKSwzXSkpDQpSLmRlYnV0IDwtIHJlcCgxMDAwLCBuKQ0KbmFtZXMgPC0gbGFzdF9jb21wX2RlYnV0WywxXQ0KVGVhbSA8LSBsYXN0X2NvbXBfZGVidXQkVGVhbQ0KI2NhdGVnIDwtIGJsb2MuU3ViMTRGLmFfYg0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0X2NvbXBfZGVidXRbLDNdKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQptYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ld1ssMV0pL0QgKSkpDQptYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KGVsby5sYXN0LmNvbXAubmV3JFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3WywxXSkvRCApKSkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8ubGFzdC5jb21wLm5ldy5kZWJ1dCA8LSBhc190aWJibGUoY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlYW09IFRlYW0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSB1bmxpc3QobGFzdF9jb21wX2RlYnV0WywzXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gU1ssMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXdbLDFdLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwxKSwiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkNCg0KDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgcmJpbmQoZWxvLmxhc3QuY29tcC5uZXcuZGVidXQpDQoNCg0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXAubmV3W29yZGVyKGVsby5sYXN0LmNvbXAubmV3JHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCldKQ0KDQpgYGAgIA0KDQojIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3J9DQojIyANCmNvbXBlPSAiMjAyNC4zIg0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wLm5ldyAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLmxhc3QuY29tcC5uZXckY29tcGV0aXRvcikpLA0KICAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE0RiIsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQojIHRpbWUtc2VyaWVzIGRhdGEuZnJhbWUNCiMjIHN1YjE0Rg0KZWxvLmhpc3RvcnkudF9zZXJpZXMuUzE0TSA8LSANCiAgYXNfdGliYmxlKGVsby5oaXN0b3J5ICU+JQ0KICAgICAgICAgICAgICBmaWx0ZXIoY2F0ZWc9PSJTdWIxNEYiKSAlPiUNCiAgICAgICAgICAgICAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yfmNvbXAsIHZhbHVlLnZhciA9ICJSLm5ldyIpKSANCiMjIA0KDQpgYGAgIA0KDQojIyMgRWxvIGluIHRpbWUNCmBgYHtyIGluY2x1ZGU9VFJVRSwgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPSAxNn0NCiNpZCA9ICIiDQojc2hvcnRuYW1lID0gIiINCiMNCiNjb2xzPSBjKCJGRUVDL0ZFTUVDViIgPSAiZGFya29yYW5nZTMiLA0KICMgICAgICAgImNjdDIxIj0gInllbGxvdzMiLA0KICAjICAgICAgIkZFTUVDViIgPSAicmVkNCIsDQogICAjICAgICAiT3RoZXIgY2xpbW5iZXJzIiA9ICJncmF5Ig0KICAgICMgICAgKQ0KIw0KY2N0ID0gYygiY2N0MjEiID0gImJsYWNrIiwNCiAgICAgICAgIkZFRUMiID0gImRhcmtvcmFuZ2UzIiwNCiAgICAgICAgIkZFTUVDViIgPSAicmVkNCIsDQogICAgICAgICJPdGhlciBjbGltYmVycyI9ICJkYXJrZ3JheSIpDQojIw0KcCA8LSBlbG8uaGlzdG9yeSAlPiUNCiAgbXV0YXRlKGZvY3VzID0gY2FzZV93aGVuKGNvbXBldGl0b3IgPT0gIkFicmlsIEZBUlJVUyBTT1JJQU5PIiB+ICJjY3QyMSIsIGNvbXBldGl0b3IgPT0gIk1hcmlhIEZFUlLDiSBQUklNIiB+ICJjY3QyMSIsIGNvbXBldGl0b3IgPT0gICJKYW5hIEVTVEVWRSBWQUxERVMiIH4gImNjdDIxIiwgY29tcGV0aXRvciA9PSAgIk3Dsm5pY2EgSkFVU0VUIFNBQkFURVIiIH4gImNjdDIxIiwgY29tcGV0aXRvciA9PSAgIlJ1dCBUT1JSQUxMQVJET05BIFZBTEwiIH4gImNjdDIxIiwgY29tcGV0aXRvciA9PSAgIkFzaGEgR1VJVEFSVCBDSFVORyIgfiAiY2N0MjEiLCBjb21wZXRpdG9yID09ICAiSsO6bGlhIEJPUkdFUyBERUwgVklMTEFTQU5URSIgfiAiY2N0MjEiLCBjb21wZXRpdG9yID09ICAiTWFyIFZJQ0VOVEUgSlVBTiBERSBMQSBDUlVaIiB+ICJjY3QyMSIsIGNvbXBldGl0b3IgPT0gIkFpbmEgVklMQSBDQU5URVJPIiB+ICJjY3QyMSIsIGNvbXBldGl0b3IgPT0gIkxhaWEgVEFVTEFUUyBNQ0RPTkFMRCIgfiAiY2N0MjEiLCBjb21wZXRpdG9yID09ICJFbGJhIFZFUkfDiVMgU09Mw4kiIH4gImNjdDIxIiwgY29tcGV0aXRvciA9PSAiSm9zZWZhIEdPTlrDgUxFWiBMQVJBIiB+ICJjY3QyMSIsDQogICAgICAgICAgICAgICAgICAgICBUZWFtPT0gIkZFRUMiIH4gIkZFRUMiLCBUZWFtPT0gIkZFTUVDViIgfiAiRkVNRUNWIiwgVFJVRSB+ICJPdGhlciBjbGltYmVycyIpKSAlPiUNCiAgZmlsdGVyKGNhdGVnPT0iU3ViMTRGIiwgDQogICAgICAgICBSLm5ldz49MCkgJT4lDQogIGdncGxvdChhZXMoeD0gY29tcCwgeT0gUi5uZXcsIGdyb3VwID0gY29tcGV0aXRvciwgY29sID0gZm9jdXMpKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgZ2VvbV9saW5lKGxpbmV0eXBlPSAiZGFzaGVkIikgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTEwMDAsbGluZXR5cGU9ICJkYXNoZWQiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkNsaW1iZXIiLA0KICAgICAgICAgICAgICAgICAgICAgYWVzdGhldGljcyA9ICJjb2xvciIsDQogICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjY3QNCiAgICAgICAgICAgICAgICAgICAgICkNCiNwDQpnZ3Bsb3RseShwKQ0KYGBgICANCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIFRoaXJkXzIwMjQqKg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmVsby5sYXN0LmFjY3VtDQplbG8ubGFzdC5jb21wLm5ldw0KYGBgDQoNCmBgYHtyIGV2YWw9VFJVRSwgaW5jbHVkZT1UUlVFLCBjb2xzLnByaW50PTd9DQoNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLm5ldyxieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSByYmluZChlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDgpXSkNCmBgYCAgDQoNCiMjIyAjIyB1cGNvbWluZyBTRUFTT04gIyMjIyMNCg0KIyMjKiAqKkNhcHR1cmFuZG8gbG9zIGZ1dHVyb3MgU3ViMTYqKiANCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpibG9jLlN1YjE2TS4yNSA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKHN0YWdlPT0iQ2xhc2lmaWMiLA0KICAgICAgICAgQ2F0ZWdvcnk9PSJTdWIxNl9NIiwNCiAgICAgICAgIHllYXI9PSIyMDI1Ig0KICAgICMgICAgIE5hbWU9PSBub21icmUNCiAgICAgICAgICkgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBDb21wZV8sDQogICAgICAgICAgIFRlYW0gPSBUZWFtLA0KICAgICAgICAgICBEYXRlPSBEYXRlKSAlPiUNCiAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgVGVhbSB+IENvbXBlLCANCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KYmxvYy5TdWIxNk0uMjUgPC0gYXNfdGliYmxlKGJsb2MuU3ViMTZNLjI1KQ0KYGBgDQoNCg0KIyMjKiAqX0xvcyBzdWIxNiAic2FsZW4iXyoNCmBgYHtyIGV2YWw9IEZBTFNFLCBpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PTd9DQojIyBlbnZpYW5kbyBsb3Mgc3ViMTYgYSBvdHJvIGFyY2hpdm8NCmVsby4yNC5hY2N1bS50b19zdWIxNiA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgc2VtaV9qb2luKGJsb2MuU3ViMTZNLjI1LGJ5PSJjb21wZXRpdG9yIikNCg0KIyMgc3ViMTYgc2FsaWVuZG8NCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oYmxvYy5TdWIxNk0uMjUsYnk9ImNvbXBldGl0b3IiKSANCmBgYCANCg==