Ly8gUmV2ZXJzZSBQb2xpc2ggTm90YXRpb24sIHJwbi5rCi8vIKkgMjAwMSwgTWljaGFlbCBQaWVmZWwgPHBpZWZlbEBpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KCi8vIERlZmluZSB3aGljaCB2aWV3cyAoaWUuLCBkaWZmZXJlbnQgcGF0aHMpIHdlIGludGVudCB0byB0YWtlCi8vIGR1cmluZyB1bnBhcnNlIGFuZCByZXdyaXRlCiV1dmlldyBpbmZpeCBwb3N0Zml4OwolcnZpZXcgY2Fub24gY2FsY3VsYXRlOwoKCi8vIFNpbXBsZSBleHByZXNzaW9ucwpQbHVzKCBleHAxLCBleHAyICkKCS0+CVsgaW5maXg6IGV4cDEgIisiIGV4cDIgXQoJCVsgcG9zdGZpeDogZXhwMSAiICIgZXhwMiAiICsiIF07CgpNaW51cyggZXhwMSwgZXhwMiApCgktPglbIGluZml4OiBleHAxICItIiBleHAyIF0KCQlbIHBvc3RmaXg6IGV4cDEgIiAiIGV4cDIgIiAtIiBdOwoKLy8gQmV3YXJlIG9mIHBhcmVudGhlc2VzIGluIGluZml4IHJlcHJlc2VudGF0aW9uCk11bCggZXhwMSwgZXhwMj1QbHVzKCosKikgKSwKTXVsKCBleHAxLCBleHAyPU1pbnVzKCosKikgKQoJLT4JWyBpbmZpeDogZXhwMSAiKigiIGV4cDIgIikiIF07CgpNdWwoIGV4cDE9UGx1cygqLCopLCBleHAyICksCk11bCggZXhwMT1NaW51cygqLCopLCBleHAyICkKCS0+CVsgaW5maXg6ICIoIiBleHAxICIpKiIgZXhwMiBdOwoKTXVsKCBleHAxPVBsdXMoKiwqKSwgZXhwMj1QbHVzKCosKikgKSwKTXVsKCBleHAxPVBsdXMoKiwqKSwgZXhwMj1NaW51cygqLCopICksCk11bCggZXhwMT1NaW51cygqLCopLCBleHAyPVBsdXMoKiwqKSApLApNdWwoIGV4cDE9TWludXMoKiwqKSwgZXhwMj1NaW51cygqLCopICkKCS0+CVsgaW5maXg6ICIoIiBleHAxICIpKigiIGV4cDIgIikiIF07CgpNdWwoIGV4cDEsIGV4cDIgKQoJLT4JWyBpbmZpeDogZXhwMSAiKiIgZXhwMiBdCgkJWyBwb3N0Zml4OiBleHAxICIgIiBleHAyICIgKiJdOwoKRGl2KCBleHAxPVBsdXMoKiwqKSwgZXhwMiApLApEaXYoIGV4cDE9TWludXMoKiwqKSwgZXhwMiApCgktPglbIGluZml4OiAiKCIgZXhwMSAiKS8iIGV4cDIgXTsKCkRpdiggZXhwMSwgZXhwMj1QbHVzKCosKikgKSwKRGl2KCBleHAxLCBleHAyPU1pbnVzKCosKikgKSwKRGl2KCBleHAxLCBleHAyPU11bCgqLCopICksCkRpdiggZXhwMSwgZXhwMj1EaXYoKiwqKSApCgktPglbIGluZml4OiBleHAxICIvKCIgZXhwMiAiKSJdOwoKRGl2KCBleHAxPVBsdXMoKiwqKSwgZXhwMj1QbHVzKCosKikgKSwKRGl2KCBleHAxPVBsdXMoKiwqKSwgZXhwMj1NaW51cygqLCopICksCkRpdiggZXhwMT1NaW51cygqLCopLCBleHAyPVBsdXMoKiwqKSApLApEaXYoIGV4cDE9TWludXMoKiwqKSwgZXhwMj1NaW51cygqLCopICkKCS0+CVsgaW5maXg6ICIoIiBleHAxICIpLygiIGV4cDIgIikiIF07CgpEaXYoIGV4cDEsIGV4cDIgKQoJLT4JWyBpbmZpeDogZXhwMSAiLyIgZXhwMiBdCgkJWyBwb3N0Zml4OiBleHAxICIgIiBleHAyICIgLyIgXTsKCgovLyBDYWxjdWxhdGUgYWxsIHRoYXQgY2FuIGJlIGNhbGN1bGF0ZWQgKGllLiBhbGwgd2hlcmUKLy8gd2UgaGF2ZSBjb25jcmV0ZSBudW1iZXJzKQpQbHVzKCBUZXJtKE51bWJlcihhKSksIFRlcm0oTnVtYmVyKGIpKSApCgktPiA8IGNhbGN1bGF0ZTogVGVybShOdW1iZXIocGx1cyhhLGIpKSk+OwoKUGx1cyggVGVybShOdW1iZXIoYSkpLCBQbHVzKFRlcm0oTnVtYmVyKGIpKSwgcmVzdCkgKQoJLT4gPCBjYWxjdWxhdGU6IFBsdXMoVGVybShOdW1iZXIocGx1cyhhLGIpKSksIHJlc3QpPjsKClBsdXMoIFRlcm0oTnVtYmVyKGEpKSwgTWludXMoVGVybShOdW1iZXIoYikpLCByZXN0KSApCgktPiA8IGNhbGN1bGF0ZTogTWludXMoVGVybShOdW1iZXIocGx1cyhhLGIpKSksIHJlc3QpPjsKCk1pbnVzKCBUZXJtKE51bWJlcihhKSksIFRlcm0oTnVtYmVyKGIpKSApCgktPiA8IGNhbGN1bGF0ZTogVGVybShOdW1iZXIobWludXMoYSxiKSkpPjsKCk1pbnVzKCBUZXJtKE51bWJlcihhKSksIE1pbnVzKFRlcm0oTnVtYmVyKGIpKSwgcmVzdCkgKQoJLT4gPCBjYWxjdWxhdGU6IFBsdXMoVGVybShOdW1iZXIobWludXMoYSxiKSkpLCByZXN0KT47CgpNaW51cyggVGVybShOdW1iZXIoYSkpLCBQbHVzKFRlcm0oTnVtYmVyKGIpKSwgcmVzdCkgKQoJLT4gPCBjYWxjdWxhdGU6IE1pbnVzKFRlcm0oTnVtYmVyKG1pbnVzKGEsYikpKSwgcmVzdCk+OwoKTXVsKCBUZXJtKE51bWJlcihhKSksIFRlcm0oTnVtYmVyKGIpKSApCgktPiA8IGNhbGN1bGF0ZTogVGVybShOdW1iZXIobXVsKGEsYikpKT47CgpNdWwoIFRlcm0oTnVtYmVyKGEpKSwgTXVsKFRlcm0oTnVtYmVyKGIpKSwgcmVzdCkgKQoJLT4gPCBjYWxjdWxhdGU6IE11bChUZXJtKE51bWJlcihtdWwoYSxiKSkpLCByZXN0KT47CgpNdWwoIFRlcm0oTnVtYmVyKGEpKSwgRGl2KFRlcm0oTnVtYmVyKGIpKSwgcmVzdCkgKQoJLT4gPCBjYWxjdWxhdGU6IERpdihUZXJtKE51bWJlcihtdWwoYSxiKSkpLCByZXN0KT47CgpEaXYoIFRlcm0oTnVtYmVyKGEpKSwgVGVybShOdW1iZXIoYikpICkKCS0+IDwgY2FsY3VsYXRlOiBUZXJtKE51bWJlcihkaXZpKGEsYikpKT47CgpEaXYoIFRlcm0oTnVtYmVyKGEpKSwgRGl2KFRlcm0oTnVtYmVyKGIpKSwgcmVzdCkgKQoJLT4gPCBjYWxjdWxhdGU6IE11bChUZXJtKE51bWJlcihkaXZpKGEsYikpKSwgcmVzdCk+OwoKRGl2KCBUZXJtKE51bWJlcihhKSksIE11bChUZXJtKE51bWJlcihiKSksIHJlc3QpICkKCS0+IDwgY2FsY3VsYXRlOiBEaXYoVGVybShOdW1iZXIoZGl2aShhLGIpKSksIHJlc3QpPjsKCi8vIEhlbHBlciBmdW5jdGlvbnMgdG8gYWN0dWFsbHkgY29tcHV0ZQoleyBLQ19SRVdSSVRFCmlubGluZSBpbnRlZ2VyIHBsdXMoaW50ZWdlciBhLCBpbnRlZ2VyIGIpIHsgcmV0dXJuIG1raW50ZWdlcihhLT52YWx1ZStiLT52YWx1ZSk7IH0KaW5saW5lIGludGVnZXIgbWludXMoaW50ZWdlciBhLCBpbnRlZ2VyIGIpIHsgcmV0dXJuIG1raW50ZWdlcihhLT52YWx1ZS1iLT52YWx1ZSk7IH0KaW5saW5lIGludGVnZXIgbXVsKGludGVnZXIgYSwgaW50ZWdlciBiKSB7IHJldHVybiBta2ludGVnZXIoYS0+dmFsdWUqYi0+dmFsdWUpOyB9CmlubGluZSBpbnRlZ2VyIGRpdmkoaW50ZWdlciBhLCBpbnRlZ2VyIGIpIHsgcmV0dXJuIG1raW50ZWdlcihiLT52YWx1ZT09MCA/IDAgOiBhLT52YWx1ZSAvIGItPnZhbHVlKTsgfQolfQoKCi8vIFJld3JpdGUgdG8gYSBjYW5vbmljYWwgZm9ybSBvZiB0aGUgZXhwcmVzc2lvbiB3aGVyZSBvcGVyYXRvcnMKLy8gYXJlIHRvIGJlIHB1dCBhcyBmYXIgdG8gdGhlIGVuZCBhcyBwb3NzaWJsZQpQbHVzKCBQbHVzKGEsIGIpLCBjKQoJLT4gPCBjYW5vbjogUGx1cyhhLCBQbHVzKGIsIGMpKT47CgpQbHVzKCBNaW51cyhhLCBiKSwgYykKCS0+IDwgY2Fub246IFBsdXMoYywgTWludXMoYSwgYikpPjsKCk1pbnVzKCBQbHVzKGEsIGIpLCBjKQoJLT4gPCBjYW5vbjogUGx1cyhhLCBNaW51cyhiLCBjKSk+OwoKTXVsKCBNdWwoYSwgYiksIGMpCgktPiA8IGNhbm9uOiBNdWwoYSwgTXVsKGIsIGMpKT47CgpQbHVzKCBhPVRlcm0oSWRlbnQoKikpLCBiPVRlcm0oTnVtYmVyKCopKSApCgktPiA8IGNhbm9uOiBQbHVzKGIsIGEpPjsKCk11bCggYT1UZXJtKElkZW50KCopKSwgYj1UZXJtKE51bWJlcigqKSkgKQoJLT4gPCBjYW5vbjogTXVsKGIsIGEpPjsKClBsdXMoIGE9VGVybShJZGVudCgqKSksIFBsdXMoYj1UZXJtKE51bWJlcigqKSksIHJlc3QpICkKCS0+IDwgY2Fub246IFBsdXMoYiwgUGx1cyhhLHJlc3QpKT47CgpNdWwoIGE9VGVybShJZGVudCgqKSksIE11bChiPVRlcm0oTnVtYmVyKCopKSwgcmVzdCkgKQoJLT4gPCBjYW5vbjogTXVsKGIsIE11bChhLHJlc3QpKT47Cgo=