LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIKkgMjAxNCBNaWNyb2NoaXAgVGVjaG5vbG9neSBJbmMuIGFuZCBpdHMgc3Vic2lkaWFyaWVzLg0KKiBZb3UgbWF5IHVzZSB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgZGVyaXZhdGl2ZXMgZXhjbHVzaXZlbHkgd2l0aA0KKiBNaWNyb2NoaXAgcHJvZHVjdHMuDQoqIFRISVMgU09GVFdBUkUgSVMgU1VQUExJRUQgQlkgTUlDUk9DSElQICJBUyBJUyIuDQoqIE5PIFdBUlJBTlRJRVMsIFdIRVRIRVIgRVhQUkVTUywgSU1QTElFRCBPUiBTVEFUVVRPUlksIEFQUExZIFRPIFRISVMgU09GVFdBUkUsDQoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwNCiogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUiBJVFMgSU5URVJBQ1RJT04gV0lUSCBNSUNST0NISVANCiogUFJPRFVDVFMsIENPTUJJTkFUSU9OIFdJVEggQU5ZIE9USEVSIFBST0RVQ1RTLCBPUiBVU0UgSU4gQU5ZIEFQUExJQ0FUSU9OLg0KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsDQoqIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBMT1NTLCBEQU1BR0UsIENPU1QgT1IgRVhQRU5TRSBPRiBBTlkgS0lORA0KKiBXSEFUU09FVkVSIFJFTEFURUQgVE8gVEhFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCwgRVZFTiBJRiBNSUNST0NISVAgSEFTDQoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLg0KKiBUTyBUSEUgRlVMTEVTVCBFWFRFTlQgQUxMT1dFRCBCWSBMQVcsIE1JQ1JPQ0hJUCdTIFRPVEFMIExJQUJJTElUWSBPTiBBTEwNCiogQ0xBSU1TIElOIEFOWSBXQVkgUkVMQVRFRCBUTyBUSElTIFNPRlRXQVJFIFdJTEwgTk9UIEVYQ0VFRCBUSEUgQU1PVU5UIE9GDQoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4NCiogTUlDUk9DSElQIFBST1ZJREVTIFRISVMgU09GVFdBUkUgQ09ORElUSU9OQUxMWSBVUE9OIFlPVVIgQUNDRVBUQU5DRQ0KKiBPRiBUSEVTRSBURVJNUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKiogQGZpbGUgbWVjMTR4eF9qdHZpYy5jDQogKk1FQzE0eHggSlRWSUMNCiAqLw0KLyoqIEBkZWZncm91cCBNRUMxNHh4IFBlcmlwaGVyYWxzIEpUVklDDQogKiAgQHsNCiAqLw0KDQoNCiNpbmNsdWRlICJhcHBjZmcuaCINCiNpbmNsdWRlICJwbGF0Zm9ybS5oIg0KI2luY2x1ZGUgIk1FQzE0eHgvbWVjMTR4eC5oIg0KI2luY2x1ZGUgIk1FQzE0eHgvbWVjMTR4eF9qdHZpYy5oIg0KDQoNCnZvaWQganR2aWNfaW5pdChjb25zdCBKVFZJQ19DRkcgKmloX3RhYmxlLCB1aW50MzJfdCBkaXNhZ2dfYml0bWFwLCB1aW50MzJfdCBjZmxhZ3MpDQp7DQogICAgdWludDMyX3QgZDsNCiAgICB1aW50OF90IGksIGosIHBpZHg7DQoNCiAgICBKVFZJQ19DVFJMLT53ID0gKDF1bCA8PCAwKTsgIC8vIFNvZnQtUmVzZXQNCiAgICBkID0gMHVsOw0KICAgIGlmICggY2ZsYWdzICYgKDF1bCA8PCAwKSApIA0KICAgIHsNCiAgICAgICAgZCA9ICgxdWwgPDwgOCk7DQogICAgfQ0KICAgIEpUVklDX0NUUkwtPncgPSBkOyAgLy8gSFcgZG9lcyBub3QgYXV0b21hdGljYWxseSBjbGVhciBTb2Z0LVJlc2V0DQoNCiAgICBmb3IgKGkgPSAwdTsgaSA8IChNRUMxNHh4X05VTV9KVFZJQ19JTlRTKTsgaSsrKSB7DQogICAgICAgIHBpZHggPSBpIDw8IDI7DQogICAgICAgIGZvciAoaiA9IDB1OyBqIDwgNHU7IGorKykgew0KICAgICAgICAgICAgSlRWSUNfUFJJLT5SRUczMltwaWR4K2pdID0gKHVpbnQzMl90KShpaF90YWJsZVtpXS5wcmlbal0pOw0KICAgICAgICB9DQogICAgICAgIGQgPSBpaF90YWJsZVtpXS5pc3JfYWRkciAmIH4oMXVsIDw8IDApOw0KICAgICAgICBpZiAoZGlzYWdnX2JpdG1hcCAmICgxdWwgPDwgaSkpIHsNCiAgICAgICAgICAgIGQgfD0gKDF1bCA8PCAwKTsgICAgLy8gZGlzLWFnZ3JlZ2F0ZSB0aGlzIEdJUlENCiAgICAgICAgfQ0KICAgICAgICBKVFZJQ19BQ1RSTC0+UkVHMzJbaV0gPSBkOw0KICAgIH0NCiAgICANCiAgICBKVFZJQ19HUk9VUF9FTl9TRVQtPncgPSAweEZGRkZGRkZGdWw7ICAgLy8gRW5hYmxlIEdJUlEwOCAtIEdJUlExOCAoYWxsKQ0KICAgIA0KfQ0KDQovKiBDbGVhciBKVFZJQyBHSVJRbiBzb3VyY2UgYml0DQogKg0KICovDQp2b2lkIGp0dmljX2Nscl9zb3VyY2UodWludDhfdCBnaXJxX251bSwgdWludDhfdCBiaXRfbnVtKQ0Kew0KICAgIGlmIChnaXJxX251bSA8IChNRUMxNHh4X05VTV9KVFZJQ19JTlRTKSkNCiAgICB7DQogICAgICAgIGJpdF9udW0gJj0gMHgxRnU7DQogICAgICAgIEpUVklDX0dJUlEtPlJFR1NbZ2lycV9udW1dLlNPVVJDRSA9ICgxdWwgPDwgYml0X251bSk7DQogICAgfQ0KfQ0KDQoNCi8qIERpc2FibGUgR0lSUW4gc291cmNlIHdpdGggb3B0aW9uYWwgY2xlYXJpbmcgb2Ygc291cmNlLg0KICogZ2lycV9udW0gPSBbMCwgMThdLCAwPUdJUlEwOCwgMT1HSVJRMDksIC4uLiwgMTg9R0lSUTI2DQogKiBiaXRfbnVtID0gWzAsIDMxXQ0KICovDQp2b2lkIGp0dmljX2Rpc19jbHJfc291cmNlKHVpbnQ4X3QgZ2lycV9udW0sIHVpbnQ4X3QgYml0X251bSwgdWludDhfdCBjbHJfc3JjKQ0Kew0KICAgIGlmIChnaXJxX251bSA8IChNRUMxNHh4X05VTV9KVFZJQ19JTlRTKSkNCiAgICB7DQogICAgICAgIGJpdF9udW0gJj0gMHgxRnU7DQogICAgICAgIEpUVklDX0dJUlEtPlJFR1NbZ2lycV9udW1dLkVOX0NMUiA9ICgxdWwgPDwgYml0X251bSk7DQogICAgICAgIGlmICggMCAhPSBjbHJfc3JjICkNCiAgICAgICAgew0KICAgICAgICAgICAgSlRWSUNfR0lSUS0+UkVHU1tnaXJxX251bV0uU09VUkNFID0gKDF1bCA8PCBiaXRfbnVtKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQovKiBFbmFibGUgd2l0aCBvcHRpb25hbCBzb3VyY2UgY2xlYXIgYmVmb3JlIGVuYWJsZS4NCiAqIGdpcnFfbnVtID0gWzAsIDE4XSwgMD1HSVJRMDgsIDE9R0lSUTA5LCAuLi4sIDE4PUdJUlEyNg0KICogYml0X251bSA9IFswLCAzMV0NCiAqLw0Kdm9pZCBqdHZpY19lbl9zb3VyY2UodWludDhfdCBnaXJxX251bSwgdWludDhfdCBiaXRfbnVtLCB1aW50OF90IGNscl9zcmMpDQp7DQogICAgaWYgKGdpcnFfbnVtIDwgKE1FQzE0eHhfTlVNX0pUVklDX0lOVFMpKQ0KICAgIHsNCiAgICAgICAgYml0X251bSAmPSAweDFGdTsNCiAgICAgICAgaWYgKCAwICE9IGNscl9zcmMgKQ0KICAgICAgICB7DQogICAgICAgICAgICBKVFZJQ19HSVJRLT5SRUdTW2dpcnFfbnVtXS5TT1VSQ0UgPSAoMXVsIDw8IGJpdF9udW0pOw0KICAgICAgICB9DQogICAgICAgIEpUVklDX0dJUlEtPlJFR1NbZ2lycV9udW1dLkVOX1NFVCA9ICgxdWwgPDwgYml0X251bSk7DQogICAgfQ0KfQ0KDQoNCi8qIGVuZCBtZWMxNHh4X2p0dmljLmMgKi8NCi8qKiAgIEB9DQogKi8NCg0K