LyoKICogIFUtYm9vdCAtIGkzODYgU3RhcnR1cCBDb2RlIAogKgogKiAgQ29weXJpZ2h0IChjKSAyMDAyCU9taWNyb24gQ2V0aSBBQiwgRGFuaWVsIEVuZ3N0cvZtIDxkZW5haWVsQG9taWNyb24uc2U+CiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKCiNkZWZpbmUgQk9PVF9TRUcJMHhmZmZmMDAwMAkvKiBsaW5lYXIgc2VnbWVudCBvZiBib290IGNvZGUgKi8KI2RlZmluZSBhMzIJCS5ieXRlIDB4Njc7CiNkZWZpbmUgbzMyCQkuYnl0ZSAweDY2OwoKLnNlY3Rpb24gLnN0YXJ0MTYsICJheCIKLmNvZGUxNgouZ2xvYmwgc3RhcnQxNgpzdGFydDE2OiAKCS8qIEZpcnN0IHdlIGxldCB0aGUgQlNQIGRvIHNvbWUgZWFybHkgaW5pdGlhbGl6YXRpb24KCSAqIHRoaXMgY29kZSBoYXZlIHRvIG1hcCB0aGUgZmxhc2ggdG8gaXRzIGZpbmFsIHBvc2l0aW9uCgkgKi8KCW1vdgkkYm9hcmRfaW5pdDE2X3JldCwgJWJwCglqbXAJYm9hcmRfaW5pdDE2CmJvYXJkX2luaXQxNl9yZXQ6CQoJCgkvKiBUdXJuIG9mIGNhY2hlICh0aGlzIG1pZ2h0IHJlcXVpcmUgYSA0ODYtY2xhc3MgQ1BVKSAqLwogICAgICAgIG1vdmwgICAgJWNyMCwgJWVheAogICAgICAgIG9ybCAgICAgJDA2MDAwMDAwMCwlZWF4CiAgICAgICAgbW92bCAgICAlZWF4LCAlY3IwCiAgICAgICAgd2JpbnZkICAJCSAgICAgCgkKCS8qIGxvYWQgdGhlIGRlc2NyaXB0b3IgdGFibGVzICovCm8zMiBjcwlsaWR0CWlkdF9wdHIKbzMyIGNzCWxnZHQgICAgZ2R0X3B0cgkJIAoKCgkvKiBOb3csIHdlIGVudGVyIHByb3RlY3RlZCBtb2RlICovCiAgICAgICAgbW92bCAgICAlY3IwLCAlZWF4ICAgICAgICAgICAgICAgCiAgICAgICAgb3JsICAgICAkMSwlZWF4ICAgICAgICAgICAgICAgICAgCiAgICAgICAgbW92bCAgICAlZWF4LCAlY3IwICAgICAgICAgICAgCgkKCS8qIEZsdXNoIHRoZSBwcmVmZXRjaCBxdWV1ZSAqLwogICAgICAgIGptcCAgICAgZmYgICAgICAgIApmZjoKCgkvKiBGaW5hbGx5IGp1bXAgdG8gdGhlIDMyYml0IGluaXRpYWxpemF0aW9uIGNvZGUgKi8KCW1vdncJJGNvZGUzMnN0YXJ0LCAlYXggCiAgICAgICAgbW92dyAgICAlYXgsJWJwCm8zMiBjcwlsam1wCSooJWJwKQoKCS8qIDQ4LWJpdCBmYXIgcG9pbnRlciAqLwpjb2RlMzJzdGFydDoKCS5sb25nCV9zdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Zmc2V0ICovCgkud29yZAkweDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlZ21lbnQgKi8KCmlkdF9wdHI6Cgkud29yZAkwCQkJCS8qIGxpbWl0ICovCgkubG9uZwkwCQkgICAgICAgCQkvKiBiYXNlICovCgkKZ2R0X3B0cjoKCS53b3JkCTB4MzAJCQkgICAgICAgIC8qIGxpbWl0ICg0OCBieXRlcyA9IDYgR0RUIGVudHJpZXMpICovCgkubG9uZwlCT09UX1NFRyArIGdkdAkgICAgICAgIAkvKiBiYXNlICovCgoJLyogVGhlIEdEVCB0YWJsZSAuLi4gCgkgKgoJICogICAgICAgU2VsZWN0b3IJVHlwZSAKCSAqIAkgMHgwMAkJTlVMTAoJICogCSAweDA4CQlVbnVzZWQKCSAqCSAweDEwCQkzMmJpdCBjb2RlIAoJICoJIDB4MTgJCTMyYml0IGRhdGEvc3RhY2sKCSAqCSAweDIwCQkxNmJpdCBjb2RlCgkgKgkgMHgyOAkgCTE2Yml0IGRhdGEvc3RhY2sKCSAqLwoKZ2R0OgoJLndvcmQJMCwgMCwgMCwgMAkJCS8qIE5VTEwgICovCgkud29yZAkwLCAwLCAwLCAwCQkJLyogdW51c2VkICovCgoJLndvcmQJMHhGRkZGCQkJCS8qIDRHYiAtICgweDEwMDAwMCoweDEwMDAgPSA0R2IpICovCgkud29yZAkwCQkJCS8qIGJhc2UgYWRkcmVzcyA9IDAgKi8KCS53b3JkCTB4OUIwMAkJCQkvKiBjb2RlIHJlYWQvZXhlYyAqLwoJLndvcmQJMHgwMENGCQkJCS8qIGdyYW51bGFyaXR5ID0gNDA5NiwgMzg2ICgrNXRoIG5pYmJsZSBvZiBsaW1pdCkgKi8KCgkud29yZAkweEZGRkYJCQkJLyogNEdiIC0gKDB4MTAwMDAwKjB4MTAwMCA9IDRHYikgKi8KCS53b3JkCTB4MAkJCQkvKiBiYXNlIGFkZHJlc3MgPSAwICovCgkud29yZAkweDkzMDAJCQkJLyogZGF0YSByZWFkL3dyaXRlICovCgkud29yZAkweDAwQ0YJCQkJLyogZ3JhbnVsYXJpdHkgPSA0MDk2LCAzODYgKCs1dGggbmliYmxlIG9mIGxpbWl0KSAqLwoJCQkJCQkKCS53b3JkCTB4RkZGRgkJCQkvKiA2NGtiICovCgkud29yZAkwCQkJCS8qIGJhc2UgYWRkcmVzcyA9IDAgKi8KCS53b3JkCTB4OWIwMAkJCQkvKiBkYXRhIHJlYWQvd3JpdGUgKi8KCS53b3JkCTB4MDAxMAkJCQkvKiBncmFudWxhcml0eSA9IDEgICgrNXRoIG5pYmJsZSBvZiBsaW1pdCkgKi8KCQoJLndvcmQJMHhGRkZGCQkJCS8qIDY0a2IgKi8KCS53b3JkCTAJCQkJLyogYmFzZSBhZGRyZXNzID0gMCAqLwoJLndvcmQJMHg5MzAwCQkJCS8qIGRhdGEgcmVhZC93cml0ZSAqLwoJLndvcmQJMHgwMDEwCQkJCS8qIGdyYW51bGFyaXR5ID0gMSAoKzV0aCBuaWJibGUgb2YgbGltaXQpICovCg==