Tugas Pertemuan 9

Statistika Dasar

foto

1 Praktikum 1

Berikut data kelompok yang di gunakan dalam praktikum 1:

Interval Kelas Frekuensi
40 - 49 3
50 - 59 6
60 - 69 6
70 - 79 8
100 - 109 1

1.1 Mean untuk Data Kelompok

Definisi Mean

Mean adalah rata rata nilai dari data.

Langkah-langkah untuk Menghitung Mean:

  1. Tentukan titik tengah setiap kelas.

    • Titik tengah kelas dihitung dengan rumus: \[ \text{Titik Tengah} = \frac{\text{Batas Bawah} + \text{Batas Atas}}{2} \]

Kalikan titik tengah dengan frekuensi untuk setiap kelas.

Jumlahkan hasil perkalian dan bagi dengan jumlah total frekuensi untuk mendapatkan mean.

Data Kelompok:

  • 40 - 49: 3
  • 50 - 59: 6
  • 60 - 69: 6
  • 70 - 79: 8
  • 100 - 109: 1

1. Tentukan Titik Tengah Kelas:

  • Kelas 40 - 49: Titik tengah = (40 + 49) / 2 = 44.5
  • Kelas 50 - 59: Titik tengah = (50 + 59) / 2 = 54.5
  • Kelas 60 - 69: Titik tengah = (60 + 69) / 2 = 64.5
  • Kelas 70 - 79: Titik tengah = (70 + 79) / 2 = 74.5
  • Kelas 100 - 109: Titik tengah = (100 + 109) / 2 = 104.5

2. Menghitung Mean: \[ \text{Mean} = \frac{\sum (\text{Titik Tengah} \times \text{Frekuensi})}{\sum \text{Frekuensi}} \]

\[ \text{Mean} = \frac{(44.5 \times 3) + (54.5 \times 6) + (64.5 \times 6) + (74.5 \times 8) + (104.5 \times 1)}{3 + 6 + 6 + 8 + 1} \]

\[ \text{Mean} = \frac{(133.5) + (327) + (387) + (596) + (104.5)}{24} \]

\[ \text{Mean} = \frac{1548}{24} \]

\[ \text{Mean} \approx 64.5 \]

Hasil:

Mean (rata-rata) untuk data kelompok ini adalah 64.5.


1.2 Median untuk Data Kelompok

Penjelasan:

Median adalah nilai tengah dari suatu data.

Rumus Median:

\[ \text{Median} = L + \left(\frac{\frac{n}{2} - F}{f_m}\right) \cdot c \]

Keterangan:

  • L = Batas bawah kelas median

  • n = Jumlah total data

  • F = Frekuensi kumulatif sebelum kelas median

  • f_m = Frekuensi kelas median

  • c = Panjang kelas (selisih antara batas atas dan batas bawah kelas)

Hitung perhitungan manual untuk data dengan dan tanpa outlier sesuai dengan rumus.

1. Data Kelompok dengan Outliers:

Data:

  • 40 - 49: 3 data pada nilai 44.5

  • 50 - 59: 6 data pada nilai 54.5

  • 60 - 69: 6 data pada nilai 64.5

  • 70 - 79: 8 data pada nilai 74.5

  • 100 - 109: 1 data pada nilai 104.5 (outlier)

Jumlah data:
\[ n = 3 + 6 + 6 + 8 + 1 = 24 \]

Langkah 1: Hitung \(\frac{n}{2}\):
\[ \frac{n}{2} = \frac{24}{2} = 12 \]

Langkah 2: Tentukan kelas median (kelas yang mengandung 12):
Frekuensi kumulatif: - 40 - 49: 3 - 50 - 59: 3 + 6 = 9 - 60 - 69: 9 + 6 = 15 (kelas ini mengandung 12)

Jadi, kelas median adalah 60 - 69.

Langkah 3: Tentukan parameter:

  • L (batas bawah kelas median) = 60

  • F (frekuensi kumulatif sebelum kelas median) = 9

  • f_m (frekuensi kelas median) = 6

  • c (panjang kelas) = 69 - 60 = 9

Sekarang kita masukkan nilai-nilai ini ke dalam rumus median:

\[ \text{Median} = 60 + \left(\frac{12 - 9}{6}\right) \cdot 9 \] \[ \text{Median} = 60 + \left(\frac{3}{6}\right) \cdot 9 = 60 + 0.5 \cdot 9 = 60 + 4.5 = 64.5 \]

Jadi, median dengan outliers adalah 64.5.


2. Data Kelompok tanpa Outliers:

Data:

  • 40 - 49: 3 data pada nilai 44.5

  • 50 - 59: 6 data pada nilai 54.5

  • 60 - 69: 6 data pada nilai 64.5

  • 70 - 79: 8 data pada nilai 74.5

Jumlah data:
\[ n = 3 + 6 + 6 + 8 = 23 \]

Langkah 1: Hitung \(\frac{n}{2}\):
\[ \frac{n}{2} = \frac{23}{2} = 11.5 \]

Langkah 2: Tentukan kelas median (kelas yang mengandung 11.5):
Frekuensi kumulatif:

  • 40 - 49: 3

  • 50 - 59: 3 + 6 = 9

  • 60 - 69: 9 + 6 = 15 (kelas ini mengandung 11.5)

Jadi, kelas median adalah 60 - 69.

Langkah 3: Tentukan parameter:

  • L (batas bawah kelas median) = 60

  • F (frekuensi kumulatif sebelum kelas median) = 9

  • f_m (frekuensi kelas median) = 6

  • c (panjang kelas) = 69 - 60 = 9

Sekarang kita masukkan nilai-nilai ini ke dalam rumus median:

\[ \text{Median} = 60 + \left(\frac{11.5 - 9}{6}\right) \cdot 9 \] \[ \text{Median} = 60 + \left(\frac{2.5}{6}\right) \cdot 9 = 60 + 0.4167 \cdot 9 = 60 + 3.75 = 63.75 \]

Jadi, median tanpa outliers adalah 63.75.


Kesimpulan:

  • Median dengan Outliers = 64.5
  • Median tanpa Outliers = 63.75

1.3 Modus untuk Data Kelompok

Penjelasan: Modus adalah nilai yang paling sering muncul dalam suatu data.

Rumus modus untuk data kelompok:
\[ \text{Modus} = L + \left(\frac{d_1}{d_1 + d_2}\right) \cdot c \]
Berikut penjelasan singkat tentang parameter-parameter dalam rumus modus untuk data kelompok:

\[ \text{Modus} = L + \left(\frac{d_1}{d_1 + d_2}\right) \cdot c \] L: Batas bawah kelas modus (kelas dengan frekuensi tertinggi).

d₁: Selisih antara frekuensi kelas modus dan frekuensi kelas sebelumnya.

d₂: Selisih antara frekuensi kelas modus dan frekuensi kelas setelahnya.

c: Panjang kelas interval (selisih antara batas atas dan batas bawah kelas).

1.3.1 Langkah-langkah perhitungan:

  1. Tentukan kelas modus, yaitu kelas yang memiliki frekuensi tertinggi.

  2. Hitung nilai d₁ (selisih frekuensi kelas modus dan kelas sebelumnya) dan d₂ (selisih frekuensi kelas modus dan kelas setelahnya).

  3. Masukkan nilai-nilai tersebut ke dalam rumus untuk menghitung modus.

Masukkan nilai ke dalam rumus:

\[ \text{Modus} = 70 + \left( \frac{(8 - 6)}{(2 \times 8 - 6 - 1)} \right) \times 10 \]

perhitungan:

\[ \text{Modus} = 70 + \left( \frac{2}{(16 - 6 - 1)} \right) \times 10 \] \[ \text{Modus} = 70 + \left( \frac{2}{9} \right) \times 10 \] \[ \text{Modus} = 70 + 2.22 \] \[ \text{Modus} \approx 72.22 \]

Hasil: Modus untuk data ini adalah sekitar 72.22. Ini berarti bahwa nilai yang paling sering muncul dalam distribusi data ini berada di sekitar kelas 70 - 79, dan modusnya adalah sekitar 72.22.

Jika Anda memiliki data kelompok lain, langkah yang sama dapat diterapkan untuk menghitung modusnya.


2 Praktikum 2

contoh sederhana yang menggunakan pemusatan data dalam studi kasus sebagai berikut:

2.1 Bisnis

Berikut adalah contoh data kelompok yang berhubungan dengan bidang bisnis, misalnya dalam konteks pendapatan perusahaan berdasarkan kategori omzet per bulan.

Data Kelompok:

Rentang Omzet (Juta IDR) Frekuensi (Jumlah Perusahaan)
10 - 19 4
20 - 29 7
30 - 39 12
40 - 49 5
50 - 59 3
60 - 69 1

PENJELASAN:

  • Rentang Omzet: Kategori omzet bulanan perusahaan dalam satuan juta IDR.

  • Frekuensi: Jumlah perusahaan yang memiliki omzet dalam rentang tertentu. #### Visualisasi dan penjelasan Boxplot Berikut merupakan perhitungan modus, median, mean, dan histogram untuk data kelompok omzet perusahaan:

  1. Modus:

Untuk menghitung modus berdasarkan rumus yang sudah disebutkan: \[ \text{Modus} = L + \left(\frac{d_1}{d_1 + d_2}\right) \cdot c \] Keterangan: - L adalah batas bawah kelas modus (30 juta IDR untuk kelas 30-39).

  • d₁ adalah selisih antara frekuensi kelas modus (12) dan frekuensi kelas sebelumnya (7).

  • d₂ adalah selisih antara frekuensi kelas modus (12) dan frekuensi kelas setelahnya (5).

  • c adalah panjang kelas interval, yang dalam hal ini adalah 10 juta IDR.

Perhitungan Modus: \[ L = 30, \quad d_1 = 12 - 7 = 5, \quad d_2 = 12 - 5 = 7, \quad c = 10 \] \[ \text{Modus} = 30 + \left(\frac{5}{5 + 7}\right) \cdot 10 \] \[ \text{Modus} = 30 + \left(\frac{5}{12}\right) \cdot 10 = 30 + 4.17 = 34.17 \, \text{juta IDR} \]

  1. Median:

Untuk menghitung median, kita perlu mencari kelas median terlebih dahulu, yang merupakan kelas yang berisi nilai kumulatif tengah (\(\frac{n}{2}\)).

Jumlah total frekuensi adalah: \[ n = 4 + 7 + 12 + 5 + 3 + 1 = 32 \] Setengahnya adalah: \[ \frac{n}{2} = \frac{32}{2} = 16 \] Kelas yang berisi nilai ke-16 adalah kelas 30 - 39 juta IDR (karena jumlah kumulatifnya hingga kelas ini adalah 4 + 7 + 12 = 23).

Untuk menghitung median, kita gunakan rumus: \[ \text{Median} = L + \left(\frac{\frac{n}{2} - F}{f_m}\right) \cdot c \] Keterangan:

  • L adalah batas bawah kelas median (30 juta IDR).

  • F adalah jumlah frekuensi kumulatif sebelum kelas median (4 + 7 = 11).

  • fₘ adalah frekuensi kelas median (12).

  • c adalah panjang kelas interval (10 juta IDR).

Perhitungan Median:

\[ L = 30, \quad F = 11, \quad f_m = 12, \quad c = 10 \] \[ \text{Median} = 30 + \left(\frac{16 - 11}{12}\right) \cdot 10 = 30 + \left(\frac{5}{12}\right) \cdot 10 = 30 + 4.17 = 34.17 \, \text{juta IDR} \]

  1. Mean:

Untuk menghitung mean (rata-rata), kita hitung menggunakan rumus: \[ \text{Mean} = \frac{\sum (f \cdot x)}{n} \] Keterangan:

  • f adalah frekuensi kelas.

  • x adalah titik tengah setiap kelas.

Titik tengah (x) untuk setiap kelas:

  • Kelas 10 - 19: \(x = \frac{10 + 19}{2} = 14.5\)

  • Kelas 20 - 29: \(x = \frac{20 + 29}{2} = 24.5\)

  • Kelas 30 - 39: \(x = \frac{30 + 39}{2} = 34.5\)

  • Kelas 40 - 49: \(x = \frac{40 + 49}{2} = 44.5\)

  • Kelas 50 - 59: \(x = \frac{50 + 59}{2} = 54.5\)

  • Kelas 60 - 69: \(x = \frac{60 + 69}{2} = 64.5\)

Perhitungan mean: \[ \text{Mean} = \frac{(4 \cdot 14.5) + (7 \cdot 24.5) + (12 \cdot 34.5) + (5 \cdot 44.5) + (3 \cdot 54.5) + (1 \cdot 64.5)}{32} \] \[ \text{Mean} = \frac{(58) + (171.5) + (414) + (222.5) + (163.5) + (64.5)}{32} = \frac{1094}{32} = 34.19 \, \text{juta IDR} \]

  1. Histogram:

Sekarang, kita akan membuat Histogram yang mencakup mean, median, dan modus berdasarkan data yang telah dihitung.

Berikut adalah visualisasi Histogram:

2.2 Kesehatan

Berikut adalah langkah perhitungan mean, median, dan modus, serta visualisasi dalam bentuk density plot untuk data kelompok yang berhubungan dengan bidang kesehatan.


Data Kelompok

Rentang Usia Frekuensi (Jumlah Pasien)
0 - 9 15
10 - 19 10
20 - 29 25
30 - 39 30
40 - 49 20
50 - 59 12
60 - 69 8
70 - 79 5

Perhitungan Mean, Median, dan Modus

1. Mean Menggunakan rumus: \[ \text{Mean} = \frac{\sum (f \cdot x)}{n} \] Titik tengah (x) untuk setiap kelas dihitung sebagai: \[ x = \frac{\text{Batas Bawah + Batas Atas}}{2} \]

Rentang Usia Titik Tengah (x) Frekuensi (f) \(f \cdot x\)
0 - 9 4.5 15 67.5
10 - 19 14.5 10 145
20 - 29 24.5 25 612.5
30 - 39 34.5 30 1035
40 - 49 44.5 20 890
50 - 59 54.5 12 654
60 - 69 64.5 8 516
70 - 79 74.5 5 372.5

Total \(\sum f = 125\), Total \(\sum (f \cdot x) = 4292.5\)

\[ \text{Mean} = \frac{4292.5}{125} = 34.34 \]


2. Median Menggunakan rumus: \[ \text{Median} = L + \left( \frac{\frac{n}{2} - F}{f_m} \right) \cdot c \] - Total pasien (\(n\)) = 125
- \(\frac{n}{2} = 62.5\)
- Kelas median adalah 30 - 39, karena kumulatif hingga kelas ini mencapai lebih dari 62.5.
- L = 30
- F = 50 (frekuensi kumulatif sebelum kelas median)
- fₘ = 30 (frekuensi kelas median)
- c = 10

\[ \text{Median} = 30 + \left( \frac{62.5 - 50}{30} \right) \cdot 10 = 30 + \left( \frac{12.5}{30} \right) \cdot 10 = 30 + 4.17 = 34.17 \]


3. Modus Menggunakan rumus: \[ \text{Modus} = L + \left( \frac{d_1}{d_1 + d_2} \right) \cdot c \] Keterangan:
- L = 30 (batas bawah kelas modus)
- d₁ = frekuensi kelas modus - frekuensi sebelumnya = \(30 - 25 = 5\)
- d₂ = frekuensi kelas modus - frekuensi setelahnya = \(30 - 20 = 10\)
- c = 10

\[ \text{Modus} = 30 + \left( \frac{5}{5 + 10} \right) \cdot 10 = 30 + \left( \frac{5}{15} \right) \cdot 10 = 30 + 3.33 = 33.33 \]


Histogram

Berikut adalah visualisasi histogram:

2.3 Pendidikan

Berikut adalah contoh data kelompok yang berhubungan dengan bidang pendidikan. Data ini menggambarkan jumlah siswa berdasarkan nilai ujian akhir dalam suatu kelas:

Rentang Nilai Frekuensi (Jumlah Siswa)
0 - 9 3
10 - 19 5
20 - 29 10
30 - 39 15
40 - 49 20
50 - 59 25
60 - 69 30
70 - 79 25
80 - 89 15
90 - 100 7

Berikut perhitungan mean, median, dan modus, serta pembuatan Histogram berdasarkan data diatas:


Perhitungan

  1. Titik Tengah Kelas
    Setiap rentang nilai dikonversi menjadi titik tengah: \[ \text{Titik Tengah} = \frac{\text{Batas Bawah} + \text{Batas Atas}}{2} \] Hasilnya:
Rentang Nilai Frekuensi (f) Titik Tengah (x) f * x
0 - 9 3 4.5 13.5
10 - 19 5 14.5 72.5
20 - 29 10 24.5 245
30 - 39 15 34.5 517.5
40 - 49 20 44.5 890
50 - 59 25 54.5 1362.5
60 - 69 30 64.5 1935
70 - 79 25 74.5 1862.5
80 - 89 15 84.5 1267.5
90 - 100 7 95 665

  1. Mean (Rata-rata)
    \[ \text{Mean} = \frac{\sum (f \cdot x)}{\sum f} \] \[ \text{Mean} = \frac{8931}{155} \approx 57.62 \]

  1. Median
    Median dihitung dari kelas yang mengandung nilai kumulatif tengah (\(\frac{n}{2}\)): \[ \frac{155}{2} = 77.5 \] Nilai ini berada dalam kelas 60 - 69 (karena kumulatif hingga kelas ini adalah 78).
    Rumus median: \[ \text{Median} = L + \left(\frac{\frac{n}{2} - F}{f_m}\right) \cdot c \] Keterangan:
  • \(L = 60\), batas bawah kelas median.
  • \(F = 53\), kumulatif sebelum kelas median.
  • \(f_m = 30\), frekuensi kelas median.
  • \(c = 10\), panjang interval kelas.

\[ \text{Median} = 60 + \left(\frac{77.5 - 53}{30}\right) \cdot 10 = 60 + \left(\frac{24.5}{30}\right) \cdot 10 \approx 60 + 8.17 = 68.17 \]


  1. Modus
    Kelas modus adalah kelas dengan frekuensi tertinggi, yaitu 60 - 69.
    Rumus modus: \[ \text{Modus} = L + \left(\frac{d_1}{d_1 + d_2}\right) \cdot c \] Keterangan:
  • \(L = 60\), batas bawah kelas modus.
  • \(d_1 = 30 - 25 = 5\).
  • \(d_2 = 30 - 25 = 5\).
  • \(c = 10\).

\[ \text{Modus} = 60 + \left(\frac{5}{5 + 5}\right) \cdot 10 = 60 + 5 = 65 \]


Histogram

Berikut adalah kode untuk membuat density plot beserta anotasi mean, median, dan modus:

LS0tDQp0aXRsZTogIlR1Z2FzIFBlcnRlbXVhbiA5Ig0Kc3VidGl0bGU6ICJTdGF0aXN0aWthIERhc2FyIg0KYXV0aG9yOiANCiAgLSAiQ2hlbGxvIEZyaGlubyBNaWtlIE0gKDUyMjQwMDMxKSINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOiAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQotLS0NCg0KPHN0eWxlPg0KICBib2R5IHsNCiAgICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ow0KICB9DQo8L3N0eWxlPg0KDQo8aW1nIGlkPSJmb3RvLWF1dGhvciIgc3JjPSJDOi9Vc2Vycy9VU0VSL0RvY3VtZW50cy9SQm94cGxvdC9pbWcvV2hhdHNBcHAgSW1hZ2UgMjAyNC0xMS0yNCBhdCAzLjI5LjQxIFBNLmpwZWciIGFsdD0iZm90byIgc3R5bGU9IndpZHRoOjMwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQoNCiMgUHJha3Rpa3VtIDENCkJlcmlrdXQgZGF0YSBrZWxvbXBvayB5YW5nIGRpIGd1bmFrYW4gZGFsYW0gcHJha3Rpa3VtIDE6DQoNCnwgSW50ZXJ2YWwgS2VsYXMgfCBGcmVrdWVuc2kgfA0KfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18DQp8IDQwIC0gNDkgICAgICAgIHwgMyAgICAgICAgIHwNCnwgNTAgLSA1OSAgICAgICAgfCA2ICAgICAgICAgfA0KfCA2MCAtIDY5ICAgICAgICB8IDYgICAgICAgICB8DQp8IDcwIC0gNzkgICAgICAgIHwgOCAgICAgICAgIHwNCnwgMTAwIC0gMTA5ICAgICAgfCAxICAgICAgICAgfA0KDQoNCiMjIE1lYW4gdW50dWsgRGF0YSBLZWxvbXBvaw0KDQoqKkRlZmluaXNpIE1lYW4qKg0KDQpNZWFuIGFkYWxhaCByYXRhIHJhdGEgbmlsYWkgZGFyaSBkYXRhLg0KDQoqKkxhbmdrYWgtbGFuZ2thaCB1bnR1ayBNZW5naGl0dW5nIE1lYW46KioNCg0KMS4gKipUZW50dWthbiB0aXRpayB0ZW5nYWggc2V0aWFwIGtlbGFzKiouDQoNCiAgIC0gVGl0aWsgdGVuZ2FoIGtlbGFzIGRpaGl0dW5nIGRlbmdhbiBydW11czoNCiAgIFxbDQogICBcdGV4dHtUaXRpayBUZW5nYWh9ID0gXGZyYWN7XHRleHR7QmF0YXMgQmF3YWh9ICsgXHRleHR7QmF0YXMgQXRhc319ezJ9DQogICBcXQ0KDQoqKkthbGlrYW4gdGl0aWsgdGVuZ2FoIGRlbmdhbiBmcmVrdWVuc2kqKiB1bnR1ayBzZXRpYXAga2VsYXMuDQoNCioqSnVtbGFoa2FuIGhhc2lsIHBlcmthbGlhbioqIGRhbiBiYWdpIGRlbmdhbiBqdW1sYWggdG90YWwgZnJla3VlbnNpIHVudHVrIG1lbmRhcGF0a2FuICoqbWVhbioqLg0KDQoqKkRhdGEgS2Vsb21wb2s6KioNCg0KLSAqKjQwIC0gNDkqKjogMw0KLSAqKjUwIC0gNTkqKjogNg0KLSAqKjYwIC0gNjkqKjogNg0KLSAqKjcwIC0gNzkqKjogOA0KLSAqKjEwMCAtIDEwOSoqOiAxDQoNCioqMS4gVGVudHVrYW4gVGl0aWsgVGVuZ2FoIEtlbGFzOioqDQoNCi0gS2VsYXMgNDAgLSA0OTogVGl0aWsgdGVuZ2FoID0gKDQwICsgNDkpIC8gMiA9IDQ0LjUNCi0gS2VsYXMgNTAgLSA1OTogVGl0aWsgdGVuZ2FoID0gKDUwICsgNTkpIC8gMiA9IDU0LjUNCi0gS2VsYXMgNjAgLSA2OTogVGl0aWsgdGVuZ2FoID0gKDYwICsgNjkpIC8gMiA9IDY0LjUNCi0gS2VsYXMgNzAgLSA3OTogVGl0aWsgdGVuZ2FoID0gKDcwICsgNzkpIC8gMiA9IDc0LjUNCi0gS2VsYXMgMTAwIC0gMTA5OiBUaXRpayB0ZW5nYWggPSAoMTAwICsgMTA5KSAvIDIgPSAxMDQuNQ0KDQoqKjIuIE1lbmdoaXR1bmcgTWVhbjoqKg0KXFsNClx0ZXh0e01lYW59ID0gXGZyYWN7XHN1bSAoXHRleHR7VGl0aWsgVGVuZ2FofSBcdGltZXMgXHRleHR7RnJla3VlbnNpfSl9e1xzdW0gXHRleHR7RnJla3VlbnNpfX0NClxdDQoNClxbDQpcdGV4dHtNZWFufSA9IFxmcmFjeyg0NC41IFx0aW1lcyAzKSArICg1NC41IFx0aW1lcyA2KSArICg2NC41IFx0aW1lcyA2KSArICg3NC41IFx0aW1lcyA4KSArICgxMDQuNSBcdGltZXMgMSl9ezMgKyA2ICsgNiArIDggKyAxfQ0KXF0NCg0KXFsNClx0ZXh0e01lYW59ID0gXGZyYWN7KDEzMy41KSArICgzMjcpICsgKDM4NykgKyAoNTk2KSArICgxMDQuNSl9ezI0fQ0KXF0NCg0KXFsNClx0ZXh0e01lYW59ID0gXGZyYWN7MTU0OH17MjR9DQpcXQ0KDQpcWw0KXHRleHR7TWVhbn0gXGFwcHJveCA2NC41DQpcXQ0KDQoqKkhhc2lsKio6DQoNCioqTWVhbioqIChyYXRhLXJhdGEpIHVudHVrIGRhdGEga2Vsb21wb2sgaW5pIGFkYWxhaCAqKjY0LjUqKi4NCg0KLS0tDQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KDQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGtlbG9tcG9rIGRlbmdhbiBkYW4gdGFucGEgb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGMocmVwKDQ0LjUsIDMpLCByZXAoNTQuNSwgNiksIHJlcCg2NC41LCA2KSwgcmVwKDc0LjUsIDgpLCByZXAoMTA0LjUsIDEpKSAgIyBEZW5nYW4gb3V0bGllcnMgKG5pbGFpIDEwMC0xMDkpDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGMocmVwKDQ0LjUsIDMpLCByZXAoNTQuNSwgNiksIHJlcCg2NC41LCA2KSwgcmVwKDc0LjUsIDgpKSAgIyBUYW5wYSBvdXRsaWVycw0KDQojIE1lbmdoaXR1bmcgcmF0YS1yYXRhIHVudHVrIGtlZHVhIGRhdGFzZXQNCm1lYW5fZGVuZ2FuX291dGxpZXJzIDwtIG1lYW4oZGF0YV9kZW5nYW5fb3V0bGllcnMpDQptZWFuX3RhbnBhX291dGxpZXJzIDwtIG1lYW4oZGF0YV90YW5wYV9vdXRsaWVycykNCg0KIyBNZW5nZ2FidW5na2FuIGRhdGEga2UgZGFsYW0gc2F0dSBkYXRhIGZyYW1lIHVudHVrIHZpc3VhbGlzYXNpDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gYyhkYXRhX2Rlbmdhbl9vdXRsaWVycywgZGF0YV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLCANCiAgICAgICAgICAgICAgICAgdGltZXMgPSBjKGxlbmd0aChkYXRhX2Rlbmdhbl9vdXRsaWVycyksIGxlbmd0aChkYXRhX3RhbnBhX291dGxpZXJzKSkpDQopDQoNCiMgTWVtYnVhdCBib3hwbG90IG1lbmdndW5ha2FuIFBsb3RseSBkZW5nYW4gb3V0bGllcnMgZGl0YW1waWxrYW4NCnBsb3QgPC0gcGxvdF9seSgNCiAgZGF0YSwgDQogIHkgPSB+TmlsYWksIA0KICBjb2xvciA9IH5LZWxvbXBvaywgDQogIHR5cGUgPSAiYm94IiwgDQogIGJveHBvaW50cyA9ICJzdXNwZWN0ZWRvdXRsaWVycyIsICAjIE1lbmFtcGlsa2FuIHRpdGlrIHlhbmcgZGljdXJpZ2FpIHNlYmFnYWkgb3V0bGllcnMNCiAgaml0dGVyID0gMC41ICAjIE1lbmFtYmFoIHBlbnllYmFyYW4gdW50dWsgbWVsaWhhdCBuaWxhaSBkZW5nYW4gbGViaWggamVsYXMNCikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJCb3hwbG90IGRlbmdhbiBkYW4gdGFucGEgT3V0bGllcnMiLA0KICAgIHlheGlzID0gbGlzdCgNCiAgICAgIHRpdGxlID0gIk5pbGFpIiwgDQogICAgICByYW5nZSA9IGMoNDAsIDExMCkgICMgTWVuZXRhcGthbiByZW50YW5nIG1hbnVhbCBzdW1idSBZDQogICAgKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtZWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjoiLCByb3VuZChtZWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQojIyBNZWRpYW4gdW50dWsgRGF0YSBLZWxvbXBvaw0KDQoqKlBlbmplbGFzYW46KioNCg0KTWVkaWFuIGFkYWxhaCBuaWxhaSB0ZW5nYWggZGFyaSBzdWF0dSBkYXRhLiANCg0KKipSdW11cyBNZWRpYW46KioNCg0KXFsNClx0ZXh0e01lZGlhbn0gPSBMICsgXGxlZnQoXGZyYWN7XGZyYWN7bn17Mn0gLSBGfXtmX219XHJpZ2h0KSBcY2RvdCBjDQpcXQ0KDQpLZXRlcmFuZ2FuOg0KDQotICoqTCoqID0gQmF0YXMgYmF3YWgga2VsYXMgbWVkaWFuDQoNCi0gKipuKiogPSBKdW1sYWggdG90YWwgZGF0YQ0KDQotICoqRioqID0gRnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbg0KDQotICoqZl9tKiogPSBGcmVrdWVuc2kga2VsYXMgbWVkaWFuDQoNCi0gKipjKiogPSBQYW5qYW5nIGtlbGFzIChzZWxpc2loIGFudGFyYSBiYXRhcyBhdGFzIGRhbiBiYXRhcyBiYXdhaCBrZWxhcykNCg0KSGl0dW5nIHBlcmhpdHVuZ2FuIG1hbnVhbCB1bnR1ayBkYXRhIGRlbmdhbiBkYW4gdGFucGEgb3V0bGllciBzZXN1YWkgZGVuZ2FuIHJ1bXVzLg0KDQoqKjEuIERhdGEgS2Vsb21wb2sgZGVuZ2FuIE91dGxpZXJzOioqDQoNCioqRGF0YToqKg0KDQotICoqNDAgLSA0OSoqOiAzIGRhdGEgcGFkYSBuaWxhaSA0NC41DQoNCi0gKio1MCAtIDU5Kio6IDYgZGF0YSBwYWRhIG5pbGFpIDU0LjUNCg0KLSAqKjYwIC0gNjkqKjogNiBkYXRhIHBhZGEgbmlsYWkgNjQuNQ0KDQotICoqNzAgLSA3OSoqOiA4IGRhdGEgcGFkYSBuaWxhaSA3NC41DQoNCi0gKioxMDAgLSAxMDkqKjogMSBkYXRhIHBhZGEgbmlsYWkgMTA0LjUgKG91dGxpZXIpDQoNCkp1bWxhaCBkYXRhOiAgDQpcWw0KbiA9IDMgKyA2ICsgNiArIDggKyAxID0gMjQNClxdDQoNCioqTGFuZ2thaCAxOiBIaXR1bmcgXChcZnJhY3tufXsyfVwpOioqICANClxbDQpcZnJhY3tufXsyfSA9IFxmcmFjezI0fXsyfSA9IDEyDQpcXQ0KDQoqKkxhbmdrYWggMjogVGVudHVrYW4ga2VsYXMgbWVkaWFuIChrZWxhcyB5YW5nIG1lbmdhbmR1bmcgMTIpOioqICANCkZyZWt1ZW5zaSBrdW11bGF0aWY6DQotIDQwIC0gNDk6IDMNCi0gNTAgLSA1OTogMyArIDYgPSA5DQotIDYwIC0gNjk6IDkgKyA2ID0gMTUgKGtlbGFzIGluaSBtZW5nYW5kdW5nIDEyKQ0KDQpKYWRpLCAqKmtlbGFzIG1lZGlhbioqIGFkYWxhaCAqKjYwIC0gNjkqKi4NCg0KKipMYW5na2FoIDM6IFRlbnR1a2FuIHBhcmFtZXRlcjoqKg0KDQotICoqTCAoYmF0YXMgYmF3YWgga2VsYXMgbWVkaWFuKSoqID0gNjANCg0KLSAqKkYgKGZyZWt1ZW5zaSBrdW11bGF0aWYgc2ViZWx1bSBrZWxhcyBtZWRpYW4pKiogPSA5DQoNCi0gKipmX20gKGZyZWt1ZW5zaSBrZWxhcyBtZWRpYW4pKiogPSA2DQoNCi0gKipjIChwYW5qYW5nIGtlbGFzKSoqID0gNjkgLSA2MCA9IDkNCg0KU2VrYXJhbmcga2l0YSBtYXN1a2thbiBuaWxhaS1uaWxhaSBpbmkga2UgZGFsYW0gcnVtdXMgbWVkaWFuOg0KDQpcWw0KXHRleHR7TWVkaWFufSA9IDYwICsgXGxlZnQoXGZyYWN7MTIgLSA5fXs2fVxyaWdodCkgXGNkb3QgOQ0KXF0NClxbDQpcdGV4dHtNZWRpYW59ID0gNjAgKyBcbGVmdChcZnJhY3szfXs2fVxyaWdodCkgXGNkb3QgOSA9IDYwICsgMC41IFxjZG90IDkgPSA2MCArIDQuNSA9IDY0LjUNClxdDQoNCkphZGksICoqbWVkaWFuIGRlbmdhbiBvdXRsaWVycyoqIGFkYWxhaCAqKjY0LjUqKi4NCg0KLS0tDQoNCioqMi4gRGF0YSBLZWxvbXBvayB0YW5wYSBPdXRsaWVyczoqKg0KDQoqKkRhdGE6KioNCg0KLSAqKjQwIC0gNDkqKjogMyBkYXRhIHBhZGEgbmlsYWkgNDQuNQ0KDQotICoqNTAgLSA1OSoqOiA2IGRhdGEgcGFkYSBuaWxhaSA1NC41DQoNCi0gKio2MCAtIDY5Kio6IDYgZGF0YSBwYWRhIG5pbGFpIDY0LjUNCg0KLSAqKjcwIC0gNzkqKjogOCBkYXRhIHBhZGEgbmlsYWkgNzQuNQ0KDQpKdW1sYWggZGF0YTogIA0KXFsNCm4gPSAzICsgNiArIDYgKyA4ID0gMjMNClxdDQoNCioqTGFuZ2thaCAxOiBIaXR1bmcgXChcZnJhY3tufXsyfVwpOioqICANClxbDQpcZnJhY3tufXsyfSA9IFxmcmFjezIzfXsyfSA9IDExLjUNClxdDQoNCioqTGFuZ2thaCAyOiBUZW50dWthbiBrZWxhcyBtZWRpYW4gKGtlbGFzIHlhbmcgbWVuZ2FuZHVuZyAxMS41KToqKiAgDQpGcmVrdWVuc2kga3VtdWxhdGlmOg0KDQotIDQwIC0gNDk6IDMNCg0KLSA1MCAtIDU5OiAzICsgNiA9IDkNCg0KLSA2MCAtIDY5OiA5ICsgNiA9IDE1IChrZWxhcyBpbmkgbWVuZ2FuZHVuZyAxMS41KQ0KDQpKYWRpLCAqKmtlbGFzIG1lZGlhbioqIGFkYWxhaCAqKjYwIC0gNjkqKi4NCg0KKipMYW5na2FoIDM6IFRlbnR1a2FuIHBhcmFtZXRlcjoqKg0KDQotICoqTCAoYmF0YXMgYmF3YWgga2VsYXMgbWVkaWFuKSoqID0gNjANCg0KLSAqKkYgKGZyZWt1ZW5zaSBrdW11bGF0aWYgc2ViZWx1bSBrZWxhcyBtZWRpYW4pKiogPSA5DQoNCi0gKipmX20gKGZyZWt1ZW5zaSBrZWxhcyBtZWRpYW4pKiogPSA2DQoNCi0gKipjIChwYW5qYW5nIGtlbGFzKSoqID0gNjkgLSA2MCA9IDkNCg0KU2VrYXJhbmcga2l0YSBtYXN1a2thbiBuaWxhaS1uaWxhaSBpbmkga2UgZGFsYW0gcnVtdXMgbWVkaWFuOg0KDQpcWw0KXHRleHR7TWVkaWFufSA9IDYwICsgXGxlZnQoXGZyYWN7MTEuNSAtIDl9ezZ9XHJpZ2h0KSBcY2RvdCA5DQpcXQ0KXFsNClx0ZXh0e01lZGlhbn0gPSA2MCArIFxsZWZ0KFxmcmFjezIuNX17Nn1ccmlnaHQpIFxjZG90IDkgPSA2MCArIDAuNDE2NyBcY2RvdCA5ID0gNjAgKyAzLjc1ID0gNjMuNzUNClxdDQoNCkphZGksICoqbWVkaWFuIHRhbnBhIG91dGxpZXJzKiogYWRhbGFoICoqNjMuNzUqKi4NCg0KLS0tDQoNCioqS2VzaW1wdWxhbjoqKg0KDQotICoqTWVkaWFuIGRlbmdhbiBPdXRsaWVycyoqID0gNjQuNQ0KLSAqKk1lZGlhbiB0YW5wYSBPdXRsaWVycyoqID0gNjMuNzUNCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEga2Vsb21wb2sgZGVuZ2FuIGRhbiB0YW5wYSBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYyhyZXAoNDQuNSwgMyksIHJlcCg1NC41LCA2KSwgcmVwKDY0LjUsIDYpLCByZXAoNzQuNSwgOCksIHJlcCgxMDQuNSwgMSkpICAjIERlbmdhbiBvdXRsaWVycyAobmlsYWkgMTAwLTEwOSkNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYyhyZXAoNDQuNSwgMyksIHJlcCg1NC41LCA2KSwgcmVwKDY0LjUsIDYpLCByZXAoNzQuNSwgOCkpICAjIFRhbnBhIG91dGxpZXJzDQoNCiMgTWVuZ2hpdHVuZyBuaWxhaSBtZWRpYW4gdW50dWsga2VkdWEgZGF0YXNldCAoYmVyZGFzYXJrYW4gcGVyaGl0dW5nYW4gbWFudWFsKQ0KbWVkaWFuX2Rlbmdhbl9vdXRsaWVycyA8LSA2NC41DQptZWRpYW5fdGFucGFfb3V0bGllcnMgPC0gNjMuNzUNCg0KIyBNZW5nZ2FidW5na2FuIGRhdGEga2UgZGFsYW0gc2F0dSBkYXRhIGZyYW1lIHVudHVrIHZpc3VhbGlzYXNpDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gYyhkYXRhX2Rlbmdhbl9vdXRsaWVycywgZGF0YV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLCANCiAgICAgICAgICAgICAgICAgdGltZXMgPSBjKGxlbmd0aChkYXRhX2Rlbmdhbl9vdXRsaWVycyksIGxlbmd0aChkYXRhX3RhbnBhX291dGxpZXJzKSkpDQopDQoNCiMgTWVtYnVhdCBib3hwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KA0KICBkYXRhLCANCiAgeSA9IH5OaWxhaSwgDQogIGNvbG9yID0gfktlbG9tcG9rLCANCiAgdHlwZSA9ICJib3giLCANCiAgYm94cG9pbnRzID0gInN1c3BlY3RlZG91dGxpZXJzIiwNCiAgaml0dGVyID0gMC41LA0KICBib3htZWFuID0gRkFMU0UsDQogIGJveGxpbmUgPSBsaXN0KHdpZHRoID0gMSksDQogIGxpbmUgPSBsaXN0KHdpZHRoID0gMSkNCikgJT4lIA0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiQm94cGxvdCBkZW5nYW4gZGFuIHRhbnBhIE91dGxpZXJzIChNZWRpYW4pIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiLCByYW5nZSA9IGMoNDAsIDExMCkpLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJLZWxvbXBvayIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lZGlhbl9kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuOiIsIHJvdW5kKG1lZGlhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLCBheSA9IC0zMA0KICAgICAgKSwNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiVGFucGEgT3V0bGllcnMiLA0KICAgICAgICB5ID0gbWVkaWFuX3RhbnBhX291dGxpZXJzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW5fdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLCBheSA9IC0zMA0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KDQpgYGANCg0KIyMgTW9kdXMgdW50dWsgRGF0YSBLZWxvbXBvaw0KDQoqKlBlbmplbGFzYW46KioNCk1vZHVzIGFkYWxhaCBuaWxhaSB5YW5nIHBhbGluZyBzZXJpbmcgbXVuY3VsIGRhbGFtIHN1YXR1IGRhdGEuDQoNClJ1bXVzIG1vZHVzIHVudHVrIGRhdGEga2Vsb21wb2s6ICANClxbDQpcdGV4dHtNb2R1c30gPSBMICsgXGxlZnQoXGZyYWN7ZF8xfXtkXzEgKyBkXzJ9XHJpZ2h0KSBcY2RvdCBjDQpcXSAgDQpCZXJpa3V0IHBlbmplbGFzYW4gc2luZ2thdCB0ZW50YW5nIHBhcmFtZXRlci1wYXJhbWV0ZXIgZGFsYW0gcnVtdXMgKiptb2R1cyB1bnR1ayBkYXRhIGtlbG9tcG9rKio6DQoNClxbDQpcdGV4dHtNb2R1c30gPSBMICsgXGxlZnQoXGZyYWN7ZF8xfXtkXzEgKyBkXzJ9XHJpZ2h0KSBcY2RvdCBjDQpcXQ0KKipMKio6ICoqQmF0YXMgYmF3YWgqKiBrZWxhcyBtb2R1cyAoa2VsYXMgZGVuZ2FuIGZyZWt1ZW5zaSB0ZXJ0aW5nZ2kpLg0KDQoqKmTigoEqKjogU2VsaXNpaCBhbnRhcmEgZnJla3VlbnNpIGtlbGFzIG1vZHVzIGRhbiBmcmVrdWVuc2kga2VsYXMgc2ViZWx1bW55YS4NCg0KKipk4oKCKio6IFNlbGlzaWggYW50YXJhIGZyZWt1ZW5zaSBrZWxhcyBtb2R1cyBkYW4gZnJla3VlbnNpIGtlbGFzIHNldGVsYWhueWEuDQoNCioqYyoqOiAqKlBhbmphbmcga2VsYXMgaW50ZXJ2YWwqKiAoc2VsaXNpaCBhbnRhcmEgYmF0YXMgYXRhcyBkYW4gYmF0YXMgYmF3YWgga2VsYXMpLg0KDQojIyMgTGFuZ2thaC1sYW5na2FoIHBlcmhpdHVuZ2FuOg0KMS4gVGVudHVrYW4ga2VsYXMgbW9kdXMsIHlhaXR1IGtlbGFzIHlhbmcgbWVtaWxpa2kgZnJla3VlbnNpIHRlcnRpbmdnaS4NCg0KMi4gSGl0dW5nIG5pbGFpICoqZOKCgSoqIChzZWxpc2loIGZyZWt1ZW5zaSBrZWxhcyBtb2R1cyBkYW4ga2VsYXMgc2ViZWx1bW55YSkgZGFuICoqZOKCgioqIChzZWxpc2loIGZyZWt1ZW5zaSBrZWxhcyBtb2R1cyBkYW4ga2VsYXMgc2V0ZWxhaG55YSkuDQoNCjMuIE1hc3Vra2FuIG5pbGFpLW5pbGFpIHRlcnNlYnV0IGtlIGRhbGFtIHJ1bXVzIHVudHVrIG1lbmdoaXR1bmcgKiptb2R1cyoqLg0KDQoqKk1hc3Vra2FuIG5pbGFpIGtlIGRhbGFtIHJ1bXVzKio6DQoNClxbDQpcdGV4dHtNb2R1c30gPSA3MCArIFxsZWZ0KCBcZnJhY3soOCAtIDYpfXsoMiBcdGltZXMgOCAtIDYgLSAxKX0gXHJpZ2h0KSBcdGltZXMgMTANClxdDQoNCioqcGVyaGl0dW5nYW4qKjoNCg0KXFsNClx0ZXh0e01vZHVzfSA9IDcwICsgXGxlZnQoIFxmcmFjezJ9eygxNiAtIDYgLSAxKX0gXHJpZ2h0KSBcdGltZXMgMTANClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gNzAgKyBcbGVmdCggXGZyYWN7Mn17OX0gXHJpZ2h0KSBcdGltZXMgMTANClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gNzAgKyAyLjIyDQpcXQ0KXFsNClx0ZXh0e01vZHVzfSBcYXBwcm94IDcyLjIyDQpcXQ0KDQoqKkhhc2lsKio6DQpNb2R1cyB1bnR1ayBkYXRhIGluaSBhZGFsYWggc2VraXRhciAqKjcyLjIyKiouIEluaSBiZXJhcnRpIGJhaHdhIG5pbGFpIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwgZGFsYW0gZGlzdHJpYnVzaSBkYXRhIGluaSBiZXJhZGEgZGkgc2VraXRhciAqKmtlbGFzIDcwIC0gNzkqKiwgZGFuIG1vZHVzbnlhIGFkYWxhaCBzZWtpdGFyICoqNzIuMjIqKi4NCg0KSmlrYSBBbmRhIG1lbWlsaWtpIGRhdGEga2Vsb21wb2sgbGFpbiwgbGFuZ2thaCB5YW5nIHNhbWEgZGFwYXQgZGl0ZXJhcGthbiB1bnR1ayBtZW5naGl0dW5nIG1vZHVzbnlhLg0KDQotLS0NCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KDQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGtlbG9tcG9rIGRlbmdhbiBkYW4gdGFucGEgb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGMocmVwKDQ0LjUsIDMpLCByZXAoNTQuNSwgNiksIHJlcCg2NC41LCA2KSwgcmVwKDc0LjUsIDgpLCByZXAoMTA0LjUsIDEpKSAgIyBEZW5nYW4gb3V0bGllcnMgKG5pbGFpIDEwMC0xMDkpDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGMocmVwKDQ0LjUsIDMpLCByZXAoNTQuNSwgNiksIHJlcCg2NC41LCA2KSwgcmVwKDc0LjUsIDgpKSAgIyBUYW5wYSBvdXRsaWVycw0KDQojIE1lbmdoaXR1bmcgbW9kdXMgdW50dWsga2VkdWEgZGF0YXNldCBzZWNhcmEgbWFudWFsDQptb2R1c19kZW5nYW5fb3V0bGllcnMgPC0gNzIuMjIgICMgRGFyaSBwZXJoaXR1bmdhbiBtYW51YWwNCm1vZHVzX3RhbnBhX291dGxpZXJzIDwtIDcyLjIyICAjIFNhbWEga2FyZW5hIGtlbGFzIGRlbmdhbiBmcmVrdWVuc2kgdGVydGluZ2dpIHRldGFwIHNhbWENCg0KIyBNZW5nZ2FidW5na2FuIGRhdGEga2UgZGFsYW0gc2F0dSBkYXRhIGZyYW1lIHVudHVrIHZpc3VhbGlzYXNpDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gYyhkYXRhX2Rlbmdhbl9vdXRsaWVycywgZGF0YV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLCANCiAgICAgICAgICAgICAgICAgdGltZXMgPSBjKGxlbmd0aChkYXRhX2Rlbmdhbl9vdXRsaWVycyksIGxlbmd0aChkYXRhX3RhbnBhX291dGxpZXJzKSkpDQopDQoNCiMgTWVtYnVhdCBib3hwbG90IG1lbmdndW5ha2FuIFBsb3RseSBkYW4gbWVuYW1iYWhrYW4gYW5vdGFzaSBtb2R1cw0KcGxvdCA8LSBwbG90X2x5KA0KICBkYXRhLCANCiAgeSA9IH5OaWxhaSwgDQogIGNvbG9yID0gfktlbG9tcG9rLCANCiAgdHlwZSA9ICJib3giLCANCiAgYm94cG9pbnRzID0gIm5vbmUiLA0KICBqaXR0ZXIgPSAwLjUsDQogIGJveG1lYW4gPSBGQUxTRSwNCiAgYm94bGluZSA9IGxpc3Qod2lkdGggPSAwKQ0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIkJveHBsb3QgZGVuZ2FuIGRhbiB0YW5wYSBPdXRsaWVycyAoTW9kdXMpIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiLCByYW5nZSA9IGMoNDAsIDExMCkpLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJLZWxvbXBvayIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1vZHVzX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCByb3VuZChtb2R1c19kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLCBheSA9IC00MA0KICAgICAgKSwNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSAiVGFucGEgT3V0bGllcnMiLA0KICAgICAgICB5ID0gbW9kdXNfdGFucGFfb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6Iiwgcm91bmQobW9kdXNfdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLCBheSA9IC00MA0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KDQpgYGANCg0KDQojIFByYWt0aWt1bSAyDQpjb250b2ggc2VkZXJoYW5hIHlhbmcgbWVuZ2d1bmFrYW4gcGVtdXNhdGFuIGRhdGEgZGFsYW0gc3R1ZGkga2FzdXMgc2ViYWdhaSBiZXJpa3V0Og0KDQojIyBCaXNuaXMNCkJlcmlrdXQgYWRhbGFoIGNvbnRvaCAqKmRhdGEga2Vsb21wb2sqKiB5YW5nIGJlcmh1YnVuZ2FuIGRlbmdhbiBiaWRhbmcgYmlzbmlzLCBtaXNhbG55YSBkYWxhbSBrb250ZWtzICoqcGVuZGFwYXRhbiBwZXJ1c2FoYWFuKiogYmVyZGFzYXJrYW4ga2F0ZWdvcmkgb216ZXQgcGVyIGJ1bGFuLg0KDQoqKkRhdGEgS2Vsb21wb2s6KioNCg0KfCBSZW50YW5nIE9temV0IChKdXRhIElEUikgfCBGcmVrdWVuc2kgKEp1bWxhaCBQZXJ1c2FoYWFuKSB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDE5ICAgICAgICAgICAgICAgICAgfCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMjAgLSAyOSAgICAgICAgICAgICAgICAgIHwgNyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDMwIC0gMzkgICAgICAgICAgICAgICAgICB8IDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA0MCAtIDQ5ICAgICAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgNTAgLSA1OSAgICAgICAgICAgICAgICAgIHwgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDYwIC0gNjkgICAgICAgICAgICAgICAgICB8IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KDQoqKlBFTkpFTEFTQU4qKjoNCg0KLSAqKlJlbnRhbmcgT216ZXQqKjogS2F0ZWdvcmkgb216ZXQgYnVsYW5hbiBwZXJ1c2FoYWFuIGRhbGFtIHNhdHVhbiBqdXRhIElEUi4NCg0KLSAqKkZyZWt1ZW5zaSoqOiBKdW1sYWggcGVydXNhaGFhbiB5YW5nIG1lbWlsaWtpIG9temV0IGRhbGFtIHJlbnRhbmcgdGVydGVudHUuDQojIyMjIFZpc3VhbGlzYXNpIGRhbiBwZW5qZWxhc2FuIEJveHBsb3QNCkJlcmlrdXQgbWVydXBha2FuICoqcGVyaGl0dW5nYW4gbW9kdXMqKiwgKiptZWRpYW4qKiwgKiptZWFuKiosIGRhbiAqKmhpc3RvZ3JhbSoqIHVudHVrIGRhdGEga2Vsb21wb2sgb216ZXQgcGVydXNhaGFhbjoNCg0KMS4gKipNb2R1cyoqOg0KDQpVbnR1ayBtZW5naGl0dW5nICoqbW9kdXMqKiBiZXJkYXNhcmthbiBydW11cyB5YW5nIHN1ZGFoIGRpc2VidXRrYW46DQpcWw0KXHRleHR7TW9kdXN9ID0gTCArIFxsZWZ0KFxmcmFje2RfMX17ZF8xICsgZF8yfVxyaWdodCkgXGNkb3QgYw0KXF0NCktldGVyYW5nYW46DQotICoqTCoqIGFkYWxhaCBiYXRhcyBiYXdhaCBrZWxhcyBtb2R1cyAoMzAganV0YSBJRFIgdW50dWsga2VsYXMgMzAtMzkpLg0KDQotICoqZOKCgSoqIGFkYWxhaCBzZWxpc2loIGFudGFyYSBmcmVrdWVuc2kga2VsYXMgbW9kdXMgKDEyKSBkYW4gZnJla3VlbnNpIGtlbGFzIHNlYmVsdW1ueWEgKDcpLg0KDQotICoqZOKCgioqIGFkYWxhaCBzZWxpc2loIGFudGFyYSBmcmVrdWVuc2kga2VsYXMgbW9kdXMgKDEyKSBkYW4gZnJla3VlbnNpIGtlbGFzIHNldGVsYWhueWEgKDUpLg0KDQotICoqYyoqIGFkYWxhaCBwYW5qYW5nIGtlbGFzIGludGVydmFsLCB5YW5nIGRhbGFtIGhhbCBpbmkgYWRhbGFoIDEwIGp1dGEgSURSLg0KDQoqKlBlcmhpdHVuZ2FuIE1vZHVzKio6DQpcWw0KTCA9IDMwLCBccXVhZCBkXzEgPSAxMiAtIDcgPSA1LCBccXVhZCBkXzIgPSAxMiAtIDUgPSA3LCBccXVhZCBjID0gMTANClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gMzAgKyBcbGVmdChcZnJhY3s1fXs1ICsgN31ccmlnaHQpIFxjZG90IDEwDQpcXQ0KXFsNClx0ZXh0e01vZHVzfSA9IDMwICsgXGxlZnQoXGZyYWN7NX17MTJ9XHJpZ2h0KSBcY2RvdCAxMCA9IDMwICsgNC4xNyA9IDM0LjE3IFwsIFx0ZXh0e2p1dGEgSURSfQ0KXF0NCg0KMi4gKipNZWRpYW4qKjoNCg0KVW50dWsgbWVuZ2hpdHVuZyAqKm1lZGlhbioqLCBraXRhIHBlcmx1IG1lbmNhcmkga2VsYXMgbWVkaWFuIHRlcmxlYmloIGRhaHVsdSwgeWFuZyBtZXJ1cGFrYW4ga2VsYXMgeWFuZyBiZXJpc2kgbmlsYWkga3VtdWxhdGlmIHRlbmdhaCAoXCggXGZyYWN7bn17Mn0gXCkpLg0KDQpKdW1sYWggdG90YWwgZnJla3VlbnNpIGFkYWxhaDoNClxbDQpuID0gNCArIDcgKyAxMiArIDUgKyAzICsgMSA9IDMyDQpcXQ0KU2V0ZW5nYWhueWEgYWRhbGFoOg0KXFsNClxmcmFje259ezJ9ID0gXGZyYWN7MzJ9ezJ9ID0gMTYNClxdDQpLZWxhcyB5YW5nIGJlcmlzaSBuaWxhaSBrZS0xNiBhZGFsYWgga2VsYXMgKiozMCAtIDM5IGp1dGEgSURSKiogKGthcmVuYSBqdW1sYWgga3VtdWxhdGlmbnlhIGhpbmdnYSBrZWxhcyBpbmkgYWRhbGFoIDQgKyA3ICsgMTIgPSAyMykuDQoNClVudHVrIG1lbmdoaXR1bmcgbWVkaWFuLCBraXRhIGd1bmFrYW4gcnVtdXM6DQpcWw0KXHRleHR7TWVkaWFufSA9IEwgKyBcbGVmdChcZnJhY3tcZnJhY3tufXsyfSAtIEZ9e2ZfbX1ccmlnaHQpIFxjZG90IGMNClxdDQpLZXRlcmFuZ2FuOg0KDQotICoqTCoqIGFkYWxhaCBiYXRhcyBiYXdhaCBrZWxhcyBtZWRpYW4gKDMwIGp1dGEgSURSKS4NCg0KLSAqKkYqKiBhZGFsYWgganVtbGFoIGZyZWt1ZW5zaSBrdW11bGF0aWYgc2ViZWx1bSBrZWxhcyBtZWRpYW4gKDQgKyA3ID0gMTEpLg0KDQotICoqZuKCmCoqIGFkYWxhaCBmcmVrdWVuc2kga2VsYXMgbWVkaWFuICgxMikuDQoNCi0gKipjKiogYWRhbGFoIHBhbmphbmcga2VsYXMgaW50ZXJ2YWwgKDEwIGp1dGEgSURSKS4NCg0KUGVyaGl0dW5nYW4gTWVkaWFuOg0KDQpcWw0KTCA9IDMwLCBccXVhZCBGID0gMTEsIFxxdWFkIGZfbSA9IDEyLCBccXVhZCBjID0gMTANClxdDQpcWw0KXHRleHR7TWVkaWFufSA9IDMwICsgXGxlZnQoXGZyYWN7MTYgLSAxMX17MTJ9XHJpZ2h0KSBcY2RvdCAxMCA9IDMwICsgXGxlZnQoXGZyYWN7NX17MTJ9XHJpZ2h0KSBcY2RvdCAxMCA9IDMwICsgNC4xNyA9IDM0LjE3IFwsIFx0ZXh0e2p1dGEgSURSfQ0KXF0NCg0KMy4gKipNZWFuKio6DQoNClVudHVrIG1lbmdoaXR1bmcgKiptZWFuKiogKHJhdGEtcmF0YSksIGtpdGEgaGl0dW5nIG1lbmdndW5ha2FuIHJ1bXVzOg0KXFsNClx0ZXh0e01lYW59ID0gXGZyYWN7XHN1bSAoZiBcY2RvdCB4KX17bn0NClxdDQpLZXRlcmFuZ2FuOg0KDQotICoqZioqIGFkYWxhaCBmcmVrdWVuc2kga2VsYXMuDQoNCi0gKip4KiogYWRhbGFoIHRpdGlrIHRlbmdhaCBzZXRpYXAga2VsYXMuDQoNClRpdGlrIHRlbmdhaCAoeCkgdW50dWsgc2V0aWFwIGtlbGFzOg0KDQotIEtlbGFzIDEwIC0gMTk6IFwoIHggPSBcZnJhY3sxMCArIDE5fXsyfSA9IDE0LjUgXCkNCg0KLSBLZWxhcyAyMCAtIDI5OiBcKCB4ID0gXGZyYWN7MjAgKyAyOX17Mn0gPSAyNC41IFwpDQoNCi0gS2VsYXMgMzAgLSAzOTogXCggeCA9IFxmcmFjezMwICsgMzl9ezJ9ID0gMzQuNSBcKQ0KDQotIEtlbGFzIDQwIC0gNDk6IFwoIHggPSBcZnJhY3s0MCArIDQ5fXsyfSA9IDQ0LjUgXCkNCg0KLSBLZWxhcyA1MCAtIDU5OiBcKCB4ID0gXGZyYWN7NTAgKyA1OX17Mn0gPSA1NC41IFwpDQoNCi0gS2VsYXMgNjAgLSA2OTogXCggeCA9IFxmcmFjezYwICsgNjl9ezJ9ID0gNjQuNSBcKQ0KDQpQZXJoaXR1bmdhbiAqKm1lYW4qKjoNClxbDQpcdGV4dHtNZWFufSA9IFxmcmFjeyg0IFxjZG90IDE0LjUpICsgKDcgXGNkb3QgMjQuNSkgKyAoMTIgXGNkb3QgMzQuNSkgKyAoNSBcY2RvdCA0NC41KSArICgzIFxjZG90IDU0LjUpICsgKDEgXGNkb3QgNjQuNSl9ezMyfQ0KXF0NClxbDQpcdGV4dHtNZWFufSA9IFxmcmFjeyg1OCkgKyAoMTcxLjUpICsgKDQxNCkgKyAoMjIyLjUpICsgKDE2My41KSArICg2NC41KX17MzJ9ID0gXGZyYWN7MTA5NH17MzJ9ID0gMzQuMTkgXCwgXHRleHR7anV0YSBJRFJ9DQpcXQ0KDQo0LiAqKkhpc3RvZ3JhbSoqOg0KDQpTZWthcmFuZywga2l0YSBha2FuIG1lbWJ1YXQgKipIaXN0b2dyYW0qKiB5YW5nIG1lbmNha3VwICoqbWVhbioqLCAqKm1lZGlhbioqLCBkYW4gKiptb2R1cyoqIGJlcmRhc2Fya2FuIGRhdGEgeWFuZyB0ZWxhaCBkaWhpdHVuZy4NCg0KQmVyaWt1dCBhZGFsYWggdmlzdWFsaXNhc2kgKipIaXN0b2dyYW0qKjoNCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQoNCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEga2Vsb21wb2sNCmRhdGFfa2Vsb21wb2sgPC0gYyhyZXAoMTQuNSwgNCksIHJlcCgyNC41LCA3KSwgcmVwKDM0LjUsIDEyKSwgcmVwKDQ0LjUsIDUpLCByZXAoNTQuNSwgMyksIHJlcCg2NC41LCAxKSkNCg0KIyBIYXNpbCBwZXJoaXR1bmdhbg0KbWVhbl9kYXRhIDwtIDM0LjE5ICAjIEJlcmRhc2Fya2FuIHBlcmhpdHVuZ2FuDQptZWRpYW5fZGF0YSA8LSAzNC4xNyAgIyBCZXJkYXNhcmthbiBwZXJoaXR1bmdhbg0KbW9kdXNfZGF0YSA8LSAzNC4xNyAgICMgQmVyZGFzYXJrYW4gcGVyaGl0dW5nYW4NCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdA0KZGVuc2l0eV9kYXRhIDwtIGRlbnNpdHkoZGF0YV9rZWxvbXBvaykNCg0KIyBNZW1idWF0IHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBkZW5zaXR5X2RhdGEkeCwNCiAgICB5ID0gZGVuc2l0eV9kYXRhJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIkRlbnNpdHkgUGxvdCIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyB1bnR1ayBtZWFuDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWFuX2RhdGEsIG1lYW5fZGF0YSksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGF0YSR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lYW4iLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIHVudHVrIG1lZGlhbg0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVkaWFuX2RhdGEsIG1lZGlhbl9kYXRhKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kYXRhJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiTWVkaWFuIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjYpJywgZGFzaCA9ICdkb3QnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIHVudHVrIG1vZHVzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtb2R1c19kYXRhLCBtb2R1c19kYXRhKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kYXRhJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiTW9kdXMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjU1LCAxNjUsIDAsIDAuOCknLCBkYXNoID0gJ2xvbmdkYXNoJykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIkRlbnNpdHkgUGxvdCBkZW5nYW4gTWVhbiwgTWVkaWFuLCBkYW4gTW9kdXMiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJPbXpldCAoSnV0YSBJRFIpIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWFuDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVhbl9kYXRhLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGF0YSR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fZGF0YSwgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWRpYW4NCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fZGF0YSwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2RhdGEkeSkgKiAwLjgsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuOiIsIHJvdW5kKG1lZGlhbl9kYXRhLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuNiknLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1vZHVzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbW9kdXNfZGF0YSwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2RhdGEkeSkgKiAwLjcsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6Iiwgcm91bmQobW9kdXNfZGF0YSwgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTYwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgMTY1LCAwLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KDQpgYGANCg0KIyMgS2VzZWhhdGFuDQoNCkJlcmlrdXQgYWRhbGFoIGxhbmdrYWggcGVyaGl0dW5nYW4gKiptZWFuKiosICoqbWVkaWFuKiosIGRhbiAqKm1vZHVzKiosIHNlcnRhIHZpc3VhbGlzYXNpIGRhbGFtIGJlbnR1ayBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YSBrZWxvbXBvayB5YW5nIGJlcmh1YnVuZ2FuIGRlbmdhbiBiaWRhbmcga2VzZWhhdGFuLg0KDQotLS0NCg0KKipEYXRhIEtlbG9tcG9rKioNCg0KfCBSZW50YW5nIFVzaWEgfCBGcmVrdWVuc2kgKEp1bWxhaCBQYXNpZW4pIHwNCnwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IDAgLSA5ICAgICAgICB8IDE1ICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAxMCAtIDE5ICAgICAgfCAxMCAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMjAgLSAyOSAgICAgIHwgMjUgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDMwIC0gMzkgICAgICB8IDMwICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA0MCAtIDQ5ICAgICAgfCAyMCAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgNTAgLSA1OSAgICAgIHwgMTIgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDYwIC0gNjkgICAgICB8IDggICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA3MCAtIDc5ICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICAgIHwNCg0KLS0tDQoNCioqUGVyaGl0dW5nYW4gTWVhbiwgTWVkaWFuLCBkYW4gTW9kdXMqKg0KDQoqKjEuIE1lYW4qKg0KTWVuZ2d1bmFrYW4gcnVtdXM6DQpcWw0KXHRleHR7TWVhbn0gPSBcZnJhY3tcc3VtIChmIFxjZG90IHgpfXtufQ0KXF0NClRpdGlrIHRlbmdhaCAoeCkgdW50dWsgc2V0aWFwIGtlbGFzIGRpaGl0dW5nIHNlYmFnYWk6DQpcWw0KeCA9IFxmcmFje1x0ZXh0e0JhdGFzIEJhd2FoICsgQmF0YXMgQXRhc319ezJ9DQpcXQ0KDQp8IFJlbnRhbmcgVXNpYSB8IFRpdGlrIFRlbmdhaCAoeCkgfCBGcmVrdWVuc2kgKGYpIHwgXCggZiBcY2RvdCB4IFwpIHwNCnwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfA0KfCAwIC0gOSAgICAgICAgfCA0LjUgICAgICAgICAgICAgIHwgMTUgICAgICAgICAgICB8IDY3LjUgICAgICAgICAgICB8DQp8IDEwIC0gMTkgICAgICB8IDE0LjUgICAgICAgICAgICAgfCAxMCAgICAgICAgICAgIHwgMTQ1ICAgICAgICAgICAgIHwNCnwgMjAgLSAyOSAgICAgIHwgMjQuNSAgICAgICAgICAgICB8IDI1ICAgICAgICAgICAgfCA2MTIuNSAgICAgICAgICAgfA0KfCAzMCAtIDM5ICAgICAgfCAzNC41ICAgICAgICAgICAgIHwgMzAgICAgICAgICAgICB8IDEwMzUgICAgICAgICAgICB8DQp8IDQwIC0gNDkgICAgICB8IDQ0LjUgICAgICAgICAgICAgfCAyMCAgICAgICAgICAgIHwgODkwICAgICAgICAgICAgIHwNCnwgNTAgLSA1OSAgICAgIHwgNTQuNSAgICAgICAgICAgICB8IDEyICAgICAgICAgICAgfCA2NTQgICAgICAgICAgICAgfA0KfCA2MCAtIDY5ICAgICAgfCA2NC41ICAgICAgICAgICAgIHwgOCAgICAgICAgICAgICB8IDUxNiAgICAgICAgICAgICB8DQp8IDcwIC0gNzkgICAgICB8IDc0LjUgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgIHwgMzcyLjUgICAgICAgICAgIHwNCg0KVG90YWwgXCggXHN1bSBmID0gMTI1IFwpLCBUb3RhbCBcKCBcc3VtIChmIFxjZG90IHgpID0gNDI5Mi41IFwpDQoNClxbDQpcdGV4dHtNZWFufSA9IFxmcmFjezQyOTIuNX17MTI1fSA9IDM0LjM0DQpcXQ0KDQotLS0NCg0KKioyLiBNZWRpYW4qKg0KTWVuZ2d1bmFrYW4gcnVtdXM6DQpcWw0KXHRleHR7TWVkaWFufSA9IEwgKyBcbGVmdCggXGZyYWN7XGZyYWN7bn17Mn0gLSBGfXtmX219IFxyaWdodCkgXGNkb3QgYw0KXF0NCi0gVG90YWwgcGFzaWVuIChcKCBuIFwpKSA9IDEyNSAgDQotIFwoIFxmcmFje259ezJ9ID0gNjIuNSBcKSAgDQotIEtlbGFzIG1lZGlhbiBhZGFsYWggKiozMCAtIDM5KiosIGthcmVuYSBrdW11bGF0aWYgaGluZ2dhIGtlbGFzIGluaSBtZW5jYXBhaSBsZWJpaCBkYXJpIDYyLjUuICANCiAgLSAqKkwqKiA9IDMwICANCiAgLSAqKkYqKiA9IDUwIChmcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuKSAgDQogIC0gKipm4oKYKiogPSAzMCAoZnJla3VlbnNpIGtlbGFzIG1lZGlhbikgIA0KICAtICoqYyoqID0gMTAgIA0KDQpcWw0KXHRleHR7TWVkaWFufSA9IDMwICsgXGxlZnQoIFxmcmFjezYyLjUgLSA1MH17MzB9IFxyaWdodCkgXGNkb3QgMTAgPSAzMCArIFxsZWZ0KCBcZnJhY3sxMi41fXszMH0gXHJpZ2h0KSBcY2RvdCAxMCA9IDMwICsgNC4xNyA9IDM0LjE3DQpcXQ0KDQotLS0NCg0KKiozLiBNb2R1cyoqDQpNZW5nZ3VuYWthbiBydW11czoNClxbDQpcdGV4dHtNb2R1c30gPSBMICsgXGxlZnQoIFxmcmFje2RfMX17ZF8xICsgZF8yfSBccmlnaHQpIFxjZG90IGMNClxdDQpLZXRlcmFuZ2FuOiAgDQotICoqTCoqID0gMzAgKGJhdGFzIGJhd2FoIGtlbGFzIG1vZHVzKSAgDQotICoqZOKCgSoqID0gZnJla3VlbnNpIGtlbGFzIG1vZHVzIC0gZnJla3VlbnNpIHNlYmVsdW1ueWEgPSBcKCAzMCAtIDI1ID0gNSBcKSAgDQotICoqZOKCgioqID0gZnJla3VlbnNpIGtlbGFzIG1vZHVzIC0gZnJla3VlbnNpIHNldGVsYWhueWEgPSBcKCAzMCAtIDIwID0gMTAgXCkgIA0KLSAqKmMqKiA9IDEwICANCg0KXFsNClx0ZXh0e01vZHVzfSA9IDMwICsgXGxlZnQoIFxmcmFjezV9ezUgKyAxMH0gXHJpZ2h0KSBcY2RvdCAxMCA9IDMwICsgXGxlZnQoIFxmcmFjezV9ezE1fSBccmlnaHQpIFxjZG90IDEwID0gMzAgKyAzLjMzID0gMzMuMzMNClxdDQoNCi0tLQ0KDQoqKkhpc3RvZ3JhbSoqDQoNCkJlcmlrdXQgYWRhbGFoIHZpc3VhbGlzYXNpIGhpc3RvZ3JhbToNCg0KYGBge3IsZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQoNCg0KIyBEYXRhIGtlbG9tcG9rDQpkYXRhX2tlbG9tcG9rIDwtIGMocmVwKDQuNSwgMTUpLCByZXAoMTQuNSwgMTApLCByZXAoMjQuNSwgMjUpLCByZXAoMzQuNSwgMzApLA0KICAgICAgICAgICAgICAgICAgIHJlcCg0NC41LCAyMCksIHJlcCg1NC41LCAxMiksIHJlcCg2NC41LCA4KSwgcmVwKDc0LjUsIDUpKQ0KDQojIE1lbmdoaXR1bmcgbWVhbiwgbWVkaWFuLCBkYW4gbW9kdXMNCm1lYW5fZGF0YSA8LSAzNC4zNA0KbWVkaWFuX2RhdGEgPC0gMzQuMTcNCm1vZHVzX2RhdGEgPC0gMzMuMzMNCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdA0KZGVuc2l0eV9wbG90IDwtIGRlbnNpdHkoZGF0YV9rZWxvbXBvaykNCg0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfcGxvdCR4LA0KICAgIHkgPSB+ZGVuc2l0eV9wbG90JHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIkRlbnNpdHkiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2JsdWUnLCB3aWR0aCA9IDIpDQogICkgJT4lDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWFuX2RhdGEsIG1lYW5fZGF0YSksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfcGxvdCR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lYW4iLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JlZCcsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWRpYW5fZGF0YSwgbWVkaWFuX2RhdGEpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X3Bsb3QkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4iLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2dyZWVuJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1vZHVzX2RhdGEsIG1vZHVzX2RhdGEpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X3Bsb3QkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNb2R1cyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncHVycGxlJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIkRlbnNpdHkgUGxvdCB1bnR1ayBEYXRhIEtlbG9tcG9rIEtlc2VoYXRhbiIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlRpdGlrIFRlbmdhaCAoeCkiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fZGF0YSwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X3Bsb3QkeSkgKiAwLjgsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjoiLCByb3VuZChtZWFuX2RhdGEsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC01MA0KICAgICAgKSwNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fZGF0YSwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X3Bsb3QkeSkgKiAwLjcsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuOiIsIHJvdW5kKG1lZGlhbl9kYXRhLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNTANCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbW9kdXNfZGF0YSwNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X3Bsb3QkeSkgKiAwLjYsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6Iiwgcm91bmQobW9kdXNfZGF0YSwgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTUwDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KYGBgDQoNCiMjIFBlbmRpZGlrYW4NCg0KQmVyaWt1dCBhZGFsYWggY29udG9oIGRhdGEga2Vsb21wb2sgeWFuZyBiZXJodWJ1bmdhbiBkZW5nYW4gYmlkYW5nIHBlbmRpZGlrYW4uIERhdGEgaW5pIG1lbmdnYW1iYXJrYW4ganVtbGFoIHNpc3dhIGJlcmRhc2Fya2FuIG5pbGFpIHVqaWFuIGFraGlyIGRhbGFtIHN1YXR1IGtlbGFzOg0KDQp8ICoqUmVudGFuZyBOaWxhaSoqIHwgKipGcmVrdWVuc2kgKEp1bWxhaCBTaXN3YSkqKiB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IDAgLSA5ICAgICAgICAgICAgIHwgMyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgMTAgLSAxOSAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAyMCAtIDI5ICAgICAgICAgICB8IDEwICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDMwIC0gMzkgICAgICAgICAgIHwgMTUgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgNDAgLSA0OSAgICAgICAgICAgfCAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA1MCAtIDU5ICAgICAgICAgICB8IDI1ICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDYwIC0gNjkgICAgICAgICAgIHwgMzAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgNzAgLSA3OSAgICAgICAgICAgfCAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCA4MCAtIDg5ICAgICAgICAgICB8IDE1ICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDkwIC0gMTAwICAgICAgICAgIHwgNyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCg0KLS0tDQoNCkJlcmlrdXQgcGVyaGl0dW5nYW4gKiptZWFuKiosICoqbWVkaWFuKiosIGRhbiAqKm1vZHVzKiosIHNlcnRhIHBlbWJ1YXRhbiAqKkhpc3RvZ3JhbSoqIGJlcmRhc2Fya2FuIGRhdGEgZGlhdGFzOg0KDQotLS0NCg0KKipQZXJoaXR1bmdhbioqDQoNCjEuICoqVGl0aWsgVGVuZ2FoIEtlbGFzKiogIA0KU2V0aWFwIHJlbnRhbmcgbmlsYWkgZGlrb252ZXJzaSBtZW5qYWRpIHRpdGlrIHRlbmdhaDoNClxbDQpcdGV4dHtUaXRpayBUZW5nYWh9ID0gXGZyYWN7XHRleHR7QmF0YXMgQmF3YWh9ICsgXHRleHR7QmF0YXMgQXRhc319ezJ9DQpcXQ0KSGFzaWxueWE6DQoNCnwgKipSZW50YW5nIE5pbGFpKiogfCAqKkZyZWt1ZW5zaSAoZikqKiB8ICoqVGl0aWsgVGVuZ2FoICh4KSoqIHwgKipmICogeCoqIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfA0KfCAwIC0gOSAgICAgICAgICAgICB8IDMgICAgICAgICAgICAgICAgIHwgNC41ICAgICAgICAgICAgICAgICAgfCAxMy41ICAgICAgfA0KfCAxMCAtIDE5ICAgICAgICAgICB8IDUgICAgICAgICAgICAgICAgIHwgMTQuNSAgICAgICAgICAgICAgICAgfCA3Mi41ICAgICAgfA0KfCAyMCAtIDI5ICAgICAgICAgICB8IDEwICAgICAgICAgICAgICAgIHwgMjQuNSAgICAgICAgICAgICAgICAgfCAyNDUgICAgICAgfA0KfCAzMCAtIDM5ICAgICAgICAgICB8IDE1ICAgICAgICAgICAgICAgIHwgMzQuNSAgICAgICAgICAgICAgICAgfCA1MTcuNSAgICAgfA0KfCA0MCAtIDQ5ICAgICAgICAgICB8IDIwICAgICAgICAgICAgICAgIHwgNDQuNSAgICAgICAgICAgICAgICAgfCA4OTAgICAgICAgfA0KfCA1MCAtIDU5ICAgICAgICAgICB8IDI1ICAgICAgICAgICAgICAgIHwgNTQuNSAgICAgICAgICAgICAgICAgfCAxMzYyLjUgICAgfA0KfCA2MCAtIDY5ICAgICAgICAgICB8IDMwICAgICAgICAgICAgICAgIHwgNjQuNSAgICAgICAgICAgICAgICAgfCAxOTM1ICAgICAgfA0KfCA3MCAtIDc5ICAgICAgICAgICB8IDI1ICAgICAgICAgICAgICAgIHwgNzQuNSAgICAgICAgICAgICAgICAgfCAxODYyLjUgICAgfA0KfCA4MCAtIDg5ICAgICAgICAgICB8IDE1ICAgICAgICAgICAgICAgIHwgODQuNSAgICAgICAgICAgICAgICAgfCAxMjY3LjUgICAgfA0KfCA5MCAtIDEwMCAgICAgICAgICB8IDcgICAgICAgICAgICAgICAgIHwgOTUgICAgICAgICAgICAgICAgICAgfCA2NjUgICAgICAgfA0KDQotLS0NCg0KMi4gKipNZWFuIChSYXRhLXJhdGEpKiogIA0KXFsNClx0ZXh0e01lYW59ID0gXGZyYWN7XHN1bSAoZiBcY2RvdCB4KX17XHN1bSBmfQ0KXF0NClxbDQpcdGV4dHtNZWFufSA9IFxmcmFjezg5MzF9ezE1NX0gXGFwcHJveCA1Ny42Mg0KXF0NCg0KLS0tDQoNCjMuICoqTWVkaWFuKiogIA0KTWVkaWFuIGRpaGl0dW5nIGRhcmkga2VsYXMgeWFuZyBtZW5nYW5kdW5nIG5pbGFpIGt1bXVsYXRpZiB0ZW5nYWggKFwoXGZyYWN7bn17Mn1cKSk6DQpcWw0KXGZyYWN7MTU1fXsyfSA9IDc3LjUNClxdDQpOaWxhaSBpbmkgYmVyYWRhIGRhbGFtIGtlbGFzICoqNjAgLSA2OSoqIChrYXJlbmEga3VtdWxhdGlmIGhpbmdnYSBrZWxhcyBpbmkgYWRhbGFoIDc4KS4gIA0KUnVtdXMgbWVkaWFuOg0KXFsNClx0ZXh0e01lZGlhbn0gPSBMICsgXGxlZnQoXGZyYWN7XGZyYWN7bn17Mn0gLSBGfXtmX219XHJpZ2h0KSBcY2RvdCBjDQpcXQ0KS2V0ZXJhbmdhbjoNCi0gXChMID0gNjBcKSwgYmF0YXMgYmF3YWgga2VsYXMgbWVkaWFuLg0KLSBcKEYgPSA1M1wpLCBrdW11bGF0aWYgc2ViZWx1bSBrZWxhcyBtZWRpYW4uDQotIFwoZl9tID0gMzBcKSwgZnJla3VlbnNpIGtlbGFzIG1lZGlhbi4NCi0gXChjID0gMTBcKSwgcGFuamFuZyBpbnRlcnZhbCBrZWxhcy4NCg0KXFsNClx0ZXh0e01lZGlhbn0gPSA2MCArIFxsZWZ0KFxmcmFjezc3LjUgLSA1M317MzB9XHJpZ2h0KSBcY2RvdCAxMCA9IDYwICsgXGxlZnQoXGZyYWN7MjQuNX17MzB9XHJpZ2h0KSBcY2RvdCAxMCBcYXBwcm94IDYwICsgOC4xNyA9IDY4LjE3DQpcXQ0KDQotLS0NCg0KNC4gKipNb2R1cyoqICANCktlbGFzIG1vZHVzIGFkYWxhaCBrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcnRpbmdnaSwgeWFpdHUgKio2MCAtIDY5KiouICANClJ1bXVzIG1vZHVzOg0KXFsNClx0ZXh0e01vZHVzfSA9IEwgKyBcbGVmdChcZnJhY3tkXzF9e2RfMSArIGRfMn1ccmlnaHQpIFxjZG90IGMNClxdDQpLZXRlcmFuZ2FuOg0KLSBcKEwgPSA2MFwpLCBiYXRhcyBiYXdhaCBrZWxhcyBtb2R1cy4NCi0gXChkXzEgPSAzMCAtIDI1ID0gNVwpLg0KLSBcKGRfMiA9IDMwIC0gMjUgPSA1XCkuDQotIFwoYyA9IDEwXCkuDQoNClxbDQpcdGV4dHtNb2R1c30gPSA2MCArIFxsZWZ0KFxmcmFjezV9ezUgKyA1fVxyaWdodCkgXGNkb3QgMTAgPSA2MCArIDUgPSA2NQ0KXF0NCg0KLS0tDQoNCioqSGlzdG9ncmFtKioNCg0KQmVyaWt1dCBhZGFsYWgga29kZSB1bnR1ayBtZW1idWF0IGRlbnNpdHkgcGxvdCBiZXNlcnRhIGFub3Rhc2kgKiptZWFuKiosICoqbWVkaWFuKiosIGRhbiAqKm1vZHVzKio6DQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZz1GQUxTRSxtZXNzYWdlPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YSBrZWxvbXBvaw0KZGF0YV9wZW5kaWRpa2FuIDwtIGMocmVwKDQuNSwgMyksIHJlcCgxNC41LCA1KSwgcmVwKDI0LjUsIDEwKSwgcmVwKDM0LjUsIDE1KSwgcmVwKDQ0LjUsIDIwKSwgDQogICAgICAgICAgICAgICAgICAgICByZXAoNTQuNSwgMjUpLCByZXAoNjQuNSwgMzApLCByZXAoNzQuNSwgMjUpLCByZXAoODQuNSwgMTUpLCByZXAoOTUsIDcpKQ0KDQojIE1lbmdoaXR1bmcgbmlsYWkgbWVhbiwgbWVkaWFuLCBkYW4gbW9kdXMNCm1lYW5fcGVuZGlkaWthbiA8LSA1Ny42Mg0KbWVkaWFuX3BlbmRpZGlrYW4gPC0gNjguMTcNCm1vZHVzX3BlbmRpZGlrYW4gPC0gNjUNCg0KIyBEZW5zaXR5IHBsb3QNCmRlbnNpdHlfcGxvdCA8LSBkZW5zaXR5KGRhdGFfcGVuZGlkaWthbikNCg0KIyBNZW1idWF0IHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgYWRkX2xpbmVzKA0KICAgIHggPSBkZW5zaXR5X3Bsb3QkeCwNCiAgICB5ID0gZGVuc2l0eV9wbG90JHksDQogICAgbmFtZSA9ICJEZW5zaXR5IiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICJibHVlIiwgd2lkdGggPSAyKQ0KICApICU+JQ0KICBhZGRfbGluZXMoDQogICAgeCA9IGMobWVhbl9wZW5kaWRpa2FuLCBtZWFuX3BlbmRpZGlrYW4pLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X3Bsb3QkeSkpLA0KICAgIG5hbWUgPSAiTWVhbiIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JlZW4iLCBkYXNoID0gImRhc2giKQ0KICApICU+JQ0KICBhZGRfbGluZXMoDQogICAgeCA9IGMobWVkaWFuX3BlbmRpZGlrYW4sIG1lZGlhbl9wZW5kaWRpa2FuKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9wbG90JHkpKSwNCiAgICBuYW1lID0gIk1lZGlhbiIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAib3JhbmdlIiwgZGFzaCA9ICJkYXNoIikNCiAgKSAlPiUNCiAgYWRkX2xpbmVzKA0KICAgIHggPSBjKG1vZHVzX3BlbmRpZGlrYW4sIG1vZHVzX3BlbmRpZGlrYW4pLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X3Bsb3QkeSkpLA0KICAgIG5hbWUgPSAiTW9kdXMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gInJlZCIsIGRhc2ggPSAiZGFzaCIpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJEZW5zaXR5IFBsb3QgLSBEYXRhIFBlbmRpZGlrYW4iLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSBVamlhbiIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KHggPSBtZWFuX3BlbmRpZGlrYW4sIHkgPSBtYXgoZGVuc2l0eV9wbG90JHkpLCB0ZXh0ID0gcGFzdGUoIk1lYW46Iiwgcm91bmQobWVhbl9wZW5kaWRpa2FuLCAyKSksIHNob3dhcnJvdyA9IFRSVUUsIGF4ID0gNDApLA0KICAgICAgbGlzdCh4ID0gbWVkaWFuX3BlbmRpZGlrYW4sIHkgPSBtYXgoZGVuc2l0eV9wbG90JHkpLCB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW5fcGVuZGlkaWthbiwgMikpLCBzaG93YXJyb3cgPSBUUlVFLCBheCA9IDQwKSwNCiAgICAgIGxpc3QoeCA9IG1vZHVzX3BlbmRpZGlrYW4sIHkgPSBtYXgoZGVuc2l0eV9wbG90JHkpLCB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIHJvdW5kKG1vZHVzX3BlbmRpZGlrYW4sIDIpKSwgc2hvd2Fycm93ID0gVFJVRSwgYXggPSA0MCkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQpgYGANCg0K