LyoKICogIFUtYm9vdCAtIGkzODYgU3RhcnR1cCBDb2RlCiAqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgT21pY3JvbiBDZXRpIEFCLCBEYW5pZWwgRW5nc3Ry9m0gPGRlbmFpZWxAb21pY3Jvbi5zZT4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8YXNtL2dsb2JhbF9kYXRhLmg+CgojZGVmaW5lIEJPT1RfU0VHCTB4ZmZmZjAwMDAJLyogbGluZWFyIHNlZ21lbnQgb2YgYm9vdCBjb2RlICovCiNkZWZpbmUgYTMyCQkuYnl0ZSAweDY3OwojZGVmaW5lIG8zMgkJLmJ5dGUgMHg2NjsKCi5zZWN0aW9uIC5zdGFydDE2LCAiYXgiCi5jb2RlMTYKLmdsb2JsIHN0YXJ0MTYKc3RhcnQxNjoKCS8qIFNldCB0aGUgQ29sZCBCb290IC8gSGFyZCBSZXNldCBmbGFnICovCgltb3ZsCSRHRF9GTEdfQ09MRF9CT09ULCAlZWJ4CgoJLyoKCSAqIEZpcnN0IHdlIGxldCB0aGUgQlNQIGRvIHNvbWUgZWFybHkgaW5pdGlhbGl6YXRpb24KCSAqIHRoaXMgY29kZSBoYXZlIHRvIG1hcCB0aGUgZmxhc2ggdG8gaXRzIGZpbmFsIHBvc2l0aW9uCgkgKi8KCWptcAlib2FyZF9pbml0MTYKLmdsb2JsIGJvYXJkX2luaXQxNl9yZXQKYm9hcmRfaW5pdDE2X3JldDoKCgkvKiBUdXJuIG9mIGNhY2hlICh0aGlzIG1pZ2h0IHJlcXVpcmUgYSA0ODYtY2xhc3MgQ1BVKSAqLwoJbW92bAklY3IwLCAlZWF4CglvcmwJJDB4NjAwMDAwMDAsICVlYXgKCW1vdmwJJWVheCwgJWNyMAoJd2JpbnZkCgoJLyogbG9hZCB0aGUgdGVtcG9yYXJ5IEdsb2JhbCBEZXNjcmlwdG9yIFRhYmxlICovCm8zMiBjcwlsaWR0CWlkdF9wdHIKbzMyIGNzCWxnZHQJZ2R0X3B0cgoKCS8qIE5vdywgd2UgZW50ZXIgcHJvdGVjdGVkIG1vZGUgKi8KCW1vdmwJJWNyMCwgJWVheAoJb3JsCSQxLCAlZWF4Cgltb3ZsCSVlYXgsICVjcjAKCgkvKiBGbHVzaCB0aGUgcHJlZmV0Y2ggcXVldWUgKi8KCWptcAlmZgpmZjoKCS8qIEZpbmFsbHkganVtcCB0byB0aGUgMzJiaXQgaW5pdGlhbGl6YXRpb24gY29kZSAqLwoJbW92dwkkY29kZTMyc3RhcnQsICVheAoJbW92dwklYXgsICVicApvMzIgY3MJbGptcAkqKCVicCkKCgkvKiA0OC1iaXQgZmFyIHBvaW50ZXIgKi8KY29kZTMyc3RhcnQ6CgkubG9uZwlfc3RhcnQJCS8qIG9mZnNldCAqLwoJLndvcmQJMHgxMAkJLyogc2VnbWVudCAqLwoKaWR0X3B0cjoKCS53b3JkCTAJCS8qIGxpbWl0ICovCgkubG9uZwkwCQkvKiBiYXNlICovCgovKgogKiBUaGUgZm9sbG93aW5nIEdsb2JhbCBEZXNjcmlwdG9yIFRhYmxlIGlzIGp1c3QgZW5vdWdoIHRvIGdldCB1cyBpbnRvCiAqICdGbGF0IFByb3RlY3RlZCBNb2RlJyAtIEl0IHdpbGwgYmUgZGlzY2FyZGVkIGFzIHNvb24gYXMgdGhlIGZpbmFsCiAqIEdEVCBpcyBzZXR1cCBpbiBhIHNhZmUgbG9jYXRpb24gaW4gUkFNCiAqLwpnZHRfcHRyOgoJLndvcmQJMHgyMAkJLyogbGltaXQgKDMyIGJ5dGVzID0gNCBHRFQgZW50cmllcykgKi8KCS5sb25nCUJPT1RfU0VHICsgZ2R0CS8qIGJhc2UgKi8KCgkvKiBUaGUgR0RUIHRhYmxlIC4uLgoJICoKCSAqCSBTZWxlY3RvcglUeXBlCgkgKgkgMHgwMAkJTlVMTAoJICoJIDB4MDgJCVVudXNlZAoJICoJIDB4MTAJCTMyYml0IGNvZGUKCSAqCSAweDE4CQkzMmJpdCBkYXRhL3N0YWNrCgkgKi8KCmdkdDoKCS53b3JkCTAsIDAsIDAsIDAJLyogTlVMTCAgKi8KCS53b3JkCTAsIDAsIDAsIDAJLyogdW51c2VkICovCgoJLndvcmQJMHhGRkZGCQkvKiA0R2IgLSAoMHgxMDAwMDAqMHgxMDAwID0gNEdiKSAqLwoJLndvcmQJMAkJLyogYmFzZSBhZGRyZXNzID0gMCAqLwoJLndvcmQJMHg5QjAwCQkvKiBjb2RlIHJlYWQvZXhlYyAqLwoJLndvcmQJMHgwMENGCQkvKiBncmFudWxhcml0eSA9IDQwOTYsIDM4NiAoKzV0aCBuaWJibGUgb2YgbGltaXQpICovCgoJLndvcmQJMHhGRkZGCQkvKiA0R2IgLSAoMHgxMDAwMDAqMHgxMDAwID0gNEdiKSAqLwoJLndvcmQJMHgwCQkvKiBiYXNlIGFkZHJlc3MgPSAwICovCgkud29yZAkweDkzMDAJCS8qIGRhdGEgcmVhZC93cml0ZSAqLwoJLndvcmQJMHgwMENGCQkvKiBncmFudWxhcml0eSA9IDQwOTYsIDM4NiAoKzV0aCBuaWJibGUgb2YgbGltaXQpICovCg==