Code
Aljabar Linear
Carol Dupino Pereira
NIM: 52250051
Mahasiswa Sains Data ITSB
R Programming
Data Science
Statistics
. IMPLEMENTASI DAN
APLIKASI KONSEP ALJABAR LINEAR
Sistem Persamaan
Linear (SPL) & Matriks
Rumus Utama: \(A\mathbf{x} =
\mathbf{b}\) (Di mana \(A\)
adalah matriks koefisien, \(\mathbf{x}\) vektor variabel, dan \(\mathbf{b}\) vektor konstanta)
Aplikasi: Analisis Arus Jaringan pada Teknik Elektro (Hukum
Kirchhoff).
Penjelasan Matematis: Digunakan untuk mencari nilai variabel yang
tidak diketahui dalam sistem yang saling terhubung.
Contoh Kasus: Menghitung arus listrik pada dua loop:
\(5I_1 + 2I_2 = 10\) \(2I_1 + 10I_2 = 20\)
Bentuk Matriks:
\(\begin{bmatrix} 5 & 2 \\ 2 & 10
\end{bmatrix} \begin{bmatrix} I_1 \\ I_2 \end{bmatrix} = \begin{bmatrix}
10 \\ 20 \end{bmatrix}\) .
Penyelesaian menggunakan operasi baris elementer atau invers matriks
\(\mathbf{x} = A^{-1}\mathbf{b}\) .
Penjelasan
Visualisasi 3D:
Dua Bidang (Surfaces): Dalam grafik 3D ini, setiap persamaan
linear direpresentasikan sebagai sebuah bidang miring.
Perpotongan Bidang: Solusi dari SPL adalah titik di mana kedua
bidang tersebut saling berpotongan tepat di ketinggian \(Z = 0\) .
Titik Hitam (Solusi): Saya telah menambahkan marker pada
koordinat \((\frac{5}{3},
\frac{5}{3})\) atau sekitar \((1.67,
1.67)\) . Di titik inilah kedua sistem mencapai kesetimbangan
(nol).
Determinan
Matriks
Rumus Utama: Untuk matriks \(2 \times
2\) , \(\det(A) = ad -
bc\) .
Aplikasi: Perubahan variabel dalam Kalkulus (Matriks
Jacobian).
Penjelasan Matematis: Determinan memberikan informasi tentang
faktor skala perubahan luas atau volume dari sebuah
transformasi.
Contoh Kasus: Transformasi koordinat Kartesius ke Polar (\(x = r \cos \theta, y = r \sin
\theta\) ).
Matriks Jacobian (\(J\) ): \(\begin{bmatrix} \cos \theta & -r \sin \theta
\\ \sin \theta & r \cos \theta \end{bmatrix}\) .
Nilai \(\det(J) = r\) . Oleh karena
itu, elemen luas \(dA = dx\,dy\)
menjadi \(r\,dr\,d\theta\) .
Penjelasan
Visualisasi 3D:
Saat Anda memutar grafik di atas, Anda akan melihat beberapa poin
penting terkait \(\det(J) = r\) :
Grid yang Memuai: Perhatikan bahwa di dekat pusat (\(r\) kecil), “kotak-kotak” grid sangat
rapat. Semakin jauh dari pusat (\(r\)
besar), luas setiap segmen grid semakin besar secara linear. Inilah
alasan mengapa elemen luasnya adalah \(r \, dr
\, d\theta\) .
Peran \(r\) sebagai Faktor
Skala: Jika \(r = 0\) , maka luasnya nol
(titik pusat). Semakin besar \(r\) ,
semakin besar kontribusi luasnya terhadap integral. Secara geometris,
determinan Jacobian memberitahu kita seberapa besar transformasi
tersebut “meregang” atau “menyusutkan” unit area. Dalam kasus
polar:
\[dA = |J| \, dr \, d\theta = r \, dr \,
d\theta\] ## Ruang Vektor \(\mathbb{R}^n\)
Rumus Utama: Kombinasi Linear \(\mathbf{v} = c_1\mathbf{v}_1 + c_2\mathbf{v}_2 +
\dots + c_n\mathbf{v}_n\) .
Aplikasi: Pemrosesan Warna Digital (Ruang Warna RGB).
Penjelasan Matematis: Setiap titik dalam ruang \(\mathbb{R}^n\) merepresentasikan satu
entitas data spesifik.
Contoh Kasus: Warna oranye dalam komputer disimpan sebagai vektor
\(\mathbf{v} = [255, 165,
0]\) .
Ini adalah kombinasi linear dari basis standar \(\mathbb{R}^3\) : \(255\mathbf{e}_1 + 165\mathbf{e}_2 +
0\mathbf{e}_3\) .
Penjelasan
Visualisasi 3D:
warna oranye tersebut adalah vektor \(\mathbf{v}\) yang merupakan hasil kombinasi
linear dari basis standar \(\mathbb{R}^3\) , di mana:
\(\mathbf{e}_1 = [1, 0, 0]\)
(Komponen Merah Murni)
\(\mathbf{e}_2 = [0, 1, 0]\)
(Komponen Hijau Murni)
\(\mathbf{e}_3 = [0, 0, 1]\)
(Komponen Biru Murni)
Maka:
\[\mathbf{v} = 255 \begin{bmatrix} 1 \\ 0
\\ 0 \end{bmatrix} + 165 \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} + 0
\begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix} = \begin{bmatrix} 255 \\ 165
\\ 0 \end{bmatrix}\] Menariknya, dalam komputer grafis, kita
sering mengubah basis warna (Transformasi Linear). Contohnya dari RGB ke
Grayscale (skala abu-abu).
Misalkan kita ingin mengubah warna menjadi grayscale menggunakan
bobot luminansi. Transformasi ini adalah perkalian dot product (atau
perkalian matriks):
\[Y = 0.299R + 0.587G +
0.114B\]
Secara aljabar linear, ini adalah proyeksi dari ruang \(\mathbb{R}^3\) ke \(\mathbb{R}^1\) (garis skalar).
Mengapa ini penting
Kompresi Gambar: Teknik seperti JPEG menggunakan perubahan basis
dari RGB ke YCbCr (Luminansi dan Krominansi) untuk membuang data yang
tidak terlihat oleh mata manusia.
Filter Foto: Filter pada aplikasi seperti Instagram pada dasarnya
adalah matriks transformasi yang dikalikan ke setiap vektor warna pada
piksel gambar.
Ruang Vektor Secara
Umum
Rumus Utama: Aksioma Ruang Vektor (Penjumlahan dan Perkalian
Skalar pada himpunan objek seperti fungsi atau polinomial).
Aplikasi: Teori Persamaan Diferensial Linear.
Penjelasan Matematis: Himpunan semua solusi dari persamaan
diferensial homogen membentuk subruang vektor.
Contoh Kasus: Pada persamaan \(y'' + y = 0\) .
Karena solusinya adalah \(\sin(x)\)
dan \(\cos(x)\) , maka setiap kombinasi
linear \(y = A\sin(x) + B\cos(x)\) juga
merupakan solusi valid.
Penjelasan
Visualisasi 3D:
bagaimana perubahan skalar \(A\) dan
\(B\) menghasilkan kurva solusi yang
berbeda namun tetap memenuhi karakteristik persamaan diferensial yang
sama.
Cara yang lebih “aljabar linear” untuk melihat ini adalah melalui
Ruang Fase. Jika kita definisikan \(y_1 =
y\) dan \(y_2 = y'\) , maka
sistemnya menjadi:
\[\begin{bmatrix} y_1' \\ y_2'
\end{bmatrix} = \begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix}
\begin{bmatrix} y_1 \\ y_2 \end{bmatrix}\]
Matriks di atas memiliki eigenvalues imajiner murni (\(\pm i\) ), yang secara geometris berarti
rotasi. Inilah mengapa solusinya berbentuk lingkaran atau elips dalam
ruang fase, mencerminkan sifat osilasi dari sinus dan kosinus.
Penjelasan Geometris dalam 3D
Bidang Datar (Linearity): Perhatikan bahwa permukaan yang
dihasilkan oleh add_surface di atas adalah sebuah bidang datar miring.
Ini secara visual membuktikan sifat linearitas. Karena \(y\) adalah kombinasi linear dari \(A\) dan \(B\) , maka perubahan pada \(A\) atau \(B\) akan mengakibatkan perubahan
proporsional pada nilai \(y\) .
Ruang Solusi: Setiap titik \((A,
B)\) pada bidang horizontal tersebut mewakili satu solusi
spesifik dari persamaan diferensial. Jika kita menggeser titik di bidang
tersebut, kita sebenarnya sedang memilih “campuran” yang berbeda antara
fungsi sinus dan kosinus.
Visualisasi
Alternatif: Evolusi Waktu (3D Path)
Jika ingin melihat bagaimana solusi ini berosilasi seiring waktu
(\(x\) ) dalam bentuk spiral (ruang fase
yang ditarik secara vertikal), kita bisa menggunakan add_paths:
Dalam bahasa aljabar linear, kita katakan bahwa operator diferensial
\(L = \frac{d^2}{dx^2} + I\) memiliki
Kernel (ruang nol) yang direntang (spanned) oleh \(\{\sin x, \cos x\}\) . Visualisasi 3D ini
membantu kita melihat bahwa seluruh “permukaan” solusi adalah hasil
rentangan dari dua vektor basis tersebut.
Nilai dan Vektor
Eigen
Rumus Utama: \(A\mathbf{v} =
\lambda\mathbf{v}\) atau \(\det(A -
\lambda I) = 0\) .
Aplikasi: Analisis Frekuensi Alami dan Stabilitas
Struktur.
Penjelasan Matematis: Nilai eigen (\(\lambda\) ) sering merepresentasikan
karakteristik fisik sistem (seperti frekuensi), dan vektor eigen (\(\mathbf{v}\) ) merepresentasikan bentuk atau
arah getarannya.
Contoh Kasus: Matriks kekakuan jembatan \(K = \begin{bmatrix} 2 & -1 \\ -1 & 2
\end{bmatrix}\) .
Akar karakteristik memberikan \(\lambda_1 =
3\) dan \(\lambda_2 = 1\) .
Frekuensi alami struktur didapat dari \(\omega = \sqrt{\lambda}\) .
Interpretasi
Geometris 3D
Bentuk Mangkuk (Paraboloid): Permukaan ini menunjukkan bahwa
titik \((0,0)\) adalah posisi setimbang
stabil (energi minimum).
Kelengkungan (Curvature): Jika Anda perhatikan, permukaan ini
lebih “curam” di satu arah dan lebih “landai” di arah lain.
Arah yang paling curam berhubungan dengan \(\lambda_1 = 3\) (mode kaku).
Arah yang paling landai berhubungan dengan \(\lambda_2 = 1\) (mode fleksibel).
Elips Kontur: Jika kita memotong permukaan ini secara horizontal,
kita akan mendapatkan elips. Sumbu utama elips tersebut adalah arah dari
Vektor Eigen.
ini penting bagi Insinyur:
Jika frekuensi beban luar (seperti angin atau langkah kaki orang)
sama dengan salah satu frekuensi alami (\(\omega = 1\) atau \(1.73\) ), maka akan terjadi Resonansi yang
bisa meruntuhkan jembatan. Inilah mengapa menghitung nilai eigen dari
matriks kekakuan adalah langkah wajib dalam desain jembatan.
Ruang Hasil Kali
Dalam (Inner Product Space)
Rumus Utama: \(\langle \mathbf{f},
\mathbf{g} \rangle = \int_{a}^{b} f(x)g(x) \, dx\) .
Aplikasi: Pemrosesan Sinyal (Deret Fourier).
Penjelasan Matematis: Digunakan untuk menentukan seberapa mirip dua
fungsi (korelasi) melalui proyeksi ortogonal.
Contoh Kasus: Mengambil frekuensi tertentu dari suara mentah \(f(x)\) dengan memproyeksikannya ke basis
sinus/kosinus:\(a_n = \frac{1}{\pi}
\int_{-\pi}^{\pi} f(x) \cos(nx) \, dx\) .
Interpretasi
Geometris 3D
setiap garis pada sumbu \(n\)
menunjukkan seberapa kuat sinyal asli beresonansi dengan frekuensi
tersebut. Jika garisnya sangat berosilasi menjauh dari nol, berarti
frekuensi tersebut dominan dalam suara mentah kita.
Diagonalisasi &
Bentuk Kuadratik
Rumus Utama: \(Q(x) = \mathbf{x}^T A
\mathbf{x}\) .
Aplikasi: Klasifikasi Penampang Kerucut (Astronomi/Desain
Antena).
Penjelasan Matematis: Diagonalisasi digunakan untuk
menyederhanakan persamaan kuadrat rumit dengan menghilangkan suku silang
(\(xy\) ).
Contoh Kasus: Persamaan \(5x^2 + 8xy +
5y^2 = 9\) .
Melalui transformasi koordinat (diagonalisasi), persamaan berubah
menjadi \(9x'^2 + 1y'^2 =
9\) .
Bentuk ini secara matematis dikenali sebagai Elips.
Interpretasi
Geometris 3D
Kelonjongan Mangkuk: Perhatikan bahwa mangkuk tersebut tidak
simetris sempurna secara radial. Ia lebih “tajam” ke satu arah dan lebih
“lebar” ke arah lain. Arah-arah utama ini ditentukan oleh Vektor
Eigen.
Efek Diagonalisasi: Diagonalisasi pada dasarnya adalah memutar
kamera Anda atau memutar grafik tersebut sehingga sumbu utamanya sejajar
dengan sumbu \(X\) dan \(Y\) .
Nilai Eigen sebagai Skala: * \(\lambda
= 9\) (sangat curam) membuat sumbu elips menjadi pendek (\(1/\sqrt{9} = 1/3\) ).\(\lambda = 1\) (kurang curam) membuat sumbu
elips menjadi panjang (\(1/\sqrt{1} =
1\) ).
RUJUKAN:
Anton, H., & Rorres, C. (2013). Elementary Linear Algebra:
Applications Version. John Wiley & Sons.
Kreyzig, E. (2011). Advanced Engineering Mathematics. John Wiley
& Sons.Lay, D. C. (2012). Linear Algebra and Its Applications.
Pearson.
LS0tDQp0aXRsZTogIkFsamFiYXIgTGluZWFyIiAgICAgICAgICAgICMgTWFpbiB0aXRsZSBvZiB0aGUgZG9jdW1lbnQNCmF1dGhvcjogIkNhcm9sIER1cGlubyBQZXJlaXJhIiAgICAgICMgUmVwbGFjZSB3aXRoIHlvdXIgZnVsbCBuYW1lDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIiAjIEF1dG8gZGlzcGxheXMgdGhlIGN1cnJlbnQgZGF0ZQ0Kb3V0cHV0OiAgICAgICAgICAgICAgICAgICAgICAgICAjIE91dHB1dCBzZWN0aW9uIGRlZmluZXMgdGhlIGZvcm1hdCBhbmQgbGF5b3V0IA0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgICAgICAgIyBFbWJlZHMgYWxsIHJlc291cmNlcyAoQ1NTLCBKUywgaW1hZ2VzKSANCiAgICB0aHVtYm5haWxzOiB0cnVlICAgICAgICAgICAgIyBEaXNwbGF5cyBpbWFnZSB0aHVtYm5haWxzIGluIHRoZSBkb2MNCiAgICBsaWdodGJveDogdHJ1ZSAgICAgICAgICAgICAgIyBFbmFibGVzIGNsaWNrIHRvIGVubGFyZ2UgaW1hZ2VzDQogICAgZ2FsbGVyeTogdHJ1ZSAgICAgICAgICAgICAgICMgR3JvdXBzIGltYWdlcyBpbnRvIGFuIGludGVyYWN0aXZlIGdhbGxlcnkNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUgICAgICAgIyBBdXRvbWF0aWNhbGx5IG51bWJlcnMgYWxsIHNlY3Rpb25zDQogICAgbGliX2RpcjogbGlicyAgICAgICAgICAgICAgICMgRGlyZWN0b3J5IHdoZXJlIEphdmFTY3JpcHQvQ1NTIGxpYnJhcmllcw0KICAgIGRmX3ByaW50OiAicGFnZWQiICAgICAgICAgICAjIERpc3BsYXlzIGRhdGEgZnJhbWVzIGFzIGludGVyYWN0aXZlIHBhZ2VkIA0KICAgIGNvZGVfZm9sZGluZzogInNob3ciICAgICAgICAjIEFsbG93cyBmb2xkaW5nL3VuZm9sZGluZyBSIGNvZGUgYmxvY2tzIA0KICAgIGNvZGVfZG93bmxvYWQ6IHllcyAgICAgICAgICAjIEFkZHMgYSBidXR0b24gdG8gZG93bmxvYWQgYWxsIFIgY29kZQ0KICAgIGNzczogImFhYWEuY3NzIg0KLS0tDQoNCg0KYGBge3IgcHJvZmlsZSwgZWNobz1GQUxTRX0NCmxpYnJhcnkoaHRtbHRvb2xzKQ0KDQpIVE1MKCcNCjxkaXYgc3R5bGU9IndpZHRoOiA0MDBweDsgaGVpZ2h0OiAyNTBweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2ZmZmZmZiAwJSwgI2YwZjBmMCAxMDAlKTsgYm9yZGVyOiAycHggc29saWQgIzJjM2U1MDsgYm9yZGVyLXJhZGl1czogMTVweDsgYm94LXNoYWRvdzogMCA4cHggMjBweCByZ2JhKDAsMCwwLDAuMTUpOyBwYWRkaW5nOiAyMHB4OyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDIwcHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsgbWFyZ2luOiAyMHB4IGF1dG87IG92ZXJmbG93OiBoaWRkZW47Ij4NCiAgPGRpdiBzdHlsZT0iZmxleDogMTsgb3ZlcmZsb3c6IGhpZGRlbjsiPg0KICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICNlY2YwZjE7IGJvcmRlcjogMXB4IHNvbGlkICNiZGMzYzc7IGJvcmRlci1yYWRpdXM6IDhweDsgcGFkZGluZzogOHB4OyBtYXJnaW4tYm90dG9tOiAxMHB4OyI+DQogICAgICA8aDEgc3R5bGU9ImNvbG9yOiAjMzQ0OTVlOyBmb250LXNpemU6IDE4cHg7IG1hcmdpbjogMDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsiPkNhcm9sIER1cGlubyBQZXJlaXJhPC9oMT4NCiAgICAgIDxoMiBzdHlsZT0iY29sb3I6ICMzNDQ5NWU7IGZvbnQtc2l6ZTogMThweDsgbWFyZ2luOiAwOyBmb250LXdlaWdodDogbm9ybWFsOyI+TklNOiA1MjI1MDA1MTwvaDI+DQogICAgPC9kaXY+DQogICAgPHAgc3R5bGU9ImNvbG9yOiAjN2Y4YzhkOyBmb250LXNpemU6IDEycHg7IG1hcmdpbjogMCAwIDE1cHggMDsiPk1haGFzaXN3YSBTYWlucyBEYXRhIElUU0I8L3A+DQogICAgDQogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDhweDsiPg0KICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6ICMzNDk4ZGI7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogNHB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGZvbnQtc2l6ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5SIFByb2dyYW1taW5nPC9zcGFuPg0KICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6ICNlNzRjM2M7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogNHB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGZvbnQtc2l6ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5EYXRhIFNjaWVuY2U8L3NwYW4+DQogICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZDogIzJlY2M3MTsgY29sb3I6IHdoaXRlOyBwYWRkaW5nOiA0cHggMTBweDsgYm9yZGVyLXJhZGl1czogMTVweDsgZm9udC1zaXplOiAxMHB4OyBmb250LXdlaWdodDogYm9sZDsiPlN0YXRpc3RpY3M8L3NwYW4+DQogICAgPC9kaXY+DQogIDwvZGl2Pg0KPC9kaXY+DQonKQ0KYGBgDQojIC4gSU1QTEVNRU5UQVNJIERBTiBBUExJS0FTSSBLT05TRVAgQUxKQUJBUiBMSU5FQVIgDQoNCiMjICBTaXN0ZW0gUGVyc2FtYWFuIExpbmVhciAoU1BMKSAmIE1hdHJpa3MNCg0KLSBSdW11cyBVdGFtYTogJEFcbWF0aGJme3h9ID0gXG1hdGhiZntifSQoRGkgbWFuYSAkQSQgYWRhbGFoIG1hdHJpa3Mga29lZmlzaWVuLCAkXG1hdGhiZnt4fSQgdmVrdG9yIHZhcmlhYmVsLCBkYW4gJFxtYXRoYmZ7Yn0kIHZla3RvciBrb25zdGFudGEpDQoNCi0gQXBsaWthc2k6IEFuYWxpc2lzIEFydXMgSmFyaW5nYW4gcGFkYSBUZWtuaWsgRWxla3RybyAoSHVrdW0gS2lyY2hob2ZmKS4NCg0KLSBQZW5qZWxhc2FuIE1hdGVtYXRpczogRGlndW5ha2FuIHVudHVrIG1lbmNhcmkgbmlsYWkgdmFyaWFiZWwgeWFuZyB0aWRhayBkaWtldGFodWkgZGFsYW0gc2lzdGVtIHlhbmcgc2FsaW5nIHRlcmh1YnVuZy4NCg0KLSBDb250b2ggS2FzdXM6IE1lbmdoaXR1bmcgYXJ1cyBsaXN0cmlrIHBhZGEgZHVhIGxvb3A6DQoNCiQ1SV8xICsgMklfMiA9IDEwJCQySV8xICsgMTBJXzIgPSAyMCQNCg0KQmVudHVrIE1hdHJpa3M6DQoNCiRcYmVnaW57Ym1hdHJpeH0gNSAmIDIgXFwgMiAmIDEwIFxlbmR7Ym1hdHJpeH0gXGJlZ2lue2JtYXRyaXh9IElfMSBcXCBJXzIgXGVuZHtibWF0cml4fSA9IFxiZWdpbntibWF0cml4fSAxMCBcXCAyMCBcZW5ke2JtYXRyaXh9JC4NCg0KUGVueWVsZXNhaWFuIG1lbmdndW5ha2FuIG9wZXJhc2kgYmFyaXMgZWxlbWVudGVyIGF0YXUgaW52ZXJzIG1hdHJpa3MgJFxtYXRoYmZ7eH0gPSBBXnstMX1cbWF0aGJme2J9JC4NCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQojIEluc3RhbGwgcGxvdGx5IGppa2EgYmVsdW0gYWRhOiBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KDQojIDEuIFBlcnNpYXBhbiBEYXRhDQojIEtpdGEgYnVhdCBncmlkIG5pbGFpIHVudHVrIEkxIGRhbiBJMg0KaTFfdmVjIDwtIHNlcSgwLCAzLCBsZW5ndGgub3V0ID0gNTApDQppMl92ZWMgPC0gc2VxKDAsIDMsIGxlbmd0aC5vdXQgPSA1MCkNCmdyaWQgPC0gZXhwYW5kLmdyaWQoSTEgPSBpMV92ZWMsIEkyID0gaTJfdmVjKQ0KDQojIEtpdGEgZGVmaW5pc2lrYW4gZnVuZ3NpIGYoSTEsIEkyKSA9IDAgdW50dWsgbWFzaW5nLW1hc2luZyBwZXJzYW1hYW4NCiMgUGVyc2FtYWFuIDE6IDVJMSArIDJJMiAtIDEwID0gWjENCiMgUGVyc2FtYWFuIDI6IDJJMSArIDEwSTIgLSAyMCA9IFoyDQpncmlkJFoxIDwtIDUqZ3JpZCRJMSArIDIqZ3JpZCRJMiAtIDEwDQpncmlkJFoyIDwtIDIqZ3JpZCRJMSArIDEwKmdyaWQkSTIgLSAyMA0KDQojIFViYWgga2UgZm9ybWF0IG1hdHJpa3MgdW50dWsgcGxvdGx5IHN1cmZhY2UNCnoxX21hdHJpeCA8LSBtYXRyaXgoZ3JpZCRaMSwgbnJvdyA9IDUwLCBuY29sID0gNTApDQp6Ml9tYXRyaXggPC0gbWF0cml4KGdyaWQkWjIsIG5yb3cgPSA1MCwgbmNvbCA9IDUwKQ0KDQojIDIuIE1lbWJ1YXQgUGxvdCAzRA0KcGxvdF9seSgpICU+JQ0KICAjIEJpZGFuZyBQZXJzYW1hYW4gMQ0KICBhZGRfc3VyZmFjZSh4ID0gfmkxX3ZlYywgeSA9IH5pMl92ZWMsIHogPSB+ejFfbWF0cml4LCANCiAgICAgICAgICAgICAgbmFtZSA9ICI1STEgKyAySTIgPSAxMCIsIG9wYWNpdHkgPSAwLjcsIGNvbG9yc2NhbGUgPSAiVmlyaWRpcyIpICU+JQ0KICAjIEJpZGFuZyBQZXJzYW1hYW4gMg0KICBhZGRfc3VyZmFjZSh4ID0gfmkxX3ZlYywgeSA9IH5pMl92ZWMsIHogPSB+ejJfbWF0cml4LCANCiAgICAgICAgICAgICAgbmFtZSA9ICIySTEgKyAxMEkyID0gMjAiLCBvcGFjaXR5ID0gMC43LCBjb2xvcnNjYWxlID0gIkhvdCIpICU+JQ0KICAjIFRpdGlrIFNvbHVzaSAoZGkgbWFuYSBaMSA9IDAgZGFuIFoyID0gMCkNCiAgYWRkX21hcmtlcnMoeCA9IDEuNjY3LCB5ID0gMS42NjcsIHogPSAwLCANCiAgICAgICAgICAgICAgbWFya2VyID0gbGlzdChzaXplID0gOCwgY29sb3IgPSAiYmxhY2siLCBzeW1ib2wgPSAiZGlhbW9uZCIpLA0KICAgICAgICAgICAgICBuYW1lID0gIlRpdGlrIFNvbHVzaSAoMS42NywgMS42NykiKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlZpc3VhbGlzYXNpIDNEIFNQTCBBcnVzIExpc3RyaWsiLA0KICAgIHNjZW5lID0gbGlzdCgNCiAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBcnVzIEkxIChBKSIpLA0KICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkFydXMgSTIgKEEpIiksDQogICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAiZihJMSwgSTIpIiksDQogICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IDEuNSwgeSA9IDEuNSwgeiA9IDEuNSkpDQogICAgKQ0KICApDQpgYGANCg0KIyMjICAgUGVuamVsYXNhbiBWaXN1YWxpc2FzaSAzRDoNCg0KLSBEdWEgQmlkYW5nIChTdXJmYWNlcyk6IERhbGFtIGdyYWZpayAzRCBpbmksIHNldGlhcCBwZXJzYW1hYW4gbGluZWFyIGRpcmVwcmVzZW50YXNpa2FuIHNlYmFnYWkgc2VidWFoIGJpZGFuZyBtaXJpbmcuDQoNCi0gUGVycG90b25nYW4gQmlkYW5nOiBTb2x1c2kgZGFyaSBTUEwgYWRhbGFoIHRpdGlrIGRpIG1hbmEga2VkdWEgYmlkYW5nIHRlcnNlYnV0IHNhbGluZyBiZXJwb3RvbmdhbiB0ZXBhdCBkaSBrZXRpbmdnaWFuICRaID0gMCQuDQoNCi0gVGl0aWsgSGl0YW0gKFNvbHVzaSk6IFNheWEgdGVsYWggbWVuYW1iYWhrYW4gbWFya2VyIHBhZGEga29vcmRpbmF0ICQoXGZyYWN7NX17M30sIFxmcmFjezV9ezN9KSQgYXRhdSBzZWtpdGFyICQoMS42NywgMS42NykkLiBEaSB0aXRpayBpbmlsYWgga2VkdWEgc2lzdGVtIG1lbmNhcGFpIGtlc2V0aW1iYW5nYW4gKG5vbCkuDQoNCiMjICBEZXRlcm1pbmFuIE1hdHJpa3MgDQoNCi0gUnVtdXMgVXRhbWE6IFVudHVrIG1hdHJpa3MgJDIgXHRpbWVzIDIkLCAkXGRldChBKSA9IGFkIC0gYmMkLg0KDQotIEFwbGlrYXNpOiBQZXJ1YmFoYW4gdmFyaWFiZWwgZGFsYW0gS2Fsa3VsdXMgKE1hdHJpa3MgSmFjb2JpYW4pLg0KDQotIFBlbmplbGFzYW4gTWF0ZW1hdGlzOiBEZXRlcm1pbmFuIG1lbWJlcmlrYW4gaW5mb3JtYXNpIHRlbnRhbmcgZmFrdG9yIHNrYWxhIHBlcnViYWhhbiBsdWFzIGF0YXUgdm9sdW1lIGRhcmkgc2VidWFoIHRyYW5zZm9ybWFzaS4NCg0KLSBDb250b2ggS2FzdXM6IFRyYW5zZm9ybWFzaSBrb29yZGluYXQgS2FydGVzaXVzIGtlIFBvbGFyICgkeCA9IHIgXGNvcyBcdGhldGEsIHkgPSByIFxzaW4gXHRoZXRhJCkuDQoNCk1hdHJpa3MgSmFjb2JpYW4gKCRKJCk6DQokXGJlZ2lue2JtYXRyaXh9IFxjb3MgXHRoZXRhICYgLXIgXHNpbiBcdGhldGEgXFwgXHNpbiBcdGhldGEgJiByIFxjb3MgXHRoZXRhIFxlbmR7Ym1hdHJpeH0kLg0KDQpOaWxhaSAkXGRldChKKSA9IHIkLiBPbGVoIGthcmVuYSBpdHUsIGVsZW1lbiBsdWFzICRkQSA9IGR4XCxkeSQgbWVuamFkaSAkclwsZHJcLGRcdGhldGEkLg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgMS4gRGVmaW5pc2lrYW4gcmVudGFuZyB1bnR1ayByIChyYWRpdXMpIGRhbiB0aGV0YSAoc3VkdXQpDQpyIDwtIHNlcSgwLCA1LCBsZW5ndGgub3V0ID0gMzApDQp0aGV0YSA8LSBzZXEoMCwgMiAqIHBpLCBsZW5ndGgub3V0ID0gNjApDQoNCiMgMi4gQnVhdCBncmlkIHBvbGFyDQpncmlkIDwtIGV4cGFuZC5ncmlkKHIgPSByLCB0aGV0YSA9IHRoZXRhKQ0KDQojIDMuIFRyYW5zZm9ybWFzaSBrZSBLYXJ0ZXNpdXMgKHgsIHkpIG1lbmdndW5ha2FuIHJ1bXVzIHlhbmcgQW5kYSBzZWJ1dGthbg0KZ3JpZCR4IDwtIGdyaWQkciAqIGNvcyhncmlkJHRoZXRhKQ0KZ3JpZCR5IDwtIGdyaWQkciAqIHNpbihncmlkJHRoZXRhKQ0KDQojIE1pc2Fsa2FuIGtpdGEgYnVhdCBkaW1lbnNpIFogc2ViYWdhaSBmdW5nc2kgZGFyaSByLCBjb250b2g6IFogPSByXjIgKFBhcmFib2xvaWQpDQpncmlkJHogPC0gZ3JpZCRyXjINCg0KIyA0LiBTdXN1biB1bGFuZyBkYXRhIHVudHVrIHBsb3R0aW5nIHN1cmZhY2UNCiMgS2FyZW5hIHBsb3RseSBzdXJmYWNlIG1lbWVybHVrYW4gbWF0cml4LCBraXRhIHJlc2hhcGUgeg0Kel9tYXRyaXggPC0gbWF0cml4KGdyaWQkeiwgbnJvdyA9IGxlbmd0aChyKSwgbmNvbCA9IGxlbmd0aCh0aGV0YSkpDQp4X21hdHJpeCA8LSBtYXRyaXgoZ3JpZCR4LCBucm93ID0gbGVuZ3RoKHIpLCBuY29sID0gbGVuZ3RoKHRoZXRhKSkNCnlfbWF0cml4IDwtIG1hdHJpeChncmlkJHksIG5yb3cgPSBsZW5ndGgociksIG5jb2wgPSBsZW5ndGgodGhldGEpKQ0KDQojIDUuIFBsb3QgM0QNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX3N1cmZhY2UoeCA9IH54X21hdHJpeCwgeSA9IH55X21hdHJpeCwgeiA9IH56X21hdHJpeCwNCiAgICAgICAgICAgICAgY29sb3JzY2FsZSA9ICJTcGVjdHJhbCIsDQogICAgICAgICAgICAgIGNvbG9yYmFyID0gbGlzdCh0aXRsZSA9ICJOaWxhaSBaIChywrIpIikpICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiVmlzdWFsaXNhc2kgVHJhbnNmb3JtYXNpIFBvbGFyOiBaID0gcsKyIiwNCiAgICBzY2VuZSA9IGxpc3QoDQogICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiWCA9IHIgY29zKM64KSIpLA0KICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlkgPSByIHNpbijOuCkiKSwNCiAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJaID0gcsKyIikNCiAgICApDQogICkNCmBgYA0KIyMjICAgUGVuamVsYXNhbiBWaXN1YWxpc2FzaSAzRDoNCg0KU2FhdCBBbmRhIG1lbXV0YXIgZ3JhZmlrIGRpIGF0YXMsIEFuZGEgYWthbiBtZWxpaGF0IGJlYmVyYXBhIHBvaW4gcGVudGluZyB0ZXJrYWl0ICRcZGV0KEopID0gciQ6DQoNCi0gR3JpZCB5YW5nIE1lbXVhaTogUGVyaGF0aWthbiBiYWh3YSBkaSBkZWthdCBwdXNhdCAoJHIkIGtlY2lsKSwgImtvdGFrLWtvdGFrIiBncmlkIHNhbmdhdCByYXBhdC4gU2VtYWtpbiBqYXVoIGRhcmkgcHVzYXQgKCRyJCBiZXNhciksIGx1YXMgc2V0aWFwIHNlZ21lbiBncmlkIHNlbWFraW4gYmVzYXIgc2VjYXJhIGxpbmVhci4gSW5pbGFoIGFsYXNhbiBtZW5nYXBhIGVsZW1lbiBsdWFzbnlhIGFkYWxhaCAkciBcLCBkciBcLCBkXHRoZXRhJC4NCg0KLSBQZXJhbiAkciQgc2ViYWdhaSBGYWt0b3IgU2thbGE6IEppa2EgJHIgPSAwJCwgbWFrYSBsdWFzbnlhIG5vbCAodGl0aWsgcHVzYXQpLiBTZW1ha2luIGJlc2FyICRyJCwgc2VtYWtpbiBiZXNhciBrb250cmlidXNpIGx1YXNueWEgdGVyaGFkYXAgaW50ZWdyYWwuDQpTZWNhcmEgZ2VvbWV0cmlzLCBkZXRlcm1pbmFuIEphY29iaWFuIG1lbWJlcml0YWh1IGtpdGEgc2ViZXJhcGEgYmVzYXIgdHJhbnNmb3JtYXNpIHRlcnNlYnV0ICJtZXJlZ2FuZyIgYXRhdSAibWVueXVzdXRrYW4iIHVuaXQgYXJlYS4gRGFsYW0ga2FzdXMgcG9sYXI6DQoNCiQkZEEgPSB8SnwgXCwgZHIgXCwgZFx0aGV0YSA9IHIgXCwgZHIgXCwgZFx0aGV0YSQkDQojIyAgUnVhbmcgVmVrdG9yICRcbWF0aGJie1J9Xm4kDQoNCi0gUnVtdXMgVXRhbWE6IEtvbWJpbmFzaSBMaW5lYXIgJFxtYXRoYmZ7dn0gPSBjXzFcbWF0aGJme3Z9XzEgKyBjXzJcbWF0aGJme3Z9XzIgKyBcZG90cyArIGNfblxtYXRoYmZ7dn1fbiQuDQoNCi0gQXBsaWthc2k6IFBlbXJvc2VzYW4gV2FybmEgRGlnaXRhbCAoUnVhbmcgV2FybmEgUkdCKS4NCg0KLSBQZW5qZWxhc2FuIE1hdGVtYXRpczogU2V0aWFwIHRpdGlrIGRhbGFtIHJ1YW5nICRcbWF0aGJie1J9Xm4kIG1lcmVwcmVzZW50YXNpa2FuIHNhdHUgZW50aXRhcyBkYXRhIHNwZXNpZmlrLg0KDQotIENvbnRvaCBLYXN1czogV2FybmEgb3JhbnllIGRhbGFtIGtvbXB1dGVyIGRpc2ltcGFuIHNlYmFnYWkgdmVrdG9yICRcbWF0aGJme3Z9ID0gWzI1NSwgMTY1LCAwXSQuDQoNCkluaSBhZGFsYWgga29tYmluYXNpIGxpbmVhciBkYXJpIGJhc2lzIHN0YW5kYXIgJFxtYXRoYmJ7Un1eMyQ6ICQyNTVcbWF0aGJme2V9XzEgKyAxNjVcbWF0aGJme2V9XzIgKyAwXG1hdGhiZntlfV8zJC4NCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEZWZpbmlzaWthbiB2ZWt0b3Igd2FybmENCm9yYW5nZV92ZWMgPC0gYygyNTUsIDE2NSwgMCkNCg0KIyBCdWF0IHBsb3QgM0QNCnBsb3RfbHkoKSAlPiUNCiAgIyBWZWt0b3IgT3JhbnllDQogIGFkZF9zZWdtZW50cyh4ID0gMCwgeSA9IDAsIHogPSAwLCANCiAgICAgICAgICAgICAgIHhlbmQgPSBvcmFuZ2VfdmVjWzFdLCB5ZW5kID0gb3JhbmdlX3ZlY1syXSwgemVuZCA9IG9yYW5nZV92ZWNbM10sDQogICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJvcmFuZ2UiLCB3aWR0aCA9IDEwKSwNCiAgICAgICAgICAgICAgIG5hbWUgPSAiVmVrdG9yIE9yYW55ZSIpICU+JQ0KICAjIFRpdGlrIFVqdW5nIFZla3Rvcg0KICBhZGRfbWFya2Vycyh4ID0gb3JhbmdlX3ZlY1sxXSwgeSA9IG9yYW5nZV92ZWNbMl0sIHogPSBvcmFuZ2VfdmVjWzNdLA0KICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gIm9yYW5nZSIsIHNpemUgPSAxMCksDQogICAgICAgICAgICAgIG5hbWUgPSAiV2FybmE6ICgyNTUsIDE2NSwgMCkiKSAlPiUNCiAgbGF5b3V0KA0KICAgIHNjZW5lID0gbGlzdCgNCiAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJSZWQgKFIpIiwgcmFuZ2UgPSBjKDAsIDI1NSkpLA0KICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkdyZWVuIChHKSIsIHJhbmdlID0gYygwLCAyNTUpKSwNCiAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJCbHVlIChCKSIsIHJhbmdlID0gYygwLCAyNTUpKSwNCiAgICAgIGFzcGVjdG1vZGUgPSAiY3ViZSINCiAgICApLA0KICAgIHRpdGxlID0gIlJlcHJlc2VudGFzaSBWZWt0b3IgV2FybmEgT3JhbnllIGRhbGFtIFJ1YW5nIFJHQiINCiAgKQ0KYGBgDQojIyMgICBQZW5qZWxhc2FuIFZpc3VhbGlzYXNpIDNEOg0KDQp3YXJuYSBvcmFueWUgdGVyc2VidXQgYWRhbGFoIHZla3RvciAkXG1hdGhiZnt2fSQgeWFuZyBtZXJ1cGFrYW4gaGFzaWwga29tYmluYXNpIGxpbmVhciBkYXJpIGJhc2lzIHN0YW5kYXIgJFxtYXRoYmJ7Un1eMyQsIGRpIG1hbmE6DQoNCi0gJFxtYXRoYmZ7ZX1fMSA9IFsxLCAwLCAwXSQgKEtvbXBvbmVuIE1lcmFoIE11cm5pKQ0KDQotICRcbWF0aGJme2V9XzIgPSBbMCwgMSwgMF0kIChLb21wb25lbiBIaWphdSBNdXJuaSkNCg0KLSAkXG1hdGhiZntlfV8zID0gWzAsIDAsIDFdJCAoS29tcG9uZW4gQmlydSBNdXJuaSkNCg0KTWFrYToNCg0KJCRcbWF0aGJme3Z9ID0gMjU1IFxiZWdpbntibWF0cml4fSAxIFxcIDAgXFwgMCBcZW5ke2JtYXRyaXh9ICsgMTY1IFxiZWdpbntibWF0cml4fSAwIFxcIDEgXFwgMCBcZW5ke2JtYXRyaXh9ICsgMCBcYmVnaW57Ym1hdHJpeH0gMCBcXCAwIFxcIDEgXGVuZHtibWF0cml4fSA9IFxiZWdpbntibWF0cml4fSAyNTUgXFwgMTY1IFxcIDAgXGVuZHtibWF0cml4fSQkDQpNZW5hcmlrbnlhLCBkYWxhbSBrb21wdXRlciBncmFmaXMsIGtpdGEgc2VyaW5nIG1lbmd1YmFoIGJhc2lzIHdhcm5hIChUcmFuc2Zvcm1hc2kgTGluZWFyKS4gQ29udG9obnlhIGRhcmkgUkdCIGtlIEdyYXlzY2FsZSAoc2thbGEgYWJ1LWFidSkuDQoNCk1pc2Fsa2FuIGtpdGEgaW5naW4gbWVuZ3ViYWggd2FybmEgbWVuamFkaSBncmF5c2NhbGUgbWVuZ2d1bmFrYW4gYm9ib3QgbHVtaW5hbnNpLiBUcmFuc2Zvcm1hc2kgaW5pIGFkYWxhaCBwZXJrYWxpYW4gZG90IHByb2R1Y3QgKGF0YXUgcGVya2FsaWFuIG1hdHJpa3MpOg0KDQokJFkgPSAwLjI5OVIgKyAwLjU4N0cgKyAwLjExNEIkJA0KDQpTZWNhcmEgYWxqYWJhciBsaW5lYXIsIGluaSBhZGFsYWggcHJveWVrc2kgZGFyaSBydWFuZyAkXG1hdGhiYntSfV4zJCBrZSAkXG1hdGhiYntSfV4xJCAoZ2FyaXMgc2thbGFyKS4NCg0KTWVuZ2FwYSBpbmkgcGVudGluZw0KDQotIEtvbXByZXNpIEdhbWJhcjogVGVrbmlrIHNlcGVydGkgSlBFRyBtZW5nZ3VuYWthbiBwZXJ1YmFoYW4gYmFzaXMgZGFyaSBSR0Iga2UgWUNiQ3IgKEx1bWluYW5zaSBkYW4gS3JvbWluYW5zaSkgdW50dWsgbWVtYnVhbmcgZGF0YSB5YW5nIHRpZGFrIHRlcmxpaGF0IG9sZWggbWF0YSBtYW51c2lhLg0KDQotIEZpbHRlciBGb3RvOiBGaWx0ZXIgcGFkYSBhcGxpa2FzaSBzZXBlcnRpIEluc3RhZ3JhbSBwYWRhIGRhc2FybnlhIGFkYWxhaCBtYXRyaWtzIHRyYW5zZm9ybWFzaSB5YW5nIGRpa2FsaWthbiBrZSBzZXRpYXAgdmVrdG9yIHdhcm5hIHBhZGEgcGlrc2VsIGdhbWJhci4NCg0KIyMgIFJ1YW5nIFZla3RvciBTZWNhcmEgVW11bSANCg0KLSBSdW11cyBVdGFtYTogQWtzaW9tYSBSdWFuZyBWZWt0b3IgKFBlbmp1bWxhaGFuIGRhbiBQZXJrYWxpYW4gU2thbGFyIHBhZGEgaGltcHVuYW4gb2JqZWsgc2VwZXJ0aSBmdW5nc2kgYXRhdSBwb2xpbm9taWFsKS4NCg0KLSBBcGxpa2FzaTogVGVvcmkgUGVyc2FtYWFuIERpZmVyZW5zaWFsIExpbmVhci4NCg0KLSBQZW5qZWxhc2FuIE1hdGVtYXRpczogSGltcHVuYW4gc2VtdWEgc29sdXNpIGRhcmkgcGVyc2FtYWFuIGRpZmVyZW5zaWFsIGhvbW9nZW4gbWVtYmVudHVrIHN1YnJ1YW5nIHZla3Rvci4NCg0KLSBDb250b2ggS2FzdXM6IFBhZGEgcGVyc2FtYWFuICR5JycgKyB5ID0gMCQuDQoNCkthcmVuYSBzb2x1c2lueWEgYWRhbGFoICRcc2luKHgpJCBkYW4gJFxjb3MoeCkkLCBtYWthIHNldGlhcCBrb21iaW5hc2kgbGluZWFyICR5ID0gQVxzaW4oeCkgKyBCXGNvcyh4KSQganVnYSBtZXJ1cGFrYW4gc29sdXNpIHZhbGlkLg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgMS4gRGVmaW5pc2lrYW4gcmVudGFuZyBwYXJhbWV0ZXINCnhfdmFscyA8LSBzZXEoMCwgMTAsIGxlbmd0aC5vdXQgPSAxMDApICAjIERvbWFpbiB3YWt0dS9wb3Npc2kNCkFfdmFscyA8LSBzZXEoLTIsIDIsIGxlbmd0aC5vdXQgPSA1MCkgICAjIEtvZWZpc2llbiB1bnR1ayBzaW4oeCkNCkJfdmFscyA8LSBzZXEoLTIsIDIsIGxlbmd0aC5vdXQgPSA1MCkgICAjIEtvZWZpc2llbiB1bnR1ayBjb3MoeCkNCg0KIyAyLiBQaWxpaCBzYXR1IG5pbGFpIHggc3Blc2lmaWsgdW50dWsgbWVsaWhhdCAicGVybXVrYWFuIHNvbHVzaSINCiMgQXRhdSBraXRhIGJ1YXQgZnVuZ3NpIGRpIG1hbmEgWiBhZGFsYWggbmlsYWkgeSh4KSBwYWRhIHggdGVydGVudHUNCmdyaWQgPC0gZXhwYW5kLmdyaWQoQSA9IEFfdmFscywgQiA9IEJfdmFscykNCmdyaWQkWiA8LSBncmlkJEEgKiBzaW4oNSkgKyBncmlkJEIgKiBjb3MoNSkgIyBDb250b2ggbmlsYWkgeSBwYWRhIHg9NQ0KDQojIDMuIFRyYW5zZm9ybWFzaSBrZSBtYXRyaWtzIHVudHVrIHN1cmZhY2UgcGxvdA0Kel9tYXRyaXggPC0gbWF0cml4KGdyaWQkWiwgbnJvdyA9IGxlbmd0aChBX3ZhbHMpLCBuY29sID0gbGVuZ3RoKEJfdmFscykpDQoNCiMgNC4gUGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX3N1cmZhY2UoeCA9IH5BX3ZhbHMsIHkgPSB+Ql92YWxzLCB6ID0gfnpfbWF0cml4LA0KICAgICAgICAgICAgICBjb2xvcnNjYWxlID0gIlJkQnUiKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlcm11a2FhbiBTb2x1c2kgeSA9IEEgc2luKHgpICsgQiBjb3MoeCkgcGFkYSB4ID0gNSIsDQogICAgc2NlbmUgPSBsaXN0KA0KICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIktvZWZpc2llbiBBIChCYXNpcyBTaW4pIiksDQogICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS29lZmlzaWVuIEIgKEJhc2lzIENvcykiKSwNCiAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJPdXRwdXQgeSh4KSIpDQogICAgKQ0KICApDQpgYGANCiMjIyAgIFBlbmplbGFzYW4gVmlzdWFsaXNhc2kgM0Q6DQpiYWdhaW1hbmEgcGVydWJhaGFuIHNrYWxhciAkQSQgZGFuICRCJCBtZW5naGFzaWxrYW4ga3VydmEgc29sdXNpIHlhbmcgYmVyYmVkYSBuYW11biB0ZXRhcCBtZW1lbnVoaSBrYXJha3RlcmlzdGlrIHBlcnNhbWFhbiBkaWZlcmVuc2lhbCB5YW5nIHNhbWEuDQoNCkNhcmEgeWFuZyBsZWJpaCAiYWxqYWJhciBsaW5lYXIiIHVudHVrIG1lbGloYXQgaW5pIGFkYWxhaCBtZWxhbHVpIFJ1YW5nIEZhc2UuIEppa2Ega2l0YSBkZWZpbmlzaWthbiAkeV8xID0geSQgZGFuICR5XzIgPSB5JyQsIG1ha2Egc2lzdGVtbnlhIG1lbmphZGk6DQoNCiQkXGJlZ2lue2JtYXRyaXh9IHlfMScgXFwgeV8yJyBcZW5ke2JtYXRyaXh9ID0gXGJlZ2lue2JtYXRyaXh9IDAgJiAxIFxcIC0xICYgMCBcZW5ke2JtYXRyaXh9IFxiZWdpbntibWF0cml4fSB5XzEgXFwgeV8yIFxlbmR7Ym1hdHJpeH0kJA0KDQpNYXRyaWtzIGRpIGF0YXMgbWVtaWxpa2kgZWlnZW52YWx1ZXMgaW1hamluZXIgbXVybmkgKCRccG0gaSQpLCB5YW5nIHNlY2FyYSBnZW9tZXRyaXMgYmVyYXJ0aSByb3Rhc2kuIEluaWxhaCBtZW5nYXBhIHNvbHVzaW55YSBiZXJiZW50dWsgbGluZ2thcmFuIGF0YXUgZWxpcHMgZGFsYW0gcnVhbmcgZmFzZSwgbWVuY2VybWlua2FuIHNpZmF0IG9zaWxhc2kgZGFyaSBzaW51cyBkYW4ga29zaW51cy4NCg0KUGVuamVsYXNhbiBHZW9tZXRyaXMgZGFsYW0gM0QNCg0KLSBCaWRhbmcgRGF0YXIgKExpbmVhcml0eSk6IFBlcmhhdGlrYW4gYmFod2EgcGVybXVrYWFuIHlhbmcgZGloYXNpbGthbiBvbGVoIGFkZF9zdXJmYWNlIGRpIGF0YXMgYWRhbGFoIHNlYnVhaCBiaWRhbmcgZGF0YXIgbWlyaW5nLiBJbmkgc2VjYXJhIHZpc3VhbCBtZW1idWt0aWthbiBzaWZhdCBsaW5lYXJpdGFzLiBLYXJlbmEgJHkkIGFkYWxhaCBrb21iaW5hc2kgbGluZWFyIGRhcmkgJEEkIGRhbiAkQiQsIG1ha2EgcGVydWJhaGFuIHBhZGEgJEEkIGF0YXUgJEIkIGFrYW4gbWVuZ2FraWJhdGthbiBwZXJ1YmFoYW4gcHJvcG9yc2lvbmFsIHBhZGEgbmlsYWkgJHkkLg0KDQotIFJ1YW5nIFNvbHVzaTogU2V0aWFwIHRpdGlrICQoQSwgQikkIHBhZGEgYmlkYW5nIGhvcml6b250YWwgdGVyc2VidXQgbWV3YWtpbGkgc2F0dSBzb2x1c2kgc3Blc2lmaWsgZGFyaSBwZXJzYW1hYW4gZGlmZXJlbnNpYWwuIEppa2Ega2l0YSBtZW5nZ2VzZXIgdGl0aWsgZGkgYmlkYW5nIHRlcnNlYnV0LCBraXRhIHNlYmVuYXJueWEgc2VkYW5nIG1lbWlsaWggImNhbXB1cmFuIiB5YW5nIGJlcmJlZGEgYW50YXJhIGZ1bmdzaSBzaW51cyBkYW4ga29zaW51cy4NCg0KDQojIyMgVmlzdWFsaXNhc2kgQWx0ZXJuYXRpZjogRXZvbHVzaSBXYWt0dSAoM0QgUGF0aCkNCg0KSmlrYSAgaW5naW4gbWVsaWhhdCBiYWdhaW1hbmEgc29sdXNpIGluaSBiZXJvc2lsYXNpIHNlaXJpbmcgd2FrdHUgKCR4JCkgZGFsYW0gYmVudHVrIHNwaXJhbCAocnVhbmcgZmFzZSB5YW5nIGRpdGFyaWsgc2VjYXJhIHZlcnRpa2FsKSwga2l0YSBiaXNhIG1lbmdndW5ha2FuIGFkZF9wYXRoczoNCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgTWVtYnVhdCBiZWJlcmFwYSBsaW50YXNhbiBzb2x1c2kgdW50dWsgbmlsYWkgQSBkYW4gQiB5YW5nIGJlcmJlZGENCnQgPC0gc2VxKDAsIDEwLCBsZW5ndGgub3V0ID0gNTAwKQ0KZGYxIDwtIGRhdGEuZnJhbWUodCA9IHQsIHkgPSAxKnNpbih0KSArIDAqY29zKHQpLCBsYWJlbCA9ICJNdXJuaSBTaW4iKQ0KZGYyIDwtIGRhdGEuZnJhbWUodCA9IHQsIHkgPSAwKnNpbih0KSArIDEqY29zKHQpLCBsYWJlbCA9ICJNdXJuaSBDb3MiKQ0KZGYzIDwtIGRhdGEuZnJhbWUodCA9IHQsIHkgPSAxKnNpbih0KSArIDEqY29zKHQpLCBsYWJlbCA9ICJDYW1wdXJhbiAoQT0xLCBCPTEpIikNCg0KcGxvdF9seSh0eXBlID0gJ3NjYXR0ZXIzZCcsIG1vZGUgPSAnbGluZXMnKSAlPiUNCiAgYWRkX3RyYWNlKHggPSB+ZGYxJHQsIHkgPSB+cmVwKDEsIDUwMCksIHogPSB+ZGYxJHksIG5hbWUgPSAiQT0xLCBCPTAiKSAlPiUNCiAgYWRkX3RyYWNlKHggPSB+ZGYyJHQsIHkgPSB+cmVwKDAsIDUwMCksIHogPSB+ZGYyJHksIG5hbWUgPSAiQT0wLCBCPTEiKSAlPiUNCiAgYWRkX3RyYWNlKHggPSB+ZGYzJHQsIHkgPSB+cmVwKDAuNSwgNTAwKSwgeiA9IH5kZjMkeSwgbmFtZSA9ICJBPTEsIEI9MSIpICU+JQ0KICBsYXlvdXQoc2NlbmUgPSBsaXN0KHhheGlzPWxpc3QodGl0bGU9Ildha3R1ICh4KSIpLCANCiAgICAgICAgICAgICAgICAgICAgICB5YXhpcz1saXN0KHRpdGxlPSJQYXJhbWV0ZXIiKSwgDQogICAgICAgICAgICAgICAgICAgICAgemF4aXM9bGlzdCh0aXRsZT0iQW1wbGl0dWRvICh5KSIpKSkNCmBgYA0KDQoNCkRhbGFtIGJhaGFzYSBhbGphYmFyIGxpbmVhciwga2l0YSBrYXRha2FuIGJhaHdhIG9wZXJhdG9yIGRpZmVyZW5zaWFsICRMID0gXGZyYWN7ZF4yfXtkeF4yfSArIEkkIG1lbWlsaWtpIEtlcm5lbCAocnVhbmcgbm9sKSB5YW5nIGRpcmVudGFuZyAoc3Bhbm5lZCkgb2xlaCAkXHtcc2luIHgsIFxjb3MgeFx9JC4gVmlzdWFsaXNhc2kgM0QgaW5pIG1lbWJhbnR1IGtpdGEgbWVsaWhhdCBiYWh3YSBzZWx1cnVoICJwZXJtdWthYW4iIHNvbHVzaSBhZGFsYWggaGFzaWwgcmVudGFuZ2FuIGRhcmkgZHVhIHZla3RvciBiYXNpcyB0ZXJzZWJ1dC4NCg0KDQojIyAgTmlsYWkgZGFuIFZla3RvciBFaWdlbiANCg0KLSBSdW11cyBVdGFtYTogJEFcbWF0aGJme3Z9ID0gXGxhbWJkYVxtYXRoYmZ7dn0kIGF0YXUgJFxkZXQoQSAtIFxsYW1iZGEgSSkgPSAwJC4NCg0KLSBBcGxpa2FzaTogQW5hbGlzaXMgRnJla3VlbnNpIEFsYW1pIGRhbiBTdGFiaWxpdGFzIFN0cnVrdHVyLg0KDQotIFBlbmplbGFzYW4gTWF0ZW1hdGlzOiBOaWxhaSBlaWdlbiAoJFxsYW1iZGEkKSBzZXJpbmcgbWVyZXByZXNlbnRhc2lrYW4ga2FyYWt0ZXJpc3RpayBmaXNpayBzaXN0ZW0gKHNlcGVydGkgZnJla3VlbnNpKSwgZGFuIHZla3RvciBlaWdlbiAoJFxtYXRoYmZ7dn0kKSBtZXJlcHJlc2VudGFzaWthbiBiZW50dWsgYXRhdSBhcmFoIGdldGFyYW5ueWEuDQoNCi0gQ29udG9oIEthc3VzOiBNYXRyaWtzIGtla2FrdWFuIGplbWJhdGFuICRLID0gXGJlZ2lue2JtYXRyaXh9IDIgJiAtMSBcXCAtMSAmIDIgXGVuZHtibWF0cml4fSQuDQoNCkFrYXIga2FyYWt0ZXJpc3RpayBtZW1iZXJpa2FuICRcbGFtYmRhXzEgPSAzJCBkYW4gJFxsYW1iZGFfMiA9IDEkLiANCg0KRnJla3VlbnNpIGFsYW1pIHN0cnVrdHVyIGRpZGFwYXQgZGFyaSAkXG9tZWdhID0gXHNxcnR7XGxhbWJkYX0kLg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgMS4gRGVmaW5pc2lrYW4gTWF0cmlrcyBLZWtha3VhbiBLDQpLIDwtIG1hdHJpeChjKDIsIC0xLCAtMSwgMiksIG5yb3cgPSAyKQ0KDQojIDIuIEJ1YXQgZ3JpZCBwZXJwaW5kYWhhbiAoZGlzcGxhY2VtZW50KSB4MSBkYW4geDINCngxIDwtIHNlcSgtMiwgMiwgbGVuZ3RoLm91dCA9IDUwKQ0KeDIgPC0gc2VxKC0yLCAyLCBsZW5ndGgub3V0ID0gNTApDQpncmlkIDwtIGV4cGFuZC5ncmlkKHgxID0geDEsIHgyID0geDIpDQoNCiMgMy4gSGl0dW5nIEVuZXJnaSBQb3RlbnNpYWwgViA9IDAuNSAqIHgnICogSyAqIHgNCiMgViA9IDAuNSAqICgyKngxXjIgLSAyKngxKngyICsgMip4Ml4yKQ0KZ3JpZCRWIDwtIDAuNSAqIChLWzEsMV0qZ3JpZCR4MV4yICsgKEtbMSwyXSArIEtbMiwxXSkqZ3JpZCR4MSpncmlkJHgyICsgS1syLDJdKmdyaWQkeDJeMikNCg0KIyA0LiBSZXNoYXBlIGRhdGEgdW50dWsgc3VyZmFjZSBwbG90DQp2X21hdHJpeCA8LSBtYXRyaXgoZ3JpZCRWLCBucm93ID0gNTAsIG5jb2wgPSA1MCkNCg0KIyA1LiBQbG90IDNEIFBlcm11a2FhbiBFbmVyZ2kNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX3N1cmZhY2UoeCA9IH54MSwgeSA9IH54MiwgeiA9IH52X21hdHJpeCwNCiAgICAgICAgICAgICAgY29sb3JzY2FsZSA9ICJWaXJpZGlzIikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZXJtdWthYW4gRW5lcmdpIFBvdGVuc2lhbCBKZW1iYXRhbiAoUXVhZHJhdGljIEZvcm0pIiwNCiAgICBzY2VuZSA9IGxpc3QoDQogICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRGlzcGxhY2VtZW50IHgxIiksDQogICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiRGlzcGxhY2VtZW50IHgyIiksDQogICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAiRW5lcmdpIChWKSIpDQogICAgKQ0KICApDQpgYGANCg0KIyMjIEludGVycHJldGFzaSBHZW9tZXRyaXMgM0QNCg0KLSBCZW50dWsgTWFuZ2t1ayAoUGFyYWJvbG9pZCk6IFBlcm11a2FhbiBpbmkgbWVudW5qdWtrYW4gYmFod2EgdGl0aWsgJCgwLDApJCBhZGFsYWggcG9zaXNpIHNldGltYmFuZyBzdGFiaWwgKGVuZXJnaSBtaW5pbXVtKS4NCg0KLSBLZWxlbmdrdW5nYW4gKEN1cnZhdHVyZSk6IEppa2EgQW5kYSBwZXJoYXRpa2FuLCBwZXJtdWthYW4gaW5pIGxlYmloICJjdXJhbSIgZGkgc2F0dSBhcmFoIGRhbiBsZWJpaCAibGFuZGFpIiBkaSBhcmFoIGxhaW4uDQoNCkFyYWggeWFuZyBwYWxpbmcgY3VyYW0gYmVyaHVidW5nYW4gZGVuZ2FuICRcbGFtYmRhXzEgPSAzJCAobW9kZSBrYWt1KS4NCg0KQXJhaCB5YW5nIHBhbGluZyBsYW5kYWkgYmVyaHVidW5nYW4gZGVuZ2FuICRcbGFtYmRhXzIgPSAxJCAobW9kZSBmbGVrc2liZWwpLg0KDQotIEVsaXBzIEtvbnR1cjogSmlrYSBraXRhIG1lbW90b25nIHBlcm11a2FhbiBpbmkgc2VjYXJhIGhvcml6b250YWwsIGtpdGEgYWthbiBtZW5kYXBhdGthbiBlbGlwcy4gU3VtYnUgdXRhbWEgZWxpcHMgdGVyc2VidXQgYWRhbGFoIGFyYWggZGFyaSBWZWt0b3IgRWlnZW4uDQoNCmluaSBwZW50aW5nIGJhZ2kgSW5zaW55dXI6DQoNCkppa2EgZnJla3VlbnNpIGJlYmFuIGx1YXIgKHNlcGVydGkgYW5naW4gYXRhdSBsYW5na2FoIGtha2kgb3JhbmcpIHNhbWEgZGVuZ2FuIHNhbGFoIHNhdHUgZnJla3VlbnNpIGFsYW1pICgkXG9tZWdhID0gMSQgYXRhdSAkMS43MyQpLCBtYWthIGFrYW4gdGVyamFkaSBSZXNvbmFuc2kgeWFuZyBiaXNhIG1lcnVudHVoa2FuIGplbWJhdGFuLiBJbmlsYWggbWVuZ2FwYSBtZW5naGl0dW5nIG5pbGFpIGVpZ2VuIGRhcmkgbWF0cmlrcyBrZWtha3VhbiBhZGFsYWggbGFuZ2thaCB3YWppYiBkYWxhbSBkZXNhaW4gamVtYmF0YW4uDQoNCg0KIyMgIFJ1YW5nIEhhc2lsIEthbGkgRGFsYW0gKElubmVyIFByb2R1Y3QgU3BhY2UpDQoNCi0gUnVtdXMgVXRhbWE6ICRcbGFuZ2xlIFxtYXRoYmZ7Zn0sIFxtYXRoYmZ7Z30gXHJhbmdsZSA9IFxpbnRfe2F9XntifSBmKHgpZyh4KSBcLCBkeCQuDQoNCi0gQXBsaWthc2k6IFBlbXJvc2VzYW4gU2lueWFsIChEZXJldCBGb3VyaWVyKS4NCg0KUGVuamVsYXNhbiBNYXRlbWF0aXM6IERpZ3VuYWthbiB1bnR1ayBtZW5lbnR1a2FuIHNlYmVyYXBhIG1pcmlwIGR1YSBmdW5nc2kgKGtvcmVsYXNpKSBtZWxhbHVpIHByb3lla3NpIG9ydG9nb25hbC4NCg0KLSBDb250b2ggS2FzdXM6IE1lbmdhbWJpbCBmcmVrdWVuc2kgdGVydGVudHUgZGFyaSBzdWFyYSBtZW50YWggJGYoeCkkIGRlbmdhbiBtZW1wcm95ZWtzaWthbm55YSBrZSBiYXNpcyBzaW51cy9rb3NpbnVzOiRhX24gPSBcZnJhY3sxfXtccGl9IFxpbnRfey1ccGl9XntccGl9IGYoeCkgXGNvcyhueCkgXCwgZHgkLg0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgMS4gTWVtYnVhdCBTaW55YWwgU3VhcmEgTWVudGFoIGYoeCkNCiMgTWlzYWw6IEdhYnVuZ2FuIGR1YSBmcmVrdWVuc2kgKG49MiBkYW4gbj01KQ0KeCA8LSBzZXEoLXBpLCBwaSwgbGVuZ3RoLm91dCA9IDUwMCkNCmZfeCA8LSBzaW4oMip4KSArIDAuNSAqIGNvcyg1KngpDQoNCiMgMi4gTWVtYnVhdCBCYXNpcyB1bnR1ayBWaXN1YWxpc2FzaQ0Kbl9iYXNpcyA8LSAxOjYNCmdyaWQgPC0gZXhwYW5kLmdyaWQoeCA9IHgsIG4gPSBuX2Jhc2lzKQ0KDQojIDMuIE1lbmdoaXR1bmcgS29udHJpYnVzaSB0aWFwIEZyZWt1ZW5zaSAoUHJveWVrc2kpDQojIERhbGFtIHZpc3VhbGlzYXNpIGluaSBraXRhIHR1bmp1a2thbiBiYWdhaW1hbmEgc2lueWFsIGYoeCkgImJlcmdldGFyIiANCiMgcGFkYSBiZXJiYWdhaSBiYXNpcyBmcmVrdWVuc2kgbg0KZ3JpZCR6IDwtIGZfeCAqIGNvcyhncmlkJG4gKiBncmlkJHgpDQoNCiMgNC4gUGxvdCAzRCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3RfbHkoZ3JpZCwgeCA9IH54LCB5ID0gfm4sIHogPSB+eiwgc3BsaXQgPSB+biwgDQogICAgICAgIHR5cGUgPSAnc2NhdHRlcjNkJywgbW9kZSA9ICdsaW5lcycsIA0KICAgICAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDQpKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIkRla29tcG9zaXNpIEZvdXJpZXI6IFByb3lla3NpIFNpbnlhbCBrZSBCYXNpcyBGcmVrdWVuc2kiLA0KICAgIHNjZW5lID0gbGlzdCgNCiAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJXYWt0dSAoeCkiKSwNCiAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJGcmVrdWVuc2kgKG4pIiksDQogICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAiQW1wbGl0dWRvIFByb3lla3NpIikNCiAgICApDQogICkNCmBgYA0KDQoNCiMjIyBJbnRlcnByZXRhc2kgR2VvbWV0cmlzIDNEDQoNCnNldGlhcCBnYXJpcyBwYWRhIHN1bWJ1ICRuJCBtZW51bmp1a2thbiBzZWJlcmFwYSBrdWF0IHNpbnlhbCBhc2xpIGJlcmVzb25hbnNpIGRlbmdhbiBmcmVrdWVuc2kgdGVyc2VidXQuIEppa2EgZ2FyaXNueWEgc2FuZ2F0IGJlcm9zaWxhc2kgbWVuamF1aCBkYXJpIG5vbCwgYmVyYXJ0aSBmcmVrdWVuc2kgdGVyc2VidXQgZG9taW5hbiBkYWxhbSBzdWFyYSBtZW50YWgga2l0YS4NCg0KDQojIyAgRGlhZ29uYWxpc2FzaSAmIEJlbnR1ayBLdWFkcmF0aWsNCg0KLSBSdW11cyBVdGFtYTogJFEoeCkgPSBcbWF0aGJme3h9XlQgQSBcbWF0aGJme3h9JC4NCg0KLSBBcGxpa2FzaTogS2xhc2lmaWthc2kgUGVuYW1wYW5nIEtlcnVjdXQgKEFzdHJvbm9taS9EZXNhaW4gQW50ZW5hKS4NCg0KLSBQZW5qZWxhc2FuIE1hdGVtYXRpczogRGlhZ29uYWxpc2FzaSBkaWd1bmFrYW4gdW50dWsgbWVueWVkZXJoYW5ha2FuIHBlcnNhbWFhbiBrdWFkcmF0IHJ1bWl0IGRlbmdhbiBtZW5naGlsYW5na2FuIHN1a3Ugc2lsYW5nICgkeHkkKS4NCg0KLSBDb250b2ggS2FzdXM6IFBlcnNhbWFhbiAkNXheMiArIDh4eSArIDV5XjIgPSA5JC4NCg0KTWVsYWx1aSB0cmFuc2Zvcm1hc2kga29vcmRpbmF0IChkaWFnb25hbGlzYXNpKSwgcGVyc2FtYWFuIGJlcnViYWggbWVuamFkaSAkOXgnXjIgKyAxeSdeMiA9IDkkLiANCg0KQmVudHVrIGluaSBzZWNhcmEgbWF0ZW1hdGlzIGRpa2VuYWxpIHNlYmFnYWkgRWxpcHMuDQoNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgMS4gRGVmaW5pc2lrYW4gZnVuZ3NpIGYoeCwgeSkgPSA1eF4yICsgOHh5ICsgNXleMg0KeCA8LSBzZXEoLTIsIDIsIGxlbmd0aC5vdXQgPSAxMDApDQp5IDwtIHNlcSgtMiwgMiwgbGVuZ3RoLm91dCA9IDEwMCkNCmdyaWQgPC0gZXhwYW5kLmdyaWQoeCA9IHgsIHkgPSB5KQ0KDQojIEhpdHVuZyBuaWxhaSBaIChCZW50dWsgS3VhZHJhdGlrKQ0KZ3JpZCR6IDwtIDUqZ3JpZCR4XjIgKyA4KmdyaWQkeCpncmlkJHkgKyA1KmdyaWQkeV4yDQoNCiMgMi4gUmVzaGFwZSB1bnR1ayBQbG90bHkNCnpfbWF0cml4IDwtIG1hdHJpeChncmlkJHosIG5yb3cgPSAxMDAsIG5jb2wgPSAxMDApDQoNCiMgMy4gUGxvdCAzRA0KcGxvdF9seSgpICU+JQ0KICAjIFBlcm11a2FhbiBLdWFkcmF0aWsNCiAgYWRkX3N1cmZhY2UoeCA9IH54LCB5ID0gfnksIHogPSB+el9tYXRyaXgsIA0KICAgICAgICAgICAgICBjb2xvcnNjYWxlID0gIlZpcmlkaXMiLCBvcGFjaXR5ID0gMC44KSAlPiUNCiAgIyBCaWRhbmcgcGVtb3RvbmcgZGkgWiA9IDkgKHVudHVrIG1lbnVuanVra2FuIGVsaXBzKQ0KICBhZGRfc3VyZmFjZSh4ID0gfngsIHkgPSB+eSwgeiA9IG1hdHJpeCg5LCAxMDAsIDEwMCksIA0KICAgICAgICAgICAgICBzaG93c2NhbGUgPSBGQUxTRSwgb3BhY2l0eSA9IDAuMywgbmFtZSA9ICJaID0gOSIpICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiVmlzdWFsaXNhc2kgM0Q6IFJvdGFzaSBFbGlwcyBtZWxhbHVpIERpYWdvbmFsaXNhc2kiLA0KICAgIHNjZW5lID0gbGlzdCgNCiAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJYIiksDQogICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiWSIpLA0KICAgICAgemF4aXMgPSBsaXN0KHRpdGxlID0gImYoeCx5KSIpLA0KICAgICAgY2FtZXJhID0gbGlzdChleWUgPSBsaXN0KHggPSAxLjgsIHkgPSAxLjgsIHogPSAxLjIpKQ0KICAgICkNCiAgKQ0KYGBgDQoNCiMjIyBJbnRlcnByZXRhc2kgR2VvbWV0cmlzIDNEDQoNCi0gS2Vsb25qb25nYW4gTWFuZ2t1azogUGVyaGF0aWthbiBiYWh3YSBtYW5na3VrIHRlcnNlYnV0IHRpZGFrIHNpbWV0cmlzIHNlbXB1cm5hIHNlY2FyYSByYWRpYWwuIElhIGxlYmloICJ0YWphbSIga2Ugc2F0dSBhcmFoIGRhbiBsZWJpaCAibGViYXIiIGtlIGFyYWggbGFpbi4gQXJhaC1hcmFoIHV0YW1hIGluaSBkaXRlbnR1a2FuIG9sZWggVmVrdG9yIEVpZ2VuLg0KDQotIEVmZWsgRGlhZ29uYWxpc2FzaTogRGlhZ29uYWxpc2FzaSBwYWRhIGRhc2FybnlhIGFkYWxhaCBtZW11dGFyIGthbWVyYSBBbmRhIGF0YXUgbWVtdXRhciBncmFmaWsgdGVyc2VidXQgc2VoaW5nZ2Egc3VtYnUgdXRhbWFueWEgc2VqYWphciBkZW5nYW4gc3VtYnUgJFgkIGRhbiAkWSQuDQoNCi0gTmlsYWkgRWlnZW4gc2ViYWdhaSBTa2FsYTogKiAkXGxhbWJkYSA9IDkkIChzYW5nYXQgY3VyYW0pIG1lbWJ1YXQgc3VtYnUgZWxpcHMgbWVuamFkaSBwZW5kZWsgKCQxL1xzcXJ0ezl9ID0gMS8zJCkuJFxsYW1iZGEgPSAxJCAoa3VyYW5nIGN1cmFtKSBtZW1idWF0IHN1bWJ1IGVsaXBzIG1lbmphZGkgcGFuamFuZyAoJDEvXHNxcnR7MX0gPSAxJCkuDQoNCg0KIyMgIFRyYW5zZm9ybWFzaSBMaW5lYXIgDQoNCi0gUnVtdXMgVXRhbWE6ICRcbWF0aGJme3h9JyA9IE0gXG1hdGhiZnt4fSQuDQoNCi0gQXBsaWthc2k6IEFuaW1hc2kgS29tcHV0ZXIgZGFuIEdyYWZpa2EgM0QuDQoNCi0gUGVuamVsYXNhbiBNYXRlbWF0aXM6IE1lbWV0YWthbiB2ZWt0b3IgZGFyaSBydWFuZyBhc2FsIGtlIHJ1YW5nIHR1anVhbiBtZW5nZ3VuYWthbiBtYXRyaWtzIHRyYW5zZm9ybWFzaS4NCg0KLSBDb250b2ggS2FzdXM6IFJvdGFzaSB0aXRpayAkKDEsIDApJCBzZWJlc2FyICQ5MF5cY2lyYyQuDQoNCk1lbmdndW5ha2FuIG1hdHJpa3Mgcm90YXNpICRNID0gXGJlZ2lue2JtYXRyaXh9IDAgJiAtMSBcXCAxICYgMCBcZW5ke2JtYXRyaXh9JC4NCg0KSGFzaWw6ICRcYmVnaW57Ym1hdHJpeH0gMCAmIC0xIFxcIDEgJiAwIFxlbmR7Ym1hdHJpeH0gXGJlZ2lue2JtYXRyaXh9IDEgXFwgMCBcZW5ke2JtYXRyaXh9ID0gXGJlZ2lue2JtYXRyaXh9IDAgXFwgMSBcZW5ke2JtYXRyaXh9JC4NCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyAxLiBEZWZpbmlzaWthbiBWZWt0b3IgQXdhbCBkYW4gSGFzaWwNCnZfYXdhbCA8LSBjKDEsIDAsIDApDQp2X2FraGlyIDwtIGMoMCwgMSwgMCkNCg0KIyAyLiBCdWF0IGxpbnRhc2FuIGJ1c3VyIChhcmMpIHVudHVrIG1lbnVuanVra2FuIHJvdGFzaQ0KdGhldGEgPC0gc2VxKDAsIHBpLzIsIGxlbmd0aC5vdXQgPSA1MCkNCmFyY194IDwtIGNvcyh0aGV0YSkNCmFyY195IDwtIHNpbih0aGV0YSkNCmFyY196IDwtIHJlcCgwLCA1MCkNCg0KIyAzLiBQbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdF9seSgpICU+JQ0KICAjIFZla3RvciBBd2FsIChNZXJhaCkNCiAgYWRkX3NlZ21lbnRzKHggPSAwLCB5ID0gMCwgeiA9IDAsIHhlbmQgPSB2X2F3YWxbMV0sIHllbmQgPSB2X2F3YWxbMl0sIHplbmQgPSB2X2F3YWxbM10sDQogICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZWQiLCB3aWR0aCA9IDYpLCBuYW1lID0gIkF3YWwgKDEsMCkiKSAlPiUNCiAgIyBWZWt0b3IgQWtoaXIgKEJpcnUpDQogIGFkZF9zZWdtZW50cyh4ID0gMCwgeSA9IDAsIHogPSAwLCB4ZW5kID0gdl9ha2hpclsxXSwgeWVuZCA9IHZfYWtoaXJbMl0sIHplbmQgPSB2X2FraGlyWzNdLA0KICAgICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiYmx1ZSIsIHdpZHRoID0gNiksIG5hbWUgPSAiUm90YXNpIDkwwrAgKDAsMSkiKSAlPiUNCiAgIyBMaW50YXNhbiBSb3Rhc2kNCiAgYWRkX3BhdGhzKHggPSB+YXJjX3gsIHkgPSB+YXJjX3ksIHogPSB+YXJjX3osIA0KICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAiZ3JheSIsIGRhc2ggPSAiZGFzaCIpLCBuYW1lID0gIkxpbnRhc2FuIFJvdGFzaSIpICU+JQ0KICBsYXlvdXQoDQogICAgc2NlbmUgPSBsaXN0KA0KICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlgiLCByYW5nZSA9IGMoLTEuNSwgMS41KSksDQogICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiWSIsIHJhbmdlID0gYygtMS41LCAxLjUpKSwNCiAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJaIiwgcmFuZ2UgPSBjKC0xLCAxKSksDQogICAgICBjYW1lcmEgPSBsaXN0KGV5ZSA9IGxpc3QoeCA9IDAsIHkgPSAwLCB6ID0gMi41KSkgIyBNZWxpaGF0IGRhcmkgYXRhcw0KICAgICksDQogICAgdGl0bGUgPSAiUm90YXNpIFZla3RvciA5MCBEZXJhamF0IChUcmFuc2Zvcm1hc2kgTGluZWFyKSINCiAgKQ0KYGBgDQoNCiMjIyAgSW50ZXJwcmV0YXNpDQoNCi0gUGVtZXRhYW4gQmFzaXM6IE1hdHJpa3MgJE0gPSBcYmVnaW57Ym1hdHJpeH0gXG1hdGhiZnt2fV8xICYgXG1hdGhiZnt2fV8yIFxlbmR7Ym1hdHJpeH0kIHNlYmVuYXJueWEgbWVtYmVyaXRhaHUga2l0YSBrZSBtYW5hIGFyYWggc3VtYnUgJHgkIGRhbiAkeSQgc2V0ZWxhaCB0cmFuc2Zvcm1hc2kuS29sb20gcGVydGFtYSAkWzAsIDFdXlQkIGFkYWxhaCBwb3Npc2kgYmFydSBkYXJpIHVuaXQgdmVrdG9yIHN1bWJ1ICR4JCAoJFxtYXRoYmZ7ZX1fMSQpLktvbG9tIGtlZHVhICRbLTEsIDBdXlQkIGFkYWxhaCBwb3Npc2kgYmFydSBkYXJpIHVuaXQgdmVrdG9yIHN1bWJ1ICR5JCAoJFxtYXRoYmZ7ZX1fMiQpLkRldGVybWluYW50OiBOaWxhaSAkXGRldChNKSA9ICgwIFxjZG90IDApIC0gKC0xIFxjZG90IDEpID0gMSQuIEthcmVuYSBkZXRlcm1pbmFubnlhICQxJCwgb3JpZW50YXNpIHJ1YW5nIHRldGFwIHRlcmphZ2EgZGFuIHRpZGFrIGFkYSBwZXJ1YmFoYW4gbHVhcyAodGlkYWsgYWRhIHBlbnl1c3V0YW4gYXRhdSBwZW11YWlhbikuDQoNCiMjIyBBcGxpa2FzaSBkaSBEdW5pYSBOeWF0YQ0KDQotIFJvYm90aWthOiBMZW5nYW4gcm9ib3QgbWVuZ2d1bmFrYW4gbWF0cmlrcyByb3Rhc2kgKHNlcmluZ2thbGkgZGFsYW0gZm9ybWF0IDNEIHlhbmcgZGlzZWJ1dCBFdWxlciBBbmdsZXMgYXRhdSBRdWF0ZXJuaW9ucykgdW50dWsgbWVuZW50dWthbiBwb3Npc2kgdGFuZ2FuIHJvYm90IGRpIHJ1YW5nIDNELg0KDQotIEdhbWUgRGV2ZWxvcG1lbnQ6IFNldGlhcCBrYWxpIEFuZGEgbWVtdXRhciBrYXJha3RlciBhdGF1IGthbWVyYSBkYWxhbSBnYW1lLCBrb21wdXRlciBzZWRhbmcgbWVuZ2FsaWthbiByaWJ1YW4ga29vcmRpbmF0IHRpdGlrICh2aWtpbmcsIG1vYmlsLCBhdGF1IHBvaG9uKSBkZW5nYW4gbWF0cmlrcyByb3Rhc2kgc2VwZXJ0aSBpbmkgc2VjYXJhIHJlYWwtdGltZS4NCg0KLSBQZW5nb2xhaGFuIENpdHJhOiBPcGVyYXNpICJSb3RhdGUgOTDCsCIgcGFkYSBhcGxpa2FzaSBlZGl0IGZvdG8gc2VjYXJhIG1hdGVtYXRpcyBtZWxha3VrYW4gcGVya2FsaWFuIG1hdHJpa3MgaW5pIHBhZGEgc2V0aWFwIGluZGVrcyBwaWtzZWwgZ2FtYmFyLg0KDQojIyBSVUpVS0FOOg0KDQpBbnRvbiwgSC4sICYgUm9ycmVzLCBDLiAoMjAxMykuIEVsZW1lbnRhcnkgTGluZWFyIEFsZ2VicmE6IEFwcGxpY2F0aW9ucyBWZXJzaW9uLiBKb2huIFdpbGV5ICYgU29ucy4NCg0KS3JleXppZywgRS4gKDIwMTEpLiBBZHZhbmNlZCBFbmdpbmVlcmluZyBNYXRoZW1hdGljcy4gSm9obiBXaWxleSAmIFNvbnMuTGF5LCBELiBDLiAoMjAxMikuIExpbmVhciBBbGdlYnJhIGFuZCBJdHMgQXBwbGljYXRpb25zLiBQZWFyc29uLg==