Code
Praktikum 1 & 2
Statistika Dasar
PRAKTIKUM 1
1.1 Mean untuk Data Kelompok
Dalam data kelompok, mean atau rata-rata dihitung
dengan mempertimbangkan frekuensi setiap kelas dalam kelompok tersebut.
Rumus umum untuk menghitung mean data kelompok adalah:
\[
\bar{x} = \frac{\sum (f_i \cdot x_i)}{\sum f_i}
\]
Penjelasan Rumus:
\(\bar{x}\) = mean (rata-rata) data
kelompok
\(f_i\) = frekuensi pada kelas
ke-\(i\)
\(x_i\) = kelas tengah (midpoint)
pada kelas ke-\(i\)
\(\sum (f_i \cdot x_i)\) = jumlah
dari hasil perkalian antara frekuensi dan kelas tengah
\(\sum f_i\) = total frekuensi
(jumlah semua frekuensi)
1.1.1 Langkah-langkah:
Tentukan kelas tengah untuk setiap kelas
interval
Kalikan kelas tengah dengan
frekuensi untuk setiap kelas.
Jumlahkan hasil perkalian tersebut.
Bagi jumlah tersebut dengan total frekuensi.
CONTOH PERHITUNGAN
1.1.2 DATA DENGAN OUTLIER:
10 - 20
5
20 - 30
8
30 - 40
7
40 - 50
50
50 - 60
5
1.1.2.1 Langkah-langkah Perhitungan untuk Data dengan Outlier:
Tentukan kelas tengah (\(x_i\) )
untuk setiap kelas:
Kelas 10 - 20: \(x_1 = \frac{10 + 20}{2} =
15\)
Kelas 20 - 30: \(x_2 = \frac{20 + 30}{2} =
25\)
Kelas 30 - 40: \(x_3 = \frac{30 + 40}{2} =
35\)
Kelas 40 - 50: \(x_4 = \frac{40 + 50}{2} =
45\)
Kelas 50 - 60: \(x_5 = \frac{50 + 60}{2} =
55\)
Hitung \(f_i \cdot x_i\) untuk
setiap kelas:
\(f_1 \cdot x_1 = 5 \cdot 15 =
75\)
\(f_2 \cdot x_2 = 8 \cdot 25 =
200\)
\(f_3 \cdot x_3 = 7 \cdot 35 =
245\)
\(f_4 \cdot x_4 = 50 \cdot 45 =
2250\)
\(f_5 \cdot x_5 = 5 \cdot 55 =
275\)
Hitung jumlah \(f_i \cdot
x_i\) :
\[
75 + 200 + 245 + 2250 + 275 = 3045
\]
Hitung jumlah total frekuensi:
\[
5 + 8 + 7 + 50 + 5 = 75
\]
Hitung mean dengan data yang ada outlier:
\[
\bar{x} = \frac{3045}{75} = 40.60
\]
Hasil mean dengan outlier = 40.60.
1.1.3 DATA TANPA OUTLIER:
Untuk menghitung data tanpa outlier, kita akan menghapus kelas
interval 40 - 50 dengan frekuensi 50, dan menghitung ulang mean.
10 - 20
5
20 - 30
8
30 - 40
7
50 - 60
5
1.1.3.1 Langkah-langkah Perhitungan untuk Data Tanpa Outlier:
Tentukan kelas tengah (\(x_i\) )
untuk setiap kelas:
Kelas 10 - 20: \(x_1 = \frac{10 + 20}{2} =
15\)
Kelas 20 - 30: \(x_2 = \frac{20 + 30}{2} =
25\)
Kelas 30 - 40: \(x_3 = \frac{30 + 40}{2} =
35\)
Kelas 50 - 60: \(x_4 = \frac{50 + 60}{2} =
55\)
Hitung \(f_i \cdot x_i\) untuk
setiap kelas:
\(f_1 \cdot x_1 = 5 \cdot 15 =
75\)
\(f_2 \cdot x_2 = 8 \cdot 25 =
200\)
\(f_3 \cdot x_3 = 7 \cdot 35 =
245\)
\(f_4 \cdot x_4 = 5 \cdot 55 =
275\)
Hitung jumlah \(f_i \cdot
x_i\) :
\[
75 + 200 + 245 + 275 = 795
\]
Hitung jumlah total frekuensi:
\[
5 + 8 + 7 + 5 = 25
\]
Hitung mean tanpa outlier:
\[
\bar{x} = \frac{795}{25} = 31.80
\]
Hasil mean tanpa outlier = 31.80.
1.1.4 Kesimpulan:
Mean dengan outlier : 40.60
Mean tanpa outlier : 31.80
Outlier yang sangat besar pada kelas interval 40 - 50 menyebabkan
mean menjadi lebih tinggi daripada ketika outlier
dihapus.
1.1.5 Visualisasi Mean dalam Boxplot
1.1.6 Visualisasi Mean dalam Density Plot
1.3 Modus untuk Data Kelompok
Untuk menghitung modus data kelompok, kita mencari
kelas modus , yaitu kelas dengan frekuensi tertinggi,
dan menggunakan rumus berikut:
\[
\text{Modus} = L + \left(\frac{f_1 - f_0}{2f_1 - f_0 - f_2}\right) \cdot
h
\]
Penjelasan Rumus:
\(L\) = batas bawah kelas
modus
\(f_1\) = frekuensi kelas
modus
\(f_0\) = frekuensi kelas sebelum
kelas modus
\(f_2\) = frekuensi kelas setelah
kelas modus
\(h\) = panjang kelas (jarak antara
batas bawah dan batas atas kelas)
1.3.1 Langkah-langkah:
Tentukan kelas modus (kelas dengan frekuensi
tertinggi).
Hitung modus menggunakan rumus di atas.
CONTOH PERHITUNGAN
1.3.2 DATA DENGAN OUTLIER:
10 - 20
5
5
20 - 30
8
13
30 - 40
7
20
40 - 50
50
70
50 - 60
5
75
Kelas dengan frekuensi tertinggi adalah kelas
40 - 50 dengan frekuensi f₁ = 50 .
L (batas bawah kelas modus) = 40
f₀ (frekuensi kelas sebelum kelas modus) = 7 (kelas
30 - 40)
f₂ (frekuensi kelas setelah kelas modus) = 5 (kelas
50 - 60)
h (panjang kelas interval) = 10
1.3.2.1 Langkah-langkah perhitungan modus:
\[
\text{Modus} = 40 + \left( \frac{50 - 7}{(2 \times 50) - 7 - 5} \right)
\times 10
\]
\[
\text{Modus} = 40 + \left( \frac{43}{100 - 7 - 5} \right) \times 10 = 40
+ \left( \frac{43}{88} \right) \times 10
\]
\[
\text{Modus} = 40 + 4.886 = 44.89
\]
Modus untuk data dengan outlier = 44.89
1.3.3 DATA TANPA OUTLIER:
10 - 20
5
5
20 - 30
8
13
30 - 40
7
20
50 - 60
5
25
Kelas dengan frekuensi tertinggi adalah kelas
20 - 30 dengan frekuensi f₁ = 8 .
L (batas bawah kelas modus) = 20
f₀ (frekuensi kelas sebelum kelas modus) = 5 (kelas
10 - 20)
f₂ (frekuensi kelas setelah kelas modus) = 7 (kelas
30 - 40)
h (panjang kelas interval) = 10
1.3.3.1 Langkah-langkah perhitungan modus:
\[
\text{Modus} = 20 + \left( \frac{8 - 5}{(2 \times 8) - 5 - 7} \right)
\times 10
\]
\[
\text{Modus} = 20 + \left( \frac{3}{16 - 5 - 7} \right) \times 10 = 20 +
\left( \frac{3}{4} \right) \times 10
\]
\[
\text{Modus} = 20 + 7.5 = 27.5
\]
Modus untuk data tanpa outlier = 27.5
1.3.4 Kesimpulan:
Modus dengan outlier = 44.89
Modus tanpa outlier = 27.5
Perhitungan modus menunjukkan perbedaan yang signifikan, yang
disebabkan oleh outlier pada data. Outlier menggeser
kelas modus ke kelas dengan frekuensi yang sangat tinggi (kelas 40-50),
yang berkontribusi pada nilai modus yang lebih tinggi.
1.3.5 Visualisasi Modus dalam Boxplot
1.3.6 Visualisasi Modus dalam Density Plot
PRAKTIKUM 2
2.1 BIDANG BISNIS
Deskripsi Masalah:
Sebuah perusahaan mengumpulkan data pendapatan bulanan (dalam juta
rupiah) dari lima cabangnya selama satu bulan.
10 - 20
5
20 - 30
8
30 - 40
7
40 - 50
10
50 - 60
3
100
1
2.1.1 DATA DENGAN OUTLIER
10 - 20
5
20 - 30
8
30 - 40
7
40 - 50
10
50 - 60
3
100
1
2.1.1.1 Menghitung Mean dengan Outlier
Tentukan kelas tengah \(x_i\) :
Kelas 10 - 20: \(x_1 = 15\)
Kelas 20 - 30: \(x_2 = 25\)
Kelas 30 - 40: \(x_3 = 35\)
Kelas 40 - 50: \(x_4 = 45\)
Kelas 50 - 60: \(x_5 = 55\)
Kelas 100: \(x_6 = 100\) (untuk
outlier)
Hitung \(f_i \cdot x_i\) untuk
setiap kelas:
\(f_1 \cdot x_1 = 5 \cdot 15 =
75\)
\(f_2 \cdot x_2 = 8 \cdot 25 =
200\)
\(f_3 \cdot x_3 = 7 \cdot 35 =
245\)
\(f_4 \cdot x_4 = 10 \cdot 45 =
450\)
\(f_5 \cdot x_5 = 3 \cdot 55 =
165\)
\(f_6 \cdot x_6 = 1 \cdot 100 =
100\) (untuk outlier)
Hitung jumlah total \(\sum f_i\)
dan \(\sum (f_i \cdot x_i)\) :
\[
\sum (f_i \cdot x_i) = 75 + 200 + 245 + 450 + 165 + 100 = 1235
\] \[
\sum f_i = 5 + 8 + 7 + 10 + 3 + 1 = 34
\]
Hitung mean dengan outlier:
\[
\bar{x} = \frac{1235}{34} = 36.32 \, \text{juta}
\]
2.1.1.3 Menghitung Modus dengan Outlier
Kelas modus adalah kelas 20 - 30 dengan
frekuensi \(f_1 = 8\) , kelas sebelumnya
adalah kelas 10 - 20 dengan \(f_0 =
5\) , dan kelas setelahnya adalah kelas 30 - 40 dengan \(f_2 = 7\) .
L = 20, f₁ = 8,
f₀ = 5, f₂ = 7, h =
10
Hitung modus :
\[
\text{Modus} = 20 + \left( \frac{8 - 5}{(2 \times 8) - 5 - 7} \right)
\times 10
\]
\[
\text{Modus} = 20 + \left( \frac{3}{16 - 5 - 7} \right) \times 10 = 20 +
\left( \frac{3}{4} \right) \times 10
\]
\[
\text{Modus} = 20 + 7.5 = 27.5, \text{juta}
\]
2.1.2 DATA TANPA OUTLIER
10 - 20
5
20 - 30
8
30 - 40
7
40 - 50
10
50 - 60
3
2.1.2.1 Menghitung Mean Tanpa Outlier
Tentukan kelas tengah \(x_i\) :
Kelas 10 - 20: \(x_1 = \frac{10 + 20}{2} =
15\)
Kelas 20 - 30: \(x_2 = \frac{20 + 30}{2} =
25\)
Kelas 30 - 40: \(x_3 = \frac{30 + 40}{2} =
35\)
Kelas 40 - 50: \(x_4 = \frac{40 + 50}{2} =
45\)
Kelas 50 - 60: \(x_5 = \frac{50 + 60}{2} =
55\)
Hitung \(f_i \cdot x_i\) untuk
setiap kelas:
\(f_1 \cdot x_1 = 5 \cdot 15 =
75\)
\(f_2 \cdot x_2 = 8 \cdot 25 =
200\)
\(f_3 \cdot x_3 = 7 \cdot 35 =
245\)
\(f_4 \cdot x_4 = 10 \cdot 45 =
450\)
\(f_5 \cdot x_5 = 3 \cdot 55 =
165\)
Hitung jumlah total \(\sum f_i\)
dan \(\sum (f_i \cdot x_i)\) :
\[
\sum (f_i \cdot x_i) = 75 + 200 + 245 + 450 + 165 = 1135
\] \[
\sum f_i = 5 + 8 + 7 + 10 + 3 = 33
\]
Hitung mean :
\[
\bar{x} = \frac{1135}{33} = 34.39 \, \text{juta}
\]
2.1.2.3 Menghitung Modus Tanpa Outlier
Kelas modus adalah kelas 20 - 30 dengan
frekuensi \(f_1 = 8\) , kelas sebelumnya
adalah kelas 10 - 20 dengan \(f_0 =
5\) , dan kelas setelahnya adalah kelas 30 - 40 dengan \(f_2 = 7\) .
L = 20, f₁ = 8,
f₀ = 5, f₂ = 7, h =
10
Hitung modus :
\[
\text{Modus} = 20 + \left( \frac{8 - 5}{(2 \times 8) - 5 - 7} \right)
\times 10
\]
\[
\text{Modus} = 20 + \left( \frac{3}{16 - 5 - 7} \right) \times 10 = 20 +
\left( \frac{3}{4} \right) \times 10
\]
\[
\text{Modus} = 20 + 7.5 = 27.5, \text{juta}
\]
2.1.3 Hasil keseluruhan:
Dengan outlier :
Mean = 36.32 juta
Median = 24.38 juta
Modus = 27.5 juta
Tanpa outlier :
Mean = 34.39 juta
Median = 24.38 juta
Modus = 27.5 juta
Pengaruh Outlier :
Outlier mempengaruhi mean karena data ekstrem
tersebut menggeser rata-rata lebih tinggi, tetapi tidak mempengaruhi
median dan modus karena keduanya lebih
stabil terhadap data ekstrem.
2.1.4 Presentase Kecocokan
Untuk menghitung kecocokan keseluruhan antara data dengan outlier dan
tanpa outlier, kita bisa menggunakan rata-rata persentase perbedaan
antara mean , median , dan
modus .
\[
\left| \frac{36.32 - 34.39}{34.39} \right| \times 100 \approx 5.25\%
\]
\[
\left| \frac{24.38 - 24.38}{30} \right| \times 100 = 0\%
\]
\[
\left| \frac{27.05 - 27.05}{27.05} \right| \times 100 = 0\%
\]
Rata-rata Persentase Perbedaan:
Untuk menghitung rata-rata perbedaan antara ketiga nilai (mean,
median, modus):
\[
\text{Rata-rata Perbedaan} = \frac{5.25\% + 0\% + 0\%}{3} = 1.75\%
\]
Persentase Kecocokan: Kecocokan data dapat dihitung dengan: \[
\text{Kecocokan} = 100\% - 1.75\% = 98.25\%
\]
2.1.5 Kesimpulan:
Tingkat kecocokan data yang tinggi (98,25%) menunjukkan bahwa
analisis data baik dengan maupun tanpa outlier memberikan hasil yang
hampir konsisten. Oleh karena itu, strategi perusahaan berdasarkan
analisis ini tetap valid dan dapat diandalkan untuk pengambilan
keputusan.
2.2 BIDANG KESEHATAN
Deskripsi Masalah:
Seorang dokter ingin menyesuaikan dosis obat berdasarkan berat badan
pasien dalam kelompok usia tertentu. Dosis obat yang diberikan akan
dipengaruhi oleh berat badan pasien, dengan rata-rata dosis yang
disarankan adalah sekitar 0.5 mg per kg berat
badan .
40 - 50
6
51 - 60
10
61 - 70
8
71 - 80
4
81 - 90
2
100
1
2.2.1 DATA DENGAN OUTLIER
40 - 50
6
51 - 60
10
61 - 70
8
71 - 80
4
81 - 90
2
100
1
2.2.1.1 Menghitung Mean dengan Outlier
Tentukan kelas tengah (\(x_i\) )
untuk setiap kelas:
Kelas 40 - 50: \(x_1 = \frac{40 + 50}{2} =
45\)
Kelas 51 - 60: \(x_2 = \frac{51 + 60}{2} =
55.5\)
Kelas 61 - 70: \(x_3 = \frac{61 + 70}{2} =
65.5\)
Kelas 71 - 80: \(x_4 = \frac{71 + 80}{2} =
75.5\)
Kelas 81 - 90: \(x_5 = \frac{81 + 90}{2} =
85.5\)
Kelas 100: \(x_6 = 100\) (karena
ini data tunggal dengan nilai 100)
Hitung \(f_i \cdot x_i\) untuk
setiap kelas:
\(f_1 \cdot x_1 = 6 \cdot 45 =
270\)
\(f_2 \cdot x_2 = 10 \cdot 55.5 =
555\)
\(f_3 \cdot x_3 = 8 \cdot 65.5 =
524\)
\(f_4 \cdot x_4 = 4 \cdot 75.5 =
302\)
\(f_5 \cdot x_5 = 2 \cdot 85.5 =
171\)
\(f_6 \cdot x_6 = 1 \cdot 100 =
100\) (untuk outlier)
Hitung jumlah total \(\sum (f_i \cdot
x_i)\) :
\[
\sum (f_i \cdot x_i) = 270 + 555 + 524 + 302 + 171 + 100 = 1922
\]
Hitung jumlah total frekuensi \(\sum
f_i\) :
\[
\sum f_i = 6 + 10 + 8 + 4 + 2 + 1 = 31
\]
Hitung mean dengan rumus:
\[
\bar{x} = \frac{1922}{31} = 61.96 \, \text{kg}
\]
Dosis Obat (dalam mg) = \(61.96 \times 0.5 = 30.98 \, \text{mg}\)
2.2.1.3 Menghitung Modus dengan Outlier
Kelas modus adalah kelas 51 - 60 dengan
frekuensi \(f_1 = 10\) , kelas
sebelumnya adalah kelas 40 - 50 dengan \(f_0 =
6\) , dan kelas setelahnya adalah kelas 61 - 70 dengan \(f_2 = 8\) .
Menggunakan rumus modus:
L = 51 (batas bawah kelas modus)
f₁ = 10 (frekuensi kelas modus)
f₀ = 6 (frekuensi kelas sebelumnya)
f₂ = 8 (frekuensi kelas setelahnya)
h = 10 (panjang kelas interval)
\[
\text{Modus} = 51 + \left( \frac{10 - 6}{(2 \times 10) - 6 - 8} \right)
\times 10
\]
\[
\text{Modus} = 51 + \left( \frac{4}{20 - 6 - 8} \right) \times 10
\]
\[
\text{Modus} = 51 + \left( \frac{4}{6} \right) \times 10 = 51 + 6.67 =
57.67 \, \text{kg}
\]
Dosis Obat (dalam mg) = \(57.67 \times 0.5 = 28.84 \, \text{mg}\)
2.2.2 DATA TANPA OUTLIER
40 - 50
6
51 - 60
10
61 - 70
8
71 - 80
4
81 - 90
2
2.2.2.1 Menghitung Mean Tanpa Outlier
Tentukan kelas tengah \(x_i\) :
Kelas 40 - 50: \(x_1 = \frac{40 + 50}{2} =
45\)
Kelas 51 - 60: \(x_2 = \frac{51 + 60}{2} =
55.5\)
Kelas 61 - 70: \(x_3 = \frac{61 + 70}{2} =
65.5\)
Kelas 71 - 80: \(x_4 = \frac{71 + 80}{2} =
75.5\)
Kelas 81 - 90: \(x_5 = \frac{81 + 90}{2} =
85.5\)
Hitung \(f_i \cdot x_i\) untuk
setiap kelas:
\(f_1 \cdot x_1 = 6 \cdot 45 =
270\)
\(f_2 \cdot x_2 = 10 \cdot 55.5 =
555\)
\(f_3 \cdot x_3 = 8 \cdot 65.5 =
524\)
\(f_4 \cdot x_4 = 4 \cdot 75.5 =
302\)
\(f_5 \cdot x_5 = 2 \cdot 85.5 =
171\)
Hitung jumlah total \(\sum f_i\)
dan \(\sum (f_i \cdot x_i)\) :
\[
\sum (f_i \cdot x_i) = 270 + 555 + 524 + 302 + 171 = 1822
\] \[
\sum f_i = 6 + 10 + 8 + 4 + 2 = 30
\]
Hitung mean :
\[
\bar{x} = \frac{1822}{30} = 60.07 \, \text{kg}
\]
Dosis Obat (dalam mg) = \(60.07 \times 0.5 = 30.04 \, \text{mg}\)
2.2.2.3 Menghitung Modus Tanpa Outlier
Kelas modus adalah kelas 51 - 60 dengan
frekuensi \(f_1 = 10\) , kelas
sebelumnya adalah kelas 40 - 50 dengan \(f_0 =
6\) , dan kelas setelahnya adalah kelas 61 - 70 dengan \(f_2 = 8\) .
L = 51, f₁ = 10,
f₀ = 6, f₂ = 8, h =
10
Hitung modus :
\[
\text{Modus} = 51 + \left( \frac{10 - 6}{(2 \times 10) - 6 - 8} \right)
\times 10
\]
\[
\text{Modus} = 51 + \left( \frac{4}{20 - 6 - 8} \right) \times 10
\]
\[
\text{Modus} = 51 + \left( \frac{4}{6} \right) \times 10 = 51 + 6.67 =
57.67 \, \text{kg}
\]
Dosis Obat (dalam mg) = \(57.67 \times 0.5 = 28.84 \, \text{mg}\)
2.2.3 Hasil keseluruhan:
Dengan Outlier:
Mean = 61.96 kg → Dosis Obat = 30.98 mg
Median = 60 kg → Dosis Obat = 30 mg
Modus = 57.67 kg → Dosis Obat = 28.84 mg
Tanpa Outlier:
Mean = 60.07 kg → Dosis Obat = 30.04 mg
Median = 60 kg → Dosis Obat = 30 mg
Modus = 57.67 kg → Dosis Obat = 28.84 mg
Pengaruh Outlier :
Mean dipengaruhi oleh outlier
median dan modus tetap stabil dan
tidak terpengaruh oleh outlier .
2.2.4 Presentase Kecocokan
Untuk menghitung kecocokan keseluruhan antara data dengan outlier dan
tanpa outlier, kita bisa menggunakan rata-rata persentase perbedaan
antara mean , median , dan
modus .
\[
\left| \frac{30.98 - 30.04}{30.04} \right| \times 100 \approx 3.13\%
\]
\[
\left| \frac{30 - 30}{30} \right| \times 100 = 0\%
\]
\[
\left| \frac{28.84 - 28.84}{28.84} \right| \times 100 = 0\%
\]
Rata-rata Persentase Perbedaan:
Untuk menghitung rata-rata perbedaan antara ketiga nilai (mean,
median, modus):
\[
\text{Rata-rata Perbedaan} = \frac{3.13\% + 0\% + 0\%}{3} = 1.04\%
\]
Persentase Kecocokan: Kecocokan data dapat dihitung dengan: \[
\text{Kecocokan} = 100\% - 1.04\% = 98.96\%
\]
2.2.5 Kesimpulan:
Dapat disimpulkan bahwa dosis obat yang diberikan sudah sangat sesuai
dengan kondisi pasien. Perbandingan antara data dengan outlier dan tanpa
outlier menunjukkan kecocokan yang hampir mencapai 99% ,
dengan perbedaan rata-rata hanya sekitar 1.04% . Hal ini
menunjukkan bahwa meskipun ada sedikit pengaruh dari adanya outlier
(data yang jauh berbeda), perbedaan tersebut tidak signifikan dan dosis
yang dihitung tetap konsisten, baik dengan maupun tanpa outlier.
Dengan demikian, dosis obat yang disarankan berdasarkan berat badan
pasien dapat dianggap tepat dan dapat diterapkan secara umum, karena
hasil perhitungan dosis tetap stabil dan hampir identik dalam kedua
kondisi data tersebut.
2.3 BIDANG PENDIDIKAN
Deskripsi Masalah:
Analisis prestasi akademik siswa berdasarkan data nilai ujian yang
digunakan untuk mengevaluasi efektivitas proses pembelajaran di
sekolah.
0 - 20
2
21 - 40
4
41 - 60
6
61 - 80
5
81 - 90
3
95
1
2.3.1 DATA DENGAN OUTLIER
Tabel berikut menunjukkan data nilai ujian yang dicatat dalam
kelompok interval nilai, dengan outlier pada nilai
95.
0 - 20
2
21 - 40
4
41 - 60
6
61 - 80
5
81 - 90
3
95
1
2.3.1.1 Menghitung Mean dengan Outlier
Tentukan kelas tengah (\(x_i\) )
untuk setiap kelas:
Kelas 0 - 20: \(x_1 = \frac{0 + 20}{2} =
10\)
Kelas 21 - 40: \(x_2 = \frac{21 + 40}{2} =
30.5\)
Kelas 41 - 60: \(x_3 = \frac{41 + 60}{2} =
50.5\)
Kelas 61 - 80: \(x_4 = \frac{61 + 80}{2} =
70.5\)
Kelas 81 - 90: \(x_5 = \frac{81 + 90}{2} =
85.5\)
Kelas 95: \(x_6 = 95\) (karena ini
adalah data tunggal dengan nilai 95)
Hitung \(f_i \cdot x_i\) untuk
setiap kelas:
\(f_1 \cdot x_1 = 2 \cdot 10 =
20\)
\(f_2 \cdot x_2 = 4 \cdot 30.5 =
122\)
\(f_3 \cdot x_3 = 6 \cdot 50.5 =
303\)
\(f_4 \cdot x_4 = 5 \cdot 70.5 =
352.5\)
\(f_5 \cdot x_5 = 3 \cdot 85.5 =
256.5\)
\(f_6 \cdot x_6 = 1 \cdot 95 = 95\)
(untuk outlier)
Hitung jumlah total \(\sum (f_i \cdot
x_i)\) :
\[
\sum (f_i \cdot x_i) = 20 + 122 + 303 + 352.5 + 256.5 + 95 = 1149
\]
Hitung jumlah total frekuensi \(\sum
f_i\) :
\[
\sum f_i = 2 + 4 + 6 + 5 + 3 + 1 = 21
\]
Hitung mean dengan rumus:
\[
\bar{x} = \frac{1149}{21} = 54.71
\]
Hasil Mean (dengan outlier) = 54.71
2.3.1.3 Menghitung Modus dengan Outlier
Kelas modus adalah kelas 41 - 60 dengan
frekuensi \(f_1 = 6\) , kelas sebelumnya
adalah kelas 21 - 40 dengan \(f_0 =
4\) , dan kelas setelahnya adalah kelas 61 - 80 dengan \(f_2 = 5\) .
Menggunakan rumus modus:
L = 41 (batas bawah kelas modus)
f₁ = 6 (frekuensi kelas modus)
f₀ = 4 (frekuensi kelas sebelumnya)
f₂ = 5 (frekuensi kelas setelahnya)
h = 20 (panjang kelas interval)
\[
\text{Modus} = 41 + \left( \frac{6 - 4}{(2 \times 6) - 4 - 5} \right)
\times 20
\]
\[
\text{Modus} = 41 + \left( \frac{2}{12 - 4 - 5} \right) \times 20
\]
\[
\text{Modus} = 41 + \left( \frac{2}{3} \right) \times 20 = 41 + 13.33 =
54.33
\]
Hasil Modus (dengan outlier) = 54.33
2.3.2 DATA TANPA OUTLIER
Untuk menghitung nilai tanpa outlier , kita akan
mengabaikan nilai 95, yang merupakan outlier, sehingga data yang
digunakan adalah:
0 - 20
2
21 - 40
4
41 - 60
6
61 - 80
5
81 - 90
3
2.3.2.1 Menghitung Mean Tanpa Outlier
Tentukan kelas tengah (\(x_i\) )
untuk setiap kelas:
Kelas 0 - 20: \(x_1 = \frac{0 + 20}{2} =
10\)
Kelas 21 - 40: \(x_2 = \frac{21 + 40}{2} =
30.5\)
Kelas 41 - 60: \(x_3 = \frac{41 + 60}{2} =
50.5\)
Kelas 61 - 80: \(x_4 = \frac{61 + 80}{2} =
70.5\)
Kelas 81 - 90: \(x_5 = \frac{81 + 90}{2} =
85.5\)
Hitung \(f_i \cdot x_i\) untuk
setiap kelas:
\(f_1 \cdot x_1 = 2 \cdot 10 =
20\)
\(f_2 \cdot x_2 = 4 \cdot 30.5 =
122\)
\(f_3 \cdot x_3 = 6 \cdot 50.5 =
303\)
\(f_4 \cdot x_4 = 5 \cdot 70.5 =
352.5\)
\(f_5 \cdot x_5 = 3 \cdot 85.5 =
256.5\)
Hitung jumlah total \(\sum (f_i \cdot
x_i)\) :
\[
\sum (f_i \cdot x_i) = 20 + 122 + 303 + 352.5 + 256.5 = 1054
\]
Hitung jumlah total frekuensi \(\sum
f_i\) :
\[
\sum f_i = 2 + 4 + 6 + 5 + 3 = 20
\]
Hitung mean tanpa outlier:
\[
\bar{x} = \frac{1054}{20} = 52.7
\]
Hasil Mean (tanpa outlier) = 52.7
2.3.2.3 Menghitung Modus Tanpa Outlier
Kelas modus adalah kelas 41 - 60 dengan
frekuensi \(f_1 = 6\) , kelas sebelumnya
adalah kelas 21 - 40 dengan \(f_0 =
4\) , dan kelas setelahnya adalah kelas 61 - 80 dengan \(f_2 = 5\) .
Menggunakan rumus modus:
L = 41
f₁ = 6
f₀ = 4
f₂ = 5
h = 20
\[
\text{Modus} = 41 + \left( \frac{6 - 4}{(2 \times 6) - 4 - 5} \right)
\times 20
\]
\[
\text{Modus} = 41 + \left( \frac{2}{12 - 4 - 5} \right) \times 20
\]
\[
\text{Modus} = 41 + \left( \frac{2}{3} \right) \times 20 = 41 + 13.33 =
54.33
\]
Hasil Modus (tanpa outlier) = 54.33
2.3.3 Hasil keseluruhan:
Dengan Outlier :
Mean = 54.71
Median = 56
Modus = 54.33
Tanpa Outlier :
Mean = 52.7
Median = 54.33
Modus = 54.33
Pengaruh Outlier :
Mean terpengaruh oleh outlier dan sedikit lebih
tinggi dibandingkan tanpa outlier.
Median tetap relatif stabil meskipun ada
outlier.
Modus juga tetap stabil meskipun ada outlier.
2.3.4 Presentase Kecocokan
Untuk menghitung kecocokan keseluruhan antara data dengan outlier dan
tanpa outlier, kita bisa menggunakan rata-rata persentase perbedaan
antara mean , median , dan
modus .
\[
\left| \frac{54.71 - 52.07}{52.07} \right| \times 100 \approx 3.81\%
\]
\[
\left| \frac{56 - 54.33}{54.33} \right| \times 100 = 3.07\%
\]
\[
\left| \frac{54.33 - 54.33}{54.33} \right| \times 100 = 0.0\%
\]
Rata-rata Persentase Perbedaan:
Untuk menghitung rata-rata perbedaan antara ketiga nilai (mean,
median, modus):
\[
\text{Rata-rata Perbedaan} = \frac{3.81\% + 3.07\% + 0.0\%}{3} = 2.29\%
\]
Persentase Kecocokan: Kecocokan data dapat dihitung dengan: \[
\text{Kecocokan} = 100\% - 2.29\% = 97.71\%
\]
2.3.5 Kesimpulan:
Konsistensi data yang menunjukkan kecocokan antara dengan dan tanpa
outlier menandakan bahwa performa akademik siswa terdistribusi cukup
merata, dengan sebagian besar siswa berada pada tingkat nilai yang
mencerminkan pemahaman yang memadai terhadap materi yang diajarkan. Ini
menunjukkan bahwa kurikulum dan metode pengajaran yang digunakan dapat
menjangkau sebagian besar siswa, meskipun beberapa siswa mungkin
mengalami kesulitan, seperti yang tercermin dari nilai-nilai di bawah
rata-rata.
LS0tDQp0aXRsZTogIlByYWt0aWt1bSAxICYgMiINCnN1YnRpdGxlOiAiU3RhdGlzdGlrYSBEYXNhciINCmF1dGhvcjogIkFseWEgTWF1cmEgUmFkaXRoYSAoNTIyNDAwMDMpIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246ICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJDOi9Vc2Vycy9EZWxsL09uZURyaXZlL0RvY3VtZW50cy9zdGF0aXMvc3R5bGUuY3NzIg0KLS0tDQoNCjxpbWcgaWQ9ImFseWFhIiBzcmM9IkM6XFVzZXJzXERlbGxcT25lRHJpdmVcRG9jdW1lbnRzXHN0YXRpc1xpbWcvYWx5YWEuanBnIiBhbHQ9IkxvZ28iIHN0eWxlPSJ3aWR0aDoyMDBweDsgZGlzcGxheTogYmxvY2s7IG1hcmdpbjogYXV0bzsiPg0KDQoNCiMgUFJBS1RJS1VNIDENCg0KIyMgMS4xIE1lYW4gdW50dWsgRGF0YSBLZWxvbXBvaw0KDQpEYWxhbSBkYXRhIGtlbG9tcG9rLCAqKm1lYW4qKiBhdGF1IHJhdGEtcmF0YSBkaWhpdHVuZyBkZW5nYW4gbWVtcGVydGltYmFuZ2thbiBmcmVrdWVuc2kgc2V0aWFwIGtlbGFzIGRhbGFtIGtlbG9tcG9rIHRlcnNlYnV0LiBSdW11cyB1bXVtIHVudHVrIG1lbmdoaXR1bmcgbWVhbiBkYXRhIGtlbG9tcG9rIGFkYWxhaDoNCg0KXFsNClxiYXJ7eH0gPSBcZnJhY3tcc3VtIChmX2kgXGNkb3QgeF9pKX17XHN1bSBmX2l9DQpcXQ0KDQpQZW5qZWxhc2FuIFJ1bXVzOg0KDQotIFwoIFxiYXJ7eH0gXCkgPSBtZWFuIChyYXRhLXJhdGEpIGRhdGEga2Vsb21wb2sNCi0gXCggZl9pIFwpID0gZnJla3VlbnNpIHBhZGEga2VsYXMga2UtXChpXCkNCi0gXCggeF9pIFwpID0ga2VsYXMgdGVuZ2FoIChtaWRwb2ludCkgcGFkYSBrZWxhcyBrZS1cKGlcKQ0KLSBcKCBcc3VtIChmX2kgXGNkb3QgeF9pKSBcKSA9IGp1bWxhaCBkYXJpIGhhc2lsIHBlcmthbGlhbiBhbnRhcmEgZnJla3VlbnNpIGRhbiBrZWxhcyB0ZW5nYWgNCi0gXCggXHN1bSBmX2kgXCkgPSB0b3RhbCBmcmVrdWVuc2kgKGp1bWxhaCBzZW11YSBmcmVrdWVuc2kpDQoNCiMjIyAxLjEuMSBMYW5na2FoLWxhbmdrYWg6DQoNCjEuIFRlbnR1a2FuICoqa2VsYXMgdGVuZ2FoKiogdW50dWsgc2V0aWFwIGtlbGFzIGludGVydmFsIA0KMi4gS2FsaWthbiAqKmtlbGFzIHRlbmdhaCoqIGRlbmdhbiAqKmZyZWt1ZW5zaSoqIHVudHVrIHNldGlhcCBrZWxhcy4NCjMuIEp1bWxhaGthbiBoYXNpbCBwZXJrYWxpYW4gdGVyc2VidXQuDQo0LiBCYWdpIGp1bWxhaCB0ZXJzZWJ1dCBkZW5nYW4gdG90YWwgZnJla3VlbnNpLg0KDQotLS0gDQoNCiMjIyBDT05UT0ggUEVSSElUVU5HQU4NCg0KIyMjIDEuMS4yIERBVEEgREVOR0FOIE9VVExJRVI6DQoNCnwgS2VsYXMgICAgICAgICB8IEZyZWt1ZW5zaSAoXChmXCkpICB8DQp8LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgIHwNCnwgMjAgLSAzMCAgICAgICB8IDggICAgICAgICAgICAgICAgICB8DQp8IDMwIC0gNDAgICAgICAgfCA3ICAgICAgICAgICAgICAgICAgfA0KfCA0MCAtIDUwICAgICAgIHwgNTAgICAgICAgICAgICAgICAgIHwNCnwgNTAgLSA2MCAgICAgICB8IDUgICAgICAgICAgICAgICAgICB8DQoNCiMjIyMgMS4xLjIuMSBMYW5na2FoLWxhbmdrYWggUGVyaGl0dW5nYW4gdW50dWsgRGF0YSBkZW5nYW4gT3V0bGllcjoNCg0KMS4gVGVudHVrYW4ga2VsYXMgdGVuZ2FoIChcKHhfaVwpKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCi0gS2VsYXMgMTAgLSAyMDogXCggeF8xID0gXGZyYWN7MTAgKyAyMH17Mn0gPSAxNSBcKQ0KLSBLZWxhcyAyMCAtIDMwOiBcKCB4XzIgPSBcZnJhY3syMCArIDMwfXsyfSA9IDI1IFwpDQotIEtlbGFzIDMwIC0gNDA6IFwoIHhfMyA9IFxmcmFjezMwICsgNDB9ezJ9ID0gMzUgXCkNCi0gS2VsYXMgNDAgLSA1MDogXCggeF80ID0gXGZyYWN7NDAgKyA1MH17Mn0gPSA0NSBcKQ0KLSBLZWxhcyA1MCAtIDYwOiBcKCB4XzUgPSBcZnJhY3s1MCArIDYwfXsyfSA9IDU1IFwpDQoNCjIuIEhpdHVuZyBcKCBmX2kgXGNkb3QgeF9pIFwpIHVudHVrIHNldGlhcCBrZWxhczoNCg0KLSBcKCBmXzEgXGNkb3QgeF8xID0gNSBcY2RvdCAxNSA9IDc1IFwpDQotIFwoIGZfMiBcY2RvdCB4XzIgPSA4IFxjZG90IDI1ID0gMjAwIFwpDQotIFwoIGZfMyBcY2RvdCB4XzMgPSA3IFxjZG90IDM1ID0gMjQ1IFwpDQotIFwoIGZfNCBcY2RvdCB4XzQgPSA1MCBcY2RvdCA0NSA9IDIyNTAgXCkNCi0gXCggZl81IFxjZG90IHhfNSA9IDUgXGNkb3QgNTUgPSAyNzUgXCkNCg0KMy4gSGl0dW5nIGp1bWxhaCBcKCBmX2kgXGNkb3QgeF9pIFwpOg0KDQpcWw0KNzUgKyAyMDAgKyAyNDUgKyAyMjUwICsgMjc1ID0gMzA0NQ0KXF0NCg0KNC4gSGl0dW5nIGp1bWxhaCB0b3RhbCBmcmVrdWVuc2k6DQoNClxbDQo1ICsgOCArIDcgKyA1MCArIDUgPSA3NQ0KXF0NCg0KNS4gSGl0dW5nICoqbWVhbioqIGRlbmdhbiBkYXRhIHlhbmcgYWRhIG91dGxpZXI6DQoNClxbDQpcYmFye3h9ID0gXGZyYWN7MzA0NX17NzV9ID0gNDAuNjANClxdDQoNCioqSGFzaWwgbWVhbiBkZW5nYW4gb3V0bGllcioqID0gNDAuNjAuDQoNCiMjIyAxLjEuMyBEQVRBIFRBTlBBIE9VVExJRVI6DQoNClVudHVrIG1lbmdoaXR1bmcgZGF0YSB0YW5wYSBvdXRsaWVyLCBraXRhIGFrYW4gbWVuZ2hhcHVzIGtlbGFzIGludGVydmFsIDQwIC0gNTAgZGVuZ2FuIGZyZWt1ZW5zaSA1MCwgZGFuIG1lbmdoaXR1bmcgdWxhbmcgbWVhbi4NCg0KfCBLZWxhcyAgICAgICAgIHwgRnJla3VlbnNpIChcKGZcKSkgIHwNCnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IDEwIC0gMjAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgfA0KfCAyMCAtIDMwICAgICAgIHwgOCAgICAgICAgICAgICAgICAgIHwNCnwgMzAgLSA0MCAgICAgICB8IDcgICAgICAgICAgICAgICAgICB8DQp8IDUwIC0gNjAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgfA0KDQojIyMjIDEuMS4zLjEgTGFuZ2thaC1sYW5na2FoIFBlcmhpdHVuZ2FuIHVudHVrIERhdGEgVGFucGEgT3V0bGllcjoNCg0KMS4gVGVudHVrYW4ga2VsYXMgdGVuZ2FoIChcKHhfaVwpKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCi0gS2VsYXMgMTAgLSAyMDogXCggeF8xID0gXGZyYWN7MTAgKyAyMH17Mn0gPSAxNSBcKQ0KLSBLZWxhcyAyMCAtIDMwOiBcKCB4XzIgPSBcZnJhY3syMCArIDMwfXsyfSA9IDI1IFwpDQotIEtlbGFzIDMwIC0gNDA6IFwoIHhfMyA9IFxmcmFjezMwICsgNDB9ezJ9ID0gMzUgXCkNCi0gS2VsYXMgNTAgLSA2MDogXCggeF80ID0gXGZyYWN7NTAgKyA2MH17Mn0gPSA1NSBcKQ0KDQoyLiBIaXR1bmcgXCggZl9pIFxjZG90IHhfaSBcKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCi0gXCggZl8xIFxjZG90IHhfMSA9IDUgXGNkb3QgMTUgPSA3NSBcKQ0KLSBcKCBmXzIgXGNkb3QgeF8yID0gOCBcY2RvdCAyNSA9IDIwMCBcKQ0KLSBcKCBmXzMgXGNkb3QgeF8zID0gNyBcY2RvdCAzNSA9IDI0NSBcKQ0KLSBcKCBmXzQgXGNkb3QgeF80ID0gNSBcY2RvdCA1NSA9IDI3NSBcKQ0KDQozLiBIaXR1bmcganVtbGFoIFwoIGZfaSBcY2RvdCB4X2kgXCk6DQoNClxbDQo3NSArIDIwMCArIDI0NSArIDI3NSA9IDc5NQ0KXF0NCg0KNC4gSGl0dW5nIGp1bWxhaCB0b3RhbCBmcmVrdWVuc2k6DQoNClxbDQo1ICsgOCArIDcgKyA1ID0gMjUNClxdDQoNCjUuIEhpdHVuZyAqKm1lYW4qKiB0YW5wYSBvdXRsaWVyOg0KDQpcWw0KXGJhcnt4fSA9IFxmcmFjezc5NX17MjV9ID0gMzEuODANClxdDQoNCioqSGFzaWwgbWVhbiB0YW5wYSBvdXRsaWVyKiogPSAzMS44MC4NCg0KIyMjIDEuMS40IEtlc2ltcHVsYW46DQotICoqTWVhbiBkZW5nYW4gb3V0bGllcioqOiA0MC42MA0KLSAqKk1lYW4gdGFucGEgb3V0bGllcioqOiAzMS44MA0KDQpPdXRsaWVyIHlhbmcgc2FuZ2F0IGJlc2FyIHBhZGEga2VsYXMgaW50ZXJ2YWwgNDAgLSA1MCBtZW55ZWJhYmthbiAqKm1lYW4qKiBtZW5qYWRpIGxlYmloIHRpbmdnaSBkYXJpcGFkYSBrZXRpa2Egb3V0bGllciBkaWhhcHVzLg0KDQojIyMgMS4xLjUgVmlzdWFsaXNhc2kgTWVhbiBkYWxhbSBCb3hwbG90DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGZyZWt1ZW5zaSB1bnR1ayBtYXNpbmctbWFzaW5nIGtlbGFzDQprZWxhcyA8LSBjKCIxMCAtIDIwIiwgIjIwIC0gMzAiLCAiMzAgLSA0MCIsICI0MCAtIDUwIiwgIjUwIC0gNjAiKQ0KZnJla3VlbnNpX2Rlbmdhbl9vdXRsaWVycyA8LSBjKDUsIDgsIDcsIDUwLCA1KSAjIEZyZWt1ZW5zaSBkZW5nYW4gb3V0bGllcg0KZnJla3VlbnNpX3RhbnBhX291dGxpZXJzIDwtIGMoNSwgOCwgNywgMCwgNSkgICAjIEZyZWt1ZW5zaSB0YW5wYSBvdXRsaWVyICg0MC01MCBkaWhpbGFuZ2thbikNCg0KIyBLZWxhcyB0ZW5nYWggKG1pZHBvaW50KQ0Ka2VsYXNfdGVuZ2FoIDwtIGMoMTUsIDI1LCAzNSwgNDUsIDU1KQ0KDQojIFBlcmhpdHVuZ2FuIG1lYW4gdW50dWsgZGF0YSBkZW5nYW4gb3V0bGllcg0KZmlfeGlfZGVuZ2FuX291dGxpZXJzIDwtIGZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMgKiBrZWxhc190ZW5nYWgNCm1lYW5fZGVuZ2FuX291dGxpZXJzIDwtIHN1bShmaV94aV9kZW5nYW5fb3V0bGllcnMpIC8gc3VtKGZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMpDQoNCiMgUGVyaGl0dW5nYW4gbWVhbiB1bnR1ayBkYXRhIHRhbnBhIG91dGxpZXINCmZpX3hpX3RhbnBhX291dGxpZXJzIDwtIGZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycyAqIGtlbGFzX3RlbmdhaA0KbWVhbl90YW5wYV9vdXRsaWVycyA8LSBzdW0oZmlfeGlfdGFucGFfb3V0bGllcnMpIC8gc3VtKGZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycykNCg0KIyBNZW1idWF0IGRhdGEgZnJhbWUgdW50dWsgcGxvdA0KZGF0YV9ib3hwbG90IDwtIGRhdGEuZnJhbWUoDQogIEtlbGFzX1RlbmdhaCA9IHJlcChrZWxhc190ZW5nYWgsIDIpLA0KICBGcmVrdWVuc2kgPSBjKGZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMsIGZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLCBlYWNoID0gbGVuZ3RoKGtlbGFzX3RlbmdhaCkpDQopDQoNCiMgTWVuZ2dhbmRha2FuIGRhdGEgdW50dWsgdmlzdWFsaXNhc2kgYm94cGxvdA0KZGF0YV9wbG90IDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gcmVwKGRhdGFfYm94cGxvdCRLZWxhc19UZW5nYWgsIHRpbWVzID0gZGF0YV9ib3hwbG90JEZyZWt1ZW5zaSksDQogIEtlbG9tcG9rID0gcmVwKGRhdGFfYm94cGxvdCRLZWxvbXBvaywgdGltZXMgPSBkYXRhX2JveHBsb3QkRnJla3VlbnNpKQ0KKQ0KDQojIE1lbWJ1YXQgYm94cGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgNCiAgZGF0YSA9IGRhdGFfcGxvdCwNCiAgeSA9IH5OaWxhaSwNCiAgY29sb3IgPSB+S2Vsb21wb2ssDQogIHR5cGUgPSAiYm94IiwNCiAgYm94cG9pbnRzID0gIm91dGxpZXJzIg0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1lYW4iLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJLZWxvbXBvayIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWFuIGRlbmdhbiBvdXRsaWVyDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtZWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gInJnYmEoMjIyLCA0NSwgMzgsIDAuOCkiKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWFuIHRhbnBhIG91dGxpZXINCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiVGFucGEgT3V0bGllcnMiLA0KICAgICAgICB5ID0gbWVhbl90YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAicmdiYSgzOCwgMTY2LCA5MSwgMC44KSIpDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQoNCmBgYA0KDQojIyMgMS4xLjYgVmlzdWFsaXNhc2kgTWVhbiBkYWxhbSBEZW5zaXR5IFBsb3QNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEga2Vsb21wb2sgKGZyZWt1ZW5zaSkgdW50dWsgZGF0YSBkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXINCiMgRGF0YSBkZW5nYW4gb3V0bGllcg0Ka2VsYXMgPC0gYygiMTAtMjAiLCAiMjAtMzAiLCAiMzAtNDAiLCAiNDAtNTAiLCAiNTAtNjAiKQ0KZnJla3VlbnNpX2Rlbmdhbl9vdXRsaWVycyA8LSBjKDUsIDgsIDcsIDUwLCA1KQ0KdGVuZ2FoX2tlbGFzIDwtIGMoMTUsIDI1LCAzNSwgNDUsIDU1KSAjIFRpdGlrIHRlbmdhaCBzZXRpYXAga2VsYXMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIHJlcCh0ZW5nYWhfa2VsYXMsIGZyZWt1ZW5zaV9kZW5nYW5fb3V0bGllcnMpDQoNCiMgRGF0YSB0YW5wYSBvdXRsaWVyDQpmcmVrdWVuc2lfdGFucGFfb3V0bGllcnMgPC0gYyg1LCA4LCA3LCAwLCA1KSAjIEtlbGFzIDQwLTUwIGRpaGFwdXMgKGZyZWt1ZW5zaSA9IDApDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIHJlcCh0ZW5nYWhfa2VsYXMsIGZyZWt1ZW5zaV90YW5wYV9vdXRsaWVycykNCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdA0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykNCmRlbnNpdHlfdGFucGFfb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbmdoaXR1bmcgcmF0YS1yYXRhDQptZWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVhbl90YW5wYV9vdXRsaWVycyA8LSBtZWFuKGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyByYXRhLXJhdGEgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fZGVuZ2FuX291dGxpZXJzLCBtZWFuX2Rlbmdhbl9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiUmF0YS1yYXRhIChEZW5nYW4gT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyByYXRhLXJhdGEgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVhbl90YW5wYV9vdXRsaWVycywgbWVhbl90YW5wYV9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJSYXRhLXJhdGEgKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWFuIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgKFRlbmdhaCBLZWxhcykiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIHJhdGEtcmF0YSBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW46Iiwgcm91bmQobWVhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIEFub3Rhc2kgdW50dWsgcmF0YS1yYXRhIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWFuX3RhbnBhX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjoiLCByb3VuZChtZWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQoNCmBgYA0KDQotLS0gDQoNCiMjIDEuMiBNZWRpYW4gdW50dWsgRGF0YSBLZWxvbXBvaw0KDQpVbnR1ayBtZW5naGl0dW5nICoqbWVkaWFuKiogZGF0YSBrZWxvbXBvaywga2l0YSBtZW5jYXJpICoqa2VsYXMgbWVkaWFuKiogdGVybGViaWggZGFodWx1LCB5YW5nIGtlbXVkaWFuIGRpZ3VuYWthbiB1bnR1ayBtZW5naGl0dW5nIG1lZGlhbiBtZW5nZ3VuYWthbiBydW11cyBiZXJpa3V0Og0KDQpcWw0KXHRleHR7TWVkaWFufSA9IEwgKyBcbGVmdChcZnJhY3tcZnJhY3tOfXsyfSAtIEZ9e2Z9XHJpZ2h0KSBcY2RvdCBoDQpcXQ0KDQpQZW5qZWxhc2FuIFJ1bXVzOg0KDQotIFwoIEwgXCkgPSBiYXRhcyBiYXdhaCBrZWxhcyBtZWRpYW4NCi0gXCggTiBcKSA9IHRvdGFsIGZyZWt1ZW5zaSAoanVtbGFoIHNlbXVhIGZyZWt1ZW5zaSkNCi0gXCggRiBcKSA9IGp1bWxhaCBmcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuDQotIFwoIGYgXCkgPSBmcmVrdWVuc2kga2VsYXMgbWVkaWFuDQotIFwoIGggXCkgPSBwYW5qYW5nIGtlbGFzIChqYXJhayBhbnRhcmEgYmF0YXMgYmF3YWggZGFuIGJhdGFzIGF0YXMga2VsYXMpDQoNCiMjIyAxLjIuMSBMYW5na2FoLWxhbmdrYWg6DQoNCjEuIFRlbnR1a2FuICoqa2VsYXMgbWVkaWFuKiogKGtlbGFzIHlhbmcgbWVtaWxpa2kgZnJla3VlbnNpIGt1bXVsYXRpZiBsZWJpaCBkYXJpIFwoIFxmcmFje059ezJ9IFwpKS4NCjIuIEd1bmFrYW4gcnVtdXMgZGkgYXRhcyB1bnR1ayBtZW5naGl0dW5nICoqbWVkaWFuKiouDQoNCi0tLQ0KDQojIyMgQ09OVE9IIFBFUkhJVFVOR0FODQoNCiMjIyAxLjIuMiBEQVRBIERFTkdBTiBPVVRMSUVSOg0KDQp8IEtlbGFzICAgICAgICAgfCBGcmVrdWVuc2kgKFwoZlwpKSB8IEZyZWt1ZW5zaSBLdW11bGF0aWYgKEYpIHwNCnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDIwIC0gMzAgICAgICAgfCA4ICAgICAgICAgICAgICAgICB8IDEzICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMzAgLSA0MCAgICAgICB8IDcgICAgICAgICAgICAgICAgIHwgMjAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA0MCAtIDUwICAgICAgIHwgNTAgICAgICAgICAgICAgICAgfCA3MCAgICAgICAgICAgICAgICAgICAgICB8DQp8IDUwIC0gNjAgICAgICAgfCA1ICAgICAgICAgICAgICAgICB8IDc1ICAgICAgICAgICAgICAgICAgICAgIHwNCg0KLSAqKlRvdGFsIGZyZWt1ZW5zaSAobikqKiA9IDc1DQotICoqXCggXGZyYWN7bn17Mn0gPSBcZnJhY3s3NX17Mn0gPSAzNy41IFwpKiosIHlhbmcgYmVyYXJ0aSBtZWRpYW4gYmVyYWRhIGRpIGtlbGFzIGRlbmdhbiBmcmVrdWVuc2kga3VtdWxhdGlmIGxlYmloIGJlc2FyIGRhcmkgMzcuNS4NCi0gS2VsYXMgeWFuZyBtZW5nYW5kdW5nIG1lZGlhbiBhZGFsYWgga2VsYXMgKio0MCAtIDUwKiogKGthcmVuYSBmcmVrdWVuc2kga3VtdWxhdGlmbnlhIGFkYWxhaCA3MCwgeWFuZyBsZWJpaCBiZXNhciBkYXJpIDM3LjUpLg0KDQojIyMjIDEuMi4yLjEgTGFuZ2thaC1sYW5na2FoIHBlcmhpdHVuZ2FuIG1lZGlhbjoNCg0KLSAqKkwqKiAoYmF0YXMgYmF3YWgga2VsYXMgbWVkaWFuKSA9IDQwDQotICoqRioqIChmcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuKSA9IDIwDQotICoqZioqIChmcmVrdWVuc2kga2VsYXMgbWVkaWFuKSA9IDUwDQotICoqaCoqIChwYW5qYW5nIGtlbGFzIGludGVydmFsKSA9IDEwDQoNClxbDQpcdGV4dHtNZWRpYW59ID0gNDAgKyBcbGVmdCggXGZyYWN7MzcuNSAtIDIwfXs1MH0gXHJpZ2h0KSBcdGltZXMgMTAgPSA0MCArIFxsZWZ0KCBcZnJhY3sxNy41fXs1MH0gXHJpZ2h0KSBcdGltZXMgMTAgPSA0MCArIDMuNSA9IDQzLjUNClxdDQoNCioqTWVkaWFuIHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXIqKiA9IDQzLjUuDQoNCi0tLQ0KDQojIyMgMS4yLjMgREFUQSBUQU5QQSBPVVRMSUVSOg0KDQp8IEtlbGFzICAgICAgICAgfCBGcmVrdWVuc2kgKFwoZlwpKSB8IEZyZWt1ZW5zaSBLdW11bGF0aWYgKEYpIHwNCnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDIwIC0gMzAgICAgICAgfCA4ICAgICAgICAgICAgICAgICB8IDEzICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMzAgLSA0MCAgICAgICB8IDcgICAgICAgICAgICAgICAgIHwgMjAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA1MCAtIDYwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCAyNSAgICAgICAgICAgICAgICAgICAgICB8DQoNCi0gKipUb3RhbCBmcmVrdWVuc2kgKG4pKiogPSAyNQ0KLSAqKlwoIFxmcmFje259ezJ9ID0gXGZyYWN7MjV9ezJ9ID0gMTIuNSBcKSoqLCB5YW5nIGJlcmFydGkgbWVkaWFuIGJlcmFkYSBkaSBrZWxhcyBkZW5nYW4gZnJla3VlbnNpIGt1bXVsYXRpZiBsZWJpaCBiZXNhciBkYXJpIDEyLjUuDQotIEtlbGFzIHlhbmcgbWVuZ2FuZHVuZyBtZWRpYW4gYWRhbGFoIGtlbGFzICoqMjAgLSAzMCoqIChrYXJlbmEgZnJla3VlbnNpIGt1bXVsYXRpZm55YSBhZGFsYWggMTMsIHlhbmcgbGViaWggYmVzYXIgZGFyaSAxMi41KS4NCg0KIyMjIyAxLjIuMy4xIExhbmdrYWgtbGFuZ2thaCBwZXJoaXR1bmdhbiBtZWRpYW46DQoNCi0gKipMKiogKGJhdGFzIGJhd2FoIGtlbGFzIG1lZGlhbikgPSAyMA0KLSAqKkYqKiAoZnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbikgPSA1DQotICoqZioqIChmcmVrdWVuc2kga2VsYXMgbWVkaWFuKSA9IDgNCi0gKipoKiogKHBhbmphbmcga2VsYXMgaW50ZXJ2YWwpID0gMTANCg0KXFsNClx0ZXh0e01lZGlhbn0gPSAyMCArIFxsZWZ0KCBcZnJhY3sxMi41IC0gNX17OH0gXHJpZ2h0KSBcdGltZXMgMTAgPSAyMCArIFxsZWZ0KCBcZnJhY3s3LjV9ezh9IFxyaWdodCkgXHRpbWVzIDEwID0gMjAgKyA5LjM3NSA9IDI5LjM3NQ0KXF0NCg0KKipNZWRpYW4gdW50dWsgZGF0YSB0YW5wYSBvdXRsaWVyKiogPSAyOS4zNzUuDQoNCi0tLQ0KDQojIyMgMS4yLjQgS2VzaW1wdWxhbjoNCi0gKipNZWRpYW4gZGVuZ2FuIG91dGxpZXIqKjogNDMuNQ0KLSAqKk1lZGlhbiB0YW5wYSBvdXRsaWVyKio6IDI5LjM3NQ0KDQpPdXRsaWVyIHBhZGEgZGF0YSBtZW55ZWJhYmthbiBtZWRpYW4geWFuZyBsZWJpaCB0aW5nZ2ksIGthcmVuYSBrZWxhcyBpbnRlcnZhbCBkZW5nYW4gZnJla3VlbnNpIGt1bXVsYXRpZiB0ZXJ0aW5nZ2kgKDQwIC0gNTApIG1lbWlsaWtpIG5pbGFpIHlhbmcgbGViaWggdGluZ2dpLCBtZW1lbmdhcnVoaSBwb3Npc2kgbWVkaWFuLg0KDQojIyMgMS4yLjUgVmlzdWFsaXNhc2kgTWVkaWFuIGRhbGFtIEJveHBsb3QNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IG5pbGFpIGJlcmRhc2Fya2FuIGtlbGFzIChkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXIpDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKA0KICByZXAoMTUsIDUpLCAgIyBLZWxhcyAxMC0yMCwgZnJla3VlbnNpIDUNCiAgcmVwKDI1LCA4KSwgICMgS2VsYXMgMjAtMzAsIGZyZWt1ZW5zaSA4DQogIHJlcCgzNSwgNyksICAjIEtlbGFzIDMwLTQwLCBmcmVrdWVuc2kgNw0KICByZXAoNDUsIDUwKSwgIyBLZWxhcyA0MC01MCwgZnJla3VlbnNpIDUwDQogIHJlcCg1NSwgNSkgICAjIEtlbGFzIDUwLTYwLCBmcmVrdWVuc2kgNQ0KKQ0KDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGMoDQogIHJlcCgxNSwgNSksICAjIEtlbGFzIDEwLTIwLCBmcmVrdWVuc2kgNQ0KICByZXAoMjUsIDgpLCAgIyBLZWxhcyAyMC0zMCwgZnJla3VlbnNpIDgNCiAgcmVwKDM1LCA3KSwgICMgS2VsYXMgMzAtNDAsIGZyZWt1ZW5zaSA3DQogIHJlcCg1NSwgNSkgICAjIEtlbGFzIDUwLTYwLCBmcmVrdWVuc2kgNQ0KKQ0KDQojIE1lbmdoaXR1bmcgbWVkaWFuDQptZWRpYW5fZGVuZ2FuX291dGxpZXJzIDwtIDQzLjUgICMgTWVkaWFuIGRpaGl0dW5nIHNlYmVsdW1ueWENCm1lZGlhbl90YW5wYV9vdXRsaWVycyA8LSAyOS4zNzUgICMgTWVkaWFuIGRpaGl0dW5nIHNlYmVsdW1ueWENCg0KIyBNZW5nZ2FidW5na2FuIGRhdGEgdW50dWsgdmlzdWFsaXNhc2kNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksIA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW5lbnR1a2FuIHdhcm5hIHNlY2FyYSBla3NwbGlzaXQgdW50dWsgc2V0aWFwIGtlbG9tcG9rIChkYWxhbSBmb3JtYXQgaGV4KQ0Kd2FybmFfZGVuZ2FuX291dGxpZXJzIDwtICcjREUyRDI2JyAgIyBNZXJhaA0Kd2FybmFfdGFucGFfb3V0bGllcnMgPC0gJyMyNkE2NUInICAgIyBIaWphdQ0KDQojIE1lbWJ1YXQgYm94cGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgNCiAgZGF0YSwNCiAgeSA9IH5OaWxhaSwNCiAgY29sb3IgPSB+S2Vsb21wb2ssDQogIGNvbG9ycyA9IGMoIkRlbmdhbiBPdXRsaWVycyIgPSB3YXJuYV9kZW5nYW5fb3V0bGllcnMsICJUYW5wYSBPdXRsaWVycyIgPSB3YXJuYV90YW5wYV9vdXRsaWVycyksICMgTWVuZ2F0dXIgd2FybmEgc2VjYXJhIGVrc3BsaXNpdA0KICB0eXBlID0gImJveCIsDQogIGJveHBvaW50cyA9ICJvdXRsaWVycyIgICMgTWVuYW1waWxrYW4gdGl0aWsgb3V0bGllcnMNCikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWRpYW4iLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lZGlhbl9kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuOiIsIHJvdW5kKG1lZGlhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAicmVkIikNCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lZGlhbl90YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gImdyZWVuIikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCg0KDQpgYGANCg0KIyMjIDEuMi42IFZpc3VhbGlzYXNpIE1lZGlhbiBkYWxhbSBEZW5zaXR5IFBsb3QNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBuaWxhaSBiZXJkYXNhcmthbiBrZWxhcyAoZGVuZ2FuIGRhbiB0YW5wYSBvdXRsaWVyKQ0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYygNCiAgcmVwKDE1LCA1KSwgICMgS2VsYXMgMTAtMjAsIGZyZWt1ZW5zaSA1DQogIHJlcCgyNSwgOCksICAjIEtlbGFzIDIwLTMwLCBmcmVrdWVuc2kgOA0KICByZXAoMzUsIDcpLCAgIyBLZWxhcyAzMC00MCwgZnJla3VlbnNpIDcNCiAgcmVwKDQ1LCA1MCksICMgS2VsYXMgNDAtNTAsIGZyZWt1ZW5zaSA1MA0KICByZXAoNTUsIDUpICAgIyBLZWxhcyA1MC02MCwgZnJla3VlbnNpIDUNCikNCg0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBjKA0KICByZXAoMTUsIDUpLCAgIyBLZWxhcyAxMC0yMCwgZnJla3VlbnNpIDUNCiAgcmVwKDI1LCA4KSwgICMgS2VsYXMgMjAtMzAsIGZyZWt1ZW5zaSA4DQogIHJlcCgzNSwgNyksICAjIEtlbGFzIDMwLTQwLCBmcmVrdWVuc2kgNw0KICByZXAoNTUsIDUpICAgIyBLZWxhcyA1MC02MCwgZnJla3VlbnNpIDUNCikNCg0KIyBNZW5naGl0dW5nIG1lZGlhbg0KbWVkaWFuX2Rlbmdhbl9vdXRsaWVycyA8LSA0My41ICAjIE1lZGlhbiBkaWhpdHVuZyBzZWJlbHVtbnlhDQptZWRpYW5fdGFucGFfb3V0bGllcnMgPC0gMjkuMzc1ICAjIE1lZGlhbiBkaWhpdHVuZyBzZWJlbHVtbnlhDQoNCiMgTWVuZ2hpdHVuZyBkZW5zaXR5DQpkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtZWRpYW4gdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbl9kZW5nYW5fb3V0bGllcnMsIG1lZGlhbl9kZW5nYW5fb3V0bGllcnMpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lZGlhbiAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbWVkaWFuIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbl90YW5wYV9vdXRsaWVycywgbWVkaWFuX3RhbnBhX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lZGlhbiAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1lZGlhbiBwYWRhIERlbnNpdHkgUGxvdCIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgUGVuamVsYXNhbiB1bnR1ayBtZWRpYW4gZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW5fZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsICAjIFBvc2lzaSB0ZWtzIHNlZGlraXQgbGViaWggdGluZ2dpIGRhcmkgZ2FyaXMNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIFBlbmplbGFzYW4gdW50dWsgbWVkaWFuIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsICAjIFBvc2lzaSB0ZWtzIHNlZGlraXQgbGViaWggdGluZ2dpIGRhcmkgZ2FyaXMNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCg0KDQpgYGANCg0KLS0tDQoNCiMjIDEuMyBNb2R1cyB1bnR1ayBEYXRhIEtlbG9tcG9rDQoNClVudHVrIG1lbmdoaXR1bmcgKiptb2R1cyoqIGRhdGEga2Vsb21wb2ssIGtpdGEgbWVuY2FyaSAqKmtlbGFzIG1vZHVzKiosIHlhaXR1IGtlbGFzIGRlbmdhbiBmcmVrdWVuc2kgdGVydGluZ2dpLCBkYW4gbWVuZ2d1bmFrYW4gcnVtdXMgYmVyaWt1dDoNCg0KXFsNClx0ZXh0e01vZHVzfSA9IEwgKyBcbGVmdChcZnJhY3tmXzEgLSBmXzB9ezJmXzEgLSBmXzAgLSBmXzJ9XHJpZ2h0KSBcY2RvdCBoDQpcXQ0KDQpQZW5qZWxhc2FuIFJ1bXVzOg0KDQotIFwoIEwgXCkgPSBiYXRhcyBiYXdhaCBrZWxhcyBtb2R1cw0KLSBcKCBmXzEgXCkgPSBmcmVrdWVuc2kga2VsYXMgbW9kdXMNCi0gXCggZl8wIFwpID0gZnJla3VlbnNpIGtlbGFzIHNlYmVsdW0ga2VsYXMgbW9kdXMNCi0gXCggZl8yIFwpID0gZnJla3VlbnNpIGtlbGFzIHNldGVsYWgga2VsYXMgbW9kdXMNCi0gXCggaCBcKSA9IHBhbmphbmcga2VsYXMgKGphcmFrIGFudGFyYSBiYXRhcyBiYXdhaCBkYW4gYmF0YXMgYXRhcyBrZWxhcykNCg0KIyMjIDEuMy4xIExhbmdrYWgtbGFuZ2thaDoNCg0KMS4gVGVudHVrYW4gKiprZWxhcyBtb2R1cyoqIChrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSkuDQoyLiBIaXR1bmcgKiptb2R1cyoqIG1lbmdndW5ha2FuIHJ1bXVzIGRpIGF0YXMuDQoNCi0tLQ0KDQojIyMgQ09OVE9IIFBFUkhJVFVOR0FODQoNCiMjIyAxLjMuMiBEQVRBIERFTkdBTiBPVVRMSUVSOg0KDQp8IEtlbGFzICAgICAgICAgfCBGcmVrdWVuc2kgKFwoZlwpKSB8IEZyZWt1ZW5zaSBLdW11bGF0aWYgKEYpIHwNCnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDIwIC0gMzAgICAgICAgfCA4ICAgICAgICAgICAgICAgICB8IDEzICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMzAgLSA0MCAgICAgICB8IDcgICAgICAgICAgICAgICAgIHwgMjAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA0MCAtIDUwICAgICAgIHwgNTAgICAgICAgICAgICAgICAgfCA3MCAgICAgICAgICAgICAgICAgICAgICB8DQp8IDUwIC0gNjAgICAgICAgfCA1ICAgICAgICAgICAgICAgICB8IDc1ICAgICAgICAgICAgICAgICAgICAgIHwNCg0KLSAqKktlbGFzIGRlbmdhbiBmcmVrdWVuc2kgdGVydGluZ2dpKiogYWRhbGFoIGtlbGFzICoqNDAgLSA1MCoqIGRlbmdhbiAqKmZyZWt1ZW5zaSBm4oKBID0gNTAqKi4NCi0gKipMKiogKGJhdGFzIGJhd2FoIGtlbGFzIG1vZHVzKSA9IDQwDQotICoqZuKCgCoqIChmcmVrdWVuc2kga2VsYXMgc2ViZWx1bSBrZWxhcyBtb2R1cykgPSA3IChrZWxhcyAzMCAtIDQwKQ0KLSAqKmbigoIqKiAoZnJla3VlbnNpIGtlbGFzIHNldGVsYWgga2VsYXMgbW9kdXMpID0gNSAoa2VsYXMgNTAgLSA2MCkNCi0gKipoKiogKHBhbmphbmcga2VsYXMgaW50ZXJ2YWwpID0gMTANCg0KIyMjIyAxLjMuMi4xIExhbmdrYWgtbGFuZ2thaCBwZXJoaXR1bmdhbiBtb2R1czoNCg0KXFsNClx0ZXh0e01vZHVzfSA9IDQwICsgXGxlZnQoIFxmcmFjezUwIC0gN317KDIgXHRpbWVzIDUwKSAtIDcgLSA1fSBccmlnaHQpIFx0aW1lcyAxMA0KXF0NCg0KXFsNClx0ZXh0e01vZHVzfSA9IDQwICsgXGxlZnQoIFxmcmFjezQzfXsxMDAgLSA3IC0gNX0gXHJpZ2h0KSBcdGltZXMgMTAgPSA0MCArIFxsZWZ0KCBcZnJhY3s0M317ODh9IFxyaWdodCkgXHRpbWVzIDEwDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gNDAgKyA0Ljg4NiA9IDQ0Ljg5DQpcXQ0KDQoqKk1vZHVzIHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXIqKiA9IDQ0Ljg5DQoNCi0tLQ0KDQojIyMgMS4zLjMgREFUQSBUQU5QQSBPVVRMSUVSOg0KDQp8IEtlbGFzICAgICAgICAgfCBGcmVrdWVuc2kgKFwoZlwpKSB8IEZyZWt1ZW5zaSBLdW11bGF0aWYgKEYpIHwNCnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDIwIC0gMzAgICAgICAgfCA4ICAgICAgICAgICAgICAgICB8IDEzICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMzAgLSA0MCAgICAgICB8IDcgICAgICAgICAgICAgICAgIHwgMjAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA1MCAtIDYwICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCAyNSAgICAgICAgICAgICAgICAgICAgICB8DQoNCi0gKipLZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSoqIGFkYWxhaCBrZWxhcyAqKjIwIC0gMzAqKiBkZW5nYW4gKipmcmVrdWVuc2kgZuKCgSA9IDgqKi4NCi0gKipMKiogKGJhdGFzIGJhd2FoIGtlbGFzIG1vZHVzKSA9IDIwDQotICoqZuKCgCoqIChmcmVrdWVuc2kga2VsYXMgc2ViZWx1bSBrZWxhcyBtb2R1cykgPSA1IChrZWxhcyAxMCAtIDIwKQ0KLSAqKmbigoIqKiAoZnJla3VlbnNpIGtlbGFzIHNldGVsYWgga2VsYXMgbW9kdXMpID0gNyAoa2VsYXMgMzAgLSA0MCkNCi0gKipoKiogKHBhbmphbmcga2VsYXMgaW50ZXJ2YWwpID0gMTANCg0KIyMjIyAxLjMuMy4xIExhbmdrYWgtbGFuZ2thaCBwZXJoaXR1bmdhbiBtb2R1czoNCg0KXFsNClx0ZXh0e01vZHVzfSA9IDIwICsgXGxlZnQoIFxmcmFjezggLSA1fXsoMiBcdGltZXMgOCkgLSA1IC0gN30gXHJpZ2h0KSBcdGltZXMgMTANClxdDQoNClxbDQpcdGV4dHtNb2R1c30gPSAyMCArIFxsZWZ0KCBcZnJhY3szfXsxNiAtIDUgLSA3fSBccmlnaHQpIFx0aW1lcyAxMCA9IDIwICsgXGxlZnQoIFxmcmFjezN9ezR9IFxyaWdodCkgXHRpbWVzIDEwDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gMjAgKyA3LjUgPSAyNy41DQpcXQ0KDQoqKk1vZHVzIHVudHVrIGRhdGEgdGFucGEgb3V0bGllcioqID0gMjcuNQ0KDQotLS0NCg0KIyMjIDEuMy40IEtlc2ltcHVsYW46DQoNCi0gKipNb2R1cyBkZW5nYW4gb3V0bGllcioqID0gNDQuODkNCi0gKipNb2R1cyB0YW5wYSBvdXRsaWVyKiogPSAyNy41DQoNClBlcmhpdHVuZ2FuIG1vZHVzIG1lbnVuanVra2FuIHBlcmJlZGFhbiB5YW5nIHNpZ25pZmlrYW4sIHlhbmcgZGlzZWJhYmthbiBvbGVoICoqb3V0bGllcioqIHBhZGEgZGF0YS4gT3V0bGllciBtZW5nZ2VzZXIga2VsYXMgbW9kdXMga2Uga2VsYXMgZGVuZ2FuIGZyZWt1ZW5zaSB5YW5nIHNhbmdhdCB0aW5nZ2kgKGtlbGFzIDQwLTUwKSwgeWFuZyBiZXJrb250cmlidXNpIHBhZGEgbmlsYWkgbW9kdXMgeWFuZyBsZWJpaCB0aW5nZ2kuDQoNCg0KIyMjIDEuMy41IFZpc3VhbGlzYXNpIE1vZHVzIGRhbGFtIEJveHBsb3QNCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIE1lbWJ1YXQgZGF0YSBiZXJiYXNpcyBmcmVrdWVuc2kNCiMgRGF0YSBkZW5nYW4gb3V0bGllcg0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYygNCiAgcmVwKDE1LCA1KSwgICMgTmlsYWkgZGkga2VsYXMgMTAtMjAsIGZyZWt1ZW5zaSA1DQogIHJlcCgyNSwgOCksICAjIE5pbGFpIGRpIGtlbGFzIDIwLTMwLCBmcmVrdWVuc2kgOA0KICByZXAoMzUsIDcpLCAgIyBOaWxhaSBkaSBrZWxhcyAzMC00MCwgZnJla3VlbnNpIDcNCiAgcmVwKDQ1LCA1MCksICMgTmlsYWkgZGkga2VsYXMgNDAtNTAsIGZyZWt1ZW5zaSA1MA0KICByZXAoNTUsIDUpICAgIyBOaWxhaSBkaSBrZWxhcyA1MC02MCwgZnJla3VlbnNpIDUNCikNCg0KIyBEYXRhIHRhbnBhIG91dGxpZXINCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYygNCiAgcmVwKDE1LCA1KSwgICMgTmlsYWkgZGkga2VsYXMgMTAtMjAsIGZyZWt1ZW5zaSA1DQogIHJlcCgyNSwgOCksICAjIE5pbGFpIGRpIGtlbGFzIDIwLTMwLCBmcmVrdWVuc2kgOA0KICByZXAoMzUsIDcpLCAgIyBOaWxhaSBkaSBrZWxhcyAzMC00MCwgZnJla3VlbnNpIDcNCiAgcmVwKDU1LCA1KSAgICMgTmlsYWkgZGkga2VsYXMgNTAtNjAsIGZyZWt1ZW5zaSA1DQopDQoNCiMgTWVuZ2hpdHVuZyBtb2R1cyBzZWNhcmEgbWFudWFsDQptb2R1c19kZW5nYW5fb3V0bGllcnMgPC0gNDQuODkgICMgRGloaXR1bmcgc2ViZWx1bW55YQ0KbW9kdXNfdGFucGFfb3V0bGllcnMgPC0gMjcuNSAgICAjIERpaGl0dW5nIHNlYmVsdW1ueWENCg0KIyBNZW5nZ2FidW5na2FuIGRhdGEga2UgZGFsYW0gc2F0dSBkYXRhIGZyYW1lDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gYyhkYXRhX2Rlbmdhbl9vdXRsaWVycywgZGF0YV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLCANCiAgICAgICAgICAgICAgICAgdGltZXMgPSBjKGxlbmd0aChkYXRhX2Rlbmdhbl9vdXRsaWVycyksIGxlbmd0aChkYXRhX3RhbnBhX291dGxpZXJzKSkpDQopDQoNCiMgTWVuZW50dWthbiB3YXJuYSB1bnR1ayBzZXRpYXAga2Vsb21wb2sNCndhcm5hX2Rlbmdhbl9vdXRsaWVycyA8LSAnI0RFMkQyNicgICMgTWVyYWgNCndhcm5hX3RhbnBhX291dGxpZXJzIDwtICcjMjZBNjVCJyAgICMgSGlqYXUNCg0KIyBNZW1idWF0IGJveHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoDQogIGRhdGEsIA0KICB5ID0gfk5pbGFpLCANCiAgY29sb3IgPSB+S2Vsb21wb2ssIA0KICBjb2xvcnMgPSBjKCJEZW5nYW4gT3V0bGllcnMiID0gd2FybmFfZGVuZ2FuX291dGxpZXJzLCAiVGFucGEgT3V0bGllcnMiID0gd2FybmFfdGFucGFfb3V0bGllcnMpLCAjIE1lbmdhdHVyIHdhcm5hIHNlY2FyYSBla3NwbGlzaXQNCiAgdHlwZSA9ICJib3giLCANCiAgYm94cG9pbnRzID0gIm91dGxpZXJzIiAgIyBNZW5hbXBpbGthbiB0aXRpayBvdXRsaWVycw0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1vZHVzIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtb2R1c19kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6Iiwgcm91bmQobW9kdXNfZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gd2FybmFfZGVuZ2FuX291dGxpZXJzKSAgIyBNZW5lbnR1a2FuIHdhcm5hIHRla3MgdW50dWsgYW5vdGFzaQ0KICAgICAgKSwNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiVGFucGEgT3V0bGllcnMiLA0KICAgICAgICB5ID0gbW9kdXNfdGFucGFfb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6Iiwgcm91bmQobW9kdXNfdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSB3YXJuYV90YW5wYV9vdXRsaWVycykgICMgTWVuZW50dWthbiB3YXJuYSB0ZWtzIHVudHVrIGFub3Rhc2kNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCg0KDQpgYGANCg0KIyMjIDEuMy42IFZpc3VhbGlzYXNpIE1vZHVzIGRhbGFtIERlbnNpdHkgUGxvdA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCg0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YSBkZW5nYW4ga2VsYXMgZnJla3VlbnNpIHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKA0KICByZXAoMTUsIDUpLCAgIyBOaWxhaSByYXRhLXJhdGEga2VsYXMgMTAtMjAsIGZyZWt1ZW5zaSA1DQogIHJlcCgyNSwgOCksICAjIE5pbGFpIHJhdGEtcmF0YSBrZWxhcyAyMC0zMCwgZnJla3VlbnNpIDgNCiAgcmVwKDM1LCA3KSwgICMgTmlsYWkgcmF0YS1yYXRhIGtlbGFzIDMwLTQwLCBmcmVrdWVuc2kgNw0KICByZXAoNDUsIDUwKSwgIyBOaWxhaSByYXRhLXJhdGEga2VsYXMgNDAtNTAsIGZyZWt1ZW5zaSA1MA0KICByZXAoNTUsIDUpICAgIyBOaWxhaSByYXRhLXJhdGEga2VsYXMgNTAtNjAsIGZyZWt1ZW5zaSA1DQopDQoNCiMgRGF0YSBkZW5nYW4ga2VsYXMgZnJla3VlbnNpIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYygNCiAgcmVwKDE1LCA1KSwgICMgTmlsYWkgcmF0YS1yYXRhIGtlbGFzIDEwLTIwLCBmcmVrdWVuc2kgNQ0KICByZXAoMjUsIDgpLCAgIyBOaWxhaSByYXRhLXJhdGEga2VsYXMgMjAtMzAsIGZyZWt1ZW5zaSA4DQogIHJlcCgzNSwgNyksICAjIE5pbGFpIHJhdGEtcmF0YSBrZWxhcyAzMC00MCwgZnJla3VlbnNpIDcNCiAgcmVwKDU1LCA1KSAgICMgTmlsYWkgcmF0YS1yYXRhIGtlbGFzIDUwLTYwLCBmcmVrdWVuc2kgNQ0KKQ0KDQojIE1vZHVzIHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXINCm1vZHVzX2Rlbmdhbl9vdXRsaWVycyA8LSA0MCArICg1MCAtIDcpIC8gKDEwMCAtIDcgLSA1KSAqIDEwDQojIE1vZHVzIHVudHVrIGRhdGEgdGFucGEgb3V0bGllcg0KbW9kdXNfdGFucGFfb3V0bGllcnMgPC0gMjAgKyAoOCAtIDUpIC8gKDE2IC0gNSAtIDcpICogMTANCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdA0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykNCmRlbnNpdHlfdGFucGFfb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbW9kdXMgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1vZHVzX2Rlbmdhbl9vdXRsaWVycywgbW9kdXNfZGVuZ2FuX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNb2R1cyAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbW9kdXMgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobW9kdXNfdGFucGFfb3V0bGllcnMsIG1vZHVzX3RhbnBhX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1vZHVzIChUYW5wYSBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgRGVuc2l0eSBQbG90IGRhbiBNb2R1cyIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtb2R1cyBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZHVzX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCByb3VuZChtb2R1c19kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIEFub3Rhc2kgdW50dWsgbW9kdXMgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZHVzX3RhbnBhX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6Iiwgcm91bmQobW9kdXNfdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCg0KYGBgDQotLS0NCg0KIyBQUkFLVElLVU0gMg0KDQojIyAyLjEgQklEQU5HIEJJU05JUw0KDQoqKkRlc2tyaXBzaSBNYXNhbGFoOioqICANCg0KU2VidWFoIHBlcnVzYWhhYW4gbWVuZ3VtcHVsa2FuIGRhdGEgcGVuZGFwYXRhbiBidWxhbmFuIChkYWxhbSBqdXRhIHJ1cGlhaCkgZGFyaSBsaW1hIGNhYmFuZ255YSBzZWxhbWEgc2F0dSBidWxhbi4gIA0KDQp8IEtlbGFzIFBlbmRhcGF0YW4gKGp1dGEpIHwgRnJla3VlbnNpIChmKSB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18DQp8IDEwIC0gMjAgICAgICAgICAgICAgICAgIHwgNSAgICAgICAgICAgICB8DQp8IDIwIC0gMzAgICAgICAgICAgICAgICAgIHwgOCAgICAgICAgICAgICB8DQp8IDMwIC0gNDAgICAgICAgICAgICAgICAgIHwgNyAgICAgICAgICAgICB8DQp8IDQwIC0gNTAgICAgICAgICAgICAgICAgIHwgMTAgICAgICAgICAgICB8DQp8IDUwIC0gNjAgICAgICAgICAgICAgICAgIHwgMyAgICAgICAgICAgICB8DQp8IDEwMCAgICAgICAgICAgICAgICAgICAgIHwgMSAgICAgICAgICAgICB8IA0KDQotLS0NCg0KIyMjIDIuMS4xIERBVEEgREVOR0FOIE9VVExJRVINCg0KfCBLZWxhcyBQZW5kYXBhdGFuIChqdXRhKSB8IEZyZWt1ZW5zaSAoZikgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgICAgICAgICAgICB8IDUgICAgICAgICAgICAgfA0KfCAyMCAtIDMwICAgICAgICAgICAgICAgICB8IDggICAgICAgICAgICAgfA0KfCAzMCAtIDQwICAgICAgICAgICAgICAgICB8IDcgICAgICAgICAgICAgfA0KfCA0MCAtIDUwICAgICAgICAgICAgICAgICB8IDEwICAgICAgICAgICAgfA0KfCA1MCAtIDYwICAgICAgICAgICAgICAgICB8IDMgICAgICAgICAgICAgfA0KfCAxMDAgICAgICAgICAgICAgICAgICAgICB8IDEgICAgICAgICAgICAgfCAgKihvdXRsaWVyKSoNCg0KIyMjIyAyLjEuMS4xIE1lbmdoaXR1bmcgTWVhbiBkZW5nYW4gT3V0bGllcg0KDQoxLiBUZW50dWthbiBrZWxhcyB0ZW5nYWggXCggeF9pIFwpOg0KDQogICAtIEtlbGFzIDEwIC0gMjA6IFwoIHhfMSA9IDE1IFwpDQogICAtIEtlbGFzIDIwIC0gMzA6IFwoIHhfMiA9IDI1IFwpDQogICAtIEtlbGFzIDMwIC0gNDA6IFwoIHhfMyA9IDM1IFwpDQogICAtIEtlbGFzIDQwIC0gNTA6IFwoIHhfNCA9IDQ1IFwpDQogICAtIEtlbGFzIDUwIC0gNjA6IFwoIHhfNSA9IDU1IFwpDQogICAtIEtlbGFzIDEwMDogXCggeF82ID0gMTAwIFwpICoodW50dWsgb3V0bGllcikqDQoNCjIuIEhpdHVuZyBcKCBmX2kgXGNkb3QgeF9pIFwpIHVudHVrIHNldGlhcCBrZWxhczoNCg0KICAgLSBcKCBmXzEgXGNkb3QgeF8xID0gNSBcY2RvdCAxNSA9IDc1IFwpDQogICAtIFwoIGZfMiBcY2RvdCB4XzIgPSA4IFxjZG90IDI1ID0gMjAwIFwpDQogICAtIFwoIGZfMyBcY2RvdCB4XzMgPSA3IFxjZG90IDM1ID0gMjQ1IFwpDQogICAtIFwoIGZfNCBcY2RvdCB4XzQgPSAxMCBcY2RvdCA0NSA9IDQ1MCBcKQ0KICAgLSBcKCBmXzUgXGNkb3QgeF81ID0gMyBcY2RvdCA1NSA9IDE2NSBcKQ0KICAgLSBcKCBmXzYgXGNkb3QgeF82ID0gMSBcY2RvdCAxMDAgPSAxMDAgXCkgKih1bnR1ayBvdXRsaWVyKSoNCg0KMy4gSGl0dW5nIGp1bWxhaCB0b3RhbCBcKCBcc3VtIGZfaSBcKSBkYW4gXCggXHN1bSAoZl9pIFxjZG90IHhfaSkgXCk6DQoNCiAgIFxbDQogICBcc3VtIChmX2kgXGNkb3QgeF9pKSA9IDc1ICsgMjAwICsgMjQ1ICsgNDUwICsgMTY1ICsgMTAwID0gMTIzNQ0KICAgXF0NCiAgIFxbDQogICBcc3VtIGZfaSA9IDUgKyA4ICsgNyArIDEwICsgMyArIDEgPSAzNA0KICAgXF0NCg0KNC4gSGl0dW5nICoqbWVhbioqIGRlbmdhbiBvdXRsaWVyOg0KDQogICBcWw0KICAgXGJhcnt4fSA9IFxmcmFjezEyMzV9ezM0fSA9IDM2LjMyIFwsIFx0ZXh0e2p1dGF9DQogICBcXQ0KDQoNCiMjIyMgMi4xLjEuMiBNZW5naGl0dW5nIE1lZGlhbiBkZW5nYW4gT3V0bGllcg0KDQoxLiBUZW50dWthbiBwb3Npc2kgbWVkaWFuOiBcKCBcZnJhY3szM317Mn0gPSAxNi41IFwpLCBqYWRpIGtpdGEgY2FyaSBrZWxhcyB5YW5nIG1lbmdhbmR1bmcgcG9zaXNpIGtlLTE2LjUuDQoNCjIuIERhcmkgdGFiZWwsIGtpdGEgZGFwYXRrYW4gKiprZWxhcyBtZWRpYW4qKiBhZGFsYWggKiprZWxhcyAyMCAtIDMwKiogKGZyZWt1ZW5zaSBrdW11bGF0aWYgMTMsIGtlbGFzIHNlbGFuanV0bnlhIGRlbmdhbiBrdW11bGF0aWYgMjApLiBNYWthOg0KDQogICAtICoqTCoqID0gMjANCiAgIC0gKipGKiogPSAxMyAoZnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbikNCiAgIC0gKipmKiogPSA4IChmcmVrdWVuc2kga2VsYXMgbWVkaWFuKQ0KICAgLSAqKmgqKiA9IDEwIChwYW5qYW5nIGtlbGFzIGludGVydmFsKQ0KDQozLiBIaXR1bmcgKiptZWRpYW4qKjoNCiAgIFxbDQogICBcdGV4dHtNZWRpYW59ID0gMjAgKyBcbGVmdCggXGZyYWN7MTYuNSAtIDEzfXs4fSBccmlnaHQpIFx0aW1lcyAxMCA9IDIwICsgXGxlZnQoIFxmcmFjezMuNX17OH0gXHJpZ2h0KSBcdGltZXMgMTAgPSAyMCArIDQuMzc1ID0gMjQuMzggXCwgXHRleHR7anV0YX0NCiAgIFxdDQoNCg0KIyMjIyAyLjEuMS4zIE1lbmdoaXR1bmcgTW9kdXMgZGVuZ2FuIE91dGxpZXINCg0KMS4gS2VsYXMgbW9kdXMgYWRhbGFoICoqa2VsYXMgMjAgLSAzMCoqIGRlbmdhbiBmcmVrdWVuc2kgXCggZl8xID0gOCBcKSwga2VsYXMgc2ViZWx1bW55YSBhZGFsYWgga2VsYXMgMTAgLSAyMCBkZW5nYW4gXCggZl8wID0gNSBcKSwgZGFuIGtlbGFzIHNldGVsYWhueWEgYWRhbGFoIGtlbGFzIDMwIC0gNDAgZGVuZ2FuIFwoIGZfMiA9IDcgXCkuDQoyLiAqKkwqKiA9IDIwLCAqKmbigoEqKiA9IDgsICoqZuKCgCoqID0gNSwgKipm4oKCKiogPSA3LCAqKmgqKiA9IDEwDQoNCjMuIEhpdHVuZyAqKm1vZHVzKio6DQoNClxbDQpcdGV4dHtNb2R1c30gPSAyMCArIFxsZWZ0KCBcZnJhY3s4IC0gNX17KDIgXHRpbWVzIDgpIC0gNSAtIDd9IFxyaWdodCkgXHRpbWVzIDEwDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gMjAgKyBcbGVmdCggXGZyYWN7M317MTYgLSA1IC0gN30gXHJpZ2h0KSBcdGltZXMgMTAgPSAyMCArIFxsZWZ0KCBcZnJhY3szfXs0fSBccmlnaHQpIFx0aW1lcyAxMA0KXF0NCg0KXFsNClx0ZXh0e01vZHVzfSA9IDIwICsgNy41ID0gMjcuNSwgXHRleHR7anV0YX0NClxdDQoNCg0KLS0tDQoNCiMjIyAyLjEuMiBEQVRBIFRBTlBBIE9VVExJRVINCg0KfCBLZWxhcyBQZW5kYXBhdGFuIChqdXRhKSB8IEZyZWt1ZW5zaSAoZikgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgICAgICAgICAgICB8IDUgICAgICAgICAgICAgfA0KfCAyMCAtIDMwICAgICAgICAgICAgICAgICB8IDggICAgICAgICAgICAgfA0KfCAzMCAtIDQwICAgICAgICAgICAgICAgICB8IDcgICAgICAgICAgICAgfA0KfCA0MCAtIDUwICAgICAgICAgICAgICAgICB8IDEwICAgICAgICAgICAgfA0KfCA1MCAtIDYwICAgICAgICAgICAgICAgICB8IDMgICAgICAgICAgICAgfA0KDQojIyMjIDIuMS4yLjEgTWVuZ2hpdHVuZyBNZWFuIFRhbnBhIE91dGxpZXINCg0KMS4gVGVudHVrYW4ga2VsYXMgdGVuZ2FoIFwoIHhfaSBcKToNCg0KICAgLSBLZWxhcyAxMCAtIDIwOiBcKCB4XzEgPSBcZnJhY3sxMCArIDIwfXsyfSA9IDE1IFwpDQogICAtIEtlbGFzIDIwIC0gMzA6IFwoIHhfMiA9IFxmcmFjezIwICsgMzB9ezJ9ID0gMjUgXCkNCiAgIC0gS2VsYXMgMzAgLSA0MDogXCggeF8zID0gXGZyYWN7MzAgKyA0MH17Mn0gPSAzNSBcKQ0KICAgLSBLZWxhcyA0MCAtIDUwOiBcKCB4XzQgPSBcZnJhY3s0MCArIDUwfXsyfSA9IDQ1IFwpDQogICAtIEtlbGFzIDUwIC0gNjA6IFwoIHhfNSA9IFxmcmFjezUwICsgNjB9ezJ9ID0gNTUgXCkNCg0KMi4gSGl0dW5nIFwoIGZfaSBcY2RvdCB4X2kgXCkgdW50dWsgc2V0aWFwIGtlbGFzOg0KDQogICAtIFwoIGZfMSBcY2RvdCB4XzEgPSA1IFxjZG90IDE1ID0gNzUgXCkNCiAgIC0gXCggZl8yIFxjZG90IHhfMiA9IDggXGNkb3QgMjUgPSAyMDAgXCkNCiAgIC0gXCggZl8zIFxjZG90IHhfMyA9IDcgXGNkb3QgMzUgPSAyNDUgXCkNCiAgIC0gXCggZl80IFxjZG90IHhfNCA9IDEwIFxjZG90IDQ1ID0gNDUwIFwpDQogICAtIFwoIGZfNSBcY2RvdCB4XzUgPSAzIFxjZG90IDU1ID0gMTY1IFwpDQoNCjMuIEhpdHVuZyBqdW1sYWggdG90YWwgXCggXHN1bSBmX2kgXCkgZGFuIFwoIFxzdW0gKGZfaSBcY2RvdCB4X2kpIFwpOg0KDQogICBcWw0KICAgXHN1bSAoZl9pIFxjZG90IHhfaSkgPSA3NSArIDIwMCArIDI0NSArIDQ1MCArIDE2NSA9IDExMzUNCiAgIFxdDQogICBcWw0KICAgXHN1bSBmX2kgPSA1ICsgOCArIDcgKyAxMCArIDMgPSAzMw0KICAgXF0NCg0KNC4gSGl0dW5nICoqbWVhbioqOg0KDQogICBcWw0KICAgXGJhcnt4fSA9IFxmcmFjezExMzV9ezMzfSA9IDM0LjM5IFwsIFx0ZXh0e2p1dGF9DQogICBcXQ0KICAgDQoNCiMjIyMgMi4xLjIuMiBNZW5naGl0dW5nIE1lZGlhbiBUYW5wYSBPdXRsaWVyDQoNCjEuIFRlbnR1a2FuIHBvc2lzaSBtZWRpYW46IFwoIFxmcmFjezMzfXsyfSA9IDE2LjUgXCksIGphZGkga2l0YSBjYXJpIGtlbGFzIHlhbmcgbWVuZ2FuZHVuZyBwb3Npc2kga2UtMTYuNS4NCg0KMi4gRGFyaSB0YWJlbCwga2l0YSBkYXBhdGthbiAqKmtlbGFzIG1lZGlhbioqIGFkYWxhaCAqKmtlbGFzIDIwIC0gMzAqKiAoZnJla3VlbnNpIGt1bXVsYXRpZiAxMywga2VsYXMgc2VsYW5qdXRueWEgZGVuZ2FuIGt1bXVsYXRpZiAyMCkuIE1ha2E6DQoNCiAgIC0gKipMKiogPSAyMA0KICAgLSAqKkYqKiA9IDEzIChmcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuKQ0KICAgLSAqKmYqKiA9IDggKGZyZWt1ZW5zaSBrZWxhcyBtZWRpYW4pDQogICAtICoqaCoqID0gMTAgKHBhbmphbmcga2VsYXMgaW50ZXJ2YWwpDQoNCjMuIEhpdHVuZyAqKm1lZGlhbioqOg0KDQogICBcWw0KICAgXHRleHR7TWVkaWFufSA9IDIwICsgXGxlZnQoIFxmcmFjezE2LjUgLSAxM317OH0gXHJpZ2h0KSBcdGltZXMgMTAgPSAyMCArIFxsZWZ0KCBcZnJhY3szLjV9ezh9IFxyaWdodCkgXHRpbWVzIDEwID0gMjAgKyA0LjM3NSA9IDI0LjM4IFwsIFx0ZXh0e2p1dGF9DQogICBcXQ0KICAgDQoNCiMjIyMgMi4xLjIuMyBNZW5naGl0dW5nIE1vZHVzIFRhbnBhIE91dGxpZXINCg0KMS4gS2VsYXMgbW9kdXMgYWRhbGFoICoqa2VsYXMgMjAgLSAzMCoqIGRlbmdhbiBmcmVrdWVuc2kgXCggZl8xID0gOCBcKSwga2VsYXMgc2ViZWx1bW55YSBhZGFsYWgga2VsYXMgMTAgLSAyMCBkZW5nYW4gXCggZl8wID0gNSBcKSwgZGFuIGtlbGFzIHNldGVsYWhueWEgYWRhbGFoIGtlbGFzIDMwIC0gNDAgZGVuZ2FuIFwoIGZfMiA9IDcgXCkuDQoNCjIuICoqTCoqID0gMjAsICoqZuKCgSoqID0gOCwgKipm4oKAKiogPSA1LCAqKmbigoIqKiA9IDcsICoqaCoqID0gMTANCg0KMy4gSGl0dW5nICoqbW9kdXMqKjoNCg0KIFxbDQpcdGV4dHtNb2R1c30gPSAyMCArIFxsZWZ0KCBcZnJhY3s4IC0gNX17KDIgXHRpbWVzIDgpIC0gNSAtIDd9IFxyaWdodCkgXHRpbWVzIDEwDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gMjAgKyBcbGVmdCggXGZyYWN7M317MTYgLSA1IC0gN30gXHJpZ2h0KSBcdGltZXMgMTAgPSAyMCArIFxsZWZ0KCBcZnJhY3szfXs0fSBccmlnaHQpIFx0aW1lcyAxMA0KXF0NCg0KXFsNClx0ZXh0e01vZHVzfSA9IDIwICsgNy41ID0gMjcuNSwgXHRleHR7anV0YX0NClxdDQoNCi0tLQ0KDQojIyMgMi4xLjMgSGFzaWwga2VzZWx1cnVoYW46DQotICoqRGVuZ2FuIG91dGxpZXIqKjoNCiAgLSBNZWFuID0gMzYuMzIganV0YQ0KICAtIE1lZGlhbiA9IDI0LjM4IGp1dGENCiAgLSBNb2R1cyA9IDI3LjUganV0YQ0KLSAqKlRhbnBhIG91dGxpZXIqKjogDQogIC0gTWVhbiA9IDM0LjM5IGp1dGENCiAgLSBNZWRpYW4gPSAyNC4zOCBqdXRhDQogIC0gTW9kdXMgPSAyNy41IGp1dGENCi0gKipQZW5nYXJ1aCBPdXRsaWVyKio6DQogIC0gT3V0bGllciAqKm1lbXBlbmdhcnVoaSBtZWFuKioga2FyZW5hIGRhdGEgZWtzdHJlbSB0ZXJzZWJ1dCBtZW5nZ2VzZXIgcmF0YS1yYXRhIGxlYmloIHRpbmdnaSwgdGV0YXBpIHRpZGFrIG1lbXBlbmdhcnVoaSAqKm1lZGlhbioqIGRhbiAqKm1vZHVzKioga2FyZW5hIGtlZHVhbnlhIGxlYmloIHN0YWJpbCB0ZXJoYWRhcCBkYXRhIGVrc3RyZW0uDQoNCi0tLQ0KDQojIyMgMi4xLjQgUHJlc2VudGFzZSBLZWNvY29rYW4NCg0KVW50dWsgbWVuZ2hpdHVuZyBrZWNvY29rYW4ga2VzZWx1cnVoYW4gYW50YXJhIGRhdGEgZGVuZ2FuIG91dGxpZXIgZGFuIHRhbnBhIG91dGxpZXIsIGtpdGEgYmlzYSBtZW5nZ3VuYWthbiByYXRhLXJhdGEgcGVyc2VudGFzZSBwZXJiZWRhYW4gYW50YXJhICoqbWVhbioqLCAqKm1lZGlhbioqLCBkYW4gKiptb2R1cyoqLg0KDQotIFBlcmJlZGFhbiBNZWFuOg0KDQpcWw0KXGxlZnR8IFxmcmFjezM2LjMyIC0gMzQuMzl9ezM0LjM5fSBccmlnaHR8IFx0aW1lcyAxMDAgXGFwcHJveCA1LjI1XCUNClxdDQoNCi0gUGVyYmVkYWFuIE1lZGlhbjoNCg0KXFsNClxsZWZ0fCBcZnJhY3syNC4zOCAtIDI0LjM4fXszMH0gXHJpZ2h0fCBcdGltZXMgMTAwID0gMFwlDQpcXQ0KDQotIFBlcmJlZGFhbiBNb2R1czogDQoNClxbDQpcbGVmdHwgXGZyYWN7MjcuMDUgLSAyNy4wNX17MjcuMDV9IFxyaWdodHwgXHRpbWVzIDEwMCA9IDBcJQ0KXF0NCg0KLSBSYXRhLXJhdGEgUGVyc2VudGFzZSBQZXJiZWRhYW46DQoNClVudHVrIG1lbmdoaXR1bmcgcmF0YS1yYXRhIHBlcmJlZGFhbiBhbnRhcmEga2V0aWdhIG5pbGFpIChtZWFuLCBtZWRpYW4sIG1vZHVzKToNCg0KXFsNClx0ZXh0e1JhdGEtcmF0YSBQZXJiZWRhYW59ID0gXGZyYWN7NS4yNVwlICsgMFwlICsgMFwlfXszfSA9IDEuNzVcJQ0KXF0NCg0KLSBQZXJzZW50YXNlIEtlY29jb2thbjoNCktlY29jb2thbiBkYXRhIGRhcGF0IGRpaGl0dW5nIGRlbmdhbjoNClxbDQpcdGV4dHtLZWNvY29rYW59ID0gMTAwXCUgLSAxLjc1XCUgPSA5OC4yNVwlDQpcXQ0KDQojIyMgMi4xLjUgS2VzaW1wdWxhbjoNCg0KVGluZ2thdCBrZWNvY29rYW4gZGF0YSB5YW5nIHRpbmdnaSAoOTgsMjUlKSBtZW51bmp1a2thbiBiYWh3YSBhbmFsaXNpcyBkYXRhIGJhaWsgZGVuZ2FuIG1hdXB1biB0YW5wYSBvdXRsaWVyIG1lbWJlcmlrYW4gaGFzaWwgeWFuZyBoYW1waXIga29uc2lzdGVuLiBPbGVoIGthcmVuYSBpdHUsIHN0cmF0ZWdpIHBlcnVzYWhhYW4gYmVyZGFzYXJrYW4gYW5hbGlzaXMgaW5pIHRldGFwIHZhbGlkIGRhbiBkYXBhdCBkaWFuZGFsa2FuIHVudHVrIHBlbmdhbWJpbGFuIGtlcHV0dXNhbi4NCg0KLS0tDQoNCiMjIDIuMiBCSURBTkcgS0VTRUhBVEFODQoNCioqRGVza3JpcHNpIE1hc2FsYWg6KioNCg0KU2VvcmFuZyBkb2t0ZXIgaW5naW4gbWVueWVzdWFpa2FuIGRvc2lzIG9iYXQgYmVyZGFzYXJrYW4gYmVyYXQgYmFkYW4gcGFzaWVuIGRhbGFtIGtlbG9tcG9rIHVzaWEgdGVydGVudHUuIERvc2lzIG9iYXQgeWFuZyBkaWJlcmlrYW4gYWthbiBkaXBlbmdhcnVoaSBvbGVoIGJlcmF0IGJhZGFuIHBhc2llbiwgZGVuZ2FuICoqcmF0YS1yYXRhIGRvc2lzIHlhbmcgZGlzYXJhbmthbioqIGFkYWxhaCBzZWtpdGFyICoqMC41IG1nIHBlciBrZyBiZXJhdCBiYWRhbioqLg0KDQp8IEtlbG9tcG9rIEJlcmF0IEJhZGFuIChrZykgfCBGcmVrdWVuc2kgKGYpIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfA0KfCA0MCAtIDUwICAgICAgICAgICAgICAgICAgIHwgNiAgICAgICAgICAgICB8DQp8IDUxIC0gNjAgICAgICAgICAgICAgICAgICAgfCAxMCAgICAgICAgICAgIHwNCnwgNjEgLSA3MCAgICAgICAgICAgICAgICAgICB8IDggICAgICAgICAgICAgfA0KfCA3MSAtIDgwICAgICAgICAgICAgICAgICAgIHwgNCAgICAgICAgICAgICB8DQp8IDgxIC0gOTAgICAgICAgICAgICAgICAgICAgfCAyICAgICAgICAgICAgIHwNCnwgMTAwICAgICAgICAgICAgICAgICAgICAgICB8IDEgICAgICAgICAgICAgfA0KDQotLS0NCg0KIyMjIDIuMi4xIERBVEEgREVOR0FOIE9VVExJRVINCg0KfCBLZWxvbXBvayBCZXJhdCBCYWRhbiAoa2cpIHwgRnJla3VlbnNpIChmKSB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwNCnwgNDAgLSA1MCAgICAgICAgICAgICAgICAgICB8IDYgICAgICAgICAgICAgfA0KfCA1MSAtIDYwICAgICAgICAgICAgICAgICAgIHwgMTAgICAgICAgICAgICB8DQp8IDYxIC0gNzAgICAgICAgICAgICAgICAgICAgfCA4ICAgICAgICAgICAgIHwNCnwgNzEgLSA4MCAgICAgICAgICAgICAgICAgICB8IDQgICAgICAgICAgICAgfA0KfCA4MSAtIDkwICAgICAgICAgICAgICAgICAgIHwgMiAgICAgICAgICAgICB8DQp8IDEwMCAgICAgICAgICAgICAgICAgICAgICAgfCAxICAgICAgICAgICAgIHwgICoob3V0bGllcikqDQoNCiMjIyMgMi4yLjEuMSBNZW5naGl0dW5nIE1lYW4gZGVuZ2FuIE91dGxpZXINCg0KMS4gVGVudHVrYW4ga2VsYXMgdGVuZ2FoIChcKHhfaVwpKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCiAgIC0gS2VsYXMgNDAgLSA1MDogXCggeF8xID0gXGZyYWN7NDAgKyA1MH17Mn0gPSA0NSBcKQ0KICAgLSBLZWxhcyA1MSAtIDYwOiBcKCB4XzIgPSBcZnJhY3s1MSArIDYwfXsyfSA9IDU1LjUgXCkNCiAgIC0gS2VsYXMgNjEgLSA3MDogXCggeF8zID0gXGZyYWN7NjEgKyA3MH17Mn0gPSA2NS41IFwpDQogICAtIEtlbGFzIDcxIC0gODA6IFwoIHhfNCA9IFxmcmFjezcxICsgODB9ezJ9ID0gNzUuNSBcKQ0KICAgLSBLZWxhcyA4MSAtIDkwOiBcKCB4XzUgPSBcZnJhY3s4MSArIDkwfXsyfSA9IDg1LjUgXCkNCiAgIC0gS2VsYXMgMTAwOiBcKCB4XzYgPSAxMDAgXCkgKGthcmVuYSBpbmkgZGF0YSB0dW5nZ2FsIGRlbmdhbiBuaWxhaSAxMDApDQoNCjIuIEhpdHVuZyBcKCBmX2kgXGNkb3QgeF9pIFwpIHVudHVrIHNldGlhcCBrZWxhczoNCg0KICAgLSBcKCBmXzEgXGNkb3QgeF8xID0gNiBcY2RvdCA0NSA9IDI3MCBcKQ0KICAgLSBcKCBmXzIgXGNkb3QgeF8yID0gMTAgXGNkb3QgNTUuNSA9IDU1NSBcKQ0KICAgLSBcKCBmXzMgXGNkb3QgeF8zID0gOCBcY2RvdCA2NS41ID0gNTI0IFwpDQogICAtIFwoIGZfNCBcY2RvdCB4XzQgPSA0IFxjZG90IDc1LjUgPSAzMDIgXCkNCiAgIC0gXCggZl81IFxjZG90IHhfNSA9IDIgXGNkb3QgODUuNSA9IDE3MSBcKQ0KICAgLSBcKCBmXzYgXGNkb3QgeF82ID0gMSBcY2RvdCAxMDAgPSAxMDAgXCkgKih1bnR1ayBvdXRsaWVyKSoNCg0KMy4gSGl0dW5nIGp1bWxhaCB0b3RhbCBcKCBcc3VtIChmX2kgXGNkb3QgeF9pKSBcKToNCg0KICAgXFsNCiAgIFxzdW0gKGZfaSBcY2RvdCB4X2kpID0gMjcwICsgNTU1ICsgNTI0ICsgMzAyICsgMTcxICsgMTAwID0gMTkyMg0KICAgXF0NCg0KNC4gSGl0dW5nIGp1bWxhaCB0b3RhbCBmcmVrdWVuc2kgXCggXHN1bSBmX2kgXCk6DQoNCiAgIFxbDQogICBcc3VtIGZfaSA9IDYgKyAxMCArIDggKyA0ICsgMiArIDEgPSAzMQ0KICAgXF0NCg0KNS4gSGl0dW5nICoqbWVhbioqIGRlbmdhbiBydW11czoNCg0KICAgXFsNCiAgIFxiYXJ7eH0gPSBcZnJhY3sxOTIyfXszMX0gPSA2MS45NiBcLCBcdGV4dHtrZ30NCiAgIFxdDQoNCioqRG9zaXMgT2JhdCAoZGFsYW0gbWcpKiogPSBcKCA2MS45NiBcdGltZXMgMC41ID0gMzAuOTggXCwgXHRleHR7bWd9IFwpDQoNCg0KIyMjIyAyLjIuMS4yIE1lbmdoaXR1bmcgTWVkaWFuIGRlbmdhbiBPdXRsaWVyDQoNCjEuIFRlbnR1a2FuIHBvc2lzaSBtZWRpYW46IFwoIFxmcmFjezMxfXsyfSA9IDE1LjUgXCkuIEFydGlueWEsIHBvc2lzaSBtZWRpYW4gYmVyYWRhIHBhZGEgZGF0YSBrZS0xNS41Lg0KMi4gRGFyaSB0YWJlbCwga2l0YSBiaXNhIG1lbmdoaXR1bmcgKipmcmVrdWVuc2kga3VtdWxhdGlmKiogdW50dWsgbWVsaWhhdCBrZWxhcyBtYW5hIHlhbmcgbWVuZ2FuZHVuZyBwb3Npc2kga2UtMTUuNS4NCg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgNDAgLSA1MCA9IDYNCiAgIC0gRnJla3VlbnNpIGt1bXVsYXRpZiBzZXRlbGFoIGtlbGFzIDUxIC0gNjAgPSAxNg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgNjEgLSA3MCA9IDI0DQogICAtIEZyZWt1ZW5zaSBrdW11bGF0aWYgc2V0ZWxhaCBrZWxhcyA3MSAtIDgwID0gMjgNCiAgIC0gRnJla3VlbnNpIGt1bXVsYXRpZiBzZXRlbGFoIGtlbGFzIDgxIC0gOTAgPSAzMA0KICAgLSBLYXJlbmEgcG9zaXNpIGtlLTE1LjUgYmVyYWRhIHBhZGEgKiprZWxhcyA1MSAtIDYwKiosIG1ha2Ega2VsYXMgbWVkaWFuIGFkYWxhaCBrZWxhcyBpbmkuDQogICANCjMuIE1lbmdndW5ha2FuIHJ1bXVzIG1lZGlhbjoNCg0KICAgLSAqKkwqKiA9IDUxIChiYXRhcyBiYXdhaCBrZWxhcyBtZWRpYW4pDQogICAtICoqRioqID0gNiAoZnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbikNCiAgIC0gKipmKiogPSAxMCAoZnJla3VlbnNpIGtlbGFzIG1lZGlhbikNCiAgIC0gKipoKiogPSAxMCAocGFuamFuZyBrZWxhcyBpbnRlcnZhbCkNCg0KICAgXFsNCiAgIFx0ZXh0e01lZGlhbn0gPSA1MSArIFxsZWZ0KCBcZnJhY3sxNS41IC0gNn17MTB9IFxyaWdodCkgXHRpbWVzIDEwID0gNTEgKyBcbGVmdCggXGZyYWN7OS41fXsxMH0gXHJpZ2h0KSBcdGltZXMgMTAgPSA1MSArIDkuNSA9IDYwIFwsIFx0ZXh0e2tnfQ0KICAgXF0NCg0KKipEb3NpcyBPYmF0IChkYWxhbSBtZykqKiA9IFwoIDYwIFx0aW1lcyAwLjUgPSAzMCBcLCBcdGV4dHttZ30gXCkNCg0KDQojIyMjIDIuMi4xLjMgTWVuZ2hpdHVuZyBNb2R1cyBkZW5nYW4gT3V0bGllcg0KDQoxLiBLZWxhcyBtb2R1cyBhZGFsYWggKiprZWxhcyA1MSAtIDYwKiogZGVuZ2FuIGZyZWt1ZW5zaSBcKCBmXzEgPSAxMCBcKSwga2VsYXMgc2ViZWx1bW55YSBhZGFsYWgga2VsYXMgNDAgLSA1MCBkZW5nYW4gXCggZl8wID0gNiBcKSwgZGFuIGtlbGFzIHNldGVsYWhueWEgYWRhbGFoIGtlbGFzIDYxIC0gNzAgZGVuZ2FuIFwoIGZfMiA9IDggXCkuDQoNCjIuIE1lbmdndW5ha2FuIHJ1bXVzIG1vZHVzOg0KDQogICAtICoqTCoqID0gNTEgKGJhdGFzIGJhd2FoIGtlbGFzIG1vZHVzKQ0KICAgLSAqKmbigoEqKiA9IDEwIChmcmVrdWVuc2kga2VsYXMgbW9kdXMpDQogICAtICoqZuKCgCoqID0gNiAoZnJla3VlbnNpIGtlbGFzIHNlYmVsdW1ueWEpDQogICAtICoqZuKCgioqID0gOCAoZnJla3VlbnNpIGtlbGFzIHNldGVsYWhueWEpDQogICAtICoqaCoqID0gMTAgKHBhbmphbmcga2VsYXMgaW50ZXJ2YWwpDQoNClxbDQpcdGV4dHtNb2R1c30gPSA1MSArIFxsZWZ0KCBcZnJhY3sxMCAtIDZ9eygyIFx0aW1lcyAxMCkgLSA2IC0gOH0gXHJpZ2h0KSBcdGltZXMgMTAgDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gNTEgKyBcbGVmdCggXGZyYWN7NH17MjAgLSA2IC0gOH0gXHJpZ2h0KSBcdGltZXMgMTAgDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gNTEgKyBcbGVmdCggXGZyYWN7NH17Nn0gXHJpZ2h0KSBcdGltZXMgMTAgPSA1MSArIDYuNjcgPSA1Ny42NyBcLCBcdGV4dHtrZ30NClxdDQoNCioqRG9zaXMgT2JhdCAoZGFsYW0gbWcpKiogPSBcKCA1Ny42NyBcdGltZXMgMC41ID0gMjguODQgXCwgXHRleHR7bWd9IFwpDQoNCi0tLQ0KDQojIyMgMi4yLjIgREFUQSBUQU5QQSBPVVRMSUVSDQoNCnwgS2Vsb21wb2sgQmVyYXQgQmFkYW4gKGtnKSB8IEZyZWt1ZW5zaSAoZikgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18DQp8IDQwIC0gNTAgICAgICAgICAgICAgICAgICAgfCA2ICAgICAgICAgICAgIHwNCnwgNTEgLSA2MCAgICAgICAgICAgICAgICAgICB8IDEwICAgICAgICAgICAgfA0KfCA2MSAtIDcwICAgICAgICAgICAgICAgICAgIHwgOCAgICAgICAgICAgICB8DQp8IDcxIC0gODAgICAgICAgICAgICAgICAgICAgfCA0ICAgICAgICAgICAgIHwNCnwgODEgLSA5MCAgICAgICAgICAgICAgICAgICB8IDIgICAgICAgICAgICAgfA0KDQojIyMjIDIuMi4yLjEgTWVuZ2hpdHVuZyBNZWFuIFRhbnBhIE91dGxpZXINCg0KMS4gVGVudHVrYW4ga2VsYXMgdGVuZ2FoIFwoIHhfaSBcKToNCg0KICAgLSBLZWxhcyA0MCAtIDUwOiBcKCB4XzEgPSBcZnJhY3s0MCArIDUwfXsyfSA9IDQ1IFwpDQogICAtIEtlbGFzIDUxIC0gNjA6IFwoIHhfMiA9IFxmcmFjezUxICsgNjB9ezJ9ID0gNTUuNSBcKQ0KICAgLSBLZWxhcyA2MSAtIDcwOiBcKCB4XzMgPSBcZnJhY3s2MSArIDcwfXsyfSA9IDY1LjUgXCkNCiAgIC0gS2VsYXMgNzEgLSA4MDogXCggeF80ID0gXGZyYWN7NzEgKyA4MH17Mn0gPSA3NS41IFwpDQogICAtIEtlbGFzIDgxIC0gOTA6IFwoIHhfNSA9IFxmcmFjezgxICsgOTB9ezJ9ID0gODUuNSBcKQ0KDQoyLiBIaXR1bmcgXCggZl9pIFxjZG90IHhfaSBcKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCiAgIC0gXCggZl8xIFxjZG90IHhfMSA9IDYgXGNkb3QgNDUgPSAyNzAgXCkNCiAgIC0gXCggZl8yIFxjZG90IHhfMiA9IDEwIFxjZG90IDU1LjUgPSA1NTUgXCkNCiAgIC0gXCggZl8zIFxjZG90IHhfMyA9IDggXGNkb3QgNjUuNSA9IDUyNCBcKQ0KICAgLSBcKCBmXzQgXGNkb3QgeF80ID0gNCBcY2RvdCA3NS41ID0gMzAyIFwpDQogICAtIFwoIGZfNSBcY2RvdCB4XzUgPSAyIFxjZG90IDg1LjUgPSAxNzEgXCkNCg0KMy4gSGl0dW5nIGp1bWxhaCB0b3RhbCBcKCBcc3VtIGZfaSBcKSBkYW4gXCggXHN1bSAoZl9pIFxjZG90IHhfaSkgXCk6DQoNCiAgIFxbDQogICBcc3VtIChmX2kgXGNkb3QgeF9pKSA9IDI3MCArIDU1NSArIDUyNCArIDMwMiArIDE3MSA9IDE4MjINCiAgIFxdDQogICBcWw0KICAgXHN1bSBmX2kgPSA2ICsgMTAgKyA4ICsgNCArIDIgPSAzMA0KICAgXF0NCg0KNC4gSGl0dW5nICoqbWVhbioqOg0KDQogICBcWw0KICAgXGJhcnt4fSA9IFxmcmFjezE4MjJ9ezMwfSA9IDYwLjA3IFwsIFx0ZXh0e2tnfQ0KICAgXF0NCg0KKipEb3NpcyBPYmF0IChkYWxhbSBtZykqKiA9IFwoIDYwLjA3IFx0aW1lcyAwLjUgPSAzMC4wNCBcLCBcdGV4dHttZ30gXCkNCg0KIyMjIyAyLjIuMi4yIE1lbmdoaXR1bmcgTWVkaWFuIFRhbnBhIE91dGxpZXINCg0KMS4gVGVudHVrYW4gcG9zaXNpIG1lZGlhbjogXCggXGZyYWN7MzB9ezJ9ID0gMTUgXCksIGphZGkga2l0YSBjYXJpIGtlbGFzIHlhbmcgbWVuZ2FuZHVuZyBwb3Npc2kga2UtMTUuDQoNCjIuIERhcmkgdGFiZWwsIGtpdGEgZGFwYXRrYW4gKiprZWxhcyBtZWRpYW4qKiBhZGFsYWggKiprZWxhcyA1MSAtIDYwKiogKGZyZWt1ZW5zaSBrdW11bGF0aWYgMTYpLiBNYWthOg0KDQogICAtICoqTCoqID0gNTENCiAgIC0gKipGKiogPSA2IChmcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuKQ0KICAgLSAqKmYqKiA9IDEwIChmcmVrdWVuc2kga2VsYXMgbWVkaWFuKQ0KICAgLSAqKmgqKiA9IDEwIChwYW5qYW5nIGtlbGFzIGludGVydmFsKQ0KDQozLiBIaXR1bmcgKiptZWRpYW4qKjoNCg0KICAgXFsNCiAgIFx0ZXh0e01lZGlhbn0gPSA1MSArIFxsZWZ0KCBcZnJhY3sxNSAtIDZ9ezEwfSBccmlnaHQpIFx0aW1lcyAxMCA9IDUxICsgXGxlZnQoIFxmcmFjezl9ezEwfSBccmlnaHQpIFx0aW1lcyAxMCA9IDUxICsgOSA9IDYwIFwsIFx0ZXh0e2tnfQ0KICAgXF0NCg0KKipEb3NpcyBPYmF0IChkYWxhbSBtZykqKiA9IFwoIDYwIFx0aW1lcyAwLjUgPSAzMCBcLCBcdGV4dHttZ30gXCkNCg0KDQojIyMjIDIuMi4yLjMgTWVuZ2hpdHVuZyBNb2R1cyBUYW5wYSBPdXRsaWVyDQoNCjEuIEtlbGFzIG1vZHVzIGFkYWxhaCAqKmtlbGFzIDUxIC0gNjAqKiBkZW5nYW4gZnJla3VlbnNpIFwoIGZfMSA9IDEwIFwpLCBrZWxhcyBzZWJlbHVtbnlhIGFkYWxhaCBrZWxhcyA0MCAtIDUwIGRlbmdhbiBcKCBmXzAgPSA2IFwpLCBkYW4ga2VsYXMgc2V0ZWxhaG55YSBhZGFsYWgga2VsYXMgNjEgLSA3MCBkZW5nYW4gXCggZl8yID0gOCBcKS4NCg0KMi4gKipMKiogPSA1MSwgKipm4oKBKiogPSAxMCwgKipm4oKAKiogPSA2LCAqKmbigoIqKiA9IDgsICoqaCoqID0gMTANCg0KMy4gSGl0dW5nICoqbW9kdXMqKjoNCg0KXFsNClx0ZXh0e01vZHVzfSA9IDUxICsgXGxlZnQoIFxmcmFjezEwIC0gNn17KDIgXHRpbWVzIDEwKSAtIDYgLSA4fSBccmlnaHQpIFx0aW1lcyAxMCANClxdDQoNClxbDQpcdGV4dHtNb2R1c30gPSA1MSArIFxsZWZ0KCBcZnJhY3s0fXsyMCAtIDYgLSA4fSBccmlnaHQpIFx0aW1lcyAxMCANClxdDQoNClxbDQpcdGV4dHtNb2R1c30gPSA1MSArIFxsZWZ0KCBcZnJhY3s0fXs2fSBccmlnaHQpIFx0aW1lcyAxMCA9IDUxICsgNi42NyA9IDU3LjY3IFwsIFx0ZXh0e2tnfQ0KXF0NCg0KKipEb3NpcyBPYmF0IChkYWxhbSBtZykqKiA9IFwoIDU3LjY3IFx0aW1lcyAwLjUgPSAyOC44NCBcLCBcdGV4dHttZ30gXCkNCg0KLS0tDQoNCiMjIyAyLjIuMyBIYXNpbCBrZXNlbHVydWhhbjoNCg0KLSAqKkRlbmdhbiBPdXRsaWVyOioqDQogIC0gTWVhbiA9IDYxLjk2IGtnIOKGkiBEb3NpcyBPYmF0ID0gMzAuOTggbWcNCiAgLSBNZWRpYW4gPSA2MCBrZyDihpIgRG9zaXMgT2JhdCA9IDMwIG1nDQogIC0gTW9kdXMgPSA1Ny42NyBrZyDihpIgRG9zaXMgT2JhdCA9IDI4Ljg0IG1nDQogIA0KLSAqKlRhbnBhIE91dGxpZXI6KioNCiAgLSBNZWFuID0gNjAuMDcga2cg4oaSIERvc2lzIE9iYXQgPSAzMC4wNCBtZw0KICAtIE1lZGlhbiA9IDYwIGtnIOKGkiBEb3NpcyBPYmF0ID0gMzAgbWcNCiAgLSBNb2R1cyA9IDU3LjY3IGtnIOKGkiBEb3NpcyBPYmF0ID0gMjguODQgbWcNCg0KLSAqKlBlbmdhcnVoIE91dGxpZXIqKjoNCiAgLSAqKk1lYW4qKiBkaXBlbmdhcnVoaSBvbGVoICoqb3V0bGllcioqDQogIC0gKiptZWRpYW4qKiBkYW4gKiptb2R1cyoqIHRldGFwIHN0YWJpbCBkYW4gdGlkYWsgdGVycGVuZ2FydWggb2xlaCAqKm91dGxpZXIqKi4NCg0KLS0tDQoNCiMjIyAyLjIuNCBQcmVzZW50YXNlIEtlY29jb2thbg0KDQpVbnR1ayBtZW5naGl0dW5nIGtlY29jb2thbiBrZXNlbHVydWhhbiBhbnRhcmEgZGF0YSBkZW5nYW4gb3V0bGllciBkYW4gdGFucGEgb3V0bGllciwga2l0YSBiaXNhIG1lbmdndW5ha2FuIHJhdGEtcmF0YSBwZXJzZW50YXNlIHBlcmJlZGFhbiBhbnRhcmEgKiptZWFuKiosICoqbWVkaWFuKiosIGRhbiAqKm1vZHVzKiouDQoNCi0gUGVyYmVkYWFuIE1lYW46DQoNClxbDQpcbGVmdHwgXGZyYWN7MzAuOTggLSAzMC4wNH17MzAuMDR9IFxyaWdodHwgXHRpbWVzIDEwMCBcYXBwcm94IDMuMTNcJQ0KXF0NCg0KLSBQZXJiZWRhYW4gTWVkaWFuOg0KDQpcWw0KXGxlZnR8IFxmcmFjezMwIC0gMzB9ezMwfSBccmlnaHR8IFx0aW1lcyAxMDAgPSAwXCUNClxdDQoNCi0gUGVyYmVkYWFuIE1vZHVzOiANCg0KXFsNClxsZWZ0fCBcZnJhY3syOC44NCAtIDI4Ljg0fXsyOC44NH0gXHJpZ2h0fCBcdGltZXMgMTAwID0gMFwlDQpcXQ0KDQotIFJhdGEtcmF0YSBQZXJzZW50YXNlIFBlcmJlZGFhbjoNCg0KVW50dWsgbWVuZ2hpdHVuZyByYXRhLXJhdGEgcGVyYmVkYWFuIGFudGFyYSBrZXRpZ2EgbmlsYWkgKG1lYW4sIG1lZGlhbiwgbW9kdXMpOg0KDQpcWw0KXHRleHR7UmF0YS1yYXRhIFBlcmJlZGFhbn0gPSBcZnJhY3szLjEzXCUgKyAwXCUgKyAwXCV9ezN9ID0gMS4wNFwlDQpcXQ0KDQotIFBlcnNlbnRhc2UgS2Vjb2Nva2FuOg0KS2Vjb2Nva2FuIGRhdGEgZGFwYXQgZGloaXR1bmcgZGVuZ2FuOg0KXFsNClx0ZXh0e0tlY29jb2thbn0gPSAxMDBcJSAtIDEuMDRcJSA9IDk4Ljk2XCUNClxdDQoNCiMjIyAyLjIuNSBLZXNpbXB1bGFuOg0KDQpEYXBhdCBkaXNpbXB1bGthbiBiYWh3YSBkb3NpcyBvYmF0IHlhbmcgZGliZXJpa2FuIHN1ZGFoIHNhbmdhdCBzZXN1YWkgZGVuZ2FuIGtvbmRpc2kgcGFzaWVuLiBQZXJiYW5kaW5nYW4gYW50YXJhIGRhdGEgZGVuZ2FuIG91dGxpZXIgZGFuIHRhbnBhIG91dGxpZXIgbWVudW5qdWtrYW4ga2Vjb2Nva2FuIHlhbmcgaGFtcGlyIG1lbmNhcGFpICoqOTklKiosIGRlbmdhbiBwZXJiZWRhYW4gcmF0YS1yYXRhIGhhbnlhIHNla2l0YXIgKioxLjA0JSoqLiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIG1lc2tpcHVuIGFkYSBzZWRpa2l0IHBlbmdhcnVoIGRhcmkgYWRhbnlhIG91dGxpZXIgKGRhdGEgeWFuZyBqYXVoIGJlcmJlZGEpLCBwZXJiZWRhYW4gdGVyc2VidXQgdGlkYWsgc2lnbmlmaWthbiBkYW4gZG9zaXMgeWFuZyBkaWhpdHVuZyB0ZXRhcCBrb25zaXN0ZW4sIGJhaWsgZGVuZ2FuIG1hdXB1biB0YW5wYSBvdXRsaWVyLg0KDQpEZW5nYW4gZGVtaWtpYW4sIGRvc2lzIG9iYXQgeWFuZyBkaXNhcmFua2FuIGJlcmRhc2Fya2FuIGJlcmF0IGJhZGFuIHBhc2llbiBkYXBhdCBkaWFuZ2dhcCB0ZXBhdCBkYW4gZGFwYXQgZGl0ZXJhcGthbiBzZWNhcmEgdW11bSwga2FyZW5hIGhhc2lsIHBlcmhpdHVuZ2FuIGRvc2lzIHRldGFwIHN0YWJpbCBkYW4gaGFtcGlyIGlkZW50aWsgZGFsYW0ga2VkdWEga29uZGlzaSBkYXRhIHRlcnNlYnV0Lg0KDQotLS0NCg0KIyMgMi4zIEJJREFORyBQRU5ESURJS0FODQoNCioqRGVza3JpcHNpIE1hc2FsYWg6KioNCg0KQW5hbGlzaXMgcHJlc3Rhc2kgYWthZGVtaWsgc2lzd2EgYmVyZGFzYXJrYW4gZGF0YSBuaWxhaSB1amlhbiB5YW5nIGRpZ3VuYWthbiB1bnR1ayBtZW5nZXZhbHVhc2kgZWZla3Rpdml0YXMgcHJvc2VzIHBlbWJlbGFqYXJhbiBkaSBzZWtvbGFoLg0KDQp8IEtlbG9tcG9rIE5pbGFpIFVqaWFuIHwgRnJla3VlbnNpIChmKSB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18DQp8IDAgLSAyMCAgICAgICAgICAgICAgIHwgMiAgICAgICAgICAgICB8DQp8IDIxIC0gNDAgICAgICAgICAgICAgIHwgNCAgICAgICAgICAgICB8DQp8IDQxIC0gNjAgICAgICAgICAgICAgIHwgNiAgICAgICAgICAgICB8DQp8IDYxIC0gODAgICAgICAgICAgICAgIHwgNSAgICAgICAgICAgICB8DQp8IDgxIC0gOTAgICAgICAgICAgICAgIHwgMyAgICAgICAgICAgICB8DQp8IDk1ICAgICAgICAgICAgICAgICAgIHwgMSAgICAgICAgICAgICB8IA0KDQotLS0NCg0KIyMjIDIuMy4xIERBVEEgREVOR0FOIE9VVExJRVINCg0KVGFiZWwgYmVyaWt1dCBtZW51bmp1a2thbiBkYXRhIG5pbGFpIHVqaWFuIHlhbmcgZGljYXRhdCBkYWxhbSBrZWxvbXBvayBpbnRlcnZhbCBuaWxhaSwgZGVuZ2FuICoqb3V0bGllcioqIHBhZGEgbmlsYWkgOTUuDQoNCnwgS2Vsb21wb2sgTmlsYWkgVWppYW4gfCBGcmVrdWVuc2kgKGYpIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwNCnwgMCAtIDIwICAgICAgICAgICAgICAgfCAyICAgICAgICAgICAgIHwNCnwgMjEgLSA0MCAgICAgICAgICAgICAgfCA0ICAgICAgICAgICAgIHwNCnwgNDEgLSA2MCAgICAgICAgICAgICAgfCA2ICAgICAgICAgICAgIHwNCnwgNjEgLSA4MCAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgIHwNCnwgODEgLSA5MCAgICAgICAgICAgICAgfCAzICAgICAgICAgICAgIHwNCnwgOTUgICAgICAgICAgICAgICAgICAgfCAxICAgICAgICAgICAgIHwgICoob3V0bGllcikqDQoNCg0KIyMjIyAyLjMuMS4xIE1lbmdoaXR1bmcgTWVhbiBkZW5nYW4gT3V0bGllcg0KDQoxLiBUZW50dWthbiBrZWxhcyB0ZW5nYWggKFwoeF9pXCkpIHVudHVrIHNldGlhcCBrZWxhczoNCg0KICAgLSBLZWxhcyAwIC0gMjA6IFwoIHhfMSA9IFxmcmFjezAgKyAyMH17Mn0gPSAxMCBcKQ0KICAgLSBLZWxhcyAyMSAtIDQwOiBcKCB4XzIgPSBcZnJhY3syMSArIDQwfXsyfSA9IDMwLjUgXCkNCiAgIC0gS2VsYXMgNDEgLSA2MDogXCggeF8zID0gXGZyYWN7NDEgKyA2MH17Mn0gPSA1MC41IFwpDQogICAtIEtlbGFzIDYxIC0gODA6IFwoIHhfNCA9IFxmcmFjezYxICsgODB9ezJ9ID0gNzAuNSBcKQ0KICAgLSBLZWxhcyA4MSAtIDkwOiBcKCB4XzUgPSBcZnJhY3s4MSArIDkwfXsyfSA9IDg1LjUgXCkNCiAgIC0gS2VsYXMgOTU6IFwoIHhfNiA9IDk1IFwpIChrYXJlbmEgaW5pIGFkYWxhaCBkYXRhIHR1bmdnYWwgZGVuZ2FuIG5pbGFpIDk1KQ0KDQoyLiBIaXR1bmcgXCggZl9pIFxjZG90IHhfaSBcKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCiAgIC0gXCggZl8xIFxjZG90IHhfMSA9IDIgXGNkb3QgMTAgPSAyMCBcKQ0KICAgLSBcKCBmXzIgXGNkb3QgeF8yID0gNCBcY2RvdCAzMC41ID0gMTIyIFwpDQogICAtIFwoIGZfMyBcY2RvdCB4XzMgPSA2IFxjZG90IDUwLjUgPSAzMDMgXCkNCiAgIC0gXCggZl80IFxjZG90IHhfNCA9IDUgXGNkb3QgNzAuNSA9IDM1Mi41IFwpDQogICAtIFwoIGZfNSBcY2RvdCB4XzUgPSAzIFxjZG90IDg1LjUgPSAyNTYuNSBcKQ0KICAgLSBcKCBmXzYgXGNkb3QgeF82ID0gMSBcY2RvdCA5NSA9IDk1IFwpICoodW50dWsgb3V0bGllcikqDQoNCjMuIEhpdHVuZyBqdW1sYWggdG90YWwgXCggXHN1bSAoZl9pIFxjZG90IHhfaSkgXCk6DQoNCiAgIFxbDQogICBcc3VtIChmX2kgXGNkb3QgeF9pKSA9IDIwICsgMTIyICsgMzAzICsgMzUyLjUgKyAyNTYuNSArIDk1ID0gMTE0OQ0KICAgXF0NCg0KNC4gSGl0dW5nIGp1bWxhaCB0b3RhbCBmcmVrdWVuc2kgXCggXHN1bSBmX2kgXCk6DQoNCiAgIFxbDQogICBcc3VtIGZfaSA9IDIgKyA0ICsgNiArIDUgKyAzICsgMSA9IDIxDQogICBcXQ0KDQo1LiBIaXR1bmcgKiptZWFuKiogZGVuZ2FuIHJ1bXVzOg0KDQogICBcWw0KICAgXGJhcnt4fSA9IFxmcmFjezExNDl9ezIxfSA9IDU0LjcxDQogICBcXQ0KDQoqKkhhc2lsIE1lYW4gKGRlbmdhbiBvdXRsaWVyKSoqID0gNTQuNzENCg0KDQojIyMjIDIuMy4xLjIgTWVuZ2hpdHVuZyBNZWRpYW4gZGVuZ2FuIE91dGxpZXINCg0KMS4gVGVudHVrYW4gcG9zaXNpIG1lZGlhbjogXCggXGZyYWN7MjF9ezJ9ID0gMTAuNSBcKS4gQXJ0aW55YSwgcG9zaXNpIG1lZGlhbiBiZXJhZGEgcGFkYSBkYXRhIGtlLTEwLjUuDQoyLiBEYXJpIHRhYmVsLCBraXRhIGJpc2EgbWVuZ2hpdHVuZyAqKmZyZWt1ZW5zaSBrdW11bGF0aWYqKiB1bnR1ayBtZWxpaGF0IGtlbGFzIG1hbmEgeWFuZyBtZW5nYW5kdW5nIHBvc2lzaSBrZS0xMC41Lg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgMCAtIDIwID0gMg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgMjEgLSA0MCA9IDYNCiAgIC0gRnJla3VlbnNpIGt1bXVsYXRpZiBzZXRlbGFoIGtlbGFzIDQxIC0gNjAgPSAxMg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgNjEgLSA4MCA9IDE3DQogICAtIEZyZWt1ZW5zaSBrdW11bGF0aWYgc2V0ZWxhaCBrZWxhcyA4MSAtIDkwID0gMjANCiAgIC0gS2FyZW5hIHBvc2lzaSBrZS0xMC41IGJlcmFkYSBwYWRhICoqa2VsYXMgNDEgLSA2MCoqLCBtYWthIGtlbGFzIG1lZGlhbiBhZGFsYWgga2VsYXMgaW5pLg0KICAgDQozLiBNZW5nZ3VuYWthbiBydW11cyBtZWRpYW46DQogICAtICoqTCoqID0gNDEgKGJhdGFzIGJhd2FoIGtlbGFzIG1lZGlhbikNCiAgIC0gKipGKiogPSA2IChmcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuKQ0KICAgLSAqKmYqKiA9IDYgKGZyZWt1ZW5zaSBrZWxhcyBtZWRpYW4pDQogICAtICoqaCoqID0gMjAgLSA0MCA9IDIwIChwYW5qYW5nIGtlbGFzIGludGVydmFsKQ0KDQogICBcWw0KICAgXHRleHR7TWVkaWFufSA9IDQxICsgXGxlZnQoIFxmcmFjezEwLjUgLSA2fXs2fSBccmlnaHQpIFx0aW1lcyAyMCA9IDQxICsgXGxlZnQoIFxmcmFjezQuNX17Nn0gXHJpZ2h0KSBcdGltZXMgMjAgPSA0MSArIDE1ID0gNTYgXCwgXHRleHR7KGRlbmdhbiBvdXRsaWVyKX0NCiAgIFxdDQoNCioqSGFzaWwgTWVkaWFuIChkZW5nYW4gb3V0bGllcikqKiA9IDU2DQoNCg0KIyMjIyAyLjMuMS4zIE1lbmdoaXR1bmcgTW9kdXMgZGVuZ2FuIE91dGxpZXINCg0KMS4gS2VsYXMgbW9kdXMgYWRhbGFoICoqa2VsYXMgNDEgLSA2MCoqIGRlbmdhbiBmcmVrdWVuc2kgXCggZl8xID0gNiBcKSwga2VsYXMgc2ViZWx1bW55YSBhZGFsYWgga2VsYXMgMjEgLSA0MCBkZW5nYW4gXCggZl8wID0gNCBcKSwgZGFuIGtlbGFzIHNldGVsYWhueWEgYWRhbGFoIGtlbGFzIDYxIC0gODAgZGVuZ2FuIFwoIGZfMiA9IDUgXCkuDQoNCjIuIE1lbmdndW5ha2FuIHJ1bXVzIG1vZHVzOg0KDQogICAtICoqTCoqID0gNDEgKGJhdGFzIGJhd2FoIGtlbGFzIG1vZHVzKQ0KICAgLSAqKmbigoEqKiA9IDYgKGZyZWt1ZW5zaSBrZWxhcyBtb2R1cykNCiAgIC0gKipm4oKAKiogPSA0IChmcmVrdWVuc2kga2VsYXMgc2ViZWx1bW55YSkNCiAgIC0gKipm4oKCKiogPSA1IChmcmVrdWVuc2kga2VsYXMgc2V0ZWxhaG55YSkNCiAgIC0gKipoKiogPSAyMCAocGFuamFuZyBrZWxhcyBpbnRlcnZhbCkNCg0KXFsNClx0ZXh0e01vZHVzfSA9IDQxICsgXGxlZnQoIFxmcmFjezYgLSA0fXsoMiBcdGltZXMgNikgLSA0IC0gNX0gXHJpZ2h0KSBcdGltZXMgMjAgDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gNDEgKyBcbGVmdCggXGZyYWN7Mn17MTIgLSA0IC0gNX0gXHJpZ2h0KSBcdGltZXMgMjAgDQpcXQ0KDQpcWw0KXHRleHR7TW9kdXN9ID0gNDEgKyBcbGVmdCggXGZyYWN7Mn17M30gXHJpZ2h0KSBcdGltZXMgMjAgPSA0MSArIDEzLjMzID0gNTQuMzMNClxdDQoNCioqSGFzaWwgTW9kdXMgKGRlbmdhbiBvdXRsaWVyKSoqID0gNTQuMzMNCg0KDQojIyMgMi4zLjIgREFUQSBUQU5QQSBPVVRMSUVSDQoNClVudHVrIG1lbmdoaXR1bmcgbmlsYWkgKip0YW5wYSBvdXRsaWVyKiosIGtpdGEgYWthbiBtZW5nYWJhaWthbiBuaWxhaSA5NSwgeWFuZyBtZXJ1cGFrYW4gb3V0bGllciwgc2VoaW5nZ2EgZGF0YSB5YW5nIGRpZ3VuYWthbiBhZGFsYWg6DQoNCnwgS2Vsb21wb2sgTmlsYWkgVWppYW4gfCBGcmVrdWVuc2kgKGYpIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwNCnwgMCAtIDIwICAgICAgICAgICAgICAgfCAyICAgICAgICAgICAgIHwNCnwgMjEgLSA0MCAgICAgICAgICAgICAgfCA0ICAgICAgICAgICAgIHwNCnwgNDEgLSA2MCAgICAgICAgICAgICAgfCA2ICAgICAgICAgICAgIHwNCnwgNjEgLSA4MCAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgIHwNCnwgODEgLSA5MCAgICAgICAgICAgICAgfCAzICAgICAgICAgICAgIHwNCg0KDQojIyMjIDIuMy4yLjEgTWVuZ2hpdHVuZyBNZWFuIFRhbnBhIE91dGxpZXINCg0KMS4gVGVudHVrYW4ga2VsYXMgdGVuZ2FoIChcKHhfaVwpKSB1bnR1ayBzZXRpYXAga2VsYXM6DQoNCiAgIC0gS2VsYXMgMCAtIDIwOiBcKCB4XzEgPSBcZnJhY3swICsgMjB9ezJ9ID0gMTAgXCkNCiAgIC0gS2VsYXMgMjEgLSA0MDogXCggeF8yID0gXGZyYWN7MjEgKyA0MH17Mn0gPSAzMC41IFwpDQogICAtIEtlbGFzIDQxIC0gNjA6IFwoIHhfMyA9IFxmcmFjezQxICsgNjB9ezJ9ID0gNTAuNSBcKQ0KICAgLSBLZWxhcyA2MSAtIDgwOiBcKCB4XzQgPSBcZnJhY3s2MSArIDgwfXsyfSA9IDcwLjUgXCkNCiAgIC0gS2VsYXMgODEgLSA5MDogXCggeF81ID0gXGZyYWN7ODEgKyA5MH17Mn0gPSA4NS41IFwpDQoNCjIuIEhpdHVuZyBcKCBmX2kgXGNkb3QgeF9pIFwpIHVudHVrIHNldGlhcCBrZWxhczoNCg0KICAgLSBcKCBmXzEgXGNkb3QgeF8xID0gMiBcY2RvdCAxMCA9IDIwIFwpDQogICAtIFwoIGZfMiBcY2RvdCB4XzIgPSA0IFxjZG90IDMwLjUgPSAxMjIgXCkNCiAgIC0gXCggZl8zIFxjZG90IHhfMyA9IDYgXGNkb3QgNTAuNSA9IDMwMyBcKQ0KICAgLSBcKCBmXzQgXGNkb3QgeF80ID0gNSBcY2RvdCA3MC41ID0gMzUyLjUgXCkNCiAgIC0gXCggZl81IFxjZG90IHhfNSA9IDMgXGNkb3QgODUuNSA9IDI1Ni41IFwpDQoNCjMuIEhpdHVuZyBqdW1sYWggdG90YWwgXCggXHN1bSAoZl9pIFxjZG90IHhfaSkgXCk6DQoNCiAgIFxbDQogICBcc3VtIChmX2kgXGNkb3QgeF9pKSA9IDIwICsgMTIyICsgMzAzICsgMzUyLjUgKyAyNTYuNSA9IDEwNTQNCiAgIFxdDQoNCjQuIEhpdHVuZyBqdW1sYWggdG90YWwgZnJla3VlbnNpIFwoIFxzdW0gZl9pIFwpOg0KDQogICBcWw0KICAgXHN1bSBmX2kgPSAyICsgNCArIDYgKyA1ICsgMyA9IDIwDQogICBcXQ0KDQo1LiBIaXR1bmcgKiptZWFuKiogdGFucGEgb3V0bGllcjoNCg0KICAgXFsNCiAgIFxiYXJ7eH0gPSBcZnJhY3sxMDU0fXsyMH0gPSA1Mi43DQogICBcXQ0KDQoqKkhhc2lsIE1lYW4gKHRhbnBhIG91dGxpZXIpKiogPSA1Mi43DQoNCg0KIyMjIyAyLjMuMi4yIE1lbmdoaXR1bmcgTWVkaWFuIFRhbnBhIE91dGxpZXINCg0KMS4gVGVudHVrYW4gcG9zaXNpIG1lZGlhbjogXCggXGZyYWN7MjB9ezJ9ID0gMTAgXCkuIEFydGlueWEsIHBvc2lzaSBtZWRpYW4gYmVyYWRhIHBhZGEgZGF0YSBrZS0xMC4NCg0KMi4gRnJla3VlbnNpIGt1bXVsYXRpZjoNCg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgMCAtIDIwID0gMg0KICAgLSBGcmVrdWVuc2kga3VtdWxhdGlmIHNldGVsYWgga2VsYXMgMjEgLSA0MCA9IDYNCiAgIC0gRnJla3VlbnNpIGt1bXVsYXRpZiBzZXRlbGFoIGtlbGFzIDQxIC0gNjAgPSAxMg0KICAgLSBLYXJlbmEgcG9zaXNpIGtlLTEwIGJlcmFkYSBwYWRhICoqa2VsYXMgNDEgLSA2MCoqLCBtYWthIGtlbGFzIG1lZGlhbiBhZGFsYWgga2VsYXMgaW5pLg0KDQozLiBNZW5nZ3VuYWthbiBydW11cyBtZWRpYW46DQoNCiAgIC0gKipMKiogPSA0MQ0KICAgLSAqKkYqKiA9IDYNCiAgIC0gKipmKiogPSA2DQogICAtICoqaCoqID0gMjANCg0KICAgXFsNCiAgIFx0ZXh0e01lZGlhbn0gPSA0MSArIFxsZWZ0KCBcZnJhY3sxMCAtIDZ9ezZ9IFxyaWdodCkgXHRpbWVzIDIwID0gNDEgKyBcbGVmdCggXGZyYWN7NH17Nn0gXHJpZ2h0KSBcdGltZXMgMjAgPSA0MSArIDEzLjMzID0gNTQuMzMNCiAgIFxdDQoNCioqSGFzaWwgTWVkaWFuICh0YW5wYSBvdXRsaWVyKSoqID0gNTQuMzMNCg0KDQojIyMjIDIuMy4yLjMgTWVuZ2hpdHVuZyBNb2R1cyBUYW5wYSBPdXRsaWVyDQoNCjEuIEtlbGFzIG1vZHVzIGFkYWxhaCAqKmtlbGFzIDQxIC0gNjAqKiBkZW5nYW4gZnJla3VlbnNpIFwoIGZfMSA9IDYgXCksIGtlbGFzIHNlYmVsdW1ueWEgYWRhbGFoIGtlbGFzIDIxIC0gNDAgZGVuZ2FuIFwoIGZfMCA9IDQgXCksIGRhbiBrZWxhcyBzZXRlbGFobnlhIGFkYWxhaCBrZWxhcyA2MSAtIDgwIGRlbmdhbiBcKCBmXzIgPSA1IFwpLg0KDQoyLiBNZW5nZ3VuYWthbiBydW11cyBtb2R1czoNCg0KICAgLSAqKkwqKiA9IDQxDQogICAtICoqZuKCgSoqID0gNg0KICAgLSAqKmbigoAqKiA9IDQNCiAgIC0gKipm4oKCKiogPSA1DQogICAtICoqaCoqID0gMjANCg0KXFsNClx0ZXh0e01vZHVzfSA9IDQxICsgXGxlZnQoIFxmcmFjezYgLSA0fXsoMiBcdGltZXMgNikgLSA0IC0gNX0gXHJpZ2h0KSBcdGltZXMgMjANClxdDQoNClxbDQpcdGV4dHtNb2R1c30gPSA0MSArIFxsZWZ0KCBcZnJhY3syfXsxMiAtIDQgLSA1fSBccmlnaHQpIFx0aW1lcyAyMCANClxdDQoNClxbDQpcdGV4dHtNb2R1c30gPSA0MSArIFxsZWZ0KCBcZnJhY3syfXszfSBccmlnaHQpIFx0aW1lcyAyMCA9IDQxICsgMTMuMzMgPSA1NC4zMw0KXF0NCg0KKipIYXNpbCBNb2R1cyAodGFucGEgb3V0bGllcikqKiA9IDU0LjMzDQoNCi0tLQ0KDQojIyMgMi4zLjMgSGFzaWwga2VzZWx1cnVoYW46DQoNCi0gKipEZW5nYW4gT3V0bGllcioqOiANCiAgLSAqKk1lYW4qKiA9IDU0LjcxDQogIC0gKipNZWRpYW4qKiA9IDU2DQogIC0gKipNb2R1cyoqID0gNTQuMzMNCiAgDQotICoqVGFucGEgT3V0bGllcioqOiANCiAgLSAqKk1lYW4qKiA9IDUyLjcNCiAgLSAqKk1lZGlhbioqID0gNTQuMzMNCiAgLSAqKk1vZHVzKiogPSA1NC4zMw0KDQotICoqUGVuZ2FydWggT3V0bGllcioqOg0KICAtICoqTWVhbioqIHRlcnBlbmdhcnVoIG9sZWggb3V0bGllciBkYW4gc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuIHRhbnBhIG91dGxpZXIuDQogIC0gKipNZWRpYW4qKiB0ZXRhcCByZWxhdGlmIHN0YWJpbCBtZXNraXB1biBhZGEgb3V0bGllci4NCiAgLSAqKk1vZHVzKioganVnYSB0ZXRhcCBzdGFiaWwgbWVza2lwdW4gYWRhIG91dGxpZXIuDQogIA0KLS0tDQoNCiMjIyAyLjMuNCBQcmVzZW50YXNlIEtlY29jb2thbg0KDQpVbnR1ayBtZW5naGl0dW5nIGtlY29jb2thbiBrZXNlbHVydWhhbiBhbnRhcmEgZGF0YSBkZW5nYW4gb3V0bGllciBkYW4gdGFucGEgb3V0bGllciwga2l0YSBiaXNhIG1lbmdndW5ha2FuIHJhdGEtcmF0YSBwZXJzZW50YXNlIHBlcmJlZGFhbiBhbnRhcmEgKiptZWFuKiosICoqbWVkaWFuKiosIGRhbiAqKm1vZHVzKiouDQoNCi0gUGVyYmVkYWFuIE1lYW46DQoNClxbDQpcbGVmdHwgXGZyYWN7NTQuNzEgLSA1Mi4wN317NTIuMDd9IFxyaWdodHwgXHRpbWVzIDEwMCBcYXBwcm94IDMuODFcJQ0KXF0NCg0KLSBQZXJiZWRhYW4gTWVkaWFuOg0KDQpcWw0KXGxlZnR8IFxmcmFjezU2IC0gNTQuMzN9ezU0LjMzfSBccmlnaHR8IFx0aW1lcyAxMDAgPSAzLjA3XCUNClxdDQoNCi0gUGVyYmVkYWFuIE1vZHVzOiANCg0KXFsNClxsZWZ0fCBcZnJhY3s1NC4zMyAtIDU0LjMzfXs1NC4zM30gXHJpZ2h0fCBcdGltZXMgMTAwID0gMC4wXCUNClxdDQoNCi0gUmF0YS1yYXRhIFBlcnNlbnRhc2UgUGVyYmVkYWFuOg0KDQpVbnR1ayBtZW5naGl0dW5nIHJhdGEtcmF0YSBwZXJiZWRhYW4gYW50YXJhIGtldGlnYSBuaWxhaSAobWVhbiwgbWVkaWFuLCBtb2R1cyk6DQoNClxbDQpcdGV4dHtSYXRhLXJhdGEgUGVyYmVkYWFufSA9IFxmcmFjezMuODFcJSArIDMuMDdcJSArIDAuMFwlfXszfSA9IDIuMjlcJQ0KXF0NCg0KLSBQZXJzZW50YXNlIEtlY29jb2thbjoNCktlY29jb2thbiBkYXRhIGRhcGF0IGRpaGl0dW5nIGRlbmdhbjoNClxbDQpcdGV4dHtLZWNvY29rYW59ID0gMTAwXCUgLSAyLjI5XCUgPSA5Ny43MVwlDQpcXQ0KDQojIyMgMi4zLjUgS2VzaW1wdWxhbjoNCg0KS29uc2lzdGVuc2kgZGF0YSB5YW5nIG1lbnVuanVra2FuIGtlY29jb2thbiBhbnRhcmEgZGVuZ2FuIGRhbiB0YW5wYSBvdXRsaWVyIG1lbmFuZGFrYW4gYmFod2EgcGVyZm9ybWEgYWthZGVtaWsgc2lzd2EgdGVyZGlzdHJpYnVzaSBjdWt1cCBtZXJhdGEsIGRlbmdhbiBzZWJhZ2lhbiBiZXNhciBzaXN3YSBiZXJhZGEgcGFkYSB0aW5na2F0IG5pbGFpIHlhbmcgbWVuY2VybWlua2FuIHBlbWFoYW1hbiB5YW5nIG1lbWFkYWkgdGVyaGFkYXAgbWF0ZXJpIHlhbmcgZGlhamFya2FuLiBJbmkgbWVudW5qdWtrYW4gYmFod2Ega3VyaWt1bHVtIGRhbiBtZXRvZGUgcGVuZ2FqYXJhbiB5YW5nIGRpZ3VuYWthbiBkYXBhdCBtZW5qYW5na2F1IHNlYmFnaWFuIGJlc2FyIHNpc3dhLCBtZXNraXB1biBiZWJlcmFwYSBzaXN3YSBtdW5na2luIG1lbmdhbGFtaSBrZXN1bGl0YW4sIHNlcGVydGkgeWFuZyB0ZXJjZXJtaW4gZGFyaSBuaWxhaS1uaWxhaSBkaSBiYXdhaCByYXRhLXJhdGEu