Copa España 2024 - 1a Prueba Dificultad

Abs_F

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 1 rows [28].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 1a Prueba Bloque - 1a Prueba Velocidad "
[1] 24

Abs_M

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 4 rows [48, 93, 94, 95].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 1a Prueba Bloque - 1a Prueba Velocidad "
[1] 44

Sub18_M

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 3 rows [45, 88, 89].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 1a Prueba Bloque - 1a Prueba Velocidad "
[1] 36

Sub18_F

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 1 rows [36].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 1a Prueba Bloque - 1a Prueba Velocidad "
[1] 33

Sub16_M

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 1 rows [49].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 1a Prueba Bloque - 1a Prueba Velocidad "
[1] 40

Sub16_F

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 2 rows [51, 101].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 1a Prueba Bloque - 1a Prueba Velocidad "
[1] 43

Sub14_M

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 1 rows [48].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 1a Prueba Bloque - 1a Prueba Velocidad "
[1] 34

Sub14_F

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 1 rows [33].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 1a Prueba Bloque - 1a Prueba Velocidad "
[1] 24

Copa España 2024 - 2a Prueba Bloque

Abs_F

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 1 rows [21].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 2a Prueba Bloque - 2a Prueba Velocidad "
[1] 20

Abs_M

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 4 rows [43, 83, 84, 85].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 2a Prueba Bloque - 2a Prueba Velocidad "
[1] 35

Sub18_M

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 4 rows [34, 65, 66, 67].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 2a Prueba Bloque - 2a Prueba Velocidad "
[1] 30

Sub18_F

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 3 rows [31, 60, 61].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 2a Prueba Bloque - 2a Prueba Velocidad "
[1] 22

Sub16_M

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 3 rows [43, 84, 85].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 2a Prueba Bloque - 2a Prueba Velocidad "
[1] 39

Sub16_F

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 2 rows [48, 95].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 2a Prueba Bloque - 2a Prueba Velocidad "
[1] 31

Sub14_M

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 1 rows [41].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 2a Prueba Bloque - 2a Prueba Velocidad "
[1] 38

Sub14_F

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 3 rows [36, 70, 71].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 2a Prueba Bloque - 2a Prueba Velocidad "
[1] 33

Copa España 2024 - 3a Prueba Bloque

Abs_F

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 3 rows [29, 56, 57].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 3a Prueba Bloque "
[1] 25

Abs_M

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 2 rows [50, 99].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 3a Prueba Bloque "
[1] 39

Sub18_M

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 1 rows [37].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 3a Prueba Bloque "
[1] 35

Sub18_F

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 1 rows [28].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 3a Prueba Bloque "
[1] 25

Sub16_M

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 2 rows [46, 91].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 3a Prueba Bloque "
[1] 42

Sub16_F

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 1 rows [41].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 3a Prueba Bloque "
[1] 34

Sub14_M

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 2 rows [43, 85].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 3a Prueba Bloque "
[1] 31

Sub14_F

Aviso: Expected 6 pieces. Missing pieces filled with `NA` in 2 rows [45, 89].Aviso: There was 1 warning in `mutate()`.
ℹ In argument: `Rank = as.numeric(Rank)`.
Caused by warning:
! NAs introducidos por coerción
[1] " Copa España 2024 - 3a Prueba Bloque "
[1] 30

Consolidado en la Hoja Google

LS0tDQp0aXRsZTogImZlZG1lLmZlZWMucmVzdWx0c19Ob3RlQm9va18yNF9ibG9jMSINCmF1dGhvcjogIkZlZGVyaWNvIEouIFZpbGxhdG9ybyINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0OiB0cnVlDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQotLS0NCg0KIyMjIyMgRnVlbnRlOiBbaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm9dKGh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvLykNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KGZsZXhkYXNoYm9hcmQpDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBGQUxTRSwNCgltZXNzYWdlID0gRkFMU0UsDQogIHdhcm5pbmcgPSBGQUxTRSwNCglpbmNsdWRlID0gRkFMU0UNCikNCmBgYCAgDQoNCmBgYHtyIHBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KaWYoIXJlcXVpcmUodGlkeXZlcnNlKSl7aW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIil9DQppZighcmVxdWlyZShnb29nbGVzaGVldHM0KSl7aW5zdGFsbC5wYWNrYWdlcygiZ29vZ2xlc2hlZXRzNCIpfQ0KaWYoIXJlcXVpcmUoZ29vZ2xlZHJpdmUpKXtpbnN0YWxsLnBhY2thZ2VzKCJnb29nbGVkcml2ZSIpfQ0KaWYoIXJlcXVpcmUoZHBseXIpKXtpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpfQ0KaWYoIXJlcXVpcmUoaHR0cjIpKXtpbnN0YWxsLnBhY2thZ2VzKCJodHRyMiIpfQ0KaWYoIXJlcXVpcmUoanNvbmxpdGUpKXtpbnN0YWxsLnBhY2thZ2VzKCJqc29ubGl0ZSIpfQ0KaWYoIXJlcXVpcmUoUnNlbGVuaXVtKSl7aW5zdGFsbC5wYWNrYWdlcygiUnNlbGVuaXVtIil9DQppZighcmVxdWlyZShjaHJvbW90ZSkpe2luc3RhbGwucGFja2FnZXMoImNocm9tb3RlIil9DQppZighcmVxdWlyZShwdXJycikpe2luc3RhbGwucGFja2FnZXMoInB1cnJyIil9DQppZighcmVxdWlyZSh3ZG1hbikpe2luc3RhbGwucGFja2FnZXMoIndkbWFuIil9DQojIw0KbGlicmFyeShjaHJvbW90ZSkNCmxpYnJhcnkocHVycnIpDQpsaWJyYXJ5KHdkbWFuKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocnZlc3QpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShqc29ubGl0ZSkNCmxpYnJhcnkoUlNlbGVuaXVtKQ0KDQpsaWJyYXJ5KGdvb2dsZXNoZWV0czQpDQpsaWJyYXJ5KGdvb2dsZWRyaXZlKQ0KDQpgYGAgIA0KDQojIyBDb3BhIEVzcGHDsWEgMjAyNCAtIDFhIFBydWViYSBEaWZpY3VsdGFkDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCnVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMjcvZ2VuZXJhbC9ib3VsZGVyIg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQpiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KYiRQYWdlJG5hdmlnYXRlKHVybCkNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCgxKSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQojIyMgDQpgYGAgIA0KDQoNCg0KIyMjIEFic19GDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSANCiMjIw0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJUcyIsICJacyIsIlNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuayksIFRzID0gYXMubnVtZXJpYyhUcyksIFpzID0gYXMubnVtZXJpYyhacykpICANCg0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJBYnNfRiIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6OSldICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpBYnNfRiA8LSBzY3JhcA0KYGBgICANCg0KIyMjIEFic19NDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNDQoNCiMjIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCg0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDIpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkgIA0KYGBgICANCg0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIyMgDQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSAjIA0KIyMjDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgIlRzIiwgIlpzIiwiU2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSwgVHMgPSBhcy5udW1lcmljKFRzKSwgWnMgPSBhcy5udW1lcmljKFpzKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiQWJzX00iLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjkpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KQWJzX00gPC0gc2NyYXANCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KYGBgICANCiMjIyBTdWIxOF9NDQoNCmBgYHtyfQ0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBYnNGIERPbmUNCiMgQWJzTSBET05FDQojIFN1YjE4TQ0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCiMgdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8zMC9nZW5lcmFsL2xlYWQiDQoNCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KIyBiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCgzKSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQpgYGAgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIyMgDQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSAjIA0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJUcyIsICJacyIsIlNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuayksIFRzID0gYXMubnVtZXJpYyhUcyksIFpzID0gYXMubnVtZXJpYyhacykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE4X00iLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjkpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMThNIDwtIHNjcmFwDQpgYGAgIA0KDQojIyMgU3ViMThfRg0KDQpgYGB7cn0NCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIEFic0YgRE9ORQ0KIyBBYnNNIERPTkUNCiMgU3ViMTggTSBET05FDQojIFN1YjE4IEYNCiMgU3ViMTYgTQ0KIyBTdWIxNiBGDQojIFN1YjE0IE0NCiMgU3ViMTQgRg0KDQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNIERPTkUNCiMgU3ViMThNIERPTkUNCiMgU3ViMThGIA0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCiMgdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8zMC9nZW5lcmFsL2xlYWQiDQoNCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KIyBiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCg0KSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQpgYGAgIA0KDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgIlRzIiwgIlpzIiwiU2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSwgVHMgPSBhcy5udW1lcmljKFRzKSwgWnMgPSBhcy5udW1lcmljKFpzKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiU3ViMThfRiIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6OSldICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpTdWIxOEYgPC0gc2NyYXANCmBgYCAgDQojIyMgU3ViMTZfTQ0KDQpgYGB7cn0NCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0gRE9ORQ0KIyBTdWIxOEYgRE9ORQ0KIyBTdWIxNk0NCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiMgYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoNSkiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KYGBgICANCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAiVHMiLCAiWnMiLCJTY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspLCBUcyA9IGFzLm51bWVyaWMoVHMpLCBacyA9IGFzLm51bWVyaWMoWnMpKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJTdWIxNl9NIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo5KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNClN1YjE2TSA8LSBzY3JhcA0KYGBgICANCiMjIyBTdWIxNl9GDQoNCmBgYHtyfQ0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBYnNGIERPbmUNCiMgQWJzTSBET05FDQojIFN1YjE4TSBET05FDQojIFN1YjE4RiBET05FDQojIFN1YjE2TSBET05FDQojIFN1YjE2RiANCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiNiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCg2KSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQpgYGAgIA0KDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgIlRzIiwgIlpzIiwiU2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSwgVHMgPSBhcy5udW1lcmljKFRzKSwgWnMgPSBhcy5udW1lcmljKFpzKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiU3ViMTZfRiIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6OSldICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpTdWIxNkYgPC0gc2NyYXANCmBgYCAgDQoNCiMjIyBTdWIxNF9NDQoNCmBgYHtyfQ0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBYnNGIERPbmUNCiMgQWJzTSBET05FDQojIFN1YjE4TSBET05FDQojIFN1YjE4RiBET05FDQojIFN1YjE2TSBET05FDQojIFN1YjE2RiBET05FDQojIFN1YjE0TSANCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiMgYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoNykiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KYGBgICANCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpIA0KICAgICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAiVHMiLCAiWnMiLCJTY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspLCBUcyA9IGFzLm51bWVyaWMoVHMpLCBacyA9IGFzLm51bWVyaWMoWnMpKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJTdWIxNF9NIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo5KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNClN1YjE0TSA8LSBzY3JhcA0KYGBgICANCg0KDQojIyMgU3ViMTRfRg0KDQoNCmBgYHtyfQ0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBYnNGIERPbmUNCiMgQWJzTSBET05FDQojIFN1YjE4TSBET05FDQojIFN1YjE4RiBET05FDQojIFN1YjE2TSBET05FDQojIFN1YjE2RiBET05FDQojIFN1YjE0TSBET05FDQojIFN1YjE0RiANCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8zMC9nZW5lcmFsL2xlYWQiDQoNCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KIyBiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCg4KSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQpgYGAgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIyMgDQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSAjIA0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJUcyIsICJacyIsIlNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuayksIFRzID0gYXMubnVtZXJpYyhUcyksIFpzID0gYXMubnVtZXJpYyhacykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE0X0YiLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjkpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMTRGIDwtIHNjcmFwDQpgYGAgIA0KDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyBXcml0ZSBnb29nbGUgc2hlZXQgIyMjDQpGaXJzdC5Cb3VsZGVyX0VTUC4yNCA8LSByYmluZChBYnNfRiwgDQogICAgICAgICAgICAgQWJzX00sIA0KICAgICAgICAgICAgIFN1YjE4TSwgDQogICAgICAgICAgICAgU3ViMThGLA0KICAgICAgICAgICAgIFN1YjE2TSwNCiAgICAgICAgICAgICBTdWIxNkYsDQogICAgICAgICAgICAgU3ViMTRNLA0KICAgICAgICAgICAgIFN1YjE0RikNCkZpcnN0LkJvdWxkZXJfRVNQLjI0ICU+JSBwcmludChuPWxlbmd0aChGaXJzdC5Cb3VsZGVyX0VTUC4yNCROYW1lKSkNCg0Kb3B0aW9ucyhnYXJnbGVfb2F1dGhfZW1haWwgPSAidmlsbGF0b3JvcGF6ZmpAZGF0YWFuYWx5c2lzbGFiLmNvbSIpDQpnczRfZGVhdXRoKCkNCmdzNF9hdXRoKCkNCnNoZWV0X3dyaXRlKGRhdGEgPSBGaXJzdC5Cb3VsZGVyX0VTUC4yNCwNCiAgICAgICAgICAgIHNzPSAiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMWtYWVVIOV9RV05CYmRJaFZrZ3J0aFhBZzJTVUM1cDYtckI2NTFIbHlHNmsvZWRpdD91c3A9c2hhcmluZyIsIA0KICAgICAgICAgICAgc2hlZXQ9cGFzdGUoIkZpcnN0LkJvdWxkZXJfRVNQLjI0IiwgIl8iLCBTeXMuRGF0ZSgpKSkNCg0KDQpgYGANCg0KDQojIyBDb3BhIEVzcGHDsWEgMjAyNCAtIDJhIFBydWViYSBCbG9xdWUNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCnVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMjgvZ2VuZXJhbC9ib3VsZGVyIg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQpiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KYiRQYWdlJG5hdmlnYXRlKHVybCkNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCgxKSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQojIyMgDQpgYGAgIA0KDQoNCg0KDQoNCg0KDQojIyMgQWJzX0YNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpIA0KIyMjDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgIlRzIiwgIlpzIiwiU2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSwgVHMgPSBhcy5udW1lcmljKFRzKSwgWnMgPSBhcy5udW1lcmljKFpzKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiQWJzX0YiLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjkpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KQWJzX0YgPC0gc2NyYXANCmBgYCAgDQoNCiMjIyBBYnNfTQ0KYGBge3J9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBYnNGIERPbmUNCiMgQWJzTQ0KDQojIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQoNCiMgdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8zMC9nZW5lcmFsL2xlYWQiDQoNCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KIyBiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCgyKSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpICANCmBgYCAgDQoNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCiMjIw0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJUcyIsICJacyIsIlNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuayksIFRzID0gYXMubnVtZXJpYyhUcyksIFpzID0gYXMubnVtZXJpYyhacykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIkFic19NIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo5KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNCkFic19NIDwtIHNjcmFwDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmBgYCAgDQojIyMgU3ViMThfTQ0KDQpgYGB7cn0NCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0NCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiMgYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoMykiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KYGBgICANCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAiVHMiLCAiWnMiLCJTY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspLCBUcyA9IGFzLm51bWVyaWMoVHMpLCBacyA9IGFzLm51bWVyaWMoWnMpKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJTdWIxOF9NIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo5KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNClN1YjE4TSA8LSBzY3JhcA0KYGBgICANCg0KIyMjIFN1YjE4X0YNCg0KYGBge3J9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBBYnNGIERPTkUNCiMgQWJzTSBET05FDQojIFN1YjE4IE0gRE9ORQ0KIyBTdWIxOCBGDQojIFN1YjE2IE0NCiMgU3ViMTYgRg0KIyBTdWIxNCBNDQojIFN1YjE0IEYNCg0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBYnNGIERPbmUNCiMgQWJzTSBET05FDQojIFN1YjE4TSBET05FDQojIFN1YjE4RiANCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiMgYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoNCkiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KYGBgICANCg0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIyMgDQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSAjIA0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJUcyIsICJacyIsIlNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuayksIFRzID0gYXMubnVtZXJpYyhUcyksIFpzID0gYXMubnVtZXJpYyhacykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE4X0YiLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjkpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMThGIDwtIHNjcmFwDQpgYGAgIA0KIyMjIFN1YjE2X00NCg0KYGBge3J9DQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNIERPTkUNCiMgU3ViMThNIERPTkUNCiMgU3ViMThGIERPTkUNCiMgU3ViMTZNDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDUpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgIlRzIiwgIlpzIiwiU2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSwgVHMgPSBhcy5udW1lcmljKFRzKSwgWnMgPSBhcy5udW1lcmljKFpzKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiU3ViMTZfTSIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6OSldICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpTdWIxNk0gPC0gc2NyYXANCmBgYCAgDQojIyMgU3ViMTZfRg0KDQpgYGB7cn0NCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0gRE9ORQ0KIyBTdWIxOEYgRE9ORQ0KIyBTdWIxNk0gRE9ORQ0KIyBTdWIxNkYgDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoNikiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KYGBgICANCg0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIyMgDQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSAjIA0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJUcyIsICJacyIsIlNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuayksIFRzID0gYXMubnVtZXJpYyhUcyksIFpzID0gYXMubnVtZXJpYyhacykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE2X0YiLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjkpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMTZGIDwtIHNjcmFwDQpgYGAgIA0KDQojIyMgU3ViMTRfTQ0KDQpgYGB7cn0NCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0gRE9ORQ0KIyBTdWIxOEYgRE9ORQ0KIyBTdWIxNk0gRE9ORQ0KIyBTdWIxNkYgRE9ORQ0KIyBTdWIxNE0gDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDcpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSANCiAgICAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgIlRzIiwgIlpzIiwiU2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSwgVHMgPSBhcy5udW1lcmljKFRzKSwgWnMgPSBhcy5udW1lcmljKFpzKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiU3ViMTRfTSIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6OSldICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpTdWIxNE0gPC0gc2NyYXANCmBgYCAgDQoNCg0KIyMjIFN1YjE0X0YNCg0KDQpgYGB7cn0NCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0gRE9ORQ0KIyBTdWIxOEYgRE9ORQ0KIyBTdWIxNk0gRE9ORQ0KIyBTdWIxNkYgRE9ORQ0KIyBTdWIxNE0gRE9ORQ0KIyBTdWIxNEYgDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KI3VybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiMgYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoOCkiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KYGBgICANCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAiVHMiLCAiWnMiLCJTY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspLCBUcyA9IGFzLm51bWVyaWMoVHMpLCBacyA9IGFzLm51bWVyaWMoWnMpKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJTdWIxNF9GIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo5KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNClN1YjE0RiA8LSBzY3JhcA0KYGBgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyBXcml0ZSBnb29nbGUgc2hlZXQgIyMjDQpTZWNvbmQuQm91bGRlcl9FU1AuMjQgPC0gcmJpbmQoQWJzX0YsIA0KICAgICAgICAgICAgIEFic19NLCANCiAgICAgICAgICAgICBTdWIxOE0sIA0KICAgICAgICAgICAgIFN1YjE4RiwNCiAgICAgICAgICAgICBTdWIxNk0sDQogICAgICAgICAgICAgU3ViMTZGLA0KICAgICAgICAgICAgIFN1YjE0TSwNCiAgICAgICAgICAgICBTdWIxNEYpDQpTZWNvbmQuQm91bGRlcl9FU1AuMjQgJT4lIHByaW50KG49bGVuZ3RoKEZpcnN0LkJvdWxkZXJfRVNQLjI0JE5hbWUpKQ0KDQpvcHRpb25zKGdhcmdsZV9vYXV0aF9lbWFpbCA9ICJ2aWxsYXRvcm9wYXpmakBkYXRhYW5hbHlzaXNsYWIuY29tIikNCmdzNF9kZWF1dGgoKQ0KZ3M0X2F1dGgoKQ0Kc2hlZXRfd3JpdGUoZGF0YSA9IFNlY29uZC5Cb3VsZGVyX0VTUC4yNCwNCiAgICAgICAgICAgIHNzPSAiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMWtYWVVIOV9RV05CYmRJaFZrZ3J0aFhBZzJTVUM1cDYtckI2NTFIbHlHNmsvZWRpdD91c3A9c2hhcmluZyIsIA0KICAgICAgICAgICAgc2hlZXQ9cGFzdGUoIlNlY29uZC5Cb3VsZGVyX0VTUC4yNCIsICJfIiwgU3lzLkRhdGUoKSkpDQoNCg0KYGBgDQoNCg0KIyMgQ29wYSBFc3Bhw7FhIDIwMjQgLSAzYSBQcnVlYmEgQmxvcXVlDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBVUkwgb2YgdGhlIHdlYnBhZ2UgdG8gc2NyYXBlDQp1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzI5L2dlbmVyYWwvYm91bGRlciINCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCmIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoMSkiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKQ0KIyMjIA0KYGBgICANCg0KDQoNCg0KDQoNCg0KIyMjIEFic19GDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSANCiMjIw0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJUcyIsICJacyIsIlNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuayksIFRzID0gYXMubnVtZXJpYyhUcyksIFpzID0gYXMubnVtZXJpYyhacykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIkFic19GIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo5KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNCkFic19GIDwtIHNjcmFwDQpgYGAgIA0KDQojIyMgQWJzX00NCmBgYHtyfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00NCg0KIyMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KDQojIHVybCA8LSAiaHR0cHM6Ly9mZWRtZS5yZXN1bHRzLmluZm8vZXZlbnQvMzAvZ2VuZXJhbC9sZWFkIg0KDQojIyMjIyMjIyMjIyMgICBjaHJvbW90ZTo6IE9QVElPTiAjIyMjIyMNCiMgQ3JlYXRlIGEgbmV3IENocm9tb3RlIHNlc3Npb24NCiMgYiA8LSBDaHJvbW90ZVNlc3Npb24kbmV3KCkNCg0KIyBOYXZpZ2F0ZSB0byB0aGUgd2VicGFnZQ0KIyBiJFBhZ2UkbmF2aWdhdGUodXJsKQ0KDQojIEV4dHJhY3QgdGhlIHJlbmRlcmVkIEhUTUwNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCdkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIubXgtMjpudGgtY2hpbGQoMikiKS5jbGljaygpOycpICAjIFJlcGxhY2Ugd2l0aCB5b3VyIENTUyBzZWxlY3Rvcg0KU3lzLnNsZWVwKDEwKSANCg0KIyMjIFdBSVQgZm9yICJiYWNrc3RhZ2UiIHBhZ2UgbG9hZGluZyAjIyMjDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgiZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTCIpJHJlc3VsdCR2YWx1ZQ0KIyMgDQpwYWdlIDwtIHJlYWRfaHRtbChodG1sKSAgDQpgYGAgIA0KDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQojIyMNCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAiVHMiLCAiWnMiLCJTY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspLCBUcyA9IGFzLm51bWVyaWMoVHMpLCBacyA9IGFzLm51bWVyaWMoWnMpKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJBYnNfTSIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6OSldICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpBYnNfTSA8LSBzY3JhcA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpgYGAgIA0KIyMjIFN1YjE4X00NCg0KYGBge3J9DQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNIERPTkUNCiMgU3ViMThNDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDMpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgIlRzIiwgIlpzIiwiU2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSwgVHMgPSBhcy5udW1lcmljKFRzKSwgWnMgPSBhcy5udW1lcmljKFpzKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiU3ViMThfTSIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6OSldICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpTdWIxOE0gPC0gc2NyYXANCmBgYCAgDQoNCiMjIyBTdWIxOF9GDQoNCmBgYHtyfQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgQWJzRiBET05FDQojIEFic00gRE9ORQ0KIyBTdWIxOCBNIERPTkUNCiMgU3ViMTggRg0KIyBTdWIxNiBNDQojIFN1YjE2IEYNCiMgU3ViMTQgTQ0KIyBTdWIxNCBGDQoNCiMgc2NyYXBpbmcgYWN0aXZlIHBhZ2UgdXNpbmcgY2hyb21vdGUgIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgQWJzRiBET25lDQojIEFic00gRE9ORQ0KIyBTdWIxOE0gRE9ORQ0KIyBTdWIxOEYgDQoNCiMgVVJMIG9mIHRoZSB3ZWJwYWdlIHRvIHNjcmFwZQ0KIyB1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDQpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAiVHMiLCAiWnMiLCJTY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspLCBUcyA9IGFzLm51bWVyaWMoVHMpLCBacyA9IGFzLm51bWVyaWMoWnMpKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJTdWIxOF9GIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo5KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNClN1YjE4RiA8LSBzY3JhcA0KYGBgICANCiMjIyBTdWIxNl9NDQoNCmBgYHtyfQ0KIyBzY3JhcGluZyBhY3RpdmUgcGFnZSB1c2luZyBjaHJvbW90ZSAjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBBYnNGIERPbmUNCiMgQWJzTSBET05FDQojIFN1YjE4TSBET05FDQojIFN1YjE4RiBET05FDQojIFN1YjE2TQ0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCiMgdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8zMC9nZW5lcmFsL2xlYWQiDQoNCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KIyBiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCg1KSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQpgYGAgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIyMgDQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSAjIA0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJUcyIsICJacyIsIlNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuayksIFRzID0gYXMubnVtZXJpYyhUcyksIFpzID0gYXMubnVtZXJpYyhacykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE2X00iLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjkpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMTZNIDwtIHNjcmFwDQpgYGAgIA0KIyMjIFN1YjE2X0YNCg0KYGBge3J9DQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNIERPTkUNCiMgU3ViMThNIERPTkUNCiMgU3ViMThGIERPTkUNCiMgU3ViMTZNIERPTkUNCiMgU3ViMTZGIA0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCiMgdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8zMC9nZW5lcmFsL2xlYWQiDQoNCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KI2IgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDYpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMjIA0KY29tcGUgPC0gcGFnZSAlPiUNCiAgaHRtbF9lbGVtZW50cygnZGl2LmdyLWV2ZW50LW5hbWUnKSAlPiUNCiAgaHRtbF90ZXh0KCkNCiMjIw0KY29tcGV0aXRvcl9kaXZzIDwtIHBhZ2UgJT4lIA0KICBodG1sX2VsZW1lbnRzKCJkaXYuYXRobGV0ZS1iYXNpYy1saW5lIikgIyANCg0KIyBFeHRyYWN0IGFuZCBjbGVhbiBkYXRhDQpzY3JhcCA8LSBjb21wZXRpdG9yX2RpdnMgJT4lDQogIG1hcF9kZih+ew0KICAgIHJhbmsgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnJhbmsiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIG5hbWUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnItbmFtZSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgc2NvcmUgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIikgJT4lIGh0bWxfdGV4dCh0cmltID0gRkFMU0UpICMgc2NvcmUNCiAgICAjc2NvcmUuY2xhc2lmIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSBxdWFsaSBjZWxsIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBzY29yZQ0KICAgIHRlYW0gPC0gLnggJT4lIGh0bWxfZWxlbWVudCgic3BhbjpudGgtY2hpbGQoMikiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIFRlYW0NCiAgICANCiAgICAjIFJldHVybiBhcyBhIHRpYmJsZQ0KICAgIHRpYmJsZShOYW1lID0gbmFtZSwgDQogICAgICAgICAgIFJhbmsgPSByYW5rLCANCiAgICAgICAgICAgU2NvcmUgPSBzY29yZSwgDQogICAgICAgICAgICNDbGFzaWZpYyA9IHNjb3JlLmNsYXNpZiwNCiAgICAgICAgICAgVGVhbSA9IHRlYW0pDQogIH0pDQojIyMNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgc2VwYXJhdGUoU2NvcmUsIGludG8gPSBjKE5BLCAic2NvcmUiLCAiVHMiLCAiWnMiLCJTY29yZS5yYW5rIiwgTkEpLCBzZXAgPSAiICIpDQojc2NyYXAgPC0gc2NyYXAgJT4lIA0KICMgc2VwYXJhdGUoc2NvcmUucmFuaywgaW50byA9IGMoTkEsTkEsInNjb3JlLnJhbmsiKSwgc2VwID0gIigpIikNCnNjcmFwIDwtIHNjcmFwICU+JSANCiAgbXV0YXRlKFJhbmsgPSBhcy5udW1lcmljKFJhbmspLCBUcyA9IGFzLm51bWVyaWMoVHMpLCBacyA9IGFzLm51bWVyaWMoWnMpKQ0Kc2NyYXAkQ2F0ZWdvcnkgPC0gcmVwKCJTdWIxNl9GIiwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCnNjcmFwJENvbXBldGl0aW9uIDwtIHJlcChjb21wZSwgbGVuZ3RoKHNjcmFwJE5hbWUpICkNCiMjDQpjb21wZQ0Kbi5jb21wZXRpdG9ycyA8LSBtYXgoc2NyYXAkUmFuaywgbmEucm0gPSBUUlVFKTsgbi5jb21wZXRpdG9ycw0KIyMNCiMgc2NyYXAgJT4lIHByaW50KG49bGVuZ3RoKHNjcmFwJE5hbWUpKQ0Kc2NyYXBbLGMoMTo5KV0gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKHNjb3JlKSkgJT4lDQogIHByaW50KG4gPSAxNykNCiMjIyMjIyMjIyMjIyMjIyAjIyMjIyMjIyMjIyMjIyMjIyMNClN1YjE2RiA8LSBzY3JhcA0KYGBgICANCg0KIyMjIFN1YjE0X00NCg0KYGBge3J9DQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNIERPTkUNCiMgU3ViMThNIERPTkUNCiMgU3ViMThGIERPTkUNCiMgU3ViMTZNIERPTkUNCiMgU3ViMTZGIERPTkUNCiMgU3ViMTRNIA0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCiMgdXJsIDwtICJodHRwczovL2ZlZG1lLnJlc3VsdHMuaW5mby9ldmVudC8zMC9nZW5lcmFsL2xlYWQiDQoNCiMjIyMjIyMjIyMjIyAgIGNocm9tb3RlOjogT1BUSU9OICMjIyMjIw0KIyBDcmVhdGUgYSBuZXcgQ2hyb21vdGUgc2Vzc2lvbg0KIyBiIDwtIENocm9tb3RlU2Vzc2lvbiRuZXcoKQ0KDQojIE5hdmlnYXRlIHRvIHRoZSB3ZWJwYWdlDQojIGIkUGFnZSRuYXZpZ2F0ZSh1cmwpDQoNCiMgRXh0cmFjdCB0aGUgcmVuZGVyZWQgSFRNTA0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoJ2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5teC0yOm50aC1jaGlsZCg3KSIpLmNsaWNrKCk7JykgICMgUmVwbGFjZSB3aXRoIHlvdXIgQ1NTIHNlbGVjdG9yDQpTeXMuc2xlZXAoMTApIA0KDQojIyMgV0FJVCBmb3IgImJhY2tzdGFnZSIgcGFnZSBsb2FkaW5nICMjIyMNCmh0bWwgPC0gYiRSdW50aW1lJGV2YWx1YXRlKCJkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MIikkcmVzdWx0JHZhbHVlDQojIyANCnBhZ2UgPC0gcmVhZF9odG1sKGh0bWwpDQpgYGAgIA0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIyMgDQpjb21wZSA8LSBwYWdlICU+JQ0KICBodG1sX2VsZW1lbnRzKCdkaXYuZ3ItZXZlbnQtbmFtZScpICU+JQ0KICBodG1sX3RleHQoKQ0KIyMjDQpjb21wZXRpdG9yX2RpdnMgPC0gcGFnZSAlPiUgDQogIGh0bWxfZWxlbWVudHMoImRpdi5hdGhsZXRlLWJhc2ljLWxpbmUiKSAjIA0KDQojIEV4dHJhY3QgYW5kIGNsZWFuIGRhdGENCnNjcmFwIDwtIGNvbXBldGl0b3JfZGl2cyAlPiUNCiAgbWFwX2RmKH57DQogICAgcmFuayA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIucmFuayIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgDQogICAgbmFtZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuci1uYW1lIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBzY29yZSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBGQUxTRSkgDQogICAgIyBzY29yZQ0KICAgICNzY29yZS5jbGFzaWYgPC0gLnggJT4lIGh0bWxfZWxlbWVudCgiLnNjb3JlIHF1YWxpIGNlbGwiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIHNjb3JlDQogICAgdGVhbSA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCJzcGFuOm50aC1jaGlsZCgyKSIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgVGVhbQ0KICAgIA0KICAgICMgUmV0dXJuIGFzIGEgdGliYmxlDQogICAgdGliYmxlKE5hbWUgPSBuYW1lLCANCiAgICAgICAgICAgUmFuayA9IHJhbmssIA0KICAgICAgICAgICBTY29yZSA9IHNjb3JlLCANCiAgICAgICAgICAgI0NsYXNpZmljID0gc2NvcmUuY2xhc2lmLA0KICAgICAgICAgICBUZWFtID0gdGVhbSkNCiAgfSkNCiMjIw0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBzZXBhcmF0ZShTY29yZSwgaW50byA9IGMoTkEsICJzY29yZSIsICJUcyIsICJacyIsIlNjb3JlLnJhbmsiLCBOQSksIHNlcCA9ICIgIikNCiNzY3JhcCA8LSBzY3JhcCAlPiUgDQogIyBzZXBhcmF0ZShzY29yZS5yYW5rLCBpbnRvID0gYyhOQSxOQSwic2NvcmUucmFuayIpLCBzZXAgPSAiKCkiKQ0Kc2NyYXAgPC0gc2NyYXAgJT4lIA0KICBtdXRhdGUoUmFuayA9IGFzLm51bWVyaWMoUmFuayksIFRzID0gYXMubnVtZXJpYyhUcyksIFpzID0gYXMubnVtZXJpYyhacykpDQpzY3JhcCRDYXRlZ29yeSA8LSByZXAoIlN1YjE0X00iLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0Kc2NyYXAkQ29tcGV0aXRpb24gPC0gcmVwKGNvbXBlLCBsZW5ndGgoc2NyYXAkTmFtZSkgKQ0KIyMNCmNvbXBlDQpuLmNvbXBldGl0b3JzIDwtIG1heChzY3JhcCRSYW5rLCBuYS5ybSA9IFRSVUUpOyBuLmNvbXBldGl0b3JzDQojIw0KIyBzY3JhcCAlPiUgcHJpbnQobj1sZW5ndGgoc2NyYXAkTmFtZSkpDQpzY3JhcFssYygxOjkpXSAlPiUgDQogIGZpbHRlcighaXMubmEoc2NvcmUpKSAlPiUNCiAgcHJpbnQobiA9IDE3KQ0KIyMjIyMjIyMjIyMjIyMjICMjIyMjIyMjIyMjIyMjIyMjIw0KU3ViMTRNIDwtIHNjcmFwDQpgYGAgIA0KDQoNCiMjIyBTdWIxNF9GDQoNCg0KYGBge3J9DQojIHNjcmFwaW5nIGFjdGl2ZSBwYWdlIHVzaW5nIGNocm9tb3RlICMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojIEFic0YgRE9uZQ0KIyBBYnNNIERPTkUNCiMgU3ViMThNIERPTkUNCiMgU3ViMThGIERPTkUNCiMgU3ViMTZNIERPTkUNCiMgU3ViMTZGIERPTkUNCiMgU3ViMTRNIERPTkUNCiMgU3ViMTRGIA0KDQojIFVSTCBvZiB0aGUgd2VicGFnZSB0byBzY3JhcGUNCiN1cmwgPC0gImh0dHBzOi8vZmVkbWUucmVzdWx0cy5pbmZvL2V2ZW50LzMwL2dlbmVyYWwvbGVhZCINCg0KIyMjIyMjIyMjIyMjICAgY2hyb21vdGU6OiBPUFRJT04gIyMjIyMjDQojIENyZWF0ZSBhIG5ldyBDaHJvbW90ZSBzZXNzaW9uDQojIGIgPC0gQ2hyb21vdGVTZXNzaW9uJG5ldygpDQoNCiMgTmF2aWdhdGUgdG8gdGhlIHdlYnBhZ2UNCiMgYiRQYWdlJG5hdmlnYXRlKHVybCkNCg0KIyBFeHRyYWN0IHRoZSByZW5kZXJlZCBIVE1MDQpodG1sIDwtIGIkUnVudGltZSRldmFsdWF0ZSgnZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm14LTI6bnRoLWNoaWxkKDgpIikuY2xpY2soKTsnKSAgIyBSZXBsYWNlIHdpdGggeW91ciBDU1Mgc2VsZWN0b3INClN5cy5zbGVlcCgxMCkgDQoNCiMjIyBXQUlUIGZvciAiYmFja3N0YWdlIiBwYWdlIGxvYWRpbmcgIyMjIw0KaHRtbCA8LSBiJFJ1bnRpbWUkZXZhbHVhdGUoImRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUwiKSRyZXN1bHQkdmFsdWUNCiMjIA0KcGFnZSA8LSByZWFkX2h0bWwoaHRtbCkNCmBgYCAgDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjIyANCmNvbXBlIDwtIHBhZ2UgJT4lDQogIGh0bWxfZWxlbWVudHMoJ2Rpdi5nci1ldmVudC1uYW1lJykgJT4lDQogIGh0bWxfdGV4dCgpDQojIyMNCmNvbXBldGl0b3JfZGl2cyA8LSBwYWdlICU+JSANCiAgaHRtbF9lbGVtZW50cygiZGl2LmF0aGxldGUtYmFzaWMtbGluZSIpICMgDQoNCiMgRXh0cmFjdCBhbmQgY2xlYW4gZGF0YQ0Kc2NyYXAgPC0gY29tcGV0aXRvcl9kaXZzICU+JQ0KICBtYXBfZGYofnsNCiAgICByYW5rIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yYW5rIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyANCiAgICBuYW1lIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5yLW5hbWUiKSAlPiUgaHRtbF90ZXh0KHRyaW0gPSBUUlVFKSAjIA0KICAgIHNjb3JlIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoIi5zY29yZSIpICU+JSBodG1sX3RleHQodHJpbSA9IEZBTFNFKSAjIHNjb3JlDQogICAgI3Njb3JlLmNsYXNpZiA8LSAueCAlPiUgaHRtbF9lbGVtZW50KCIuc2NvcmUgcXVhbGkgY2VsbCIpICU+JSBodG1sX3RleHQodHJpbSA9IFRSVUUpICMgc2NvcmUNCiAgICB0ZWFtIDwtIC54ICU+JSBodG1sX2VsZW1lbnQoInNwYW46bnRoLWNoaWxkKDIpIikgJT4lIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgIyBUZWFtDQogICAgDQogICAgIyBSZXR1cm4gYXMgYSB0aWJibGUNCiAgICB0aWJibGUoTmFtZSA9IG5hbWUsIA0KICAgICAgICAgICBSYW5rID0gcmFuaywgDQogICAgICAgICAgIFNjb3JlID0gc2NvcmUsIA0KICAgICAgICAgICAjQ2xhc2lmaWMgPSBzY29yZS5jbGFzaWYsDQogICAgICAgICAgIFRlYW0gPSB0ZWFtKQ0KICB9KQ0KIyMjDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIHNlcGFyYXRlKFNjb3JlLCBpbnRvID0gYyhOQSwgInNjb3JlIiwgIlRzIiwgIlpzIiwiU2NvcmUucmFuayIsIE5BKSwgc2VwID0gIiAiKQ0KI3NjcmFwIDwtIHNjcmFwICU+JSANCiAjIHNlcGFyYXRlKHNjb3JlLnJhbmssIGludG8gPSBjKE5BLE5BLCJzY29yZS5yYW5rIiksIHNlcCA9ICIoKSIpDQpzY3JhcCA8LSBzY3JhcCAlPiUgDQogIG11dGF0ZShSYW5rID0gYXMubnVtZXJpYyhSYW5rKSwgVHMgPSBhcy5udW1lcmljKFRzKSwgWnMgPSBhcy5udW1lcmljKFpzKSkNCnNjcmFwJENhdGVnb3J5IDwtIHJlcCgiU3ViMTRfRiIsIGxlbmd0aChzY3JhcCROYW1lKSApDQpzY3JhcCRDb21wZXRpdGlvbiA8LSByZXAoY29tcGUsIGxlbmd0aChzY3JhcCROYW1lKSApDQojIw0KY29tcGUNCm4uY29tcGV0aXRvcnMgPC0gbWF4KHNjcmFwJFJhbmssIG5hLnJtID0gVFJVRSk7IG4uY29tcGV0aXRvcnMNCiMjDQojIHNjcmFwICU+JSBwcmludChuPWxlbmd0aChzY3JhcCROYW1lKSkNCnNjcmFwWyxjKDE6OSldICU+JSANCiAgZmlsdGVyKCFpcy5uYShzY29yZSkpICU+JQ0KICBwcmludChuID0gMTcpDQojIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQpTdWIxNEYgPC0gc2NyYXANCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjIyMjIyMjIyMjIyMgIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgV3JpdGUgZ29vZ2xlIHNoZWV0ICMjIw0KVGhpcmQuQm91bGRlcl9FU1AuMjQgPC0gcmJpbmQoQWJzX0YsIA0KICAgICAgICAgICAgIEFic19NLCANCiAgICAgICAgICAgICBTdWIxOE0sIA0KICAgICAgICAgICAgIFN1YjE4RiwNCiAgICAgICAgICAgICBTdWIxNk0sDQogICAgICAgICAgICAgU3ViMTZGLA0KICAgICAgICAgICAgIFN1YjE0TSwNCiAgICAgICAgICAgICBTdWIxNEYpDQpUaGlyZC5Cb3VsZGVyX0VTUC4yNCAlPiUgcHJpbnQobj1sZW5ndGgoVGhpcmQuQm91bGRlcl9FU1AuMjQkTmFtZSkpDQoNCm9wdGlvbnMoZ2FyZ2xlX29hdXRoX2VtYWlsID0gInZpbGxhdG9yb3BhemZqQGRhdGFhbmFseXNpc2xhYi5jb20iKQ0KZ3M0X2RlYXV0aCgpDQpnczRfYXV0aCgpDQpzaGVldF93cml0ZShkYXRhID0gVGhpcmQuQm91bGRlcl9FU1AuMjQsDQogICAgICAgICAgICBzcz0gImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFrWFlVSDlfUVdOQmJkSWhWa2dydGhYQWcyU1VDNXA2LXJCNjUxSGx5RzZrL2VkaXQ/dXNwPXNoYXJpbmciLCANCiAgICAgICAgICAgIHNoZWV0PXBhc3RlKCJUaGlyZC5Cb3VsZGVyX0VTUC4yNCIsICJfIiwgU3lzLkRhdGUoKSkpDQoNCg0KYGBgDQoNCg0KDQoNCiMjIyBDb25zb2xpZGFkbyBlbiBsYSBbSG9qYSBHb29nbGVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFrWFlVSDlfUVdOQmJkSWhWa2dydGhYQWcyU1VDNXA2LXJCNjUxSGx5RzZrL2VkaXQ/dXNwPXNoYXJpbmcpDQoNCg0KDQoNCg==