Reading Data
Innsbruck
Innsbruck: Semi-finals
Semi-finals
-Competitors = n.semis
-
#####_ Elo History _
Elo Accumulated Innsbruck Semis
Innsbruck: Final
Finals
-Competitors = n.final
-
#######_ Elo History _
Elo Accumulated Innsbruck Final
competitor |
Ctry |
Expectation |
R.new |
E.Finals |
E.podium |
sorato ANRAKU |
JPN |
0.8816913 |
2304.94 |
0.86 |
0.85 |
tomoa NARASAKI |
JPN |
0.7700000 |
2153.18 |
0.74 |
0.66 |
meichi NARASAKI |
JPN |
0.7128432 |
2119.33 |
0.68 |
0.67 |
adam ONDRA |
CZE |
NA |
2113.00 |
NA |
NA |
mejdi SCHALCK |
FRA |
NA |
2110.00 |
NA |
NA |
sam AVEZOU |
FRA |
NA |
2088.00 |
NA |
NA |
hannes van DUYSEN |
BEL |
NA |
2082.00 |
NA |
NA |
paul JENFT |
FRA |
NA |
2069.00 |
NA |
NA |
dohyun LEE |
KOR |
NA |
2062.00 |
NA |
NA |
toby ROBERTS |
GBR |
0.6348234 |
2051.16 |
0.59 |
0.58 |
jakob SCHUBERT |
AUT |
NA |
2047.00 |
NA |
NA |
kokoro FUJII |
JPN |
NA |
2026.00 |
NA |
NA |
alberto gines LOPEZ |
ESP |
NA |
2009.00 |
NA |
NA |
hamish MCARTHUR |
GBR |
NA |
2005.00 |
NA |
NA |
yannick FLOHE |
GER |
NA |
2002.00 |
NA |
NA |
sohta AMAGASA |
JPN |
0.5434950 |
1997.04 |
0.50 |
0.50 |
yoshiyuki OGATA |
JPN |
NA |
1994.00 |
NA |
NA |
ritsu KAYOTANI |
JPN |
0.5612561 |
1991.56 |
0.52 |
0.49 |
rei SUGIMOTO |
JPN |
NA |
1988.00 |
NA |
NA |
colin DUFFY |
USA |
0.5900000 |
1984.02 |
0.52 |
0.42 |
jongwon CHON |
KOR |
NA |
1981.00 |
NA |
NA |
elias ARRIAGADA KRÜGER |
GER |
0.5260675 |
1970.84 |
0.48 |
0.46 |
mickael MAWEM |
FRA |
NA |
1965.00 |
NA |
NA |
tomoaki TAKATA |
JPN |
NA |
1957.00 |
NA |
NA |
jan-luca POSCH |
AUT |
NA |
1950.00 |
NA |
NA |
ardch INTRACHUPONGSE |
THA |
0.5000000 |
1948.01 |
0.47 |
0.38 |
alexander MEGOS |
GER |
NA |
1946.00 |
NA |
NA |
nathaniel COLEMAN |
USA |
NA |
1943.00 |
NA |
NA |
yuji FUJIWAKI |
JPN |
0.5000000 |
1940.90 |
0.46 |
0.37 |
thomas LEMAGNER |
FRA |
0.5000000 |
1926.67 |
0.44 |
0.35 |
nicolai UZNIK |
AUT |
NA |
1921.00 |
NA |
NA |
dayan AKHTAR |
GBR |
0.5000000 |
1919.56 |
0.43 |
0.34 |
sean BAILEY |
USA |
NA |
1917.00 |
NA |
NA |
samuel RICHARD |
FRA |
0.5000000 |
1916.01 |
0.42 |
0.33 |
yuji INOUE |
JPN |
NA |
1916.00 |
NA |
NA |
guillermo PEINADO FRANGANILLO |
ESP |
0.5000000 |
1912.45 |
0.42 |
0.33 |
manuel CORNU |
FRA |
NA |
1909.00 |
NA |
NA |
junzhe HU |
CHN |
0.5000000 |
1908.90 |
0.41 |
0.32 |
yejun CHON |
KOR |
0.5000000 |
1905.34 |
0.41 |
0.32 |
maximillian MILNE |
GBR |
NA |
1901.00 |
NA |
NA |
anze PEHARC |
SLO |
0.4300000 |
1884.70 |
0.38 |
0.29 |
mathieu TERNANT |
FRA |
NA |
1869.00 |
NA |
NA |
nicolas COLLIN |
BEL |
NA |
1867.00 |
NA |
NA |
jack MACDOUGALL |
GBR |
NA |
1866.00 |
NA |
NA |
gabriele MORONI |
ITA |
NA |
1853.00 |
NA |
NA |
yufei PAN |
CHN |
NA |
1848.00 |
NA |
NA |
simon LORENZI |
BEL |
NA |
1843.00 |
NA |
NA |
nimrod MARCUS |
ISR |
NA |
1837.00 |
NA |
NA |
zan lovenjak SUDAR |
SLO |
NA |
1828.00 |
NA |
NA |
gholamali BARATZADEH |
IRI |
NA |
1824.00 |
NA |
NA |
zach GALLA |
USA |
NA |
1810.00 |
NA |
NA |
benjamin HANNA |
USA |
NA |
1806.00 |
NA |
NA |
daiki SANO |
JPN |
NA |
1803.00 |
NA |
NA |
gregor VEZONIK |
SLO |
0.3200000 |
1802.82 |
0.28 |
0.21 |
satone YOSHIDA |
JPN |
0.3100000 |
1800.01 |
0.27 |
0.20 |
oscar BAUDRAND |
CAN |
NA |
1794.00 |
NA |
NA |
nikolay RUSEV |
BUL |
NA |
1790.00 |
NA |
NA |
alex KHAZANOV |
ISR |
NA |
1778.00 |
NA |
NA |
filip SCHENK |
ITA |
NA |
1770.00 |
NA |
NA |
Prague.2024
Prague.2024: Semi-finals
Semi-finals
-Competitors = n.semis
-
#####_ Elo History _
Elo Accumulated Prague.2024 Semis
Prague.2024: Final
Finals
-Competitors = n.final
-
#######_ Elo History _
Elo Accumulated Prague.2024 Final
competitor |
Ctry |
Expectation |
R.new |
Prob.Finals |
Prob.podium |
sorato ANRAKU |
JPN |
0.9000000 |
2345.78 |
81 % |
79.57 % |
tomoa NARASAKI |
JPN |
0.7800000 |
2189.04 |
63 % |
61.25 % |
adam ONDRA |
CZE |
0.7200000 |
2132.80 |
56 % |
53.34 % |
dohyun LEE |
KOR |
0.6700000 |
2109.54 |
50 % |
50 % |
mejdi SCHALCK |
FRA |
0.7000000 |
2108.88 |
53.63 % |
50 % |
meichi NARASAKI |
JPN |
0.7100000 |
2104.69 |
53.03 % |
49.4 % |
toby ROBERTS |
GBR |
0.6500000 |
2088.85 |
48 % |
47.03 % |
sam AVEZOU |
FRA |
0.6800000 |
2083.62 |
50 % |
46.37 % |
hannes van DUYSEN |
BEL |
NA |
2082.00 |
NA |
NA |
paul JENFT |
FRA |
NA |
2069.00 |
NA |
NA |
jakob SCHUBERT |
AUT |
NA |
2047.00 |
NA |
NA |
kokoro FUJII |
JPN |
NA |
2026.00 |
NA |
NA |
alberto gines LOPEZ |
ESP |
NA |
2009.00 |
NA |
NA |
hamish MCARTHUR |
GBR |
NA |
2005.00 |
NA |
NA |
yannick FLOHE |
GER |
NA |
2002.00 |
NA |
NA |
sohta AMAGASA |
JPN |
0.5434950 |
1997.04 |
50 % |
50 % |
yoshiyuki OGATA |
JPN |
NA |
1994.00 |
NA |
NA |
rei SUGIMOTO |
JPN |
NA |
1988.00 |
NA |
NA |
colin DUFFY |
USA |
0.5900000 |
1984.02 |
51.9 % |
42.49 % |
ritsu KAYOTANI |
JPN |
0.5400000 |
1980.96 |
35.64 % |
32.38 % |
jongwon CHON |
KOR |
0.5300000 |
1973.83 |
34.71 % |
31.49 % |
elias ARRIAGADA KRÜGER |
GER |
0.5260675 |
1970.84 |
48 % |
46.24 % |
mickael MAWEM |
FRA |
NA |
1965.00 |
NA |
NA |
tomoaki TAKATA |
JPN |
NA |
1957.00 |
NA |
NA |
adam SHAHAR |
USA |
0.4700000 |
1950.45 |
31.72 % |
28.66 % |
jan-luca POSCH |
AUT |
NA |
1950.00 |
NA |
NA |
manuel CORNU |
FRA |
0.4500000 |
1949.66 |
29 % |
28.49 % |
ardch INTRACHUPONGSE |
THA |
0.5000000 |
1948.01 |
46.72 % |
37.52 % |
alexander MEGOS |
GER |
NA |
1946.00 |
NA |
NA |
nathaniel COLEMAN |
USA |
NA |
1943.00 |
NA |
NA |
thomas LEMAGNER |
FRA |
0.5000000 |
1926.67 |
43.68 % |
34.69 % |
yuji FUJIWAKI |
JPN |
0.4700000 |
1920.49 |
28.11 % |
25.27 % |
dayan AKHTAR |
GBR |
0.5000000 |
1919.56 |
42.67 % |
33.77 % |
samuel RICHARD |
FRA |
0.4400000 |
1919.32 |
27.97 % |
25.14 % |
sean BAILEY |
USA |
NA |
1917.00 |
NA |
NA |
nicolò SARTIRANA |
ITA |
0.4700000 |
1916.76 |
27.68 % |
24.86 % |
yuji INOUE |
JPN |
NA |
1916.00 |
NA |
NA |
guillermo PEINADO FRANGANILLO |
ESP |
0.5000000 |
1912.45 |
41.68 % |
32.86 % |
max KLEESATTEL |
GER |
0.4700000 |
1910.03 |
26.91 % |
24.15 % |
junzhe HU |
CHN |
0.5000000 |
1908.90 |
41.18 % |
32.41 % |
maximillian MILNE |
GBR |
0.4100000 |
1907.76 |
26.65 % |
23.91 % |
ram LEVIN |
ISR |
0.4700000 |
1906.66 |
26.53 % |
23.79 % |
yejun CHON |
KOR |
0.5000000 |
1905.34 |
40.68 % |
31.96 % |
nicolai UZNIK |
AUT |
0.4400000 |
1893.97 |
25.13 % |
22.49 % |
mathieu TERNANT |
FRA |
NA |
1869.00 |
NA |
NA |
anze PEHARC |
SLO |
0.3900000 |
1867.97 |
22.42 % |
19.99 % |
nicolas COLLIN |
BEL |
NA |
1867.00 |
NA |
NA |
jack MACDOUGALL |
GBR |
NA |
1866.00 |
NA |
NA |
gabriele MORONI |
ITA |
NA |
1853.00 |
NA |
NA |
yufei PAN |
CHN |
NA |
1848.00 |
NA |
NA |
simon LORENZI |
BEL |
NA |
1843.00 |
NA |
NA |
nimrod MARCUS |
ISR |
NA |
1837.00 |
NA |
NA |
zan lovenjak SUDAR |
SLO |
NA |
1828.00 |
NA |
NA |
gholamali BARATZADEH |
IRI |
NA |
1824.00 |
NA |
NA |
zach GALLA |
USA |
NA |
1810.00 |
NA |
NA |
benjamin HANNA |
USA |
NA |
1806.00 |
NA |
NA |
daiki SANO |
JPN |
NA |
1803.00 |
NA |
NA |
gregor VEZONIK |
SLO |
0.3200000 |
1802.82 |
27.54 % |
20.66 % |
satone YOSHIDA |
JPN |
0.3100000 |
1800.01 |
27.22 % |
20.39 % |
oscar BAUDRAND |
CAN |
NA |
1794.00 |
NA |
NA |
nikolay RUSEV |
BUL |
NA |
1790.00 |
NA |
NA |
alex KHAZANOV |
ISR |
NA |
1778.00 |
NA |
NA |
filip SCHENK |
ITA |
NA |
1770.00 |
NA |
NA |
Seoul.2024
Seoul.2024: Semi-finals
Semi-finals
-Competitors = n.semis
-
#######_ Elo History _
Elo Accumulated Seoul.2024 Semis
Seoul.2024: Final
Finals
-Competitors = n.final
-
#######_ Elo History _
Elo Accumulated Seoul.2024 Final
competitor |
Ctry |
Expectation |
R.new |
Prob.Finals |
Prob.podium |
sorato ANRAKU |
JPN |
0.9000000 |
2330.60 |
82.1 % |
76.86 % |
tomoa NARASAKI |
JPN |
0.7900000 |
2187.76 |
66.85 % |
59.34 % |
dohyun LEE |
KOR |
0.7200000 |
2146.43 |
58 % |
69.12 % |
meichi NARASAKI |
JPN |
0.7300000 |
2141.46 |
60 % |
68.5 % |
adam ONDRA |
CZE |
0.7200000 |
2132.80 |
56 % |
53.34 % |
mejdi SCHALCK |
FRA |
0.7000000 |
2118.04 |
57.44 % |
49.42 % |
toby ROBERTS |
GBR |
0.6500000 |
2088.85 |
48 % |
47.03 % |
hannes van DUYSEN |
BEL |
NA |
2082.00 |
NA |
NA |
paul JENFT |
FRA |
0.6500000 |
2078.35 |
51.78 % |
43.74 % |
sam AVEZOU |
FRA |
0.6700000 |
2065.95 |
50 % |
41.99 % |
jakob SCHUBERT |
AUT |
NA |
2047.00 |
NA |
NA |
sohta AMAGASA |
JPN |
0.5900000 |
2042.60 |
44 % |
55.18 % |
kokoro FUJII |
JPN |
NA |
2026.00 |
NA |
NA |
alberto gines LOPEZ |
ESP |
NA |
2009.00 |
NA |
NA |
jongwon CHON |
KOR |
0.5500000 |
2006.49 |
40 % |
50 % |
hamish MCARTHUR |
GBR |
NA |
2005.00 |
NA |
NA |
yannick FLOHE |
GER |
NA |
2002.00 |
NA |
NA |
yoshiyuki OGATA |
JPN |
NA |
1994.00 |
NA |
NA |
rei SUGIMOTO |
JPN |
NA |
1988.00 |
NA |
NA |
ritsu KAYOTANI |
JPN |
0.5300000 |
1984.03 |
38.42 % |
31.12 % |
colin DUFFY |
USA |
0.5900000 |
1984.02 |
51.9 % |
42.49 % |
elias ARRIAGADA KRÜGER |
GER |
0.5260675 |
1970.84 |
48 % |
46.24 % |
mickael MAWEM |
FRA |
NA |
1965.00 |
NA |
NA |
tomoaki TAKATA |
JPN |
NA |
1957.00 |
NA |
NA |
maximillian MILNE |
GBR |
0.4600000 |
1955.20 |
32 % |
42.67 % |
dayan AKHTAR |
GBR |
0.4600000 |
1953.39 |
32 % |
42.42 % |
jan-luca POSCH |
AUT |
NA |
1950.00 |
NA |
NA |
ardch INTRACHUPONGSE |
THA |
0.5000000 |
1948.01 |
46.72 % |
37.52 % |
alexander MEGOS |
GER |
NA |
1946.00 |
NA |
NA |
adam SHAHAR |
USA |
0.4800000 |
1943.58 |
33.08 % |
26.36 % |
nathaniel COLEMAN |
USA |
NA |
1943.00 |
NA |
NA |
charles BARRON |
USA |
0.4700000 |
1933.72 |
31.84 % |
25.27 % |
thomas LEMAGNER |
FRA |
0.4500000 |
1923.29 |
30.55 % |
24.15 % |
julien CLÉMENCE |
SUI |
0.4700000 |
1920.25 |
30.18 % |
23.84 % |
samuel RICHARD |
FRA |
0.4400000 |
1919.32 |
27.97 % |
25.14 % |
sean BAILEY |
USA |
NA |
1917.00 |
NA |
NA |
nicolò SARTIRANA |
ITA |
0.4700000 |
1916.76 |
27.68 % |
24.86 % |
yuji INOUE |
JPN |
NA |
1916.00 |
NA |
NA |
manuel CORNU |
FRA |
0.4800000 |
1915.85 |
29.65 % |
23.38 % |
timotej ROMŠAK |
SLO |
0.4700000 |
1913.51 |
29.37 % |
23.14 % |
guillermo PEINADO FRANGANILLO |
ESP |
0.5000000 |
1912.45 |
41.68 % |
32.86 % |
max KLEESATTEL |
GER |
0.4700000 |
1910.03 |
26.91 % |
24.15 % |
junzhe HU |
CHN |
0.5000000 |
1908.90 |
41.18 % |
32.41 % |
ram LEVIN |
ISR |
0.4700000 |
1906.66 |
26.53 % |
23.79 % |
yejun CHON |
KOR |
0.5000000 |
1905.34 |
40.68 % |
31.96 % |
nicolai UZNIK |
AUT |
0.4400000 |
1893.97 |
25.13 % |
22.49 % |
yuji FUJIWAKI |
JPN |
0.4400000 |
1890.20 |
26.66 % |
20.84 % |
mathieu TERNANT |
FRA |
NA |
1869.00 |
NA |
NA |
nicolas COLLIN |
BEL |
NA |
1867.00 |
NA |
NA |
jack MACDOUGALL |
GBR |
NA |
1866.00 |
NA |
NA |
gabriele MORONI |
ITA |
NA |
1853.00 |
NA |
NA |
yufei PAN |
CHN |
NA |
1848.00 |
NA |
NA |
anze PEHARC |
SLO |
0.3700000 |
1844.69 |
21.86 % |
16.84 % |
simon LORENZI |
BEL |
NA |
1843.00 |
NA |
NA |
nimrod MARCUS |
ISR |
NA |
1837.00 |
NA |
NA |
zan lovenjak SUDAR |
SLO |
NA |
1828.00 |
NA |
NA |
gholamali BARATZADEH |
IRI |
NA |
1824.00 |
NA |
NA |
zach GALLA |
USA |
NA |
1810.00 |
NA |
NA |
benjamin HANNA |
USA |
NA |
1806.00 |
NA |
NA |
daiki SANO |
JPN |
NA |
1803.00 |
NA |
NA |
gregor VEZONIK |
SLO |
0.3200000 |
1802.82 |
27.54 % |
20.66 % |
satone YOSHIDA |
JPN |
0.3100000 |
1800.01 |
27.22 % |
20.39 % |
oscar BAUDRAND |
CAN |
NA |
1794.00 |
NA |
NA |
nikolay RUSEV |
BUL |
NA |
1790.00 |
NA |
NA |
alex KHAZANOV |
ISR |
NA |
1778.00 |
NA |
NA |
filip SCHENK |
ITA |
NA |
1770.00 |
NA |
NA |
Keqiao.2025
Keqiao.2025: Semi-finals
Semi-finals
-Competitors = n.semis
-
#######_ Elo History _
Elo Accumulated Keqiao.2025 Semis
Keqiao.2025: Final
Finals
-Competitors = n.final
-
#######_ Elo History _
Elo Accumulated Keqiao.2025 Final
Curitiba
Curitiba: Semi-finals
Semi-finals
-Competitors = n.semis
-
#######_ Elo History _
Elo Accumulated Curitiba Semis
Curitiba: Final
Finals
-Competitors = n.final
-
#######_ Elo History _
Elo Accumulated Curitiba Final
competitor |
Ctry |
Expectation |
R.new |
Prob.Finals |
Prob.podium |
sorato ANRAKU |
JPN |
0.94 |
2434.52 |
93 % |
85.8 % |
tomoa NARASAKI |
JPN |
0.85 |
2263.66 |
84 % |
69.33 % |
mejdi SCHALCK |
FRA |
0.80 |
2203.62 |
78 % |
61.54 % |
dohyun LEE |
KOR |
0.78 |
2198.54 |
67 % |
53.09 % |
meichi NARASAKI |
JPN |
0.80 |
2185.03 |
78.41 % |
50.63 % |
adam ONDRA |
CZE |
0.72 |
2132.80 |
56 % |
53.34 % |
paul JENFT |
FRA |
0.73 |
2121.98 |
70 % |
50 % |
sam AVEZOU |
FRA |
0.68 |
2096.97 |
55 % |
38.68 % |
sohta AMAGASA |
JPN |
0.67 |
2085.06 |
65 % |
44.71 % |
hannes van DUYSEN |
BEL |
NA |
2082.00 |
NA |
NA |
toby ROBERTS |
GBR |
0.69 |
2079.30 |
54.21 % |
39.04 % |
jakob SCHUBERT |
AUT |
NA |
2047.00 |
NA |
NA |
kokoro FUJII |
JPN |
NA |
2026.00 |
NA |
NA |
alberto gines LOPEZ |
ESP |
NA |
2009.00 |
NA |
NA |
jongwon CHON |
KOR |
0.59 |
2007.16 |
56.6 % |
26.92 % |
hamish MCARTHUR |
GBR |
NA |
2005.00 |
NA |
NA |
yannick FLOHE |
GER |
NA |
2002.00 |
NA |
NA |
yoshiyuki OGATA |
JPN |
NA |
1994.00 |
NA |
NA |
ritsu KAYOTANI |
JPN |
0.53 |
1984.03 |
38.42 % |
31.12 % |
oren PRIHED |
ISR |
0.52 |
1970.77 |
38 % |
23.37 % |
jan-luca POSCH |
AUT |
0.53 |
1967.08 |
50 % |
29.08 % |
colin DUFFY |
USA |
0.55 |
1966.66 |
38.23 % |
25.08 % |
mickael MAWEM |
FRA |
NA |
1965.00 |
NA |
NA |
rei SUGIMOTO |
JPN |
0.57 |
1964.18 |
50.46 % |
22.33 % |
elias ARRIAGADA KRÜGER |
GER |
0.54 |
1961.01 |
50 % |
22.02 % |
dayan AKHTAR |
GBR |
0.50 |
1958.45 |
37.12 % |
24.21 % |
tomoaki TAKATA |
JPN |
NA |
1957.00 |
NA |
NA |
maximillian MILNE |
GBR |
0.46 |
1955.20 |
32 % |
42.67 % |
ardch INTRACHUPONGSE |
THA |
0.50 |
1948.01 |
46.72 % |
37.52 % |
adrien LEMAIRE |
FRA |
0.50 |
1946.86 |
47.96 % |
20.65 % |
alexander MEGOS |
GER |
NA |
1946.00 |
NA |
NA |
julian WIMMER |
AUT |
0.50 |
1944.19 |
47.58 % |
20.4 % |
adam SHAHAR |
USA |
0.48 |
1943.58 |
33.08 % |
26.36 % |
nathaniel COLEMAN |
USA |
NA |
1943.00 |
NA |
NA |
thorben perry BLOEM |
GER |
0.48 |
1940.11 |
34.7 % |
22.32 % |
ziqi XU |
CHN |
0.48 |
1934.54 |
33.97 % |
21.77 % |
charles BARRON |
USA |
0.47 |
1933.72 |
31.84 % |
25.27 % |
ido FIDEL |
ISR |
0.50 |
1922.86 |
44.53 % |
18.48 % |
lasse VON FREIER |
GER |
0.50 |
1920.19 |
44.15 % |
18.25 % |
samuel RICHARD |
FRA |
0.44 |
1919.32 |
27.97 % |
25.14 % |
thomas LEMAGNER |
FRA |
0.48 |
1919.02 |
43.99 % |
18.15 % |
lucas TRANDAFIR |
GER |
0.50 |
1917.52 |
43.77 % |
18.02 % |
sean BAILEY |
USA |
NA |
1917.00 |
NA |
NA |
yuji INOUE |
JPN |
NA |
1916.00 |
NA |
NA |
manuel CORNU |
FRA |
0.48 |
1915.85 |
29.65 % |
23.38 % |
timotej ROMŠAK |
SLO |
0.47 |
1913.51 |
29.37 % |
23.14 % |
guillermo PEINADO FRANGANILLO |
ESP |
0.50 |
1912.45 |
41.68 % |
32.86 % |
zander WALLER |
USA |
0.48 |
1912.28 |
31.16 % |
19.67 % |
tim WÜRTHNER |
GER |
0.50 |
1912.19 |
43.02 % |
17.57 % |
jiahao FU |
CHN |
0.48 |
1909.50 |
30.82 % |
19.42 % |
junzhe HU |
CHN |
0.50 |
1908.90 |
41.18 % |
32.41 % |
ram LEVIN |
ISR |
0.47 |
1906.66 |
26.53 % |
23.79 % |
yejun CHON |
KOR |
0.50 |
1905.34 |
40.68 % |
31.96 % |
julien CLÉMENCE |
SUI |
0.47 |
1905.33 |
42.05 % |
17.01 % |
nicolò SARTIRANA |
ITA |
0.47 |
1904.52 |
41.94 % |
16.94 % |
leo FAVOT |
FRA |
0.50 |
1903.66 |
41.82 % |
16.87 % |
yuji FUJIWAKI |
JPN |
0.42 |
1900.44 |
39 % |
21.84 % |
hannes VAN DUYSEN |
BEL |
0.45 |
1899.87 |
41.29 % |
16.57 % |
nicolai UZNIK |
AUT |
0.44 |
1893.97 |
25.13 % |
22.49 % |
max KLEESATTEL |
GER |
0.46 |
1879.16 |
38.43 % |
14.99 % |
anze PEHARC |
SLO |
0.38 |
1869.43 |
35 % |
18.94 % |
mathieu TERNANT |
FRA |
NA |
1869.00 |
NA |
NA |
jack MACDOUGALL |
GBR |
NA |
1866.00 |
NA |
NA |
nicolas COLLIN |
BEL |
0.40 |
1865.67 |
36.61 % |
14.02 % |
gabriele MORONI |
ITA |
NA |
1853.00 |
NA |
NA |
yufei PAN |
CHN |
NA |
1848.00 |
NA |
NA |
simon LORENZI |
BEL |
NA |
1843.00 |
NA |
NA |
nimrod MARCUS |
ISR |
NA |
1837.00 |
NA |
NA |
zan lovenjak SUDAR |
SLO |
NA |
1828.00 |
NA |
NA |
gholamali BARATZADEH |
IRI |
NA |
1824.00 |
NA |
NA |
zach GALLA |
USA |
NA |
1810.00 |
NA |
NA |
daiki SANO |
JPN |
NA |
1803.00 |
NA |
NA |
gregor VEZONIK |
SLO |
0.32 |
1802.82 |
27.54 % |
20.66 % |
satone YOSHIDA |
JPN |
0.31 |
1800.01 |
27.22 % |
20.39 % |
oscar BAUDRAND |
CAN |
NA |
1794.00 |
NA |
NA |
benjamin HANNA |
USA |
0.30 |
1781.21 |
17.55 % |
10.32 % |
alex KHAZANOV |
ISR |
NA |
1778.00 |
NA |
NA |
nikolay RUSEV |
BUL |
0.28 |
1773.63 |
16.93 % |
9.93 % |
filip SCHENK |
ITA |
NA |
1770.00 |
NA |
NA |
Salt.Lake.City.25
Salt.Lake.City.25: Semi-finals
Semi-finals
-Competitors = n.semis
-
#######_ Elo History _
Elo Accumulated Salt.Lake.City.25 Semis
Salt.Lake.City.25: Final
Finals
-Competitors = n.final
-
#######_ Elo History _
Elo Accumulated Salt.Lake.City.25 Final
competitor |
Ctry |
Expectation |
R.new |
Prob.Finals |
Prob.podium |
sorato ANRAKU |
JPN |
0.95 |
2488.31 |
94 % |
83.02 % |
tomoa NARASAKI |
JPN |
0.85 |
2268.24 |
83.95 % |
56.12 % |
dohyun LEE |
KOR |
0.82 |
2245.37 |
80 % |
54.7 % |
mejdi SCHALCK |
FRA |
0.83 |
2239.29 |
81 % |
53.83 % |
meichi NARASAKI |
JPN |
0.80 |
2212.61 |
78 % |
50 % |
adam ONDRA |
CZE |
0.72 |
2132.80 |
56 % |
53.34 % |
sohta AMAGASA |
JPN |
0.70 |
2127.67 |
67 % |
38.01 % |
paul JENFT |
FRA |
0.72 |
2115.80 |
68.5 % |
34.71 % |
sam AVEZOU |
FRA |
0.68 |
2096.97 |
55 % |
38.68 % |
hannes van DUYSEN |
BEL |
NA |
2082.00 |
NA |
NA |
toby ROBERTS |
GBR |
0.69 |
2079.30 |
54.21 % |
39.04 % |
jakob SCHUBERT |
AUT |
NA |
2047.00 |
NA |
NA |
kokoro FUJII |
JPN |
NA |
2026.00 |
NA |
NA |
hamish MCARTHUR |
GBR |
0.57 |
2013.16 |
54.64 % |
22.75 % |
alberto gines LOPEZ |
ESP |
NA |
2009.00 |
NA |
NA |
jongwon CHON |
KOR |
0.59 |
2007.16 |
56.6 % |
26.92 % |
yannick FLOHE |
GER |
NA |
2002.00 |
NA |
NA |
colin DUFFY |
USA |
0.53 |
1999.91 |
50 % |
22.72 % |
yoshiyuki OGATA |
JPN |
NA |
1994.00 |
NA |
NA |
rei SUGIMOTO |
JPN |
0.53 |
1989.10 |
50 % |
21.64 % |
ritsu KAYOTANI |
JPN |
0.53 |
1984.03 |
38.42 % |
31.12 % |
oren PRIHED |
ISR |
0.52 |
1970.77 |
38 % |
23.37 % |
jan-luca POSCH |
AUT |
0.53 |
1967.08 |
50 % |
29.08 % |
mickael MAWEM |
FRA |
NA |
1965.00 |
NA |
NA |
dayan AKHTAR |
GBR |
0.50 |
1958.44 |
46.78 % |
17.69 % |
tomoaki TAKATA |
JPN |
NA |
1957.00 |
NA |
NA |
adrien LEMAIRE |
FRA |
0.50 |
1946.86 |
47.96 % |
20.65 % |
alexander MEGOS |
GER |
NA |
1946.00 |
NA |
NA |
maximillian MILNE |
GBR |
0.50 |
1944.08 |
44.73 % |
16.52 % |
nathaniel COLEMAN |
USA |
NA |
1943.00 |
NA |
NA |
thorben perry BLOEM |
GER |
0.48 |
1940.11 |
34.7 % |
22.32 % |
elias ARRIAGADA KRÜGER |
GER |
0.51 |
1938.73 |
43.97 % |
16.1 % |
yuji FUJIWAKI |
JPN |
0.45 |
1934.61 |
42 % |
16.79 % |
ziqi XU |
CHN |
0.48 |
1934.54 |
33.97 % |
21.77 % |
charles BARRON |
USA |
0.47 |
1933.72 |
31.84 % |
25.27 % |
ardch INTRACHUPONGSE |
THA |
0.49 |
1925.78 |
42.14 % |
15.12 % |
ido FIDEL |
ISR |
0.50 |
1922.86 |
44.53 % |
18.48 % |
lasse VON FREIER |
GER |
0.50 |
1920.19 |
44.15 % |
18.25 % |
samuel RICHARD |
FRA |
0.44 |
1919.32 |
27.97 % |
25.14 % |
lucas TRANDAFIR |
GER |
0.50 |
1917.52 |
43.77 % |
18.02 % |
sean BAILEY |
USA |
NA |
1917.00 |
NA |
NA |
yuji INOUE |
JPN |
NA |
1916.00 |
NA |
NA |
manuel CORNU |
FRA |
0.48 |
1915.85 |
29.65 % |
23.38 % |
julian WIMMER |
AUT |
0.48 |
1913.63 |
40.45 % |
14.24 % |
timotej ROMŠAK |
SLO |
0.47 |
1913.51 |
29.37 % |
23.14 % |
adam SHAHAR |
USA |
0.48 |
1913.02 |
40.36 % |
14.2 % |
raffael GRUBER |
AUT |
0.48 |
1912.78 |
40.33 % |
14.18 % |
guillermo PEINADO FRANGANILLO |
ESP |
0.50 |
1912.45 |
41.68 % |
32.86 % |
zander WALLER |
USA |
0.48 |
1912.28 |
31.16 % |
19.67 % |
tim WÜRTHNER |
GER |
0.50 |
1912.19 |
43.02 % |
17.57 % |
jiahao FU |
CHN |
0.48 |
1909.50 |
30.82 % |
19.42 % |
junzhe HU |
CHN |
0.50 |
1908.90 |
41.18 % |
32.41 % |
ram LEVIN |
ISR |
0.47 |
1906.66 |
26.53 % |
23.79 % |
yejun CHON |
KOR |
0.50 |
1905.34 |
40.68 % |
31.96 % |
julien CLÉMENCE |
SUI |
0.47 |
1905.33 |
42.05 % |
17.01 % |
thomas LEMAGNER |
FRA |
0.45 |
1905.26 |
39.29 % |
13.66 % |
nicolò SARTIRANA |
ITA |
0.47 |
1904.52 |
41.94 % |
16.94 % |
leo FAVOT |
FRA |
0.50 |
1903.66 |
41.82 % |
16.87 % |
hannes VAN DUYSEN |
BEL |
0.42 |
1897.31 |
38.2 % |
13.13 % |
nicolai UZNIK |
AUT |
0.44 |
1893.97 |
25.13 % |
22.49 % |
max KLEESATTEL |
GER |
0.46 |
1879.16 |
38.43 % |
14.99 % |
jack MACDOUGALL |
GBR |
0.37 |
1871.92 |
34.82 % |
11.55 % |
mathieu TERNANT |
FRA |
NA |
1869.00 |
NA |
NA |
nicolas COLLIN |
BEL |
0.40 |
1865.67 |
36.61 % |
14.02 % |
anze PEHARC |
SLO |
0.38 |
1853.08 |
32.4 % |
10.49 % |
gabriele MORONI |
ITA |
NA |
1853.00 |
NA |
NA |
yufei PAN |
CHN |
NA |
1848.00 |
NA |
NA |
simon LORENZI |
BEL |
NA |
1843.00 |
NA |
NA |
nimrod MARCUS |
ISR |
NA |
1837.00 |
NA |
NA |
zan lovenjak SUDAR |
SLO |
NA |
1828.00 |
NA |
NA |
gholamali BARATZADEH |
IRI |
NA |
1824.00 |
NA |
NA |
zach GALLA |
USA |
NA |
1810.00 |
NA |
NA |
daiki SANO |
JPN |
NA |
1803.00 |
NA |
NA |
gregor VEZONIK |
SLO |
0.32 |
1802.82 |
27.54 % |
20.66 % |
satone YOSHIDA |
JPN |
0.31 |
1800.01 |
27.22 % |
20.39 % |
oscar BAUDRAND |
CAN |
0.28 |
1786.26 |
24.6 % |
7.39 % |
benjamin HANNA |
USA |
0.30 |
1781.21 |
17.55 % |
10.32 % |
alex KHAZANOV |
ISR |
NA |
1778.00 |
NA |
NA |
filip SCHENK |
ITA |
NA |
1770.00 |
NA |
NA |
nikolay RUSEV |
BUL |
0.26 |
1754.82 |
21.4 % |
6.24 % |
Prague.25
Prague.25: Semi-finals
Semi-finals
-Competitors = n.semis
-
competitor |
Ctry |
R |
results |
Expectation |
R.new |
E.Finals |
E.podium |
sorato ANRAKU |
JPN |
2488.31 |
1 |
0.96 |
2517.64 |
0.96 |
0.89 |
mejdi SCHALCK |
FRA |
2239.29 |
2 |
0.85 |
2266.47 |
0.86 |
0.66 |
sohta AMAGASA |
JPN |
2127.67 |
3 |
0.75 |
2152.67 |
0.76 |
0.50 |
dohyun LEE |
KOR |
2245.37 |
4 |
0.85 |
2267.61 |
0.86 |
0.66 |
yufei PAN |
CHN |
1848.00 |
5 |
0.37 |
1869.12 |
0.39 |
0.16 |
anze PEHARC |
SLO |
1853.08 |
6 |
0.38 |
1871.72 |
0.39 |
0.17 |
samuel RICHARD |
FRA |
1919.32 |
7 |
0.47 |
1935.24 |
0.48 |
0.22 |
hannes VAN DUYSEN |
BEL |
1897.31 |
8 |
0.44 |
1910.86 |
0.45 |
0.20 |
jack MACDOUGALL |
GBR |
1871.92 |
9 |
0.40 |
1883.11 |
0.41 |
0.17 |
antoine GIRARD |
FRA |
1940.54 |
10 |
0.50 |
1948.99 |
0.50 |
0.24 |
elias ARRIAGADA KRÜGER |
GER |
1938.73 |
11 |
0.50 |
1944.73 |
0.49 |
0.23 |
daiki SANO |
JPN |
1803.00 |
12 |
0.31 |
1807.06 |
0.31 |
0.12 |
max BERTONE |
FRA |
1940.54 |
12 |
0.50 |
1944.07 |
0.49 |
0.23 |
hamish MCARTHUR |
GBR |
2013.16 |
14 |
0.60 |
2011.48 |
0.59 |
0.31 |
adam ONDRA |
CZE |
2132.80 |
15 |
0.75 |
2128.25 |
0.74 |
0.46 |
adrien LEMAIRE |
FRA |
1946.86 |
15 |
0.51 |
1942.98 |
0.49 |
0.23 |
kento YAMAGUCHI |
JPN |
1940.54 |
17 |
0.50 |
1931.76 |
0.48 |
0.22 |
thomas LEMAGNER |
FRA |
1905.26 |
18 |
0.45 |
1894.16 |
0.42 |
0.18 |
jan-luca POSCH |
AUT |
1967.08 |
19 |
0.54 |
1953.27 |
0.51 |
0.24 |
toby ROBERTS |
GBR |
2079.30 |
20 |
0.69 |
2062.61 |
0.66 |
0.37 |
matteo REUSA |
ITA |
1940.54 |
21 |
0.50 |
1921.92 |
0.46 |
0.21 |
nicolai UZNIK |
AUT |
1893.97 |
22 |
0.43 |
1873.07 |
0.39 |
0.17 |
maximillian MILNE |
GBR |
1944.08 |
23 |
0.51 |
1920.52 |
0.46 |
0.21 |
nicolas COLLIN |
BEL |
1865.67 |
24 |
0.39 |
1839.96 |
0.35 |
0.14 |
lucas TRANDAFIR |
GER |
1917.52 |
25 |
0.47 |
1889.14 |
0.41 |
0.18 |
lasse VON FREIER |
GER |
1920.19 |
26 |
0.47 |
1889.34 |
0.41 |
0.18 |
julien CLÉMENCE |
SUI |
1905.33 |
27 |
0.45 |
1872.08 |
0.39 |
0.17 |
#####_ Elo History _
Elo Accumulated Prague.25 Semis
Finals
-Competitors = n.final
-
#####_ Elo History _
Elo Accumulated Prague.25 Final
Prob to Finals[POstFinals] - CIs
Prob.Podium[POST FINAL] - CIs
LS0tDQp0aXRsZTogIklGU0NfRWxvX0JPVUxERVJfTWVuXzIwMjUiDQphdXRob3I6ICJGZWRlcmljbyBKLiBWaWxsYXRvcm8iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQotLS0NCg0KIyMjIyMgRnVlbnRlOiBbaWZzYy5vcmddKGlmc2Mub3JnKQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgZXZhbD19DQpsaWJyYXJ5KGZsZXhkYXNoYm9hcmQpDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gPSBGQUxTRSwNCgltZXNzYWdlID0gRkFMU0UsDQogIHdhcm5pbmcgPSBGQUxTRSwNCglpbmNsdWRlID0gRkFMU0UNCikNCmBgYCAgDQoNCmBgYHtyIHBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KaWYoIXJlcXVpcmUodGlkeXZlcnNlKSl7aW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIixyZXBvcyA9ICJodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnIil9DQppZighcmVxdWlyZShnb29nbGVzaGVldHM0KSl7aW5zdGFsbC5wYWNrYWdlcygiZ29vZ2xlc2hlZXRzNCIpfQ0KaWYoIXJlcXVpcmUoZ29vZ2xlZHJpdmUpKXtpbnN0YWxsLnBhY2thZ2VzKCJnb29nbGVkcml2ZSIpfQ0KaWYoIXJlcXVpcmUoZHBseXIpKXtpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpfQ0KaWYoIXJlcXVpcmUoaHR0cjIpKXtpbnN0YWxsLnBhY2thZ2VzKCJodHRyMiIpfQ0KaWYoIXJlcXVpcmUoanNvbmxpdGUpKXtpbnN0YWxsLnBhY2thZ2VzKCJqc29ubGl0ZSIpfQ0KaWYoIXJlcXVpcmUoUnNlbGVuaXVtKSl7aW5zdGFsbC5wYWNrYWdlcygiUnNlbGVuaXVtIil9DQppZighcmVxdWlyZShjaHJvbW90ZSkpe2luc3RhbGwucGFja2FnZXMoImNocm9tb3RlIil9DQppZighcmVxdWlyZShwdXJycikpe2luc3RhbGwucGFja2FnZXMoInB1cnJyIil9DQppZighcmVxdWlyZSh3ZG1hbikpe2luc3RhbGwucGFja2FnZXMoIndkbWFuIil9DQppZighcmVxdWlyZShEVCkpe2luc3RhbGwucGFja2FnZXMoIkRUIil9DQppZighcmVxdWlyZShwbG90bHkpKXtpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKX0NCmlmKCFyZXF1aXJlKGJvb3QpKXtpbnN0YWxsLnBhY2thZ2VzKCJib290Iil9DQoNCiMjDQpsaWJyYXJ5KGJvb3QpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGNocm9tb3RlKQ0KbGlicmFyeShwdXJycikNCmxpYnJhcnkod2RtYW4pDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGpzb25saXRlKQ0KbGlicmFyeShSU2VsZW5pdW0pDQoNCmxpYnJhcnkoZ29vZ2xlc2hlZXRzNCkNCmxpYnJhcnkoZ29vZ2xlZHJpdmUpDQoNCmBgYCAgDQoNCg0KIyMjIyMgUmVhZGluZyBEYXRhDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQoNCiNvcHRpb25zKGdhcmdsZV9vYXV0aF9lbWFpbCA9ICJ2aWxsYXRvcm9wYXpmakBkYXRhYW5hbHlzaXNsYWIuY29tIikNCiMNCnNzIDwtICJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xREZualBfREQ3bzQyTWxYV3Y3X1RzQi1QWkFwM2VEeTFpR1Q4bUJWWG1LRS9lZGl0P3VzcD1zaGFyaW5nIg0KaG9qYSA9IDENCnJhbmdvID0gIkExOno3MzgiDQpyYW5rcyA8LSByZWFkX3NoZWV0KHNzLA0KICAgICAgICAgICAgICAgIHNoZWV0PWhvamEsDQogICAgICAgICAgICAgICAgcmFuZ2U9IHJhbmdvLCANCiAgICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBUUlVFDQogICAgICAgICAgICAgICAgIywNCiAgICAgICAgICAgICAgICAjY29sX3R5cGVzID0gImMiDQogICAgICAgICAgICAgICAgKQ0KDQpyYW5rcyA8LSAgcmFua3MgJT4lDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLmZhY3RvcikNCiMjIyBFbG8gbGVhZCBKdW5lLTIwMjQNCnNzIDwtICJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xY2k1ZVdzcGN4NmFHaG1pN08yanplRHhDUVo4dVNVYnZZUENCaGlZcGZEZy9lZGl0P3VzcD1zaGFyaW5nIg0KaG9qYSA9ICJFbG9fTWVuJ3NfQm91bGRlcl9KdW5lXzIwMjQiDQpyYW5nbyA9ICJBMTpDNTEiDQplbG8uYWNjdW0gPC0gcmVhZF9zaGVldChzcywNCiAgICAgICAgICAgICAgICBzaGVldD1ob2phLA0KICAgICAgICAgICAgICAgIHJhbmdlPSByYW5nbywgDQogICAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gVFJVRQ0KICAgICAgICAgICAgICAgICMsDQogICAgICAgICAgICAgICAgI2NvbF90eXBlcyA9ICJjIg0KICAgICAgICAgICAgICAgICkNCg0KZWxvLmFjY3VtIDwtICBlbG8uYWNjdW0gJT4lDQogIG11dGF0ZV9pZihpcy5jaGFyYWN0ZXIsIGFzLmZhY3RvcikNCmVsby5ib3VsZGVyLm1lbi5hY2N1bSA8LSBlbG8uYWNjdW0gDQojIyMNCg0KZWxvLmJvdWxkZXIubWVuLmFjY3VtIDwtIGVsby5ib3VsZGVyLm1lbi5hY2N1bSAlPiUNCiAgICBzZXBhcmF0ZShjb21wZXRpdG9yLCBpbnRvID0gYygiZmlyc3QiLCAibGFzdCIpLCBzZXAgPSAiKD89XFxzK1xcUyskKSIsIHJlbW92ZSA9IEZBTFNFKSAlPiUgIA0KICAgIG11dGF0ZSgNCiAgICAgICAgY29tcGV0aXRvciA9IHBhc3RlKHN0cl90b19sb3dlcihzdHJfdHJpbShmaXJzdCkpLCBzdHJfdG9fdXBwZXIoc3RyX3RyaW0obGFzdCkpKQ0KICAgICkgJT4lDQogICAgc2VsZWN0KC1maXJzdCwgLWxhc3QpICAjIHJlbW92ZSBoZWxwZXIgY29sdW1ucw0KDQpgYGAgIA0KDQojIyMjIyBJbm5zYnJ1Y2sNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIHJvd3MucHJpbnQ9IDh9DQpib3VsZGVyX21lbiA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKGNvbXBlPT0iSW5uc2JydWNrIikgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAjICAgICBZZWFyPSB5ZWFyLA0KICAgICAgICAgICBDb21wZT0gY29tcGUsDQogICAgICBTdGFnZSA9IFN0YWdlLA0KICAgICAgICAgICBDb3VudHJ5ID0gQ291bnRyeSwNCiAgICAgICAgICAgRGF0ZT0gRGF0ZSwNCiAgICAgIFJhbmsgPSBSYW5rKSAlPiUNCiMgIHJlZnJhbWUocmFuaz0gUmFuaykgJT4lDQogIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvciArIENvdW50cnkgKyBDb21wZSB+IFN0YWdlLA0KICAgICAgICAgICAgICAgICAgdmFsdWUudmFyID0gIlJhbmsiLA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpib3VsZGVyX21lbiA8LSBhc190aWJibGUoYm91bGRlcl9tZW4pDQojIw0KYm91bGRlcl9tZW5bb3JkZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSxdIA0KIyMNCm4uc2VtaXMgPC0gbnJvdyhib3VsZGVyX21lblshaXMubmEoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSxdKQ0Kbi5maW5hbHMgPC0gbnJvdyhib3VsZGVyX21lblshaXMubmEoYm91bGRlcl9tZW4kRmluYWwpLF0pDQoNCmBgYCAgDQoNCiMjIyMjIElubnNicnVjazogU2VtaS1maW5hbHMNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCksIGMoMSwyLDYpXSAlPiUgcHJpbnQobj02MCkNCmBgYCAgDQoNCiMjIyMjIFNlbWktZmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLnNlbWlzYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbi5Jbm5zYnJ1Y2suc2VtaXMgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uSW5uc2JydWNrLnNlbWlzICU+JSBhbnRpX2pvaW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0Kbi5kZWJ1dCA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkY29tcGV0aXRvcikNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gYm91bGRlcl9tZW4uSW5uc2JydWNrLnNlbWlzICU+JSByaWdodF9qb2luKGVsby5ib3VsZGVyLm1lbi5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkRWxvWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGANCnN0ZGV2IDwtIHNkKHJlc3VsdHMsIG5hLnJtID0gVFJVRSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKG1lYW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtJEVsbyksIG4uZGVidXQgKSkpDQptZWRpYW5hIDwtIG1lZGlhbihib3VsZGVyX21lbiRgU2VtaS1maW5hbGBbIWlzLm5hKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCldKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCiMjIw0KZWxvLklubnNicnVjay5zZW1pcyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uID0gcm91bmQoRSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgI1Byb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAjIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5Jbm5zYnJ1Y2suc2VtaXMgPC0gYXNfdGliYmxlKGVsby5Jbm5zYnJ1Y2suc2VtaXMpDQoNCiMjIyMjIyMjIyMjDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGApDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldKQ0KUi5kZWJ1dCA8LSByZXAobWVhbihlbG8uYm91bGRlci5tZW4uYWNjdW0kRWxvKSwgbikNCm5hbWVzIDwtIGxhc3QuY29tcC5kZWJ1dFssMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmRlYnV0JENvdW50cnkNCiNjYXRlZyA8LSBib3VsZGVyX21lbi5hX2INClMgPC0gKChtZWRpYW5hLSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8uSW5uc2JydWNrLmRlYnV0IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb249IEUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDEpLCIlIiksDQogIyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIiUiKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5Jbm5zYnJ1Y2suZGVidXQgPC0gYXNfdGliYmxlKGVsby5Jbm5zYnJ1Y2suZGVidXQpDQoNCmVsby5Jbm5zYnJ1Y2suc2VtaXMgPC0gZWxvLklubnNicnVjay5zZW1pcyAlPiUgcmJpbmQoZWxvLklubnNicnVjay5kZWJ1dCkNCg0KIyMjIyBQcm9iLkZpbmFsZXMgDQoNCiNtYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNCmVsby5sYXN0LmNvbXAgPC0gZWxvLklubnNicnVjay5zZW1pcw0KUi5uZXcgPC0gZWxvLmxhc3QuY29tcCRSLm5ldw0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs3XSAtIFIubmV3KS9EICkpKQ0KIyMjIFByb2IuIFBvZGl1bQ0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLmxhc3QuY29tcCAlPiUNCiAgbXV0YXRlKEUuRmluYWxzPSByb3VuZChQcm9iLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtPSByb3VuZChQcm9iLnBvZGl1bSwyKSwNCiAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMiksIiUiKSwNCiAgICAgICAgIFByb2IucG9kaXVtPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiAlIikNCiAgICAgICAgICkNCiAgDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcFtvcmRlcihlbG8ubGFzdC5jb21wJHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCw5KV0pDQoNCmBgYCAgDQoNCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIklubnNicnVjay5zZW1pcyINCiNlbG8uaGlzdG9yeS5sYXN0IDwtIGVsby4yMi5hY2N1bS50b19zdWIxNiAlPiUgDQojICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSksDQogIyAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpKQ0KIw0KI2Vsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KIyMgDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5Jbm5zYnJ1Y2suc2VtaXMkY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeS5sYXN0DQoNCmBgYCAgDQoNCg0KIyMjIyMgKipFbG8gQWNjdW11bGF0ZWQgSW5uc2JydWNrIFNlbWlzKioNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5ib3VsZGVyLm1lbi5hY2N1bSAlPiUNCiAgcmVuYW1lKFIubmV3PSBFbG8pDQojZWxvLmxhc3QuY29tcCA8LSBlbG8uSW5uc2JydWNrLnNlbWlzDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNywxMCwxMSldKQ0KYGBgICANCg0KDQoNCiMjIyMjIElubnNicnVjazogRmluYWwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KDQojIyMjIyBGaW5hbHMgDQoqLUNvbXBldGl0b3JzID0gYG4uZmluYWxgLSoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuLklubnNicnVjay5maW5hbCA8LSBib3VsZGVyX21lblssYygxLDIsNCldICU+JSBmaWx0ZXIoYm91bGRlcl9tZW4kRmluYWwhPSJOQSIpIA0KIw0KI2xhc3QuY29tcC5kZWJ1dCA8LSBib3VsZGVyX21lbi5Jbm5zYnJ1Y2suZmluYWwgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCiNuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5Jbm5zYnJ1Y2suZmluYWwgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGMkRmluYWxbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCnN0ZGV2IDwtIHNkKHJlc3VsdHMsIG5hLnJtID0gVFJVRSkNCiMNCiNhdmcucGxheWVyIDwtIG1lZGlhbihjKFINCiAgICAgICAgICAgICAgICAgICAgICMsIHJlcChtZWFuKFIpLCBuLmRlYnV0ICkNCiAgICAgICAgICAgICAgICAgIyAgICApKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGJvdWxkZXJfbWVuJEZpbmFsWyFpcy5uYShib3VsZGVyX21lbiRGaW5hbCldKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGMoMTo2KSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQojDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KDQoNCmVsby5Jbm5zYnJ1Y2suZmluYWwgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb249IEUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICNQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIiUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICMgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uSW5uc2JydWNrLmZpbmFsIDwtIGFzX3RpYmJsZShlbG8uSW5uc2JydWNrLmZpbmFsKQ0KDQojIyMgUHJvYi5GaW5hbGVzIChzYW1lIGFzIFNlbWlzKQ0KUHJvYi5GaW5hbHMgPC0gZWxvLmxhc3QuY29tcCAlPiUgDQogICAgc2VtaV9qb2luKGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksIGMoImNvbXBldGl0b3IiLCAiRS5GaW5hbHMiKV0sIGJ5ID0gImNvbXBldGl0b3IiKSAlPiUgDQogICAgbXV0YXRlKG9yZGVyID0gbWF0Y2goY29tcGV0aXRvciwgbGFzdC5jb21wLmNhbGMkY29tcGV0aXRvcikpICU+JSANCiAgICBhcnJhbmdlKG9yZGVyKSAlPiUNCiAgICBzZWxlY3QoRS5GaW5hbHMpDQojIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8uSW5uc2JydWNrLmZpbmFsDQpSLm5ldyA8LSBlbG8ubGFzdC5jb21wJFIubmV3DQoNCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLSBSLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8ubGFzdC5jb21wICU+JQ0KICBtdXRhdGUoRS5GaW5hbHMgPSByb3VuZChQcm9iLkZpbmFscyRFLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtID0gcm91bmQoUHJvYi5wb2RpdW0sMiksDQogICAgICAgICBQcm9iLkZpbmFscyA9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzJEUuRmluYWxzKjEwMCwyKSwiJSIpLA0KICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiUiKSwNCiAgICAgICAgICkNCg0KYGBgICANCg0KDQoNCiMjIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXANCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIklubnNicnVjay5maW5hbCINCiMNCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCmBgYCAgDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIElubnNicnVjayBGaW5hbCoqDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCiMjDQoNCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8uYWNjdW0gJT4lIA0KIyAgcmVuYW1lKFIubmV3PSBFbG8pDQojZWxvLmxhc3QuY29tcCA8LSBlbG8uSW5uc2JydWNrLmZpbmFsDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDgsOSldKQ0KYGBgICANCg0KDQojIyMjIyBQcmFndWUuMjAyNCAgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIHJvd3MucHJpbnQ9IDh9DQpib3VsZGVyX21lbiA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKGNvbXBlPT0iUHJhZ3VlLjIwMjQiKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICMgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBjb21wZSwNCiAgICAgIFN0YWdlID0gU3RhZ2UsDQogICAgICAgICAgIENvdW50cnkgPSBDb3VudHJ5LA0KICAgICAgICAgICBEYXRlPSBEYXRlLA0KICAgICAgUmFuayA9IFJhbmspICU+JQ0KIyAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgQ291bnRyeSArIENvbXBlICB+IFN0YWdlLA0KICAgICAgICAgICAgICAgICAgdmFsdWUudmFyID0gIlJhbmsiLA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpib3VsZGVyX21lbiA8LSBhc190aWJibGUoYm91bGRlcl9tZW4pDQojIw0KYm91bGRlcl9tZW5bb3JkZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSxdIA0KIyMNCm4uc2VtaXMgPC0gbnJvdyhib3VsZGVyX21lblshaXMubmEoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSxdKQ0Kbi5maW5hbHMgPC0gbnJvdyhib3VsZGVyX21lblshaXMubmEoYm91bGRlcl9tZW4kRmluYWwpLF0pDQoNCmBgYCAgDQoNCg0KIyMjIyMgUHJhZ3VlLjIwMjQ6IFNlbWktZmluYWxzDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLCBjKDEsMiw2KV0gJT4lIHByaW50KG49NjApDQpgYGAgIA0KDQojIyMjIyBTZW1pLWZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5zZW1pc2AtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW4uUHJhZ3VlLjIwMjQuc2VtaXMgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uUHJhZ3VlLjIwMjQuc2VtaXMgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5QcmFndWUuMjAyNC5zZW1pcyAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCnN0ZGV2IDwtIHNkKHJlc3VsdHMsIG5hLnJtID0gVFJVRSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKG1lYW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtJEVsbyksIG4uZGVidXQgKSksIG5hLnJtID0gVCkNCm1lZGlhbmEgPC0gbWVkaWFuKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYFshaXMubmEoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKV0pDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KIyMjDQplbG8uUHJhZ3VlLjIwMjQuc2VtaXMgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uUHJhZ3VlLjIwMjQuc2VtaXMgPC0gYXNfdGliYmxlKGVsby5QcmFndWUuMjAyNC5zZW1pcykNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGApDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldKQ0KUi5kZWJ1dCA8LSByZXAobWVhbihlbG8uYm91bGRlci5tZW4uYWNjdW0kRWxvKSwgbikNCm5hbWVzIDwtIGxhc3QuY29tcC5kZWJ1dFssMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmRlYnV0JENvdW50cnkNCiNjYXRlZyA8LSBib3VsZGVyX21lbi5hX2INClMgPC0gKChtZWRpYW5hLSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8uUHJhZ3VlLjIwMjQuZGVidXQgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5QcmFndWUuMjAyNC5kZWJ1dCA8LSBhc190aWJibGUoZWxvLlByYWd1ZS4yMDI0LmRlYnV0KQ0KDQplbG8uUHJhZ3VlLjIwMjQuc2VtaXMgPC0gZWxvLlByYWd1ZS4yMDI0LnNlbWlzICU+JSByYmluZChlbG8uUHJhZ3VlLjIwMjQuZGVidXQpDQoNCiMjIyMjIyMjIyMjDQojDQojIyMgUHJvYi5GaW5hbGVzIA0KDQojbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQplbG8ubGFzdC5jb21wIDwtIGVsby5QcmFndWUuMjAyNC5zZW1pcw0KUi5uZXcgPC0gZWxvLmxhc3QuY29tcCRSLm5ldw0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs3XSAtIFIubmV3KS9EICkpKQ0KIyMjIFByb2IuIFBvZGl1bQ0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLmxhc3QuY29tcCAlPiUNCiAgbXV0YXRlKEUuRmluYWxzPSByb3VuZChQcm9iLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtPSByb3VuZChQcm9iLnBvZGl1bSwyKSwNCiAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMiksIiUiKSwNCiAgICAgICAgIFByb2IucG9kaXVtPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiAlIikNCiAgICAgICAgICkNCg0KIA0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXBbb3JkZXIoZWxvLmxhc3QuY29tcCRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgsOSldKQ0KDQpgYGAgIA0KDQoNCiMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7ciBldmFsPVRSVUV9DQojDQojIFNhY2FuZG8gc3ViMTYNCmNvbXBlIDwtICJQcmFndWUuMjAyNC5zZW1pcyINCiNlbG8uaGlzdG9yeS5sYXN0IDwtIGVsby4yMi5hY2N1bS50b19zdWIxNiAlPiUgDQojICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSksDQogIyAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpKQ0KIw0KI2Vsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KIyMgDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5QcmFndWUuMjAyNC5zZW1pcyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQoNCmBgYCAgDQoNCg0KDQojIyMjIyAqKkVsbyBBY2N1bXVsYXRlZCBQcmFndWUuMjAyNCBTZW1pcyoqDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIw0KDQojZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmFjY3VtICU+JSANCiMgIHJlbmFtZShSLm5ldz0gRWxvKQ0KI2Vsby5sYXN0LmNvbXAgPC0gZWxvLlByYWd1ZS4yMDI0LnNlbWlzDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDEwLDExKV0pDQpgYGAgIA0KDQoNCg0KIyMjIyMgUHJhZ3VlLjIwMjQ6IEZpbmFsDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRGaW5hbCksIGMoMSwyLDQpXSAlPiUgcHJpbnQobj02MCkNCmBgYCAgDQoNCiMjIyMjIEZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5maW5hbGAtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW4uUHJhZ3VlLjIwMjQuZmluYWwgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDQpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJEZpbmFsIT0iTkEiKSANCiMNCiNsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uUHJhZ3VlLjIwMjQuZmluYWwgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCiNuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5QcmFndWUuMjAyNC5maW5hbCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cywgbmEucm0gPSBUUlVFKQ0KIw0KI2F2Zy5wbGF5ZXIgPC0gbWVhbihjKFINCiAgICAgICAgICAgICAgICAgICAgICMsIHJlcChtZWFuKFIpLCBuLmRlYnV0ICkNCiAjICAgICAgICAgICAgICAgICAgICApKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGJvdWxkZXJfbWVuJEZpbmFsWyFpcy5uYShib3VsZGVyX21lbiRGaW5hbCldKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGMoMTo2KSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNCiNFIDwtIDEvKDErKDEwXiggKCBzb3J0KFIsIGRlY3JlYXNpbmcgPSBUUlVFKVs4XSAtUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KIyMjDQplbG8uUHJhZ3VlLjIwMjQuZmluYWwgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb24gPSByb3VuZChFLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCmVsby5QcmFndWUuMjAyNC5maW5hbCA8LSBhc190aWJibGUoZWxvLlByYWd1ZS4yMDI0LmZpbmFsKQ0KIyMjIFByb2IuRmluYWxlcyAoc2FtZSBhcyBTZW1pcykNClByb2IuRmluYWxzIDwtIGVsby5sYXN0LmNvbXAgJT4lIA0KICAgIHNlbWlfam9pbihsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpLCBjKCJjb21wZXRpdG9yIiwgIkUuRmluYWxzIildLCBieSA9ICJjb21wZXRpdG9yIikgJT4lIA0KICAgIG11dGF0ZShvcmRlciA9IG1hdGNoKGNvbXBldGl0b3IsIGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3IpKSAlPiUgDQogICAgYXJyYW5nZShvcmRlcikgJT4lDQogICAgc2VsZWN0KEUuRmluYWxzKQ0KIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLlByYWd1ZS4yMDI0LmZpbmFsDQpSLm5ldyA8LSBlbG8ubGFzdC5jb21wJFIubmV3DQoNCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLSBSLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8ubGFzdC5jb21wICU+JQ0KICBtdXRhdGUoRS5GaW5hbHMgPSByb3VuZChQcm9iLkZpbmFscyRFLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtID0gcm91bmQoUHJvYi5wb2RpdW0sMiksDQogICAgICAgICBQcm9iLkZpbmFscyA9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzJEUuRmluYWxzKjEwMCwyKSwiJSIpLA0KICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiUiKSwNCiAgICAgICAgICkNCmBgYCAgDQoNCg0KIyMjIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3IgZXZhbD1UUlVFfQ0KIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcA0KIyBTYWNhbmRvIHN1YjE2DQpjb21wZSA8LSAiUHJhZ3VlLjIwMjQuZmluYWwiDQojDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQpgYGAgIA0KDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIFByYWd1ZS4yMDI0IEZpbmFsKioNCg0KYGBge3IgaW5jbHVkZT1UfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCiNlbG8ubGFzdC5jb21wIDwtIGVsby5QcmFndWUuMjAyNC5zZW1pcw0KIyMjDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcCwgYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wICU+JSBmdWxsX2pvaW4oZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNywxMCwxMSldKQ0KYGBgICAgDQoNCg0KIyMjIyMgU2VvdWwuMjAyNCAgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIHJvd3MucHJpbnQ9IDh9DQpib3VsZGVyX21lbiA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKGNvbXBlPT0iU2VvdWwuMjAyNCIpICU+JQ0KICBncm91cF9ieShjb21wZXRpdG9yPSBOYW1lLA0KICAgICAgIyAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IGNvbXBlLA0KICAgICAgU3RhZ2UgPSBTdGFnZSwNCiAgICAgICAgICAgQ291bnRyeSA9IENvdW50cnksDQogICAgICAgICAgIERhdGU9IERhdGUsDQogICAgICBSYW5rID0gUmFuaykgJT4lDQojICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBDb3VudHJ5ICsgQ29tcGUgIH4gU3RhZ2UsDQogICAgICAgICAgICAgICAgICB2YWx1ZS52YXIgPSAiUmFuayIsDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQoNCmJvdWxkZXJfbWVuIDwtIGFzX3RpYmJsZShib3VsZGVyX21lbikNCiMjDQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLF0gDQojIw0Kbi5zZW1pcyA8LSBucm93KGJvdWxkZXJfbWVuWyFpcy5uYShib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLF0pDQpuLmZpbmFscyA8LSBucm93KGJvdWxkZXJfbWVuWyFpcy5uYShib3VsZGVyX21lbiRGaW5hbCksXSkNCg0KYGBgICANCg0KDQojIyMjIyBTZW91bC4yMDI0OiBTZW1pLWZpbmFscw0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW5bb3JkZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSwgYygxLDIsNildICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIyMgU2VtaS1maW5hbHMgDQoqLUNvbXBldGl0b3JzID0gYG4uc2VtaXNgLSoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuLlNlb3VsLjIwMjQuc2VtaXMgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uU2VvdWwuMjAyNC5zZW1pcyAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGJvdWxkZXJfbWVuLlNlb3VsLjIwMjQuc2VtaXMgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcChtZWFuKGVsby5ib3VsZGVyLm1lbi5hY2N1bSRFbG8pLCBuLmRlYnV0ICkpLCBuYS5ybSA9IFQpDQptZWRpYW5hIDwtIG1lZGlhbihib3VsZGVyX21lbiRgU2VtaS1maW5hbGBbIWlzLm5hKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCldKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCiMjIw0KZWxvLlNlb3VsLjIwMjQuc2VtaXMgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uU2VvdWwuMjAyNC5zZW1pcyA8LSBhc190aWJibGUoZWxvLlNlb3VsLjIwMjQuc2VtaXMpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKQ0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIuZGVidXQgPC0gcmVwKG1lYW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtJEVsbyksIG4pDQpuYW1lcyA8LSBsYXN0LmNvbXAuZGVidXRbLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5kZWJ1dCRDb3VudHJ5DQojY2F0ZWcgPC0gYm91bGRlcl9tZW4uYV9iDQpTIDwtICgobWVkaWFuYS0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLlNlb3VsLjIwMjQuZGVidXQgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5TZW91bC4yMDI0LmRlYnV0IDwtIGFzX3RpYmJsZShlbG8uU2VvdWwuMjAyNC5kZWJ1dCkNCg0KZWxvLlNlb3VsLjIwMjQuc2VtaXMgPC0gZWxvLlNlb3VsLjIwMjQuc2VtaXMgJT4lIHJiaW5kKGVsby5TZW91bC4yMDI0LmRlYnV0KQ0KDQojIyMjIyMjIyMjIw0KIw0KIyMjIFByb2IuRmluYWxlcyANCg0KI21heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KZWxvLmxhc3QuY29tcCA8LSBlbG8uU2VvdWwuMjAyNC5zZW1pcw0KUi5uZXcgPC0gZWxvLmxhc3QuY29tcCRSLm5ldw0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs3XSAtIFIubmV3KS9EICkpKQ0KIyMjIFByb2IuIFBvZGl1bQ0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLmxhc3QuY29tcCAlPiUNCiAgbXV0YXRlKEUuRmluYWxzPSByb3VuZChQcm9iLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtPSByb3VuZChQcm9iLnBvZGl1bSwyKSwNCiAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMiksIiUiKSwNCiAgICAgICAgIFByb2IucG9kaXVtPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiAlIikNCiAgICAgICAgICkNCg0KIA0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXBbb3JkZXIoZWxvLmxhc3QuY29tcCRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgsOSldKQ0KDQpgYGAgIA0KDQoNCiMjIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIlNlb3VsLjIwMjQuc2VtaXMiDQojZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8uMjIuYWNjdW0udG9fc3ViMTYgJT4lIA0KIyAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpLA0KICMgICAgICAgIGNhdGVnID0gcmVwKCJTdWIxNk0iLCBsZW5ndGgoZWxvLjIyLmFjY3VtLnRvX3N1YjE2JGNvbXBldGl0b3IpKSkNCiMNCiNlbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCiMjIA0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8uU2VvdWwuMjAyNC5zZW1pcyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQoNCmBgYCAgDQoNCg0KDQojIyMjIyAqKkVsbyBBY2N1bXVsYXRlZCBTZW91bC4yMDI0IFNlbWlzKioNCg0KYGBge3IgaW5jbHVkZT1GfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCiNlbG8ubGFzdC5jb21wIDwtIGVsby5TZW91bC4yMDI0LnNlbWlzDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDEwLDExKV0pDQpgYGAgIA0KDQoNCg0KIyMjIyMgU2VvdWwuMjAyNDogRmluYWwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIyMgRmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLmZpbmFsYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbi5TZW91bC4yMDI0LmZpbmFsIDwtIGJvdWxkZXJfbWVuWyxjKDEsMiw0KV0gJT4lIGZpbHRlcihib3VsZGVyX21lbiRGaW5hbCE9Ik5BIikgDQojDQojbGFzdC5jb21wLmRlYnV0IDwtIGJvdWxkZXJfbWVuLlNlb3VsLjIwMjQuZmluYWwgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCiNuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5TZW91bC4yMDI0LmZpbmFsICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5jYWxjJENvdW50cnlbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQojYXZnLnBsYXllciA8LSBtZWFuKGMoUg0KICAgICAgICAgICAgICAgICAgICAgIywgcmVwKG1lYW4oUiksIG4uZGVidXQgKQ0KICMgICAgICAgICAgICAgICAgICAgICkpDQojbWVkaWFuYSA8LSBtZWRpYW4oYm91bGRlcl9tZW4kRmluYWxbIWlzLm5hKGJvdWxkZXJfbWVuJEZpbmFsKV0pDQojbWVkaWFuYSA8LSBtZWRpYW4oYygxOjYpKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KI0UgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUiwgZGVjcmVhc2luZyA9IFRSVUUpWzhdIC1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojIyMNCmVsby5TZW91bC4yMDI0LmZpbmFsIDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmNhbGMkRmluYWxbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uID0gcm91bmQoRSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKQ0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KDQplbG8uU2VvdWwuMjAyNC5maW5hbCA8LSBhc190aWJibGUoZWxvLlNlb3VsLjIwMjQuZmluYWwpDQojIyMgUHJvYi5GaW5hbGVzIChzYW1lIGFzIFNlbWlzKQ0KUHJvYi5GaW5hbHMgPC0gZWxvLmxhc3QuY29tcCAlPiUgDQogICAgc2VtaV9qb2luKGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksIGMoImNvbXBldGl0b3IiLCAiRS5GaW5hbHMiKV0sIGJ5ID0gImNvbXBldGl0b3IiKSAlPiUgDQogICAgbXV0YXRlKG9yZGVyID0gbWF0Y2goY29tcGV0aXRvciwgbGFzdC5jb21wLmNhbGMkY29tcGV0aXRvcikpICU+JSANCiAgICBhcnJhbmdlKG9yZGVyKSAlPiUNCiAgICBzZWxlY3QoRS5GaW5hbHMpDQojIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8uU2VvdWwuMjAyNC5maW5hbA0KUi5uZXcgPC0gZWxvLmxhc3QuY29tcCRSLm5ldw0KDQojbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC0gUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLmxhc3QuY29tcCAlPiUNCiAgbXV0YXRlKEUuRmluYWxzID0gcm91bmQoUHJvYi5GaW5hbHMkRS5GaW5hbHMsMiksDQogICAgICAgICBFLnBvZGl1bSA9IHJvdW5kKFByb2IucG9kaXVtLDIpLA0KICAgICAgICAgUHJvYi5GaW5hbHMgPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyRFLkZpbmFscyoxMDAsMiksIiUiKSwNCiAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDIpLCIlIiksDQogICAgICAgICApDQpgYGAgIA0KDQoNCiMjIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXANCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIlNlb3VsLjIwMjQuZmluYWwiDQojDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQpgYGAgIA0KDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIFNlb3VsLjIwMjQgRmluYWwqKg0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIw0KDQojZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmFjY3VtICU+JSANCiMgIHJlbmFtZShSLm5ldz0gRWxvKQ0KI2Vsby5sYXN0LmNvbXAgPC0gZWxvLlNlb3VsLjIwMjQuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsMTAsMTEpXSkNCmBgYCAgIA0KDQoNCg0KIyMjIyMgS2VxaWFvLjIwMjUgIA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFLCByb3dzLnByaW50PSA4fQ0KYm91bGRlcl9tZW4gPC0gcmFua3MgJT4lDQogIGZpbHRlcihjb21wZT09IktlcWlhby4yMDI1IikgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3I9IE5hbWUsDQogICAgICAjICAgICBZZWFyPSB5ZWFyLA0KICAgICAgICAgICBDb21wZT0gY29tcGUsDQogICAgICBTdGFnZSA9IFN0YWdlLA0KICAgICAgICAgICBDb3VudHJ5ID0gQ291bnRyeSwNCiAgICAgICAgICAgRGF0ZT0gRGF0ZSwNCiAgICAgIFJhbmsgPSBSYW5rKSAlPiUNCiMgIHJlZnJhbWUocmFuaz0gUmFuaykgJT4lDQogIHJlc2hhcGUyOjpkY2FzdChmb3JtdWxhID0gY29tcGV0aXRvciArIENvdW50cnkgKyBDb21wZSAgfiBTdGFnZSwNCiAgICAgICAgICAgICAgICAgIHZhbHVlLnZhciA9ICJSYW5rIiwNCiAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkNCg0KYm91bGRlcl9tZW4gPC0gYXNfdGliYmxlKGJvdWxkZXJfbWVuKQ0KIyMNCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCksXSANCiMjDQpuLnNlbWlzIDwtIG5yb3coYm91bGRlcl9tZW5bIWlzLm5hKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCksXSkNCm4uZmluYWxzIDwtIG5yb3coYm91bGRlcl9tZW5bIWlzLm5hKGJvdWxkZXJfbWVuJEZpbmFsKSxdKQ0KDQpgYGAgIA0KDQoNCiMjIyMjIEtlcWlhby4yMDI1OiBTZW1pLWZpbmFscw0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW5bb3JkZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSwgYygxLDIsNildICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIyMgU2VtaS1maW5hbHMgDQoqLUNvbXBldGl0b3JzID0gYG4uc2VtaXNgLSoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuLktlcWlhby4yMDI1LnNlbWlzIDwtIGJvdWxkZXJfbWVuWyxjKDEsMiw2KV0gJT4lIGZpbHRlcihib3VsZGVyX21lbiRgU2VtaS1maW5hbGAhPSJOQSIpIA0KIw0KbGFzdC5jb21wLmRlYnV0IDwtIGJvdWxkZXJfbWVuLktlcWlhby4yMDI1LnNlbWlzICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0Kbi5kZWJ1dCA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkY29tcGV0aXRvcikNCiMjIw0KbGFzdC5jb21wLmNhbGMgPC0gYm91bGRlcl9tZW4uS2VxaWFvLjIwMjUuc2VtaXMgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcChtZWFuKGVsby5ib3VsZGVyLm1lbi5hY2N1bSRFbG8pLCBuLmRlYnV0ICkpLCBuYS5ybSA9IFQpDQptZWRpYW5hIDwtIG1lZGlhbihib3VsZGVyX21lbiRgU2VtaS1maW5hbGBbIWlzLm5hKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCldKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCiMjIw0KZWxvLktlcWlhby4yMDI1LnNlbWlzIDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb24gPSByb3VuZChFLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLktlcWlhby4yMDI1LnNlbWlzIDwtIGFzX3RpYmJsZShlbG8uS2VxaWFvLjIwMjUuc2VtaXMpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKQ0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIuZGVidXQgPC0gcmVwKG1lYW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtJEVsbyksIG4pDQpuYW1lcyA8LSBsYXN0LmNvbXAuZGVidXRbLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5kZWJ1dCRDb3VudHJ5DQojY2F0ZWcgPC0gYm91bGRlcl9tZW4uYV9iDQpTIDwtICgobWVkaWFuYS0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLktlcWlhby4yMDI1LmRlYnV0IDwtIGNiaW5kKG5hbWVzID0gbmFtZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDdHJ5PSBjb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IFIuZGVidXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb24gPSByb3VuZChFLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uS2VxaWFvLjIwMjUuZGVidXQgPC0gYXNfdGliYmxlKGVsby5LZXFpYW8uMjAyNS5kZWJ1dCkNCg0KZWxvLktlcWlhby4yMDI1LnNlbWlzIDwtIGVsby5LZXFpYW8uMjAyNS5zZW1pcyAlPiUgcmJpbmQoZWxvLktlcWlhby4yMDI1LmRlYnV0KQ0KDQojIyMjIyMjIyMjIw0KIw0KIyMjIFByb2IuRmluYWxlcyANCg0KI21heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KZWxvLmxhc3QuY29tcCA8LSBlbG8uS2VxaWFvLjIwMjUuc2VtaXMNClIubmV3IDwtIGVsby5sYXN0LmNvbXAkUi5uZXcNClByb2IuRmluYWxzIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbOV0gLSBSLm5ldykvRCApKSkNCiMjIyBQcm9iLiBQb2RpdW0NCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLVIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wIDwtIGVsby5sYXN0LmNvbXAgJT4lDQogIG11dGF0ZShFLkZpbmFscz0gcm91bmQoUHJvYi5GaW5hbHMsMiksDQogICAgICAgICBFLnBvZGl1bT0gcm91bmQoUHJvYi5wb2RpdW0sMiksDQogICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLDIpLCIlIiksDQogICAgICAgICBQcm9iLnBvZGl1bT0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDIpLCIgJSIpDQogICAgICAgICApDQoNCiANCiMjIyMjICMjIyMjIyMjIyMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5jb21wW29yZGVyKGVsby5sYXN0LmNvbXAkcmVzdWx0cyksYygxLDIsMyw0LDYsNyw4LDkpXSkNCg0KYGBgICANCg0KDQojIyMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7ciBldmFsPVRSVUV9DQojDQojIFNhY2FuZG8gc3ViMTYNCmNvbXBlIDwtICJLZXFpYW8uMjAyNS5zZW1pcyINCiNlbG8uaGlzdG9yeS5sYXN0IDwtIGVsby4yMi5hY2N1bS50b19zdWIxNiAlPiUgDQojICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSksDQogIyAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpKQ0KIw0KI2Vsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KIyMgDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5LZXFpYW8uMjAyNS5zZW1pcyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQoNCmBgYCAgDQoNCg0KDQojIyMjIyAqKkVsbyBBY2N1bXVsYXRlZCBLZXFpYW8uMjAyNSBTZW1pcyoqDQoNCmBgYHtyIGluY2x1ZGU9Rn0NCiMjDQoNCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8uYWNjdW0gJT4lIA0KIyAgcmVuYW1lKFIubmV3PSBFbG8pDQojZWxvLmxhc3QuY29tcCA8LSBlbG8uS2VxaWFvLjIwMjUuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsMTAsMTEpXSkNCmBgYCAgDQoNCg0KDQojIyMjIyBLZXFpYW8uMjAyNTogRmluYWwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIyMgRmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLmZpbmFsYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbi5LZXFpYW8uMjAyNS5maW5hbCA8LSBib3VsZGVyX21lblssYygxLDIsNCldICU+JSBmaWx0ZXIoYm91bGRlcl9tZW4kRmluYWwhPSJOQSIpIA0KIw0KI2xhc3QuY29tcC5kZWJ1dCA8LSBib3VsZGVyX21lbi5LZXFpYW8uMjAyNS5maW5hbCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KI24uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGJvdWxkZXJfbWVuLktlcWlhby4yMDI1LmZpbmFsICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5jYWxjJENvdW50cnlbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQojYXZnLnBsYXllciA8LSBtZWFuKGMoUg0KICAgICAgICAgICAgICAgICAgICAgIywgcmVwKG1lYW4oUiksIG4uZGVidXQgKQ0KICMgICAgICAgICAgICAgICAgICAgICkpDQojbWVkaWFuYSA8LSBtZWRpYW4oYm91bGRlcl9tZW4kRmluYWxbIWlzLm5hKGJvdWxkZXJfbWVuJEZpbmFsKV0pDQojbWVkaWFuYSA8LSBtZWRpYW4oYygxOjYpKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KI0UgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUiwgZGVjcmVhc2luZyA9IFRSVUUpWzhdIC1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojIyMNCmVsby5LZXFpYW8uMjAyNS5maW5hbCA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KZWxvLktlcWlhby4yMDI1LmZpbmFsIDwtIGFzX3RpYmJsZShlbG8uS2VxaWFvLjIwMjUuZmluYWwpDQojIyMgUHJvYi5GaW5hbGVzIChzYW1lIGFzIFNlbWlzKQ0KUHJvYi5GaW5hbHMgPC0gZWxvLmxhc3QuY29tcCAlPiUgDQogICAgc2VtaV9qb2luKGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksIGMoImNvbXBldGl0b3IiLCAiRS5GaW5hbHMiKV0sIGJ5ID0gImNvbXBldGl0b3IiKSAlPiUgDQogICAgbXV0YXRlKG9yZGVyID0gbWF0Y2goY29tcGV0aXRvciwgbGFzdC5jb21wLmNhbGMkY29tcGV0aXRvcikpICU+JSANCiAgICBhcnJhbmdlKG9yZGVyKSAlPiUNCiAgICBzZWxlY3QoRS5GaW5hbHMpDQojIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8uS2VxaWFvLjIwMjUuZmluYWwNClIubmV3IDwtIGVsby5sYXN0LmNvbXAkUi5uZXcNCg0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtIFIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wIDwtIGVsby5sYXN0LmNvbXAgJT4lDQogIG11dGF0ZShFLkZpbmFscyA9IHJvdW5kKFByb2IuRmluYWxzJEUuRmluYWxzLDIpLA0KICAgICAgICAgRS5wb2RpdW0gPSByb3VuZChQcm9iLnBvZGl1bSwyKSwNCiAgICAgICAgIFByb2IuRmluYWxzID0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMkRS5GaW5hbHMqMTAwLDIpLCIlIiksDQogICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwyKSwiJSIpLA0KICAgICAgICAgKQ0KYGBgICANCg0KDQojIyMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7ciBldmFsPVRSVUV9DQojDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wDQojIFNhY2FuZG8gc3ViMTYNCmNvbXBlIDwtICJLZXFpYW8uMjAyNS5maW5hbCINCiMNCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCmBgYCAgDQoNCg0KDQojIyMjIyAqKkVsbyBBY2N1bXVsYXRlZCBLZXFpYW8uMjAyNSBGaW5hbCoqDQoNCmBgYHtyIGluY2x1ZGU9Rn0NCiMjDQoNCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8uYWNjdW0gJT4lIA0KIyAgcmVuYW1lKFIubmV3PSBFbG8pDQojZWxvLmxhc3QuY29tcCA8LSBlbG8uS2VxaWFvLjIwMjUuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsMTAsMTEpXSkNCmBgYCAgIA0KDQoNCiMjIyMjIEN1cml0aWJhICANCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcm93cy5wcmludD0gOH0NCmJvdWxkZXJfbWVuIDwtIHJhbmtzICU+JQ0KICBmaWx0ZXIoY29tcGU9PSJDdXJpdGliYSIpICU+JQ0KICBncm91cF9ieShjb21wZXRpdG9yPSBOYW1lLA0KICAgICAgIyAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IGNvbXBlLA0KICAgICAgU3RhZ2UgPSBTdGFnZSwNCiAgICAgICAgICAgQ291bnRyeSA9IENvdW50cnksDQogICAgICAgICAgIERhdGU9IERhdGUsDQogICAgICBSYW5rID0gUmFuaykgJT4lDQojICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBDb3VudHJ5ICsgQ29tcGUgIH4gU3RhZ2UsDQogICAgICAgICAgICAgICAgICB2YWx1ZS52YXIgPSAiUmFuayIsDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQoNCmJvdWxkZXJfbWVuIDwtIGFzX3RpYmJsZShib3VsZGVyX21lbikNCiMjDQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLF0gDQojIw0Kbi5zZW1pcyA8LSBucm93KGJvdWxkZXJfbWVuWyFpcy5uYShib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLF0pDQpuLmZpbmFscyA8LSBucm93KGJvdWxkZXJfbWVuWyFpcy5uYShib3VsZGVyX21lbiRGaW5hbCksXSkNCg0KYGBgICANCg0KDQojIyMjIyBDdXJpdGliYTogU2VtaS1maW5hbHMNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCksIGMoMSwyLDYpXSAlPiUgcHJpbnQobj02MCkNCmBgYCAgDQoNCiMjIyMjIFNlbWktZmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLnNlbWlzYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbi5DdXJpdGliYS5zZW1pcyA8LSBib3VsZGVyX21lblssYygxLDIsNildICU+JSBmaWx0ZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgIT0iTkEiKSANCiMNCmxhc3QuY29tcC5kZWJ1dCA8LSBib3VsZGVyX21lbi5DdXJpdGliYS5zZW1pcyAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGJvdWxkZXJfbWVuLkN1cml0aWJhLnNlbWlzICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCm5hbWVzIDwtIGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5jYWxjJENvdW50cnlbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCnJlc3VsdHMgPC0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cywgbmEucm0gPSBUUlVFKQ0KIw0KYXZnLnBsYXllciA8LSBtZWRpYW4oYyhSLCByZXAobWVhbihlbG8uYm91bGRlci5tZW4uYWNjdW0kRWxvKSwgbi5kZWJ1dCApKSwgbmEucm0gPSBUKQ0KbWVkaWFuYSA8LSBtZWRpYW4oYm91bGRlcl9tZW4kYFNlbWktZmluYWxgWyFpcy5uYShib3VsZGVyX21lbiRgU2VtaS1maW5hbGApXSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojIyMNCmVsby5DdXJpdGliYS5zZW1pcyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uID0gcm91bmQoRSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKQ0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5DdXJpdGliYS5zZW1pcyA8LSBhc190aWJibGUoZWxvLkN1cml0aWJhLnNlbWlzKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCm4gPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCkNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0pDQpSLmRlYnV0IDwtIHJlcChtZWFuKGVsby5ib3VsZGVyLm1lbi5hY2N1bSRFbG8pLCBuKQ0KbmFtZXMgPC0gbGFzdC5jb21wLmRlYnV0WywxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuZGVidXQkQ291bnRyeQ0KI2NhdGVnIDwtIGJvdWxkZXJfbWVuLmFfYg0KUyA8LSAoKG1lZGlhbmEtIGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIuZGVidXQpL0QgKSkpDQpSLm5ldyA8LSBSLmRlYnV0ICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmVsby5DdXJpdGliYS5kZWJ1dCA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uID0gcm91bmQoRSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLkN1cml0aWJhLmRlYnV0IDwtIGFzX3RpYmJsZShlbG8uQ3VyaXRpYmEuZGVidXQpDQoNCmVsby5DdXJpdGliYS5zZW1pcyA8LSBlbG8uQ3VyaXRpYmEuc2VtaXMgJT4lIHJiaW5kKGVsby5DdXJpdGliYS5kZWJ1dCkNCg0KIyMjIyMjIyMjIyMNCiMNCiMjIyBQcm9iLkZpbmFsZXMgDQoNCiNtYXguY3V0LmZpbmFscyA8LSAoc3RkZXYtOSkvc3RkZXYNCmVsby5sYXN0LmNvbXAgPC0gZWxvLkN1cml0aWJhLnNlbWlzDQpSLm5ldyA8LSBlbG8ubGFzdC5jb21wJFIubmV3DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXcpL0QgKSkpDQojIyMgUHJvYi4gUG9kaXVtDQojbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8ubGFzdC5jb21wICU+JQ0KICBtdXRhdGUoRS5GaW5hbHM9IHJvdW5kKFByb2IuRmluYWxzLDIpLA0KICAgICAgICAgRS5wb2RpdW09IHJvdW5kKFByb2IucG9kaXVtLDIpLA0KICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwyKSwiJSIpLA0KICAgICAgICAgUHJvYi5wb2RpdW09IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwyKSwiICUiKQ0KICAgICAgICAgKQ0KDQogDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcFtvcmRlcihlbG8ubGFzdC5jb21wJHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCw5KV0pDQoNCmBgYCAgDQoNCg0KIyMjIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3IgZXZhbD1UUlVFfQ0KIw0KIyBTYWNhbmRvIHN1YjE2DQpjb21wZSA8LSAiQ3VyaXRpYmEuc2VtaXMiDQojZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8uMjIuYWNjdW0udG9fc3ViMTYgJT4lIA0KIyAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpLA0KICMgICAgICAgIGNhdGVnID0gcmVwKCJTdWIxNk0iLCBsZW5ndGgoZWxvLjIyLmFjY3VtLnRvX3N1YjE2JGNvbXBldGl0b3IpKSkNCiMNCiNlbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCiMjIA0KZWxvLmhpc3RvcnkubGFzdCA8LSBlbG8ubGFzdC5jb21wICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8uQ3VyaXRpYmEuc2VtaXMkY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUNCiAgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KDQpgYGAgIA0KDQoNCg0KIyMjIyMgKipFbG8gQWNjdW11bGF0ZWQgQ3VyaXRpYmEgU2VtaXMqKg0KDQpgYGB7ciBpbmNsdWRlPUZ9DQojIw0KDQojZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmFjY3VtICU+JSANCiMgIHJlbmFtZShSLm5ldz0gRWxvKQ0KI2Vsby5sYXN0LmNvbXAgPC0gZWxvLkN1cml0aWJhLnNlbWlzDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDEwLDExKV0pDQpgYGAgIA0KDQoNCg0KIyMjIyMgQ3VyaXRpYmE6IEZpbmFsDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRGaW5hbCksIGMoMSwyLDQpXSAlPiUgcHJpbnQobj02MCkNCmBgYCAgDQoNCiMjIyMjIEZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5maW5hbGAtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW4uQ3VyaXRpYmEuZmluYWwgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDQpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJEZpbmFsIT0iTkEiKSANCiMNCiNsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uQ3VyaXRpYmEuZmluYWwgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9RkFMU0UsIGNvbHMucHJpbnQ9IDd9DQojIyMgRUxPICMjIyMjIyMjIyMjIyMjIyMjDQojIyMgIyMgRUxPIChOQVNDQVIpICMjIyMjIyMjIyMjIyMNCiNuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5DdXJpdGliYS5maW5hbCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cywgbmEucm0gPSBUUlVFKQ0KIw0KI2F2Zy5wbGF5ZXIgPC0gbWVhbihjKFINCiAgICAgICAgICAgICAgICAgICAgICMsIHJlcChtZWFuKFIpLCBuLmRlYnV0ICkNCiAjICAgICAgICAgICAgICAgICAgICApKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGJvdWxkZXJfbWVuJEZpbmFsWyFpcy5uYShib3VsZGVyX21lbiRGaW5hbCldKQ0KI21lZGlhbmEgPC0gbWVkaWFuKGMoMTo2KSkNCm1heC5zdGQgPC0gKG1lZGlhbmEtMSkvc3RkZXYNCiMjIyMjIyMjIyMjIyMjIyMjIw0KUyA8LSAoKG1lZGlhbmEgLSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNCiNFIDwtIDEvKDErKDEwXiggKCBzb3J0KFIsIGRlY3JlYXNpbmcgPSBUUlVFKVs4XSAtUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KIyMjDQplbG8uQ3VyaXRpYmEuZmluYWwgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb24gPSByb3VuZChFLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCmVsby5DdXJpdGliYS5maW5hbCA8LSBhc190aWJibGUoZWxvLkN1cml0aWJhLmZpbmFsKQ0KIyMjIFByb2IuRmluYWxlcyAoc2FtZSBhcyBTZW1pcykNClByb2IuRmluYWxzIDwtIGVsby5sYXN0LmNvbXAgJT4lIA0KICAgIHNlbWlfam9pbihsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpLCBjKCJjb21wZXRpdG9yIiwgIkUuRmluYWxzIildLCBieSA9ICJjb21wZXRpdG9yIikgJT4lIA0KICAgIG11dGF0ZShvcmRlciA9IG1hdGNoKGNvbXBldGl0b3IsIGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3IpKSAlPiUgDQogICAgYXJyYW5nZShvcmRlcikgJT4lDQogICAgc2VsZWN0KEUuRmluYWxzKQ0KIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLkN1cml0aWJhLmZpbmFsDQpSLm5ldyA8LSBlbG8ubGFzdC5jb21wJFIubmV3DQoNCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLSBSLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8ubGFzdC5jb21wICU+JQ0KICBtdXRhdGUoRS5GaW5hbHMgPSByb3VuZChQcm9iLkZpbmFscyRFLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtID0gcm91bmQoUHJvYi5wb2RpdW0sMiksDQogICAgICAgICBQcm9iLkZpbmFscyA9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzJEUuRmluYWxzKjEwMCwyKSwiJSIpLA0KICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiUiKSwNCiAgICAgICAgICkNCmBgYCAgDQoNCg0KIyMjIyMjI18gRWxvIEhpc3RvcnkgXw0KYGBge3IgZXZhbD1UUlVFfQ0KIw0KZWxvLmxhc3QuY29tcC5uZXcgPC0gZWxvLmxhc3QuY29tcA0KIyBTYWNhbmRvIHN1YjE2DQpjb21wZSA8LSAiQ3VyaXRpYmEuZmluYWwiDQojDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAubmV3ICU+JSANCiAgbXV0YXRlKGNvbXAgPSByZXAoY29tcGUsIGxlbmd0aChlbG8ubGFzdC5jb21wLm5ldyRjb21wZXRpdG9yKSkpDQoNCiMNCmVsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JQ0KICByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KDQpgYGAgIA0KDQoNCg0KIyMjICoqRWxvIEFjY3VtdWxhdGVkIEN1cml0aWJhIEZpbmFsKioNCg0KYGBge3IgaW5jbHVkZT1UfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCiNlbG8ubGFzdC5jb21wIDwtIGVsby5DdXJpdGliYS5zZW1pcw0KIyMjDQplbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50IDwtIGVsby5sYXN0LmFjY3VtICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuY29tcCwgYnk9ImNvbXBldGl0b3IiKQ0KDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5jb21wICU+JSBmdWxsX2pvaW4oZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCkNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJGNvbXBldGl0b3IpLF0NCiMNCmtuaXRyOjprYWJsZShlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNywxMCwxMSldKQ0KYGBgICAgDQoNCg0KDQojIyMjIyBTYWx0Lkxha2UuQ2l0eS4yNSAgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0UsIHJvd3MucHJpbnQ9IDh9DQpib3VsZGVyX21lbiA8LSByYW5rcyAlPiUNCiAgZmlsdGVyKGNvbXBlPT0iU2FsdC5MYWtlLkNpdHkuMjUiKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcj0gTmFtZSwNCiAgICAgICMgICAgIFllYXI9IHllYXIsDQogICAgICAgICAgIENvbXBlPSBjb21wZSwNCiAgICAgIFN0YWdlID0gU3RhZ2UsDQogICAgICAgICAgIENvdW50cnkgPSBDb3VudHJ5LA0KICAgICAgICAgICBEYXRlPSBEYXRlLA0KICAgICAgUmFuayA9IFJhbmspICU+JQ0KIyAgcmVmcmFtZShyYW5rPSBSYW5rKSAlPiUNCiAgcmVzaGFwZTI6OmRjYXN0KGZvcm11bGEgPSBjb21wZXRpdG9yICsgQ291bnRyeSArIENvbXBlICB+IFN0YWdlLA0KICAgICAgICAgICAgICAgICAgdmFsdWUudmFyID0gIlJhbmsiLA0KICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpib3VsZGVyX21lbiA8LSBhc190aWJibGUoYm91bGRlcl9tZW4pDQojIw0KYm91bGRlcl9tZW5bb3JkZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSxdIA0KIyMNCm4uc2VtaXMgPC0gbnJvdyhib3VsZGVyX21lblshaXMubmEoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSxdKQ0Kbi5maW5hbHMgPC0gbnJvdyhib3VsZGVyX21lblshaXMubmEoYm91bGRlcl9tZW4kRmluYWwpLF0pDQoNCmBgYCAgDQoNCg0KIyMjIyMgU2FsdC5MYWtlLkNpdHkuMjU6IFNlbWktZmluYWxzDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLCBjKDEsMiw2KV0gJT4lIHByaW50KG49NjApDQpgYGAgIA0KDQojIyMjIyBTZW1pLWZpbmFscyANCiotQ29tcGV0aXRvcnMgPSBgbi5zZW1pc2AtKg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW4uU2FsdC5MYWtlLkNpdHkuMjUuc2VtaXMgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uU2FsdC5MYWtlLkNpdHkuMjUuc2VtaXMgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KYGBge3IgZXZhbD0gVFJVRSxpbmNsdWRlPUZBTFNFLCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5TYWx0Lkxha2UuQ2l0eS4yNS5zZW1pcyAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIgPC0gbGFzdC5jb21wLmNhbGMkUi5uZXdbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCnN0ZGV2IDwtIHNkKHJlc3VsdHMsIG5hLnJtID0gVFJVRSkNCiMNCmF2Zy5wbGF5ZXIgPC0gbWVkaWFuKGMoUiwgcmVwKG1lYW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtJEVsbyksIG4uZGVidXQgKSksIG5hLnJtID0gVCkNCm1lZGlhbmEgPC0gbWVkaWFuKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYFshaXMubmEoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKV0pDQptYXguc3RkIDwtIChtZWRpYW5hLTEpL3N0ZGV2DQojIyMjIyMjIyMjIyMjIyMjIyMNClMgPC0gKChtZWRpYW5hIC0gbGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSApIC8gc3RkZXYpIC8gbWF4LnN0ZA0KRCA9IDQwMA0KayA9IDMyDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUikvRCApKSkNClIubmV3IDwtIFIgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KIw0KIyMjDQplbG8uU2FsdC5MYWtlLkNpdHkuMjUuc2VtaXMgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQplbG8uU2FsdC5MYWtlLkNpdHkuMjUuc2VtaXMgPC0gYXNfdGliYmxlKGVsby5TYWx0Lkxha2UuQ2l0eS4yNS5zZW1pcykNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGApDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldKQ0KUi5kZWJ1dCA8LSByZXAobWVhbihlbG8uYm91bGRlci5tZW4uYWNjdW0kRWxvKSwgbikNCm5hbWVzIDwtIGxhc3QuY29tcC5kZWJ1dFssMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmRlYnV0JENvdW50cnkNCiNjYXRlZyA8LSBib3VsZGVyX21lbi5hX2INClMgPC0gKChtZWRpYW5hLSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SLmRlYnV0KS9EICkpKQ0KUi5uZXcgPC0gUi5kZWJ1dCArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQplbG8uU2FsdC5MYWtlLkNpdHkuMjUuZGVidXQgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUi5kZWJ1dCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5TYWx0Lkxha2UuQ2l0eS4yNS5kZWJ1dCA8LSBhc190aWJibGUoZWxvLlNhbHQuTGFrZS5DaXR5LjI1LmRlYnV0KQ0KDQplbG8uU2FsdC5MYWtlLkNpdHkuMjUuc2VtaXMgPC0gZWxvLlNhbHQuTGFrZS5DaXR5LjI1LnNlbWlzICU+JSByYmluZChlbG8uU2FsdC5MYWtlLkNpdHkuMjUuZGVidXQpDQoNCiMjIyMjIyMjIyMjDQojDQojIyMgUHJvYi5GaW5hbGVzIA0KDQojbWF4LmN1dC5maW5hbHMgPC0gKHN0ZGV2LTkpL3N0ZGV2DQplbG8ubGFzdC5jb21wIDwtIGVsby5TYWx0Lkxha2UuQ2l0eS4yNS5zZW1pcw0KUi5uZXcgPC0gZWxvLmxhc3QuY29tcCRSLm5ldw0KUHJvYi5GaW5hbHMgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs5XSAtIFIubmV3KS9EICkpKQ0KIyMjIFByb2IuIFBvZGl1bQ0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtUi5uZXcpL0QgKSkpDQojIyMNCmVsby5sYXN0LmNvbXAgPC0gZWxvLmxhc3QuY29tcCAlPiUNCiAgbXV0YXRlKEUuRmluYWxzPSByb3VuZChQcm9iLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtPSByb3VuZChQcm9iLnBvZGl1bSwyKSwNCiAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsMiksIiUiKSwNCiAgICAgICAgIFByb2IucG9kaXVtPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiAlIikNCiAgICAgICAgICkNCg0KIA0KIyMjIyMgIyMjIyMjIyMjIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmNvbXBbb3JkZXIoZWxvLmxhc3QuY29tcCRyZXN1bHRzKSxjKDEsMiwzLDQsNiw3LDgsOSldKQ0KDQpgYGAgIA0KDQoNCiMjIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIlNhbHQuTGFrZS5DaXR5LjI1LnNlbWlzIg0KI2Vsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLjIyLmFjY3VtLnRvX3N1YjE2ICU+JSANCiMgIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLjIyLmFjY3VtLnRvX3N1YjE2JGNvbXBldGl0b3IpKSwNCiAjICAgICAgICBjYXRlZyA9IHJlcCgiU3ViMTZNIiwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSkpDQojDQojZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQojIyANCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcCAlPiUgDQogIG11dGF0ZShjb21wID0gcmVwKGNvbXBlLCBsZW5ndGgoZWxvLlNhbHQuTGFrZS5DaXR5LjI1LnNlbWlzJGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCg0KYGBgICANCg0KDQoNCiMjIyMjICoqRWxvIEFjY3VtdWxhdGVkIFNhbHQuTGFrZS5DaXR5LjI1IFNlbWlzKioNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjDQoNCiNlbG8ubGFzdC5hY2N1bSA8LSBlbG8uYWNjdW0gJT4lIA0KIyAgcmVuYW1lKFIubmV3PSBFbG8pDQojZWxvLmxhc3QuY29tcCA8LSBlbG8uU2FsdC5MYWtlLkNpdHkuMjUuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsMTAsMTEpXSkNCmBgYCAgDQoNCg0KDQojIyMjIyBTYWx0Lkxha2UuQ2l0eS4yNTogRmluYWwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIyMgRmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLmZpbmFsYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbi5TYWx0Lkxha2UuQ2l0eS4yNS5maW5hbCA8LSBib3VsZGVyX21lblssYygxLDIsNCldICU+JSBmaWx0ZXIoYm91bGRlcl9tZW4kRmluYWwhPSJOQSIpIA0KIw0KI2xhc3QuY29tcC5kZWJ1dCA8LSBib3VsZGVyX21lbi5TYWx0Lkxha2UuQ2l0eS4yNS5maW5hbCAlPiUgYW50aV9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQpgYGANCg0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1GQUxTRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KI24uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGJvdWxkZXJfbWVuLlNhbHQuTGFrZS5DaXR5LjI1LmZpbmFsICU+JSByaWdodF9qb2luKGVsby5sYXN0LmFjY3VtLCBieT0iY29tcGV0aXRvciIpDQojIyMNCk4gPC0gbGVuZ3RoKGxhc3QuY29tcC5jYWxjJGNvbXBldGl0b3JbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpuYW1lcyA8LSBsYXN0LmNvbXAuY2FsY1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5jYWxjJENvdW50cnlbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpyZXN1bHRzIDwtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQojYXZnLnBsYXllciA8LSBtZWFuKGMoUg0KICAgICAgICAgICAgICAgICAgICAgIywgcmVwKG1lYW4oUiksIG4uZGVidXQgKQ0KICMgICAgICAgICAgICAgICAgICAgICkpDQojbWVkaWFuYSA8LSBtZWRpYW4oYm91bGRlcl9tZW4kRmluYWxbIWlzLm5hKGJvdWxkZXJfbWVuJEZpbmFsKV0pDQojbWVkaWFuYSA8LSBtZWRpYW4oYygxOjYpKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KI0UgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUiwgZGVjcmVhc2luZyA9IFRSVUUpWzhdIC1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojIyMNCmVsby5TYWx0Lkxha2UuQ2l0eS4yNS5maW5hbCA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9IFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RhdGlvbiA9IHJvdW5kKEUsMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSLm5ldz0gcm91bmQoUi5uZXcsMikNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLkZpbmFscz0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMqMTAwLCAxKSwNCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiKSwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwxKSwgIiUiICkgDQogICAgICAgICAgICAgICAgICAgICAgICAgICApDQoNCg0KZWxvLlNhbHQuTGFrZS5DaXR5LjI1LmZpbmFsIDwtIGFzX3RpYmJsZShlbG8uU2FsdC5MYWtlLkNpdHkuMjUuZmluYWwpDQojIyMgUHJvYi5GaW5hbGVzIChzYW1lIGFzIFNlbWlzKQ0KUHJvYi5GaW5hbHMgPC0gZWxvLmxhc3QuY29tcCAlPiUgDQogICAgc2VtaV9qb2luKGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksIGMoImNvbXBldGl0b3IiLCAiRS5GaW5hbHMiKV0sIGJ5ID0gImNvbXBldGl0b3IiKSAlPiUgDQogICAgbXV0YXRlKG9yZGVyID0gbWF0Y2goY29tcGV0aXRvciwgbGFzdC5jb21wLmNhbGMkY29tcGV0aXRvcikpICU+JSANCiAgICBhcnJhbmdlKG9yZGVyKSAlPiUNCiAgICBzZWxlY3QoRS5GaW5hbHMpDQojIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8uU2FsdC5MYWtlLkNpdHkuMjUuZmluYWwNClIubmV3IDwtIGVsby5sYXN0LmNvbXAkUi5uZXcNCg0KI21heC5jdXQucG9kaXVtIDwtIChzdGRldi00KS9zdGRldg0KUHJvYi5wb2RpdW0gPC0gMS8oMSsoMTBeKCAoIHNvcnQoUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKVs0XSAtIFIubmV3KS9EICkpKQ0KIyMjDQplbG8ubGFzdC5jb21wIDwtIGVsby5sYXN0LmNvbXAgJT4lDQogIG11dGF0ZShFLkZpbmFscyA9IHJvdW5kKFByb2IuRmluYWxzJEUuRmluYWxzLDIpLA0KICAgICAgICAgRS5wb2RpdW0gPSByb3VuZChQcm9iLnBvZGl1bSwyKSwNCiAgICAgICAgIFByb2IuRmluYWxzID0gcGFzdGUocm91bmQoUHJvYi5GaW5hbHMkRS5GaW5hbHMqMTAwLDIpLCIlIiksDQogICAgICAgICBQcm9iLnBvZGl1bSA9IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwyKSwiJSIpLA0KICAgICAgICAgKQ0KYGBgICANCg0KDQojIyMjIyMjXyBFbG8gSGlzdG9yeSBfDQpgYGB7ciBldmFsPVRSVUV9DQojDQplbG8ubGFzdC5jb21wLm5ldyA8LSBlbG8ubGFzdC5jb21wDQojIFNhY2FuZG8gc3ViMTYNCmNvbXBlIDwtICJTYWx0Lkxha2UuQ2l0eS4yNS5maW5hbCINCiMNCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCmBgYCAgDQoNCg0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgU2FsdC5MYWtlLkNpdHkuMjUgRmluYWwqKg0KDQpgYGB7ciBpbmNsdWRlPVRSVUV9DQojIw0KDQojZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmFjY3VtICU+JSANCiMgIHJlbmFtZShSLm5ldz0gRWxvKQ0KI2Vsby5sYXN0LmNvbXAgPC0gZWxvLlNhbHQuTGFrZS5DaXR5LjI1LnNlbWlzDQojIyMNCmVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQgPC0gZWxvLmxhc3QuYWNjdW0gJT4lIGFudGlfam9pbihlbG8ubGFzdC5jb21wLCBieT0iY29tcGV0aXRvciIpDQoNCmVsby5sYXN0LmFjY3VtIDwtIGVsby5sYXN0LmNvbXAgJT4lIGZ1bGxfam9pbihlbG8ubGFzdC5hY2N1bV9sYXN0LmNvbXBfYWJzZW50KQ0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kY29tcGV0aXRvciksXQ0KIw0Ka25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDEwLDExKV0pDQpgYGAgICANCg0KDQoNCiMjIyBQcmFndWUuMjUgIA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFLCByb3dzLnByaW50PSA4fQ0KYm91bGRlcl9tZW4gPC0gcmFua3MgJT4lDQogIGZpbHRlcihjb21wZT09IlByYWd1ZS4yNSIpICU+JQ0KICBncm91cF9ieShjb21wZXRpdG9yPSBOYW1lLA0KICAgICAgIyAgICAgWWVhcj0geWVhciwNCiAgICAgICAgICAgQ29tcGU9IGNvbXBlLA0KICAgICAgU3RhZ2UgPSBTdGFnZSwNCiAgICAgICAgICAgQ291bnRyeSA9IENvdW50cnksDQogICAgICAgICAgIERhdGU9IERhdGUsDQogICAgICBSYW5rID0gUmFuaykgJT4lDQojICByZWZyYW1lKHJhbms9IFJhbmspICU+JQ0KICByZXNoYXBlMjo6ZGNhc3QoZm9ybXVsYSA9IGNvbXBldGl0b3IgKyBDb3VudHJ5ICsgQ29tcGUgIH4gU3RhZ2UsDQogICAgICAgICAgICAgICAgICB2YWx1ZS52YXIgPSAiUmFuayIsDQogICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpDQoNCmJvdWxkZXJfbWVuIDwtIGFzX3RpYmJsZShib3VsZGVyX21lbikNCiMjDQpib3VsZGVyX21lbltvcmRlcihib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLF0gDQojIw0Kbi5zZW1pcyA8LSBucm93KGJvdWxkZXJfbWVuWyFpcy5uYShib3VsZGVyX21lbiRgU2VtaS1maW5hbGApLF0pDQpuLmZpbmFscyA8LSBucm93KGJvdWxkZXJfbWVuWyFpcy5uYShib3VsZGVyX21lbiRGaW5hbCksXSkNCg0KYGBgICANCg0KDQojIyMgUHJhZ3VlLjI1OiBTZW1pLWZpbmFscw0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KYm91bGRlcl9tZW5bb3JkZXIoYm91bGRlcl9tZW4kYFNlbWktZmluYWxgKSwgYygxLDIsNildICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KIyMjIFNlbWktZmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLnNlbWlzYC0qDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpib3VsZGVyX21lbi5QcmFndWUuMjUuc2VtaXMgPC0gYm91bGRlcl9tZW5bLGMoMSwyLDYpXSAlPiUgZmlsdGVyKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCE9Ik5BIikgDQojDQpsYXN0LmNvbXAuZGVidXQgPC0gYm91bGRlcl9tZW4uUHJhZ3VlLjI1LnNlbWlzICU+JSBhbnRpX2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCmBgYA0KDQoNCmBgYHtyIGV2YWw9IFRSVUUsaW5jbHVkZT1ULCBjb2xzLnByaW50PSA3fQ0KIyMjIEVMTyAjIyMjIyMjIyMjIyMjIyMjIw0KIyMjICMjIEVMTyAoTkFTQ0FSKSAjIyMjIyMjIyMjIyMjDQpuLmRlYnV0ID0gbGVuZ3RoKGxhc3QuY29tcC5kZWJ1dCRjb21wZXRpdG9yKQ0KIyMjDQpsYXN0LmNvbXAuY2FsYyA8LSBib3VsZGVyX21lbi5QcmFndWUuMjUuc2VtaXMgJT4lIHJpZ2h0X2pvaW4oZWxvLmxhc3QuYWNjdW0sIGJ5PSJjb21wZXRpdG9yIikNCiMjIw0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkY29tcGV0aXRvclshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0pDQpSIDwtIGxhc3QuY29tcC5jYWxjJFIubmV3WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCksMV0NCmNvdW50cnkgPC0gbGFzdC5jb21wLmNhbGMkQ291bnRyeVshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGBbIWlzLm5hKGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYCldDQpzdGRldiA8LSBzZChyZXN1bHRzLCBuYS5ybSA9IFRSVUUpDQojDQphdmcucGxheWVyIDwtIG1lZGlhbihjKFIsIHJlcChtZWFuKGVsby5ib3VsZGVyLm1lbi5hY2N1bSRFbG8pLCBuLmRlYnV0ICkpLCBuYS5ybSA9IFQpDQptZWRpYW5hIDwtIG1lZGlhbihib3VsZGVyX21lbiRgU2VtaS1maW5hbGBbIWlzLm5hKGJvdWxkZXJfbWVuJGBTZW1pLWZpbmFsYCldKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0gKSAvIHN0ZGV2KSAvIG1heC5zdGQNCkQgPSA0MDANCmsgPSAzMg0KRSA8LSAxLygxKygxMF4oIChhdmcucGxheWVyLVIpL0QgKSkpDQpSLm5ldyA8LSBSICsgKGsgKiAoUyAtICgoMipFKS9OKSApICkNCiMNCiMjIw0KZWxvLlByYWd1ZS4yNS5zZW1pcyA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5jYWxjJGBTZW1pLWZpbmFsYFshaXMubmEobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uID0gcm91bmQoRSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKQ0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IuRmluYWxzPSBwYXN0ZShyb3VuZChQcm9iLkZpbmFscyoxMDAsIDEpLA0KICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJSIpLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgIFByb2IucG9kaXVtID0gcGFzdGUocm91bmQoUHJvYi5wb2RpdW0qMTAwLDEpLCAiJSIgKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCmVsby5QcmFndWUuMjUuc2VtaXMgPC0gYXNfdGliYmxlKGVsby5QcmFndWUuMjUuc2VtaXMpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KbiA9IGxlbmd0aChsYXN0LmNvbXAuZGVidXQkYFNlbWktZmluYWxgKQ0KTiA8LSBsZW5ndGgobGFzdC5jb21wLmNhbGMkYFNlbWktZmluYWxgWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRgU2VtaS1maW5hbGApXSkNClIuZGVidXQgPC0gcmVwKG1lYW4oZWxvLmJvdWxkZXIubWVuLmFjY3VtJEVsbyksIG4pDQpuYW1lcyA8LSBsYXN0LmNvbXAuZGVidXRbLDFdDQpjb3VudHJ5IDwtIGxhc3QuY29tcC5kZWJ1dCRDb3VudHJ5DQojY2F0ZWcgPC0gYm91bGRlcl9tZW4uYV9iDQpTIDwtICgobWVkaWFuYS0gbGFzdC5jb21wLmRlYnV0JGBTZW1pLWZpbmFsYCkgLyBzdGRldikgLyBtYXguc3RkDQpFIDwtIDEvKDErKDEwXiggKGF2Zy5wbGF5ZXItUi5kZWJ1dCkvRCApKSkNClIubmV3IDwtIFIuZGVidXQgKyAoayAqIChTIC0gKCgyKkUpL04pICkgKQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZWxvLlByYWd1ZS4yNS5kZWJ1dCA8LSBjYmluZChuYW1lcyA9IG5hbWVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RyeT0gY291bnRyeSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBSLmRlYnV0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGxhc3QuY29tcC5kZWJ1dCRgU2VtaS1maW5hbGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uID0gcm91bmQoRSwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFIubmV3PSByb3VuZChSLm5ldywyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KZWxvLlByYWd1ZS4yNS5kZWJ1dCA8LSBhc190aWJibGUoZWxvLlByYWd1ZS4yNS5kZWJ1dCkNCg0KZWxvLlByYWd1ZS4yNS5zZW1pcyA8LSBlbG8uUHJhZ3VlLjI1LnNlbWlzICU+JSByYmluZChlbG8uUHJhZ3VlLjI1LmRlYnV0KQ0KDQojIyMjIyMjIyMjIw0KIw0KIyMjIFByb2IuRmluYWxlcyANCg0KI21heC5jdXQuZmluYWxzIDwtIChzdGRldi05KS9zdGRldg0KZWxvLmxhc3QuY29tcCA8LSBlbG8uUHJhZ3VlLjI1LnNlbWlzDQpSLm5ldyA8LSBlbG8ubGFzdC5jb21wJFIubmV3DQpQcm9iLkZpbmFscyA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzldIC0gUi5uZXcpL0QgKSkpDQojIyMgUHJvYi4gUG9kaXVtDQojbWF4LmN1dC5wb2RpdW0gPC0gKHN0ZGV2LTQpL3N0ZGV2DQpQcm9iLnBvZGl1bSA8LSAxLygxKygxMF4oICggc29ydChSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpWzRdIC1SLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8ubGFzdC5jb21wICU+JQ0KICBtdXRhdGUoRS5GaW5hbHM9IHJvdW5kKFByb2IuRmluYWxzLDIpLA0KICAgICAgICAgRS5wb2RpdW09IHJvdW5kKFByb2IucG9kaXVtLDIpLA0KICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwyKSwiJSIpLA0KICAgICAgICAgUHJvYi5wb2RpdW09IHBhc3RlKHJvdW5kKFByb2IucG9kaXVtKjEwMCwyKSwiICUiKQ0KICAgICAgICAgKQ0KDQogDQojIyMjIyAjIyMjIyMjIyMjDQprbml0cjo6a2FibGUoZWxvLmxhc3QuY29tcFtvcmRlcihlbG8ubGFzdC5jb21wJHJlc3VsdHMpLGMoMSwyLDMsNCw2LDcsOCw5KV0pDQoNCmBgYCAgDQoNCg0KDQoNCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIlByYWd1ZS4yNS5zZW1pcyINCiNlbG8uaGlzdG9yeS5sYXN0IDwtIGVsby4yMi5hY2N1bS50b19zdWIxNiAlPiUgDQojICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby4yMi5hY2N1bS50b19zdWIxNiRjb21wZXRpdG9yKSksDQogIyAgICAgICAgY2F0ZWcgPSByZXAoIlN1YjE2TSIsIGxlbmd0aChlbG8uMjIuYWNjdW0udG9fc3ViMTYkY29tcGV0aXRvcikpKQ0KIw0KI2Vsby5oaXN0b3J5IDwtIGVsby5oaXN0b3J5ICU+JSByYmluZChlbG8uaGlzdG9yeS5sYXN0KQ0KIyMgDQplbG8uaGlzdG9yeS5sYXN0IDwtIGVsby5sYXN0LmNvbXAgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5QcmFndWUuMjUuc2VtaXMkY29tcGV0aXRvcikpKQ0KDQojDQplbG8uaGlzdG9yeSA8LSBlbG8uaGlzdG9yeSAlPiUNCiAgcmJpbmQoZWxvLmhpc3RvcnkubGFzdCkNCg0KDQpgYGAgIA0KDQoNCg0KIyMjIyMgKipFbG8gQWNjdW11bGF0ZWQgUHJhZ3VlLjI1IFNlbWlzKioNCg0KYGBge3IgaW5jbHVkZT1GfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCiNlbG8ubGFzdC5jb21wIDwtIGVsby5QcmFndWUuMjUuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQprbml0cjo6a2FibGUoZWxvLmxhc3QuYWNjdW1bb3JkZXIoZWxvLmxhc3QuYWNjdW0kUi5uZXcsIGRlY3JlYXNpbmcgPSBUUlVFKSxjKDEsMiw2LDcsMTAsMTEpXSkNCmBgYCAgDQoNCg0KIyMjIFByb2IuUG9kaXVtICAtIENJcw0KDQpgYGB7ciBpbmNsdWRlPVRSVUUsIGZpZy53aWR0aD0gMTYsIGZpZy5oZWlnaHQ9MTJ9DQplbG8uaGlzdG9yeS5mb3IubGFzdC5jb21wIDwtIA0KICBlbG8uaGlzdG9yeSAlPiUNCiAgICBzZW1pX2pvaW4oZWxvLmxhc3QuY29tcFtlbG8ubGFzdC5jb21wJHJlc3VsdHM8PTgsXSwgam9pbl9ieShjb21wZXRpdG9yKSkNCg0KcG9kaXVtX0NJcyA8LSB0aWJibGUoY29tcGV0aXRvcj0gZWxvLmhpc3RvcnkuZm9yLmxhc3QuY29tcCRjb21wZXRpdG9yWyFpcy5uYShlbG8uaGlzdG9yeS5mb3IubGFzdC5jb21wJEUucG9kaXVtKV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHBvZGl1bSA9IGVsby5oaXN0b3J5LmZvci5sYXN0LmNvbXAkRS5wb2RpdW1bIWlzLm5hKGVsby5oaXN0b3J5LmZvci5sYXN0LmNvbXAkRS5wb2RpdW0pXSkNCiMjIyMjIyMjIyMjIyMjDQoNCmJvb3RfbWVhbl9jaV9zYWZlIDwtIGZ1bmN0aW9uKHgsIFIgPSAxMDAwKSB7DQogIGlmIChsZW5ndGgodW5pcXVlKHgpKSA8PSAxIHx8IGxlbmd0aCh4KSA8IDIpIHsNCiAgICAjIENhbid0IGJvb3RzdHJhcCBpZiBubyB2YXJpYXRpb24gb3Igb25seSBvbmUgdmFsdWUNCiAgICByZXR1cm4oYyhOQV9yZWFsXywgTkFfcmVhbF8pKQ0KICB9DQogIA0KICBib290X29iaiA8LSBib290KHgsIHN0YXRpc3RpYyA9IGZ1bmN0aW9uKGRhdGEsIGkpIG1lYW4oZGF0YVtpXSksIFIgPSBSKQ0KICBjaSA8LSB0cnlDYXRjaCh7DQogICAgYm9vdC5jaShib290X29iaiwgdHlwZSA9ICJwZXJjIikkcGVyY2VudFs0OjVdDQogIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgYyhOQV9yZWFsXywgTkFfcmVhbF8pKQ0KICANCiAgcmV0dXJuKGNpKQ0KfQ0KIyMjIyMjIyMjIyMNCnN1bW1hcnlfcHJvYnMgPC0gcG9kaXVtX0NJcyAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcikgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBtZWFuX3BvZGl1bSA9IG1lYW4ocG9kaXVtKSwNCiAgICBjaSA9IGxpc3QoYm9vdF9tZWFuX2NpX3NhZmUocG9kaXVtKSksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUoDQogICAgbG93ZXJfOTVDSSA9IG1hcF9kYmwoY2ksIDEpLA0KICAgIHVwcGVyXzk1Q0kgPSBtYXBfZGJsKGNpLCAyKQ0KICApICU+JQ0KICBzZWxlY3QoLWNpKQ0KDQpwIDwtIGdncGxvdChzdW1tYXJ5X3Byb2JzLCBhZXMoeSA9IGZjdF9yZW9yZGVyKGNvbXBldGl0b3IsIG1lYW5fcG9kaXVtKSwgeCA9IG1lYW5fcG9kaXVtKSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLjUxLCBsdHk9MiwgbHdkPTAuNSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAxLCBjb2xvciA9ICJkYXJrZ3JlZW4iKSArDQogIGdlb21fZXJyb3JiYXIoDQogICAgYWVzKHhtaW4gPSBsb3dlcl85NUNJLCB4bWF4ID0gdXBwZXJfOTVDSSksDQogICAgd2lkdGggPSAwLjIsDQogICAgbmEucm0gPSBUUlVFDQogICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUHJvYmFiaWxpdHkgb2YgUmVhY2hpbmcgUG9kaXVtIChCb290c3RyYXBwZWQgOTUlIENJKSIsDQogICAgeSA9ICJDb21wZXRpdG9yIiwNCiAgICB4ID0gIkVzdGltYXRlZCBQcm9iYWJpbGl0eSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSANCiMrDQogIyB0aGVtZSgNCiAgIyAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSAgIyBhbmdsZWQgbGFiZWxzDQojICApDQoNCg0KDQojcA0KZ2dwbG90bHkocCkNCiMjIyMNCg0KYGBgICANCg0KDQoNCiMjIyBQcmFndWUuMjU6IEZpbmFsDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmJvdWxkZXJfbWVuW29yZGVyKGJvdWxkZXJfbWVuJEZpbmFsKSwgYygxLDIsNCldICU+JSBwcmludChuPTYwKQ0KYGBgICANCg0KDQoNCg0KDQojIyMgRmluYWxzIA0KKi1Db21wZXRpdG9ycyA9IGBuLmZpbmFsYC0qDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmJvdWxkZXJfbWVuLlByYWd1ZS4yNS5maW5hbCA8LSBib3VsZGVyX21lblssYygxLDIsNCldICU+JSBmaWx0ZXIoYm91bGRlcl9tZW4kRmluYWwhPSJOQSIpIA0KIw0KI2xhc3QuY29tcC5kZWJ1dCA8LSBib3VsZGVyX21lbi5QcmFndWUuMjUuZmluYWwgJT4lIGFudGlfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KYGBgDQoNCg0KDQpgYGB7ciBldmFsPSBUUlVFLGluY2x1ZGU9VFJVRSwgY29scy5wcmludD0gN30NCiMjIyBFTE8gIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyAjIyBFTE8gKE5BU0NBUikgIyMjIyMjIyMjIyMjIw0KI24uZGVidXQgPSBsZW5ndGgobGFzdC5jb21wLmRlYnV0JGNvbXBldGl0b3IpDQojIyMNCmxhc3QuY29tcC5jYWxjIDwtIGJvdWxkZXJfbWVuLlByYWd1ZS4yNS5maW5hbCAlPiUgcmlnaHRfam9pbihlbG8ubGFzdC5hY2N1bSwgYnk9ImNvbXBldGl0b3IiKQ0KIyMjDQpOIDwtIGxlbmd0aChsYXN0LmNvbXAuY2FsYyRjb21wZXRpdG9yWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldKQ0KUiA8LSBsYXN0LmNvbXAuY2FsYyRSLm5ld1shaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0KbmFtZXMgPC0gbGFzdC5jb21wLmNhbGNbIWlzLm5hKGxhc3QuY29tcC5jYWxjJEZpbmFsKSwxXQ0KY291bnRyeSA8LSBsYXN0LmNvbXAuY2FsYyRDb3VudHJ5WyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVzdWx0cyA8LSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXQ0Kc3RkZXYgPC0gc2QocmVzdWx0cywgbmEucm0gPSBUUlVFKQ0KIw0KI2F2Zy5wbGF5ZXIgPC1tZWFuKGMoUg0KICAgICAgICAgICAgICAgICAgICAgIywgcmVwKG1lYW4oUiksIG4uZGVidXQgKQ0KICMgICAgICAgICAgICAgICAgICAgICkpDQojbWVkaWFuYSA8LSBtZWRpYW4oYm91bGRlcl9tZW4kRmluYWxbIWlzLm5hKGJvdWxkZXJfbWVuJEZpbmFsKV0pDQojbWVkaWFuYSA8LSBtZWRpYW4oYygxOjYpKQ0KbWF4LnN0ZCA8LSAobWVkaWFuYS0xKS9zdGRldg0KIyMjIyMjIyMjIyMjIyMjIyMjDQpTIDwtICgobWVkaWFuYSAtIGxhc3QuY29tcC5jYWxjJEZpbmFsWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCldICkgLyBzdGRldikgLyBtYXguc3RkDQpEID0gNDAwDQprID0gMzINCkUgPC0gMS8oMSsoMTBeKCAoYXZnLnBsYXllci1SKS9EICkpKQ0KI0UgPC0gMS8oMSsoMTBeKCAoIHNvcnQoUiwgZGVjcmVhc2luZyA9IFRSVUUpWzhdIC1SKS9EICkpKQ0KUi5uZXcgPC0gUiArIChrICogKFMgLSAoKDIqRSkvTikgKSApDQojDQojIyMNCmVsby5QcmFndWUuMjUuZmluYWwgPC0gY2JpbmQobmFtZXMgPSBuYW1lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0cnk9IGNvdW50cnksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gUiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBsYXN0LmNvbXAuY2FsYyRGaW5hbFshaXMubmEobGFzdC5jb21wLmNhbGMkRmluYWwpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgPSBTLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0YXRpb24gPSByb3VuZChFLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5uZXc9IHJvdW5kKFIubmV3LDIpDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5GaW5hbHM9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzKjEwMCwgMSksDQogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlIiksDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMSksICIlIiApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQoNCmVsby5QcmFndWUuMjUuZmluYWwgPC0gYXNfdGliYmxlKGVsby5QcmFndWUuMjUuZmluYWwpDQojIyMgUHJvYi5GaW5hbGVzIChzYW1lIGFzIFNlbWlzKQ0KUHJvYi5GaW5hbHMgPC0gZWxvLmxhc3QuY29tcCAlPiUgDQogICAgc2VtaV9qb2luKGxhc3QuY29tcC5jYWxjWyFpcy5uYShsYXN0LmNvbXAuY2FsYyRGaW5hbCksIGMoImNvbXBldGl0b3IiLCAiRS5GaW5hbHMiKV0sIGJ5ID0gImNvbXBldGl0b3IiKSAlPiUgDQogICAgbXV0YXRlKG9yZGVyID0gbWF0Y2goY29tcGV0aXRvciwgbGFzdC5jb21wLmNhbGMkY29tcGV0aXRvcikpICU+JSANCiAgICBhcnJhbmdlKG9yZGVyKSAlPiUNCiAgICBzZWxlY3QoRS5GaW5hbHMpDQojIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8uUHJhZ3VlLjI1LmZpbmFsDQpSLm5ldyA8LSBlbG8ubGFzdC5jb21wJFIubmV3DQoNCiNtYXguY3V0LnBvZGl1bSA8LSAoc3RkZXYtNCkvc3RkZXYNClByb2IucG9kaXVtIDwtIDEvKDErKDEwXiggKCBzb3J0KFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSlbNF0gLSBSLm5ldykvRCApKSkNCiMjIw0KZWxvLmxhc3QuY29tcCA8LSBlbG8ubGFzdC5jb21wICU+JQ0KICBtdXRhdGUoRS5GaW5hbHMgPSByb3VuZChQcm9iLkZpbmFscyRFLkZpbmFscywyKSwNCiAgICAgICAgIEUucG9kaXVtID0gcm91bmQoUHJvYi5wb2RpdW0sMiksDQogICAgICAgICBQcm9iLkZpbmFscyA9IHBhc3RlKHJvdW5kKFByb2IuRmluYWxzJEUuRmluYWxzKjEwMCwyKSwiJSIpLA0KICAgICAgICAgUHJvYi5wb2RpdW0gPSBwYXN0ZShyb3VuZChQcm9iLnBvZGl1bSoxMDAsMiksIiUiKSwNCiAgICAgICAgICkNCmBgYCAgDQoNCg0KIyMjIyNfIEVsbyBIaXN0b3J5IF8NCmBgYHtyIGV2YWw9VFJVRX0NCiMNCmVsby5sYXN0LmNvbXAubmV3IDwtIGVsby5sYXN0LmNvbXANCiMgU2FjYW5kbyBzdWIxNg0KY29tcGUgPC0gIlByYWd1ZS4yNS5maW5hbCINCiMNCmVsby5oaXN0b3J5Lmxhc3QgPC0gZWxvLmxhc3QuY29tcC5uZXcgJT4lIA0KICBtdXRhdGUoY29tcCA9IHJlcChjb21wZSwgbGVuZ3RoKGVsby5sYXN0LmNvbXAubmV3JGNvbXBldGl0b3IpKSkNCg0KIw0KZWxvLmhpc3RvcnkgPC0gZWxvLmhpc3RvcnkgJT4lDQogIHJiaW5kKGVsby5oaXN0b3J5Lmxhc3QpDQoNCmBgYCAgDQoNCg0KDQojIyMgKipFbG8gQWNjdW11bGF0ZWQgUHJhZ3VlLjI1IEZpbmFsKioNCg0KYGBge3IgaW5jbHVkZT1UUlVFfQ0KIyMNCg0KI2Vsby5sYXN0LmFjY3VtIDwtIGVsby5hY2N1bSAlPiUgDQojICByZW5hbWUoUi5uZXc9IEVsbykNCiNlbG8ubGFzdC5jb21wIDwtIGVsby5QcmFndWUuMjUuc2VtaXMNCiMjIw0KZWxvLmxhc3QuYWNjdW1fbGFzdC5jb21wX2Fic2VudCA8LSBlbG8ubGFzdC5hY2N1bSAlPiUgYW50aV9qb2luKGVsby5sYXN0LmNvbXAsIGJ5PSJjb21wZXRpdG9yIikNCg0KZWxvLmxhc3QuYWNjdW0gPC0gZWxvLmxhc3QuY29tcCAlPiUgZnVsbF9qb2luKGVsby5sYXN0LmFjY3VtX2xhc3QuY29tcF9hYnNlbnQpDQplbG8ubGFzdC5hY2N1bSA8LSBlbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRjb21wZXRpdG9yKSxdDQojDQoja25pdHI6OmthYmxlKGVsby5sYXN0LmFjY3VtW29yZGVyKGVsby5sYXN0LmFjY3VtJFIubmV3LCBkZWNyZWFzaW5nID0gVFJVRSksYygxLDIsNiw3LDEwLDExKV0pDQplbG8ubGFzdC5hY2N1bVtvcmRlcihlbG8ubGFzdC5hY2N1bSRSLm5ldywgZGVjcmVhc2luZyA9IFRSVUUpLGMoMSwyLDYsNywxMCwxMSldDQpgYGAgICANCg0KDQoNCmBgYHtyIGluY2x1ZGU9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgZWNobyA9IEZBTFNFLA0KCW1lc3NhZ2UgPSBGQUxTRSwNCiAgd2FybmluZyA9IEZBTFNFLA0KCWluY2x1ZGUgPSBUUlVFDQopDQpgYGAgIA0KDQojIyMgRWxvIGluIHRpbWUNCg0KYGBge3IgaW5jbHVkZT1UUlVFLCBmaWcud2lkdGg9IDE2LCBmaWcuaGVpZ2h0PSAxMH0NCmNvbXBfb3JkZXIgPC0gYygiSW5uc2JydWNrLnNlbWlzIiwgIklubnNicnVjay5maW5hbCIsDQogICAgICAgICAgICAgICAgIlByYWd1ZS4yMDI0LnNlbWlzIiwgIlByYWd1ZS4yMDI0LmZpbmFsIiwNCiAgICAgICAgICAgICAgICAiU2VvdWwuMjAyNC5zZW1pcyIsICJTZW91bC4yMDI0LmZpbmFsIiwNCiAgICAgICAgICAgICAgICAiS2VxaWFvLjIwMjUuc2VtaXMiICwgIktlcWlhby4yMDI1LmZpbmFsIiwNCiAgICAgICAgICAgICAgICAiQ3VyaXRpYmEuc2VtaXMiLCAiQ3VyaXRpYmEuZmluYWwiLA0KICAgICAgICAgICAgICAgICJTYWx0Lkxha2UuQ2l0eS4yNS5zZW1pcyIsICJTYWx0Lkxha2UuQ2l0eS4yNS5maW5hbCIsDQogICAgICAgICAgICAgICAgIlByYWd1ZS4yNS5zZW1pcyIsICJQcmFndWUuMjUuZmluYWwiKQ0KDQptZWRpYW5fZWxvX3Blci5jb21wIDwtICBlbG8uaGlzdG9yeSAlPiUgZ3JvdXBfYnkoY29tcCkgJT4lIHN1bW1hcmlzZShtZWRpYW5fZWxvID0gbWVkaWFuKFIubmV3KSApICU+JSBtdXRhdGUoY29tcD0gZmFjdG9yKGNvbXAsIGxldmVscyA9IGNvbXBfb3JkZXIpKSAlPiUgYXJyYW5nZShjb21wKSANCg0KcCA8LSBlbG8uaGlzdG9yeSAlPiUgDQogICNmaWx0ZXIoY2F0ZWc9PSJTdWIxOE0ifGNhdGVnPT0iU3ViMjBNInxjYXRlZz09IkFic00iLCBSLm5ldz49MCkgJT4lDQogIG11dGF0ZShjb21wID0gZmFjdG9yKGNvbXAsIGxldmVscyA9IGNvbXBfb3JkZXIpKSAlPiUgDQogIGdncGxvdChhZXMoeD0gY29tcCwgeT0gUi5uZXcsIGdyb3VwID0gY29tcGV0aXRvciwgY29sID0gQ3RyeSkgKSArDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX2xpbmUobGluZXR5cGU9ICJkYXNoZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdD1tZWRpYW4oZWxvLmhpc3RvcnkkUi5uZXcpLGxpbmV0eXBlPSAiZGFzaGVkIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDIwLCBoanVzdCA9IDEpICkNCg0KDQojcA0KZ2dwbG90bHkocCkNCmBgYA0KDQoNCg0KIyMjIFByb2IgdG8gRmluYWxzW1BPc3RGaW5hbHNdIC0gQ0lzDQoNCmBgYHtyIGluY2x1ZGU9VFJVRSwgZmlnLndpZHRoPSAxNiwgZmlnLmhlaWdodD0xMn0NClByb2IuRmluYWxzX0NJcyA8LSB0aWJibGUoY29tcGV0aXRvcj0gZWxvLmhpc3RvcnkkY29tcGV0aXRvclshaXMubmEoZWxvLmhpc3RvcnkkRS5GaW5hbHMpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYi5maW5hbHMgPSBlbG8uaGlzdG9yeSRFLkZpbmFsc1shaXMubmEoZWxvLmhpc3RvcnkkRS5GaW5hbHMpXSkNCiMjIyMjIyMjIyMjIyMjDQpsaWJyYXJ5KGJvb3QpDQpib290X21lYW5fY2kgPC0gZnVuY3Rpb24oeCwgUiA9IDEwMDApIHsNCiAgaWYgKGxlbmd0aCh1bmlxdWUoeCkpIDw9IDEgfHwgbGVuZ3RoKHgpIDwgMikgew0KICAgICMgQ2FuJ3QgYm9vdHN0cmFwIGlmIG5vIHZhcmlhdGlvbiBvciBvbmx5IG9uZSB2YWx1ZQ0KICAgIHJldHVybihjKE5BX3JlYWxfLCBOQV9yZWFsXykpDQogIH0NCiAgDQogIGJvb3Rfb2JqIDwtIGJvb3QoeCwgc3RhdGlzdGljID0gZnVuY3Rpb24oZGF0YSwgaSkgbWVhbihkYXRhW2ldKSwgUiA9IFIpDQogIGNpIDwtIHRyeUNhdGNoKHsNCiAgICBib290LmNpKGJvb3Rfb2JqLCB0eXBlID0gInBlcmMiKSRwZXJjZW50WzQ6NV0NCiAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSBjKE5BX3JlYWxfLCBOQV9yZWFsXykpDQogIA0KICByZXR1cm4oY2kpDQp9DQojIyMjIyMjIyMjIw0Kc3VtbWFyeV9wcm9icyA8LSBQcm9iLkZpbmFsc19DSXMgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3IpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVhbl9wcm9iID0gbWVhbihwcm9iLmZpbmFscyksDQogICAgY2kgPSBsaXN0KCBib290X21lYW5fY2kocHJvYi5maW5hbHMpICksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUoDQogICAgbG93ZXJfOTVDSSA9IG1hcF9kYmwoY2ksIDEpLA0KICAgIHVwcGVyXzk1Q0kgPSBtYXBfZGJsKGNpLCAyKQ0KICApICU+JQ0KICBzZWxlY3QoLWNpKQ0KDQpwIDwtIGdncGxvdChzdW1tYXJ5X3Byb2JzLCBhZXMoeSA9IGZjdF9yZW9yZGVyKGNvbXBldGl0b3IsIG1lYW5fcHJvYiksIHggPSBtZWFuX3Byb2IpKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAuNTEsIGx0eT0yLCBsd2Q9MC41KSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEsIGNvbG9yID0gImRhcmtncmVlbiIpICsNCiAgZ2VvbV9lcnJvcmJhcigNCiAgICBhZXMoeG1pbiA9IGxvd2VyXzk1Q0ksIHhtYXggPSB1cHBlcl85NUNJKSwNCiAgICB3aWR0aCA9IDAuMiwNCiAgICBuYS5ybSA9IFRSVUUNCiAgKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQcm9iYWJpbGl0eSBvZiBSZWFjaGluZyBGaW5hbHMgKEJvb3RzdHJhcHBlZCA5NSUgQ0kpIiwNCiAgICB5ID0gIkNvbXBldGl0b3IiLA0KICAgIHggPSAiRXN0aW1hdGVkIFByb2JhYmlsaXR5Ig0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpIA0KIysNCiAjIHRoZW1lKA0KICAjICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpICAjIGFuZ2xlZCBsYWJlbHMNCiMgICkNCg0KDQoNCiNwDQpnZ3Bsb3RseShwKQ0KYGBgIA0KDQojIyMgRWxvICAtIENJcw0KDQpgYGB7ciBpbmNsdWRlPVRSVUUsIGZpZy53aWR0aD0gMTYsIGZpZy5oZWlnaHQ9MTJ9DQplbG9fQ0lzIDwtIHRpYmJsZShjb21wZXRpdG9yPSBlbG8uaGlzdG9yeSRjb21wZXRpdG9yWyFpcy5uYShlbG8uaGlzdG9yeSRSLm5ldyldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBFbG8gPSBlbG8uaGlzdG9yeSRSLm5ld1shaXMubmEoZWxvLmhpc3RvcnkkUi5uZXcpXSkNCiMjIyMjIyMjIyMjIyMjDQoNCmJvb3RfbWVhbl9jaV9zYWZlIDwtIGZ1bmN0aW9uKHgsIFIgPSAxMDAwKSB7DQogIGlmIChsZW5ndGgodW5pcXVlKHgpKSA8PSAxIHx8IGxlbmd0aCh4KSA8IDIpIHsNCiAgICAjIENhbid0IGJvb3RzdHJhcCBpZiBubyB2YXJpYXRpb24gb3Igb25seSBvbmUgdmFsdWUNCiAgICByZXR1cm4oYyhOQV9yZWFsXywgTkFfcmVhbF8pKQ0KICB9DQogIA0KICBib290X29iaiA8LSBib290KHgsIHN0YXRpc3RpYyA9IGZ1bmN0aW9uKGRhdGEsIGkpIG1lYW4oZGF0YVtpXSksIFIgPSBSKQ0KICBjaSA8LSB0cnlDYXRjaCh7DQogICAgYm9vdC5jaShib290X29iaiwgdHlwZSA9ICJwZXJjIikkcGVyY2VudFs0OjVdDQogIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgYyhOQV9yZWFsXywgTkFfcmVhbF8pKQ0KICANCiAgcmV0dXJuKGNpKQ0KfQ0KIyMjIyMjIyMjIyMNCnN1bW1hcnlfcHJvYnMgPC0gZWxvX0NJcyAlPiUNCiAgZ3JvdXBfYnkoY29tcGV0aXRvcikgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBtZWFuX2VsbyA9IG1lYW4oRWxvKSwNCiAgICBjaSA9IGxpc3QoYm9vdF9tZWFuX2NpX3NhZmUoRWxvKSksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBtdXRhdGUoDQogICAgbG93ZXJfOTVDSSA9IG1hcF9kYmwoY2ksIDEpLA0KICAgIHVwcGVyXzk1Q0kgPSBtYXBfZGJsKGNpLCAyKQ0KICApICU+JQ0KICBzZWxlY3QoLWNpKQ0KDQpwIDwtIGdncGxvdChzdW1tYXJ5X3Byb2JzLCBhZXMoeSA9IGZjdF9yZW9yZGVyKGNvbXBldGl0b3IsIG1lYW5fZWxvKSwgeCA9IG1lYW5fZWxvKSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBzb3J0KHN1bW1hcnlfcHJvYnMkbWVhbl9lbG8sIGRlY3JlYXNpbmcgPSBUKVs5XSwgbHR5PTIsIGx3ZD0wLjUpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMSwgY29sb3IgPSAiZGFya2dyZWVuIikgKw0KICBnZW9tX2Vycm9yYmFyKA0KICAgIGFlcyh4bWluID0gbG93ZXJfOTVDSSwgeG1heCA9IHVwcGVyXzk1Q0kpLA0KICAgIHdpZHRoID0gMC4yLA0KICAgIG5hLnJtID0gVFJVRQ0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgICNsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkNCiAgICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJFbG8gKEJvb3RzdHJhcHBlZCA5NSUgQ0kpIiwNCiAgICB5ID0gIkNvbXBldGl0b3IiLA0KICAgIHggPSAiRXN0aW1hdGVkIEVsbyINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSANCiMrDQogIyB0aGVtZSgNCiAgIyAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSAgIyBhbmdsZWQgbGFiZWxzDQojICApDQoNCg0KDQojcA0KZ2dwbG90bHkocCkNCmBgYCAgDQoNCiMjIyBQcm9iLlBvZGl1bVtQT1NUIEZJTkFMXSAgLSBDSXMNCg0KYGBge3IgaW5jbHVkZT1UUlVFLCBmaWcud2lkdGg9IDE2LCBmaWcuaGVpZ2h0PTEyfQ0KZWxvLmhpc3RvcnkuZm9yLmxhc3QuY29tcCA8LSANCiAgZWxvLmhpc3RvcnkgJT4lDQogICAgc2VtaV9qb2luKGVsby5sYXN0LmNvbXAsIGpvaW5fYnkoY29tcGV0aXRvcikpDQoNCnBvZGl1bV9DSXMgPC0gdGliYmxlKGNvbXBldGl0b3I9IGVsby5oaXN0b3J5LmZvci5sYXN0LmNvbXAkY29tcGV0aXRvclshaXMubmEoZWxvLmhpc3RvcnkuZm9yLmxhc3QuY29tcCRFLnBvZGl1bSldLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBwb2RpdW0gPSBlbG8uaGlzdG9yeS5mb3IubGFzdC5jb21wJEUucG9kaXVtWyFpcy5uYShlbG8uaGlzdG9yeS5mb3IubGFzdC5jb21wJEUucG9kaXVtKV0pDQojIyMjIyMjIyMjIyMjIw0KDQpib290X21lYW5fY2lfc2FmZSA8LSBmdW5jdGlvbih4LCBSID0gMTAwMCkgew0KICBpZiAobGVuZ3RoKHVuaXF1ZSh4KSkgPD0gMSB8fCBsZW5ndGgoeCkgPCAyKSB7DQogICAgIyBDYW4ndCBib290c3RyYXAgaWYgbm8gdmFyaWF0aW9uIG9yIG9ubHkgb25lIHZhbHVlDQogICAgcmV0dXJuKGMoTkFfcmVhbF8sIE5BX3JlYWxfKSkNCiAgfQ0KICANCiAgYm9vdF9vYmogPC0gYm9vdCh4LCBzdGF0aXN0aWMgPSBmdW5jdGlvbihkYXRhLCBpKSBtZWFuKGRhdGFbaV0pLCBSID0gUikNCiAgY2kgPC0gdHJ5Q2F0Y2goew0KICAgIGJvb3QuY2koYm9vdF9vYmosIHR5cGUgPSAicGVyYyIpJHBlcmNlbnRbNDo1XQ0KICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIGMoTkFfcmVhbF8sIE5BX3JlYWxfKSkNCiAgDQogIHJldHVybihjaSkNCn0NCiMjIyMjIyMjIyMjDQpzdW1tYXJ5X3Byb2JzIDwtIHBvZGl1bV9DSXMgJT4lDQogIGdyb3VwX2J5KGNvbXBldGl0b3IpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVhbl9wb2RpdW0gPSBtZWFuKHBvZGl1bSksDQogICAgY2kgPSBsaXN0KGJvb3RfbWVhbl9jaV9zYWZlKHBvZGl1bSkpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgbXV0YXRlKA0KICAgIGxvd2VyXzk1Q0kgPSBtYXBfZGJsKGNpLCAxKSwNCiAgICB1cHBlcl85NUNJID0gbWFwX2RibChjaSwgMikNCiAgKSAlPiUNCiAgc2VsZWN0KC1jaSkNCg0KcCA8LSBnZ3Bsb3Qoc3VtbWFyeV9wcm9icywgYWVzKHkgPSBmY3RfcmVvcmRlcihjb21wZXRpdG9yLCBtZWFuX3BvZGl1bSksIHggPSBtZWFuX3BvZGl1bSkpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC41MSwgbHR5PTIsIGx3ZD0wLjUpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMSwgY29sb3IgPSAiZGFya2dyZWVuIikgKw0KICBnZW9tX2Vycm9yYmFyKA0KICAgIGFlcyh4bWluID0gbG93ZXJfOTVDSSwgeG1heCA9IHVwcGVyXzk1Q0kpLA0KICAgIHdpZHRoID0gMC4yLA0KICAgIG5hLnJtID0gVFJVRQ0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlByb2JhYmlsaXR5IG9mIFJlYWNoaW5nIFBvZGl1bSAoQm9vdHN0cmFwcGVkIDk1JSBDSSkiLA0KICAgIHkgPSAiQ29tcGV0aXRvciIsDQogICAgeCA9ICJFc3RpbWF0ZWQgUHJvYmFiaWxpdHkiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgDQojKw0KICMgdGhlbWUoDQogICMgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkgICMgYW5nbGVkIGxhYmVscw0KIyAgKQ0KDQoNCg0KI3ANCmdncGxvdGx5KHApDQojIyMjDQoNCmBgYCAgDQoNCg0KDQo=